@sapui5/sap.fe.core 1.108.2 → 1.110.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/README.md +5 -1
- package/package.json +11 -9
- package/src/.eslintrc +7 -0
- package/src/sap/fe/core/.library +39 -37
- package/src/sap/fe/core/.supportrc +3 -3
- package/src/sap/fe/core/ActionRuntime.js +72 -27
- package/src/sap/fe/core/ActionRuntime.ts +104 -21
- package/src/sap/fe/core/AppComponent.js +102 -120
- package/src/sap/fe/core/AppComponent.ts +148 -45
- package/src/sap/fe/core/AppStateHandler.js +105 -91
- package/src/sap/fe/core/AppStateHandler.ts +85 -23
- package/src/sap/fe/core/BaseController.js +5 -20
- package/src/sap/fe/core/BaseController.ts +11 -2
- package/src/sap/fe/core/CommonUtils.js +770 -1079
- package/src/sap/fe/core/CommonUtils.ts +750 -491
- package/src/sap/fe/core/ExtensionAPI.js +69 -96
- package/src/sap/fe/core/ExtensionAPI.ts +15 -17
- package/src/sap/fe/core/PageController.js +21 -46
- package/src/sap/fe/core/PageController.ts +11 -2
- package/src/sap/fe/core/TemplateComponent.js +6 -51
- package/src/sap/fe/core/TemplateComponent.ts +27 -16
- package/src/sap/fe/core/TemplateModel.js +18 -24
- package/src/sap/fe/core/TemplateModel.ts +25 -6
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
- package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
- package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
- package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
- package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
- package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
- package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +53 -98
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
- package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
- package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/AnyElement.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +4 -26
- package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
- package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
- package/src/sap/fe/core/controls/FileWrapper.js +51 -136
- package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
- package/src/sap/fe/core/controls/FilterBar.js +19 -54
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
- package/src/sap/fe/core/converters/ConverterContext.js +44 -98
- package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
- package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
- package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
- package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
- package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
- package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
- package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
- package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
- package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
- package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
- package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
- package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
- package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
- package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
- package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
- package/src/sap/fe/core/converters/helpers/ID.js +3 -17
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
- package/src/sap/fe/core/converters/helpers/Key.js +10 -19
- package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
- package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
- package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
- package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
- package/src/sap/fe/core/fpm/Component.js +2 -17
- package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
- package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
- package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
- package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
- package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
- package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
- package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
- package/src/sap/fe/core/helpers/EditState.js +2 -5
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
- package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
- package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
- package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
- package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
- package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
- package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
- package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
- package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
- package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
- package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
- package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
- package/src/sap/fe/core/helpers/Synchronization.js +1 -8
- package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
- package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
- package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library.js +9 -48
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/library.support.ts +3 -1
- package/src/sap/fe/core/library.ts +3 -8
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
- package/src/sap/fe/core/messagebundle.properties +113 -67
- package/src/sap/fe/core/messagebundle_ar.properties +20 -3
- package/src/sap/fe/core/messagebundle_bg.properties +22 -5
- package/src/sap/fe/core/messagebundle_ca.properties +21 -4
- package/src/sap/fe/core/messagebundle_cs.properties +21 -4
- package/src/sap/fe/core/messagebundle_cy.properties +22 -5
- package/src/sap/fe/core/messagebundle_da.properties +20 -3
- package/src/sap/fe/core/messagebundle_de.properties +38 -21
- package/src/sap/fe/core/messagebundle_el.properties +20 -3
- package/src/sap/fe/core/messagebundle_en.properties +38 -21
- package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
- package/src/sap/fe/core/messagebundle_es.properties +40 -23
- package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
- package/src/sap/fe/core/messagebundle_et.properties +20 -3
- package/src/sap/fe/core/messagebundle_fi.properties +20 -3
- package/src/sap/fe/core/messagebundle_fr.properties +21 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
- package/src/sap/fe/core/messagebundle_hi.properties +20 -3
- package/src/sap/fe/core/messagebundle_hr.properties +22 -5
- package/src/sap/fe/core/messagebundle_hu.properties +20 -3
- package/src/sap/fe/core/messagebundle_id.properties +20 -3
- package/src/sap/fe/core/messagebundle_it.properties +23 -6
- package/src/sap/fe/core/messagebundle_iw.properties +20 -3
- package/src/sap/fe/core/messagebundle_ja.properties +22 -5
- package/src/sap/fe/core/messagebundle_kk.properties +21 -4
- package/src/sap/fe/core/messagebundle_ko.properties +20 -3
- package/src/sap/fe/core/messagebundle_lt.properties +20 -3
- package/src/sap/fe/core/messagebundle_lv.properties +20 -3
- package/src/sap/fe/core/messagebundle_ms.properties +20 -3
- package/src/sap/fe/core/messagebundle_nl.properties +20 -3
- package/src/sap/fe/core/messagebundle_no.properties +20 -3
- package/src/sap/fe/core/messagebundle_pl.properties +21 -4
- package/src/sap/fe/core/messagebundle_pt.properties +20 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
- package/src/sap/fe/core/messagebundle_ro.properties +20 -3
- package/src/sap/fe/core/messagebundle_ru.properties +20 -3
- package/src/sap/fe/core/messagebundle_sh.properties +20 -3
- package/src/sap/fe/core/messagebundle_sk.properties +20 -3
- package/src/sap/fe/core/messagebundle_sl.properties +26 -9
- package/src/sap/fe/core/messagebundle_sv.properties +20 -3
- package/src/sap/fe/core/messagebundle_th.properties +21 -4
- package/src/sap/fe/core/messagebundle_tr.properties +20 -3
- package/src/sap/fe/core/messagebundle_uk.properties +23 -6
- package/src/sap/fe/core/messagebundle_vi.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
- package/src/sap/fe/core/operationsHelper.js +74 -101
- package/src/sap/fe/core/operationsHelper.ts +113 -44
- package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
- package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
- package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
- package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
- package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
- package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
- package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
- package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
- package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
- package/src/sap/fe/core/support/CommonHelper.js +7 -16
- package/src/sap/fe/core/support/Diagnostics.js +1 -10
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
- package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
- package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
- package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
- package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +40 -111
- package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
- package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
- package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
- package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
- package/src/sap/fe/core/templating/UIFormatters.js +40 -180
- package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
- package/src/sap/fe/core/type/Email.js +1 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -11
- package/ui5.yaml +0 -1
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
- package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
- package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
|
@@ -2,77 +2,100 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/editFlow/TransactionHelper", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/Text", "sap/ui/core/mvc/ControllerExtension"
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/editFlow/TransactionHelper", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/Text", "sap/ui/core/mvc/ControllerExtension"], function (Log, CommonUtils, BusyLocker, ActivitySync, CollaborationCommon, sticky, TransactionHelper, ClassSupport, EditState, FELibrary, Button, Dialog, Text, ControllerExtension) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _dec35, _dec36, _dec37, _dec38, _dec39, _dec40, _dec41, _dec42, _dec43, _dec44, _dec45, _dec46,
|
|
9
|
-
|
|
8
|
+
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _dec35, _dec36, _dec37, _dec38, _dec39, _dec40, _dec41, _dec42, _dec43, _dec44, _dec45, _dec46, _class, _class2;
|
|
10
9
|
var publicExtension = ClassSupport.publicExtension;
|
|
11
|
-
var privateExtension = ClassSupport.privateExtension;
|
|
12
10
|
var methodOverride = ClassSupport.methodOverride;
|
|
13
11
|
var finalExtension = ClassSupport.finalExtension;
|
|
14
|
-
var extensible = ClassSupport.extensible;
|
|
15
12
|
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
16
13
|
var Activity = CollaborationCommon.Activity;
|
|
17
14
|
var send = ActivitySync.send;
|
|
18
|
-
|
|
19
15
|
function _catch(body, recover) {
|
|
20
16
|
try {
|
|
21
17
|
var result = body();
|
|
22
18
|
} catch (e) {
|
|
23
19
|
return recover(e);
|
|
24
20
|
}
|
|
25
|
-
|
|
26
21
|
if (result && result.then) {
|
|
27
22
|
return result.then(void 0, recover);
|
|
28
23
|
}
|
|
29
|
-
|
|
30
24
|
return result;
|
|
31
25
|
}
|
|
32
|
-
|
|
33
26
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
34
|
-
|
|
35
27
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
36
|
-
|
|
37
28
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
38
|
-
|
|
39
29
|
var ProgrammingModel = FELibrary.ProgrammingModel,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
var InternalEditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.InternalEditFlow"), _dec2 = methodOverride(), _dec3 =
|
|
30
|
+
DraftStatus = FELibrary.DraftStatus,
|
|
31
|
+
EditMode = FELibrary.EditMode,
|
|
32
|
+
CreationMode = FELibrary.CreationMode;
|
|
33
|
+
var InternalEditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.InternalEditFlow"), _dec2 = methodOverride(), _dec3 = publicExtension(), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = finalExtension(), _dec11 = publicExtension(), _dec12 = finalExtension(), _dec13 = publicExtension(), _dec14 = finalExtension(), _dec15 = publicExtension(), _dec16 = finalExtension(), _dec17 = publicExtension(), _dec18 = finalExtension(), _dec19 = publicExtension(), _dec20 = finalExtension(), _dec21 = publicExtension(), _dec22 = finalExtension(), _dec23 = publicExtension(), _dec24 = finalExtension(), _dec25 = publicExtension(), _dec26 = finalExtension(), _dec27 = publicExtension(), _dec28 = finalExtension(), _dec29 = publicExtension(), _dec30 = finalExtension(), _dec31 = publicExtension(), _dec32 = finalExtension(), _dec33 = publicExtension(), _dec34 = finalExtension(), _dec35 = publicExtension(), _dec36 = finalExtension(), _dec37 = publicExtension(), _dec38 = finalExtension(), _dec39 = publicExtension(), _dec40 = finalExtension(), _dec41 = publicExtension(), _dec42 = finalExtension(), _dec43 = publicExtension(), _dec44 = finalExtension(), _dec45 = publicExtension(), _dec46 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
|
|
44
34
|
_inheritsLoose(InternalEditFlow, _ControllerExtension);
|
|
45
|
-
|
|
46
35
|
function InternalEditFlow() {
|
|
47
36
|
return _ControllerExtension.apply(this, arguments) || this;
|
|
48
37
|
}
|
|
49
|
-
|
|
50
38
|
var _proto = InternalEditFlow.prototype;
|
|
51
|
-
|
|
52
39
|
_proto.onInit = function onInit() {
|
|
53
40
|
this._oAppComponent = this.base.getAppComponent();
|
|
54
41
|
}
|
|
42
|
+
|
|
55
43
|
/**
|
|
56
|
-
*
|
|
44
|
+
* Sets that the current page contains a newly created object.
|
|
57
45
|
*
|
|
58
|
-
* @param bCreationMode
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
46
|
+
* @param bCreationMode True if the object is new
|
|
47
|
+
*/;
|
|
48
|
+
_proto.setCreationMode = function setCreationMode(bCreationMode) {
|
|
49
|
+
var uiModelContext = this.base.getView().getBindingContext("ui");
|
|
50
|
+
this.getGlobalUIModel().setProperty("createMode", bCreationMode, uiModelContext, true);
|
|
51
|
+
}
|
|
64
52
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Indicates whether the current page contains a newly created object or not.
|
|
55
|
+
*
|
|
56
|
+
* @returns True if the object is new
|
|
57
|
+
*/;
|
|
58
|
+
_proto.getCreationMode = function getCreationMode() {
|
|
59
|
+
var uiModelContext = this.base.getView().getBindingContext("ui");
|
|
60
|
+
return !!this.getGlobalUIModel().getProperty("createMode", uiModelContext);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Indicates whether the object being edited (or one of its sub-objects) has been modified or not.
|
|
65
|
+
*
|
|
66
|
+
* @returns True if the object has been modified
|
|
67
|
+
*/;
|
|
68
|
+
_proto.isDocumentModified = function isDocumentModified() {
|
|
69
|
+
return !!this.getGlobalUIModel().getProperty("/isDocumentModified");
|
|
70
|
+
}
|
|
68
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Sets that the object being edited (or one of its sub-objects) has been modified.
|
|
74
|
+
*
|
|
75
|
+
* @param modified True if the object has been modified
|
|
76
|
+
*/;
|
|
77
|
+
_proto.setDocumentModified = function setDocumentModified(modified) {
|
|
78
|
+
this.getGlobalUIModel().setProperty("/isDocumentModified", modified);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Sets that the object being edited has been modified by creating a sub-object.
|
|
83
|
+
*
|
|
84
|
+
* @param listBinding The list binding on which the object has been created
|
|
85
|
+
*/;
|
|
86
|
+
_proto.setDocumentModifiedOnCreate = function setDocumentModifiedOnCreate(listBinding) {
|
|
87
|
+
// Set the modified flag only on relative listBindings, i.e. when creating a sub-object
|
|
88
|
+
// If the listBinding is not relative, then it's a creation from the ListReport, and by default a newly created root object isn't considered as modified
|
|
89
|
+
if (listBinding.isRelative()) {
|
|
90
|
+
this.setDocumentModified(true);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
69
93
|
_proto.createMultipleDocuments = function createMultipleDocuments(oListBinding, aData, bCreateAtEnd, bFromCopyPaste, beforeCreateCallBack) {
|
|
70
94
|
var _this = this;
|
|
71
|
-
|
|
72
95
|
var bInactive = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
|
|
73
96
|
var transactionHelper = this.getTransactionHelper(),
|
|
74
|
-
|
|
75
|
-
|
|
97
|
+
oLockObject = this.getGlobalUIModel(),
|
|
98
|
+
oResourceBundle = this.getView().getController().oResourceBundle;
|
|
76
99
|
BusyLocker.lock(oLockObject);
|
|
77
100
|
var aFinalContexts = [];
|
|
78
101
|
return this.syncTask().then(function () {
|
|
@@ -81,42 +104,41 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
81
104
|
}) : Promise.resolve();
|
|
82
105
|
}).then(function () {
|
|
83
106
|
var oModel = oListBinding.getModel(),
|
|
84
|
-
|
|
107
|
+
oMetaModel = oModel.getMetaModel();
|
|
85
108
|
var sMetaPath;
|
|
86
|
-
|
|
87
109
|
if (oListBinding.getContext()) {
|
|
88
110
|
sMetaPath = oMetaModel.getMetaPath("".concat(oListBinding.getContext().getPath(), "/").concat(oListBinding.getPath()));
|
|
89
111
|
} else {
|
|
90
112
|
sMetaPath = oMetaModel.getMetaPath(oListBinding.getPath());
|
|
91
113
|
}
|
|
114
|
+
_this.handleCreateEvents(oListBinding);
|
|
92
115
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
116
|
+
// Iterate on all items and store the corresponding creation promise
|
|
96
117
|
var aCreationPromises = aData.map(function (mPropertyValues) {
|
|
97
118
|
var mParameters = {
|
|
98
119
|
data: {}
|
|
99
120
|
};
|
|
100
121
|
mParameters.keepTransientContextOnFailed = false; // currently not fully supported
|
|
101
|
-
|
|
102
122
|
mParameters.busyMode = "None";
|
|
103
123
|
mParameters.creationMode = CreationMode.CreationRow;
|
|
104
124
|
mParameters.parentControl = _this.getView();
|
|
105
125
|
mParameters.createAtEnd = bCreateAtEnd;
|
|
106
|
-
mParameters.inactive = bInactive;
|
|
126
|
+
mParameters.inactive = bInactive;
|
|
107
127
|
|
|
128
|
+
// Remove navigation properties as we don't support deep create
|
|
108
129
|
for (var sPropertyPath in mPropertyValues) {
|
|
109
130
|
var oProperty = oMetaModel.getObject("".concat(sMetaPath, "/").concat(sPropertyPath));
|
|
110
|
-
|
|
111
131
|
if (oProperty && oProperty.$kind !== "NavigationProperty" && mPropertyValues[sPropertyPath]) {
|
|
112
132
|
mParameters.data[sPropertyPath] = mPropertyValues[sPropertyPath];
|
|
113
133
|
}
|
|
114
134
|
}
|
|
115
|
-
|
|
116
135
|
return transactionHelper.createDocument(oListBinding, mParameters, oResourceBundle, _this.getMessageHandler(), bFromCopyPaste, _this.getView());
|
|
117
136
|
});
|
|
118
137
|
return Promise.all(aCreationPromises);
|
|
119
138
|
}).then(function (aContexts) {
|
|
139
|
+
if (!bInactive) {
|
|
140
|
+
_this.setDocumentModifiedOnCreate(oListBinding);
|
|
141
|
+
}
|
|
120
142
|
// transient contexts are reliably removed once oNewContext.created() is resolved
|
|
121
143
|
aFinalContexts = aContexts;
|
|
122
144
|
return Promise.all(aContexts.map(function (oNewContext) {
|
|
@@ -125,11 +147,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
125
147
|
}
|
|
126
148
|
}));
|
|
127
149
|
}).then(function () {
|
|
128
|
-
var oBindingContext = _this.getView().getBindingContext();
|
|
150
|
+
var oBindingContext = _this.getView().getBindingContext();
|
|
151
|
+
|
|
152
|
+
// if there are transient contexts, we must avoid requesting side effects
|
|
129
153
|
// this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
|
|
130
154
|
// if list binding is refreshed, transient contexts might be lost
|
|
131
|
-
|
|
132
|
-
|
|
133
155
|
if (!CommonUtils.hasTransientContext(oListBinding)) {
|
|
134
156
|
_this._oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
|
|
135
157
|
}
|
|
@@ -142,33 +164,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
142
164
|
return aFinalContexts;
|
|
143
165
|
});
|
|
144
166
|
};
|
|
145
|
-
|
|
146
167
|
_proto.deleteMultipleDocuments = function deleteMultipleDocuments(aContexts, mParameters) {
|
|
147
168
|
var _this2 = this;
|
|
148
|
-
|
|
149
169
|
var oLockObject = this.getGlobalUIModel();
|
|
150
170
|
var oControl = this.getView().byId(mParameters.controlId);
|
|
151
|
-
|
|
152
171
|
if (!oControl) {
|
|
153
172
|
throw new Error("parameter controlId missing or incorrect");
|
|
154
173
|
} else {
|
|
155
174
|
mParameters.parentControl = oControl;
|
|
156
175
|
}
|
|
157
|
-
|
|
158
176
|
var oListBinding = oControl.getBinding("items") || oControl.getRowBinding();
|
|
159
177
|
mParameters.bFindActiveContexts = true;
|
|
160
178
|
BusyLocker.lock(oLockObject);
|
|
161
179
|
return this.deleteDocumentTransaction(aContexts, mParameters).then(function () {
|
|
162
|
-
var oResult;
|
|
163
|
-
// First clear the selection in the table as it's not valid any more
|
|
180
|
+
var oResult;
|
|
164
181
|
|
|
182
|
+
// Multiple object deletion is triggered from a list
|
|
183
|
+
// First clear the selection in the table as it's not valid any more
|
|
165
184
|
if (oControl.isA("sap.ui.mdc.Table")) {
|
|
166
185
|
oControl.clearSelection();
|
|
167
|
-
}
|
|
168
|
-
|
|
186
|
+
}
|
|
169
187
|
|
|
188
|
+
// Then refresh the list-binding (LR), or require side-effects (OP)
|
|
170
189
|
var oBindingContext = _this2.getView().getBindingContext();
|
|
171
|
-
|
|
172
190
|
if (oListBinding.isRoot()) {
|
|
173
191
|
// keep promise chain pending until refresh of listbinding is completed
|
|
174
192
|
oResult = new Promise(function (resolve) {
|
|
@@ -184,9 +202,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
184
202
|
if (!CommonUtils.hasTransientContext(oListBinding)) {
|
|
185
203
|
_this2._oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
|
|
186
204
|
}
|
|
187
|
-
}
|
|
188
|
-
|
|
205
|
+
}
|
|
189
206
|
|
|
207
|
+
// deleting at least one object should also set the UI to dirty
|
|
190
208
|
EditState.setEditStateDirty();
|
|
191
209
|
send(_this2.getView(), Activity.Delete, aContexts.map(function (context) {
|
|
192
210
|
return context.getPath();
|
|
@@ -198,6 +216,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
198
216
|
BusyLocker.unlock(oLockObject);
|
|
199
217
|
});
|
|
200
218
|
}
|
|
219
|
+
|
|
201
220
|
/**
|
|
202
221
|
* Decides if a document is to be shown in display or edit mode.
|
|
203
222
|
*
|
|
@@ -206,28 +225,24 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
206
225
|
* @memberof sap.fe.core.controllerextensions.InternalEditFlow
|
|
207
226
|
* @param {sap.ui.model.odata.v4.Context} oContext The context to be displayed or edited
|
|
208
227
|
* @returns {Promise} Promise resolves once the edit mode is computed
|
|
209
|
-
|
|
210
|
-
;
|
|
211
|
-
|
|
228
|
+
*/;
|
|
212
229
|
_proto.computeEditMode = function computeEditMode(oContext) {
|
|
213
230
|
try {
|
|
214
231
|
var _this4 = this;
|
|
215
|
-
|
|
216
|
-
var sCustomAction = _this4.getInternalModel().getProperty("/sCustomAction");
|
|
217
|
-
|
|
218
232
|
var sProgrammingModel = _this4.getProgrammingModel(oContext);
|
|
219
|
-
|
|
220
233
|
return Promise.resolve(function () {
|
|
221
234
|
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
222
235
|
return _catch(function () {
|
|
223
236
|
_this4.setDraftStatus(DraftStatus.Clear);
|
|
224
|
-
|
|
237
|
+
_this4._setEditablePending(true);
|
|
225
238
|
return Promise.resolve(oContext.requestObject("IsActiveEntity")).then(function (bIsActiveEntity) {
|
|
239
|
+
function _temp2() {
|
|
240
|
+
_this4._setEditablePending(false);
|
|
241
|
+
}
|
|
226
242
|
var _temp = function () {
|
|
227
243
|
if (bIsActiveEntity === false) {
|
|
228
244
|
// in case the document is draft set it in edit mode
|
|
229
245
|
_this4.setEditMode(EditMode.Editable);
|
|
230
|
-
|
|
231
246
|
return Promise.resolve(oContext.requestObject("HasActiveEntity")).then(function (bHasActiveEntity) {
|
|
232
247
|
_this4.setEditMode(undefined, !bHasActiveEntity);
|
|
233
248
|
});
|
|
@@ -236,26 +251,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
236
251
|
_this4.setEditMode(EditMode.Display, false);
|
|
237
252
|
}
|
|
238
253
|
}();
|
|
239
|
-
|
|
240
|
-
if (_temp && _temp.then) return _temp.then(function () {});
|
|
254
|
+
return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
|
|
241
255
|
});
|
|
242
256
|
}, function (oError) {
|
|
243
257
|
Log.error("Error while determining the editMode for draft", oError);
|
|
244
258
|
throw oError;
|
|
245
259
|
});
|
|
246
260
|
} else if (sProgrammingModel === ProgrammingModel.Sticky) {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
_this4.getTransactionHelper().handleDocumentModifications();
|
|
251
|
-
|
|
261
|
+
var lastInvokedActionName = _this4.getInternalModel().getProperty("/lastInvokedAction");
|
|
262
|
+
if (lastInvokedActionName && _this4._hasNewActionForSticky(oContext, _this4.getView(), lastInvokedActionName)) {
|
|
252
263
|
_this4.setEditMode(EditMode.Editable, true);
|
|
253
|
-
|
|
254
264
|
EditState.setEditStateDirty();
|
|
255
|
-
|
|
256
265
|
_this4.handleStickyOn(oContext);
|
|
257
|
-
|
|
258
|
-
_this4.getInternalModel().setProperty("/sCustomAction", "");
|
|
266
|
+
_this4.getInternalModel().setProperty("/lastInvokedAction", undefined);
|
|
259
267
|
}
|
|
260
268
|
}
|
|
261
269
|
}());
|
|
@@ -270,44 +278,44 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
270
278
|
* @param bCreationMode CreateMode flag to identify the creation mode
|
|
271
279
|
*/
|
|
272
280
|
;
|
|
273
|
-
|
|
274
281
|
_proto.setEditMode = function setEditMode(sEditMode, bCreationMode) {
|
|
275
282
|
// at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
|
|
276
283
|
// rely on the global UI model to exist
|
|
277
284
|
var oGlobalModel = this.getGlobalUIModel();
|
|
278
|
-
|
|
279
285
|
if (sEditMode) {
|
|
280
286
|
oGlobalModel.setProperty("/isEditable", sEditMode === "Editable", undefined, true);
|
|
281
287
|
}
|
|
282
|
-
|
|
283
288
|
if (bCreationMode !== undefined) {
|
|
284
289
|
// Since setCreationMode is public in EditFlow and can be overriden, make sure to call it via the controller
|
|
285
290
|
// to ensure any overrides are taken into account
|
|
286
291
|
this.setCreationMode(bCreationMode);
|
|
287
292
|
}
|
|
288
293
|
};
|
|
289
|
-
|
|
294
|
+
_proto._setEditablePending = function _setEditablePending(pending) {
|
|
295
|
+
var globalModel = this.getGlobalUIModel();
|
|
296
|
+
globalModel.setProperty("/isEditablePending", pending, undefined, true);
|
|
297
|
+
};
|
|
290
298
|
_proto.setDraftStatus = function setDraftStatus(sDraftState) {
|
|
291
299
|
// at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
|
|
292
300
|
// rely on the global UI model to exist
|
|
293
301
|
this.base.getView().getModel("ui").setProperty("/draftStatus", sDraftState, undefined, true);
|
|
294
302
|
};
|
|
295
|
-
|
|
296
303
|
_proto.getRoutingListener = function getRoutingListener() {
|
|
297
304
|
// at this point of time it's not meant to release the edit flow for FPM custom pages and the routing
|
|
298
305
|
// listener is not yet public therefore keep the logic here for now
|
|
306
|
+
|
|
299
307
|
if (this.base._routing) {
|
|
300
308
|
return this.base._routing;
|
|
301
309
|
} else {
|
|
302
310
|
throw new Error("Edit Flow works only with a given routing listener");
|
|
303
311
|
}
|
|
304
312
|
};
|
|
305
|
-
|
|
306
313
|
_proto.getGlobalUIModel = function getGlobalUIModel() {
|
|
307
314
|
// at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
|
|
308
315
|
// rely on the global UI model to exist
|
|
309
316
|
return this.base.getView().getModel("ui");
|
|
310
317
|
}
|
|
318
|
+
|
|
311
319
|
/**
|
|
312
320
|
* Performs a task in sync with other tasks created via this function.
|
|
313
321
|
* Returns the promise chain of the task.
|
|
@@ -320,12 +328,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
320
328
|
* @returns Promise resolves once the task is completed
|
|
321
329
|
* @ui5-restricted
|
|
322
330
|
* @final
|
|
323
|
-
|
|
324
|
-
;
|
|
325
|
-
|
|
331
|
+
*/;
|
|
326
332
|
_proto.syncTask = function syncTask(vTask) {
|
|
327
333
|
var fnNewTask;
|
|
328
|
-
|
|
329
334
|
if (vTask instanceof Promise) {
|
|
330
335
|
fnNewTask = function () {
|
|
331
336
|
return vTask;
|
|
@@ -333,86 +338,71 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
333
338
|
} else if (typeof vTask === "function") {
|
|
334
339
|
fnNewTask = vTask;
|
|
335
340
|
}
|
|
336
|
-
|
|
337
341
|
this._pTasks = this._pTasks || Promise.resolve();
|
|
338
|
-
|
|
339
342
|
if (fnNewTask) {
|
|
340
343
|
this._pTasks = this._pTasks.then(fnNewTask).catch(function () {
|
|
341
344
|
return Promise.resolve();
|
|
342
345
|
});
|
|
343
346
|
}
|
|
344
|
-
|
|
345
347
|
return this._pTasks;
|
|
346
348
|
};
|
|
347
|
-
|
|
348
349
|
_proto.getProgrammingModel = function getProgrammingModel(oContext) {
|
|
349
350
|
return this.getTransactionHelper().getProgrammingModel(oContext);
|
|
350
351
|
};
|
|
351
|
-
|
|
352
352
|
_proto.deleteDocumentTransaction = function deleteDocumentTransaction(oContext, mParameters) {
|
|
353
353
|
var _sap$ui$getCore$byId,
|
|
354
|
-
|
|
355
|
-
|
|
354
|
+
_this5 = this;
|
|
356
355
|
var oResourceBundle = this.getView().getController().oResourceBundle,
|
|
357
|
-
|
|
358
|
-
mParameters = mParameters || {};
|
|
359
|
-
// for the time being I kept it and provide the internal model context to not break something
|
|
356
|
+
transactionHelper = this.getTransactionHelper();
|
|
357
|
+
mParameters = mParameters || {};
|
|
360
358
|
|
|
359
|
+
// TODO: this setting and removing of contexts shouldn't be in the transaction helper at all
|
|
360
|
+
// for the time being I kept it and provide the internal model context to not break something
|
|
361
361
|
mParameters.internalModelContext = mParameters.controlId ? (_sap$ui$getCore$byId = sap.ui.getCore().byId(mParameters.controlId)) === null || _sap$ui$getCore$byId === void 0 ? void 0 : _sap$ui$getCore$byId.getBindingContext("internal") : null;
|
|
362
362
|
return this.syncTask().then(transactionHelper.deleteDocument.bind(transactionHelper, oContext, mParameters, oResourceBundle, this.getMessageHandler())).then(function () {
|
|
363
363
|
var internalModel = _this5.getInternalModel();
|
|
364
|
-
|
|
365
364
|
internalModel.setProperty("/sessionOn", false);
|
|
366
365
|
internalModel.setProperty("/stickySessionToken", undefined);
|
|
367
366
|
}).catch(function (oError) {
|
|
368
367
|
return Promise.reject(oError);
|
|
369
368
|
});
|
|
370
369
|
}
|
|
370
|
+
|
|
371
371
|
/**
|
|
372
372
|
* Handles the create event: shows messages and in case of a draft, updates the draft indicator.
|
|
373
373
|
*
|
|
374
374
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
375
375
|
* @param oBinding OData list binding object
|
|
376
|
-
|
|
377
|
-
;
|
|
378
|
-
|
|
376
|
+
*/;
|
|
379
377
|
_proto.handleCreateEvents = function handleCreateEvents(oBinding) {
|
|
380
378
|
var _this6 = this;
|
|
381
|
-
|
|
382
|
-
var transactionHelper = this.getTransactionHelper();
|
|
383
379
|
this.setDraftStatus(DraftStatus.Clear);
|
|
384
380
|
oBinding = oBinding.getBinding && oBinding.getBinding() || oBinding;
|
|
385
381
|
var sProgrammingModel = this.getProgrammingModel(oBinding);
|
|
386
382
|
oBinding.attachEvent("createSent", function () {
|
|
387
|
-
transactionHelper.handleDocumentModifications();
|
|
388
|
-
|
|
389
383
|
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
390
384
|
_this6.setDraftStatus(DraftStatus.Saving);
|
|
391
385
|
}
|
|
392
386
|
});
|
|
393
387
|
oBinding.attachEvent("createCompleted", function (oEvent) {
|
|
394
388
|
var bSuccess = oEvent.getParameter("success");
|
|
395
|
-
|
|
396
389
|
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
397
390
|
_this6.setDraftStatus(bSuccess ? DraftStatus.Saved : DraftStatus.Clear);
|
|
398
391
|
}
|
|
399
|
-
|
|
400
392
|
_this6.getMessageHandler().showMessageDialog();
|
|
401
393
|
});
|
|
402
394
|
};
|
|
403
|
-
|
|
404
395
|
_proto.getTransactionHelper = function getTransactionHelper() {
|
|
405
396
|
if (!this._oTransactionHelper) {
|
|
406
397
|
// currently also the transaction helper is locking therefore passing lock object
|
|
407
398
|
this._oTransactionHelper = new TransactionHelper(this._oAppComponent, this.getGlobalUIModel());
|
|
408
399
|
}
|
|
409
|
-
|
|
410
400
|
return this._oTransactionHelper;
|
|
411
401
|
};
|
|
412
|
-
|
|
413
402
|
_proto.getInternalModel = function getInternalModel() {
|
|
414
403
|
return this.base.getView().getModel("internal");
|
|
415
404
|
}
|
|
405
|
+
|
|
416
406
|
/**
|
|
417
407
|
* Creates a new promise to wait for an action to be executed
|
|
418
408
|
*
|
|
@@ -420,12 +410,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
420
410
|
* @name _createActionPromise
|
|
421
411
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
422
412
|
* @returns {Function} The resolver function which can be used to externally resolve the promise
|
|
423
|
-
|
|
424
|
-
;
|
|
425
|
-
|
|
413
|
+
*/;
|
|
426
414
|
_proto.createActionPromise = function createActionPromise(sActionName, sControlId) {
|
|
427
415
|
var _this7 = this;
|
|
428
|
-
|
|
429
416
|
var fResolver, fRejector;
|
|
430
417
|
this.oActionPromise = new Promise(function (resolve, reject) {
|
|
431
418
|
fResolver = resolve;
|
|
@@ -440,6 +427,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
440
427
|
fRejector: fRejector
|
|
441
428
|
};
|
|
442
429
|
}
|
|
430
|
+
|
|
443
431
|
/**
|
|
444
432
|
* Gets the getCurrentActionPromise object.
|
|
445
433
|
*
|
|
@@ -447,16 +435,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
447
435
|
* @name _getCurrentActionPromise
|
|
448
436
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
449
437
|
* @returns Returns the promise
|
|
450
|
-
|
|
451
|
-
;
|
|
452
|
-
|
|
438
|
+
*/;
|
|
453
439
|
_proto.getCurrentActionPromise = function getCurrentActionPromise() {
|
|
454
440
|
return this.oActionPromise;
|
|
455
441
|
};
|
|
456
|
-
|
|
457
442
|
_proto.deleteCurrentActionPromise = function deleteCurrentActionPromise() {
|
|
458
443
|
this.oActionPromise = undefined;
|
|
459
444
|
}
|
|
445
|
+
|
|
460
446
|
/**
|
|
461
447
|
* @function
|
|
462
448
|
* @name getActionResponseDataAndKeys
|
|
@@ -464,9 +450,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
464
450
|
* @param sActionName The name of the action that is executed
|
|
465
451
|
* @param oResponse The bound action's response data or response context
|
|
466
452
|
* @returns Object with data and names of the key fields of the response
|
|
467
|
-
|
|
468
|
-
;
|
|
469
|
-
|
|
453
|
+
*/;
|
|
470
454
|
_proto.getActionResponseDataAndKeys = function getActionResponseDataAndKeys(sActionName, oResponse) {
|
|
471
455
|
if (Array.isArray(oResponse)) {
|
|
472
456
|
if (oResponse.length === 1) {
|
|
@@ -475,53 +459,51 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
475
459
|
return null;
|
|
476
460
|
}
|
|
477
461
|
}
|
|
478
|
-
|
|
479
462
|
if (!oResponse) {
|
|
480
463
|
return null;
|
|
481
464
|
}
|
|
482
|
-
|
|
483
465
|
var oView = this.getView(),
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
466
|
+
oMetaModel = oView.getModel().getMetaModel().getData(),
|
|
467
|
+
sActionReturnType = oMetaModel && oMetaModel[sActionName] && oMetaModel[sActionName][0] && oMetaModel[sActionName][0].$ReturnType ? oMetaModel[sActionName][0].$ReturnType.$Type : null,
|
|
468
|
+
aKey = sActionReturnType && oMetaModel[sActionReturnType] ? oMetaModel[sActionReturnType].$Key : null;
|
|
487
469
|
return {
|
|
488
470
|
oData: oResponse.getObject(),
|
|
489
471
|
keys: aKey
|
|
490
472
|
};
|
|
491
473
|
};
|
|
492
|
-
|
|
493
474
|
_proto.getMessageHandler = function getMessageHandler() {
|
|
494
475
|
// at this point of time it's not meant to release the edit flow for FPM custom pages therefore keep
|
|
495
476
|
// the logic here for now
|
|
477
|
+
|
|
496
478
|
if (this.base.messageHandler) {
|
|
497
479
|
return this.base.messageHandler;
|
|
498
480
|
} else {
|
|
499
481
|
throw new Error("Edit Flow works only with a given message handler");
|
|
500
482
|
}
|
|
501
483
|
};
|
|
502
|
-
|
|
503
484
|
_proto.handleStickyOn = function handleStickyOn(oContext) {
|
|
504
485
|
var oAppComponent = CommonUtils.getAppComponent(this.getView());
|
|
505
|
-
|
|
506
486
|
try {
|
|
507
487
|
if (oAppComponent === undefined || oContext === undefined) {
|
|
508
488
|
throw new Error("undefined AppComponent or Context for function handleStickyOn");
|
|
509
489
|
}
|
|
510
|
-
|
|
511
490
|
if (!oAppComponent.getRouterProxy().hasNavigationGuard()) {
|
|
512
491
|
var sHashTracker = oAppComponent.getRouterProxy().getHash(),
|
|
513
|
-
|
|
492
|
+
oInternalModel = this.getInternalModel();
|
|
493
|
+
|
|
494
|
+
// Set a guard in the RouterProxy
|
|
514
495
|
// A timeout is necessary, as with deferred creation the hashChanger is not updated yet with
|
|
515
496
|
// the new hash, and the guard cannot be found in the managed history of the router proxy
|
|
516
|
-
|
|
517
497
|
setTimeout(function () {
|
|
518
498
|
oAppComponent.getRouterProxy().setNavigationGuard(oContext.getPath().substring(1));
|
|
519
|
-
}, 0);
|
|
499
|
+
}, 0);
|
|
520
500
|
|
|
501
|
+
// Setting back navigation on shell service, to get the dicard message box in case of sticky
|
|
521
502
|
oAppComponent.getShellServices().setBackNavigation(this.onBackNavigationInSession.bind(this));
|
|
522
503
|
this.fnDirtyStateProvider = this._registerDirtyStateProvider(oAppComponent, oInternalModel, sHashTracker);
|
|
523
|
-
oAppComponent.getShellServices().registerDirtyStateProvider(this.fnDirtyStateProvider);
|
|
504
|
+
oAppComponent.getShellServices().registerDirtyStateProvider(this.fnDirtyStateProvider);
|
|
524
505
|
|
|
506
|
+
// handle session timeout
|
|
525
507
|
var i18nModel = this.getView().getModel("sap.fe.i18n");
|
|
526
508
|
this.fnHandleSessionTimeout = this._attachSessionTimeout(oContext, i18nModel);
|
|
527
509
|
this.getView().getModel().attachSessionTimeout(this.fnHandleSessionTimeout);
|
|
@@ -532,38 +514,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
532
514
|
Log.info(error);
|
|
533
515
|
return undefined;
|
|
534
516
|
}
|
|
535
|
-
|
|
536
517
|
return true;
|
|
537
518
|
};
|
|
538
|
-
|
|
539
519
|
_proto.handleStickyOff = function handleStickyOff() {
|
|
540
520
|
var oAppComponent = CommonUtils.getAppComponent(this.getView());
|
|
541
|
-
|
|
542
521
|
try {
|
|
543
522
|
if (oAppComponent === undefined) {
|
|
544
523
|
throw new Error("undefined AppComponent for function handleStickyOff");
|
|
545
524
|
}
|
|
546
|
-
|
|
547
525
|
if (oAppComponent && oAppComponent.getRouterProxy) {
|
|
548
526
|
// If we have exited from the app, CommonUtils.getAppComponent doesn't return a
|
|
549
527
|
// sap.fe.core.AppComponent, hence the 'if' above
|
|
550
528
|
oAppComponent.getRouterProxy().discardNavigationGuard();
|
|
551
529
|
}
|
|
552
|
-
|
|
553
530
|
if (this.fnDirtyStateProvider) {
|
|
554
531
|
oAppComponent.getShellServices().deregisterDirtyStateProvider(this.fnDirtyStateProvider);
|
|
555
532
|
this.fnDirtyStateProvider = undefined;
|
|
556
533
|
}
|
|
557
|
-
|
|
558
534
|
if (this.getView().getModel() && this.fnHandleSessionTimeout) {
|
|
559
535
|
this.getView().getModel().detachSessionTimeout(this.fnHandleSessionTimeout);
|
|
560
536
|
}
|
|
561
|
-
|
|
562
537
|
oAppComponent.getRoutingService().detachRouteMatched(this.fnStickyDiscardAfterNavigation);
|
|
563
538
|
this.fnStickyDiscardAfterNavigation = undefined;
|
|
564
|
-
this.getTransactionHelper()._bCreateMode = false;
|
|
565
539
|
this.setEditMode(EditMode.Display, false);
|
|
566
|
-
|
|
567
540
|
if (oAppComponent) {
|
|
568
541
|
// If we have exited from the app, CommonUtils.getAppComponent doesn't return a
|
|
569
542
|
// sap.fe.core.AppComponent, hence the 'if' above
|
|
@@ -573,52 +546,42 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
573
546
|
Log.info(error);
|
|
574
547
|
return undefined;
|
|
575
548
|
}
|
|
576
|
-
|
|
577
549
|
return true;
|
|
578
550
|
}
|
|
551
|
+
|
|
579
552
|
/**
|
|
580
553
|
* @description Method to display a 'discard' popover when exiting a sticky session.
|
|
581
554
|
* @function
|
|
582
555
|
* @name onBackNavigationInSession
|
|
583
556
|
* @memberof sap.fe.core.controllerextensions.InternalEditFlow
|
|
584
|
-
|
|
585
|
-
;
|
|
586
|
-
|
|
557
|
+
*/;
|
|
587
558
|
_proto.onBackNavigationInSession = function onBackNavigationInSession() {
|
|
588
559
|
var _this8 = this;
|
|
589
|
-
|
|
590
560
|
var oView = this.getView(),
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
561
|
+
oAppComponent = CommonUtils.getAppComponent(oView),
|
|
562
|
+
oRouterProxy = oAppComponent.getRouterProxy();
|
|
594
563
|
if (oRouterProxy.checkIfBackIsOutOfGuard()) {
|
|
595
564
|
var oBindingContext = oView && oView.getBindingContext();
|
|
596
565
|
sticky.processDataLossConfirmation(function () {
|
|
597
566
|
_this8.discardStickySession(oBindingContext);
|
|
598
|
-
|
|
599
567
|
history.back();
|
|
600
568
|
}, oView, this.getProgrammingModel(oBindingContext));
|
|
601
569
|
return;
|
|
602
570
|
}
|
|
603
|
-
|
|
604
571
|
history.back();
|
|
605
572
|
};
|
|
606
|
-
|
|
607
573
|
_proto.discardStickySession = function discardStickySession(oContext) {
|
|
608
574
|
sticky.discardDocument(oContext);
|
|
609
575
|
this.handleStickyOff();
|
|
610
576
|
};
|
|
611
|
-
|
|
612
577
|
_proto._hasNewActionForSticky = function _hasNewActionForSticky(oContext, oView, sCustomAction) {
|
|
613
578
|
try {
|
|
614
579
|
if (oContext === undefined || oView === undefined) {
|
|
615
580
|
throw new Error("Invalid input parameters for function _hasNewActionForSticky");
|
|
616
581
|
}
|
|
617
|
-
|
|
618
582
|
var oMetaModel = oView.getModel().getMetaModel(),
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
583
|
+
sMetaPath = oContext.getPath().substring(0, oContext.getPath().indexOf("(")),
|
|
584
|
+
oStickySession = oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Session.v1.StickySessionSupported"));
|
|
622
585
|
if (oStickySession && oStickySession.NewAction && oStickySession.NewAction === sCustomAction) {
|
|
623
586
|
return true;
|
|
624
587
|
} else if (oStickySession && oStickySession.AdditionalNewActions) {
|
|
@@ -633,26 +596,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
633
596
|
return undefined;
|
|
634
597
|
}
|
|
635
598
|
};
|
|
636
|
-
|
|
637
599
|
_proto._registerDirtyStateProvider = function _registerDirtyStateProvider(oAppComponent, oInternalModel, sHashTracker) {
|
|
638
600
|
return function fnDirtyStateProvider(oNavigationContext) {
|
|
639
601
|
try {
|
|
640
602
|
if (oNavigationContext === undefined) {
|
|
641
603
|
throw new Error("Invalid input parameters for function fnDirtyStateProvider");
|
|
642
604
|
}
|
|
643
|
-
|
|
644
605
|
var sTargetHash = oNavigationContext.innerAppRoute,
|
|
645
|
-
|
|
606
|
+
oRouterProxy = oAppComponent.getRouterProxy();
|
|
646
607
|
var sLclHashTracker = "";
|
|
647
608
|
var bDirty;
|
|
648
609
|
var bSessionON = oInternalModel.getProperty("/sessionOn");
|
|
649
|
-
|
|
650
610
|
if (!bSessionON) {
|
|
651
611
|
// If the sticky session was terminated before hand.
|
|
652
612
|
// Eexample in case of navigating away from application using IBN.
|
|
653
613
|
return undefined;
|
|
654
614
|
}
|
|
655
|
-
|
|
656
615
|
if (!oRouterProxy.isNavigationFinalized()) {
|
|
657
616
|
// If navigation is currently happening in RouterProxy, it's a transient state
|
|
658
617
|
// (not dirty)
|
|
@@ -670,7 +629,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
670
629
|
// the user attempts to navigate within the app, for example back to the list report
|
|
671
630
|
bDirty = true;
|
|
672
631
|
}
|
|
673
|
-
|
|
674
632
|
if (bDirty) {
|
|
675
633
|
// the FLP doesn't call the dirty state provider anymore once it's dirty, as they can't
|
|
676
634
|
// change this due to compatibility reasons we set it back to not-dirty
|
|
@@ -680,7 +638,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
680
638
|
} else {
|
|
681
639
|
sHashTracker = sLclHashTracker;
|
|
682
640
|
}
|
|
683
|
-
|
|
684
641
|
return bDirty;
|
|
685
642
|
} catch (error) {
|
|
686
643
|
Log.info(error);
|
|
@@ -688,19 +645,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
688
645
|
}
|
|
689
646
|
};
|
|
690
647
|
};
|
|
691
|
-
|
|
692
648
|
_proto._attachSessionTimeout = function _attachSessionTimeout(oContext, i18nModel) {
|
|
693
649
|
var _this9 = this;
|
|
694
|
-
|
|
695
650
|
return function () {
|
|
696
651
|
try {
|
|
697
652
|
if (oContext === undefined) {
|
|
698
653
|
throw new Error("Context missing for function fnHandleSessionTimeout");
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
|
|
654
|
+
}
|
|
655
|
+
// remove transient messages since we will showing our own message
|
|
702
656
|
_this9.getMessageHandler().removeTransitionMessages();
|
|
703
|
-
|
|
704
657
|
var oDialog = new Dialog({
|
|
705
658
|
title: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_TITLE}",
|
|
706
659
|
state: "Warning",
|
|
@@ -713,7 +666,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
713
666
|
press: function () {
|
|
714
667
|
// remove sticky handling after navigation since session has already been terminated
|
|
715
668
|
_this9.handleStickyOff();
|
|
716
|
-
|
|
717
669
|
_this9.getRoutingListener().navigateBackFromContext(oContext);
|
|
718
670
|
}
|
|
719
671
|
}),
|
|
@@ -723,33 +675,27 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
723
675
|
});
|
|
724
676
|
oDialog.addStyleClass("sapUiContentPadding");
|
|
725
677
|
oDialog.setModel(i18nModel, "sap.fe.i18n");
|
|
726
|
-
|
|
727
678
|
_this9.getView().addDependent(oDialog);
|
|
728
|
-
|
|
729
679
|
oDialog.open();
|
|
730
680
|
} catch (error) {
|
|
731
681
|
Log.info(error);
|
|
732
682
|
return undefined;
|
|
733
683
|
}
|
|
734
|
-
|
|
735
684
|
return true;
|
|
736
685
|
};
|
|
737
686
|
};
|
|
738
|
-
|
|
739
687
|
_proto._attachRouteMatched = function _attachRouteMatched(oFnContext, oContext, oAppComponent) {
|
|
740
688
|
return function fnStickyDiscardAfterNavigation() {
|
|
741
|
-
var sCurrentHash = oAppComponent.getRouterProxy().getHash();
|
|
742
|
-
|
|
689
|
+
var sCurrentHash = oAppComponent.getRouterProxy().getHash();
|
|
690
|
+
// either current hash is empty so the user left the app or he navigated away from the object
|
|
743
691
|
if (!sCurrentHash || !oAppComponent.getRouterProxy().checkHashWithGuard(sCurrentHash)) {
|
|
744
692
|
oFnContext.discardStickySession(oContext);
|
|
745
693
|
}
|
|
746
694
|
};
|
|
747
695
|
};
|
|
748
|
-
|
|
749
696
|
_proto.scrollAndFocusOnInactiveRow = function scrollAndFocusOnInactiveRow(oTable) {
|
|
750
697
|
var oRowBinding = oTable.getRowBinding();
|
|
751
698
|
var iActiveRowIndex = oRowBinding.getCount() || 0;
|
|
752
|
-
|
|
753
699
|
if (iActiveRowIndex > 0) {
|
|
754
700
|
oTable.scrollToIndex(iActiveRowIndex - 1);
|
|
755
701
|
oTable.focusRow(iActiveRowIndex, true);
|
|
@@ -757,9 +703,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
757
703
|
oTable.focusRow(iActiveRowIndex, true);
|
|
758
704
|
}
|
|
759
705
|
};
|
|
760
|
-
|
|
761
706
|
return InternalEditFlow;
|
|
762
|
-
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "
|
|
707
|
+
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createMultipleDocuments", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "createMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "computeEditMode", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "computeEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setEditMode", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "setEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setDraftStatus", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "setDraftStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRoutingListener", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "getRoutingListener"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getGlobalUIModel", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "getGlobalUIModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "syncTask", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "syncTask"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getProgrammingModel", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "getProgrammingModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocumentTransaction", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocumentTransaction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleCreateEvents", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "handleCreateEvents"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getTransactionHelper", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "getTransactionHelper"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getInternalModel", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "getInternalModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createActionPromise", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "createActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getCurrentActionPromise", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "getCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteCurrentActionPromise", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getActionResponseDataAndKeys", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "getActionResponseDataAndKeys"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getMessageHandler", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "getMessageHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOn", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOn"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOff", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOff"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBackNavigationInSession", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "onBackNavigationInSession"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "discardStickySession", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "discardStickySession"), _class2.prototype)), _class2)) || _class);
|
|
763
708
|
return InternalEditFlow;
|
|
764
709
|
}, false);
|
|
765
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiUHJvZ3JhbW1pbmdNb2RlbCIsIkZFTGlicmFyeSIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJDcmVhdGlvbk1vZGUiLCJJbnRlcm5hbEVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInByaXZhdGVFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwib25Jbml0IiwiX29BcHBDb21wb25lbnQiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50Iiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwib0xpc3RCaW5kaW5nIiwiYURhdGEiLCJiQ3JlYXRlQXRFbmQiLCJiRnJvbUNvcHlQYXN0ZSIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiYkluYWN0aXZlIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Mb2NrT2JqZWN0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiQnVzeUxvY2tlciIsImxvY2siLCJhRmluYWxDb250ZXh0cyIsInN5bmNUYXNrIiwiY29udGV4dFBhdGgiLCJnZXRQYXRoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzTWV0YVBhdGgiLCJnZXRDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJhQ3JlYXRpb25Qcm9taXNlcyIsIm1hcCIsIm1Qcm9wZXJ0eVZhbHVlcyIsIm1QYXJhbWV0ZXJzIiwiZGF0YSIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwicGFyZW50Q29udHJvbCIsImNyZWF0ZUF0RW5kIiwiaW5hY3RpdmUiLCJzUHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiZ2V0T2JqZWN0IiwiJGtpbmQiLCJjcmVhdGVEb2N1bWVudCIsImdldE1lc3NhZ2VIYW5kbGVyIiwiYWxsIiwiYUNvbnRleHRzIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwicmVqZWN0IiwiZmluYWxseSIsInVubG9jayIsImRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzIiwib0NvbnRyb2wiLCJieUlkIiwiY29udHJvbElkIiwiRXJyb3IiLCJnZXRCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwib1Jlc3VsdCIsImlzQSIsImNsZWFyU2VsZWN0aW9uIiwiaXNSb290IiwiYXR0YWNoRXZlbnRPbmNlIiwicmVmcmVzaCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5Iiwic2VuZCIsIkFjdGl2aXR5IiwiRGVsZXRlIiwiY29udGV4dCIsIm9FcnJvciIsImNvbXB1dGVFZGl0TW9kZSIsIm9Db250ZXh0Iiwic0N1c3RvbUFjdGlvbiIsImdldEludGVybmFsTW9kZWwiLCJnZXRQcm9wZXJ0eSIsInNQcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIkRyYWZ0Iiwic2V0RHJhZnRTdGF0dXMiLCJDbGVhciIsInJlcXVlc3RPYmplY3QiLCJiSXNBY3RpdmVFbnRpdHkiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwiYkhhc0FjdGl2ZUVudGl0eSIsInVuZGVmaW5lZCIsIkRpc3BsYXkiLCJTdGlja3kiLCJfaGFzTmV3QWN0aW9uRm9yU3RpY2t5IiwiX2JDcmVhdGVNb2RlIiwiaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zIiwiaGFuZGxlU3RpY2t5T24iLCJzZXRQcm9wZXJ0eSIsInNFZGl0TW9kZSIsIm9HbG9iYWxNb2RlbCIsInNEcmFmdFN0YXRlIiwiZ2V0Um91dGluZ0xpc3RlbmVyIiwiX3JvdXRpbmciLCJ2VGFzayIsImZuTmV3VGFzayIsIl9wVGFza3MiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImRlbGV0ZURvY3VtZW50IiwiYmluZCIsImludGVybmFsTW9kZWwiLCJvQmluZGluZyIsImF0dGFjaEV2ZW50IiwiU2F2aW5nIiwib0V2ZW50IiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJTYXZlZCIsInNob3dNZXNzYWdlRGlhbG9nIiwiX29UcmFuc2FjdGlvbkhlbHBlciIsIlRyYW5zYWN0aW9uSGVscGVyIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsInNBY3Rpb25OYW1lIiwic0NvbnRyb2xJZCIsImZSZXNvbHZlciIsImZSZWplY3RvciIsIm9BY3Rpb25Qcm9taXNlIiwib1Jlc3BvbnNlIiwiT2JqZWN0IiwiYXNzaWduIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ2YWx1ZSIsIm9WaWV3IiwiZ2V0RGF0YSIsInNBY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsImFLZXkiLCIkS2V5Iiwib0RhdGEiLCJrZXlzIiwibWVzc2FnZUhhbmRsZXIiLCJvQXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJzSGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwib0ludGVybmFsTW9kZWwiLCJzZXRUaW1lb3V0Iiwic2V0TmF2aWdhdGlvbkd1YXJkIiwic3Vic3RyaW5nIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwib25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsImZuRGlydHlTdGF0ZVByb3ZpZGVyIiwiX3JlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwicmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJpMThuTW9kZWwiLCJmbkhhbmRsZVNlc3Npb25UaW1lb3V0IiwiX2F0dGFjaFNlc3Npb25UaW1lb3V0IiwiYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJmblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24iLCJfYXR0YWNoUm91dGVNYXRjaGVkIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJpbmZvIiwiaGFuZGxlU3RpY2t5T2ZmIiwiZGlzY2FyZE5hdmlnYXRpb25HdWFyZCIsImRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJkZXRhY2hTZXNzaW9uVGltZW91dCIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIm9Sb3V0ZXJQcm94eSIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwic3RpY2t5IiwicHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJoaXN0b3J5IiwiYmFjayIsImRpc2NhcmREb2N1bWVudCIsImluZGV4T2YiLCJvU3RpY2t5U2Vzc2lvbiIsIk5ld0FjdGlvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiZmluZCIsInNBZGRpdGlvbmFsQWN0aW9uIiwib05hdmlnYXRpb25Db250ZXh0Iiwic1RhcmdldEhhc2giLCJpbm5lckFwcFJvdXRlIiwic0xjbEhhc2hUcmFja2VyIiwiYkRpcnR5IiwiYlNlc3Npb25PTiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJvRm5Db250ZXh0Iiwic0N1cnJlbnRIYXNoIiwic2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwib1RhYmxlIiwib1Jvd0JpbmRpbmciLCJpQWN0aXZlUm93SW5kZXgiLCJnZXRDb3VudCIsInNjcm9sbFRvSW5kZXgiLCJmb2N1c1JvdyIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHNlbmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0ZXh0ZW5zaWJsZSxcblx0ZmluYWxFeHRlbnNpb24sXG5cdG1ldGhvZE92ZXJyaWRlLFxuXHRwcml2YXRlRXh0ZW5zaW9uLFxuXHRwdWJsaWNFeHRlbnNpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuXG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0Q3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1wiKVxuY2xhc3MgSW50ZXJuYWxFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9wVGFza3M6IGFueTtcblx0cHJpdmF0ZSBvQWN0aW9uUHJvbWlzZT86IFByb21pc2U8YW55Pjtcblx0cHJpdmF0ZSBfb1RyYW5zYWN0aW9uSGVscGVyPzogVHJhbnNhY3Rpb25IZWxwZXI7XG5cdHByaXZhdGUgZm5EaXJ0eVN0YXRlUHJvdmlkZXI/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBmbkhhbmRsZVNlc3Npb25UaW1lb3V0PzogRnVuY3Rpb247XG5cdHByaXZhdGUgZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE92ZXJyaWRlIHRvIHNldCB0aGUgY3JlYXRpb24gbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3cjc2V0Q3JlYXRpb25Nb2RlXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0c2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGU6IGJvb2xlYW4pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdG9MaXN0QmluZGluZzogYW55LFxuXHRcdGFEYXRhOiBhbnksXG5cdFx0YkNyZWF0ZUF0RW5kOiBhbnksXG5cdFx0YkZyb21Db3B5UGFzdGU6IGJvb2xlYW4sXG5cdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IGFueSxcblx0XHRiSW5hY3RpdmUgPSBmYWxzZVxuXHQpIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlO1xuXG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRsZXQgYUZpbmFsQ29udGV4dHM6IGFueVtdID0gW107XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gYmVmb3JlQ3JlYXRlQ2FsbEJhY2tcblx0XHRcdFx0XHQ/IGJlZm9yZUNyZWF0ZUNhbGxCYWNrKHsgY29udGV4dFBhdGg6IG9MaXN0QmluZGluZyAmJiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH0pXG5cdFx0XHRcdFx0OiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblxuXHRcdFx0XHRpZiAob0xpc3RCaW5kaW5nLmdldENvbnRleHQoKSkge1xuXHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7b0xpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCl9LyR7b0xpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMob0xpc3RCaW5kaW5nKTtcblxuXHRcdFx0XHQvLyBJdGVyYXRlIG9uIGFsbCBpdGVtcyBhbmQgc3RvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY3JlYXRpb24gcHJvbWlzZVxuXHRcdFx0XHRjb25zdCBhQ3JlYXRpb25Qcm9taXNlcyA9IGFEYXRhLm1hcCgobVByb3BlcnR5VmFsdWVzOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBtUGFyYW1ldGVyczogYW55ID0geyBkYXRhOiB7fSB9O1xuXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID0gXCJOb25lXCI7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93O1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGJDcmVhdGVBdEVuZDtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbmFjdGl2ZSA9IGJJbmFjdGl2ZTtcblxuXHRcdFx0XHRcdC8vIFJlbW92ZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBkZWVwIGNyZWF0ZVxuXHRcdFx0XHRcdGZvciAoY29uc3Qgc1Byb3BlcnR5UGF0aCBpbiBtUHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgbVByb3BlcnR5VmFsdWVzW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFbc1Byb3BlcnR5UGF0aF0gPSBtUHJvcGVydHlWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0XHRiRnJvbUNvcHlQYXN0ZSxcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFDcmVhdGlvblByb21pc2VzKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnkpIHtcblx0XHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRcdGFGaW5hbENvbnRleHRzID0gYUNvbnRleHRzO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0YUNvbnRleHRzLm1hcChmdW5jdGlvbiAob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvTmV3Q29udGV4dC5iSW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KG9MaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyBtdWx0aXBsZSBkb2N1bWVudHMuXCIpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhRmluYWxDb250ZXh0cztcblx0XHRcdH0pO1xuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3Qgb0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0aWYgKCFvQ29udHJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyIGNvbnRyb2xJZCBtaXNzaW5nIG9yIGluY29ycmVjdFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IG9Db250cm9sO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvQ29udHJvbC5nZXRCaW5kaW5nKFwiaXRlbXNcIikgfHwgKChvQ29udHJvbCBhcyBUYWJsZSkuZ2V0Um93QmluZGluZygpIGFzIGFueSk7XG5cdFx0bVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IHRydWU7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblxuXHRcdHJldHVybiB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oYUNvbnRleHRzLCBtUGFyYW1ldGVycylcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0bGV0IG9SZXN1bHQ7XG5cblx0XHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0XHRpZiAob0NvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdChvQ29udHJvbCBhcyBhbnkpLmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGlmICgob0xpc3RCaW5kaW5nIGFzIGFueSkuaXNSb290KCkpIHtcblx0XHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRcdG9SZXN1bHQgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9MaXN0QmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdFx0c2VuZChcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRBY3Rpdml0eS5EZWxldGUsXG5cdFx0XHRcdFx0YUNvbnRleHRzLm1hcCgoY29udGV4dDogQ29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnQocylcIiwgb0Vycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY2lkZXMgaWYgYSBkb2N1bWVudCBpcyB0byBiZSBzaG93biBpbiBkaXNwbGF5IG9yIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jb21wdXRlRWRpdE1vZGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgZGlzcGxheWVkIG9yIGVkaXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0IG1vZGUgaXMgY29tcHV0ZWRcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNvbXB1dGVFZGl0TW9kZShvQ29udGV4dDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc0N1c3RvbUFjdGlvbiA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIik7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0XHRjb25zdCBiSXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdGlmIChiSXNBY3RpdmVFbnRpdHkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0Ly8gaW4gY2FzZSB0aGUgZG9jdW1lbnQgaXMgZHJhZnQgc2V0IGl0IGluIGVkaXQgbW9kZVxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRcdFx0XHRcdGNvbnN0IGJIYXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhYkhhc0FjdGl2ZUVudGl0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYWN0aXZlIGRvY3VtZW50LCBzdGF5IG9uIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZXRlcm1pbmluZyB0aGUgZWRpdE1vZGUgZm9yIGRyYWZ0XCIsIG9FcnJvcik7XG5cdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0aWYgKHNDdXN0b21BY3Rpb24gJiYgc0N1c3RvbUFjdGlvbiAhPT0gXCJcIiAmJiB0aGlzLl9oYXNOZXdBY3Rpb25Gb3JTdGlja3kob0NvbnRleHQsIHRoaXMuZ2V0VmlldygpLCBzQ3VzdG9tQWN0aW9uKSkge1xuXHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCB0cnVlKTtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24ob0NvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9zQ3VzdG9tQWN0aW9uXCIsIFwiXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRWRpdE1vZGVcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGUgQ3JlYXRlTW9kZSBmbGFnIHRvIGlkZW50aWZ5IHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2V0RWRpdE1vZGUoc0VkaXRNb2RlPzogc3RyaW5nLCBiQ3JlYXRpb25Nb2RlPzogYm9vbGVhbikge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0Y29uc3Qgb0dsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHRpZiAoc0VkaXRNb2RlKSB7XG5cdFx0XHRvR2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiLCBzRWRpdE1vZGUgPT09IFwiRWRpdGFibGVcIiwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAoYkNyZWF0aW9uTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGUpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzZXREcmFmdFN0YXR1cyhzRHJhZnRTdGF0ZTogYW55KSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbCkuc2V0UHJvcGVydHkoXCIvZHJhZnRTdGF0dXNcIiwgc0RyYWZ0U3RhdGUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0Um91dGluZ0xpc3RlbmVyKCkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIEZQTSBjdXN0b20gcGFnZXMgYW5kIHRoZSByb3V0aW5nXG5cdFx0Ly8gbGlzdGVuZXIgaXMgbm90IHlldCBwdWJsaWMgdGhlcmVmb3JlIGtlZXAgdGhlIGxvZ2ljIGhlcmUgZm9yIG5vd1xuXG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBlcmZvcm1zIGEgdGFzayBpbiBzeW5jIHdpdGggb3RoZXIgdGFza3MgY3JlYXRlZCB2aWEgdGhpcyBmdW5jdGlvbi5cblx0ICogUmV0dXJucyB0aGUgcHJvbWlzZSBjaGFpbiBvZiB0aGUgdGFzay5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3N5bmNUYXNrXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBbdlRhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzeW5jVGFzayh2VGFzaz86IEZ1bmN0aW9uIHwgUHJvbWlzZTxhbnk+KSB7XG5cdFx0bGV0IGZuTmV3VGFzaztcblx0XHRpZiAodlRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB2VGFzaztcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdlRhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0Zm5OZXdUYXNrID0gdlRhc2s7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcFRhc2tzID0gdGhpcy5fcFRhc2tzIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmIChmbk5ld1Rhc2spIHtcblx0XHRcdHRoaXMuX3BUYXNrcyA9IHRoaXMuX3BUYXNrcy50aGVuKGZuTmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fcFRhc2tzO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ/OiBhbnkpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHRcdFx0PyBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKVxuXHRcdFx0OiBudWxsO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50LmJpbmQodHJhbnNhY3Rpb25IZWxwZXIsIG9Db250ZXh0LCBtUGFyYW1ldGVycywgb1Jlc291cmNlQnVuZGxlLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpXG5cdFx0XHQpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQ6IHNob3dzIG1lc3NhZ2VzIGFuZCBpbiBjYXNlIG9mIGEgZHJhZnQsIHVwZGF0ZXMgdGhlIGRyYWZ0IGluZGljYXRvci5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQmluZGluZyBPRGF0YSBsaXN0IGJpbmRpbmcgb2JqZWN0XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0b0JpbmRpbmcgPSAob0JpbmRpbmcuZ2V0QmluZGluZyAmJiBvQmluZGluZy5nZXRCaW5kaW5nKCkpIHx8IG9CaW5kaW5nO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9CaW5kaW5nKTtcblxuXHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHR0cmFuc2FjdGlvbkhlbHBlci5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoYlN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdH0pO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFRyYW5zYWN0aW9uSGVscGVyKCkge1xuXHRcdGlmICghdGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyKSB7XG5cdFx0XHQvLyBjdXJyZW50bHkgYWxzbyB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGlzIGxvY2tpbmcgdGhlcmVmb3JlIHBhc3NpbmcgbG9jayBvYmplY3Rcblx0XHRcdHRoaXMuX29UcmFuc2FjdGlvbkhlbHBlciA9IG5ldyBUcmFuc2FjdGlvbkhlbHBlcih0aGlzLl9vQXBwQ29tcG9uZW50LCB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX29UcmFuc2FjdGlvbkhlbHBlcjtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHRvIHdhaXQgZm9yIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NyZWF0ZUFjdGlvblByb21pc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZTogYW55LCBzQ29udHJvbElkOiBhbnkpIHtcblx0XHRsZXQgZlJlc29sdmVyLCBmUmVqZWN0b3I7XG5cdFx0dGhpcy5vQWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGZSZXNvbHZlciA9IHJlc29sdmU7XG5cdFx0XHRmUmVqZWN0b3IgPSByZWplY3Q7XG5cdFx0fSkudGhlbigob1Jlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKHsgY29udHJvbElkOiBzQ29udHJvbElkIH0sIHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgb1Jlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiBmUmVzb2x2ZXIsIGZSZWplY3RvcjogZlJlamVjdG9yIH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZ2V0Q3VycmVudEFjdGlvblByb21pc2Ugb2JqZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEN1cnJlbnRBY3Rpb25Qcm9taXNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwcm9taXNlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0Q3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMub0FjdGlvblByb21pc2U7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0dGhpcy5vQWN0aW9uUHJvbWlzZSA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5c1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMgT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvUmVzcG9uc2U6IGFueSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9SZXNwb25zZSkpIHtcblx0XHRcdGlmIChvUmVzcG9uc2UubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdG9SZXNwb25zZSA9IG9SZXNwb25zZVswXS52YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIW9SZXNwb25zZSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRvTWV0YU1vZGVsID0gKG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KS5nZXREYXRhKCksXG5cdFx0XHRzQWN0aW9uUmV0dXJuVHlwZSA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbFtzQWN0aW9uTmFtZV0gJiYgb01ldGFNb2RlbFtzQWN0aW9uTmFtZV1bMF0gJiYgb01ldGFNb2RlbFtzQWN0aW9uTmFtZV1bMF0uJFJldHVyblR5cGVcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlLiRUeXBlXG5cdFx0XHRcdFx0OiBudWxsLFxuXHRcdFx0YUtleSA9IHNBY3Rpb25SZXR1cm5UeXBlICYmIG9NZXRhTW9kZWxbc0FjdGlvblJldHVyblR5cGVdID8gb01ldGFNb2RlbFtzQWN0aW9uUmV0dXJuVHlwZV0uJEtleSA6IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b0RhdGE6IG9SZXNwb25zZS5nZXRPYmplY3QoKSxcblx0XHRcdGtleXM6IGFLZXlcblx0XHR9O1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldE1lc3NhZ2VIYW5kbGVyKCkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIEZQTSBjdXN0b20gcGFnZXMgdGhlcmVmb3JlIGtlZXBcblx0XHQvLyB0aGUgbG9naWMgaGVyZSBmb3Igbm93XG5cblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRoYW5kbGVTdGlja3lPbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQgfHwgb0NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IG9yIENvbnRleHQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIW9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5oYXNOYXZpZ2F0aW9uR3VhcmQoKSkge1xuXHRcdFx0XHRjb25zdCBzSGFzaFRyYWNrZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpLFxuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQob0NvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cdFx0XHRcdH0sIDApO1xuXG5cdFx0XHRcdC8vIFNldHRpbmcgYmFjayBuYXZpZ2F0aW9uIG9uIHNoZWxsIHNlcnZpY2UsIHRvIGdldCB0aGUgZGljYXJkIG1lc3NhZ2UgYm94IGluIGNhc2Ugb2Ygc3RpY2t5XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHR0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyID0gdGhpcy5fcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIob0FwcENvbXBvbmVudCwgb0ludGVybmFsTW9kZWwsIHNIYXNoVHJhY2tlcik7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpO1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzZXNzaW9uIHRpbWVvdXRcblx0XHRcdFx0Y29uc3QgaTE4bk1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0ID0gdGhpcy5fYXR0YWNoU2Vzc2lvblRpbWVvdXQob0NvbnRleHQsIGkxOG5Nb2RlbCk7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIGFueSkuYXR0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0KTtcblxuXHRcdFx0XHR0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiA9IHRoaXMuX2F0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLCBvQ29udGV4dCwgb0FwcENvbXBvbmVudCk7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5mblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aGFuZGxlU3RpY2t5T2ZmKCkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQgJiYgb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpIHtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyKTtcblx0XHRcdFx0dGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgJiYgdGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0KSB7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIGFueSkuZGV0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5mbkhhbmRsZVNlc3Npb25UaW1lb3V0KTtcblx0XHRcdH1cblxuXHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbik7XG5cdFx0XHR0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLl9iQ3JlYXRlTW9kZSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uIE1ldGhvZCB0byBkaXNwbGF5IGEgJ2Rpc2NhcmQnIHBvcG92ZXIgd2hlbiBleGl0aW5nIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0b25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0b0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyksXG5cdFx0XHRvUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAob1JvdXRlclByb3h5LmNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCkpIHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9WaWV3ICYmIG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdHN0aWNreS5wcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9WaWV3LFxuXHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0JpbmRpbmdDb250ZXh0KVxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRoaXN0b3J5LmJhY2soKTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dDogYW55KSB7XG5cdFx0c3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0fVxuXG5cdF9oYXNOZXdBY3Rpb25Gb3JTdGlja3kob0NvbnRleHQ6IGFueSwgb1ZpZXc6IFZpZXcsIHNDdXN0b21BY3Rpb246IHN0cmluZykge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0NvbnRleHQgPT09IHVuZGVmaW5lZCB8fCBvVmlldyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gX2hhc05ld0FjdGlvbkZvclN0aWNreVwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMCwgb0NvbnRleHQuZ2V0UGF0aCgpLmluZGV4T2YoXCIoXCIpKSxcblx0XHRcdFx0b1N0aWNreVNlc3Npb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZGApO1xuXG5cdFx0XHRpZiAob1N0aWNreVNlc3Npb24gJiYgb1N0aWNreVNlc3Npb24uTmV3QWN0aW9uICYmIG9TdGlja3lTZXNzaW9uLk5ld0FjdGlvbiA9PT0gc0N1c3RvbUFjdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAob1N0aWNreVNlc3Npb24gJiYgb1N0aWNreVNlc3Npb24uQWRkaXRpb25hbE5ld0FjdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHNDdXN0b21BY3Rpb24gPT09XG5cdFx0XHRcdFx0b1N0aWNreVNlc3Npb24uQWRkaXRpb25hbE5ld0FjdGlvbnMuZmluZChmdW5jdGlvbiAoc0FkZGl0aW9uYWxBY3Rpb246IHN0cmluZykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNBZGRpdGlvbmFsQWN0aW9uID09PSBzQ3VzdG9tQWN0aW9uO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiBmYWxzZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0X3JlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgb0ludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgc0hhc2hUcmFja2VyOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24gZm5EaXJ0eVN0YXRlUHJvdmlkZXIob05hdmlnYXRpb25Db250ZXh0OiBhbnkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChvTmF2aWdhdGlvbkNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gZm5EaXJ0eVN0YXRlUHJvdmlkZXJcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzVGFyZ2V0SGFzaCA9IG9OYXZpZ2F0aW9uQ29udGV4dC5pbm5lckFwcFJvdXRlLFxuXHRcdFx0XHRcdG9Sb3V0ZXJQcm94eSA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IHNMY2xIYXNoVHJhY2tlciA9IFwiXCI7XG5cdFx0XHRcdGxldCBiRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGJTZXNzaW9uT04gPSBvSW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFiU2Vzc2lvbk9OKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHN0aWNreSBzZXNzaW9uIHdhcyB0ZXJtaW5hdGVkIGJlZm9yZSBoYW5kLlxuXHRcdFx0XHRcdC8vIEVleGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIW9Sb3V0ZXJQcm94eS5pc05hdmlnYXRpb25GaW5hbGl6ZWQoKSkge1xuXHRcdFx0XHRcdC8vIElmIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGhhcHBlbmluZyBpbiBSb3V0ZXJQcm94eSwgaXQncyBhIHRyYW5zaWVudCBzdGF0ZVxuXHRcdFx0XHRcdC8vIChub3QgZGlydHkpXG5cdFx0XHRcdFx0YkRpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0c0xjbEhhc2hUcmFja2VyID0gc1RhcmdldEhhc2g7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0hhc2hUcmFja2VyID09PSBzVGFyZ2V0SGFzaCkge1xuXHRcdFx0XHRcdC8vIHRoZSBoYXNoIGRpZG4ndCBjaGFuZ2Ugc28gZWl0aGVyIHRoZSB1c2VyIGF0dGVtcHRzIHRvIHJlZnJlc2ggb3IgdG8gbGVhdmUgdGhlIGFwcFxuXHRcdFx0XHRcdGJEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAob1JvdXRlclByb3h5LmNoZWNrSGFzaFdpdGhHdWFyZChzVGFyZ2V0SGFzaCkgfHwgb1JvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdHNMY2xIYXNoVHJhY2tlciA9IHNUYXJnZXRIYXNoO1xuXHRcdFx0XHRcdGJEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgYXBwLCBmb3IgZXhhbXBsZSBiYWNrIHRvIHRoZSBsaXN0IHJlcG9ydFxuXHRcdFx0XHRcdGJEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYkRpcnR5KSB7XG5cdFx0XHRcdFx0Ly8gdGhlIEZMUCBkb2Vzbid0IGNhbGwgdGhlIGRpcnR5IHN0YXRlIHByb3ZpZGVyIGFueW1vcmUgb25jZSBpdCdzIGRpcnR5LCBhcyB0aGV5IGNhbid0XG5cdFx0XHRcdFx0Ly8gY2hhbmdlIHRoaXMgZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzZXQgaXQgYmFjayB0byBub3QtZGlydHlcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0hhc2hUcmFja2VyID0gc0xjbEhhc2hUcmFja2VyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGJEaXJ0eTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdF9hdHRhY2hTZXNzaW9uVGltZW91dChvQ29udGV4dDogYW55LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBtaXNzaW5nIGZvciBmdW5jdGlvbiBmbkhhbmRsZVNlc3Npb25UaW1lb3V0XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChpMThuTW9kZWwsIFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLmFkZERlcGVuZGVudChvRGlhbG9nKTtcblx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fVxuXG5cdF9hdHRhY2hSb3V0ZU1hdGNoZWQob0ZuQ29udGV4dDogYW55LCBvQ29udGV4dDogYW55LCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24gZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKCkge1xuXHRcdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdC8vIGVpdGhlciBjdXJyZW50IGhhc2ggaXMgZW1wdHkgc28gdGhlIHVzZXIgbGVmdCB0aGUgYXBwIG9yIGhlIG5hdmlnYXRlZCBhd2F5IGZyb20gdGhlIG9iamVjdFxuXHRcdFx0aWYgKCFzQ3VycmVudEhhc2ggfHwgIW9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoc0N1cnJlbnRIYXNoKSkge1xuXHRcdFx0XHRvRm5Db250ZXh0LmRpc2NhcmRTdGlja3lTZXNzaW9uKG9Db250ZXh0KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cdHNjcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyhvVGFibGU6IFRhYmxlKSB7XG5cdFx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0Y29uc3QgaUFjdGl2ZVJvd0luZGV4ID0gb1Jvd0JpbmRpbmcuZ2V0Q291bnQoKSB8fCAwO1xuXHRcdGlmIChpQWN0aXZlUm93SW5kZXggPiAwKSB7XG5cdFx0XHRvVGFibGUuc2Nyb2xsVG9JbmRleChpQWN0aXZlUm93SW5kZXggLSAxKTtcblx0XHRcdG9UYWJsZS5mb2N1c1JvdyhpQWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvVGFibGUuZm9jdXNSb3coaUFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxFZGl0RmxvdztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0VBa2pCTyxnQkFBZ0JBLElBQWhCLEVBQXNCQyxPQUF0QixFQUErQjtJQUNyQyxJQUFJO01BQ0gsSUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0lBQ0EsQ0FGRCxDQUVFLE9BQU1HLENBQU4sRUFBUztNQUNWLE9BQU9GLE9B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
|
|
710
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiUHJvZ3JhbW1pbmdNb2RlbCIsIkZFTGlicmFyeSIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJDcmVhdGlvbk1vZGUiLCJJbnRlcm5hbEVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwib25Jbml0IiwiX29BcHBDb21wb25lbnQiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50Iiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsInVpTW9kZWxDb250ZXh0IiwiZ2V0VmlldyIsImdldEJpbmRpbmdDb250ZXh0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsInNldFByb3BlcnR5IiwiZ2V0Q3JlYXRpb25Nb2RlIiwiZ2V0UHJvcGVydHkiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJzZXREb2N1bWVudE1vZGlmaWVkIiwibW9kaWZpZWQiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJsaXN0QmluZGluZyIsImlzUmVsYXRpdmUiLCJjcmVhdGVNdWx0aXBsZURvY3VtZW50cyIsIm9MaXN0QmluZGluZyIsImFEYXRhIiwiYkNyZWF0ZUF0RW5kIiwiYkZyb21Db3B5UGFzdGUiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsImJJbmFjdGl2ZSIsInRyYW5zYWN0aW9uSGVscGVyIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJvTG9ja09iamVjdCIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldENvbnRyb2xsZXIiLCJCdXN5TG9ja2VyIiwibG9jayIsImFGaW5hbENvbnRleHRzIiwic3luY1Rhc2siLCJjb250ZXh0UGF0aCIsImdldFBhdGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldENvbnRleHQiLCJnZXRNZXRhUGF0aCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsImFDcmVhdGlvblByb21pc2VzIiwibWFwIiwibVByb3BlcnR5VmFsdWVzIiwibVBhcmFtZXRlcnMiLCJkYXRhIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImJ1c3lNb2RlIiwiY3JlYXRpb25Nb2RlIiwiQ3JlYXRpb25Sb3ciLCJwYXJlbnRDb250cm9sIiwiY3JlYXRlQXRFbmQiLCJpbmFjdGl2ZSIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCJnZXRPYmplY3QiLCIka2luZCIsImNyZWF0ZURvY3VtZW50IiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJhbGwiLCJhQ29udGV4dHMiLCJvTmV3Q29udGV4dCIsImNyZWF0ZWQiLCJvQmluZGluZ0NvbnRleHQiLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwicmVqZWN0IiwiZmluYWxseSIsInVubG9jayIsImRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzIiwib0NvbnRyb2wiLCJieUlkIiwiY29udHJvbElkIiwiRXJyb3IiLCJnZXRCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwib1Jlc3VsdCIsImlzQSIsImNsZWFyU2VsZWN0aW9uIiwiaXNSb290IiwiYXR0YWNoRXZlbnRPbmNlIiwicmVmcmVzaCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5Iiwic2VuZCIsIkFjdGl2aXR5IiwiRGVsZXRlIiwiY29udGV4dCIsIm9FcnJvciIsImNvbXB1dGVFZGl0TW9kZSIsIm9Db250ZXh0Iiwic1Byb2dyYW1taW5nTW9kZWwiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwiRHJhZnQiLCJzZXREcmFmdFN0YXR1cyIsIkNsZWFyIiwiX3NldEVkaXRhYmxlUGVuZGluZyIsInJlcXVlc3RPYmplY3QiLCJiSXNBY3RpdmVFbnRpdHkiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwiYkhhc0FjdGl2ZUVudGl0eSIsInVuZGVmaW5lZCIsIkRpc3BsYXkiLCJTdGlja3kiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJnZXRJbnRlcm5hbE1vZGVsIiwiX2hhc05ld0FjdGlvbkZvclN0aWNreSIsImhhbmRsZVN0aWNreU9uIiwic0VkaXRNb2RlIiwib0dsb2JhbE1vZGVsIiwicGVuZGluZyIsImdsb2JhbE1vZGVsIiwic0RyYWZ0U3RhdGUiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJfcm91dGluZyIsInZUYXNrIiwiZm5OZXdUYXNrIiwiX3BUYXNrcyIsImludGVybmFsTW9kZWxDb250ZXh0Iiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZGVsZXRlRG9jdW1lbnQiLCJiaW5kIiwiaW50ZXJuYWxNb2RlbCIsIm9CaW5kaW5nIiwiYXR0YWNoRXZlbnQiLCJTYXZpbmciLCJvRXZlbnQiLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsIlNhdmVkIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJfb1RyYW5zYWN0aW9uSGVscGVyIiwiVHJhbnNhY3Rpb25IZWxwZXIiLCJjcmVhdGVBY3Rpb25Qcm9taXNlIiwic0FjdGlvbk5hbWUiLCJzQ29udHJvbElkIiwiZlJlc29sdmVyIiwiZlJlamVjdG9yIiwib0FjdGlvblByb21pc2UiLCJvUmVzcG9uc2UiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInZhbHVlIiwib1ZpZXciLCJnZXREYXRhIiwic0FjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiYUtleSIsIiRLZXkiLCJvRGF0YSIsImtleXMiLCJtZXNzYWdlSGFuZGxlciIsIm9BcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsImhhc05hdmlnYXRpb25HdWFyZCIsInNIYXNoVHJhY2tlciIsImdldEhhc2giLCJvSW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiZm5EaXJ0eVN0YXRlUHJvdmlkZXIiLCJfcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsImZuSGFuZGxlU2Vzc2lvblRpbWVvdXQiLCJfYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJhdHRhY2hTZXNzaW9uVGltZW91dCIsImZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiIsIl9hdHRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImluZm8iLCJoYW5kbGVTdGlja3lPZmYiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRldGFjaFNlc3Npb25UaW1lb3V0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwib1JvdXRlclByb3h5IiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJzdGlja3kiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImhpc3RvcnkiLCJiYWNrIiwiZGlzY2FyZERvY3VtZW50Iiwic0N1c3RvbUFjdGlvbiIsImluZGV4T2YiLCJvU3RpY2t5U2Vzc2lvbiIsIk5ld0FjdGlvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiZmluZCIsInNBZGRpdGlvbmFsQWN0aW9uIiwib05hdmlnYXRpb25Db250ZXh0Iiwic1RhcmdldEhhc2giLCJpbm5lckFwcFJvdXRlIiwic0xjbEhhc2hUcmFja2VyIiwiYkRpcnR5IiwiYlNlc3Npb25PTiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJvRm5Db250ZXh0Iiwic0N1cnJlbnRIYXNoIiwic2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwib1RhYmxlIiwib1Jvd0JpbmRpbmciLCJpQWN0aXZlUm93SW5kZXgiLCJnZXRDb3VudCIsInNjcm9sbFRvSW5kZXgiLCJmb2N1c1JvdyIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHNlbmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5cbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbCxcblx0RHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXMsXG5cdEVkaXRNb2RlID0gRkVMaWJyYXJ5LkVkaXRNb2RlLFxuXHRDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XCIpXG5jbGFzcyBJbnRlcm5hbEVkaXRGbG93IGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX3BUYXNrczogYW55O1xuXHRwcml2YXRlIG9BY3Rpb25Qcm9taXNlPzogUHJvbWlzZTxhbnk+O1xuXHRwcml2YXRlIF9vVHJhbnNhY3Rpb25IZWxwZXI/OiBUcmFuc2FjdGlvbkhlbHBlcjtcblx0cHJpdmF0ZSBmbkRpcnR5U3RhdGVQcm92aWRlcj86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXQ/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBmblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24/OiBGdW5jdGlvbjtcblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCkge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGUgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0c2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGU6IGJvb2xlYW4pIHtcblx0XHRjb25zdCB1aU1vZGVsQ29udGV4dCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKSBhcyBDb250ZXh0O1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFwiY3JlYXRlTW9kZVwiLCBiQ3JlYXRpb25Nb2RlLCB1aU1vZGVsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0Z2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHVpTW9kZWxDb250ZXh0ID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpIGFzIENvbnRleHQ7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCJjcmVhdGVNb2RlXCIsIHVpTW9kZWxDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdGlzRG9jdW1lbnRNb2RpZmllZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9pc0RvY3VtZW50TW9kaWZpZWRcIik7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZC5cblx0ICpcblx0ICogQHBhcmFtIG1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0c2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbikge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFwiL2lzRG9jdW1lbnRNb2RpZmllZFwiLCBtb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGNyZWF0aW5nIGEgc3ViLW9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgb24gd2hpY2ggdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0b0xpc3RCaW5kaW5nOiBhbnksXG5cdFx0YURhdGE6IGFueSxcblx0XHRiQ3JlYXRlQXRFbmQ6IGFueSxcblx0XHRiRnJvbUNvcHlQYXN0ZTogYm9vbGVhbixcblx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogYW55LFxuXHRcdGJJbmFjdGl2ZSA9IGZhbHNlXG5cdCkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdGxldCBhRmluYWxDb250ZXh0czogYW55W10gPSBbXTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBiZWZvcmVDcmVhdGVDYWxsQmFja1xuXHRcdFx0XHRcdD8gYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCkgfSlcblx0XHRcdFx0XHQ6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0xpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHtvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0xpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXG5cdFx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRcdGNvbnN0IGFDcmVhdGlvblByb21pc2VzID0gYURhdGEubWFwKChtUHJvcGVydHlWYWx1ZXM6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSB7IGRhdGE6IHt9IH07XG5cblx0XHRcdFx0XHRtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuYnVzeU1vZGUgPSBcIk5vbmVcIjtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID0gYkNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmluYWN0aXZlID0gYkluYWN0aXZlO1xuXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcyB3ZSBkb24ndCBzdXBwb3J0IGRlZXAgY3JlYXRlXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzUHJvcGVydHlQYXRoIGluIG1Qcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiBtUHJvcGVydHlWYWx1ZXNbc1Byb3BlcnR5UGF0aF0pIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YVtzUHJvcGVydHlQYXRoXSA9IG1Qcm9wZXJ0eVZhbHVlc1tzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRcdGJGcm9tQ29weVBhc3RlLFxuXHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYUNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChhQ29udGV4dHM6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoIWJJbmFjdGl2ZSkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRcdGFGaW5hbENvbnRleHRzID0gYUNvbnRleHRzO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0YUNvbnRleHRzLm1hcChmdW5jdGlvbiAob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvTmV3Q29udGV4dC5iSW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KG9MaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyBtdWx0aXBsZSBkb2N1bWVudHMuXCIpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhRmluYWxDb250ZXh0cztcblx0XHRcdH0pO1xuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3Qgb0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0aWYgKCFvQ29udHJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyIGNvbnRyb2xJZCBtaXNzaW5nIG9yIGluY29ycmVjdFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IG9Db250cm9sO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSAob0NvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChvQ29udHJvbCBhcyBUYWJsZSkuZ2V0Um93QmluZGluZygpKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSB0cnVlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGFDb250ZXh0cywgbVBhcmFtZXRlcnMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGxldCBvUmVzdWx0O1xuXG5cdFx0XHRcdC8vIE11bHRpcGxlIG9iamVjdCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhIGxpc3Rcblx0XHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdFx0aWYgKG9Db250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHQob0NvbnRyb2wgYXMgYW55KS5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVGhlbiByZWZyZXNoIHRoZSBsaXN0LWJpbmRpbmcgKExSKSwgb3IgcmVxdWlyZSBzaWRlLWVmZmVjdHMgKE9QKVxuXHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRpZiAoKG9MaXN0QmluZGluZyBhcyBhbnkpLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0XHRvUmVzdWx0ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdG9MaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvQmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gZGVsZXRpbmcgYXQgbGVhc3Qgb25lIG9iamVjdCBzaG91bGQgYWxzbyBzZXQgdGhlIFVJIHRvIGRpcnR5XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXG5cdFx0XHRcdHNlbmQoXG5cdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0QWN0aXZpdHkuRGVsZXRlLFxuXHRcdFx0XHRcdGFDb250ZXh0cy5tYXAoKGNvbnRleHQ6IENvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdHJldHVybiBvUmVzdWx0O1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50KHMpXCIsIG9FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNpZGVzIGlmIGEgZG9jdW1lbnQgaXMgdG8gYmUgc2hvd24gaW4gZGlzcGxheSBvciBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY29tcHV0ZUVkaXRNb2RlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc3BsYXllZCBvciBlZGl0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdCBtb2RlIGlzIGNvbXB1dGVkXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjb21wdXRlRWRpdE1vZGUob0NvbnRleHQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdHRoaXMuX3NldEVkaXRhYmxlUGVuZGluZyh0cnVlKTtcblx0XHRcdFx0Y29uc3QgYklzQWN0aXZlRW50aXR5ID0gYXdhaXQgb0NvbnRleHQucmVxdWVzdE9iamVjdChcIklzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRpZiAoYklzQWN0aXZlRW50aXR5ID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdC8vIGluIGNhc2UgdGhlIGRvY3VtZW50IGlzIGRyYWZ0IHNldCBpdCBpbiBlZGl0IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRjb25zdCBiSGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgb0NvbnRleHQucmVxdWVzdE9iamVjdChcIkhhc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKHVuZGVmaW5lZCwgIWJIYXNBY3RpdmVFbnRpdHkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFjdGl2ZSBkb2N1bWVudCwgc3RheSBvbiBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zZXRFZGl0YWJsZVBlbmRpbmcoZmFsc2UpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGV0ZXJtaW5pbmcgdGhlIGVkaXRNb2RlIGZvciBkcmFmdFwiLCBvRXJyb3IpO1xuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGxhc3RJbnZva2VkQWN0aW9uTmFtZSA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIpO1xuXHRcdFx0aWYgKGxhc3RJbnZva2VkQWN0aW9uTmFtZSAmJiB0aGlzLl9oYXNOZXdBY3Rpb25Gb3JTdGlja3kob0NvbnRleHQsIHRoaXMuZ2V0VmlldygpLCBsYXN0SW52b2tlZEFjdGlvbk5hbWUpKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihvQ29udGV4dCk7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIHNFZGl0TW9kZVxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBDcmVhdGVNb2RlIGZsYWcgdG8gaWRlbnRpZnkgdGhlIGNyZWF0aW9uIG1vZGVcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzZXRFZGl0TW9kZShzRWRpdE1vZGU/OiBzdHJpbmcsIGJDcmVhdGlvbk1vZGU/OiBib29sZWFuKSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBvR2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdGlmIChzRWRpdE1vZGUpIHtcblx0XHRcdG9HbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIHNFZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmIChiQ3JlYXRpb25Nb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZSk7XG5cdFx0fVxuXHR9XG5cblx0X3NldEVkaXRhYmxlUGVuZGluZyhwZW5kaW5nOiBib29sZWFuKSB7XG5cdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCBwZW5kaW5nLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHNldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlOiBhbnkpIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBzRHJhZnRTdGF0ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRSb3V0aW5nTGlzdGVuZXIoKSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgRlBNIGN1c3RvbSBwYWdlcyBhbmQgdGhlIHJvdXRpbmdcblx0XHQvLyBsaXN0ZW5lciBpcyBub3QgeWV0IHB1YmxpYyB0aGVyZWZvcmUga2VlcCB0aGUgbG9naWMgaGVyZSBmb3Igbm93XG5cblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc3luY1Rhc2tcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIFt2VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHN5bmNUYXNrKHZUYXNrPzogRnVuY3Rpb24gfCBQcm9taXNlPGFueT4pIHtcblx0XHRsZXQgZm5OZXdUYXNrO1xuXHRcdGlmICh2VGFzayBpbnN0YW5jZW9mIFByb21pc2UpIHtcblx0XHRcdGZuTmV3VGFzayA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHZUYXNrO1xuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSB2VGFzaztcblx0XHR9XG5cblx0XHR0aGlzLl9wVGFza3MgPSB0aGlzLl9wVGFza3MgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKGZuTmV3VGFzaykge1xuXHRcdFx0dGhpcy5fcFRhc2tzID0gdGhpcy5fcFRhc2tzLnRoZW4oZm5OZXdUYXNrKS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9wVGFza3M7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dD86IGFueSk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHR0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuY29udHJvbElkXG5cdFx0XHQ/IHNhcC51aS5nZXRDb3JlKCkuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpXG5cdFx0XHQ6IG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQuYmluZCh0cmFuc2FjdGlvbkhlbHBlciwgb0NvbnRleHQsIG1QYXJhbWV0ZXJzLCBvUmVzb3VyY2VCdW5kbGUsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSlcblx0XHRcdClcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZSBldmVudDogc2hvd3MgbWVzc2FnZXMgYW5kIGluIGNhc2Ugb2YgYSBkcmFmdCwgdXBkYXRlcyB0aGUgZHJhZnQgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9CaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRoYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmc6IGFueSkge1xuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0b0JpbmRpbmcgPSAob0JpbmRpbmcuZ2V0QmluZGluZyAmJiBvQmluZGluZy5nZXRCaW5kaW5nKCkpIHx8IG9CaW5kaW5nO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9CaW5kaW5nKTtcblxuXHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlQ29tcGxldGVkXCIsIChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKGJTdWNjZXNzID8gRHJhZnRTdGF0dXMuU2F2ZWQgOiBEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHR9KTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRUcmFuc2FjdGlvbkhlbHBlcigpIHtcblx0XHRpZiAoIXRoaXMuX29UcmFuc2FjdGlvbkhlbHBlcikge1xuXHRcdFx0Ly8gY3VycmVudGx5IGFsc28gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBpcyBsb2NraW5nIHRoZXJlZm9yZSBwYXNzaW5nIGxvY2sgb2JqZWN0XG5cdFx0XHR0aGlzLl9vVHJhbnNhY3Rpb25IZWxwZXIgPSBuZXcgVHJhbnNhY3Rpb25IZWxwZXIodGhpcy5fb0FwcENvbXBvbmVudCwgdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9vVHJhbnNhY3Rpb25IZWxwZXI7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0SW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jcmVhdGVBY3Rpb25Qcm9taXNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGNyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWU6IGFueSwgc0NvbnRyb2xJZDogYW55KSB7XG5cdFx0bGV0IGZSZXNvbHZlciwgZlJlamVjdG9yO1xuXHRcdHRoaXMub0FjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRmUmVzb2x2ZXIgPSByZXNvbHZlO1xuXHRcdFx0ZlJlamVjdG9yID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKG9SZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7IGNvbnRyb2xJZDogc0NvbnRyb2xJZCB9LCB0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiB7IGZSZXNvbHZlcjogZlJlc29sdmVyLCBmUmVqZWN0b3I6IGZSZWplY3RvciB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIG9iamVjdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRDdXJyZW50QWN0aW9uUHJvbWlzZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcHJvbWlzZVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCkge1xuXHRcdHJldHVybiB0aGlzLm9BY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCkge1xuXHRcdHRoaXMub0FjdGlvblByb21pc2UgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRoYXQgaXMgZXhlY3V0ZWRcblx0ICogQHBhcmFtIG9SZXNwb25zZSBUaGUgYm91bmQgYWN0aW9uJ3MgcmVzcG9uc2UgZGF0YSBvciByZXNwb25zZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRhdGEgYW5kIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzIG9mIHRoZSByZXNwb25zZVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWU6IHN0cmluZywgb1Jlc3BvbnNlOiBhbnkpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShvUmVzcG9uc2UpKSB7XG5cdFx0XHRpZiAob1Jlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRvUmVzcG9uc2UgPSBvUmVzcG9uc2VbMF0udmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFvUmVzcG9uc2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0b01ldGFNb2RlbCA9IChvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSkuZ2V0RGF0YSgpLFxuXHRcdFx0c0FjdGlvblJldHVyblR5cGUgPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdICYmIG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdWzBdICYmIG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsW3NBY3Rpb25OYW1lXVswXS4kUmV0dXJuVHlwZS4kVHlwZVxuXHRcdFx0XHRcdDogbnVsbCxcblx0XHRcdGFLZXkgPSBzQWN0aW9uUmV0dXJuVHlwZSAmJiBvTWV0YU1vZGVsW3NBY3Rpb25SZXR1cm5UeXBlXSA/IG9NZXRhTW9kZWxbc0FjdGlvblJldHVyblR5cGVdLiRLZXkgOiBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9EYXRhOiBvUmVzcG9uc2UuZ2V0T2JqZWN0KCksXG5cdFx0XHRrZXlzOiBhS2V5XG5cdFx0fTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRNZXNzYWdlSGFuZGxlcigpIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBGUE0gY3VzdG9tIHBhZ2VzIHRoZXJlZm9yZSBrZWVwXG5cdFx0Ly8gdGhlIGxvZ2ljIGhlcmUgZm9yIG5vd1xuXG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aGFuZGxlU3RpY2t5T24ob0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkIHx8IG9Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBvciBDb250ZXh0IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPblwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaGFzTmF2aWdhdGlvbkd1YXJkKCkpIHtcblx0XHRcdFx0Y29uc3Qgc0hhc2hUcmFja2VyID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKSxcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXG5cdFx0XHRcdC8vIFNldCBhIGd1YXJkIGluIHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHQvLyBBIHRpbWVvdXQgaXMgbmVjZXNzYXJ5LCBhcyB3aXRoIGRlZmVycmVkIGNyZWF0aW9uIHRoZSBoYXNoQ2hhbmdlciBpcyBub3QgdXBkYXRlZCB5ZXQgd2l0aFxuXHRcdFx0XHQvLyB0aGUgbmV3IGhhc2gsIGFuZCB0aGUgZ3VhcmQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnkgb2YgdGhlIHJvdXRlciBwcm94eVxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0TmF2aWdhdGlvbkd1YXJkKG9Db250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbih0aGlzLm9uQmFja05hdmlnYXRpb25JblNlc3Npb24uYmluZCh0aGlzKSk7XG5cblx0XHRcdFx0dGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlciA9IHRoaXMuX3JlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKG9BcHBDb21wb25lbnQsIG9JbnRlcm5hbE1vZGVsLCBzSGFzaFRyYWNrZXIpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyKTtcblxuXHRcdFx0XHQvLyBoYW5kbGUgc2Vzc2lvbiB0aW1lb3V0XG5cdFx0XHRcdGNvbnN0IGkxOG5Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuZm5IYW5kbGVTZXNzaW9uVGltZW91dCA9IHRoaXMuX2F0dGFjaFNlc3Npb25UaW1lb3V0KG9Db250ZXh0LCBpMThuTW9kZWwpO1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSBhcyBhbnkpLmF0dGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuZm5IYW5kbGVTZXNzaW9uVGltZW91dCk7XG5cblx0XHRcdFx0dGhpcy5mblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24gPSB0aGlzLl9hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcywgb0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGhhbmRsZVN0aWNreU9mZigpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPZmZcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQXBwQ29tcG9uZW50ICYmIG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5kaXNjYXJkTmF2aWdhdGlvbkd1YXJkKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyKSB7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLmRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cdFx0XHRcdHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpICYmIHRoaXMuZm5IYW5kbGVTZXNzaW9uVGltZW91dCkge1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSBhcyBhbnkpLmRldGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuZm5IYW5kbGVTZXNzaW9uVGltZW91dCk7XG5cdFx0XHR9XG5cblx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5mblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24pO1xuXHRcdFx0dGhpcy5mblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24gPSB1bmRlZmluZWQ7XG5cblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvbiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG9uQmFja05hdmlnYXRpb25JblNlc3Npb24oKSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpLFxuXHRcdFx0b1JvdXRlclByb3h5ID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKG9Sb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvVmlldyAmJiBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHRzdGlja3kucHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvVmlldyxcblx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9CaW5kaW5nQ29udGV4dClcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGlzdG9yeS5iYWNrKCk7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQ6IGFueSkge1xuXHRcdHN0aWNreS5kaXNjYXJkRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdH1cblxuXHRfaGFzTmV3QWN0aW9uRm9yU3RpY2t5KG9Db250ZXh0OiBhbnksIG9WaWV3OiBWaWV3LCBzQ3VzdG9tQWN0aW9uOiBzdHJpbmcpIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9Db250ZXh0ID09PSB1bmRlZmluZWQgfHwgb1ZpZXcgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIF9oYXNOZXdBY3Rpb25Gb3JTdGlja3lcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDAsIG9Db250ZXh0LmdldFBhdGgoKS5pbmRleE9mKFwiKFwiKSksXG5cdFx0XHRcdG9TdGlja3lTZXNzaW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRgKTtcblxuXHRcdFx0aWYgKG9TdGlja3lTZXNzaW9uICYmIG9TdGlja3lTZXNzaW9uLk5ld0FjdGlvbiAmJiBvU3RpY2t5U2Vzc2lvbi5OZXdBY3Rpb24gPT09IHNDdXN0b21BY3Rpb24pIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKG9TdGlja3lTZXNzaW9uICYmIG9TdGlja3lTZXNzaW9uLkFkZGl0aW9uYWxOZXdBY3Rpb25zKSB7XG5cdFx0XHRcdHJldHVybiBzQ3VzdG9tQWN0aW9uID09PVxuXHRcdFx0XHRcdG9TdGlja3lTZXNzaW9uLkFkZGl0aW9uYWxOZXdBY3Rpb25zLmZpbmQoZnVuY3Rpb24gKHNBZGRpdGlvbmFsQWN0aW9uOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzQWRkaXRpb25hbEFjdGlvbiA9PT0gc0N1c3RvbUFjdGlvbjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogZmFsc2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdF9yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIG9JbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIHNIYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGZuRGlydHlTdGF0ZVByb3ZpZGVyKG9OYXZpZ2F0aW9uQ29udGV4dDogYW55KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAob05hdmlnYXRpb25Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIGZuRGlydHlTdGF0ZVByb3ZpZGVyXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgc1RhcmdldEhhc2ggPSBvTmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZSxcblx0XHRcdFx0XHRvUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cdFx0XHRcdGxldCBzTGNsSGFzaFRyYWNrZXIgPSBcIlwiO1xuXHRcdFx0XHRsZXQgYkRpcnR5OiBib29sZWFuO1xuXHRcdFx0XHRjb25zdCBiU2Vzc2lvbk9OID0gb0ludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0XHRcdGlmICghYlNlc3Npb25PTikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFZXhhbXBsZSBpbiBjYXNlIG9mIG5hdmlnYXRpbmcgYXdheSBmcm9tIGFwcGxpY2F0aW9uIHVzaW5nIElCTi5cblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFvUm91dGVyUHJveHkuaXNOYXZpZ2F0aW9uRmluYWxpemVkKCkpIHtcblx0XHRcdFx0XHQvLyBJZiBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBoYXBwZW5pbmcgaW4gUm91dGVyUHJveHksIGl0J3MgYSB0cmFuc2llbnQgc3RhdGVcblx0XHRcdFx0XHQvLyAobm90IGRpcnR5KVxuXHRcdFx0XHRcdGJEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHRcdHNMY2xIYXNoVHJhY2tlciA9IHNUYXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNIYXNoVHJhY2tlciA9PT0gc1RhcmdldEhhc2gpIHtcblx0XHRcdFx0XHQvLyB0aGUgaGFzaCBkaWRuJ3QgY2hhbmdlIHNvIGVpdGhlciB0aGUgdXNlciBhdHRlbXB0cyB0byByZWZyZXNoIG9yIHRvIGxlYXZlIHRoZSBhcHBcblx0XHRcdFx0XHRiRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9Sb3V0ZXJQcm94eS5jaGVja0hhc2hXaXRoR3VhcmQoc1RhcmdldEhhc2gpIHx8IG9Sb3V0ZXJQcm94eS5pc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIHJvb3Qgb2JqZWN0XG5cdFx0XHRcdFx0Ly8gb3IgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBhbHJlYWR5IGJlZW4gYWxsb3dlZCBieSB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0XHRzTGNsSGFzaFRyYWNrZXIgPSBzVGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRiRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIGFwcCwgZm9yIGV4YW1wbGUgYmFjayB0byB0aGUgbGlzdCByZXBvcnRcblx0XHRcdFx0XHRiRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGJEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXREaXJ0eUZsYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNIYXNoVHJhY2tlciA9IHNMY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBiRGlydHk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRfYXR0YWNoU2Vzc2lvblRpbWVvdXQob0NvbnRleHQ6IGFueSwgaTE4bk1vZGVsOiBNb2RlbCkge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAob0NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgbWlzc2luZyBmb3IgZnVuY3Rpb24gZm5IYW5kbGVTZXNzaW9uVGltZW91dFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyByZW1vdmUgdHJhbnNpZW50IG1lc3NhZ2VzIHNpbmNlIHdlIHdpbGwgc2hvd2luZyBvdXIgb3duIG1lc3NhZ2Vcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX1RJVExFfVwiLFxuXHRcdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7IHRleHQ6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19NRVNTQUdFfVwiIH0pLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IFwie3NhcC5mZS5pMThuPkNfQ09NTU9OX0RJQUxPR19PS31cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIHN0aWNreSBoYW5kbGluZyBhZnRlciBuYXZpZ2F0aW9uIHNpbmNlIHNlc3Npb24gaGFzIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkXG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwoaTE4bk1vZGVsLCBcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdH1cblxuXHRfYXR0YWNoUm91dGVNYXRjaGVkKG9GbkNvbnRleHQ6IGFueSwgb0NvbnRleHQ6IGFueSwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbigpIHtcblx0XHRcdGNvbnN0IHNDdXJyZW50SGFzaCA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHQvLyBlaXRoZXIgY3VycmVudCBoYXNoIGlzIGVtcHR5IHNvIHRoZSB1c2VyIGxlZnQgdGhlIGFwcCBvciBoZSBuYXZpZ2F0ZWQgYXdheSBmcm9tIHRoZSBvYmplY3Rcblx0XHRcdGlmICghc0N1cnJlbnRIYXNoIHx8ICFvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuY2hlY2tIYXNoV2l0aEd1YXJkKHNDdXJyZW50SGFzaCkpIHtcblx0XHRcdFx0b0ZuQ29udGV4dC5kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRzY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3cob1RhYmxlOiBUYWJsZSkge1xuXHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdGNvbnN0IGlBY3RpdmVSb3dJbmRleCA9IG9Sb3dCaW5kaW5nLmdldENvdW50KCkgfHwgMDtcblx0XHRpZiAoaUFjdGl2ZVJvd0luZGV4ID4gMCkge1xuXHRcdFx0b1RhYmxlLnNjcm9sbFRvSW5kZXgoaUFjdGl2ZVJvd0luZGV4IC0gMSk7XG5cdFx0XHRvVGFibGUuZm9jdXNSb3coaUFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1RhYmxlLmZvY3VzUm93KGlBY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsRWRpdEZsb3c7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0VBa2pCTyxnQkFBZ0JBLElBQUksRUFBRUMsT0FBTyxFQUFFO0lBQ3JDLElBQUk7TUFDSCxJQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBRTtJQUNwQixDQUFDLENBQUMsT0FBTUcsQ0FBQyxFQUFFO01BQ1YsT0FBT0YsT0FBTyxDQUFDRSxDQUFDLENBQUM7SUFDbEI7SUFDQSxJQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBSSxFQUFFO01BQzFCLE9BQU9GLE1BQU0sQ0FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFSCxPQUFPLENBQUM7SUFDcEM7SUFDQSxPQUFPQyxNQUFNO0VBQ2Q7RUFBQztFQUFBO0VBQUE7RUFwaUJELElBQU1HLGdCQUFnQixHQUFHQyxTQUFTLENBQUNELGdCQUFnQjtJQUNs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
|