@sapui5/sap.fe.core 1.99.0 → 1.101.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -4
- package/src/sap/fe/core/.library +2 -3
- package/src/sap/fe/core/AnnotationHelper.js +43 -92
- package/src/sap/fe/core/AnnotationHelper.ts +43 -107
- package/src/sap/fe/core/AppComponent.js +381 -399
- package/src/sap/fe/core/AppComponent.ts +397 -0
- package/src/sap/fe/core/AppStateHandler.js +131 -162
- package/src/sap/fe/core/AppStateHandler.ts +2 -2
- package/src/sap/fe/core/BaseController.js +82 -58
- package/src/sap/fe/core/BaseController.ts +67 -0
- package/src/sap/fe/core/CommonUtils.js +179 -31
- package/src/sap/fe/core/CommonUtils.ts +295 -125
- package/src/sap/fe/core/ExtensionAPI.js +279 -274
- package/src/sap/fe/core/ExtensionAPI.ts +242 -0
- package/src/sap/fe/core/PageController.js +158 -29
- package/src/sap/fe/core/PageController.ts +65 -37
- package/src/sap/fe/core/RouterProxy.js +700 -750
- package/src/sap/fe/core/RouterProxy.ts +47 -31
- package/src/sap/fe/core/Synchronization.js +21 -31
- package/src/sap/fe/core/TemplateComponent.js +193 -118
- package/src/sap/fe/core/TemplateComponent.ts +104 -109
- package/src/sap/fe/core/TemplateModel.js +24 -44
- package/src/sap/fe/core/TemplateModel.ts +3 -3
- package/src/sap/fe/core/TransactionHelper.js +1368 -1369
- package/src/sap/fe/core/TransactionHelper.ts +201 -171
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +406 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +362 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +146 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +129 -0
- package/src/sap/fe/core/actions/collaboration/Manage.js +264 -0
- package/src/sap/fe/core/actions/collaboration/Manage.ts +246 -0
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +100 -0
- package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
- package/src/sap/fe/core/actions/draft.js +324 -220
- package/src/sap/fe/core/actions/draft.ts +209 -133
- package/src/sap/fe/core/actions/messageHandling.js +79 -48
- package/src/sap/fe/core/actions/messageHandling.ts +113 -83
- package/src/sap/fe/core/actions/operations.js +37 -18
- package/src/sap/fe/core/actions/operations.ts +51 -20
- package/src/sap/fe/core/actions/sticky.js +17 -4
- package/src/sap/fe/core/actions/sticky.ts +21 -4
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +707 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +628 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1854 -1669
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +1792 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +60 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +716 -779
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +785 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +810 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1056 -1005
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1001 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +498 -532
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +13 -12
- package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +155 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +221 -244
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +215 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +312 -345
- package/src/sap/fe/core/controllerextensions/PageReady.ts +57 -53
- package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
- package/src/sap/fe/core/controllerextensions/Paginator.ts +169 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +149 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
- package/src/sap/fe/core/controllerextensions/Routing.ts +131 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
- package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Share.js +230 -268
- package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +603 -644
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +68 -68
- package/src/sap/fe/core/controllerextensions/ViewState.js +774 -806
- package/src/sap/fe/core/controllerextensions/ViewState.ts +796 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
- package/src/sap/fe/core/controls/Any.js +28 -0
- package/src/sap/fe/core/controls/Any.ts +30 -0
- package/src/sap/fe/core/controls/CommandExecution.js +92 -68
- package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +165 -79
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +74 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +366 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +278 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +167 -125
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +116 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +44 -5
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +163 -122
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +155 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +212 -141
- package/src/sap/fe/core/controls/FieldWrapper.ts +104 -0
- package/src/sap/fe/core/controls/FileWrapper.js +313 -0
- package/src/sap/fe/core/controls/FileWrapper.ts +169 -0
- package/src/sap/fe/core/controls/FilterBar.js +197 -159
- package/src/sap/fe/core/controls/FilterBar.ts +148 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +100 -39
- package/src/sap/fe/core/controls/FormElementWrapper.ts +37 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +147 -115
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +102 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +300 -265
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +252 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +185 -140
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +37 -42
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +75 -74
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +71 -0
- package/src/sap/fe/core/converters/ConverterContext.js +348 -379
- package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
- package/src/sap/fe/core/converters/ManifestSettings.js +13 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +17 -2
- package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
- package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
- package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +26 -13
- package/src/sap/fe/core/converters/annotations/DataField.ts +40 -17
- package/src/sap/fe/core/converters/controls/Common/Action.js +10 -10
- package/src/sap/fe/core/converters/controls/Common/Action.ts +20 -19
- package/src/sap/fe/core/converters/controls/Common/Chart.js +8 -8
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +12 -11
- package/src/sap/fe/core/converters/controls/Common/Form.js +6 -6
- package/src/sap/fe/core/converters/controls/Common/Form.ts +7 -3
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +326 -86
- package/src/sap/fe/core/converters/controls/Common/Table.ts +384 -167
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +120 -55
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +158 -98
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +206 -223
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +263 -287
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +5 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +4 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
- package/src/sap/fe/core/converters/helpers/Key.js +42 -57
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +51 -27
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +69 -43
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +42 -25
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +91 -65
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +11 -9
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +8 -8
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
- package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
- package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
- package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
- package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
- package/src/sap/fe/core/fpm/Component.js +80 -55
- package/src/sap/fe/core/fpm/Component.ts +43 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
- package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
- package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +307 -166
- package/src/sap/fe/core/helpers/ClassSupport.ts +348 -155
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +735 -684
- package/src/sap/fe/core/helpers/MassEditHelper.ts +803 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +53 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +46 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
- package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +7 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +7 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +0 -4
- package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
- package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
- package/src/sap/fe/core/library.js +425 -451
- package/src/sap/fe/core/library.support.js +22 -33
- package/src/sap/fe/core/library.support.ts +23 -0
- package/src/sap/fe/core/library.ts +420 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -4
- package/src/sap/fe/core/messagebundle.properties +45 -13
- package/src/sap/fe/core/messagebundle_ar.properties +29 -7
- package/src/sap/fe/core/messagebundle_bg.properties +29 -7
- package/src/sap/fe/core/messagebundle_ca.properties +29 -7
- package/src/sap/fe/core/messagebundle_cs.properties +29 -7
- package/src/sap/fe/core/messagebundle_cy.properties +29 -7
- package/src/sap/fe/core/messagebundle_da.properties +29 -7
- package/src/sap/fe/core/messagebundle_de.properties +29 -7
- package/src/sap/fe/core/messagebundle_el.properties +29 -7
- package/src/sap/fe/core/messagebundle_en.properties +29 -7
- package/src/sap/fe/core/messagebundle_en_GB.properties +29 -7
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +29 -7
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +29 -7
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +29 -7
- package/src/sap/fe/core/messagebundle_es.properties +29 -7
- package/src/sap/fe/core/messagebundle_es_MX.properties +29 -7
- package/src/sap/fe/core/messagebundle_et.properties +29 -7
- package/src/sap/fe/core/messagebundle_fi.properties +30 -8
- package/src/sap/fe/core/messagebundle_fr.properties +31 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +31 -9
- package/src/sap/fe/core/messagebundle_hi.properties +29 -7
- package/src/sap/fe/core/messagebundle_hr.properties +29 -7
- package/src/sap/fe/core/messagebundle_hu.properties +29 -7
- package/src/sap/fe/core/messagebundle_id.properties +29 -7
- package/src/sap/fe/core/messagebundle_it.properties +29 -7
- package/src/sap/fe/core/messagebundle_iw.properties +29 -7
- package/src/sap/fe/core/messagebundle_ja.properties +28 -6
- package/src/sap/fe/core/messagebundle_kk.properties +29 -7
- package/src/sap/fe/core/messagebundle_ko.properties +29 -7
- package/src/sap/fe/core/messagebundle_lt.properties +29 -7
- package/src/sap/fe/core/messagebundle_lv.properties +30 -8
- package/src/sap/fe/core/messagebundle_ms.properties +29 -7
- package/src/sap/fe/core/messagebundle_nl.properties +29 -7
- package/src/sap/fe/core/messagebundle_no.properties +29 -7
- package/src/sap/fe/core/messagebundle_pl.properties +29 -7
- package/src/sap/fe/core/messagebundle_pt.properties +30 -8
- package/src/sap/fe/core/messagebundle_pt_PT.properties +29 -7
- package/src/sap/fe/core/messagebundle_ro.properties +29 -7
- package/src/sap/fe/core/messagebundle_ru.properties +29 -7
- package/src/sap/fe/core/messagebundle_sh.properties +29 -7
- package/src/sap/fe/core/messagebundle_sk.properties +29 -7
- package/src/sap/fe/core/messagebundle_sl.properties +29 -7
- package/src/sap/fe/core/messagebundle_sv.properties +30 -8
- package/src/sap/fe/core/messagebundle_th.properties +28 -6
- package/src/sap/fe/core/messagebundle_tr.properties +32 -10
- package/src/sap/fe/core/messagebundle_uk.properties +29 -7
- package/src/sap/fe/core/messagebundle_vi.properties +29 -7
- package/src/sap/fe/core/messagebundle_zh_CN.properties +29 -7
- package/src/sap/fe/core/messagebundle_zh_TW.properties +29 -7
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +47 -73
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +158 -196
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +5 -6
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +70 -96
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
- package/src/sap/fe/core/services/NavigationServiceFactory.js +287 -342
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +11 -14
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +70 -105
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +6 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.js +796 -820
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +62 -53
- package/src/sap/fe/core/services/ShellServicesFactory.js +694 -741
- package/src/sap/fe/core/services/ShellServicesFactory.ts +33 -33
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +570 -595
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +23 -4
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +357 -389
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +25 -29
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +7 -4
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +1 -4
- package/src/sap/fe/core/support/Diagnostics.js +36 -48
- package/src/sap/fe/core/templating/DataModelPathHelper.js +91 -90
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +126 -123
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +26 -5
- package/src/sap/fe/core/templating/FilterHelper.js +25 -32
- package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
- package/src/sap/fe/core/templating/PropertyHelper.js +16 -2
- package/src/sap/fe/core/templating/PropertyHelper.ts +31 -24
- package/src/sap/fe/core/templating/UIFormatters.js +150 -44
- package/src/sap/fe/core/templating/UIFormatters.ts +165 -67
- package/src/sap/fe/core/type/Email.js +26 -8
- package/src/sap/fe/core/type/Email.ts +8 -7
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -75
|
@@ -1,809 +1,777 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
5
4
|
*/
|
|
6
|
-
sap.ui.define(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
* @alias sap.fe.core.controllerextensions.ViewState#applyNavigationParameters
|
|
779
|
-
* @protected
|
|
780
|
-
*/
|
|
781
|
-
applyNavigationParameters: function(oNavParameter, aPromises) {
|
|
782
|
-
// to be overridden if needed
|
|
783
|
-
},
|
|
784
|
-
|
|
785
|
-
/**
|
|
786
|
-
* Applying the given state to the given control.
|
|
787
|
-
*
|
|
788
|
-
* @param {sap.ui.base.ManagedObject} oControl The object to apply the given state
|
|
789
|
-
* @param {object} oControlState The state for the given control
|
|
790
|
-
* @param {object} oNavParameters The current navigation parameters
|
|
791
|
-
* @returns {any} Return a promise for async state handling
|
|
792
|
-
*/
|
|
793
|
-
applyControlState: function(oControl, oControlState, oNavParameters) {
|
|
794
|
-
var aControlStateHandlers = this.getControlStateHandler(oControl),
|
|
795
|
-
oPromiseChain = Promise.resolve(),
|
|
796
|
-
that = this;
|
|
797
|
-
aControlStateHandlers.forEach(function(mControlStateHandler) {
|
|
798
|
-
if (typeof mControlStateHandler.apply !== "function") {
|
|
799
|
-
throw new Error("controlStateHandler.apply is not a function for control: " + oControl.getMetadata().getName());
|
|
800
|
-
}
|
|
801
|
-
oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(that, oControl, oControlState, oNavParameters));
|
|
802
|
-
});
|
|
803
|
-
return oPromiseChain;
|
|
804
|
-
}
|
|
805
|
-
});
|
|
806
|
-
|
|
807
|
-
return ViewState;
|
|
808
|
-
}
|
|
809
|
-
);
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/navigation/library", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/fl/apply/api/ControlVariantApplyAPI", "sap/ui/mdc/p13n/StateUtil"], function (Log, mergeObjects, CommonUtils, ClassSupport, KeepAliveHelper, ModelHelper, NavLibrary, ControllerExtension, OverrideExecution, ControlVariantApplyAPI, StateUtil) {
|
|
6
|
+
"use strict";
|
|
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, _class, _class2;
|
|
9
|
+
|
|
10
|
+
var publicExtension = ClassSupport.publicExtension;
|
|
11
|
+
var privateExtension = ClassSupport.privateExtension;
|
|
12
|
+
var finalExtension = ClassSupport.finalExtension;
|
|
13
|
+
var extensible = ClassSupport.extensible;
|
|
14
|
+
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
15
|
+
|
|
16
|
+
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
17
|
+
|
|
18
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
19
|
+
|
|
20
|
+
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; }
|
|
21
|
+
|
|
22
|
+
// additionalStates are stored next to control IDs, so name clash avoidance needed. Fortunately IDs have restrictions:
|
|
23
|
+
// "Allowed is a sequence of characters (capital/lowercase), digits, underscores, dashes, points and/or colons."
|
|
24
|
+
// Therefore adding a symbol like # or @
|
|
25
|
+
var ADDITIONAL_STATES_KEY = "#additionalStates",
|
|
26
|
+
NavType = NavLibrary.NavType; ///////////////////////////////////////////////////////////////////
|
|
27
|
+
// methods to retrieve & apply states for the different controls //
|
|
28
|
+
///////////////////////////////////////////////////////////////////
|
|
29
|
+
|
|
30
|
+
var _mControlStateHandlerMap = {
|
|
31
|
+
"sap.ui.fl.variants.VariantManagement": {
|
|
32
|
+
retrieve: function (oVM) {
|
|
33
|
+
return {
|
|
34
|
+
"variantId": oVM.getCurrentVariantKey()
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
apply: function (oVM, oControlState) {
|
|
38
|
+
if (oControlState && oControlState.variantId !== undefined && oControlState.variantId !== oVM.getCurrentVariantKey()) {
|
|
39
|
+
var sVariantReference = this._checkIfVariantIdIsAvailable(oVM, oControlState.variantId) ? oControlState.variantId : oVM.getStandardVariantKey();
|
|
40
|
+
return ControlVariantApplyAPI.activateVariant({
|
|
41
|
+
element: oVM,
|
|
42
|
+
variantReference: sVariantReference
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"sap.m.IconTabBar": {
|
|
48
|
+
retrieve: function (oTabBar) {
|
|
49
|
+
return {
|
|
50
|
+
selectedKey: oTabBar.getSelectedKey()
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
apply: function (oTabBar, oControlState) {
|
|
54
|
+
if (oControlState && oControlState.selectedKey) {
|
|
55
|
+
var oSelectedItem = oTabBar.getItems().find(function (oItem) {
|
|
56
|
+
return oItem.getKey() === oControlState.selectedKey;
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
if (oSelectedItem) {
|
|
60
|
+
oTabBar.setSelectedItem(oSelectedItem);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"sap.ui.mdc.FilterBar": {
|
|
66
|
+
retrieve: function (oFilterBar) {
|
|
67
|
+
return StateUtil.retrieveExternalState(oFilterBar).then(function (mFilterBarState) {
|
|
68
|
+
// remove sensitive or view state irrelevant fields
|
|
69
|
+
var aPropertiesInfo = oFilterBar.getPropertyInfoSet(),
|
|
70
|
+
mFilter = mFilterBarState.filter || {};
|
|
71
|
+
aPropertiesInfo.filter(function (oPropertyInfo) {
|
|
72
|
+
return mFilter[oPropertyInfo.path] && (oPropertyInfo.removeFromAppState || mFilter[oPropertyInfo.path].length === 0);
|
|
73
|
+
}).forEach(function (oPropertyInfo) {
|
|
74
|
+
delete mFilter[oPropertyInfo.path];
|
|
75
|
+
});
|
|
76
|
+
return mFilterBarState;
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
apply: function (oFilterBar, oControlState) {
|
|
80
|
+
if (oControlState) {
|
|
81
|
+
return StateUtil.applyExternalState(oFilterBar, oControlState);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"sap.ui.mdc.Table": {
|
|
86
|
+
retrieve: function (oTable) {
|
|
87
|
+
return StateUtil.retrieveExternalState(oTable);
|
|
88
|
+
},
|
|
89
|
+
apply: function (oTable, oControlState) {
|
|
90
|
+
if (oControlState) {
|
|
91
|
+
if (!oControlState.supplementaryConfig) {
|
|
92
|
+
oControlState.supplementaryConfig = {};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return StateUtil.applyExternalState(oTable, oControlState);
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
refreshBinding: function (oTable) {
|
|
99
|
+
var oTableBinding = oTable.getRowBinding();
|
|
100
|
+
|
|
101
|
+
if (oTableBinding) {
|
|
102
|
+
var oRootBinding = oTableBinding.getRootBinding();
|
|
103
|
+
|
|
104
|
+
if (oRootBinding === oTableBinding) {
|
|
105
|
+
// absolute binding
|
|
106
|
+
oTableBinding.refresh();
|
|
107
|
+
} else {
|
|
108
|
+
// relative binding
|
|
109
|
+
var oHeaderContext = oTableBinding.getHeaderContext();
|
|
110
|
+
var sGroupId = oTableBinding.getGroupId();
|
|
111
|
+
|
|
112
|
+
if (oHeaderContext) {
|
|
113
|
+
oHeaderContext.requestSideEffects([{
|
|
114
|
+
$NavigationPropertyPath: ""
|
|
115
|
+
}], sGroupId);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
} else {
|
|
119
|
+
Log.info("Table: " + oTable.getId() + " was not refreshed. No binding found!");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"sap.uxap.ObjectPageLayout": {
|
|
124
|
+
retrieve: function (oOPLayout) {
|
|
125
|
+
return {
|
|
126
|
+
selectedSection: oOPLayout.getSelectedSection()
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
apply: function (oOPLayout, oControlState) {
|
|
130
|
+
oControlState && oOPLayout.setSelectedSection(oControlState.selectedSection);
|
|
131
|
+
},
|
|
132
|
+
refreshBinding: function (oOPLayout) {
|
|
133
|
+
var oBindingContext = oOPLayout.getBindingContext();
|
|
134
|
+
var oBinding = oBindingContext && oBindingContext.getBinding();
|
|
135
|
+
|
|
136
|
+
if (oBinding) {
|
|
137
|
+
var sMetaPath = ModelHelper.getMetaPathForContext(oBindingContext);
|
|
138
|
+
var sStrategy = KeepAliveHelper.getControlRefreshStrategyForContextPath(oOPLayout, sMetaPath);
|
|
139
|
+
|
|
140
|
+
if (sStrategy === "self") {
|
|
141
|
+
// Refresh main context and 1-1 navigation properties or OP
|
|
142
|
+
var oModel = oBindingContext.getModel(),
|
|
143
|
+
oMetaModel = oModel.getMetaModel(),
|
|
144
|
+
oNavigationProperties = CommonUtils.getContextPathProperties(oMetaModel, sMetaPath, {
|
|
145
|
+
$kind: "NavigationProperty"
|
|
146
|
+
}) || {},
|
|
147
|
+
aNavPropertiesToRequest = Object.keys(oNavigationProperties).reduce(function (aPrev, sNavProp) {
|
|
148
|
+
if (oNavigationProperties[sNavProp].$isCollection !== true) {
|
|
149
|
+
aPrev.push({
|
|
150
|
+
$NavigationPropertyPath: sNavProp
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return aPrev;
|
|
155
|
+
}, []),
|
|
156
|
+
aProperties = [{
|
|
157
|
+
$PropertyPath: "*"
|
|
158
|
+
}],
|
|
159
|
+
sGroupId = oBinding.getGroupId();
|
|
160
|
+
oBindingContext.requestSideEffects(aProperties.concat(aNavPropertiesToRequest), sGroupId);
|
|
161
|
+
} else if (sStrategy === "includingDependents") {
|
|
162
|
+
// Complete refresh
|
|
163
|
+
oBinding.refresh();
|
|
164
|
+
}
|
|
165
|
+
} else {
|
|
166
|
+
Log.info("ObjectPage: " + oOPLayout.getId() + " was not refreshed. No binding found!");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"sap.fe.macros.table.QuickFilterContainer": {
|
|
171
|
+
retrieve: function (oQuickFilter) {
|
|
172
|
+
return {
|
|
173
|
+
selectedKey: oQuickFilter.getSelectorKey()
|
|
174
|
+
};
|
|
175
|
+
},
|
|
176
|
+
apply: function (oQuickFilter, oControlState) {
|
|
177
|
+
oControlState && oQuickFilter.setSelectorKey(oControlState.selectedKey);
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
"sap.m.SegmentedButton": {
|
|
181
|
+
retrieve: function (oSegmentedButton) {
|
|
182
|
+
return {
|
|
183
|
+
selectedKey: oSegmentedButton.getSelectedKey()
|
|
184
|
+
};
|
|
185
|
+
},
|
|
186
|
+
apply: function (oSegmentedButton, oControlState) {
|
|
187
|
+
oControlState && oSegmentedButton.setSelectedKey(oControlState.selectedKey);
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
"sap.m.Select": {
|
|
191
|
+
retrieve: function (oSelect) {
|
|
192
|
+
return {
|
|
193
|
+
selectedKey: oSelect.getSelectedKey()
|
|
194
|
+
};
|
|
195
|
+
},
|
|
196
|
+
apply: function (oSelect, oControlState) {
|
|
197
|
+
oControlState && oSelect.setSelectedKey(oControlState.selectedKey);
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
"sap.f.DynamicPage": {
|
|
201
|
+
retrieve: function (oDynamicPage) {
|
|
202
|
+
return {
|
|
203
|
+
headerExpanded: oDynamicPage.getHeaderExpanded()
|
|
204
|
+
};
|
|
205
|
+
},
|
|
206
|
+
apply: function (oDynamicPage, oControlState) {
|
|
207
|
+
oControlState && oDynamicPage.setHeaderExpanded(oControlState.headerExpanded);
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"sap.ui.core.mvc.View": {
|
|
211
|
+
retrieve: function (oView) {
|
|
212
|
+
var oController = oView.getController();
|
|
213
|
+
|
|
214
|
+
if (oController && oController.viewState) {
|
|
215
|
+
return oController.viewState.retrieveViewState(oController.viewState);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return {};
|
|
219
|
+
},
|
|
220
|
+
apply: function (oView, oControlState, oNavParameters) {
|
|
221
|
+
var oController = oView.getController();
|
|
222
|
+
|
|
223
|
+
if (oController && oController.viewState) {
|
|
224
|
+
return oController.viewState.applyViewState(oControlState, oNavParameters);
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
refreshBinding: function (oView) {
|
|
228
|
+
var oController = oView.getController();
|
|
229
|
+
|
|
230
|
+
if (oController && oController.viewState) {
|
|
231
|
+
return oController.viewState.refreshViewBindings();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
"sap.ui.core.ComponentContainer": {
|
|
236
|
+
retrieve: function (oComponentContainer) {
|
|
237
|
+
var oComponent = oComponentContainer.getComponentInstance();
|
|
238
|
+
|
|
239
|
+
if (oComponent) {
|
|
240
|
+
return this.retrieveControlState(oComponent.getRootControl());
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return {};
|
|
244
|
+
},
|
|
245
|
+
apply: function (oComponentContainer, oControlState, oNavParameters) {
|
|
246
|
+
var oComponent = oComponentContainer.getComponentInstance();
|
|
247
|
+
|
|
248
|
+
if (oComponent) {
|
|
249
|
+
return this.applyControlState(oComponent.getRootControl(), oControlState, oNavParameters);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
/**
|
|
255
|
+
* A controller extension offering hooks for state handling
|
|
256
|
+
*
|
|
257
|
+
* If you need to maintain a specific state for your application, you can use the controller extension.
|
|
258
|
+
*
|
|
259
|
+
* @hideconstructor
|
|
260
|
+
* @public
|
|
261
|
+
* @since 1.85.0
|
|
262
|
+
*/
|
|
263
|
+
|
|
264
|
+
var ViewState = (_dec = defineUI5Class("sap.fe.core.controllerextensions.ViewState"), _dec2 = publicExtension(), _dec3 = finalExtension(), _dec4 = publicExtension(), _dec5 = extensible(OverrideExecution.After), _dec6 = privateExtension(), _dec7 = finalExtension(), _dec8 = privateExtension(), _dec9 = finalExtension(), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = extensible(OverrideExecution.After), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = privateExtension(), _dec17 = finalExtension(), _dec18 = publicExtension(), _dec19 = extensible(OverrideExecution.After), _dec20 = privateExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = extensible(OverrideExecution.After), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = finalExtension(), _dec28 = publicExtension(), _dec29 = extensible(OverrideExecution.After), _dec30 = privateExtension(), _dec31 = finalExtension(), _dec32 = publicExtension(), _dec33 = extensible(OverrideExecution.Instead), _dec34 = publicExtension(), _dec35 = finalExtension(), _dec36 = privateExtension(), _dec37 = publicExtension(), _dec38 = extensible(OverrideExecution.After), _dec39 = publicExtension(), _dec40 = extensible(OverrideExecution.After), _dec41 = publicExtension(), _dec42 = extensible(OverrideExecution.After), _dec43 = publicExtension(), _dec44 = extensible(OverrideExecution.After), _dec45 = privateExtension(), _dec46 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
|
|
265
|
+
_inheritsLoose(ViewState, _ControllerExtension);
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Constructor.
|
|
269
|
+
*/
|
|
270
|
+
function ViewState() {
|
|
271
|
+
var _this;
|
|
272
|
+
|
|
273
|
+
_this = _ControllerExtension.call(this) || this;
|
|
274
|
+
_this._iRetrievingStateCounter = 0;
|
|
275
|
+
_this._pInitialStateApplied = new Promise(function (resolve) {
|
|
276
|
+
_this._pInitialStateAppliedResolve = resolve;
|
|
277
|
+
});
|
|
278
|
+
return _this;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
var _proto = ViewState.prototype;
|
|
282
|
+
|
|
283
|
+
_proto.refreshViewBindings = function refreshViewBindings() {
|
|
284
|
+
var _this2 = this;
|
|
285
|
+
|
|
286
|
+
return this.collectResults(this.base.viewState.adaptBindingRefreshControls).then(function (aControls) {
|
|
287
|
+
var oPromiseChain = Promise.resolve();
|
|
288
|
+
aControls.filter(function (oControl) {
|
|
289
|
+
return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
|
|
290
|
+
}).forEach(function (oControl) {
|
|
291
|
+
oPromiseChain = oPromiseChain.then(_this2.refreshControlBinding.bind(_this2, oControl));
|
|
292
|
+
});
|
|
293
|
+
return oPromiseChain;
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* This function should add all controls relevant for refreshing to the provided control array.
|
|
298
|
+
*
|
|
299
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
300
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
301
|
+
* @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
|
|
302
|
+
* @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshControls
|
|
303
|
+
* @protected
|
|
304
|
+
*/
|
|
305
|
+
;
|
|
306
|
+
|
|
307
|
+
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
308
|
+
adaptBindingRefreshControls = function adaptBindingRefreshControls(aCollectedControls) {// to be overriden
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
_proto.refreshControlBinding = function refreshControlBinding(oControl) {
|
|
312
|
+
var oControlRefreshBindingHandler = this.getControlRefreshBindingHandler(oControl);
|
|
313
|
+
var oPromiseChain = Promise.resolve();
|
|
314
|
+
|
|
315
|
+
if (typeof oControlRefreshBindingHandler.refreshBinding !== "function") {
|
|
316
|
+
Log.info("refreshBinding handler for control: " + oControl.getMetadata().getName() + " is not provided");
|
|
317
|
+
} else {
|
|
318
|
+
oPromiseChain = oPromiseChain.then(oControlRefreshBindingHandler.refreshBinding.bind(this, oControl));
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return oPromiseChain;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Returns a map of <code>refreshBinding</code> function for a certain control.
|
|
325
|
+
*
|
|
326
|
+
* @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
|
|
327
|
+
* @returns {object} A plain object with one function: <code>refreshBinding</code>
|
|
328
|
+
*/
|
|
329
|
+
;
|
|
330
|
+
|
|
331
|
+
_proto.getControlRefreshBindingHandler = function getControlRefreshBindingHandler(oControl) {
|
|
332
|
+
var oRefreshBindingHandler = {};
|
|
333
|
+
|
|
334
|
+
if (oControl) {
|
|
335
|
+
for (var sType in _mControlStateHandlerMap) {
|
|
336
|
+
if (oControl.isA(sType)) {
|
|
337
|
+
// pass only the refreshBinding handler in an object so that :
|
|
338
|
+
// 1. Application has access only to refreshBinding and not apply and reterive at this stage
|
|
339
|
+
// 2. Application modifications to the object will be reflected here (as we pass by reference)
|
|
340
|
+
oRefreshBindingHandler["refreshBinding"] = _mControlStateHandlerMap[sType].refreshBinding || {};
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
this.base.viewState.adaptBindingRefreshHandler(oControl, oRefreshBindingHandler);
|
|
347
|
+
return oRefreshBindingHandler;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Customize the <code>refreshBinding</code> function for a certain control.
|
|
351
|
+
*
|
|
352
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
353
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
354
|
+
*
|
|
355
|
+
* @param {sap.ui.base.ManagedObject} oControl The control for which the refresh handler is adapted.
|
|
356
|
+
* @param {Array<object>} oControlHandler A plain object which can have one function: <code>refreshBinding</code>
|
|
357
|
+
*
|
|
358
|
+
* @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshHandler
|
|
359
|
+
* @protected
|
|
360
|
+
*/
|
|
361
|
+
;
|
|
362
|
+
|
|
363
|
+
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
364
|
+
adaptBindingRefreshHandler = function adaptBindingRefreshHandler(oControl, oControlHandler) {// to be overriden
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Called when the application is suspended due to keep-alive mode.
|
|
368
|
+
*
|
|
369
|
+
* @alias sap.fe.core.controllerextensions.ViewState#onSuspend
|
|
370
|
+
* @public
|
|
371
|
+
*/
|
|
372
|
+
;
|
|
373
|
+
|
|
374
|
+
_proto.onSuspend = function onSuspend() {// to be overriden
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Called when the application is restored due to keep-alive mode.
|
|
378
|
+
*
|
|
379
|
+
* @alias sap.fe.core.controllerextensions.ViewState#onRestore
|
|
380
|
+
* @public
|
|
381
|
+
*/
|
|
382
|
+
;
|
|
383
|
+
|
|
384
|
+
_proto.onRestore = function onRestore() {// to be overriden
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Destructor method for objects.
|
|
388
|
+
*/
|
|
389
|
+
;
|
|
390
|
+
|
|
391
|
+
_proto.destroy = function destroy() {
|
|
392
|
+
delete this._pInitialStateAppliedResolve;
|
|
393
|
+
|
|
394
|
+
_ControllerExtension.prototype.destroy.call(this);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Helper function to enable multi override. It is adding an additional parameter (array) to the provided
|
|
398
|
+
* function (and its parameters), that will be evaluated via <code>Promise.all</code>.
|
|
399
|
+
*
|
|
400
|
+
* @param {Function} fnCall The function to be called
|
|
401
|
+
* @param args
|
|
402
|
+
* @returns {Promise} A promise to be resolved with the result of all overrides
|
|
403
|
+
*/
|
|
404
|
+
;
|
|
405
|
+
|
|
406
|
+
_proto.collectResults = function collectResults(fnCall) {
|
|
407
|
+
var aResults = [];
|
|
408
|
+
|
|
409
|
+
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
410
|
+
args[_key - 1] = arguments[_key];
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
args.push(aResults);
|
|
414
|
+
fnCall.apply(this, args);
|
|
415
|
+
return Promise.all(aResults);
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Customize the <code>retrieve</code> and <code>apply</code> functions for a certain control.
|
|
419
|
+
*
|
|
420
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
421
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
422
|
+
*
|
|
423
|
+
* @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
|
|
424
|
+
* @param {Array<object>} aControlHandler A list of plain objects with two functions: <code>retrieve</code> and <code>apply</code>
|
|
425
|
+
*
|
|
426
|
+
* @alias sap.fe.core.controllerextensions.ViewState#adaptControlStateHandler
|
|
427
|
+
* @protected
|
|
428
|
+
*/
|
|
429
|
+
;
|
|
430
|
+
|
|
431
|
+
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
432
|
+
adaptControlStateHandler = function adaptControlStateHandler(oControl, aControlHandler) {// to be overridden if needed
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Returns a map of <code>retrieve</code> and <code>apply</code> functions for a certain control.
|
|
436
|
+
*
|
|
437
|
+
* @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
|
|
438
|
+
* @returns {object} A plain object with two functions: <code>retrieve</code> and <code>apply</code>
|
|
439
|
+
*/
|
|
440
|
+
;
|
|
441
|
+
|
|
442
|
+
_proto.getControlStateHandler = function getControlStateHandler(oControl) {
|
|
443
|
+
var aInternalControlStateHandler = [],
|
|
444
|
+
aCustomControlStateHandler = [];
|
|
445
|
+
|
|
446
|
+
if (oControl) {
|
|
447
|
+
for (var sType in _mControlStateHandlerMap) {
|
|
448
|
+
if (oControl.isA(sType)) {
|
|
449
|
+
// avoid direct manipulation of internal _mControlStateHandlerMap
|
|
450
|
+
aInternalControlStateHandler.push(Object.assign({}, _mControlStateHandlerMap[sType]));
|
|
451
|
+
break;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
this.base.viewState.adaptControlStateHandler(oControl, aCustomControlStateHandler);
|
|
457
|
+
return aInternalControlStateHandler.concat(aCustomControlStateHandler);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* This function should add all controls for given view that should be considered for the state handling to the provided control array.
|
|
461
|
+
*
|
|
462
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
463
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
464
|
+
* @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
|
|
465
|
+
* @alias sap.fe.core.controllerextensions.ViewState#adaptStateControls
|
|
466
|
+
* @protected
|
|
467
|
+
*/
|
|
468
|
+
;
|
|
469
|
+
|
|
470
|
+
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
471
|
+
adaptStateControls = function adaptStateControls(aCollectedControls) {// to be overridden if needed
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Returns the key to be used for given control.
|
|
475
|
+
*
|
|
476
|
+
* @param {sap.ui.base.ManagedObject} oControl The control to get state key for
|
|
477
|
+
* @returns {string} The key to be used for storing the controls state
|
|
478
|
+
*/
|
|
479
|
+
;
|
|
480
|
+
|
|
481
|
+
_proto.getStateKey = function getStateKey(oControl) {
|
|
482
|
+
return this.getView().getLocalId(oControl.getId()) || oControl.getId();
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Retrieve the view state of this extensions view.
|
|
486
|
+
* When this function is called more than once before finishing, all but the final response will resolve to <code>undefined</code>.
|
|
487
|
+
*
|
|
488
|
+
* @returns {Promise} A promise resolving the view state
|
|
489
|
+
*
|
|
490
|
+
* @alias sap.fe.core.controllerextensions.ViewState#retrieveViewState
|
|
491
|
+
* @public
|
|
492
|
+
*/
|
|
493
|
+
;
|
|
494
|
+
|
|
495
|
+
_proto.retrieveViewState = function retrieveViewState() {
|
|
496
|
+
var _this3 = this;
|
|
497
|
+
|
|
498
|
+
++this._iRetrievingStateCounter;
|
|
499
|
+
return this._pInitialStateApplied.then(function () {
|
|
500
|
+
return _this3.collectResults(_this3.base.viewState.adaptStateControls);
|
|
501
|
+
}).then(function (aControls) {
|
|
502
|
+
return Promise.all(aControls.filter(function (oControl) {
|
|
503
|
+
return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
|
|
504
|
+
}).map(function (oControl) {
|
|
505
|
+
return _this3.retrieveControlState(oControl).then(function (vResult) {
|
|
506
|
+
return {
|
|
507
|
+
key: _this3.getStateKey(oControl),
|
|
508
|
+
value: vResult
|
|
509
|
+
};
|
|
510
|
+
});
|
|
511
|
+
}));
|
|
512
|
+
}).then(function (aResolvedStates) {
|
|
513
|
+
return aResolvedStates.reduce(function (oStates, mState) {
|
|
514
|
+
var oCurrentState = {};
|
|
515
|
+
oCurrentState[mState.key] = mState.value;
|
|
516
|
+
return mergeObjects(oStates, oCurrentState);
|
|
517
|
+
}, {});
|
|
518
|
+
}).then(function (oViewState) {
|
|
519
|
+
return Promise.resolve(_this3._retrieveAdditionalStates()).then(function (mAdditionalStates) {
|
|
520
|
+
if (mAdditionalStates && Object.keys(mAdditionalStates).length) {
|
|
521
|
+
oViewState[ADDITIONAL_STATES_KEY] = mAdditionalStates;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
return oViewState;
|
|
525
|
+
});
|
|
526
|
+
}).finally(function () {
|
|
527
|
+
--_this3._iRetrievingStateCounter;
|
|
528
|
+
}).then(function (oViewState) {
|
|
529
|
+
return _this3._iRetrievingStateCounter === 0 ? oViewState : undefined;
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Extend the map of additional states (not control bound) to be added to the current view state of the given view.
|
|
534
|
+
*
|
|
535
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
536
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
537
|
+
*
|
|
538
|
+
* @param {object} mAdditionalStates The additional state
|
|
539
|
+
*
|
|
540
|
+
* @alias sap.fe.core.controllerextensions.ViewState#retrieveAdditionalStates
|
|
541
|
+
* @protected
|
|
542
|
+
*/
|
|
543
|
+
;
|
|
544
|
+
|
|
545
|
+
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
546
|
+
retrieveAdditionalStates = function retrieveAdditionalStates(mAdditionalStates) {// to be overridden if needed
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Returns a map of additional states (not control bound) to be added to the current view state of the given view.
|
|
550
|
+
*
|
|
551
|
+
* @returns {object | Promise<object>} Additional view states
|
|
552
|
+
*/
|
|
553
|
+
;
|
|
554
|
+
|
|
555
|
+
_proto._retrieveAdditionalStates = function _retrieveAdditionalStates() {
|
|
556
|
+
var mAdditionalStates = {};
|
|
557
|
+
this.base.viewState.retrieveAdditionalStates(mAdditionalStates);
|
|
558
|
+
return mAdditionalStates;
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Returns the current state for the given control.
|
|
562
|
+
*
|
|
563
|
+
* @param {sap.ui.base.ManagedObject} oControl The object to get the state for
|
|
564
|
+
* @returns {Promise<object>} The state for the given control
|
|
565
|
+
*/
|
|
566
|
+
;
|
|
567
|
+
|
|
568
|
+
_proto.retrieveControlState = function retrieveControlState(oControl) {
|
|
569
|
+
var _this4 = this;
|
|
570
|
+
|
|
571
|
+
var aControlStateHandlers = this.getControlStateHandler(oControl);
|
|
572
|
+
return Promise.all(aControlStateHandlers.map(function (mControlStateHandler) {
|
|
573
|
+
if (typeof mControlStateHandler.retrieve !== "function") {
|
|
574
|
+
throw new Error("controlStateHandler.retrieve is not a function for control: " + oControl.getMetadata().getName());
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
return mControlStateHandler.retrieve.call(_this4, oControl);
|
|
578
|
+
})).then(function (aStates) {
|
|
579
|
+
return aStates.reduce(function (oFinalState, oCurrentState) {
|
|
580
|
+
return mergeObjects(oFinalState, oCurrentState);
|
|
581
|
+
}, {});
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Defines whether the view state should only be applied once initially.
|
|
586
|
+
*
|
|
587
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
588
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
|
|
589
|
+
*
|
|
590
|
+
* Important:
|
|
591
|
+
* You should only override this method for custom pages and not for the standard ListReportPage and ObjectPage!
|
|
592
|
+
*
|
|
593
|
+
* @returns {boolean} If <code>true</code>, only the initial view state is applied once,
|
|
594
|
+
* else any new view state is also applied on follow-up calls (default)
|
|
595
|
+
*
|
|
596
|
+
* @alias sap.fe.core.controllerextensions.ViewState#applyInitialStateOnly
|
|
597
|
+
* @protected
|
|
598
|
+
*/
|
|
599
|
+
;
|
|
600
|
+
|
|
601
|
+
_proto.applyInitialStateOnly = function applyInitialStateOnly() {
|
|
602
|
+
return true;
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Applies the given view state to this extensions view.
|
|
606
|
+
*
|
|
607
|
+
* @param {object} oViewState The view state to apply (can be undefined)
|
|
608
|
+
* @param {object} oNavParameter The current navigation parameter
|
|
609
|
+
* @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
|
|
610
|
+
* @param {object} oNavParameter.selectionVariant The selectionVariant from the navigation
|
|
611
|
+
* @param {object} oNavParameter.selectionVariantDefaults The selectionVariant defaults from the navigation
|
|
612
|
+
* @param {boolean} oNavParameter.requiresStandardVariant Defines whether standard variant must be used in VM
|
|
613
|
+
*
|
|
614
|
+
* @returns {Promise} Promise for async state handling
|
|
615
|
+
*
|
|
616
|
+
* @alias sap.fe.core.controllerextensions.ViewState#applyViewState
|
|
617
|
+
* @public
|
|
618
|
+
*/
|
|
619
|
+
;
|
|
620
|
+
|
|
621
|
+
_proto.applyViewState = function applyViewState(oViewState, oNavParameter) {
|
|
622
|
+
var _this5 = this;
|
|
623
|
+
|
|
624
|
+
if (this.base.viewState.applyInitialStateOnly() && this._getInitialStateApplied()) {
|
|
625
|
+
return Promise.resolve();
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
return this.collectResults(this.base.viewState.onBeforeStateApplied).then(function () {
|
|
629
|
+
return _this5.collectResults(_this5.base.viewState.adaptStateControls);
|
|
630
|
+
}).then(function (aControls) {
|
|
631
|
+
var oPromiseChain = Promise.resolve();
|
|
632
|
+
aControls.filter(function (oControl) {
|
|
633
|
+
return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
|
|
634
|
+
}).forEach(function (oControl) {
|
|
635
|
+
var sKey = _this5.getStateKey(oControl);
|
|
636
|
+
|
|
637
|
+
oPromiseChain = oPromiseChain.then(_this5.applyControlState.bind(_this5, oControl, oViewState ? oViewState[sKey] : undefined, oNavParameter));
|
|
638
|
+
});
|
|
639
|
+
return oPromiseChain;
|
|
640
|
+
}).then(function () {
|
|
641
|
+
if (oNavParameter.navigationType === NavType.iAppState) {
|
|
642
|
+
return _this5.collectResults(_this5.base.viewState.applyAdditionalStates, oViewState ? oViewState[ADDITIONAL_STATES_KEY] : undefined);
|
|
643
|
+
} else {
|
|
644
|
+
return _this5.collectResults(_this5.base.viewState.applyNavigationParameters, oNavParameter);
|
|
645
|
+
}
|
|
646
|
+
}).finally(function () {
|
|
647
|
+
return _this5.collectResults(_this5.base.viewState.onAfterStateApplied).then(_this5._setInitialStateApplied.bind(_this5));
|
|
648
|
+
});
|
|
649
|
+
};
|
|
650
|
+
|
|
651
|
+
_proto._checkIfVariantIdIsAvailable = function _checkIfVariantIdIsAvailable(oVM, sVariantId) {
|
|
652
|
+
var aVariants = oVM.getVariants();
|
|
653
|
+
var bIsControlStateVariantAvailable = false;
|
|
654
|
+
aVariants.forEach(function (oVariant) {
|
|
655
|
+
if (oVariant.key === sVariantId) {
|
|
656
|
+
bIsControlStateVariantAvailable = true;
|
|
657
|
+
}
|
|
658
|
+
});
|
|
659
|
+
return bIsControlStateVariantAvailable;
|
|
660
|
+
};
|
|
661
|
+
|
|
662
|
+
_proto._setInitialStateApplied = function _setInitialStateApplied() {
|
|
663
|
+
if (this._pInitialStateAppliedResolve) {
|
|
664
|
+
var pInitialStateAppliedResolve = this._pInitialStateAppliedResolve;
|
|
665
|
+
delete this._pInitialStateAppliedResolve;
|
|
666
|
+
pInitialStateAppliedResolve();
|
|
667
|
+
}
|
|
668
|
+
};
|
|
669
|
+
|
|
670
|
+
_proto._getInitialStateApplied = function _getInitialStateApplied() {
|
|
671
|
+
return !this._pInitialStateAppliedResolve;
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Hook to react before a state for given view is applied.
|
|
675
|
+
*
|
|
676
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
677
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
678
|
+
*
|
|
679
|
+
* @param {Promise} aPromises Extensible array of promises to be resolved before continuing
|
|
680
|
+
*
|
|
681
|
+
* @alias sap.fe.core.controllerextensions.ViewState#onBeforeStateApplied
|
|
682
|
+
* @protected
|
|
683
|
+
*/
|
|
684
|
+
;
|
|
685
|
+
|
|
686
|
+
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
687
|
+
onBeforeStateApplied = function onBeforeStateApplied(aPromises) {// to be overriden
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* Hook to react when state for given view was applied.
|
|
691
|
+
*
|
|
692
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
693
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
694
|
+
*
|
|
695
|
+
* @param {Promise} aPromises Extensible array of promises to be resolved before continuing
|
|
696
|
+
*
|
|
697
|
+
* @alias sap.fe.core.controllerextensions.ViewState#onAfterStateApplied
|
|
698
|
+
* @protected
|
|
699
|
+
*/
|
|
700
|
+
;
|
|
701
|
+
|
|
702
|
+
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
703
|
+
onAfterStateApplied = function onAfterStateApplied(aPromises) {// to be overriden
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* Applying additional, not control related, states - is called only if navigation type is iAppState.
|
|
707
|
+
*
|
|
708
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
709
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
710
|
+
*
|
|
711
|
+
* @param {object} oViewState The current view state
|
|
712
|
+
* @param {Promise} aPromises Extensible array of promises to be resolved before continuing
|
|
713
|
+
*
|
|
714
|
+
* @alias sap.fe.core.controllerextensions.ViewState#applyAdditionalStates
|
|
715
|
+
* @protected
|
|
716
|
+
*/
|
|
717
|
+
;
|
|
718
|
+
|
|
719
|
+
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
720
|
+
applyAdditionalStates = function applyAdditionalStates(oViewState, aPromises) {// to be overridden if needed
|
|
721
|
+
}
|
|
722
|
+
/**
|
|
723
|
+
* Apply navigation parameters - is called only if navigation type is not iAppState.
|
|
724
|
+
*
|
|
725
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
726
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
727
|
+
*
|
|
728
|
+
* @param {object} oNavParameter The current navigation parameter
|
|
729
|
+
* @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
|
|
730
|
+
* @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
|
|
731
|
+
* @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
|
|
732
|
+
* @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
|
|
733
|
+
* @param {Promise} aPromises Extensible array of promises to be resolved before continuing
|
|
734
|
+
*
|
|
735
|
+
* @alias sap.fe.core.controllerextensions.ViewState#applyNavigationParameters
|
|
736
|
+
* @protected
|
|
737
|
+
*/
|
|
738
|
+
;
|
|
739
|
+
|
|
740
|
+
_proto.applyNavigationParameters = function applyNavigationParameters( // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
741
|
+
oNavParameter, // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
742
|
+
aPromises) {// to be overridden if needed
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* Applying the given state to the given control.
|
|
746
|
+
*
|
|
747
|
+
* @param {sap.ui.base.ManagedObject} oControl The object to apply the given state
|
|
748
|
+
* @param {object} oControlState The state for the given control
|
|
749
|
+
* @param {object} [oNavParameters] The current navigation parameters
|
|
750
|
+
* @returns {any} Return a promise for async state handling
|
|
751
|
+
*/
|
|
752
|
+
;
|
|
753
|
+
|
|
754
|
+
_proto.applyControlState = function applyControlState(oControl, oControlState, oNavParameters) {
|
|
755
|
+
var _this6 = this;
|
|
756
|
+
|
|
757
|
+
var aControlStateHandlers = this.getControlStateHandler(oControl);
|
|
758
|
+
var oPromiseChain = Promise.resolve();
|
|
759
|
+
aControlStateHandlers.forEach(function (mControlStateHandler) {
|
|
760
|
+
if (typeof mControlStateHandler.apply !== "function") {
|
|
761
|
+
throw new Error("controlStateHandler.apply is not a function for control: " + oControl.getMetadata().getName());
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(_this6, oControl, oControlState, oNavParameters));
|
|
765
|
+
});
|
|
766
|
+
return oPromiseChain;
|
|
767
|
+
};
|
|
768
|
+
|
|
769
|
+
_proto.getInterface = function getInterface() {
|
|
770
|
+
return this;
|
|
771
|
+
};
|
|
772
|
+
|
|
773
|
+
return ViewState;
|
|
774
|
+
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "refreshViewBindings", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshViewBindings"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshControls", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "refreshControlBinding", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshControlBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlRefreshBindingHandler", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlRefreshBindingHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshHandler", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onSuspend", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onSuspend"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRestore", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onRestore"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "collectResults", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "collectResults"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptControlStateHandler", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlStateHandler", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptStateControls", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptStateControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getStateKey", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "getStateKey"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveViewState", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveAdditionalStates", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveControlState", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveControlState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyInitialStateOnly", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "applyInitialStateOnly"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyViewState", [_dec34, _dec35], Object.getOwnPropertyDescriptor(_class2.prototype, "applyViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable", [_dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeStateApplied", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterStateApplied", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyAdditionalStates", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "applyAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyNavigationParameters", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "applyNavigationParameters"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyControlState", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "applyControlState"), _class2.prototype)), _class2)) || _class);
|
|
775
|
+
return ViewState;
|
|
776
|
+
}, false);
|
|
777
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJuYW1lcyI6WyJBRERJVElPTkFMX1NUQVRFU19LRVkiLCJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIl9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCIsInJldHJpZXZlIiwib1ZNIiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJhcHBseSIsIm9Db250cm9sU3RhdGUiLCJ2YXJpYW50SWQiLCJ1bmRlZmluZWQiLCJzVmFyaWFudFJlZmVyZW5jZSIsIl9jaGVja0lmVmFyaWFudElkSXNBdmFpbGFibGUiLCJnZXRTdGFuZGFyZFZhcmlhbnRLZXkiLCJDb250cm9sVmFyaWFudEFwcGx5QVBJIiwiYWN0aXZhdGVWYXJpYW50IiwiZWxlbWVudCIsInZhcmlhbnRSZWZlcmVuY2UiLCJvVGFiQmFyIiwic2VsZWN0ZWRLZXkiLCJnZXRTZWxlY3RlZEtleSIsIm9TZWxlY3RlZEl0ZW0iLCJnZXRJdGVtcyIsImZpbmQiLCJvSXRlbSIsImdldEtleSIsInNldFNlbGVjdGVkSXRlbSIsIm9GaWx0ZXJCYXIiLCJTdGF0ZVV0aWwiLCJyZXRyaWV2ZUV4dGVybmFsU3RhdGUiLCJ0aGVuIiwibUZpbHRlckJhclN0YXRlIiwiYVByb3BlcnRpZXNJbmZvIiwiZ2V0UHJvcGVydHlJbmZvU2V0IiwibUZpbHRlciIsImZpbHRlciIsIm9Qcm9wZXJ0eUluZm8iLCJwYXRoIiwicmVtb3ZlRnJvbUFwcFN0YXRlIiwibGVuZ3RoIiwiZm9yRWFjaCIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsIm9UYWJsZSIsInN1cHBsZW1lbnRhcnlDb25maWciLCJyZWZyZXNoQmluZGluZyIsIm9UYWJsZUJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwib1Jvb3RCaW5kaW5nIiwiZ2V0Um9vdEJpbmRpbmciLCJyZWZyZXNoIiwib0hlYWRlckNvbnRleHQiLCJnZXRIZWFkZXJDb250ZXh0Iiwic0dyb3VwSWQiLCJnZXRHcm91cElkIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJMb2ciLCJpbmZvIiwiZ2V0SWQiLCJvT1BMYXlvdXQiLCJzZWxlY3RlZFNlY3Rpb24iLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJzZXRTZWxlY3RlZFNlY3Rpb24iLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInNNZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwic1N0cmF0ZWd5IiwiS2VlcEFsaXZlSGVscGVyIiwiZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib05hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiQ29tbW9uVXRpbHMiLCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCIka2luZCIsImFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImFQcmV2Iiwic05hdlByb3AiLCIkaXNDb2xsZWN0aW9uIiwicHVzaCIsImFQcm9wZXJ0aWVzIiwiJFByb3BlcnR5UGF0aCIsImNvbmNhdCIsIm9RdWlja0ZpbHRlciIsImdldFNlbGVjdG9yS2V5Iiwic2V0U2VsZWN0b3JLZXkiLCJvU2VnbWVudGVkQnV0dG9uIiwic2V0U2VsZWN0ZWRLZXkiLCJvU2VsZWN0Iiwib0R5bmFtaWNQYWdlIiwiaGVhZGVyRXhwYW5kZWQiLCJnZXRIZWFkZXJFeHBhbmRlZCIsInNldEhlYWRlckV4cGFuZGVkIiwib1ZpZXciLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJ2aWV3U3RhdGUiLCJyZXRyaWV2ZVZpZXdTdGF0ZSIsIm9OYXZQYXJhbWV0ZXJzIiwiYXBwbHlWaWV3U3RhdGUiLCJyZWZyZXNoVmlld0JpbmRpbmdzIiwib0NvbXBvbmVudENvbnRhaW5lciIsIm9Db21wb25lbnQiLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsInJldHJpZXZlQ29udHJvbFN0YXRlIiwiZ2V0Um9vdENvbnRyb2wiLCJhcHBseUNvbnRyb2xTdGF0ZSIsIlZpZXdTdGF0ZSIsImRlZmluZVVJNUNsYXNzIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsInByaXZhdGVFeHRlbnNpb24iLCJJbnN0ZWFkIiwiX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyIiwiX3BJbml0aWFsU3RhdGVBcHBsaWVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJfcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlIiwiY29sbGVjdFJlc3VsdHMiLCJiYXNlIiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwib1Byb21pc2VDaGFpbiIsIm9Db250cm9sIiwiaXNBIiwicmVmcmVzaENvbnRyb2xCaW5kaW5nIiwiYmluZCIsImFDb2xsZWN0ZWRDb250cm9scyIsIm9Db250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyIiwiZ2V0Q29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlciIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIm9SZWZyZXNoQmluZGluZ0hhbmRsZXIiLCJzVHlwZSIsImFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyIiwib0NvbnRyb2xIYW5kbGVyIiwib25TdXNwZW5kIiwib25SZXN0b3JlIiwiZGVzdHJveSIsImZuQ2FsbCIsImFSZXN1bHRzIiwiYXJncyIsImFsbCIsImFkYXB0Q29udHJvbFN0YXRlSGFuZGxlciIsImFDb250cm9sSGFuZGxlciIsImdldENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyIiwiYUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhc3NpZ24iLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJnZXRTdGF0ZUtleSIsImdldFZpZXciLCJnZXRMb2NhbElkIiwibWFwIiwidlJlc3VsdCIsImtleSIsInZhbHVlIiwiYVJlc29sdmVkU3RhdGVzIiwib1N0YXRlcyIsIm1TdGF0ZSIsIm9DdXJyZW50U3RhdGUiLCJtZXJnZU9iamVjdHMiLCJvVmlld1N0YXRlIiwiX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcyIsIm1BZGRpdGlvbmFsU3RhdGVzIiwiZmluYWxseSIsInJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyIsImFDb250cm9sU3RhdGVIYW5kbGVycyIsIm1Db250cm9sU3RhdGVIYW5kbGVyIiwiRXJyb3IiLCJjYWxsIiwiYVN0YXRlcyIsIm9GaW5hbFN0YXRlIiwiYXBwbHlJbml0aWFsU3RhdGVPbmx5Iiwib05hdlBhcmFtZXRlciIsIl9nZXRJbml0aWFsU3RhdGVBcHBsaWVkIiwib25CZWZvcmVTdGF0ZUFwcGxpZWQiLCJzS2V5IiwibmF2aWdhdGlvblR5cGUiLCJpQXBwU3RhdGUiLCJhcHBseUFkZGl0aW9uYWxTdGF0ZXMiLCJhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzIiwib25BZnRlclN0YXRlQXBwbGllZCIsIl9zZXRJbml0aWFsU3RhdGVBcHBsaWVkIiwic1ZhcmlhbnRJZCIsImFWYXJpYW50cyIsImdldFZhcmlhbnRzIiwiYklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSIsIm9WYXJpYW50IiwicEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlIiwiYVByb21pc2VzIiwiZ2V0SW50ZXJmYWNlIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUEscUJBQXFCLEdBQUcsbUJBQTlCO0FBQUEsTUFDQ0MsT0FBTyxHQUFHQyxVQUFVLENBQUNELE9BRHRCLEMsQ0FFQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUUsd0JBQTZDLEdBQUc7QUFDckQsNENBQXdDO0FBQ3ZDQyxNQUFBQSxRQUFRLEVBQUUsVUFBVUMsR0FBVixFQUFvQjtBQUM3QixlQUFPO0FBQ04sdUJBQWFBLEdBQUcsQ0FB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LE9BTEQ7QUFNQSxhQUFPMkIsYUFBUDtBQUNBLEs7O1dBQ0RxRSxZLEdBQUEsd0JBQWU7QUFDZCxhQUFPLElBQVA7QUFDQSxLOzs7SUFyaUJzQkMsbUI7U0F3aUJUeEYsUyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHByaXZhdGVFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IE5hdkxpYnJhcnkgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL2xpYnJhcnlcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgQ29udHJvbFZhcmlhbnRBcHBseUFQSSBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L2FwaS9Db250cm9sVmFyaWFudEFwcGx5QVBJXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG4vLyBhZGRpdGlvbmFsU3RhdGVzIGFyZSBzdG9yZWQgbmV4dCB0byBjb250cm9sIElEcywgc28gbmFtZSBjbGFzaCBhdm9pZGFuY2UgbmVlZGVkLiBGb3J0dW5hdGVseSBJRHMgaGF2ZSByZXN0cmljdGlvbnM6XG4vLyBcIkFsbG93ZWQgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIChjYXBpdGFsL2xvd2VyY2FzZSksIGRpZ2l0cywgdW5kZXJzY29yZXMsIGRhc2hlcywgcG9pbnRzIGFuZC9vciBjb2xvbnMuXCJcbi8vIFRoZXJlZm9yZSBhZGRpbmcgYSBzeW1ib2wgbGlrZSAjIG9yIEBcbmNvbnN0IEFERElUSU9OQUxfU1RBVEVTX0tFWSA9IFwiI2FkZGl0aW9uYWxTdGF0ZXNcIixcblx0TmF2VHlwZSA9IE5hdkxpYnJhcnkuTmF2VHlwZTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIG1ldGhvZHMgdG8gcmV0cmlldmUgJiBhcHBseSBzdGF0ZXMgZm9yIHRoZSBkaWZmZXJlbnQgY29udHJvbHMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmNvbnN0IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcblx0XCJzYXAudWkuZmwudmFyaWFudHMuVmFyaWFudE1hbmFnZW1lbnRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZNOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwidmFyaWFudElkXCI6IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVk06IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSAmJiBvQ29udHJvbFN0YXRlLnZhcmlhbnRJZCAhPT0gdW5kZWZpbmVkICYmIG9Db250cm9sU3RhdGUudmFyaWFudElkICE9PSBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKSkge1xuXHRcdFx0XHRjb25zdCBzVmFyaWFudFJlZmVyZW5jZSA9IHRoaXMuX2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZShvVk0sIG9Db250cm9sU3RhdGUudmFyaWFudElkKVxuXHRcdFx0XHRcdD8gb0NvbnRyb2xTdGF0ZS52YXJpYW50SWRcblx0XHRcdFx0XHQ6IG9WTS5nZXRTdGFuZGFyZFZhcmlhbnRLZXkoKTtcblx0XHRcdFx0cmV0dXJuIENvbnRyb2xWYXJpYW50QXBwbHlBUEkuYWN0aXZhdGVWYXJpYW50KHtcblx0XHRcdFx0XHRlbGVtZW50OiBvVk0sXG5cdFx0XHRcdFx0dmFyaWFudFJlZmVyZW5jZTogc1ZhcmlhbnRSZWZlcmVuY2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5tLkljb25UYWJCYXJcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1RhYkJhcjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1RhYkJhci5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVGFiQmFyOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUgJiYgb0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRJdGVtID0gb1RhYkJhci5nZXRJdGVtcygpLmZpbmQoZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0l0ZW0uZ2V0S2V5KCkgPT09IG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob1NlbGVjdGVkSXRlbSkge1xuXHRcdFx0XHRcdG9UYWJCYXIuc2V0U2VsZWN0ZWRJdGVtKG9TZWxlY3RlZEl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5tZGMuRmlsdGVyQmFyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9GaWx0ZXJCYXI6IGFueSkge1xuXHRcdFx0cmV0dXJuIFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUob0ZpbHRlckJhcikudGhlbihmdW5jdGlvbiAobUZpbHRlckJhclN0YXRlOiBhbnkpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIHNlbnNpdGl2ZSBvciB2aWV3IHN0YXRlIGlycmVsZXZhbnQgZmllbGRzXG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0aWVzSW5mbyA9IG9GaWx0ZXJCYXIuZ2V0UHJvcGVydHlJbmZvU2V0KCksXG5cdFx0XHRcdFx0bUZpbHRlciA9IG1GaWx0ZXJCYXJTdGF0ZS5maWx0ZXIgfHwge307XG5cdFx0XHRcdGFQcm9wZXJ0aWVzSW5mb1xuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Qcm9wZXJ0eUluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0bUZpbHRlcltvUHJvcGVydHlJbmZvLnBhdGhdICYmIChvUHJvcGVydHlJbmZvLnJlbW92ZUZyb21BcHBTdGF0ZSB8fCBtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF0ubGVuZ3RoID09PSAwKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHlJbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBtRmlsdGVyQmFyU3RhdGU7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob0ZpbHRlckJhcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9GaWx0ZXJCYXIsIG9Db250cm9sU3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkubWRjLlRhYmxlXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRyZXR1cm4gU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvVGFibGUpO1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVGFibGU6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRpZiAoIW9Db250cm9sU3RhdGUuc3VwcGxlbWVudGFyeUNvbmZpZykge1xuXHRcdFx0XHRcdG9Db250cm9sU3RhdGUuc3VwcGxlbWVudGFyeUNvbmZpZyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9UYWJsZSwgb0NvbnRyb2xTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvVGFibGVCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290QmluZGluZyA9IG9UYWJsZUJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9Sb290QmluZGluZyA9PT0gb1RhYmxlQmluZGluZykge1xuXHRcdFx0XHRcdC8vIGFic29sdXRlIGJpbmRpbmdcblx0XHRcdFx0XHRvVGFibGVCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyByZWxhdGl2ZSBiaW5kaW5nXG5cdFx0XHRcdFx0Y29uc3Qgb0hlYWRlckNvbnRleHQgPSBvVGFibGVCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0XHRjb25zdCBzR3JvdXBJZCA9IG9UYWJsZUJpbmRpbmcuZ2V0R3JvdXBJZCgpO1xuXG5cdFx0XHRcdFx0aWYgKG9IZWFkZXJDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRvSGVhZGVyQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIHNHcm91cElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiVGFibGU6IFwiICsgb1RhYmxlLmdldElkKCkgKyBcIiB3YXMgbm90IHJlZnJlc2hlZC4gTm8gYmluZGluZyBmb3VuZCFcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51eGFwLk9iamVjdFBhZ2VMYXlvdXRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkU2VjdGlvbjogb09QTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9PUExheW91dC5zZXRTZWxlY3RlZFNlY3Rpb24ob0NvbnRyb2xTdGF0ZS5zZWxlY3RlZFNlY3Rpb24pO1xuXHRcdH0sXG5cdFx0cmVmcmVzaEJpbmRpbmc6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb09QTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBvQmluZGluZyA9IG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRjb25zdCBzU3RyYXRlZ3kgPSBLZWVwQWxpdmVIZWxwZXIuZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoKG9PUExheW91dCwgc01ldGFQYXRoKTtcblx0XHRcdFx0aWYgKHNTdHJhdGVneSA9PT0gXCJzZWxmXCIpIHtcblx0XHRcdFx0XHQvLyBSZWZyZXNoIG1haW4gY29udGV4dCBhbmQgMS0xIG5hdmlnYXRpb24gcHJvcGVydGllcyBvciBPUFxuXHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uUHJvcGVydGllcyA9XG5cdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHtcblx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJOYXZpZ2F0aW9uUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHR9KSB8fCB7fSxcblx0XHRcdFx0XHRcdGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gT2JqZWN0LmtleXMob05hdmlnYXRpb25Qcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFQcmV2OiBhbnlbXSwgc05hdlByb3A6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0aWVzW3NOYXZQcm9wXS4kaXNDb2xsZWN0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVByZXYucHVzaCh7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2UHJvcCB9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYVByZXY7XG5cdFx0XHRcdFx0XHR9LCBbXSksXG5cdFx0XHRcdFx0XHRhUHJvcGVydGllcyA9IFt7ICRQcm9wZXJ0eVBhdGg6IFwiKlwiIH1dLFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQgPSBvQmluZGluZy5nZXRHcm91cElkKCk7XG5cblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKGFQcm9wZXJ0aWVzLmNvbmNhdChhTmF2UHJvcGVydGllc1RvUmVxdWVzdCksIHNHcm91cElkKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzU3RyYXRlZ3kgPT09IFwiaW5jbHVkaW5nRGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0Ly8gQ29tcGxldGUgcmVmcmVzaFxuXHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oXCJPYmplY3RQYWdlOiBcIiArIG9PUExheW91dC5nZXRJZCgpICsgXCIgd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAuZmUubWFjcm9zLnRhYmxlLlF1aWNrRmlsdGVyQ29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9RdWlja0ZpbHRlcjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1F1aWNrRmlsdGVyLmdldFNlbGVjdG9yS2V5KClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9RdWlja0ZpbHRlcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdG9Db250cm9sU3RhdGUgJiYgb1F1aWNrRmlsdGVyLnNldFNlbGVjdG9yS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAubS5TZWdtZW50ZWRCdXR0b25cIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1NlZ21lbnRlZEJ1dHRvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlZ21lbnRlZEJ1dHRvbi5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvU2VnbWVudGVkQnV0dG9uOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvU2VnbWVudGVkQnV0dG9uLnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAubS5TZWxlY3RcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1NlbGVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlbGVjdC5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvU2VsZWN0OiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvU2VsZWN0LnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAuZi5EeW5hbWljUGFnZVwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvRHluYW1pY1BhZ2U6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aGVhZGVyRXhwYW5kZWQ6IG9EeW5hbWljUGFnZS5nZXRIZWFkZXJFeHBhbmRlZCgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvRHluYW1pY1BhZ2U6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9EeW5hbWljUGFnZS5zZXRIZWFkZXJFeHBhbmRlZChvQ29udHJvbFN0YXRlLmhlYWRlckV4cGFuZGVkKTtcblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZpZXc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAob0NvbnRyb2xsZXIgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbGxlci52aWV3U3RhdGUucmV0cmlldmVWaWV3U3RhdGUob0NvbnRyb2xsZXIudmlld1N0YXRlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob1ZpZXc6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55LCBvTmF2UGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5hcHBseVZpZXdTdGF0ZShvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9WaWV3OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnZpZXdTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIudmlld1N0YXRlLnJlZnJlc2hWaWV3QmluZGluZ3MoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLmNvcmUuQ29tcG9uZW50Q29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9Db21wb25lbnRDb250YWluZXI6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db21wb25lbnRDb250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRcdGlmIChvQ29tcG9uZW50KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJldHJpZXZlQ29udHJvbFN0YXRlKG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9Db21wb25lbnRDb250YWluZXI6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55LCBvTmF2UGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbXBvbmVudENvbnRhaW5lci5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuXHRcdFx0aWYgKG9Db21wb25lbnQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlDb250cm9sU3RhdGUob0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpLCBvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGZvciBzdGF0ZSBoYW5kbGluZ1xuICpcbiAqIElmIHlvdSBuZWVkIHRvIG1haW50YWluIGEgc3BlY2lmaWMgc3RhdGUgZm9yIHlvdXIgYXBwbGljYXRpb24sIHlvdSBjYW4gdXNlIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS44NS4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZVwiKVxuY2xhc3MgVmlld1N0YXRlIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyOiBudW1iZXI7XG5cdHByaXZhdGUgX3BJbml0aWFsU3RhdGVBcHBsaWVkOiBQcm9taXNlPHVua25vd24+O1xuXHRwcml2YXRlIF9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdG9yLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLl9pUmV0cmlldmluZ1N0YXRlQ291bnRlciA9IDA7XG5cdFx0dGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZWZyZXNoVmlld0JpbmRpbmdzKCkge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKS50aGVuKChhQ29udHJvbHM6IGFueSkgPT4ge1xuXHRcdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdGFDb250cm9sc1xuXHRcdFx0XHQuZmlsdGVyKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4odGhpcy5yZWZyZXNoQ29udHJvbEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZGQgYWxsIGNvbnRyb2xzIHJlbGV2YW50IGZvciByZWZyZXNoaW5nIHRvIHRoZSBwcm92aWRlZCBjb250cm9sIGFycmF5LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0ge0FycmF5PHNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3Q+fSBhQ29sbGVjdGVkQ29udHJvbHMgVGhlIGNvbGxlY3RlZCBjb250cm9sc1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hDb250cm9sc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKGFDb2xsZWN0ZWRDb250cm9sczogTWFuYWdlZE9iamVjdFtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJlZnJlc2hDb250cm9sQmluZGluZyhvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIgPSB0aGlzLmdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2wpO1xuXHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKHR5cGVvZiBvQ29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlci5yZWZyZXNoQmluZGluZyAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRMb2cuaW5mbyhcInJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgKyBcIiBpcyBub3QgcHJvdmlkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4ob0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIucmVmcmVzaEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2VDaGFpbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbWFwIG9mIDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPiBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGhhbmRsZXIgZm9yXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEEgcGxhaW4gb2JqZWN0IHdpdGggb25lIGZ1bmN0aW9uOiA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT5cblx0ICovXG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDb250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyKG9Db250cm9sOiBhbnkpOiBhbnkge1xuXHRcdGNvbnN0IG9SZWZyZXNoQmluZGluZ0hhbmRsZXI6IGFueSA9IHt9O1xuXHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0Zm9yIChjb25zdCBzVHlwZSBpbiBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXApIHtcblx0XHRcdFx0aWYgKG9Db250cm9sLmlzQShzVHlwZSkpIHtcblx0XHRcdFx0XHQvLyBwYXNzIG9ubHkgdGhlIHJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgaW4gYW4gb2JqZWN0IHNvIHRoYXQgOlxuXHRcdFx0XHRcdC8vIDEuIEFwcGxpY2F0aW9uIGhhcyBhY2Nlc3Mgb25seSB0byByZWZyZXNoQmluZGluZyBhbmQgbm90IGFwcGx5IGFuZCByZXRlcml2ZSBhdCB0aGlzIHN0YWdlXG5cdFx0XHRcdFx0Ly8gMi4gQXBwbGljYXRpb24gbW9kaWZpY2F0aW9ucyB0byB0aGUgb2JqZWN0IHdpbGwgYmUgcmVmbGVjdGVkIGhlcmUgKGFzIHdlIHBhc3MgYnkgcmVmZXJlbmNlKVxuXHRcdFx0XHRcdG9SZWZyZXNoQmluZGluZ0hhbmRsZXJbXCJyZWZyZXNoQmluZGluZ1wiXSA9IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFtzVHlwZV0ucmVmcmVzaEJpbmRpbmcgfHwge307XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbCwgb1JlZnJlc2hCaW5kaW5nSGFuZGxlcik7XG5cdFx0cmV0dXJuIG9SZWZyZXNoQmluZGluZ0hhbmRsZXI7XG5cdH1cblx0LyoqXG5cdCAqIEN1c3RvbWl6ZSB0aGUgPGNvZGU+cmVmcmVzaEJpbmRpbmc8L2NvZGU+IGZ1bmN0aW9uIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCBmb3Igd2hpY2ggdGhlIHJlZnJlc2ggaGFuZGxlciBpcyBhZGFwdGVkLlxuXHQgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IG9Db250cm9sSGFuZGxlciBBIHBsYWluIG9iamVjdCB3aGljaCBjYW4gaGF2ZSBvbmUgZnVuY3Rpb246IDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgb0NvbnRyb2xIYW5kbGVyOiBhbnlbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBzdXNwZW5kZWQgZHVlIHRvIGtlZXAtYWxpdmUgbW9kZS5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNvblN1c3BlbmRcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblN1c3BlbmQoKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHJlc3RvcmVkIGR1ZSB0byBrZWVwLWFsaXZlIG1vZGUuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjb25SZXN0b3JlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25SZXN0b3JlKCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIERlc3RydWN0b3IgbWV0aG9kIGZvciBvYmplY3RzLlxuXHQgKi9cblx0ZGVzdHJveSgpIHtcblx0XHRkZWxldGUgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZW5hYmxlIG11bHRpIG92ZXJyaWRlLiBJdCBpcyBhZGRpbmcgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgKGFycmF5KSB0byB0aGUgcHJvdmlkZWRcblx0ICogZnVuY3Rpb24gKGFuZCBpdHMgcGFyYW1ldGVycyksIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgdmlhIDxjb2RlPlByb21pc2UuYWxsPC9jb2RlPi5cblx0ICpcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5DYWxsIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIGFyZ3Ncblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0byBiZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgb2YgYWxsIG92ZXJyaWRlc1xuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjb2xsZWN0UmVzdWx0cyhmbkNhbGw6IEZ1bmN0aW9uLCAuLi5hcmdzOiBhbnlbXSkge1xuXHRcdGNvbnN0IGFSZXN1bHRzOiBhbnlbXSA9IFtdO1xuXHRcdGFyZ3MucHVzaChhUmVzdWx0cyk7XG5cdFx0Zm5DYWxsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3VzdG9taXplIHRoZSA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPiBmdW5jdGlvbnMgZm9yIGEgY2VydGFpbiBjb250cm9sLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBoYW5kbGVyIGZvclxuXHQgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IGFDb250cm9sSGFuZGxlciBBIGxpc3Qgb2YgcGxhaW4gb2JqZWN0cyB3aXRoIHR3byBmdW5jdGlvbnM6IDxjb2RlPnJldHJpZXZlPC9jb2RlPiBhbmQgPGNvZGU+YXBwbHk8L2NvZGU+XG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2w6IE1hbmFnZWRPYmplY3QsIGFDb250cm9sSGFuZGxlcjogb2JqZWN0W10pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZFxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBtYXAgb2YgPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT4gZnVuY3Rpb25zIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUgaGFuZGxlciBmb3Jcblx0ICogQHJldHVybnMge29iamVjdH0gQSBwbGFpbiBvYmplY3Qgd2l0aCB0d28gZnVuY3Rpb25zOiA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPlxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyID0gW10sXG5cdFx0XHRhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcjogYW55W10gPSBbXTtcblx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdGZvciAoY29uc3Qgc1R5cGUgaW4gX21Db250cm9sU3RhdGVIYW5kbGVyTWFwKSB7XG5cdFx0XHRcdGlmIChvQ29udHJvbC5pc0Eoc1R5cGUpKSB7XG5cdFx0XHRcdFx0Ly8gYXZvaWQgZGlyZWN0IG1hbmlwdWxhdGlvbiBvZiBpbnRlcm5hbCBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXBcblx0XHRcdFx0XHRhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgX21Db250cm9sU3RhdGVIYW5kbGVyTWFwW3NUeXBlXSkpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sLCBhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcik7XG5cdFx0cmV0dXJuIGFJbnRlcm5hbENvbnRyb2xTdGF0ZUhhbmRsZXIuY29uY2F0KGFDdXN0b21Db250cm9sU3RhdGVIYW5kbGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZGQgYWxsIGNvbnRyb2xzIGZvciBnaXZlbiB2aWV3IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBzdGF0ZSBoYW5kbGluZyB0byB0aGUgcHJvdmlkZWQgY29udHJvbCBhcnJheS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtBcnJheTxzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0Pn0gYUNvbGxlY3RlZENvbnRyb2xzIFRoZSBjb2xsZWN0ZWQgY29udHJvbHNcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhZGFwdFN0YXRlQ29udHJvbHNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0U3RhdGVDb250cm9scyhhQ29sbGVjdGVkQ29udHJvbHM6IE1hbmFnZWRPYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUga2V5IHRvIGJlIHVzZWQgZm9yIGdpdmVuIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGtleSBmb3Jcblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIGtleSB0byBiZSB1c2VkIGZvciBzdG9yaW5nIHRoZSBjb250cm9scyBzdGF0ZVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFN0YXRlS2V5KG9Db250cm9sOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TG9jYWxJZChvQ29udHJvbC5nZXRJZCgpKSB8fCBvQ29udHJvbC5nZXRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSB2aWV3IHN0YXRlIG9mIHRoaXMgZXh0ZW5zaW9ucyB2aWV3LlxuXHQgKiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGJlZm9yZSBmaW5pc2hpbmcsIGFsbCBidXQgdGhlIGZpbmFsIHJlc3BvbnNlIHdpbGwgcmVzb2x2ZSB0byA8Y29kZT51bmRlZmluZWQ8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHJlc29sdmluZyB0aGUgdmlldyBzdGF0ZVxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI3JldHJpZXZlVmlld1N0YXRlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZXRyaWV2ZVZpZXdTdGF0ZSgpIHtcblx0XHQrK3RoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdHJldHVybiB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0U3RhdGVDb250cm9scyk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKGFDb250cm9sczogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Db250cm9sOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5tYXAoKG9Db250cm9sOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmV0cmlldmVDb250cm9sU3RhdGUob0NvbnRyb2wpLnRoZW4oKHZSZXN1bHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IHRoaXMuZ2V0U3RhdGVLZXkob0NvbnRyb2wpLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHZSZXN1bHRcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFSZXNvbHZlZFN0YXRlczogYW55KSB7XG5cdFx0XHRcdHJldHVybiBhUmVzb2x2ZWRTdGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChvU3RhdGVzOiBhbnksIG1TdGF0ZTogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZTogYW55ID0ge307XG5cdFx0XHRcdFx0b0N1cnJlbnRTdGF0ZVttU3RhdGUua2V5XSA9IG1TdGF0ZS52YWx1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbWVyZ2VPYmplY3RzKG9TdGF0ZXMsIG9DdXJyZW50U3RhdGUpO1xuXHRcdFx0XHR9LCB7fSk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9WaWV3U3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcygpKS50aGVuKGZ1bmN0aW9uIChtQWRkaXRpb25hbFN0YXRlczogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG1BZGRpdGlvbmFsU3RhdGVzICYmIE9iamVjdC5rZXlzKG1BZGRpdGlvbmFsU3RhdGVzKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG9WaWV3U3RhdGVbQURESVRJT05BTF9TVEFURVNfS0VZXSA9IG1BZGRpdGlvbmFsU3RhdGVzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gb1ZpZXdTdGF0ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHQtLXRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChvVmlld1N0YXRlOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyID09PSAwID8gb1ZpZXdTdGF0ZSA6IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4dGVuZCB0aGUgbWFwIG9mIGFkZGl0aW9uYWwgc3RhdGVzIChub3QgY29udHJvbCBib3VuZCkgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gdmlldy5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1BZGRpdGlvbmFsU3RhdGVzIFRoZSBhZGRpdGlvbmFsIHN0YXRlXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRyZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMobUFkZGl0aW9uYWxTdGF0ZXM6IG9iamVjdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiBhZGRpdGlvbmFsIHN0YXRlcyAobm90IGNvbnRyb2wgYm91bmQpIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUgb2YgdGhlIGdpdmVuIHZpZXcuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtvYmplY3QgfCBQcm9taXNlPG9iamVjdD59IEFkZGl0aW9uYWwgdmlldyBzdGF0ZXNcblx0ICovXG5cdF9yZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMoKSB7XG5cdFx0Y29uc3QgbUFkZGl0aW9uYWxTdGF0ZXMgPSB7fTtcblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLnJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyhtQWRkaXRpb25hbFN0YXRlcyk7XG5cdFx0cmV0dXJuIG1BZGRpdGlvbmFsU3RhdGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIHRoZSBnaXZlbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBzdGF0ZSBmb3Jcblx0ICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZXRyaWV2ZUNvbnRyb2xTdGF0ZShvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3QgYUNvbnRyb2xTdGF0ZUhhbmRsZXJzID0gdGhpcy5nZXRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMubWFwKChtQ29udHJvbFN0YXRlSGFuZGxlcjogYW55KSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbUNvbnRyb2xTdGF0ZUhhbmRsZXIucmV0cmlldmUgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRyb2xTdGF0ZUhhbmRsZXIucmV0cmlldmUgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtQ29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZS5jYWxsKHRoaXMsIG9Db250cm9sKTtcblx0XHRcdH0pXG5cdFx0KS50aGVuKChhU3RhdGVzOiBhbnlbXSkgPT4ge1xuXHRcdFx0cmV0dXJuIGFTdGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChvRmluYWxTdGF0ZTogYW55LCBvQ3VycmVudFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG1lcmdlT2JqZWN0cyhvRmluYWxTdGF0ZSwgb0N1cnJlbnRTdGF0ZSk7XG5cdFx0XHR9LCB7fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSB2aWV3IHN0YXRlIHNob3VsZCBvbmx5IGJlIGFwcGxpZWQgb25jZSBpbml0aWFsbHkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkfS5cblx0ICpcblx0ICogSW1wb3J0YW50OlxuXHQgKiBZb3Ugc2hvdWxkIG9ubHkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYWdlcyBhbmQgbm90IGZvciB0aGUgc3RhbmRhcmQgTGlzdFJlcG9ydFBhZ2UgYW5kIE9iamVjdFBhZ2UhXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBJZiA8Y29kZT50cnVlPC9jb2RlPiwgb25seSB0aGUgaW5pdGlhbCB2aWV3IHN0YXRlIGlzIGFwcGxpZWQgb25jZSxcblx0ICogZWxzZSBhbnkgbmV3IHZpZXcgc3RhdGUgaXMgYWxzbyBhcHBsaWVkIG9uIGZvbGxvdy11cCBjYWxscyAoZGVmYXVsdClcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseUluaXRpYWxTdGF0ZU9ubHlcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGFwcGx5SW5pdGlhbFN0YXRlT25seSgpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gdmlldyBzdGF0ZSB0byB0aGlzIGV4dGVuc2lvbnMgdmlldy5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3U3RhdGUgVGhlIHZpZXcgc3RhdGUgdG8gYXBwbHkgKGNhbiBiZSB1bmRlZmluZWQpXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTmF2UGFyYW1ldGVyIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSB7c2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZX0gb05hdlBhcmFtZXRlci5uYXZpZ2F0aW9uVHlwZSBUaGUgYWN0dWFsIG5hdmlnYXRpb24gdHlwZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50IFRoZSBzZWxlY3Rpb25WYXJpYW50IGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIuc2VsZWN0aW9uVmFyaWFudERlZmF1bHRzIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBvTmF2UGFyYW1ldGVyLnJlcXVpcmVzU3RhbmRhcmRWYXJpYW50IERlZmluZXMgd2hldGhlciBzdGFuZGFyZCB2YXJpYW50IG11c3QgYmUgdXNlZCBpbiBWTVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSBmb3IgYXN5bmMgc3RhdGUgaGFuZGxpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseVZpZXdTdGF0ZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXBwbHlWaWV3U3RhdGUoXG5cdFx0b1ZpZXdTdGF0ZTogYW55LFxuXHRcdG9OYXZQYXJhbWV0ZXI6IHtcblx0XHRcdG5hdmlnYXRpb25UeXBlOiBhbnk7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0O1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudERlZmF1bHRzPzogb2JqZWN0O1xuXHRcdFx0cmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRpZiAodGhpcy5iYXNlLnZpZXdTdGF0ZS5hcHBseUluaXRpYWxTdGF0ZU9ubHkoKSAmJiB0aGlzLl9nZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5vbkJlZm9yZVN0YXRlQXBwbGllZClcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdFN0YXRlQ29udHJvbHMpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChhQ29udHJvbHM6IGFueSkgPT4ge1xuXHRcdFx0XHRsZXQgb1Byb21pc2VDaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvQ29udHJvbDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIik7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0tleSA9IHRoaXMuZ2V0U3RhdGVLZXkob0NvbnRyb2wpO1xuXHRcdFx0XHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBseUNvbnRyb2xTdGF0ZS5iaW5kKHRoaXMsIG9Db250cm9sLCBvVmlld1N0YXRlID8gb1ZpZXdTdGF0ZVtzS2V5XSA6IHVuZGVmaW5lZCwgb05hdlBhcmFtZXRlcilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKG9OYXZQYXJhbWV0ZXIubmF2aWdhdGlvblR5cGUgPT09IE5hdlR5cGUuaUFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHMoXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFwcGx5QWRkaXRpb25hbFN0YXRlcyxcblx0XHRcdFx0XHRcdG9WaWV3U3RhdGUgPyBvVmlld1N0YXRlW0FERElUSU9OQUxfU1RBVEVTX0tFWV0gOiB1bmRlZmluZWRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycywgb05hdlBhcmFtZXRlcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUub25BZnRlclN0YXRlQXBwbGllZCkudGhlbih0aGlzLl9zZXRJbml0aWFsU3RhdGVBcHBsaWVkLmJpbmQodGhpcykpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdF9jaGVja0lmVmFyaWFudElkSXNBdmFpbGFibGUob1ZNOiBhbnksIHNWYXJpYW50SWQ6IGFueSkge1xuXHRcdGNvbnN0IGFWYXJpYW50cyA9IG9WTS5nZXRWYXJpYW50cygpO1xuXHRcdGxldCBiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlID0gZmFsc2U7XG5cdFx0YVZhcmlhbnRzLmZvckVhY2goZnVuY3Rpb24gKG9WYXJpYW50OiBhbnkpIHtcblx0XHRcdGlmIChvVmFyaWFudC5rZXkgPT09IHNWYXJpYW50SWQpIHtcblx0XHRcdFx0YklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGJJc0NvbnRyb2xTdGF0ZVZhcmlhbnRBdmFpbGFibGU7XG5cdH1cblxuXHRfc2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpIHtcblx0XHRpZiAodGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKSB7XG5cdFx0XHRjb25zdCBwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU7XG5cdFx0XHRkZWxldGUgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdFx0cEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cdF9nZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkge1xuXHRcdHJldHVybiAhdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3QgYmVmb3JlIGEgc3RhdGUgZm9yIGdpdmVuIHZpZXcgaXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQmVmb3JlU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3Qgd2hlbiBzdGF0ZSBmb3IgZ2l2ZW4gdmlldyB3YXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQWZ0ZXJTdGF0ZUFwcGxpZWRcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQWZ0ZXJTdGF0ZUFwcGxpZWQoYVByb21pc2VzOiBQcm9taXNlPGFueT4pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseWluZyBhZGRpdGlvbmFsLCBub3QgY29udHJvbCByZWxhdGVkLCBzdGF0ZXMgLSBpcyBjYWxsZWQgb25seSBpZiBuYXZpZ2F0aW9uIHR5cGUgaXMgaUFwcFN0YXRlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXdTdGF0ZSBUaGUgY3VycmVudCB2aWV3IHN0YXRlXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseUFkZGl0aW9uYWxTdGF0ZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFwcGx5QWRkaXRpb25hbFN0YXRlcyhvVmlld1N0YXRlOiBvYmplY3QsIGFQcm9taXNlczogUHJvbWlzZTxhbnk+KSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgLSBpcyBjYWxsZWQgb25seSBpZiBuYXZpZ2F0aW9uIHR5cGUgaXMgbm90IGlBcHBTdGF0ZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlfSBvTmF2UGFyYW1ldGVyLm5hdmlnYXRpb25UeXBlIFRoZSBhY3R1YWwgbmF2aWdhdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50XSBUaGUgc2VsZWN0aW9uVmFyaWFudCBmcm9tIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50RGVmYXVsdHNdIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBbb05hdlBhcmFtZXRlci5yZXF1aXJlc1N0YW5kYXJkVmFyaWFudF0gRGVmaW5lcyB3aGV0aGVyIHN0YW5kYXJkIHZhcmlhbnQgbXVzdCBiZSB1c2VkIGluIFZNXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdFx0b05hdlBhcmFtZXRlcjoge1xuXHRcdFx0bmF2aWdhdGlvblR5cGU6IGFueTtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50RGVmYXVsdHM/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRyZXF1aXJlc1N0YW5kYXJkVmFyaWFudD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0fSxcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdFx0YVByb21pc2VzOiBQcm9taXNlPGFueT5cblx0KSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseWluZyB0aGUgZ2l2ZW4gc3RhdGUgdG8gdGhlIGdpdmVuIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIG9iamVjdCB0byBhcHBseSB0aGUgZ2l2ZW4gc3RhdGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sU3RhdGUgVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29OYXZQYXJhbWV0ZXJzXSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge2FueX0gUmV0dXJuIGEgcHJvbWlzZSBmb3IgYXN5bmMgc3RhdGUgaGFuZGxpbmdcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXBwbHlDb250cm9sU3RhdGUob0NvbnRyb2w6IGFueSwgb0NvbnRyb2xTdGF0ZTogb2JqZWN0LCBvTmF2UGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdGNvbnN0IGFDb250cm9sU3RhdGVIYW5kbGVycyA9IHRoaXMuZ2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMuZm9yRWFjaCgobUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueSkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0fVxuXHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseS5iaW5kKHRoaXMsIG9Db250cm9sLCBvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycykpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHR9XG5cdGdldEludGVyZmFjZSgpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWV3U3RhdGU7XG4iXX0=
|