@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,7 +2,7 @@
|
|
|
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/collaboration/ActivitySync", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/Text", "sap/ui/core/Core", "./draftDataLossPopup"], function (Log, CommonUtils, ActivitySync, messageHandling, Button, Dialog, MessageBox, Text, Core, draftDataLossPopup) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
function _catch(body, recover) {
|
|
@@ -19,6 +19,117 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
19
19
|
return result;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
/**
|
|
23
|
+
* Creates an active document from a draft document.
|
|
24
|
+
*
|
|
25
|
+
* The function supports several hooks as there is a certain choreography defined.
|
|
26
|
+
*
|
|
27
|
+
* @function
|
|
28
|
+
* @name sap.fe.core.actions.draft#activateDocument
|
|
29
|
+
* @memberof sap.fe.core.actions.draft
|
|
30
|
+
* @static
|
|
31
|
+
* @param oContext Context of the active document for the new draft
|
|
32
|
+
* @param oAppComponent The AppComponent
|
|
33
|
+
* @param mParameters The parameters
|
|
34
|
+
* @param [mParameters.fnBeforeActivateDocument] Callback that allows a veto before the 'Create' request is executed
|
|
35
|
+
* @param [mParameters.fnAfterActivateDocument] Callback for postprocessing after document was activated.
|
|
36
|
+
* @param messageHandler The message handler
|
|
37
|
+
* @returns Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
38
|
+
* @private
|
|
39
|
+
* @ui5-restricted
|
|
40
|
+
*/
|
|
41
|
+
var activateDocument = function (oContext, oAppComponent, mParameters, messageHandler) {
|
|
42
|
+
try {
|
|
43
|
+
function _temp22(bExecute) {
|
|
44
|
+
var _exit5 = false;
|
|
45
|
+
|
|
46
|
+
function _temp20(_result8) {
|
|
47
|
+
return _exit5 ? _result8 : mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (!bExecute) {
|
|
51
|
+
throw new Error("Activation of the document was aborted by extension for document: ".concat(oContext.getPath()));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
var oActiveDocumentContext;
|
|
55
|
+
|
|
56
|
+
var _temp19 = function () {
|
|
57
|
+
if (!hasPrepareAction(oContext)) {
|
|
58
|
+
return Promise.resolve(executeDraftActivationAction(oContext, oAppComponent)).then(function (_executeDraftActivati) {
|
|
59
|
+
oActiveDocumentContext = _executeDraftActivati;
|
|
60
|
+
});
|
|
61
|
+
} else {
|
|
62
|
+
/* activation requires preparation */
|
|
63
|
+
var sBatchGroup = "draft"; // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
|
|
64
|
+
|
|
65
|
+
var oPreparePromise = draft.executeDraftPreparationAction(oContext, sBatchGroup, false);
|
|
66
|
+
oContext.getModel().submitBatch(sBatchGroup);
|
|
67
|
+
var oActivatePromise = draft.executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
|
|
68
|
+
return _catch(function () {
|
|
69
|
+
return Promise.resolve(Promise.all([oPreparePromise, oActivatePromise])).then(function (values) {
|
|
70
|
+
oActiveDocumentContext = values[1];
|
|
71
|
+
});
|
|
72
|
+
}, function (err) {
|
|
73
|
+
function _temp18() {
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// BCP 2270084075
|
|
78
|
+
// if the Activation fails, then the messages are retrieved from PREPARATION action
|
|
79
|
+
var sMessagesPath = getMessagePath(oContext);
|
|
80
|
+
|
|
81
|
+
var _temp17 = function () {
|
|
82
|
+
if (sMessagesPath) {
|
|
83
|
+
oPreparePromise = draft.executeDraftPreparationAction(oContext, sBatchGroup, true);
|
|
84
|
+
oContext.getModel().submitBatch(sBatchGroup);
|
|
85
|
+
return Promise.resolve(oPreparePromise).then(function () {
|
|
86
|
+
return Promise.resolve(oContext.requestObject()).then(function (data) {
|
|
87
|
+
if (data[sMessagesPath].length > 0) {
|
|
88
|
+
//if messages are available from the PREPARATION action, then previous transition messages are removed
|
|
89
|
+
messageHandler === null || messageHandler === void 0 ? void 0 : messageHandler.removeTransitionMessages(false, false, oContext.getPath());
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}();
|
|
95
|
+
|
|
96
|
+
return _temp17 && _temp17.then ? _temp17.then(_temp18) : _temp18(_temp17);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}();
|
|
100
|
+
|
|
101
|
+
return _temp19 && _temp19.then ? _temp19.then(_temp20) : _temp20(_temp19);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
var mParam = mParameters || {};
|
|
105
|
+
|
|
106
|
+
if (!oContext) {
|
|
107
|
+
throw new Error("Binding context to draft document is required");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
var _mParam$fnBeforeActiv2 = mParam.fnBeforeActivateDocument;
|
|
111
|
+
return Promise.resolve(_mParam$fnBeforeActiv2 ? Promise.resolve(mParam.fnBeforeActivateDocument(oContext)).then(_temp22) : _temp22(true));
|
|
112
|
+
} catch (e) {
|
|
113
|
+
return Promise.reject(e);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE call when there is no DraftAction
|
|
118
|
+
* and Active Instance always uses DELETE.
|
|
119
|
+
*
|
|
120
|
+
* @function
|
|
121
|
+
* @name sap.fe.core.actions.draft#deleteDraft
|
|
122
|
+
* @memberof sap.fe.core.actions.draft
|
|
123
|
+
* @static
|
|
124
|
+
* @param oContext Context of the document to be discarded
|
|
125
|
+
* @param oAppComponent Context of the document to be discarded
|
|
126
|
+
* @param bEnableStrictHandling
|
|
127
|
+
* @private
|
|
128
|
+
* @returns A Promise resolved when the context is deleted
|
|
129
|
+
* @ui5-restricted
|
|
130
|
+
*/
|
|
131
|
+
|
|
132
|
+
|
|
22
133
|
/**
|
|
23
134
|
* Creates a draft document from an existing document.
|
|
24
135
|
*
|
|
@@ -28,15 +139,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
28
139
|
* @name sap.fe.core.actions.draft#createDraftFromActiveDocument
|
|
29
140
|
* @memberof sap.fe.core.actions.draft
|
|
30
141
|
* @static
|
|
31
|
-
* @param
|
|
32
|
-
* @param
|
|
33
|
-
* @param
|
|
34
|
-
* @param
|
|
35
|
-
* @param
|
|
36
|
-
* @param
|
|
37
|
-
* @param
|
|
38
|
-
* @param
|
|
39
|
-
* @returns
|
|
142
|
+
* @param oContext Context of the active document for the new draft
|
|
143
|
+
* @param oAppComponent The AppComponent
|
|
144
|
+
* @param mParameters The parameters
|
|
145
|
+
* @param [mParameters.oView] The view
|
|
146
|
+
* @param [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
|
|
147
|
+
* @param [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
|
|
148
|
+
* @param [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
|
|
149
|
+
* @param [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
|
|
150
|
+
* @returns Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
40
151
|
* @private
|
|
41
152
|
* @ui5-restricted
|
|
42
153
|
*/
|
|
@@ -49,47 +160,63 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
49
160
|
/**
|
|
50
161
|
* Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
|
|
51
162
|
*
|
|
52
|
-
* @param
|
|
53
|
-
* @returns
|
|
163
|
+
* @param bOverwrite Overwrite the change or not
|
|
164
|
+
* @returns Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
|
|
54
165
|
*/
|
|
55
|
-
function
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
var oModel = oContext.getModel();
|
|
59
|
-
var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
|
|
60
|
-
var oResourceBundle;
|
|
61
|
-
return mParameters.oView.getModel("sap.fe.i18n").getResourceBundle().then(function (_oResourceBundle) {
|
|
62
|
-
oResourceBundle = _oResourceBundle;
|
|
63
|
-
return draftDataContext.requestObject();
|
|
64
|
-
}).then(function (draftAdminData) {
|
|
65
|
-
if (draftAdminData) {
|
|
66
|
-
// remove all unbound transition messages as we show a special dialog
|
|
67
|
-
messageHandling.removeUnboundTransitionMessages();
|
|
68
|
-
var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
|
|
69
|
-
var sEntitySet = mParameters.oView.getViewData().entitySet;
|
|
166
|
+
var overwriteOnDemand = function (bOverwrite) {
|
|
167
|
+
try {
|
|
168
|
+
var _exit4 = false;
|
|
70
169
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
170
|
+
function _temp15(_result6) {
|
|
171
|
+
if (_exit4) return _result6;
|
|
172
|
+
throw new Error("Draft creation aborted for document: ".concat(oContext.getPath()));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
var _temp16 = function () {
|
|
176
|
+
if (bOverwrite) {
|
|
177
|
+
//Overwrite existing changes
|
|
178
|
+
var oModel = oContext.getModel();
|
|
179
|
+
var draftDataContext = oModel.bindContext("".concat(oContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
|
|
180
|
+
return Promise.resolve(mParameters.oView.getModel("sap.fe.i18n").getResourceBundle()).then(function (oResourceBundle) {
|
|
181
|
+
return Promise.resolve(draftDataContext.requestObject()).then(function (draftAdminData) {
|
|
182
|
+
return function () {
|
|
183
|
+
if (draftAdminData) {
|
|
184
|
+
// remove all unbound transition messages as we show a special dialog
|
|
185
|
+
messageHandling.removeUnboundTransitionMessages();
|
|
186
|
+
var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
|
|
187
|
+
var sEntitySet = mParameters.oView.getViewData().entitySet;
|
|
188
|
+
|
|
189
|
+
if (sInfo) {
|
|
190
|
+
var sLockedByUserMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER", oResourceBundle, sInfo, sEntitySet);
|
|
191
|
+
MessageBox.error(sLockedByUserMsg);
|
|
192
|
+
throw new Error(sLockedByUserMsg);
|
|
193
|
+
} else {
|
|
194
|
+
sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
|
|
195
|
+
var sUnsavedChangesMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES", oResourceBundle, sInfo, sEntitySet);
|
|
196
|
+
return Promise.resolve(showMessageBox(sUnsavedChangesMsg)).then(function () {
|
|
197
|
+
var _executeDraftEditActi = executeDraftEditAction(oContext, false, mParameters.oView);
|
|
198
|
+
|
|
199
|
+
_exit4 = true;
|
|
200
|
+
return _executeDraftEditActi;
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}();
|
|
80
205
|
});
|
|
81
|
-
}
|
|
206
|
+
});
|
|
82
207
|
}
|
|
83
|
-
});
|
|
84
|
-
}
|
|
208
|
+
}();
|
|
85
209
|
|
|
86
|
-
|
|
87
|
-
|
|
210
|
+
return Promise.resolve(_temp16 && _temp16.then ? _temp16.then(_temp15) : _temp15(_temp16));
|
|
211
|
+
} catch (e) {
|
|
212
|
+
return Promise.reject(e);
|
|
213
|
+
}
|
|
214
|
+
};
|
|
88
215
|
|
|
89
216
|
function showMessageBox(sUnsavedChangesMsg) {
|
|
90
217
|
return new Promise(function (resolve, reject) {
|
|
91
218
|
var oDialog = new Dialog({
|
|
92
|
-
title: localI18nRef.getText("
|
|
219
|
+
title: localI18nRef.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING"),
|
|
93
220
|
state: "Warning",
|
|
94
221
|
content: new Text({
|
|
95
222
|
text: sUnsavedChangesMsg
|
|
@@ -106,7 +233,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
106
233
|
text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
|
|
107
234
|
press: function () {
|
|
108
235
|
oDialog.close();
|
|
109
|
-
reject("Draft creation aborted for document: "
|
|
236
|
+
reject("Draft creation aborted for document: ".concat(oContext.getPath()));
|
|
110
237
|
}
|
|
111
238
|
}),
|
|
112
239
|
afterClose: function () {
|
|
@@ -129,12 +256,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
129
256
|
var bExecute = mParam.fnBeforeCreateDraftFromActiveDocument ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow) : true;
|
|
130
257
|
|
|
131
258
|
if (!bExecute) {
|
|
132
|
-
throw new Error("Draft creation was aborted by extension for document: "
|
|
259
|
+
throw new Error("Draft creation was aborted by extension for document: ".concat(oContext.getPath()));
|
|
133
260
|
}
|
|
134
261
|
|
|
135
262
|
var openingSiblingContext = false;
|
|
136
263
|
return Promise.resolve(_catch(function () {
|
|
137
|
-
function
|
|
264
|
+
function _temp12(_result) {
|
|
138
265
|
if (_exit2) return _result;
|
|
139
266
|
|
|
140
267
|
if (openingSiblingContext) {
|
|
@@ -160,10 +287,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
160
287
|
}();
|
|
161
288
|
}
|
|
162
289
|
|
|
163
|
-
var oDraftContext
|
|
290
|
+
var oDraftContext;
|
|
164
291
|
|
|
165
|
-
var
|
|
166
|
-
return Promise.resolve(draft.executeDraftEditAction(oContext, bRunPreserveChangesFlow)).then(function (_draft$executeDraftEd) {
|
|
292
|
+
var _temp11 = _catch(function () {
|
|
293
|
+
return Promise.resolve(draft.executeDraftEditAction(oContext, bRunPreserveChangesFlow, mParameters.oView)).then(function (_draft$executeDraftEd) {
|
|
167
294
|
oDraftContext = _draft$executeDraftEd;
|
|
168
295
|
});
|
|
169
296
|
}, function (oResponse) {
|
|
@@ -186,15 +313,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
186
313
|
});
|
|
187
314
|
}
|
|
188
315
|
}();
|
|
189
|
-
} else {
|
|
190
|
-
|
|
191
|
-
throw new Error(oResponse);
|
|
192
|
-
}
|
|
316
|
+
} else if (!(oResponse && oResponse.canceled)) {
|
|
317
|
+
throw new Error(oResponse);
|
|
193
318
|
}
|
|
194
319
|
}();
|
|
195
320
|
});
|
|
196
321
|
|
|
197
|
-
return
|
|
322
|
+
return _temp11 && _temp11.then ? _temp11.then(_temp12) : _temp12(_temp11);
|
|
198
323
|
}, function (exc) {
|
|
199
324
|
return Promise.reject(exc);
|
|
200
325
|
}));
|
|
@@ -202,33 +327,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
202
327
|
return Promise.reject(e);
|
|
203
328
|
}
|
|
204
329
|
};
|
|
205
|
-
/**
|
|
206
|
-
* Creates an active document from a draft document.
|
|
207
|
-
*
|
|
208
|
-
* The function supports several hooks as there is a certain choreography defined.
|
|
209
|
-
*
|
|
210
|
-
* @function
|
|
211
|
-
* @name sap.fe.core.actions.draft#activateDocument
|
|
212
|
-
* @memberof sap.fe.core.actions.draft
|
|
213
|
-
* @static
|
|
214
|
-
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
215
|
-
* @param {object} oAppComponent The AppComponent
|
|
216
|
-
* @param {object} mParameters The parameters
|
|
217
|
-
* @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
|
|
218
|
-
* @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
|
|
219
|
-
* @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
220
|
-
* @private
|
|
221
|
-
* @ui5-restricted
|
|
222
|
-
*/
|
|
223
|
-
|
|
224
330
|
|
|
225
331
|
/**
|
|
226
332
|
* This method creates a sibling context for a subobject page and calculates a sibling path for all intermediate paths
|
|
227
333
|
* between the object page and the subobject page.
|
|
228
334
|
*
|
|
229
|
-
* @param
|
|
230
|
-
* @param
|
|
231
|
-
* @returns
|
|
335
|
+
* @param rootCurrentContext The context for the root of the draft
|
|
336
|
+
* @param rightmostCurrentContext The context of the subobject page
|
|
337
|
+
* @returns The siblingInformation object
|
|
232
338
|
*/
|
|
233
339
|
var computeSiblingInformation = function (rootCurrentContext, rightmostCurrentContext) {
|
|
234
340
|
try {
|
|
@@ -249,7 +355,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
249
355
|
var segments = additionalPath ? additionalPath.substring(1).split("/") : []; // First segment is always the full path of the root object, which can contain '/' in case of a parametrized entity
|
|
250
356
|
|
|
251
357
|
segments.unshift(rootCurrentContext.getPath().substring(1)); // //////////////////////////////////////////////////////////////////
|
|
252
|
-
// 2. Request canonical paths of the sibling entity for
|
|
358
|
+
// 2. Request canonical paths of the sibling entity for each segment
|
|
253
359
|
// Example: for ["Param(aa)/Entity(bb)", "_Nav(cc)", "_SubNav(dd)"]
|
|
254
360
|
// --> request canonical paths for "Param(aa)/Entity(bb)/SiblingEntity", "Param(aa)/Entity(bb)/_Nav(cc)/SiblingEntity", "Param(aa)/Entity(bb)/_Nav(cc)/_SubNav(dd)/SiblingEntity"
|
|
255
361
|
|
|
@@ -259,8 +365,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
259
365
|
var canonicalPathPromises = segments.map(function (segment) {
|
|
260
366
|
currentPath += "/".concat(segment);
|
|
261
367
|
oldPaths.unshift(currentPath);
|
|
262
|
-
|
|
263
|
-
|
|
368
|
+
|
|
369
|
+
if (currentPath.endsWith(")")) {
|
|
370
|
+
var siblingContext = model.bindContext("".concat(currentPath, "/SiblingEntity")).getBoundContext();
|
|
371
|
+
return siblingContext.requestCanonicalPath();
|
|
372
|
+
} else {
|
|
373
|
+
return Promise.resolve(undefined); // 1-1 relation
|
|
374
|
+
}
|
|
264
375
|
}); // //////////////////////////////////////////////////////////////////
|
|
265
376
|
// 3. Reconstruct the full paths from canonical paths (for path mapping)
|
|
266
377
|
// Example: for canonical paths "/Param(aa)/Entity(bb-sibling)", "/Entity2(cc-sibling)", "/Entity3(dd-sibling)"
|
|
@@ -271,11 +382,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
271
382
|
var siblingPath = "";
|
|
272
383
|
canonicalPaths.forEach(function (canonicalPath, index) {
|
|
273
384
|
if (index !== 0) {
|
|
274
|
-
|
|
385
|
+
if (segments[index].endsWith(")")) {
|
|
386
|
+
var navigation = segments[index].replace(/\(.*$/, ""); // Keep only navigation name from the segment, i.e. aaa(xxx) --> aaa
|
|
275
387
|
|
|
276
|
-
|
|
388
|
+
var keys = canonicalPath.replace(/.*\(/, "("); // Keep only the keys from the canonical path, i.e. aaa(xxx) --> (xxx)
|
|
277
389
|
|
|
278
|
-
|
|
390
|
+
siblingPath += "/".concat(navigation).concat(keys);
|
|
391
|
+
} else {
|
|
392
|
+
siblingPath += "/".concat(segments[index]); // 1-1 relation
|
|
393
|
+
}
|
|
279
394
|
} else {
|
|
280
395
|
siblingPath = canonicalPath; // To manage parametrized entities
|
|
281
396
|
}
|
|
@@ -302,6 +417,166 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
302
417
|
}
|
|
303
418
|
};
|
|
304
419
|
|
|
420
|
+
/**
|
|
421
|
+
* Executes discard of a draft function using HTTP Post.
|
|
422
|
+
*
|
|
423
|
+
* @function
|
|
424
|
+
* @param oContext Context for which the action should be performed
|
|
425
|
+
* @param oAppComponent App Component
|
|
426
|
+
* @param bEnableStrictHandling
|
|
427
|
+
* @returns Resolve function returns the context of the operation
|
|
428
|
+
* @private
|
|
429
|
+
* @ui5-restricted
|
|
430
|
+
*/
|
|
431
|
+
var executeDraftDiscardAction = function (oContext, oAppComponent, bEnableStrictHandling) {
|
|
432
|
+
try {
|
|
433
|
+
if (!oContext.getProperty("IsActiveEntity")) {
|
|
434
|
+
function _temp10(oResourceBundle) {
|
|
435
|
+
var sGroupId = "direct";
|
|
436
|
+
var sActionName = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON", oResourceBundle); // as the discard action doesnt' send the active version in the response we do not use the replace in cache
|
|
437
|
+
|
|
438
|
+
var oDiscardPromise = !bEnableStrictHandling ? oDiscardOperation.execute(sGroupId) : oDiscardOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, {
|
|
439
|
+
label: sActionName,
|
|
440
|
+
model: oContext.getModel()
|
|
441
|
+
}, oResourceBundle), false);
|
|
442
|
+
oContext.getModel().submitBatch(sGroupId);
|
|
443
|
+
return oDiscardPromise;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
var oDiscardOperation = draft.createOperation(oContext, draftOperations.DISCARD);
|
|
447
|
+
return Promise.resolve(oAppComponent ? Promise.resolve(oAppComponent.getModel("sap.fe.i18n").getResourceBundle()).then(_temp10) : _temp10(oAppComponent));
|
|
448
|
+
} else {
|
|
449
|
+
throw new Error("The discard action cannot be executed on an active document");
|
|
450
|
+
}
|
|
451
|
+
} catch (e) {
|
|
452
|
+
return Promise.reject(e);
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
|
|
458
|
+
*
|
|
459
|
+
* @function
|
|
460
|
+
* @param oContext Context for which the action should be performed
|
|
461
|
+
* @param oAppComponent The AppComponent
|
|
462
|
+
* @param [sGroupId] The optional batch group in which the operation is to be executed
|
|
463
|
+
* @returns Resolve function returns the context of the operation
|
|
464
|
+
* @private
|
|
465
|
+
* @ui5-restricted
|
|
466
|
+
*/
|
|
467
|
+
var executeDraftActivationAction = function (oContext, oAppComponent, sGroupId) {
|
|
468
|
+
try {
|
|
469
|
+
var bHasPrepareAction = hasPrepareAction(oContext); // According to the draft spec if the service contains a prepare action and we trigger both prepare and
|
|
470
|
+
// activate in one $batch the activate action is called with iF-Match=*
|
|
471
|
+
|
|
472
|
+
var bIgnoreEtag = bHasPrepareAction;
|
|
473
|
+
|
|
474
|
+
if (!oContext.getProperty("IsActiveEntity")) {
|
|
475
|
+
var oOperation = createOperation(oContext, draftOperations.ACTIVATION, {
|
|
476
|
+
$$inheritExpandSelect: true
|
|
477
|
+
});
|
|
478
|
+
return Promise.resolve(oAppComponent.getModel("sap.fe.i18n").getResourceBundle()).then(function (oResourceBundle) {
|
|
479
|
+
var sActionName = CommonUtils.getTranslatedText("C_OP_OBJECT_PAGE_SAVE", oResourceBundle);
|
|
480
|
+
return _catch(function () {
|
|
481
|
+
return Promise.resolve(oOperation.execute(sGroupId, bIgnoreEtag, sGroupId ? CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, {
|
|
482
|
+
label: sActionName,
|
|
483
|
+
model: oContext.getModel()
|
|
484
|
+
}, oResourceBundle) : undefined, oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")));
|
|
485
|
+
}, function (e) {
|
|
486
|
+
function _temp5() {
|
|
487
|
+
throw e;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
var _temp4 = function () {
|
|
491
|
+
if (bHasPrepareAction) {
|
|
492
|
+
var actionName = getActionName(oContext, draftOperations.PREPARE),
|
|
493
|
+
oSideEffectsService = oAppComponent.getSideEffectsService(),
|
|
494
|
+
oBindingParameters = oSideEffectsService.getODataActionSideEffects(actionName, oContext),
|
|
495
|
+
aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
|
|
496
|
+
|
|
497
|
+
var _temp6 = function () {
|
|
498
|
+
if (aTargetPaths && aTargetPaths.length > 0) {
|
|
499
|
+
var _temp7 = _catch(function () {
|
|
500
|
+
return Promise.resolve(oSideEffectsService.requestSideEffects(aTargetPaths, oContext)).then(function () {});
|
|
501
|
+
}, function (oError) {
|
|
502
|
+
Log.error("Error while requesting side effects", oError);
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
if (_temp7 && _temp7.then) return _temp7.then(function () {});
|
|
506
|
+
} else {
|
|
507
|
+
var _temp8 = _catch(function () {
|
|
508
|
+
return Promise.resolve(requestMessages(oContext, oSideEffectsService)).then(function () {});
|
|
509
|
+
}, function (oError) {
|
|
510
|
+
Log.error("Error while requesting messages", oError);
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
if (_temp8 && _temp8.then) return _temp8.then(function () {});
|
|
514
|
+
}
|
|
515
|
+
}();
|
|
516
|
+
|
|
517
|
+
if (_temp6 && _temp6.then) return _temp6.then(function () {});
|
|
518
|
+
}
|
|
519
|
+
}();
|
|
520
|
+
|
|
521
|
+
return _temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4);
|
|
522
|
+
});
|
|
523
|
+
});
|
|
524
|
+
} else {
|
|
525
|
+
throw new Error("The activation action cannot be executed on an active document");
|
|
526
|
+
}
|
|
527
|
+
} catch (e) {
|
|
528
|
+
return Promise.reject(e);
|
|
529
|
+
}
|
|
530
|
+
};
|
|
531
|
+
/**
|
|
532
|
+
* Check if a message property path is defined for a context.
|
|
533
|
+
*
|
|
534
|
+
* @function
|
|
535
|
+
* @param oContext Context to be checked
|
|
536
|
+
* @returns Path to the message
|
|
537
|
+
* @private
|
|
538
|
+
* @ui5-restricted
|
|
539
|
+
*/
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Creates a new draft from an active document.
|
|
544
|
+
*
|
|
545
|
+
* @function
|
|
546
|
+
* @param oContext Context for which the action should be performed
|
|
547
|
+
* @param bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
|
|
548
|
+
* @param oView If true - existing changes from another
|
|
549
|
+
* @returns Resolve function returns the context of the operation
|
|
550
|
+
* @private
|
|
551
|
+
* @ui5-restricted
|
|
552
|
+
*/
|
|
553
|
+
var executeDraftEditAction = function (oContext, bPreserveChanges, oView) {
|
|
554
|
+
try {
|
|
555
|
+
if (oContext.getProperty("IsActiveEntity")) {
|
|
556
|
+
var oOptions = {
|
|
557
|
+
$$inheritExpandSelect: true
|
|
558
|
+
};
|
|
559
|
+
var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
|
|
560
|
+
oOperation.setParameter("PreserveChanges", bPreserveChanges);
|
|
561
|
+
var sGroupId = "direct";
|
|
562
|
+
return Promise.resolve(oView.getModel("sap.fe.i18n").getResourceBundle()).then(function (oResourceBundle) {
|
|
563
|
+
var sActionName = CommonUtils.getTranslatedText("C_COMMON_OBJECT_PAGE_EDIT", oResourceBundle); //If the context is coming from a list binding we pass the flag true to replace the context by the active one
|
|
564
|
+
|
|
565
|
+
var oEditPromise = oOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, {
|
|
566
|
+
label: sActionName,
|
|
567
|
+
model: oContext.getModel()
|
|
568
|
+
}, oResourceBundle), oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding"));
|
|
569
|
+
oOperation.getModel().submitBatch(sGroupId);
|
|
570
|
+
return Promise.resolve(oEditPromise);
|
|
571
|
+
});
|
|
572
|
+
} else {
|
|
573
|
+
throw new Error("You cannot edit this draft document");
|
|
574
|
+
}
|
|
575
|
+
} catch (e) {
|
|
576
|
+
return Promise.reject(e);
|
|
577
|
+
}
|
|
578
|
+
};
|
|
579
|
+
|
|
305
580
|
/**
|
|
306
581
|
* Interface for callbacks used in the functions
|
|
307
582
|
*
|
|
@@ -315,18 +590,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
315
590
|
|
|
316
591
|
/**
|
|
317
592
|
* Callback to approve or reject the creation of a draft
|
|
593
|
+
*
|
|
318
594
|
* @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
|
|
319
595
|
* @function
|
|
320
596
|
* @static
|
|
321
597
|
* @abstract
|
|
322
598
|
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
323
599
|
* @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
|
|
324
|
-
*
|
|
325
600
|
* @private
|
|
326
601
|
*/
|
|
327
602
|
|
|
328
603
|
/**
|
|
329
604
|
* Callback after a draft was successully created
|
|
605
|
+
*
|
|
330
606
|
* @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
|
|
331
607
|
* @function
|
|
332
608
|
* @static
|
|
@@ -334,21 +610,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
334
610
|
* @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
|
|
335
611
|
* @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
|
|
336
612
|
* @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
|
|
337
|
-
*
|
|
338
613
|
* @private
|
|
339
614
|
*/
|
|
340
615
|
|
|
341
616
|
/**
|
|
342
617
|
* Callback to approve or reject overwriting an unsaved draft of another user
|
|
618
|
+
*
|
|
343
619
|
* @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
|
|
344
620
|
* @function
|
|
345
621
|
* @public
|
|
346
622
|
* @static
|
|
347
623
|
* @abstract
|
|
348
|
-
*
|
|
349
624
|
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
350
625
|
* @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
|
|
351
|
-
*
|
|
352
626
|
* @ui5-restricted
|
|
353
627
|
*/
|
|
354
628
|
|
|
@@ -359,9 +633,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
359
633
|
DISCARD: "DiscardAction",
|
|
360
634
|
PREPARE: "PreparationAction"
|
|
361
635
|
};
|
|
362
|
-
/* Enum for navigation types */
|
|
363
|
-
|
|
364
|
-
var NavigationType;
|
|
365
636
|
/**
|
|
366
637
|
* Static functions for the draft programming model
|
|
367
638
|
*
|
|
@@ -375,147 +646,85 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
375
646
|
/**
|
|
376
647
|
* Determines action name for a draft operation.
|
|
377
648
|
*
|
|
378
|
-
* @param
|
|
379
|
-
* @param
|
|
380
|
-
* @returns
|
|
649
|
+
* @param oContext The context that should be bound to the operation
|
|
650
|
+
* @param sOperation The operation name
|
|
651
|
+
* @returns The name of the draft operation
|
|
381
652
|
*/
|
|
382
653
|
|
|
383
|
-
(function (NavigationType) {
|
|
384
|
-
NavigationType["BackNavigation"] = "BackNavigation";
|
|
385
|
-
NavigationType["ForwardNavigation"] = "ForwardNavigation";
|
|
386
|
-
})(NavigationType || (NavigationType = {}));
|
|
387
|
-
|
|
388
654
|
function getActionName(oContext, sOperation) {
|
|
389
655
|
var oModel = oContext.getModel(),
|
|
390
656
|
oMetaModel = oModel.getMetaModel(),
|
|
391
657
|
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
392
|
-
return oMetaModel.getObject(sEntitySetPath
|
|
658
|
+
return oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot/").concat(sOperation));
|
|
393
659
|
}
|
|
394
660
|
/**
|
|
395
661
|
* Creates an operation context binding for the given context and operation.
|
|
396
662
|
*
|
|
397
|
-
* @param
|
|
398
|
-
* @param
|
|
663
|
+
* @param oContext The context that should be bound to the operation
|
|
664
|
+
* @param sOperation The operation (action or function import)
|
|
399
665
|
* @param oOptions Options to create the operation context
|
|
400
|
-
* @returns
|
|
666
|
+
* @returns The context binding of the bound operation
|
|
401
667
|
*/
|
|
402
668
|
|
|
403
669
|
|
|
404
670
|
function createOperation(oContext, sOperation, oOptions) {
|
|
405
671
|
var sOperationName = getActionName(oContext, sOperation);
|
|
406
|
-
return oContext.getModel().bindContext(sOperationName
|
|
672
|
+
return oContext.getModel().bindContext("".concat(sOperationName, "(...)"), oContext, oOptions);
|
|
407
673
|
}
|
|
408
674
|
/**
|
|
409
|
-
*
|
|
675
|
+
* Determines the return type for a draft operation.
|
|
410
676
|
*
|
|
411
|
-
* @param
|
|
412
|
-
* @
|
|
677
|
+
* @param oContext The context that should be bound to the operation
|
|
678
|
+
* @param sOperation The operation name
|
|
679
|
+
* @returns The return type of the draft operation
|
|
413
680
|
*/
|
|
414
681
|
|
|
415
682
|
|
|
416
|
-
function
|
|
417
|
-
|
|
683
|
+
function getReturnType(oContext, sOperation) {
|
|
684
|
+
var oModel = oContext.getModel(),
|
|
685
|
+
oMetaModel = oModel.getMetaModel(),
|
|
686
|
+
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
687
|
+
return oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot/").concat(sOperation, "/$ReturnType"));
|
|
418
688
|
}
|
|
419
689
|
/**
|
|
420
|
-
*
|
|
690
|
+
* Check if optional draft prepare action exists.
|
|
421
691
|
*
|
|
422
|
-
* @
|
|
423
|
-
* @
|
|
424
|
-
* @param {boolean} bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
|
|
425
|
-
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
426
|
-
* @private
|
|
427
|
-
* @ui5-restricted
|
|
692
|
+
* @param oContext The context that should be bound to the operation
|
|
693
|
+
* @returns True if a a prepare action exists
|
|
428
694
|
*/
|
|
429
695
|
|
|
430
696
|
|
|
431
|
-
function
|
|
432
|
-
|
|
433
|
-
var oOptions = {
|
|
434
|
-
$$inheritExpandSelect: true
|
|
435
|
-
};
|
|
436
|
-
var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
|
|
437
|
-
oOperation.setParameter("PreserveChanges", bPreserveChanges);
|
|
438
|
-
var sGroupId = "direct";
|
|
439
|
-
var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
|
|
440
|
-
var sActionName = localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"); //If the context is coming from a list binding we pass the flag true to replace the context by the active one
|
|
441
|
-
|
|
442
|
-
var oEditPromise = oOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()), oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")).then(function (oDraftDocumentContext) {
|
|
443
|
-
return oDraftDocumentContext;
|
|
444
|
-
});
|
|
445
|
-
oOperation.getModel().submitBatch(sGroupId);
|
|
446
|
-
return oEditPromise;
|
|
447
|
-
} else {
|
|
448
|
-
throw new Error("You cannot edit this draft document");
|
|
449
|
-
}
|
|
697
|
+
function hasPrepareAction(oContext) {
|
|
698
|
+
return !!getActionName(oContext, draftOperations.PREPARE);
|
|
450
699
|
}
|
|
451
|
-
/**
|
|
452
|
-
* Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
|
|
453
|
-
*
|
|
454
|
-
* @function
|
|
455
|
-
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
456
|
-
* @param {object} oAppComponent The AppComponent
|
|
457
|
-
* @param {string} [sGroupId] The optional batch group in which the operation is to be executed
|
|
458
|
-
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
459
|
-
* @private
|
|
460
|
-
* @ui5-restricted
|
|
461
|
-
*/
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
function executeDraftActivationAction(oContext, oAppComponent, sGroupId) {
|
|
465
|
-
var bHasPrepareAction = hasPrepareAction(oContext); // According to the draft spec if the service contains a prepare action and we trigger both prepare and
|
|
466
|
-
// activate in one $batch the activate action is called with iF-Match=*
|
|
467
700
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
});
|
|
474
|
-
var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
|
|
475
|
-
var sActionName = localI18nRef.getText("C_OP_OBJECT_PAGE_SAVE");
|
|
476
|
-
return oOperation.execute(sGroupId, bIgnoreEtag, sGroupId ? CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()) : undefined, oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")) //3rd parameter<------
|
|
477
|
-
.then(function (oActiveDocumentContext) {
|
|
478
|
-
return oActiveDocumentContext;
|
|
479
|
-
}).catch( //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
|
|
480
|
-
function () {
|
|
481
|
-
if (bHasPrepareAction) {
|
|
482
|
-
var _sActionName = getActionName(oContext, draftOperations.PREPARE),
|
|
483
|
-
oSideEffectsService = oAppComponent.getSideEffectsService(),
|
|
484
|
-
oBindingParameters = oSideEffectsService.getODataActionSideEffects(_sActionName, oContext),
|
|
485
|
-
aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
|
|
486
|
-
|
|
487
|
-
if (aTargetPaths && aTargetPaths.length > 0) {
|
|
488
|
-
oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function (oError) {
|
|
489
|
-
Log.error("Error while requesting side effects", oError);
|
|
490
|
-
});
|
|
491
|
-
} else {
|
|
492
|
-
requestMessages(oContext, oSideEffectsService).catch(function (oError) {
|
|
493
|
-
Log.error("Error while requesting messages", oError);
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
|
-
}
|
|
701
|
+
function getMessagePath(oContext) {
|
|
702
|
+
var oMetaModel = oContext.getModel().getMetaModel();
|
|
703
|
+
var sContextPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
704
|
+
var oReturnType = getReturnType(oContext, draftOperations.PREPARE); // If there is no return parameter, it is not possible to request Messages.
|
|
705
|
+
// RAP draft prepare has no return parameter
|
|
497
706
|
|
|
498
|
-
|
|
499
|
-
});
|
|
500
|
-
} else {
|
|
501
|
-
throw new Error("The activation action cannot be executed on an active document");
|
|
502
|
-
}
|
|
707
|
+
return !!oReturnType ? oMetaModel.getObject("".concat(sContextPath, "/@").concat("com.sap.vocabularies.Common.v1.Messages", "/$Path")) : null;
|
|
503
708
|
}
|
|
504
709
|
/**
|
|
505
710
|
* Execute a preparation action.
|
|
506
711
|
*
|
|
507
712
|
* @function
|
|
508
|
-
* @param
|
|
509
|
-
* @param
|
|
510
|
-
* @
|
|
713
|
+
* @param oContext Context for which the action should be performed
|
|
714
|
+
* @param groupId The optional batch group in which we want to execute the operation
|
|
715
|
+
* @param bMessages If set to true, the PREPARE action retrieves SAP_Messages
|
|
716
|
+
* @returns Resolve function returns the context of the operation
|
|
511
717
|
* @private
|
|
512
718
|
* @ui5-restricted
|
|
513
719
|
*/
|
|
514
720
|
|
|
515
721
|
|
|
516
|
-
function executeDraftPreparationAction(oContext, groupId) {
|
|
722
|
+
function executeDraftPreparationAction(oContext, groupId, bMessages) {
|
|
517
723
|
if (!oContext.getProperty("IsActiveEntity")) {
|
|
518
|
-
var
|
|
724
|
+
var sMessagesPath = bMessages ? getMessagePath(oContext) : null;
|
|
725
|
+
var oOperation = createOperation(oContext, draftOperations.PREPARE, sMessagesPath ? {
|
|
726
|
+
$select: sMessagesPath
|
|
727
|
+
} : null); // TODO: side effects qualifier shall be even deprecated to be checked
|
|
519
728
|
|
|
520
729
|
oOperation.setParameter("SideEffectsQualifier", "");
|
|
521
730
|
var sGroupId = groupId || oOperation.getGroupId();
|
|
@@ -532,8 +741,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
532
741
|
* Determines the message path for a context.
|
|
533
742
|
*
|
|
534
743
|
* @function
|
|
535
|
-
* @param
|
|
536
|
-
* @returns
|
|
744
|
+
* @param oContext Context for which the path shall be determined
|
|
745
|
+
* @returns Message path, empty if not annotated
|
|
537
746
|
* @private
|
|
538
747
|
* @ui5-restricted
|
|
539
748
|
*/
|
|
@@ -543,15 +752,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
543
752
|
var oModel = oContext.getModel(),
|
|
544
753
|
oMetaModel = oModel.getMetaModel(),
|
|
545
754
|
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
546
|
-
return oMetaModel.getObject(sEntitySetPath
|
|
755
|
+
return oMetaModel.getObject("".concat(sEntitySetPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
|
|
547
756
|
}
|
|
548
757
|
/**
|
|
549
758
|
* Requests the messages if annotated for a given context.
|
|
550
759
|
*
|
|
551
760
|
* @function
|
|
552
|
-
* @param
|
|
553
|
-
* @param
|
|
554
|
-
* @returns
|
|
761
|
+
* @param oContext Context for which the messages shall be requested
|
|
762
|
+
* @param oSideEffectsService Service for the SideEffects on SAP Fiori elements
|
|
763
|
+
* @returns Promise which is resolved once messages were requested
|
|
555
764
|
* @private
|
|
556
765
|
* @ui5-restricted
|
|
557
766
|
*/
|
|
@@ -568,84 +777,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
568
777
|
|
|
569
778
|
return Promise.resolve();
|
|
570
779
|
}
|
|
571
|
-
/**
|
|
572
|
-
* Executes the discard of a draft function using HTTP POST.
|
|
573
|
-
*
|
|
574
|
-
* @function
|
|
575
|
-
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
576
|
-
* @param {boolean} bEnableStrictHandling
|
|
577
|
-
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
578
|
-
* @private
|
|
579
|
-
* @ui5-restricted
|
|
580
|
-
*/
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
function executeDraftDiscardAction(oContext, bEnableStrictHandling) {
|
|
584
|
-
if (!oContext.getProperty("IsActiveEntity")) {
|
|
585
|
-
var oDiscardOperation = draft.createOperation(oContext, draftOperations.DISCARD);
|
|
586
|
-
var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
|
|
587
|
-
var sGroupId = "direct";
|
|
588
|
-
var sActionName = localI18nRef.getText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON"); // as the discard action doesnt' send the active version in the response we do not use the replace in cache
|
|
589
|
-
|
|
590
|
-
var oDiscardPromise = !bEnableStrictHandling ? oDiscardOperation.execute(sGroupId) : oDiscardOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()), false);
|
|
591
|
-
oContext.getModel().submitBatch(sGroupId);
|
|
592
|
-
return oDiscardPromise;
|
|
593
|
-
} else {
|
|
594
|
-
throw new Error("The discard action cannot be executed on an active document");
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
function activateDocument(oContext, oAppComponent, mParameters) {
|
|
599
|
-
var mParam = mParameters || {};
|
|
600
|
-
|
|
601
|
-
if (!oContext) {
|
|
602
|
-
return Promise.reject(new Error("Binding context to draft document is required"));
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true).then(function (bExecute) {
|
|
606
|
-
if (!bExecute) {
|
|
607
|
-
return Promise.reject(new Error("Activation of the document was aborted by extension for document: " + oContext.getPath()));
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
if (!hasPrepareAction(oContext)) {
|
|
611
|
-
return executeDraftActivationAction(oContext, oAppComponent);
|
|
612
|
-
}
|
|
613
|
-
/* activation requires preparation */
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
var sBatchGroup = "draft"; // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
|
|
617
|
-
|
|
618
|
-
var oPreparePromise = executeDraftPreparationAction(oContext, sBatchGroup);
|
|
619
|
-
oContext.getModel().submitBatch(sBatchGroup);
|
|
620
|
-
var oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
|
|
621
|
-
return Promise.all([oPreparePromise, oActivatePromise]).then(function (values) {
|
|
622
|
-
return values[1];
|
|
623
|
-
}).catch(function (exc) {
|
|
624
|
-
return Promise.reject(exc);
|
|
625
|
-
});
|
|
626
|
-
}).then(function (oActiveDocumentContext) {
|
|
627
|
-
return Promise.resolve(mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext);
|
|
628
|
-
}).catch(function (exc) {
|
|
629
|
-
return Promise.reject(exc);
|
|
630
|
-
});
|
|
631
|
-
}
|
|
632
|
-
/**
|
|
633
|
-
* HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
|
|
634
|
-
* and Active Instance uses DELETE always.
|
|
635
|
-
*
|
|
636
|
-
* @function
|
|
637
|
-
* @name sap.fe.core.actions.draft#deleteDraft
|
|
638
|
-
* @memberof sap.fe.core.actions.draft
|
|
639
|
-
* @static
|
|
640
|
-
* @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
|
|
641
|
-
* @param {boolean} bEnableStrictHandling
|
|
642
|
-
* @private
|
|
643
|
-
* @returns {Promise}
|
|
644
|
-
* @ui5-restricted
|
|
645
|
-
*/
|
|
646
780
|
|
|
647
|
-
|
|
648
|
-
function deleteDraft(oContext, bEnableStrictHandling) {
|
|
781
|
+
function deleteDraft(oContext, oAppComponent, bEnableStrictHandling) {
|
|
649
782
|
var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
|
|
650
783
|
bIsActiveEntity = oContext.getObject().IsActiveEntity;
|
|
651
784
|
|
|
@@ -662,110 +795,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
662
795
|
}
|
|
663
796
|
} else {
|
|
664
797
|
//Use Discard Post Action if it is a draft entity and discard action exists
|
|
665
|
-
return executeDraftDiscardAction(oContext, bEnableStrictHandling);
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
/**
|
|
669
|
-
* @param fnProcessFunction
|
|
670
|
-
* @param fnCancelFunction
|
|
671
|
-
* @param oContext
|
|
672
|
-
* @param oController
|
|
673
|
-
* @param bSkipBindingToView
|
|
674
|
-
* @param navigationType
|
|
675
|
-
*/
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
function processDataLossOrDraftDiscardConfirmation(fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView) {
|
|
679
|
-
var navigationType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : NavigationType.BackNavigation;
|
|
680
|
-
var oModel = oContext.getModel();
|
|
681
|
-
var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
|
|
682
|
-
var collaborationConnected = ActivitySync.isConnected(oController.getView());
|
|
683
|
-
var processFunctionForDrafts = !collaborationConnected ? fnProcessFunction : function () {
|
|
684
|
-
ActivitySync.disconnect(oController.getView());
|
|
685
|
-
|
|
686
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
687
|
-
args[_key] = arguments[_key];
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
fnProcessFunction.apply.apply(fnProcessFunction, [null].concat(args));
|
|
691
|
-
};
|
|
692
|
-
|
|
693
|
-
if (oContext && oContext.getObject() && (!oContext.getObject().DraftAdministrativeData || oContext.getObject().IsActiveEntity === true)) {
|
|
694
|
-
fnProcessFunction();
|
|
695
|
-
} else {
|
|
696
|
-
draftDataContext.requestObject().then(function (draftAdminData) {
|
|
697
|
-
if (draftAdminData) {
|
|
698
|
-
if (oController.getAppComponent().getRootViewController().isFclEnabled()) {
|
|
699
|
-
// The application is running in FCL mode so in this case we fall back to
|
|
700
|
-
// the old logic since the dirty state handling is not properly working
|
|
701
|
-
// for FCL.
|
|
702
|
-
if (!(draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime)) {
|
|
703
|
-
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
704
|
-
} else {
|
|
705
|
-
processFunctionForDrafts();
|
|
706
|
-
}
|
|
707
|
-
} else {
|
|
708
|
-
if (!oContext.getObject().HasActiveEntity) {
|
|
709
|
-
// There is no active entity so we are editing either newly created data or
|
|
710
|
-
// a draft which has never been saved to active version
|
|
711
|
-
// Since we want to react differently in the two situations, we have to check the
|
|
712
|
-
// dirty state
|
|
713
|
-
if (EditState.isEditStateDirty()) {
|
|
714
|
-
// In this case data is being newly created and then we always want to
|
|
715
|
-
// show the dataloss dialog on navigation
|
|
716
|
-
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
717
|
-
} else {
|
|
718
|
-
// We are editing a draft which has been created earlier but never saved to active
|
|
719
|
-
// version and since the edit state is not dirty, there have been no user changes
|
|
720
|
-
// so in this case we want to silently navigate and do nothing
|
|
721
|
-
processFunctionForDrafts();
|
|
722
|
-
}
|
|
723
|
-
} else {
|
|
724
|
-
// We are editing a draft for an existing active entity
|
|
725
|
-
if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
|
|
726
|
-
// The CreationDateTime and LastChangeDateTime are equal, so this draft was
|
|
727
|
-
// never saved before, hence we're currently editing a newly created draft for
|
|
728
|
-
// an existing active entity for the first time.
|
|
729
|
-
// Also there have so far been no changes made to the draft and in this
|
|
730
|
-
// case we want to silently navigate and delete the draft in case of a back
|
|
731
|
-
// navigation but in case of a forward navigation we want to silently keep it!
|
|
732
|
-
if (navigationType === NavigationType.BackNavigation) {
|
|
733
|
-
var mParameters = {
|
|
734
|
-
skipDiscardPopover: true
|
|
735
|
-
};
|
|
736
|
-
oController.editFlow.cancelDocument(oContext, mParameters).then(function () {
|
|
737
|
-
processFunctionForDrafts();
|
|
738
|
-
}).catch(function (error) {
|
|
739
|
-
Log.error("Error while canceling the document", error);
|
|
740
|
-
});
|
|
741
|
-
} else {
|
|
742
|
-
// In case of a forward navigation we silently keep the draft and only
|
|
743
|
-
// execute the followup function.
|
|
744
|
-
processFunctionForDrafts();
|
|
745
|
-
}
|
|
746
|
-
} else {
|
|
747
|
-
// The CreationDateTime and LastChangeDateTime are NOT equal, so we are currently editing
|
|
748
|
-
// an existing draft and need to distinguish depending on if any changes
|
|
749
|
-
// have been made in the current editing session or not
|
|
750
|
-
if (EditState.isEditStateDirty()) {
|
|
751
|
-
// Changes have been made in the current editing session so we want
|
|
752
|
-
// to show the dataloss dialog and let the user decide
|
|
753
|
-
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
754
|
-
} else {
|
|
755
|
-
// The user started editing the existing draft but did not make any changes
|
|
756
|
-
// in the current editing session, so in this case we do not want
|
|
757
|
-
// to show the dataloss dialog but just keep the draft
|
|
758
|
-
processFunctionForDrafts();
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
} else {
|
|
764
|
-
fnProcessFunction();
|
|
765
|
-
}
|
|
766
|
-
}).catch(function (oError) {
|
|
767
|
-
Log.error("Cannot retrieve draftDataContext information", oError);
|
|
768
|
-
});
|
|
798
|
+
return executeDraftDiscardAction(oContext, oAppComponent, bEnableStrictHandling);
|
|
769
799
|
}
|
|
770
800
|
}
|
|
771
801
|
|
|
@@ -774,12 +804,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
774
804
|
activateDocument: activateDocument,
|
|
775
805
|
deleteDraft: deleteDraft,
|
|
776
806
|
executeDraftEditAction: executeDraftEditAction,
|
|
807
|
+
executeDraftPreparationAction: executeDraftPreparationAction,
|
|
808
|
+
executeDraftActivationAction: executeDraftActivationAction,
|
|
777
809
|
computeSiblingInformation: computeSiblingInformation,
|
|
778
|
-
processDataLossOrDraftDiscardConfirmation: processDataLossOrDraftDiscardConfirmation,
|
|
810
|
+
processDataLossOrDraftDiscardConfirmation: draftDataLossPopup.processDataLossOrDraftDiscardConfirmation,
|
|
811
|
+
silentlyKeepDraftOnForwardNavigation: draftDataLossPopup.silentlyKeepDraftOnForwardNavigation,
|
|
779
812
|
createOperation: createOperation,
|
|
780
813
|
executeDraftDiscardAction: executeDraftDiscardAction,
|
|
781
|
-
NavigationType: NavigationType
|
|
814
|
+
NavigationType: draftDataLossPopup.NavigationType
|
|
782
815
|
};
|
|
783
816
|
return draft;
|
|
784
817
|
}, false);
|
|
785
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwib3ZlcndyaXRlT25EZW1hbmQiLCJiT3ZlcndyaXRlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0Iiwib1Jlc291cmNlQnVuZGxlIiwib1ZpZXciLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIl9vUmVzb3VyY2VCdW5kbGUiLCJyZXF1ZXN0T2JqZWN0IiwiZHJhZnRBZG1pbkRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwiRXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc29sdmUiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJsb2NhbEkxOG5SZWYiLCJnZXRUZXh0Iiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIm1QYXJhbSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImRyYWZ0Iiwib1Jlc3BvbnNlIiwic3RhdHVzIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJBY3Rpdml0eVN5bmMiLCJpc0NvbGxhYm9yYXRpb25FbmFibGVkIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInNpYmxpbmdJbmZvIiwic2libGluZ0NvbnRleHQiLCJnZXRDb250cm9sbGVyIiwiX3JvdXRpbmciLCJfY3JlYXRlQmluZGluZ0NvbnRleHQiLCJ0YXJnZXRDb250ZXh0IiwiZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCIsImNhbmNlbGVkIiwiZXhjIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJzdGFydHNXaXRoIiwiTG9nIiwibW9kZWwiLCJhZGRpdGlvbmFsUGF0aCIsInJlcGxhY2UiLCJzZWdtZW50cyIsInN1YnN0cmluZyIsInNwbGl0IiwidW5zaGlmdCIsIm9sZFBhdGhzIiwibmV3UGF0aHMiLCJjdXJyZW50UGF0aCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImFsbCIsImNhbm9uaWNhbFBhdGhzIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwidW5kZWZpbmVkIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiTmF2aWdhdGlvblR5cGUiLCJzT3BlcmF0aW9uIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRPYmplY3QiLCJjcmVhdGVPcGVyYXRpb24iLCJvT3B0aW9ucyIsInNPcGVyYXRpb25OYW1lIiwiaGFzUHJlcGFyZUFjdGlvbiIsImdldFByb3BlcnR5IiwiJCRpbmhlcml0RXhwYW5kU2VsZWN0Iiwib09wZXJhdGlvbiIsInNldFBhcmFtZXRlciIsInNHcm91cElkIiwic0FjdGlvbk5hbWUiLCJvRWRpdFByb21pc2UiLCJleGVjdXRlIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwiYmluZCIsImdldEJpbmRpbmciLCJpc0EiLCJvRHJhZnREb2N1bWVudENvbnRleHQiLCJzdWJtaXRCYXRjaCIsImV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24iLCJiSGFzUHJlcGFyZUFjdGlvbiIsImJJZ25vcmVFdGFnIiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsImNhdGNoIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImFUYXJnZXRQYXRocyIsInBhdGhFeHByZXNzaW9ucyIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIm9FcnJvciIsInJlcXVlc3RNZXNzYWdlcyIsImV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIiwiZ3JvdXBJZCIsImdldEdyb3VwSWQiLCJnZXRNZXNzYWdlc1BhdGgiLCJzTWVzc2FnZXNQYXRoIiwiJFByb3BlcnR5UGF0aCIsImV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24iLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJvRGlzY2FyZE9wZXJhdGlvbiIsIm9EaXNjYXJkUHJvbWlzZSIsImFjdGl2YXRlRG9jdW1lbnQiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJzQmF0Y2hHcm91cCIsIm9QcmVwYXJlUHJvbWlzZSIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsImRlbGV0ZURyYWZ0Iiwic0Rpc2NhcmRBY3Rpb24iLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiZGVsZXRlIiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJmblByb2Nlc3NGdW5jdGlvbiIsImZuQ2FuY2VsRnVuY3Rpb24iLCJvQ29udHJvbGxlciIsImJTa2lwQmluZGluZ1RvVmlldyIsIm5hdmlnYXRpb25UeXBlIiwiQmFja05hdmlnYXRpb24iLCJjb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwiaXNDb25uZWN0ZWQiLCJnZXRWaWV3IiwicHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIiwiZGlzY29ubmVjdCIsImFyZ3MiLCJhcHBseSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiaXNGY2xFbmFibGVkIiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsIkRhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyIiwicGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0IiwiSGFzQWN0aXZlRW50aXR5IiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsInNraXBEaXNjYXJkUG9wb3ZlciIsImVkaXRGbG93IiwiY2FuY2VsRG9jdW1lbnQiXSwi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O0FBTUEsaUJBVEQsTUFTTztBQUNOO0FBQ0E7QUFDQTtBQUNBTSxrQkFBQUEsd0JBQXdCO0FBQ3hCO0FBQ0Q7QUFDRDtBQUNEO0FBQ0QsU0FwRkQsTUFvRk87QUFDTlQsVUFBQUEsaUJBQWlCO0FBQ2pCO0FBQ0QsT0ExRkYsRUEyRkVqQyxLQTNGRixDQTJGUSxVQUFVTSxNQUFWLEVBQXVCO0FBQzdCakUsUUFBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLDhDQUFWLEVBQTBEcUksTUFBMUQ7QUFDQSxPQTdGRjtBQThGQTtBQUNEOztBQUVELE1BQU1wRixLQUFLLEdBQUc7QUFDYi9FLElBQUFBLDZCQUE2QixFQUFFQSw2QkFEbEI7QUFFYitLLElBQUFBLGdCQUFnQixFQUFFQSxnQkFGTDtBQUdiTyxJQUFBQSxXQUFXLEVBQUVBLFdBSEE7QUFJYmxKLElBQUFBLHNCQUFzQixFQUFFQSxzQkFKWDtBQUtiaUQsSUFBQUEseUJBQXlCLEVBQUVBLHlCQUxkO0FBTWJ3RyxJQUFBQSx5Q0FBeUMsRUFBRUEseUNBTjlCO0FBT2J0RCxJQUFBQSxlQUFlLEVBQUVBLGVBUEo7QUFRYm9DLElBQUFBLHlCQUF5QixFQUFFQSx5QkFSZDtBQVNiM0MsSUFBQUEsY0FBYyxFQUFFQTtBQVRILEdBQWQ7U0FZZWpELEsiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBBY3Rpdml0eVN5bmMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBEYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvRGF0YUxvc3NPckRyYWZ0RGlzY2FyZC9EYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgU2libGluZ0luZm9ybWF0aW9uID0ge1xuXHR0YXJnZXRDb250ZXh0OiBDb250ZXh0O1xuXHRwYXRoTWFwcGluZzogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W107XG59O1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY2FsbGJhY2tzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uc1xuICpcbiAqXG4gKiBAYXV0aG9yIFNBUCBTRVxuICogQHNpbmNlIDEuNTQuMFxuICogQGludGVyZmFjZVxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayB0byBhcHByb3ZlIG9yIHJlamVjdCB0aGUgY3JlYXRpb24gb2YgYSBkcmFmdFxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgb2YgZHJhZnQgY3JlYXRpb24gW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGFmdGVyIGEgZHJhZnQgd2FzIHN1Y2Nlc3N1bGx5IGNyZWF0ZWRcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3Qgb3ZlcndyaXRpbmcgYW4gdW5zYXZlZCBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLndoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkXG4gKiBAZnVuY3Rpb25cbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCB0byBvdmVyd3JpdGUgdW5zYXZlZCBkcmFmdCBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcbi8qIEVudW0gZm9yIG5hdmlnYXRpb24gdHlwZXMgKi9cbmVudW0gTmF2aWdhdGlvblR5cGUge1xuXHRCYWNrTmF2aWdhdGlvbiA9IFwiQmFja05hdmlnYXRpb25cIixcblx0Rm9yd2FyZE5hdmlnYXRpb24gPSBcIkZvcndhcmROYXZpZ2F0aW9uXCJcbn1cbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTQuMFxuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcyBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IGFueSwgc09wZXJhdGlvbjogc3RyaW5nKSB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1wiICsgc09wZXJhdGlvbik7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nfSBUaGUgY29udGV4dCBiaW5kaW5nIG9mIHRoZSBib3VuZCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0OiBhbnksIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBhbnkpIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzT3BlcmF0aW9uTmFtZSArIFwiKC4uLilcIiwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogYW55KSB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtib29sZWFufSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSAoaHR0cCBzdGF0dXMgNDA5KSBpcyBzZW5kIGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dDogYW55LCBiUHJlc2VydmVDaGFuZ2VzOiBib29sZWFuKSB7XG5cdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wdGlvbnMgPSB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9O1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElULCBvT3B0aW9ucyk7XG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJQcmVzZXJ2ZUNoYW5nZXNcIiwgYlByZXNlcnZlQ2hhbmdlcyk7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIik7XG5cdFx0Ly9JZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKFxuXHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChkcmFmdCwgc0dyb3VwSWQsIHNBY3Rpb25OYW1lLCBvQ29udGV4dC5nZXRNb2RlbCgpKSxcblx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0RyYWZ0RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9EcmFmdERvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXHRcdG9PcGVyYXRpb24uZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGVkaXQgdGhpcyBkcmFmdCBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQ6IGFueSwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzR3JvdXBJZD86IHN0cmluZykge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblxuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTiwgeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRzR3JvdXBJZCA/IENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHRcdCkgLy8zcmQgcGFyYW1ldGVyPC0tLS0tLVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdC8vaWYgQUNUSVZBVEUgYWN0aW9uIGZhaWxzIHRoZW4gd2UgcmVxdWVzdCBlaXRoZXIgdGhlIHNpZGVFZmZlY3RzIGFnYWluc3QgUFJFUEFSRSBhY3Rpb24gKGlmIGFubm90YXRlZCkgb3IgdGhlIG1lc3NhZ2VzIGFzIGZhbGxiYWNrOlxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKGJIYXNQcmVwYXJlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nUGFyYW1ldGVycyA9IG9TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdFx0XHRhVGFyZ2V0UGF0aHMgPSBvQmluZGluZ1BhcmFtZXRlcnMgJiYgb0JpbmRpbmdQYXJhbWV0ZXJzLnBhdGhFeHByZXNzaW9ucztcblx0XHRcdFx0XHRcdGlmIChhVGFyZ2V0UGF0aHMgJiYgYVRhcmdldFBhdGhzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldFBhdGhzLCBvQ29udGV4dCkuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQsIG9TaWRlRWZmZWN0c1NlcnZpY2UpLmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIEV4ZWN1dGUgYSBwcmVwYXJhdGlvbiBhY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBncm91cElkIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpIHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpO1xuXG5cdFx0Ly8gVE9ETzogc2lkZSBlZmZlY3RzIHF1YWxpZmllciBzaGFsbCBiZSBldmVuIGRlcHJlY2F0ZWQgdG8gYmUgY2hlY2tlZFxuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiU2lkZUVmZmVjdHNRdWFsaWZpZXJcIiwgXCJcIik7XG5cblx0XHRjb25zdCBzR3JvdXBJZCA9IGdyb3VwSWQgfHwgb09wZXJhdGlvbi5nZXRHcm91cElkKCk7XG5cdFx0cmV0dXJuIG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gb09wZXJhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJlcGFyYXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgbWVzc2FnZSBwYXRoIGZvciBhIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgcGF0aCBzaGFsbCBiZSBkZXRlcm1pbmVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBNZXNzYWdlIHBhdGgsIGVtcHR5IGlmIG5vdCBhbm5vdGF0ZWRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoXCIpO1xufVxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgbWVzc2FnZXMgc2hhbGwgYmUgcmVxdWVzdGVkXG4gKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzU2VydmljZSBTZXJ2aWNlIGZvciB0aGUgU2lkZUVmZmVjdHMgb24gU0FQIEZpb3JpIGVsZW1lbnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dDogYW55LCBvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UpIHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dCk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICRQcm9wZXJ0eVBhdGg6IHNNZXNzYWdlc1BhdGggfV0gYXMgYW55LCBvQ29udGV4dCk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZGlzY2FyZCBvZiBhIGRyYWZ0IGZ1bmN0aW9uIHVzaW5nIEhUVFAgUE9TVC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtib29sZWFufSBiRW5hYmxlU3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24ob0NvbnRleHQ6IGFueSwgYkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvRGlzY2FyZE9wZXJhdGlvbiA9IGRyYWZ0LmNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKTtcblx0XHQvLyBhcyB0aGUgZGlzY2FyZCBhY3Rpb24gZG9lc250JyBzZW5kIHRoZSBhY3RpdmUgdmVyc2lvbiBpbiB0aGUgcmVzcG9uc2Ugd2UgZG8gbm90IHVzZSB0aGUgcmVwbGFjZSBpbiBjYWNoZVxuXHRcdGNvbnN0IG9EaXNjYXJkUHJvbWlzZSA9ICFiRW5hYmxlU3RyaWN0SGFuZGxpbmdcblx0XHRcdD8gb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdDogb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSksXG5cdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdCAgKTtcblx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRyZXR1cm4gb0Rpc2NhcmRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRoc1xuICogYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSB7b2JqZWN0fSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIHtQcm9taXNlfSByZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHRcbik6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkPiB7XG5cdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdExvZy5lcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0fVxuXG5cdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdHRyeSB7XG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMS4gRmluZCBhbGwgc2VnbWVudHMgYmV0d2VlbiB0aGUgcm9vdCBvYmplY3QgYW5kIHRoZSBzdWItb2JqZWN0XG5cdFx0Ly8gRXhhbXBsZTogZm9yIHJvb3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikgYW5kIHJpZ2h0TW9zdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKVxuXHRcdC8vIC0tLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cblx0XHQvLyBGaW5kIGFsbCBzZWdtZW50cyBpbiB0aGUgcmlnaHRtb3N0IHBhdGhcblx0XHRjb25zdCBhZGRpdGlvbmFsUGF0aCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5yZXBsYWNlKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCksIFwiXCIpO1xuXHRcdGNvbnN0IHNlZ21lbnRzID0gYWRkaXRpb25hbFBhdGggPyBhZGRpdGlvbmFsUGF0aC5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpIDogW107XG5cdFx0Ly8gRmlyc3Qgc2VnbWVudCBpcyBhbHdheXMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcm9vdCBvYmplY3QsIHdoaWNoIGNhbiBjb250YWluICcvJyBpbiBjYXNlIG9mIGEgcGFyYW1ldHJpemVkIGVudGl0eVxuXHRcdHNlZ21lbnRzLnVuc2hpZnQocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMi4gUmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgb2YgdGhlIHNpYmxpbmcgZW50aXR5IGZvciBlYWggc2VnbWVudFxuXHRcdC8vIEV4YW1wbGU6IGZvciBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblx0XHQvLyAtLT4gcmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgZm9yIFwiUGFyYW0oYWEpL0VudGl0eShiYikvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKS9TaWJsaW5nRW50aXR5XCJcblx0XHRjb25zdCBvbGRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBuZXdQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgY3VycmVudFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhQcm9taXNlcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuXHRcdFx0Y3VycmVudFBhdGggKz0gYC8ke3NlZ21lbnR9YDtcblx0XHRcdG9sZFBhdGhzLnVuc2hpZnQoY3VycmVudFBhdGgpO1xuXHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChjdXJyZW50UGF0aCArIFwiL1NpYmxpbmdFbnRpdHlcIikuZ2V0Qm91bmRDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdHJldHVybiBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMy4gUmVjb25zdHJ1Y3QgdGhlIGZ1bGwgcGF0aHMgZnJvbSBjYW5vbmljYWwgcGF0aHMgKGZvciBwYXRoIG1hcHBpbmcpXG5cdFx0Ly8gRXhhbXBsZTogZm9yIGNhbm9uaWNhbCBwYXRocyBcIi9QYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiL0VudGl0eTIoY2Mtc2libGluZylcIiwgXCIvRW50aXR5MyhkZC1zaWJsaW5nKVwiXG5cdFx0Ly8gLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZykvX1N1Yk5hdihkZC1zaWJsaW5nKVwiXVxuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhzID0gKGF3YWl0IFByb21pc2UuYWxsKGNhbm9uaWNhbFBhdGhQcm9taXNlcykpIGFzIHN0cmluZ1tdO1xuXHRcdGxldCBzaWJsaW5nUGF0aCA9IFwiXCI7XG5cdFx0Y2Fub25pY2FsUGF0aHMuZm9yRWFjaCgoY2Fub25pY2FsUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uID0gc2VnbWVudHNbaW5kZXhdLnJlcGxhY2UoL1xcKC4qJC8sIFwiXCIpOyAvLyBLZWVwIG9ubHkgbmF2aWdhdGlvbiBuYW1lIGZyb20gdGhlIHNlZ21lbnQsIGkuZS4gYWFhKHh4eCkgLS0+IGFhYVxuXHRcdFx0XHRjb25zdCBrZXlzID0gY2Fub25pY2FsUGF0aC5yZXBsYWNlKC8uKlxcKC8sIFwiKFwiKTsgLy8gS2VlcCBvbmx5IHRoZSBrZXlzIGZtcm8gdGhlIGNhbm9uaWNhbCBwYXRoLCBpLmUuIGFhYSh4eHgpIC0tPiAoeHh4KVxuXHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7bmF2aWdhdGlvbn0ke2tleXN9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNpYmxpbmdQYXRoID0gY2Fub25pY2FsUGF0aDsgLy8gVG8gbWFuYWdlIHBhcmFtZXRyaXplZCBlbnRpdGllc1xuXHRcdFx0fVxuXHRcdFx0bmV3UGF0aHMudW5zaGlmdChzaWJsaW5nUGF0aCk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWwuYmluZENvbnRleHQoc2libGluZ1BhdGgpLmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQsIC8vIENyZWF0ZSB0aGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dCBmcm9tIGl0cyBwYXRoXG5cdFx0XHRwYXRoTWFwcGluZzogb2xkUGF0aHMubWFwKChvbGRQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZFBhdGgsXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3UGF0aHNbaW5kZXhdXG5cdFx0XHRcdH07XG5cdFx0XHR9KVxuXHRcdH07XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gQSBjYW5vbmljYWwgcGF0aCBjb3VsZG4ndCBiZSByZXNvbHZlZCAoYmVjYXVzZSBhIHNpYmxpbmcgZG9lc24ndCBleGlzdClcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZyb20gYW4gZXhpc3RpbmcgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0I2NyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge0FwcENvbXBvbmVudH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLm9WaWV3XSBUaGUgdmlld1xuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlByZXNlcnZlQ2hhbmdlc10gUHJlc2VydmUgY2hhbmdlcyBvZiBhbiBleGlzdGluZyBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnR9IFttUGFyYW1ldGVycy5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5hZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRyYWZ0IGRvY3VtZW50IHdhcyBjcmVhdGVkXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLndoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkfSBbbVBhcmFtZXRlcnMuZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZF0gQ2FsbGJhY2sgZm9yIGRlY2lkaW5nIG9uIG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgY2hhbmdlIGJ5IGFub3RoZXIgdXNlclxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBhbnksXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHtcblx0XHRvVmlldzogVmlldztcblx0XHRiUHJlc2VydmVDaGFuZ2VzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHRmbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50PzogYW55O1xuXHRcdGZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkPzogYW55O1xuXHR9XG4pIHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge30sXG5cdFx0bG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSxcblx0XHRiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyA9XG5cdFx0XHR0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwidW5kZWZpbmVkXCIgfHwgKHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJib29sZWFuXCIgJiYgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMpOyAvL2RlZmF1bHQgdHJ1ZVxuXG5cdC8qKlxuXHQgKiBPdmVyd3JpdGUgb3IgcmVqZWN0IGJhc2VkIG9uIGZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYk92ZXJ3cml0ZSBPdmVyd3JpdGUgdGhlIGNoYW5nZSBvciBub3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRmdW5jdGlvbiBvdmVyd3JpdGVPbkRlbWFuZChiT3ZlcndyaXRlOiBhbnkpIHtcblx0XHRpZiAoYk92ZXJ3cml0ZSkge1xuXHRcdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpICsgXCIvRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIikuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRsZXQgb1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZTtcblxuXHRcdFx0cmV0dXJuICgobVBhcmFtZXRlcnMub1ZpZXcuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoX29SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gX29SZXNvdXJjZUJ1bmRsZTtcblx0XHRcdFx0XHRyZXR1cm4gZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChkcmFmdEFkbWluRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9MT0NLRURfQllfVVNFUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRzSW5mbyxcblx0XHRcdFx0XHRcdFx0XHRzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNVbnNhdmVkQ2hhbmdlc01zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdH1cblxuXHRmdW5jdGlvbiBzaG93TWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2c6IGFueSkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHR0aXRsZTogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX1dBUk5JTkdcIiksXG5cdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoXCJEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSksXG5cdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHR9XG5cblx0Y29uc3QgYkV4ZWN1dGUgPSBtUGFyYW0uZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuXHRcdD8gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KVxuXHRcdDogdHJ1ZTtcblxuXHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiRHJhZnQgY3JlYXRpb24gd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHR9XG5cdGxldCBvcGVuaW5nU2libGluZ0NvbnRleHQgPSBmYWxzZTtcblx0dHJ5IHtcblx0XHRsZXQgb0RyYWZ0Q29udGV4dDogQ29udGV4dCB8IG51bGwgPSBudWxsO1xuXHRcdHRyeSB7XG5cdFx0XHRvRHJhZnRDb250ZXh0ID0gYXdhaXQgZHJhZnQuZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cpO1xuXHRcdH0gY2F0Y2ggKG9SZXNwb25zZTogYW55KSB7XG5cdFx0XHQvL09ubHkgY2FsbCBiYWNrIGlmIGVycm9yIDQwOVxuXHRcdFx0aWYgKGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ICYmIG9SZXNwb25zZS5zdGF0dXMgPT09IDQwOSkge1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0aWYgKEFjdGl2aXR5U3luYy5pc0NvbGxhYm9yYXRpb25FbmFibGVkKG1QYXJhbWV0ZXJzLm9WaWV3KSkge1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9yb3V0aW5nLl9jcmVhdGVCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVPbkRlbWFuZChcblx0XHRcdFx0XHRcdG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkID8gbVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQoKSA6IHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoIShvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvcGVuaW5nU2libGluZ0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdH1cblxuXHRcdG9EcmFmdENvbnRleHQgPVxuXHRcdFx0b0RyYWZ0Q29udGV4dCAmJiBtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG5cdFx0XHRcdD8gbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgb0RyYWZ0Q29udGV4dClcblx0XHRcdFx0OiBvRHJhZnRDb250ZXh0O1xuXG5cdFx0aWYgKG9EcmFmdENvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCk7XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0KTtcblxuXHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAoZXhjOiBhbnkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNhY3RpdmF0ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IGFueTsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBhbnkgfVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWUpXG5cdFx0LnRoZW4oZnVuY3Rpb24gKGJFeGVjdXRlOiBhbnkpIHtcblx0XHRcdGlmICghYkV4ZWN1dGUpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBhY3RpdmF0aW9uIHJlcXVpcmVzIHByZXBhcmF0aW9uICovXG5cdFx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiZHJhZnRcIjtcblx0XHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0XHRjb25zdCBvUHJlcGFyZVByb21pc2UgPSBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXApO1xuXHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cblx0XHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlczogW2FueSwgYW55XSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZXNbMV07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHRcdFx0fSk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbiAob0FjdGl2ZURvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdH0pO1xufVxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgZm9yIERyYWZ0KHdoZW4gbm8gRHJhZnRBY3Rpb24pXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIHVzZXMgREVMRVRFIGFsd2F5cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjZGVsZXRlRHJhZnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge1Byb21pc2V9XG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZGVsZXRlRHJhZnQob0NvbnRleHQ6IGFueSwgYkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBzRGlzY2FyZEFjdGlvbiA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKSxcblx0XHRiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblxuXHRpZiAoYklzQWN0aXZlRW50aXR5IHx8ICghYklzQWN0aXZlRW50aXR5ICYmICFzRGlzY2FyZEFjdGlvbikpIHtcblx0XHQvL1VzZSBEZWxldGUgaW4gY2FzZSBvZiBhY3RpdmUgZW50aXR5IGFuZCBubyBkaXNjYXJkIGFjdGlvbiBhdmFpbGFibGUgZm9yIGRyYWZ0XG5cdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdHJldHVybiBvQ29udGV4dFxuXHRcdFx0XHQuZ2V0QmluZGluZygpXG5cdFx0XHRcdC5yZXNldENoYW5nZXMoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dCwgYkVuYWJsZVN0cmljdEhhbmRsaW5nKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGVcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBhbnksXG5cdGZuQ2FuY2VsRnVuY3Rpb246IGFueSxcblx0b0NvbnRleHQ6IGFueSxcblx0b0NvbnRyb2xsZXI6IGFueSxcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cbikge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3Qob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0XHRcdFx0Zm5Qcm9jZXNzRnVuY3Rpb24uYXBwbHkobnVsbCwgLi4uYXJncyk7XG5cdFx0ICB9O1xuXG5cdGlmIChcblx0XHRvQ29udGV4dCAmJlxuXHRcdG9Db250ZXh0LmdldE9iamVjdCgpICYmXG5cdFx0KCFvQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB8fCBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSlcblx0KSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHRkcmFmdERhdGFDb250ZXh0XG5cdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0XHRcdFx0XHRcdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdFx0XHRcdFx0XHQvLyBmb3IgRkNMLlxuXHRcdFx0XHRcdFx0aWYgKCEoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSkge1xuXHRcdFx0XHRcdFx0XHREYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlci5wZXJmb3JtQWZ0ZXJEaXNjYXJkb3JLZWVwRHJhZnQoXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhlcmUgaXMgbm8gYWN0aXZlIGVudGl0eSBzbyB3ZSBhcmUgZWRpdGluZyBlaXRoZXIgbmV3bHkgY3JlYXRlZCBkYXRhIG9yXG5cdFx0XHRcdFx0XHRcdC8vIGEgZHJhZnQgd2hpY2ggaGFzIG5ldmVyIGJlZW4gc2F2ZWQgdG8gYWN0aXZlIHZlcnNpb25cblx0XHRcdFx0XHRcdFx0Ly8gU2luY2Ugd2Ugd2FudCB0byByZWFjdCBkaWZmZXJlbnRseSBpbiB0aGUgdHdvIHNpdHVhdGlvbnMsIHdlIGhhdmUgdG8gY2hlY2sgdGhlXG5cdFx0XHRcdFx0XHRcdC8vIGRpcnR5IHN0YXRlXG5cdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlIGRhdGEgaXMgYmVpbmcgbmV3bHkgY3JlYXRlZCBhbmQgdGhlbiB3ZSBhbHdheXMgd2FudCB0b1xuXHRcdFx0XHRcdFx0XHRcdC8vIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBvbiBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0XHRcdFx0RGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIucGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0KFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgYXJlIGVkaXRpbmcgYSBkcmFmdCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eVxuXHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgZXF1YWwsIHNvIHRoaXMgZHJhZnQgd2FzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gbmV2ZXIgc2F2ZWQgYmVmb3JlLCBoZW5jZSB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZyBhIG5ld2x5IGNyZWF0ZWQgZHJhZnQgZm9yXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQWxzbyB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0XHRcdFx0XHRcdFx0XHQvLyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRlbGV0ZSB0aGUgZHJhZnQgaW4gY2FzZSBvZiBhIGJhY2tcblx0XHRcdFx0XHRcdFx0XHQvLyBuYXZpZ2F0aW9uIGJ1dCBpbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gc2lsZW50bHkga2VlcCBpdCFcblx0XHRcdFx0XHRcdFx0XHRpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgYW5kIG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIG9yIG5vdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBzbyB3ZSB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYW5kIGxldCB0aGUgdXNlciBkZWNpZGVcblx0XHRcdFx0XHRcdFx0XHRcdERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdChcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgdXNlciBzdGFydGVkIGVkaXRpbmcgdGhlIGV4aXN0aW5nIGRyYWZ0IGJ1dCBkaWQgbm90IG1ha2UgYW55IGNoYW5nZXNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiwgc28gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgZHJhZnREYXRhQ29udGV4dCBpbmZvcm1hdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnQgPSB7XG5cdGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50OiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCxcblx0YWN0aXZhdGVEb2N1bWVudDogYWN0aXZhdGVEb2N1bWVudCxcblx0ZGVsZXRlRHJhZnQ6IGRlbGV0ZURyYWZ0LFxuXHRleGVjdXRlRHJhZnRFZGl0QWN0aW9uOiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uLFxuXHRjb21wdXRlU2libGluZ0luZm9ybWF0aW9uOiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uLFxuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdGNyZWF0ZU9wZXJhdGlvbjogY3JlYXRlT3BlcmF0aW9uLFxuXHRleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uOiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl19
|
|
818
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiYWN0aXZhdGVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwibWVzc2FnZUhhbmRsZXIiLCJiRXhlY3V0ZSIsIm1QYXJhbSIsImZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50Iiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsIkVycm9yIiwiZ2V0UGF0aCIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwic0JhdGNoR3JvdXAiLCJvUHJlcGFyZVByb21pc2UiLCJkcmFmdCIsImV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIiwiZ2V0TW9kZWwiLCJzdWJtaXRCYXRjaCIsIm9BY3RpdmF0ZVByb21pc2UiLCJQcm9taXNlIiwiYWxsIiwidmFsdWVzIiwiZXJyIiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VQYXRoIiwicmVxdWVzdE9iamVjdCIsImRhdGEiLCJsZW5ndGgiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm92ZXJ3cml0ZU9uRGVtYW5kIiwiYk92ZXJ3cml0ZSIsIm9Nb2RlbCIsImRyYWZ0RGF0YUNvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm9WaWV3IiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJkcmFmdEFkbWluRGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJzSW5mbyIsIkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIiwiSW5Qcm9jZXNzQnlVc2VyIiwic0VudGl0eVNldCIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwic0xvY2tlZEJ5VXNlck1zZyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJNZXNzYWdlQm94IiwiZXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwicmVzb2x2ZSIsInJlamVjdCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsImxvY2FsSTE4blJlZiIsImdldFRleHQiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJvcGVuIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93IiwiYlByZXNlcnZlQ2hhbmdlcyIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsIm9SZXNwb25zZSIsInN0YXR1cyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiQWN0aXZpdHlTeW5jIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzaWJsaW5nSW5mbyIsInNpYmxpbmdDb250ZXh0IiwiZ2V0Q29udHJvbGxlciIsIl9yb3V0aW5nIiwiX2NyZWF0ZUJpbmRpbmdDb250ZXh0IiwidGFyZ2V0Q29udGV4dCIsImZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQiLCJjYW5jZWxlZCIsImV4YyIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0Iiwic3RhcnRzV2l0aCIsIkxvZyIsIm1vZGVsIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJjYW5vbmljYWxQYXRoUHJvbWlzZXMiLCJtYXAiLCJzZWdtZW50IiwiZW5kc1dpdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsInVuZGVmaW5lZCIsImNhbm9uaWNhbFBhdGhzIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwiZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbiIsImJFbmFibGVTdHJpY3RIYW5kbGluZyIsImdldFByb3BlcnR5Iiwic0dyb3VwSWQiLCJzQWN0aW9uTmFtZSIsIm9EaXNjYXJkUHJvbWlzZSIsIm9EaXNjYXJkT3BlcmF0aW9uIiwiZXhlY3V0ZSIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsImJpbmQiLCJsYWJlbCIsImNyZWF0ZU9wZXJhdGlvbiIsIkRJU0NBUkQiLCJiSGFzUHJlcGFyZUFjdGlvbiIsImJJZ25vcmVFdGFnIiwib09wZXJhdGlvbiIsIkFDVElWQVRJT04iLCIkJGluaGVyaXRFeHBhbmRTZWxlY3QiLCJnZXRCaW5kaW5nIiwiaXNBIiwiYWN0aW9uTmFtZSIsIlBSRVBBUkUiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwib0JpbmRpbmdQYXJhbWV0ZXJzIiwiYVRhcmdldFBhdGhzIiwicGF0aEV4cHJlc3Npb25zIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwib0Vycm9yIiwicmVxdWVzdE1lc3NhZ2VzIiwib09wdGlvbnMiLCJzZXRQYXJhbWV0ZXIiLCJvRWRpdFByb21pc2UiLCJzT3BlcmF0aW9uIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRPYmplY3QiLCJzT3BlcmF0aW9uTmFtZSIsImdldFJldHVyblR5cGUiLCJzQ29udGV4dFBhdGgiLCJvUmV0dXJuVHlwZSIsImdyb3VwSWQiLCJiTWVzc2FnZXMiLCIkc2VsZWN0IiwiZ2V0R3JvdXBJZCIsImNhdGNoIiwiZ2V0TWVzc2FnZXNQYXRoIiwiJFByb3BlcnR5UGF0aCIsImRlbGV0ZURyYWZ0Iiwic0Rpc2NhcmRBY3Rpb24iLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiZGVsZXRlIiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uVHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgdHlwZSB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCwgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgZHJhZnREYXRhTG9zc1BvcHVwIGZyb20gXCIuL2RyYWZ0RGF0YUxvc3NQb3B1cFwiO1xuXG5leHBvcnQgdHlwZSBTaWJsaW5nSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldENvbnRleHQ6IFY0Q29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNhbGxiYWNrcyB1c2VkIGluIHRoZSBmdW5jdGlvbnNcbiAqXG4gKlxuICogQGF1dGhvciBTQVAgU0VcbiAqIEBzaW5jZSAxLjU0LjBcbiAqIEBpbnRlcmZhY2VcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3QgdGhlIGNyZWF0aW9uIG9mIGEgZHJhZnRcbiAqXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5iZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCBvZiBkcmFmdCBjcmVhdGlvbiBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayBhZnRlciBhIGRyYWZ0IHdhcyBzdWNjZXNzdWxseSBjcmVhdGVkXG4gKlxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGFwcHJvdmUgb3IgcmVqZWN0IG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKlxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2sud2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRcbiAqIEBmdW5jdGlvblxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgdG8gb3ZlcndyaXRlIHVuc2F2ZWQgZHJhZnQgW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIGZvciB0aGUgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41NC4wXG4gKi9cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGFjdGlvbiBuYW1lIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IFY0Q29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKSB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvJHtzT3BlcmF0aW9ufWApO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gKGFjdGlvbiBvciBmdW5jdGlvbiBpbXBvcnQpXG4gKiBAcGFyYW0gb09wdGlvbnMgT3B0aW9ucyB0byBjcmVhdGUgdGhlIG9wZXJhdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgY29udGV4dCBiaW5kaW5nIG9mIHRoZSBib3VuZCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0OiBWNENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBhbnkpIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHtzT3BlcmF0aW9uTmFtZX0oLi4uKWAsIG9Db250ZXh0LCBvT3B0aW9ucyk7XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIHJldHVybiB0eXBlIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRSZXR1cm5UeXBlKG9Db250ZXh0OiBWNENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZykge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn0vJFJldHVyblR5cGVgKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogVjRDb250ZXh0KSB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSAoaHR0cCBzdGF0dXMgNDA5KSBpcyBzZW5kIGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHBhcmFtIG9WaWV3IElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlclxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dDogVjRDb250ZXh0LCBiUHJlc2VydmVDaGFuZ2VzOiBib29sZWFuLCBvVmlldzogYW55KTogUHJvbWlzZTxWNENvbnRleHQ+IHtcblx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3B0aW9ucyA9IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH07XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQsIG9PcHRpb25zKTtcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlByZXNlcnZlQ2hhbmdlc1wiLCBiUHJlc2VydmVDaGFuZ2VzKTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiZGlyZWN0XCI7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gYXdhaXQgKChvVmlldy5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0Ly9JZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCB7IGxhYmVsOiBzQWN0aW9uTmFtZSwgbW9kZWw6IG9Db250ZXh0LmdldE1vZGVsKCkgfSwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdCk7XG5cdFx0b09wZXJhdGlvbi5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRyZXR1cm4gYXdhaXQgb0VkaXRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIllvdSBjYW5ub3QgZWRpdCB0aGlzIGRyYWZ0IGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogQWN0aXZhdGVzIGEgZHJhZnQgZG9jdW1lbnQuIFRoZSBkcmFmdCB3aWxsIHJlcGxhY2UgdGhlIHNpYmxpbmcgZW50aXR5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhlIGJhY2sgZW5kLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQ6IFY0Q29udGV4dCwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzR3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8VjRDb250ZXh0PiB7XG5cdGNvbnN0IGJIYXNQcmVwYXJlQWN0aW9uID0gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCk7XG5cblx0Ly8gQWNjb3JkaW5nIHRvIHRoZSBkcmFmdCBzcGVjIGlmIHRoZSBzZXJ2aWNlIGNvbnRhaW5zIGEgcHJlcGFyZSBhY3Rpb24gYW5kIHdlIHRyaWdnZXIgYm90aCBwcmVwYXJlIGFuZFxuXHQvLyBhY3RpdmF0ZSBpbiBvbmUgJGJhdGNoIHRoZSBhY3RpdmF0ZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGggaUYtTWF0Y2g9KlxuXHRjb25zdCBiSWdub3JlRXRhZyA9IGJIYXNQcmVwYXJlQWN0aW9uO1xuXG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5BQ1RJVkFUSU9OLCB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9KTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBhd2FpdCAoKG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIGFueSk7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfT1BfT0JKRUNUX1BBR0VfU0FWRVwiLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gYXdhaXQgb09wZXJhdGlvbi5leGVjdXRlKFxuXHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0Yklnbm9yZUV0YWcsXG5cdFx0XHRcdHNHcm91cElkXG5cdFx0XHRcdFx0PyBDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChcblx0XHRcdFx0XHRcdFx0ZHJhZnQsXG5cdFx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzQWN0aW9uTmFtZSwgbW9kZWw6IG9Db250ZXh0LmdldE1vZGVsKCkgfSxcblx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoYkhhc1ByZXBhcmVBY3Rpb24pIHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSxcblx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdGFUYXJnZXRQYXRocyA9IG9CaW5kaW5nUGFyYW1ldGVycyAmJiBvQmluZGluZ1BhcmFtZXRlcnMucGF0aEV4cHJlc3Npb25zO1xuXHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIG1lc3NhZ2UgcHJvcGVydHkgcGF0aCBpcyBkZWZpbmVkIGZvciBhIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBQYXRoIHRvIHRoZSBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VQYXRoKG9Db250ZXh0OiBWNENvbnRleHQpOiBzdHJpbmcgfCBudWxsIHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0Y29uc3Qgb1JldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG5cdC8vIElmIHRoZXJlIGlzIG5vIHJldHVybiBwYXJhbWV0ZXIsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXF1ZXN0IE1lc3NhZ2VzLlxuXHQvLyBSQVAgZHJhZnQgcHJlcGFyZSBoYXMgbm8gcmV0dXJuIHBhcmFtZXRlclxuXHRyZXR1cm4gISFvUmV0dXJuVHlwZSA/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLk1lc3NhZ2VzfS8kUGF0aGApIDogbnVsbDtcbn1cblxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGdyb3VwSWQgVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gYk1lc3NhZ2VzIElmIHNldCB0byB0cnVlLCB0aGUgUFJFUEFSRSBhY3Rpb24gcmV0cmlldmVzIFNBUF9NZXNzYWdlc1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQ6IFY0Q29udGV4dCwgZ3JvdXBJZD86IHN0cmluZywgYk1lc3NhZ2VzPzogYm9vbGVhbikge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gYk1lc3NhZ2VzID8gZ2V0TWVzc2FnZVBhdGgob0NvbnRleHQpIDogbnVsbDtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSwgc01lc3NhZ2VzUGF0aCA/IHsgJHNlbGVjdDogc01lc3NhZ2VzUGF0aCB9IDogbnVsbCk7XG5cblx0XHQvLyBUT0RPOiBzaWRlIGVmZmVjdHMgcXVhbGlmaWVyIHNoYWxsIGJlIGV2ZW4gZGVwcmVjYXRlZCB0byBiZSBjaGVja2VkXG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJTaWRlRWZmZWN0c1F1YWxpZmllclwiLCBcIlwiKTtcblxuXHRcdGNvbnN0IHNHcm91cElkID0gZ3JvdXBJZCB8fCBvT3BlcmF0aW9uLmdldEdyb3VwSWQoKTtcblx0XHRyZXR1cm4gb09wZXJhdGlvblxuXHRcdFx0LmV4ZWN1dGUoc0dyb3VwSWQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBvT3BlcmF0aW9uO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25cIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBwcmVwYXJhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBtZXNzYWdlIHBhdGggZm9yIGEgY29udGV4dC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgcGF0aCBzaGFsbCBiZSBkZXRlcm1pbmVkXG4gKiBAcmV0dXJucyBNZXNzYWdlIHBhdGgsIGVtcHR5IGlmIG5vdCBhbm5vdGF0ZWRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0OiBWNENvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xufVxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dDogVjRDb250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UpIHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dCk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICRQcm9wZXJ0eVBhdGg6IHNNZXNzYWdlc1BhdGggfV0gYXMgYW55LCBvQ29udGV4dCk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBkaXNjYXJkIG9mIGEgZHJhZnQgZnVuY3Rpb24gdXNpbmcgSFRUUCBQb3N0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQXBwIENvbXBvbmVudFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dDogVjRDb250ZXh0LCBvQXBwQ29tcG9uZW50PzogYW55LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9EaXNjYXJkT3BlcmF0aW9uID0gZHJhZnQuY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID1cblx0XHRcdChvQXBwQ29tcG9uZW50ICYmXG5cdFx0XHRcdChhd2FpdCAoKG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KSkpIHx8XG5cdFx0XHRudWxsO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIiwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHQvLyBhcyB0aGUgZGlzY2FyZCBhY3Rpb24gZG9lc250JyBzZW5kIHRoZSBhY3RpdmUgdmVyc2lvbiBpbiB0aGUgcmVzcG9uc2Ugd2UgZG8gbm90IHVzZSB0aGUgcmVwbGFjZSBpbiBjYWNoZVxuXHRcdGNvbnN0IG9EaXNjYXJkUHJvbWlzZSA9ICFiRW5hYmxlU3RyaWN0SGFuZGxpbmdcblx0XHRcdD8gb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdDogb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoXG5cdFx0XHRcdFx0XHRkcmFmdCxcblx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0eyBsYWJlbDogc0FjdGlvbk5hbWUsIG1vZGVsOiBvQ29udGV4dC5nZXRNb2RlbCgpIH0sXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHQgICk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9EaXNjYXJkUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBUaGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRyb290Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dFxuKTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHR9XG5cblx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0dHJ5IHtcblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAxLiBGaW5kIGFsbCBzZWdtZW50cyBiZXR3ZWVuIHRoZSByb290IG9iamVjdCBhbmQgdGhlIHN1Yi1vYmplY3Rcblx0XHQvLyBFeGFtcGxlOiBmb3Igcm9vdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKSBhbmQgcmlnaHRNb3N0ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpXG5cdFx0Ly8gLS0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblxuXHRcdC8vIEZpbmQgYWxsIHNlZ21lbnRzIGluIHRoZSByaWdodG1vc3QgcGF0aFxuXHRcdGNvbnN0IGFkZGl0aW9uYWxQYXRoID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2Uocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSwgXCJcIik7XG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBhZGRpdGlvbmFsUGF0aCA/IGFkZGl0aW9uYWxQYXRoLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIikgOiBbXTtcblx0XHQvLyBGaXJzdCBzZWdtZW50IGlzIGFsd2F5cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSByb290IG9iamVjdCwgd2hpY2ggY2FuIGNvbnRhaW4gJy8nIGluIGNhc2Ugb2YgYSBwYXJhbWV0cml6ZWQgZW50aXR5XG5cdFx0c2VnbWVudHMudW5zaGlmdChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAyLiBSZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBvZiB0aGUgc2libGluZyBlbnRpdHkgZm9yIGVhY2ggc2VnbWVudFxuXHRcdC8vIEV4YW1wbGU6IGZvciBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblx0XHQvLyAtLT4gcmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgZm9yIFwiUGFyYW0oYWEpL0VudGl0eShiYikvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKS9TaWJsaW5nRW50aXR5XCJcblx0XHRjb25zdCBvbGRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBuZXdQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgY3VycmVudFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhQcm9taXNlcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuXHRcdFx0Y3VycmVudFBhdGggKz0gYC8ke3NlZ21lbnR9YDtcblx0XHRcdG9sZFBhdGhzLnVuc2hpZnQoY3VycmVudFBhdGgpO1xuXHRcdFx0aWYgKGN1cnJlbnRQYXRoLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGAke2N1cnJlbnRQYXRofS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdHJldHVybiBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpOyAvLyAxLTEgcmVsYXRpb25cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDMuIFJlY29uc3RydWN0IHRoZSBmdWxsIHBhdGhzIGZyb20gY2Fub25pY2FsIHBhdGhzIChmb3IgcGF0aCBtYXBwaW5nKVxuXHRcdC8vIEV4YW1wbGU6IGZvciBjYW5vbmljYWwgcGF0aHMgXCIvUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIi9FbnRpdHkyKGNjLXNpYmxpbmcpXCIsIFwiL0VudGl0eTMoZGQtc2libGluZylcIlxuXHRcdC8vIC0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpL19TdWJOYXYoZGQtc2libGluZylcIl1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRocyA9IChhd2FpdCBQcm9taXNlLmFsbChjYW5vbmljYWxQYXRoUHJvbWlzZXMpKSBhcyBzdHJpbmdbXTtcblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0aWYgKHNlZ21lbnRzW2luZGV4XS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uID0gc2VnbWVudHNbaW5kZXhdLnJlcGxhY2UoL1xcKC4qJC8sIFwiXCIpOyAvLyBLZWVwIG9ubHkgbmF2aWdhdGlvbiBuYW1lIGZyb20gdGhlIHNlZ21lbnQsIGkuZS4gYWFhKHh4eCkgLS0+IGFhYVxuXHRcdFx0XHRcdGNvbnN0IGtleXMgPSBjYW5vbmljYWxQYXRoLnJlcGxhY2UoLy4qXFwoLywgXCIoXCIpOyAvLyBLZWVwIG9ubHkgdGhlIGtleXMgZnJvbSB0aGUgY2Fub25pY2FsIHBhdGgsIGkuZS4gYWFhKHh4eCkgLS0+ICh4eHgpXG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke3NlZ21lbnRzW2luZGV4XX1gOyAvLyAxLTEgcmVsYXRpb25cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2libGluZ1BhdGggPSBjYW5vbmljYWxQYXRoOyAvLyBUbyBtYW5hZ2UgcGFyYW1ldHJpemVkIGVudGl0aWVzXG5cdFx0XHR9XG5cdFx0XHRuZXdQYXRocy51bnNoaWZ0KHNpYmxpbmdQYXRoKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChzaWJsaW5nUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCksIC8vIENyZWF0ZSB0aGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dCBmcm9tIGl0cyBwYXRoXG5cdFx0XHRwYXRoTWFwcGluZzogb2xkUGF0aHMubWFwKChvbGRQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZFBhdGgsXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3UGF0aHNbaW5kZXhdXG5cdFx0XHRcdH07XG5cdFx0XHR9KVxuXHRcdH07XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gQSBjYW5vbmljYWwgcGF0aCBjb3VsZG4ndCBiZSByZXNvbHZlZCAoYmVjYXVzZSBhIHNpYmxpbmcgZG9lc24ndCBleGlzdClcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZyb20gYW4gZXhpc3RpbmcgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0I2NyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm9WaWV3XSBUaGUgdmlld1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5iUHJlc2VydmVDaGFuZ2VzXSBQcmVzZXJ2ZSBjaGFuZ2VzIG9mIGFuIGV4aXN0aW5nIGRyYWZ0IG9mIGFub3RoZXIgdXNlclxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRdIENhbGxiYWNrIGZvciBwb3N0cHJvY2Vzc2lvbmcgYWZ0ZXIgZHJhZnQgZG9jdW1lbnQgd2FzIGNyZWF0ZWRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZF0gQ2FsbGJhY2sgZm9yIGRlY2lkaW5nIG9uIG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgY2hhbmdlIGJ5IGFub3RoZXIgdXNlclxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChcblx0b0NvbnRleHQ6IGFueSxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczoge1xuXHRcdG9WaWV3OiBWaWV3O1xuXHRcdGJQcmVzZXJ2ZUNoYW5nZXM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdGZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ/OiBhbnk7XG5cdFx0Zm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50PzogYW55O1xuXHRcdGZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQ/OiBhbnk7XG5cdH1cbikge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fSxcblx0XHRsb2NhbEkxOG5SZWYgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLFxuXHRcdGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ID1cblx0XHRcdHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAodHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcImJvb2xlYW5cIiAmJiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyk7IC8vZGVmYXVsdCB0cnVlXG5cblx0LyoqXG5cdCAqIE92ZXJ3cml0ZSBvciByZWplY3QgYmFzZWQgb24gZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZC5cblx0ICpcblx0ICogQHBhcmFtIGJPdmVyd3JpdGUgT3ZlcndyaXRlIHRoZSBjaGFuZ2Ugb3Igbm90XG5cdCAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRhc3luYyBmdW5jdGlvbiBvdmVyd3JpdGVPbkRlbWFuZChiT3ZlcndyaXRlOiBib29sZWFuKSB7XG5cdFx0aWYgKGJPdmVyd3JpdGUpIHtcblx0XHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFgKS5nZXRCb3VuZENvbnRleHQoKTtcblxuXHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gYXdhaXQgKG1QYXJhbWV0ZXJzLm9WaWV3LmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdGxldCBzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IChtUGFyYW1ldGVycy5vVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0O1xuXHRcdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0XHRjb25zdCBzTG9ja2VkQnlVc2VyTXNnID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIixcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0luZm8gPSBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlcjtcblx0XHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YXdhaXQgc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnKTtcblx0XHRcdFx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgZmFsc2UsIG1QYXJhbWV0ZXJzLm9WaWV3KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZzogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdHRpdGxlOiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1dBUk5JTkdcIiksXG5cdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXG5cdGNvbnN0IGJFeGVjdXRlID0gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcblx0XHQ/IG1QYXJhbS5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdylcblx0XHQ6IHRydWU7XG5cblx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdH1cblx0bGV0IG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IGZhbHNlO1xuXHR0cnkge1xuXHRcdGxldCBvRHJhZnRDb250ZXh0OiBWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0dHJ5IHtcblx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdywgbVBhcmFtZXRlcnMub1ZpZXcpO1xuXHRcdH0gY2F0Y2ggKG9SZXNwb25zZTogYW55KSB7XG5cdFx0XHQvL09ubHkgY2FsbCBiYWNrIGlmIGVycm9yIDQwOVxuXHRcdFx0aWYgKGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ICYmIG9SZXNwb25zZS5zdGF0dXMgPT09IDQwOSkge1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0aWYgKEFjdGl2aXR5U3luYy5pc0NvbGxhYm9yYXRpb25FbmFibGVkKG1QYXJhbWV0ZXJzLm9WaWV3KSkge1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9yb3V0aW5nLl9jcmVhdGVCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVPbkRlbWFuZChcblx0XHRcdFx0XHRcdG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkID8gbVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQoKSA6IHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCEob1Jlc3BvbnNlICYmIG9SZXNwb25zZS5jYW5jZWxlZCkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKG9SZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvcGVuaW5nU2libGluZ0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdH1cblxuXHRcdG9EcmFmdENvbnRleHQgPVxuXHRcdFx0b0RyYWZ0Q29udGV4dCAmJiBtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG5cdFx0XHRcdD8gbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgb0RyYWZ0Q29udGV4dClcblx0XHRcdFx0OiBvRHJhZnRDb250ZXh0O1xuXG5cdFx0aWYgKG9EcmFmdENvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCk7XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0KTtcblxuXHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAoZXhjOiBhbnkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNhY3RpdmF0ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgYSB2ZXRvIGJlZm9yZSB0aGUgJ0NyZWF0ZScgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW5nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlclxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogVjRDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IGFueTsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBhbnkgfSxcblx0bWVzc2FnZUhhbmRsZXI/OiBNZXNzYWdlSGFuZGxlclxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHR9XG5cblx0Y29uc3QgYkV4ZWN1dGUgPSBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50ID8gYXdhaXQgbVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCkgOiB0cnVlO1xuXHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBBY3RpdmF0aW9uIG9mIHRoZSBkb2N1bWVudCB3YXMgYWJvcnRlZCBieSBleHRlbnNpb24gZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXG5cdGxldCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0OiBhbnk7XG5cdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCk7XG5cdH0gZWxzZSB7XG5cdFx0LyogYWN0aXZhdGlvbiByZXF1aXJlcyBwcmVwYXJhdGlvbiAqL1xuXHRcdGNvbnN0IHNCYXRjaEdyb3VwID0gXCJkcmFmdFwiO1xuXHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0bGV0IG9QcmVwYXJlUHJvbWlzZSA9IGRyYWZ0LmV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKG9Db250ZXh0LCBzQmF0Y2hHcm91cCwgZmFsc2UpO1xuXHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0JhdGNoR3JvdXApO1xuXHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvUHJlcGFyZVByb21pc2UsIG9BY3RpdmF0ZVByb21pc2VdKTtcblx0XHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSB2YWx1ZXNbMV07XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHQvLyBCQ1AgMjI3MDA4NDA3NVxuXHRcdFx0Ly8gaWYgdGhlIEFjdGl2YXRpb24gZmFpbHMsIHRoZW4gdGhlIG1lc3NhZ2VzIGFyZSByZXRyaWV2ZWQgZnJvbSBQUkVQQVJBVElPTiBhY3Rpb25cblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBnZXRNZXNzYWdlUGF0aChvQ29udGV4dCk7XG5cdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRvUHJlcGFyZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXAsIHRydWUpO1xuXHRcdFx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNCYXRjaEdyb3VwKTtcblx0XHRcdFx0YXdhaXQgb1ByZXBhcmVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgb0NvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHRpZiAoZGF0YVtzTWVzc2FnZXNQYXRoXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Ly9pZiBtZXNzYWdlcyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFBSRVBBUkFUSU9OIGFjdGlvbiwgdGhlbiBwcmV2aW91cyB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFyZSByZW1vdmVkXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI/LnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSwgZmFsc2UsIG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudCA/IG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCkgOiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xufVxuXG4vKipcbiAqIEhUVFAgUE9TVCBjYWxsIHdoZW4gRHJhZnRBY3Rpb24gaXMgcHJlc2VudCBmb3IgRHJhZnQgRGVsZXRlOyBIVFRQIERFTEVURSBjYWxsIHdoZW4gdGhlcmUgaXMgbm8gRHJhZnRBY3Rpb25cbiAqIGFuZCBBY3RpdmUgSW5zdGFuY2UgYWx3YXlzIHVzZXMgREVMRVRFLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNkZWxldGVEcmFmdFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGRpc2NhcmRlZFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGRlbGV0ZWRcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBkZWxldGVEcmFmdChvQ29udGV4dDogVjRDb250ZXh0LCBvQXBwQ29tcG9uZW50PzogYW55LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IHNEaXNjYXJkQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpLFxuXHRcdGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5O1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHkgfHwgKCFiSXNBY3RpdmVFbnRpdHkgJiYgIXNEaXNjYXJkQWN0aW9uKSkge1xuXHRcdC8vVXNlIERlbGV0ZSBpbiBjYXNlIG9mIGFjdGl2ZSBlbnRpdHkgYW5kIG5vIGRpc2NhcmQgYWN0aW9uIGF2YWlsYWJsZSBmb3IgZHJhZnRcblx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vVXNlIERpc2NhcmQgUG9zdCBBY3Rpb24gaWYgaXQgaXMgYSBkcmFmdCBlbnRpdHkgYW5kIGRpc2NhcmQgYWN0aW9uIGV4aXN0c1xuXHRcdHJldHVybiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHR9XG59XG5cbmNvbnN0IGRyYWZ0ID0ge1xuXHRjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudDogY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQsXG5cdGFjdGl2YXRlRG9jdW1lbnQ6IGFjdGl2YXRlRG9jdW1lbnQsXG5cdGRlbGV0ZURyYWZ0OiBkZWxldGVEcmFmdCxcblx0ZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbjogZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbixcblx0ZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb246IGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uLFxuXHRleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uOiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uLFxuXHRjb21wdXRlU2libGluZ0luZm9ybWF0aW9uOiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uLFxuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogZHJhZnREYXRhTG9zc1BvcHVwLnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGRyYWZ0RGF0YUxvc3NQb3B1cC5zaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdGNyZWF0ZU9wZXJhdGlvbjogY3JlYXRlT3BlcmF0aW9uLFxuXHRleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uOiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogZHJhZnREYXRhTG9zc1BvcHVwLk5hdmlnYXRpb25UeXBlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkcmFmdDtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQWtqQk8sZ0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7SUFDckMsSUFBSTtNQUNILElBQUlDLE1BQU0sR0FBR0YsSUFBSSxFQUFqQjtJQUNBLENBRkQsQ0FFRSxPQUFNRyxDQUFOLEVBQVM7TUFDVixPQUFPRixPQUFPLENBQUNFLENBQUQsQ0FBZDtJQUNBOztJQUNELElBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFyQixFQUEyQjtNQUMxQixPQUFPRixNQUFNLENBQUNFLElBQVAsQ0FBWSxLQUFLLENBQWpCLEVBQW9CSCxPQUFwQixDQUFQO0lBQ0E7O0lBQ0QsT0FBT0MsTUFBUDtFQUNB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
|