@sapui5/sap.fe.core 1.98.0 → 1.101.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -5
- package/src/sap/fe/core/.library +2 -3
- package/src/sap/fe/core/AnnotationHelper.js +328 -405
- package/src/sap/fe/core/AnnotationHelper.ts +321 -0
- package/src/sap/fe/core/AppComponent.js +382 -399
- package/src/sap/fe/core/AppComponent.ts +397 -0
- package/src/sap/fe/core/AppStateHandler.js +198 -181
- package/src/sap/fe/core/AppStateHandler.ts +171 -0
- package/src/sap/fe/core/BaseController.js +83 -58
- package/src/sap/fe/core/BaseController.ts +67 -0
- package/src/sap/fe/core/BusyLocker.js +105 -121
- package/src/sap/fe/core/BusyLocker.ts +98 -0
- package/src/sap/fe/core/CommonUtils.js +2221 -2399
- package/src/sap/fe/core/CommonUtils.ts +2248 -0
- package/src/sap/fe/core/ExtensionAPI.js +280 -274
- package/src/sap/fe/core/ExtensionAPI.ts +242 -0
- package/src/sap/fe/core/PageController.js +219 -131
- package/src/sap/fe/core/PageController.ts +129 -0
- package/src/sap/fe/core/RouterProxy.js +936 -823
- package/src/sap/fe/core/RouterProxy.ts +854 -0
- package/src/sap/fe/core/Synchronization.js +41 -35
- package/src/sap/fe/core/Synchronization.ts +29 -0
- package/src/sap/fe/core/TemplateComponent.js +248 -164
- package/src/sap/fe/core/TemplateComponent.ts +161 -0
- package/src/sap/fe/core/TemplateModel.js +77 -54
- package/src/sap/fe/core/TemplateModel.ts +63 -0
- package/src/sap/fe/core/TransactionHelper.js +1575 -1664
- package/src/sap/fe/core/TransactionHelper.ts +1736 -0
- 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 +663 -608
- package/src/sap/fe/core/actions/draft.ts +669 -0
- package/src/sap/fe/core/actions/messageHandling.js +576 -514
- package/src/sap/fe/core/actions/messageHandling.ts +562 -0
- package/src/sap/fe/core/actions/nonDraft.js +17 -19
- package/src/sap/fe/core/actions/nonDraft.ts +12 -0
- package/src/sap/fe/core/actions/operations.js +1093 -1215
- package/src/sap/fe/core/actions/operations.ts +1193 -0
- package/src/sap/fe/core/actions/sticky.js +114 -104
- package/src/sap/fe/core/actions/sticky.ts +119 -0
- 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 +1855 -1827
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +1792 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +60 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +717 -512
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +785 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -815
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +810 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1057 -1004
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1001 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +498 -533
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +36 -32
- package/src/sap/fe/core/controllerextensions/MassEdit.js +142 -77
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +155 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +222 -236
- 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 +63 -55
- package/src/sap/fe/core/controllerextensions/Paginator.js +189 -175
- package/src/sap/fe/core/controllerextensions/Paginator.ts +169 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -149
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +149 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +145 -121
- package/src/sap/fe/core/controllerextensions/Routing.ts +131 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
- package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Share.js +231 -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 +79 -79
- package/src/sap/fe/core/controllerextensions/ViewState.js +775 -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 +93 -68
- package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +166 -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 +168 -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 +164 -122
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +155 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +213 -153
- 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 +198 -159
- package/src/sap/fe/core/controls/FilterBar.ts +148 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +101 -39
- package/src/sap/fe/core/controls/FormElementWrapper.ts +37 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +148 -115
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +102 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +301 -265
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +252 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +186 -140
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -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 +76 -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 +23 -19
- package/src/sap/fe/core/converters/ManifestSettings.js +13 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +18 -2
- package/src/sap/fe/core/converters/ManifestWrapper.js +354 -365
- package/src/sap/fe/core/converters/ManifestWrapper.ts +19 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +16 -11
- package/src/sap/fe/core/converters/MetaModelConverter.ts +21 -18
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
- 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/common/AnnotationConverter.js +17 -13
- package/src/sap/fe/core/converters/controls/Common/Action.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/Action.ts +22 -21
- package/src/sap/fe/core/converters/controls/Common/Chart.js +12 -10
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -14
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +9 -7
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -5
- 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 +562 -218
- package/src/sap/fe/core/converters/controls/Common/Table.ts +670 -320
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +218 -94
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +265 -159
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +495 -77
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +535 -130
- 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 +10 -7
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +13 -16
- package/src/sap/fe/core/converters/helpers/Aggregation.js +117 -127
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
- 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/IssueManager.js +4 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -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 +54 -30
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +69 -43
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +52 -28
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +111 -74
- 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 +93 -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/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
- package/src/sap/fe/core/formatters/KPIFormatter.ts +4 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
- package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
- package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
- package/src/sap/fe/core/formatters/ValueFormatter.ts +5 -7
- package/src/sap/fe/core/fpm/Component.js +81 -55
- package/src/sap/fe/core/fpm/Component.ts +43 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +324 -310
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +370 -341
- package/src/sap/fe/core/helpers/BindingExpression.js +319 -360
- package/src/sap/fe/core/helpers/BindingExpression.ts +323 -397
- package/src/sap/fe/core/helpers/ClassSupport.js +321 -168
- package/src/sap/fe/core/helpers/ClassSupport.ts +362 -158
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
- package/src/sap/fe/core/helpers/EditState.js +81 -84
- package/src/sap/fe/core/helpers/EditState.ts +81 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
- package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -4
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
- package/src/sap/fe/core/helpers/MassEditHelper.js +736 -676
- package/src/sap/fe/core/helpers/MassEditHelper.ts +803 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +281 -225
- package/src/sap/fe/core/helpers/ModelHelper.ts +273 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
- package/src/sap/fe/core/helpers/PasteHelper.ts +197 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +336 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -10
- package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -10
- package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
- package/src/sap/fe/core/jsx-runtime/jsx.ts +23 -9
- package/src/sap/fe/core/library.js +426 -451
- package/src/sap/fe/core/library.support.js +23 -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 +5 -5
- package/src/sap/fe/core/messagebundle.properties +63 -18
- package/src/sap/fe/core/messagebundle_ar.properties +37 -6
- package/src/sap/fe/core/messagebundle_bg.properties +37 -6
- package/src/sap/fe/core/messagebundle_ca.properties +37 -6
- package/src/sap/fe/core/messagebundle_cs.properties +38 -7
- package/src/sap/fe/core/messagebundle_cy.properties +37 -6
- package/src/sap/fe/core/messagebundle_da.properties +37 -6
- package/src/sap/fe/core/messagebundle_de.properties +37 -6
- package/src/sap/fe/core/messagebundle_el.properties +37 -6
- package/src/sap/fe/core/messagebundle_en.properties +37 -6
- package/src/sap/fe/core/messagebundle_en_GB.properties +37 -6
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -6
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +37 -6
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +37 -6
- package/src/sap/fe/core/messagebundle_es.properties +37 -6
- package/src/sap/fe/core/messagebundle_es_MX.properties +37 -6
- package/src/sap/fe/core/messagebundle_et.properties +37 -6
- package/src/sap/fe/core/messagebundle_fi.properties +38 -7
- package/src/sap/fe/core/messagebundle_fr.properties +43 -12
- package/src/sap/fe/core/messagebundle_fr_CA.properties +45 -14
- package/src/sap/fe/core/messagebundle_hi.properties +43 -12
- package/src/sap/fe/core/messagebundle_hr.properties +43 -12
- package/src/sap/fe/core/messagebundle_hu.properties +37 -6
- package/src/sap/fe/core/messagebundle_id.properties +38 -7
- package/src/sap/fe/core/messagebundle_it.properties +37 -6
- package/src/sap/fe/core/messagebundle_iw.properties +37 -6
- package/src/sap/fe/core/messagebundle_ja.properties +36 -5
- package/src/sap/fe/core/messagebundle_kk.properties +43 -12
- package/src/sap/fe/core/messagebundle_ko.properties +37 -6
- package/src/sap/fe/core/messagebundle_lt.properties +37 -6
- package/src/sap/fe/core/messagebundle_lv.properties +44 -13
- package/src/sap/fe/core/messagebundle_ms.properties +42 -11
- package/src/sap/fe/core/messagebundle_nl.properties +37 -6
- package/src/sap/fe/core/messagebundle_no.properties +37 -6
- package/src/sap/fe/core/messagebundle_pl.properties +37 -6
- package/src/sap/fe/core/messagebundle_pt.properties +38 -7
- package/src/sap/fe/core/messagebundle_pt_PT.properties +37 -6
- package/src/sap/fe/core/messagebundle_ro.properties +37 -6
- package/src/sap/fe/core/messagebundle_ru.properties +37 -6
- package/src/sap/fe/core/messagebundle_sh.properties +39 -8
- package/src/sap/fe/core/messagebundle_sk.properties +37 -6
- package/src/sap/fe/core/messagebundle_sl.properties +43 -12
- package/src/sap/fe/core/messagebundle_sv.properties +38 -7
- package/src/sap/fe/core/messagebundle_th.properties +36 -5
- package/src/sap/fe/core/messagebundle_tr.properties +39 -8
- package/src/sap/fe/core/messagebundle_uk.properties +37 -6
- package/src/sap/fe/core/messagebundle_vi.properties +37 -6
- package/src/sap/fe/core/messagebundle_zh_CN.properties +37 -6
- package/src/sap/fe/core/messagebundle_zh_TW.properties +43 -12
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +47 -73
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +211 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +70 -96
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -8
- package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +963 -899
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +907 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +694 -741
- package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -40
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +572 -643
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +67 -96
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -487
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +449 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +48 -8
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +11 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
- 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/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +138 -79
- package/src/sap/fe/core/templating/FilterHelper.ts +148 -79
- 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 +179 -43
- package/src/sap/fe/core/templating/UIFormatters.ts +190 -61
- package/src/sap/fe/core/type/Email.js +26 -8
- package/src/sap/fe/core/type/Email.ts +10 -11
- package/ui5.yaml +0 -3
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -74
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/ui/base/ManagedObject", "sap/ui/core/util/XMLPreprocessor"], function (ManagedObject, XMLPreprocessor) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//Trace information
|
|
9
|
+
var aTraceInfo = [
|
|
10
|
+
/* Structure for a macro
|
|
11
|
+
{
|
|
12
|
+
macro: '', //name of macro
|
|
13
|
+
metaDataContexts: [ //Properties of type sap.ui.model.Context
|
|
14
|
+
{
|
|
15
|
+
name: '', //context property name / key
|
|
16
|
+
path: '', //from oContext.getPath()
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
properties: { // Other properties which become part of {this>}
|
|
20
|
+
property1: value,
|
|
21
|
+
property2: value
|
|
22
|
+
}
|
|
23
|
+
viewInfo: {
|
|
24
|
+
viewInfo: {} // As specified in view or fragement creation
|
|
25
|
+
},
|
|
26
|
+
traceID: this.index, //ID for this trace information,
|
|
27
|
+
macroInfo: {
|
|
28
|
+
macroID: index, // traceID of this macro (redundant for macros)
|
|
29
|
+
parentMacroID, index // traceID of the parent macro (if it has a parent)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Structure for a control
|
|
33
|
+
{
|
|
34
|
+
control: '', //control class
|
|
35
|
+
properties: { // Other properties which become part of {this>}
|
|
36
|
+
property1: {
|
|
37
|
+
originalValue: '', //Value before templating
|
|
38
|
+
resolvedValue: '' //Value after templating
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
contexts: { //Models and Contexts used during templating
|
|
42
|
+
// Model or context name used for this control
|
|
43
|
+
modelName1: { // For ODataMetaModel
|
|
44
|
+
path1: {
|
|
45
|
+
path: '', //absolut path within metamodel
|
|
46
|
+
data: '', //data of path unless type Object
|
|
47
|
+
}
|
|
48
|
+
modelName2: {
|
|
49
|
+
// for other model types
|
|
50
|
+
{
|
|
51
|
+
property1: value,
|
|
52
|
+
property2: value
|
|
53
|
+
}
|
|
54
|
+
// In case binding cannot be resolved -> mark as runtime binding
|
|
55
|
+
// This is not always true, e.g. in case the path is metamodelpath
|
|
56
|
+
{
|
|
57
|
+
"bindingFor": "Runtime"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
viewInfo: {
|
|
62
|
+
viewInfo: {} // As specified in view or fragement creation
|
|
63
|
+
},
|
|
64
|
+
macroInfo: {
|
|
65
|
+
macroID: index, // traceID of the macro that created this control
|
|
66
|
+
parentMacroID, index // traceID of the macro's parent macro
|
|
67
|
+
},
|
|
68
|
+
traceID: this.index //ID for this trace information
|
|
69
|
+
}
|
|
70
|
+
*/
|
|
71
|
+
];
|
|
72
|
+
var traceNamespace = "http://schemas.sap.com/sapui5/extension/sap.fe.info/1",
|
|
73
|
+
xmlns = "http://www.w3.org/2000/xmlns/",
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Switch is currently based on url parameter
|
|
77
|
+
*/
|
|
78
|
+
traceIsOn = location.search.indexOf("sap-ui-xx-feTraceInfo=true") > -1,
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Specify all namespaces that shall be traced during templating
|
|
82
|
+
*/
|
|
83
|
+
aNamespaces = ["sap.m", "sap.uxap", "sap.ui.unified", "sap.f", "sap.ui.table", "sap.suite.ui.microchart", "sap.ui.layout.form", "sap.ui.mdc", "sap.ui.mdc.link", "sap.ui.mdc.field", "sap.fe.fpm"],
|
|
84
|
+
oCallbacks = {};
|
|
85
|
+
|
|
86
|
+
function fnClone(oObject) {
|
|
87
|
+
return JSON.parse(JSON.stringify(oObject));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function collectContextInfo(sValue, oContexts, oVisitor, oNode) {
|
|
91
|
+
var aContexts;
|
|
92
|
+
var aPromises = [];
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
aContexts = ManagedObject.bindingParser(sValue, undefined, false, true) || [];
|
|
96
|
+
} catch (e) {
|
|
97
|
+
aContexts = [];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
aContexts = Array.isArray(aContexts) ? aContexts : [aContexts];
|
|
101
|
+
aContexts.filter(function (oContext) {
|
|
102
|
+
return oContext.path || oContext.parts;
|
|
103
|
+
}).forEach(function (oContext) {
|
|
104
|
+
var aParts = oContext.parts || [oContext];
|
|
105
|
+
aParts.filter(function (oContext) {
|
|
106
|
+
return oContext.path;
|
|
107
|
+
}).forEach(function (oContext) {
|
|
108
|
+
var oModel = oContexts[oContext.model] = oContexts[oContext.model] || {};
|
|
109
|
+
var sSimplePath = oContext.path.indexOf(">") < 0 ? (oContext.model && oContext.model + ">") + oContext.path : oContext.path;
|
|
110
|
+
var oRealContext;
|
|
111
|
+
var aParts;
|
|
112
|
+
|
|
113
|
+
if (typeof oContext.model === "undefined" && sSimplePath.indexOf(">") > -1) {
|
|
114
|
+
aParts = sSimplePath.split(">");
|
|
115
|
+
oContext.model = aParts[0];
|
|
116
|
+
oContext.path = aParts[1];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
oRealContext = oVisitor.getContext(sSimplePath);
|
|
121
|
+
aPromises.push(oVisitor.getResult("{" + sSimplePath + "}", oNode).then(function (oResult) {
|
|
122
|
+
if (oRealContext.getModel().getMetadata().getName() === "sap.ui.model.json.JSONModel") {
|
|
123
|
+
if (!oResult.oModel) {
|
|
124
|
+
oModel[oContext.path] = oResult; //oRealContext.getObject(oContext.path);
|
|
125
|
+
} else {
|
|
126
|
+
oModel[oContext.path] = "Context from " + oResult.getPath();
|
|
127
|
+
}
|
|
128
|
+
} else {
|
|
129
|
+
oModel[oContext.path] = {
|
|
130
|
+
path: oRealContext.getPath(),
|
|
131
|
+
data: typeof oResult === "object" ? "[ctrl/cmd-click] on path to see data" : oResult
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}).catch(function () {
|
|
135
|
+
oModel[oContext.path] = {
|
|
136
|
+
bindingFor: "Runtime"
|
|
137
|
+
};
|
|
138
|
+
}));
|
|
139
|
+
} catch (exc) {
|
|
140
|
+
oModel[oContext.path] = {
|
|
141
|
+
bindingFor: "Runtime"
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
return Promise.all(aPromises);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function fillAttributes(oResults, oAttributes, sName, sValue) {
|
|
150
|
+
return oResults.then(function (result) {
|
|
151
|
+
oAttributes[sName] = sValue !== result ? {
|
|
152
|
+
originalValue: sValue,
|
|
153
|
+
resolvedValue: result
|
|
154
|
+
} : sValue;
|
|
155
|
+
}).catch(function (e) {
|
|
156
|
+
oAttributes[sName] = {
|
|
157
|
+
originalValue: sValue,
|
|
158
|
+
error: e.stack && e.stack.toString() || e
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function collectInfo(oNode, oVisitor) {
|
|
164
|
+
var oAttributes = {};
|
|
165
|
+
var aPromises = [];
|
|
166
|
+
var oContexts = {};
|
|
167
|
+
var oResults;
|
|
168
|
+
|
|
169
|
+
for (var i = oNode.attributes.length >>> 0; i--;) {
|
|
170
|
+
var oAttribute = oNode.attributes[i],
|
|
171
|
+
sName = oAttribute.nodeName,
|
|
172
|
+
sValue = oNode.getAttribute(sName);
|
|
173
|
+
|
|
174
|
+
if (!["core:require"].includes(sName)) {
|
|
175
|
+
aPromises.push(collectContextInfo(sValue, oContexts, oVisitor, oNode));
|
|
176
|
+
oResults = oVisitor.getResult(sValue, oNode);
|
|
177
|
+
|
|
178
|
+
if (oResults) {
|
|
179
|
+
aPromises.push(fillAttributes(oResults, oAttributes, sName, sValue));
|
|
180
|
+
} else {//What
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return Promise.all(aPromises).then(function () {
|
|
186
|
+
return {
|
|
187
|
+
properties: oAttributes,
|
|
188
|
+
contexts: oContexts
|
|
189
|
+
};
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function resolve(oNode, oVisitor) {
|
|
194
|
+
var sControlName = oNode.nodeName.split(":")[1] || oNode.nodeName,
|
|
195
|
+
bIsControl = /^[A-Z]/.test(sControlName),
|
|
196
|
+
oTraceMetadataContext = {
|
|
197
|
+
control: oNode.namespaceURI + "." + (oNode.nodeName.split(":")[1] || oNode.nodeName)
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
if (bIsControl) {
|
|
201
|
+
if (!oNode.ownerDocument.firstChild.getAttribute("xmlns:trace")) {
|
|
202
|
+
oNode.ownerDocument.firstChild.setAttributeNS(xmlns, "xmlns:trace", traceNamespace);
|
|
203
|
+
oNode.ownerDocument.firstChild.setAttributeNS(traceNamespace, "trace:is", "on");
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return collectInfo(oNode, oVisitor).then(function (result) {
|
|
207
|
+
var bRelevant = Object.keys(result.contexts).length > 0; //If no context was used it is not relevant so we ignore Object.keys(result.properties).length
|
|
208
|
+
|
|
209
|
+
if (bRelevant) {
|
|
210
|
+
Object.assign(oTraceMetadataContext, result);
|
|
211
|
+
oTraceMetadataContext.viewInfo = oVisitor.getViewInfo();
|
|
212
|
+
oTraceMetadataContext.macroInfo = oVisitor.getSettings()["_macroInfo"];
|
|
213
|
+
oTraceMetadataContext.traceID = aTraceInfo.length;
|
|
214
|
+
oNode.setAttributeNS(traceNamespace, "trace:traceID", oTraceMetadataContext.traceID);
|
|
215
|
+
aTraceInfo.push(oTraceMetadataContext);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return oVisitor.visitAttributes(oNode).then(function () {
|
|
219
|
+
return oVisitor.visitChildNodes(oNode);
|
|
220
|
+
});
|
|
221
|
+
}).catch(function (exc) {
|
|
222
|
+
oTraceMetadataContext.error = {
|
|
223
|
+
exception: exc,
|
|
224
|
+
node: new XMLSerializer().serializeToString(oNode)
|
|
225
|
+
};
|
|
226
|
+
});
|
|
227
|
+
} else {
|
|
228
|
+
return oVisitor.visitAttributes(oNode).then(function () {
|
|
229
|
+
return oVisitor.visitChildNodes(oNode);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Register path-through XMLPreprocessor plugin for all namespaces
|
|
235
|
+
* given above in aNamespaces
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
if (traceIsOn) {
|
|
240
|
+
aNamespaces.forEach(function (namespace) {
|
|
241
|
+
oCallbacks[namespace] = XMLPreprocessor.plugIn(resolve.bind(namespace), namespace);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Adds information about the processing of one macro to the collection.
|
|
246
|
+
*
|
|
247
|
+
* @name sap.fe.macros.TraceInfo.traceMacroCalls
|
|
248
|
+
* @param {string} sName Macro class name
|
|
249
|
+
* @param {object} oMetadata Definition from (macro).metadata.js
|
|
250
|
+
* @param {object} mContexts Available named contexts
|
|
251
|
+
* @param {XMLNode} oNode
|
|
252
|
+
* @param {object} oVisitor
|
|
253
|
+
* @returns {object}
|
|
254
|
+
* @private
|
|
255
|
+
* @ui5-restricted
|
|
256
|
+
* @static
|
|
257
|
+
*/
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
function traceMacroCalls(sName, oMetadata, mContexts, oNode, oVisitor) {
|
|
261
|
+
var aMetadataContextKeys = oMetadata.metadataContexts && Object.keys(oMetadata.metadataContexts) || [];
|
|
262
|
+
var aProperties = oMetadata.properties && Object.keys(oMetadata.properties) || [];
|
|
263
|
+
var macroInfo = fnClone(oVisitor.getSettings()["_macroInfo"] || {});
|
|
264
|
+
var oTraceMetadataContext = {
|
|
265
|
+
macro: sName,
|
|
266
|
+
metaDataContexts: [],
|
|
267
|
+
properties: {}
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
if (aMetadataContextKeys.length === 0) {
|
|
271
|
+
//In case the macro has not metadata.js we take all metadataContexts except this
|
|
272
|
+
aMetadataContextKeys = Object.keys(mContexts).filter(function (name) {
|
|
273
|
+
return name !== "this";
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (!oNode.getAttribute("xmlns:trace")) {
|
|
278
|
+
oNode.setAttributeNS(xmlns, "xmlns:trace", traceNamespace);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (aMetadataContextKeys.length > 0) {
|
|
282
|
+
aMetadataContextKeys.forEach(function (sKey) {
|
|
283
|
+
var oContext = mContexts[sKey],
|
|
284
|
+
oMetaDataContext = oContext && {
|
|
285
|
+
name: sKey,
|
|
286
|
+
path: oContext.getPath() //data: JSON.stringify(oContext.getObject(),null,2)
|
|
287
|
+
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
if (oMetaDataContext) {
|
|
291
|
+
oTraceMetadataContext.metaDataContexts.push(oMetaDataContext);
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
aProperties.forEach(function (sKey) {
|
|
295
|
+
var //oPropertySettings = oMetadata.properties[sKey],
|
|
296
|
+
oProperty = mContexts.this.getObject(sKey); // (oNode.hasAttribute(sKey) && oNode.getAttribute(sKey)) ||
|
|
297
|
+
// (oPropertySettings.hasOwnProperty("defaultValue") && oPropertySettings.define) ||
|
|
298
|
+
// false;
|
|
299
|
+
|
|
300
|
+
if (oProperty) {
|
|
301
|
+
oTraceMetadataContext.properties[sKey] = oProperty;
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
oTraceMetadataContext.viewInfo = oVisitor.getViewInfo();
|
|
305
|
+
oTraceMetadataContext.traceID = aTraceInfo.length;
|
|
306
|
+
macroInfo.parentMacroID = macroInfo.macroID;
|
|
307
|
+
macroInfo.macroID = oTraceMetadataContext.traceID;
|
|
308
|
+
oTraceMetadataContext.macroInfo = macroInfo;
|
|
309
|
+
oNode.setAttributeNS(traceNamespace, "trace:macroID", oTraceMetadataContext.traceID);
|
|
310
|
+
aTraceInfo.push(oTraceMetadataContext);
|
|
311
|
+
return oTraceMetadataContext;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Returns the globally stored trace information for the macro or
|
|
316
|
+
* control marked with the given id.
|
|
317
|
+
*
|
|
318
|
+
* Returns all trace information if no id is specified
|
|
319
|
+
*
|
|
320
|
+
*
|
|
321
|
+
<pre>Structure for a macro
|
|
322
|
+
{
|
|
323
|
+
macro: '', //name of macro
|
|
324
|
+
metaDataContexts: [ //Properties of type sap.ui.model.Context
|
|
325
|
+
{
|
|
326
|
+
name: '', //context property name / key
|
|
327
|
+
path: '', //from oContext.getPath()
|
|
328
|
+
}
|
|
329
|
+
],
|
|
330
|
+
properties: { // Other properties which become part of {this>}
|
|
331
|
+
property1: value,
|
|
332
|
+
property2: value
|
|
333
|
+
}
|
|
334
|
+
viewInfo: {
|
|
335
|
+
viewInfo: {} // As specified in view or fragement creation
|
|
336
|
+
},
|
|
337
|
+
traceID: this.index, //ID for this trace information,
|
|
338
|
+
macroInfo: {
|
|
339
|
+
macroID: index, // traceID of this macro (redundant for macros)
|
|
340
|
+
parentMacroID, index // traceID of the parent macro (if it has a parent)
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
Structure for a control
|
|
344
|
+
{
|
|
345
|
+
control: '', //control class
|
|
346
|
+
properties: { // Other properties which become part of {this>}
|
|
347
|
+
property1: {
|
|
348
|
+
originalValue: '', //Value before templating
|
|
349
|
+
resolvedValue: '' //Value after templating
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
contexts: { //Models and Contexts used during templating
|
|
353
|
+
// Model or context name used for this control
|
|
354
|
+
modelName1: { // For ODataMetaModel
|
|
355
|
+
path1: {
|
|
356
|
+
path: '', //absolut path within metamodel
|
|
357
|
+
data: '', //data of path unless type Object
|
|
358
|
+
}
|
|
359
|
+
modelName2: {
|
|
360
|
+
// for other model types
|
|
361
|
+
{
|
|
362
|
+
property1: value,
|
|
363
|
+
property2: value
|
|
364
|
+
}
|
|
365
|
+
// In case binding cannot be resolved -> mark as runtime binding
|
|
366
|
+
// This is not always true, e.g. in case the path is metamodelpath
|
|
367
|
+
{
|
|
368
|
+
"bindingFor": "Runtime"
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
viewInfo: {
|
|
373
|
+
viewInfo: {} // As specified in view or fragement creation
|
|
374
|
+
},
|
|
375
|
+
macroInfo: {
|
|
376
|
+
macroID: index, // traceID of the macro that created this control
|
|
377
|
+
parentMacroID, index // traceID of the macro's parent macro
|
|
378
|
+
},
|
|
379
|
+
traceID: this.index //ID for this trace information
|
|
380
|
+
}</pre>.
|
|
381
|
+
*
|
|
382
|
+
* @function
|
|
383
|
+
* @name sap.fe.macros.TraceInfo.getTraceInfo
|
|
384
|
+
* @param {number} id TraceInfo id
|
|
385
|
+
* @returns {object|Array} Object / Array for TraceInfo
|
|
386
|
+
* @private
|
|
387
|
+
* @static
|
|
388
|
+
*/
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
function getTraceInfo(id) {
|
|
392
|
+
if (id) {
|
|
393
|
+
return aTraceInfo[id];
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
var aErrors = aTraceInfo.filter(function (traceInfo) {
|
|
397
|
+
return traceInfo.error;
|
|
398
|
+
});
|
|
399
|
+
return aErrors.length > 0 && aErrors || aTraceInfo;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Returns true if TraceInfo is active.
|
|
403
|
+
*
|
|
404
|
+
* @function
|
|
405
|
+
* @name sap.fe.macros.TraceInfo.isTraceInfoActive
|
|
406
|
+
* @returns {boolean} `true` when active
|
|
407
|
+
* @private
|
|
408
|
+
* @static
|
|
409
|
+
*/
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
function isTraceInfoActive() {
|
|
413
|
+
return traceIsOn;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* @typedef sap.fe.macros.TraceInfo
|
|
417
|
+
* TraceInfo for SAP Fiori elements
|
|
418
|
+
*
|
|
419
|
+
* Once traces is switched, information about macros and controls
|
|
420
|
+
* that are processed during xml preprocessing ( @see {@link sap.ui.core.util.XMLPreprocessor})
|
|
421
|
+
* will be collected within this singleton
|
|
422
|
+
* @namespace
|
|
423
|
+
* @private
|
|
424
|
+
* @global
|
|
425
|
+
* @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
|
|
426
|
+
* @since 1.74.0
|
|
427
|
+
*/
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
return {
|
|
431
|
+
isTraceInfoActive: isTraceInfoActive,
|
|
432
|
+
traceMacroCalls: traceMacroCalls,
|
|
433
|
+
getTraceInfo: getTraceInfo
|
|
434
|
+
};
|
|
435
|
+
}, true);
|
|
436
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyYWNlSW5mby50cyJdLCJuYW1lcyI6WyJhVHJhY2VJbmZvIiwidHJhY2VOYW1lc3BhY2UiLCJ4bWxucyIsInRyYWNlSXNPbiIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5kZXhPZiIsImFOYW1lc3BhY2VzIiwib0NhbGxiYWNrcyIsImZuQ2xvbmUiLCJvT2JqZWN0IiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiY29sbGVjdENvbnRleHRJbmZvIiwic1ZhbHVlIiwib0NvbnRleHRzIiwib1Zpc2l0b3IiLCJvTm9kZSIsImFDb250ZXh0cyIsImFQcm9taXNlcyIsIk1hbmFnZWRPYmplY3QiLCJiaW5kaW5nUGFyc2VyIiwidW5kZWZpbmVkIiwiZSIsIkFycmF5IiwiaXNBcnJheSIsImZpbHRlciIsIm9Db250ZXh0IiwicGF0aCIsInBhcnRzIiwiZm9yRWFjaCIsImFQYXJ0cyIsIm9Nb2RlbCIsIm1vZGVsIiwic1NpbXBsZVBhdGgiLCJvUmVhbENvbnRleHQiLCJzcGxpdCIsImdldENvbnRleHQiLCJwdXNoIiwiZ2V0UmVzdWx0IiwidGhlbiIsIm9SZXN1bHQiLCJnZXRNb2RlbCIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImdldFBhdGgiLCJkYXRhIiwiY2F0Y2giLCJiaW5kaW5nRm9yIiwiZXhjIiwiUHJvbWlzZSIsImFsbCIsImZpbGxBdHRyaWJ1dGVzIiwib1Jlc3VsdHMiLCJvQXR0cmlidXRlcyIsInNOYW1lIiwicmVzdWx0Iiwib3JpZ2luYWxWYWx1ZSIsInJlc29sdmVkVmFsdWUiLCJlcnJvciIsInN0YWNrIiwidG9TdHJpbmciLCJjb2xsZWN0SW5mbyIsImkiLCJhdHRyaWJ1dGVzIiwibGVuZ3RoIiwib0F0dHJpYnV0ZSIsIm5vZGVOYW1lIiwiZ2V0QXR0cmlidXRlIiwiaW5jbHVkZXMiLCJwcm9wZXJ0aWVzIiwiY29udGV4dHMiLCJyZXNvbHZlIiwic0NvbnRyb2xOYW1lIiwiYklzQ29udHJvbCIsInRlc3QiLCJvVHJhY2VNZXRhZGF0YUNvbnRleHQiLCJjb250cm9sIiwibmFtZXNwYWNlVVJJIiwib3duZXJEb2N1bWVudCIsImZpcnN0Q2hpbGQiLCJzZXRBdHRyaWJ1dGVOUyIsImJSZWxldmFudCIsIk9iamVjdCIsImtleXMiLCJhc3NpZ24iLCJ2aWV3SW5mbyIsImdldFZpZXdJbmZvIiwibWFjcm9JbmZvIiwiZ2V0U2V0dGluZ3MiLCJ0cmFjZUlEIiwidmlzaXRBdHRyaWJ1dGVzIiwidmlzaXRDaGlsZE5vZGVzIiwiZXhjZXB0aW9uIiwibm9kZSIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsIm5hbWVzcGFjZSIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsImJpbmQiLCJ0cmFjZU1hY3JvQ2FsbHMiLCJvTWV0YWRhdGEiLCJtQ29udGV4dHMiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsIm1ldGFkYXRhQ29udGV4dHMiLCJhUHJvcGVydGllcyIsIm1hY3JvIiwibWV0YURhdGFDb250ZXh0cyIsIm5hbWUiLCJzS2V5Iiwib01ldGFEYXRhQ29udGV4dCIsIm9Qcm9wZXJ0eSIsInRoaXMiLCJnZXRPYmplY3QiLCJwYXJlbnRNYWNyb0lEIiwibWFjcm9JRCIsImdldFRyYWNlSW5mbyIsImlkIiwiYUVycm9ycyIsInRyYWNlSW5mbyIsImlzVHJhY2VJbmZvQWN0aXZlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBQUE7QUFDQSxNQUFNQSxVQUFpQixHQUFHO0FBQ3pCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTMEgsaUJBQVQsR0FBNkI7QUFDNUIsV0FBT3ZILFNBQVA7QUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7U0FDZTtBQUNkdUgsSUFBQUEsaUJBQWlCLEVBQUVBLGlCQURMO0FBRWRwQixJQUFBQSxlQUFlLEVBQUVBLGVBRkg7QUFHZGdCLElBQUFBLFlBQVksRUFBRUE7QUFIQSxHIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbi8vVHJhY2UgaW5mb3JtYXRpb25cbmNvbnN0IGFUcmFjZUluZm86IGFueVtdID0gW1xuXHQvKiBTdHJ1Y3R1cmUgZm9yIGEgbWFjcm9cblx0XHRcdHtcblx0XHRcdFx0bWFjcm86ICcnLCAvL25hbWUgb2YgbWFjcm9cblx0XHRcdFx0bWV0YURhdGFDb250ZXh0czogWyAvL1Byb3BlcnRpZXMgb2YgdHlwZSBzYXAudWkubW9kZWwuQ29udGV4dFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6ICcnLCAvL2NvbnRleHQgcHJvcGVydHkgbmFtZSAvIGtleVxuXHRcdFx0XHRcdFx0cGF0aDogJycsIC8vZnJvbSBvQ29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0sXG5cdFx0XHRcdHByb3BlcnRpZXM6IHsgLy8gT3RoZXIgcHJvcGVydGllcyB3aGljaCBiZWNvbWUgcGFydCBvZiB7dGhpcz59XG5cdFx0XHRcdFx0cHJvcGVydHkxOiB2YWx1ZSxcblx0XHRcdFx0XHRwcm9wZXJ0eTI6IHZhbHVlXG5cdFx0XHRcdH1cblx0XHRcdFx0dmlld0luZm86IHtcblx0XHRcdFx0XHR2aWV3SW5mbzoge30gLy8gQXMgc3BlY2lmaWVkIGluIHZpZXcgb3IgZnJhZ2VtZW50IGNyZWF0aW9uXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRyYWNlSUQ6IHRoaXMuaW5kZXgsIC8vSUQgZm9yIHRoaXMgdHJhY2UgaW5mb3JtYXRpb24sXG5cdFx0XHRcdG1hY3JvSW5mbzoge1xuXHRcdFx0XHRcdG1hY3JvSUQ6IGluZGV4LCAvLyB0cmFjZUlEIG9mIHRoaXMgbWFjcm8gKHJlZHVuZGFudCBmb3IgbWFjcm9zKVxuXHRcdFx0XHRcdHBhcmVudE1hY3JvSUQsIGluZGV4IC8vIHRyYWNlSUQgb2YgdGhlIHBhcmVudCBtYWNybyAoaWYgaXQgaGFzIGEgcGFyZW50KVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBTdHJ1Y3R1cmUgZm9yIGEgY29udHJvbFxuXHRcdFx0e1xuXHRcdFx0XHRjb250cm9sOiAnJywgLy9jb250cm9sIGNsYXNzXG5cdFx0XHRcdHByb3BlcnRpZXM6IHsgLy8gT3RoZXIgcHJvcGVydGllcyB3aGljaCBiZWNvbWUgcGFydCBvZiB7dGhpcz59XG5cdFx0XHRcdFx0cHJvcGVydHkxOiB7XG5cdFx0XHRcdFx0XHRvcmlnaW5hbFZhbHVlOiAnJywgLy9WYWx1ZSBiZWZvcmUgdGVtcGxhdGluZ1xuXHRcdFx0XHRcdFx0cmVzb2x2ZWRWYWx1ZTogJycgLy9WYWx1ZSBhZnRlciB0ZW1wbGF0aW5nXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHRzOiB7IC8vTW9kZWxzIGFuZCBDb250ZXh0cyB1c2VkIGR1cmluZyB0ZW1wbGF0aW5nXG5cdFx0XHRcdFx0Ly8gTW9kZWwgb3IgY29udGV4dCBuYW1lIHVzZWQgZm9yIHRoaXMgY29udHJvbFxuXHRcdFx0XHRcdG1vZGVsTmFtZTE6IHsgLy8gRm9yIE9EYXRhTWV0YU1vZGVsXG5cdFx0XHRcdFx0XHRwYXRoMToge1xuXHRcdFx0XHRcdFx0XHRwYXRoOiAnJywgLy9hYnNvbHV0IHBhdGggd2l0aGluIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0XHRkYXRhOiAnJywgLy9kYXRhIG9mIHBhdGggdW5sZXNzIHR5cGUgT2JqZWN0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kZWxOYW1lMjoge1xuXHRcdFx0XHRcdFx0Ly8gZm9yIG90aGVyIG1vZGVsIHR5cGVzXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5MTogdmFsdWUsXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5MjogdmFsdWVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIEluIGNhc2UgYmluZGluZyBjYW5ub3QgYmUgcmVzb2x2ZWQgLT4gbWFyayBhcyBydW50aW1lIGJpbmRpbmdcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgbm90IGFsd2F5cyB0cnVlLCBlLmcuIGluIGNhc2UgdGhlIHBhdGggaXMgbWV0YW1vZGVscGF0aFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcImJpbmRpbmdGb3JcIjogXCJSdW50aW1lXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHZpZXdJbmZvOiB7XG5cdFx0XHRcdFx0dmlld0luZm86IHt9IC8vIEFzIHNwZWNpZmllZCBpbiB2aWV3IG9yIGZyYWdlbWVudCBjcmVhdGlvblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRtYWNyb0luZm86IHtcblx0XHRcdFx0XHRtYWNyb0lEOiBpbmRleCwgLy8gdHJhY2VJRCBvZiB0aGUgbWFjcm8gdGhhdCBjcmVhdGVkIHRoaXMgY29udHJvbFxuXHRcdFx0XHRcdHBhcmVudE1hY3JvSUQsIGluZGV4IC8vIHRyYWNlSUQgb2YgdGhlIG1hY3JvJ3MgcGFyZW50IG1hY3JvXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRyYWNlSUQ6IHRoaXMuaW5kZXggLy9JRCBmb3IgdGhpcyB0cmFjZSBpbmZvcm1hdGlvblxuXHRcdFx0fVxuXHRcdFx0Ki9cbl07XG5jb25zdCB0cmFjZU5hbWVzcGFjZSA9IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC5mZS5pbmZvLzFcIixcblx0eG1sbnMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCIsXG5cdC8qKlxuXHQgKiBTd2l0Y2ggaXMgY3VycmVudGx5IGJhc2VkIG9uIHVybCBwYXJhbWV0ZXJcblx0ICovXG5cdHRyYWNlSXNPbiA9IGxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKFwic2FwLXVpLXh4LWZlVHJhY2VJbmZvPXRydWVcIikgPiAtMSxcblx0LyoqXG5cdCAqIFNwZWNpZnkgYWxsIG5hbWVzcGFjZXMgdGhhdCBzaGFsbCBiZSB0cmFjZWQgZHVyaW5nIHRlbXBsYXRpbmdcblx0ICovXG5cdGFOYW1lc3BhY2VzID0gW1xuXHRcdFwic2FwLm1cIixcblx0XHRcInNhcC51eGFwXCIsXG5cdFx0XCJzYXAudWkudW5pZmllZFwiLFxuXHRcdFwic2FwLmZcIixcblx0XHRcInNhcC51aS50YWJsZVwiLFxuXHRcdFwic2FwLnN1aXRlLnVpLm1pY3JvY2hhcnRcIixcblx0XHRcInNhcC51aS5sYXlvdXQuZm9ybVwiLFxuXHRcdFwic2FwLnVpLm1kY1wiLFxuXHRcdFwic2FwLnVpLm1kYy5saW5rXCIsXG5cdFx0XCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdFx0XCJzYXAuZmUuZnBtXCJcblx0XSxcblx0b0NhbGxiYWNrczogYW55ID0ge307XG5cbmZ1bmN0aW9uIGZuQ2xvbmUob09iamVjdDogYW55KSB7XG5cdHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9PYmplY3QpKTtcbn1cbmZ1bmN0aW9uIGNvbGxlY3RDb250ZXh0SW5mbyhzVmFsdWU6IGFueSwgb0NvbnRleHRzOiBhbnksIG9WaXNpdG9yOiBhbnksIG9Ob2RlOiBhbnkpIHtcblx0bGV0IGFDb250ZXh0cztcblx0Y29uc3QgYVByb21pc2VzOiBhbnlbXSA9IFtdO1xuXHR0cnkge1xuXHRcdGFDb250ZXh0cyA9IChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihzVmFsdWUsIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpIHx8IFtdO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0YUNvbnRleHRzID0gW107XG5cdH1cblx0YUNvbnRleHRzID0gQXJyYXkuaXNBcnJheShhQ29udGV4dHMpID8gYUNvbnRleHRzIDogW2FDb250ZXh0c107XG5cdGFDb250ZXh0c1xuXHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBvQ29udGV4dC5wYXRoIHx8IG9Db250ZXh0LnBhcnRzO1xuXHRcdH0pXG5cdFx0LmZvckVhY2goZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdGNvbnN0IGFQYXJ0cyA9IG9Db250ZXh0LnBhcnRzIHx8IFtvQ29udGV4dF07XG5cdFx0XHRhUGFydHNcblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5wYXRoO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IChvQ29udGV4dHNbb0NvbnRleHQubW9kZWxdID0gb0NvbnRleHRzW29Db250ZXh0Lm1vZGVsXSB8fCB7fSk7XG5cdFx0XHRcdFx0Y29uc3Qgc1NpbXBsZVBhdGggPVxuXHRcdFx0XHRcdFx0b0NvbnRleHQucGF0aC5pbmRleE9mKFwiPlwiKSA8IDAgPyAob0NvbnRleHQubW9kZWwgJiYgb0NvbnRleHQubW9kZWwgKyBcIj5cIikgKyBvQ29udGV4dC5wYXRoIDogb0NvbnRleHQucGF0aDtcblx0XHRcdFx0XHRsZXQgb1JlYWxDb250ZXh0OiBhbnk7XG5cdFx0XHRcdFx0bGV0IGFQYXJ0cztcblxuXHRcdFx0XHRcdGlmICh0eXBlb2Ygb0NvbnRleHQubW9kZWwgPT09IFwidW5kZWZpbmVkXCIgJiYgc1NpbXBsZVBhdGguaW5kZXhPZihcIj5cIikgPiAtMSkge1xuXHRcdFx0XHRcdFx0YVBhcnRzID0gc1NpbXBsZVBhdGguc3BsaXQoXCI+XCIpO1xuXHRcdFx0XHRcdFx0b0NvbnRleHQubW9kZWwgPSBhUGFydHNbMF07XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5wYXRoID0gYVBhcnRzWzFdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0b1JlYWxDb250ZXh0ID0gb1Zpc2l0b3IuZ2V0Q29udGV4dChzU2ltcGxlUGF0aCk7XG5cdFx0XHRcdFx0XHRhUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdFx0b1Zpc2l0b3Jcblx0XHRcdFx0XHRcdFx0XHQuZ2V0UmVzdWx0KFwie1wiICsgc1NpbXBsZVBhdGggKyBcIn1cIiwgb05vZGUpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZWFsQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5tb2RlbC5qc29uLkpTT05Nb2RlbFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghb1Jlc3VsdC5vTW9kZWwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvTW9kZWxbb0NvbnRleHQucGF0aF0gPSBvUmVzdWx0OyAvL29SZWFsQ29udGV4dC5nZXRPYmplY3Qob0NvbnRleHQucGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b01vZGVsW29Db250ZXh0LnBhdGhdID0gXCJDb250ZXh0IGZyb20gXCIgKyBvUmVzdWx0LmdldFBhdGgoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b01vZGVsW29Db250ZXh0LnBhdGhdID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhdGg6IG9SZWFsQ29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YTogdHlwZW9mIG9SZXN1bHQgPT09IFwib2JqZWN0XCIgPyBcIltjdHJsL2NtZC1jbGlja10gb24gcGF0aCB0byBzZWUgZGF0YVwiIDogb1Jlc3VsdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9Nb2RlbFtvQ29udGV4dC5wYXRoXSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YmluZGluZ0ZvcjogXCJSdW50aW1lXCJcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXhjKSB7XG5cdFx0XHRcdFx0XHRvTW9kZWxbb0NvbnRleHQucGF0aF0gPSB7XG5cdFx0XHRcdFx0XHRcdGJpbmRpbmdGb3I6IFwiUnVudGltZVwiXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0fSk7XG5cdHJldHVybiBQcm9taXNlLmFsbChhUHJvbWlzZXMpO1xufVxuZnVuY3Rpb24gZmlsbEF0dHJpYnV0ZXMob1Jlc3VsdHM6IGFueSwgb0F0dHJpYnV0ZXM6IGFueSwgc05hbWU6IGFueSwgc1ZhbHVlOiBhbnkpIHtcblx0cmV0dXJuIG9SZXN1bHRzXG5cdFx0LnRoZW4oZnVuY3Rpb24gKHJlc3VsdDogYW55KSB7XG5cdFx0XHRvQXR0cmlidXRlc1tzTmFtZV0gPVxuXHRcdFx0XHRzVmFsdWUgIT09IHJlc3VsdFxuXHRcdFx0XHRcdD8ge1xuXHRcdFx0XHRcdFx0XHRvcmlnaW5hbFZhbHVlOiBzVmFsdWUsXG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkVmFsdWU6IHJlc3VsdFxuXHRcdFx0XHRcdCAgfVxuXHRcdFx0XHRcdDogc1ZhbHVlO1xuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdG9BdHRyaWJ1dGVzW3NOYW1lXSA9IHtcblx0XHRcdFx0b3JpZ2luYWxWYWx1ZTogc1ZhbHVlLFxuXHRcdFx0XHRlcnJvcjogKGUuc3RhY2sgJiYgZS5zdGFjay50b1N0cmluZygpKSB8fCBlXG5cdFx0XHR9O1xuXHRcdH0pO1xufVxuZnVuY3Rpb24gY29sbGVjdEluZm8ob05vZGU6IGFueSwgb1Zpc2l0b3I6IGFueSkge1xuXHRjb25zdCBvQXR0cmlidXRlcyA9IHt9O1xuXHRjb25zdCBhUHJvbWlzZXMgPSBbXTtcblx0Y29uc3Qgb0NvbnRleHRzID0ge307XG5cdGxldCBvUmVzdWx0cztcblx0Zm9yIChsZXQgaSA9IG9Ob2RlLmF0dHJpYnV0ZXMubGVuZ3RoID4+PiAwOyBpLS07ICkge1xuXHRcdGNvbnN0IG9BdHRyaWJ1dGUgPSBvTm9kZS5hdHRyaWJ1dGVzW2ldLFxuXHRcdFx0c05hbWUgPSBvQXR0cmlidXRlLm5vZGVOYW1lLFxuXHRcdFx0c1ZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNOYW1lKTtcblx0XHRpZiAoIVtcImNvcmU6cmVxdWlyZVwiXS5pbmNsdWRlcyhzTmFtZSkpIHtcblx0XHRcdGFQcm9taXNlcy5wdXNoKGNvbGxlY3RDb250ZXh0SW5mbyhzVmFsdWUsIG9Db250ZXh0cywgb1Zpc2l0b3IsIG9Ob2RlKSk7XG5cdFx0XHRvUmVzdWx0cyA9IG9WaXNpdG9yLmdldFJlc3VsdChzVmFsdWUsIG9Ob2RlKTtcblx0XHRcdGlmIChvUmVzdWx0cykge1xuXHRcdFx0XHRhUHJvbWlzZXMucHVzaChmaWxsQXR0cmlidXRlcyhvUmVzdWx0cywgb0F0dHJpYnV0ZXMsIHNOYW1lLCBzVmFsdWUpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vV2hhdFxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5hbGwoYVByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4geyBwcm9wZXJ0aWVzOiBvQXR0cmlidXRlcywgY29udGV4dHM6IG9Db250ZXh0cyB9O1xuXHR9KTtcbn1cbmZ1bmN0aW9uIHJlc29sdmUob05vZGU6IGFueSwgb1Zpc2l0b3I6IGFueSkge1xuXHRjb25zdCBzQ29udHJvbE5hbWUgPSBvTm9kZS5ub2RlTmFtZS5zcGxpdChcIjpcIilbMV0gfHwgb05vZGUubm9kZU5hbWUsXG5cdFx0YklzQ29udHJvbCA9IC9eW0EtWl0vLnRlc3Qoc0NvbnRyb2xOYW1lKSxcblx0XHRvVHJhY2VNZXRhZGF0YUNvbnRleHQ6IGFueSA9IHtcblx0XHRcdGNvbnRyb2w6IG9Ob2RlLm5hbWVzcGFjZVVSSSArIFwiLlwiICsgKG9Ob2RlLm5vZGVOYW1lLnNwbGl0KFwiOlwiKVsxXSB8fCBvTm9kZS5ub2RlTmFtZSlcblx0XHR9O1xuXG5cdGlmIChiSXNDb250cm9sKSB7XG5cdFx0aWYgKCFvTm9kZS5vd25lckRvY3VtZW50LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwieG1sbnM6dHJhY2VcIikpIHtcblx0XHRcdG9Ob2RlLm93bmVyRG9jdW1lbnQuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGVOUyh4bWxucywgXCJ4bWxuczp0cmFjZVwiLCB0cmFjZU5hbWVzcGFjZSk7XG5cdFx0XHRvTm9kZS5vd25lckRvY3VtZW50LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlTlModHJhY2VOYW1lc3BhY2UsIFwidHJhY2U6aXNcIiwgXCJvblwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbGxlY3RJbmZvKG9Ob2RlLCBvVmlzaXRvcilcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChyZXN1bHQ6IHsgcHJvcGVydGllczoge307IGNvbnRleHRzOiB7fSB9KSB7XG5cdFx0XHRcdGNvbnN0IGJSZWxldmFudCA9IE9iamVjdC5rZXlzKHJlc3VsdC5jb250ZXh0cykubGVuZ3RoID4gMDsgLy9JZiBubyBjb250ZXh0IHdhcyB1c2VkIGl0IGlzIG5vdCByZWxldmFudCBzbyB3ZSBpZ25vcmUgT2JqZWN0LmtleXMocmVzdWx0LnByb3BlcnRpZXMpLmxlbmd0aFxuXHRcdFx0XHRpZiAoYlJlbGV2YW50KSB7XG5cdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihvVHJhY2VNZXRhZGF0YUNvbnRleHQsIHJlc3VsdCk7XG5cdFx0XHRcdFx0b1RyYWNlTWV0YWRhdGFDb250ZXh0LnZpZXdJbmZvID0gb1Zpc2l0b3IuZ2V0Vmlld0luZm8oKTtcblx0XHRcdFx0XHRvVHJhY2VNZXRhZGF0YUNvbnRleHQubWFjcm9JbmZvID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKVtcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdFx0b1RyYWNlTWV0YWRhdGFDb250ZXh0LnRyYWNlSUQgPSBhVHJhY2VJbmZvLmxlbmd0aDtcblx0XHRcdFx0XHRvTm9kZS5zZXRBdHRyaWJ1dGVOUyh0cmFjZU5hbWVzcGFjZSwgXCJ0cmFjZTp0cmFjZUlEXCIsIG9UcmFjZU1ldGFkYXRhQ29udGV4dC50cmFjZUlEKTtcblx0XHRcdFx0XHRhVHJhY2VJbmZvLnB1c2gob1RyYWNlTWV0YWRhdGFDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb1Zpc2l0b3IudmlzaXRBdHRyaWJ1dGVzKG9Ob2RlKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb1Zpc2l0b3IudmlzaXRDaGlsZE5vZGVzKG9Ob2RlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChleGM6IGFueSkge1xuXHRcdFx0XHRvVHJhY2VNZXRhZGF0YUNvbnRleHQuZXJyb3IgPSB7XG5cdFx0XHRcdFx0ZXhjZXB0aW9uOiBleGMsXG5cdFx0XHRcdFx0bm9kZTogbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhvTm9kZSlcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBvVmlzaXRvci52aXNpdEF0dHJpYnV0ZXMob05vZGUpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIG9WaXNpdG9yLnZpc2l0Q2hpbGROb2RlcyhvTm9kZSk7XG5cdFx0fSk7XG5cdH1cbn1cbi8qKlxuICogUmVnaXN0ZXIgcGF0aC10aHJvdWdoIFhNTFByZXByb2Nlc3NvciBwbHVnaW4gZm9yIGFsbCBuYW1lc3BhY2VzXG4gKiBnaXZlbiBhYm92ZSBpbiBhTmFtZXNwYWNlc1xuICovXG5pZiAodHJhY2VJc09uKSB7XG5cdGFOYW1lc3BhY2VzLmZvckVhY2goZnVuY3Rpb24gKG5hbWVzcGFjZTogc3RyaW5nKSB7XG5cdFx0b0NhbGxiYWNrc1tuYW1lc3BhY2VdID0gWE1MUHJlcHJvY2Vzc29yLnBsdWdJbihyZXNvbHZlLmJpbmQobmFtZXNwYWNlKSwgbmFtZXNwYWNlKTtcblx0fSk7XG59XG4vKipcbiAqIEFkZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2Nlc3Npbmcgb2Ygb25lIG1hY3JvIHRvIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIEBuYW1lIHNhcC5mZS5tYWNyb3MuVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxsc1xuICogQHBhcmFtIHtzdHJpbmd9IHNOYW1lIE1hY3JvIGNsYXNzIG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvTWV0YWRhdGEgRGVmaW5pdGlvbiBmcm9tIChtYWNybykubWV0YWRhdGEuanNcbiAqIEBwYXJhbSB7b2JqZWN0fSBtQ29udGV4dHMgQXZhaWxhYmxlIG5hbWVkIGNvbnRleHRzXG4gKiBAcGFyYW0ge1hNTE5vZGV9IG9Ob2RlXG4gKiBAcGFyYW0ge29iamVjdH0gb1Zpc2l0b3JcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKiBAc3RhdGljXG4gKi9cbmZ1bmN0aW9uIHRyYWNlTWFjcm9DYWxscyhzTmFtZTogc3RyaW5nLCBvTWV0YWRhdGE6IGFueSwgbUNvbnRleHRzOiBhbnksIG9Ob2RlOiBhbnksIG9WaXNpdG9yOiBhbnkpIHtcblx0bGV0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW107XG5cdGNvbnN0IGFQcm9wZXJ0aWVzID0gKG9NZXRhZGF0YS5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKSkgfHwgW107XG5cdGNvbnN0IG1hY3JvSW5mbyA9IGZuQ2xvbmUob1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKVtcIl9tYWNyb0luZm9cIl0gfHwge30pO1xuXHRjb25zdCBvVHJhY2VNZXRhZGF0YUNvbnRleHQ6IGFueSA9IHtcblx0XHRtYWNybzogc05hbWUsXG5cdFx0bWV0YURhdGFDb250ZXh0czogW10gYXMgYW55W10sXG5cdFx0cHJvcGVydGllczoge31cblx0fTtcblxuXHRpZiAoYU1ldGFkYXRhQ29udGV4dEtleXMubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly9JbiBjYXNlIHRoZSBtYWNybyBoYXMgbm90IG1ldGFkYXRhLmpzIHdlIHRha2UgYWxsIG1ldGFkYXRhQ29udGV4dHMgZXhjZXB0IHRoaXNcblx0XHRhTWV0YWRhdGFDb250ZXh0S2V5cyA9IE9iamVjdC5rZXlzKG1Db250ZXh0cykuZmlsdGVyKGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBuYW1lICE9PSBcInRoaXNcIjtcblx0XHR9KTtcblx0fVxuXG5cdGlmICghb05vZGUuZ2V0QXR0cmlidXRlKFwieG1sbnM6dHJhY2VcIikpIHtcblx0XHRvTm9kZS5zZXRBdHRyaWJ1dGVOUyh4bWxucywgXCJ4bWxuczp0cmFjZVwiLCB0cmFjZU5hbWVzcGFjZSk7XG5cdH1cblxuXHRpZiAoYU1ldGFkYXRhQ29udGV4dEtleXMubGVuZ3RoID4gMCkge1xuXHRcdGFNZXRhZGF0YUNvbnRleHRLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV0sXG5cdFx0XHRcdG9NZXRhRGF0YUNvbnRleHQ6IGFueSA9IG9Db250ZXh0ICYmIHtcblx0XHRcdFx0XHRuYW1lOiBzS2V5LFxuXHRcdFx0XHRcdHBhdGg6IG9Db250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHRcdC8vZGF0YTogSlNPTi5zdHJpbmdpZnkob0NvbnRleHQuZ2V0T2JqZWN0KCksbnVsbCwyKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRpZiAob01ldGFEYXRhQ29udGV4dCkge1xuXHRcdFx0XHRvVHJhY2VNZXRhZGF0YUNvbnRleHQubWV0YURhdGFDb250ZXh0cy5wdXNoKG9NZXRhRGF0YUNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRjb25zdCAvL29Qcm9wZXJ0eVNldHRpbmdzID0gb01ldGFkYXRhLnByb3BlcnRpZXNbc0tleV0sXG5cdFx0XHRcdG9Qcm9wZXJ0eSA9IG1Db250ZXh0cy50aGlzLmdldE9iamVjdChzS2V5KTtcblx0XHRcdC8vIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleSkgJiYgb05vZGUuZ2V0QXR0cmlidXRlKHNLZXkpKSB8fFxuXHRcdFx0Ly8gKG9Qcm9wZXJ0eVNldHRpbmdzLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpICYmIG9Qcm9wZXJ0eVNldHRpbmdzLmRlZmluZSkgfHxcblx0XHRcdC8vIGZhbHNlO1xuXG5cdFx0XHRpZiAob1Byb3BlcnR5KSB7XG5cdFx0XHRcdG9UcmFjZU1ldGFkYXRhQ29udGV4dC5wcm9wZXJ0aWVzW3NLZXldID0gb1Byb3BlcnR5O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9UcmFjZU1ldGFkYXRhQ29udGV4dC52aWV3SW5mbyA9IG9WaXNpdG9yLmdldFZpZXdJbmZvKCk7XG5cdFx0b1RyYWNlTWV0YWRhdGFDb250ZXh0LnRyYWNlSUQgPSBhVHJhY2VJbmZvLmxlbmd0aDtcblx0XHRtYWNyb0luZm8ucGFyZW50TWFjcm9JRCA9IG1hY3JvSW5mby5tYWNyb0lEO1xuXHRcdG1hY3JvSW5mby5tYWNyb0lEID0gb1RyYWNlTWV0YWRhdGFDb250ZXh0LnRyYWNlSUQ7XG5cdFx0b1RyYWNlTWV0YWRhdGFDb250ZXh0Lm1hY3JvSW5mbyA9IG1hY3JvSW5mbztcblx0XHRvTm9kZS5zZXRBdHRyaWJ1dGVOUyh0cmFjZU5hbWVzcGFjZSwgXCJ0cmFjZTptYWNyb0lEXCIsIG9UcmFjZU1ldGFkYXRhQ29udGV4dC50cmFjZUlEKTtcblx0XHRhVHJhY2VJbmZvLnB1c2gob1RyYWNlTWV0YWRhdGFDb250ZXh0KTtcblx0XHRyZXR1cm4gb1RyYWNlTWV0YWRhdGFDb250ZXh0O1xuXHR9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGdsb2JhbGx5IHN0b3JlZCB0cmFjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG1hY3JvIG9yXG4gKiBjb250cm9sIG1hcmtlZCB3aXRoIHRoZSBnaXZlbiBpZC5cbiAqXG4gKiBSZXR1cm5zIGFsbCB0cmFjZSBpbmZvcm1hdGlvbiBpZiBubyBpZCBpcyBzcGVjaWZpZWRcbiAqXG4gKlxuPHByZT5TdHJ1Y3R1cmUgZm9yIGEgbWFjcm9cbntcblx0bWFjcm86ICcnLCAvL25hbWUgb2YgbWFjcm9cblx0bWV0YURhdGFDb250ZXh0czogWyAvL1Byb3BlcnRpZXMgb2YgdHlwZSBzYXAudWkubW9kZWwuQ29udGV4dFxuXHRcdHtcblx0XHRcdG5hbWU6ICcnLCAvL2NvbnRleHQgcHJvcGVydHkgbmFtZSAvIGtleVxuXHRcdFx0cGF0aDogJycsIC8vZnJvbSBvQ29udGV4dC5nZXRQYXRoKClcblx0XHR9XG5cdF0sXG5cdHByb3BlcnRpZXM6IHsgLy8gT3RoZXIgcHJvcGVydGllcyB3aGljaCBiZWNvbWUgcGFydCBvZiB7dGhpcz59XG5cdFx0cHJvcGVydHkxOiB2YWx1ZSxcblx0XHRwcm9wZXJ0eTI6IHZhbHVlXG5cdH1cblx0dmlld0luZm86IHtcblx0XHR2aWV3SW5mbzoge30gLy8gQXMgc3BlY2lmaWVkIGluIHZpZXcgb3IgZnJhZ2VtZW50IGNyZWF0aW9uXG5cdH0sXG5cdHRyYWNlSUQ6IHRoaXMuaW5kZXgsIC8vSUQgZm9yIHRoaXMgdHJhY2UgaW5mb3JtYXRpb24sXG5cdG1hY3JvSW5mbzoge1xuXHRcdG1hY3JvSUQ6IGluZGV4LCAvLyB0cmFjZUlEIG9mIHRoaXMgbWFjcm8gKHJlZHVuZGFudCBmb3IgbWFjcm9zKVxuXHRcdHBhcmVudE1hY3JvSUQsIGluZGV4IC8vIHRyYWNlSUQgb2YgdGhlIHBhcmVudCBtYWNybyAoaWYgaXQgaGFzIGEgcGFyZW50KVxuXHR9XG59XG5TdHJ1Y3R1cmUgZm9yIGEgY29udHJvbFxue1xuXHRjb250cm9sOiAnJywgLy9jb250cm9sIGNsYXNzXG5cdHByb3BlcnRpZXM6IHsgLy8gT3RoZXIgcHJvcGVydGllcyB3aGljaCBiZWNvbWUgcGFydCBvZiB7dGhpcz59XG5cdFx0cHJvcGVydHkxOiB7XG5cdFx0XHRvcmlnaW5hbFZhbHVlOiAnJywgLy9WYWx1ZSBiZWZvcmUgdGVtcGxhdGluZ1xuXHRcdFx0cmVzb2x2ZWRWYWx1ZTogJycgLy9WYWx1ZSBhZnRlciB0ZW1wbGF0aW5nXG5cdFx0fVxuXHR9XG5cdGNvbnRleHRzOiB7IC8vTW9kZWxzIGFuZCBDb250ZXh0cyB1c2VkIGR1cmluZyB0ZW1wbGF0aW5nXG5cdFx0Ly8gTW9kZWwgb3IgY29udGV4dCBuYW1lIHVzZWQgZm9yIHRoaXMgY29udHJvbFxuXHRcdG1vZGVsTmFtZTE6IHsgLy8gRm9yIE9EYXRhTWV0YU1vZGVsXG5cdFx0XHRwYXRoMToge1xuXHRcdFx0XHRwYXRoOiAnJywgLy9hYnNvbHV0IHBhdGggd2l0aGluIG1ldGFtb2RlbFxuXHRcdFx0XHRkYXRhOiAnJywgLy9kYXRhIG9mIHBhdGggdW5sZXNzIHR5cGUgT2JqZWN0XG5cdFx0XHR9XG5cdFx0bW9kZWxOYW1lMjoge1xuXHRcdFx0Ly8gZm9yIG90aGVyIG1vZGVsIHR5cGVzXG5cdFx0XHR7XG5cdFx0XHRcdHByb3BlcnR5MTogdmFsdWUsXG5cdFx0XHRcdHByb3BlcnR5MjogdmFsdWVcblx0XHRcdH1cblx0XHRcdC8vIEluIGNhc2UgYmluZGluZyBjYW5ub3QgYmUgcmVzb2x2ZWQgLT4gbWFyayBhcyBydW50aW1lIGJpbmRpbmdcblx0XHRcdC8vIFRoaXMgaXMgbm90IGFsd2F5cyB0cnVlLCBlLmcuIGluIGNhc2UgdGhlIHBhdGggaXMgbWV0YW1vZGVscGF0aFxuXHRcdFx0e1xuXHRcdFx0XHRcImJpbmRpbmdGb3JcIjogXCJSdW50aW1lXCJcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdHZpZXdJbmZvOiB7XG5cdFx0dmlld0luZm86IHt9IC8vIEFzIHNwZWNpZmllZCBpbiB2aWV3IG9yIGZyYWdlbWVudCBjcmVhdGlvblxuXHR9LFxuXHRtYWNyb0luZm86IHtcblx0XHRtYWNyb0lEOiBpbmRleCwgLy8gdHJhY2VJRCBvZiB0aGUgbWFjcm8gdGhhdCBjcmVhdGVkIHRoaXMgY29udHJvbFxuXHRcdHBhcmVudE1hY3JvSUQsIGluZGV4IC8vIHRyYWNlSUQgb2YgdGhlIG1hY3JvJ3MgcGFyZW50IG1hY3JvXG5cdH0sXG5cdHRyYWNlSUQ6IHRoaXMuaW5kZXggLy9JRCBmb3IgdGhpcyB0cmFjZSBpbmZvcm1hdGlvblxufTwvcHJlPi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5tYWNyb3MuVHJhY2VJbmZvLmdldFRyYWNlSW5mb1xuICogQHBhcmFtIHtudW1iZXJ9IGlkIFRyYWNlSW5mbyBpZFxuICogQHJldHVybnMge29iamVjdHxBcnJheX0gT2JqZWN0IC8gQXJyYXkgZm9yIFRyYWNlSW5mb1xuICogQHByaXZhdGVcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gZ2V0VHJhY2VJbmZvKGlkOiBudW1iZXIpIHtcblx0aWYgKGlkKSB7XG5cdFx0cmV0dXJuIGFUcmFjZUluZm9baWRdO1xuXHR9XG5cdGNvbnN0IGFFcnJvcnMgPSBhVHJhY2VJbmZvLmZpbHRlcihmdW5jdGlvbiAodHJhY2VJbmZvOiBhbnkpIHtcblx0XHRyZXR1cm4gdHJhY2VJbmZvLmVycm9yO1xuXHR9KTtcblx0cmV0dXJuIChhRXJyb3JzLmxlbmd0aCA+IDAgJiYgYUVycm9ycykgfHwgYVRyYWNlSW5mbztcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIFRyYWNlSW5mbyBpcyBhY3RpdmUuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUubWFjcm9zLlRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCB3aGVuIGFjdGl2ZVxuICogQHByaXZhdGVcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gaXNUcmFjZUluZm9BY3RpdmUoKSB7XG5cdHJldHVybiB0cmFjZUlzT247XG59XG4vKipcbiAqIEB0eXBlZGVmIHNhcC5mZS5tYWNyb3MuVHJhY2VJbmZvXG4gKiBUcmFjZUluZm8gZm9yIFNBUCBGaW9yaSBlbGVtZW50c1xuICpcbiAqIE9uY2UgdHJhY2VzIGlzIHN3aXRjaGVkLCBpbmZvcm1hdGlvbiBhYm91dCBtYWNyb3MgYW5kIGNvbnRyb2xzXG4gKiB0aGF0IGFyZSBwcm9jZXNzZWQgZHVyaW5nIHhtbCBwcmVwcm9jZXNzaW5nICggQHNlZSB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3J9KVxuICogd2lsbCBiZSBjb2xsZWN0ZWQgd2l0aGluIHRoaXMgc2luZ2xldG9uXG4gKiBAbmFtZXNwYWNlXG4gKiBAcHJpdmF0ZVxuICogQGdsb2JhbFxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuXHRpc1RyYWNlSW5mb0FjdGl2ZTogaXNUcmFjZUluZm9BY3RpdmUsXG5cdHRyYWNlTWFjcm9DYWxsczogdHJhY2VNYWNyb0NhbGxzLFxuXHRnZXRUcmFjZUluZm86IGdldFRyYWNlSW5mb1xufTtcbiJdfQ==
|