@sapui5/sap.fe.core 1.108.2 → 1.110.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/package.json +11 -9
- package/src/.eslintrc +7 -0
- package/src/sap/fe/core/.library +39 -37
- package/src/sap/fe/core/.supportrc +3 -3
- package/src/sap/fe/core/ActionRuntime.js +72 -27
- package/src/sap/fe/core/ActionRuntime.ts +104 -21
- package/src/sap/fe/core/AppComponent.js +102 -120
- package/src/sap/fe/core/AppComponent.ts +148 -45
- package/src/sap/fe/core/AppStateHandler.js +105 -91
- package/src/sap/fe/core/AppStateHandler.ts +85 -23
- package/src/sap/fe/core/BaseController.js +5 -20
- package/src/sap/fe/core/BaseController.ts +11 -2
- package/src/sap/fe/core/CommonUtils.js +770 -1079
- package/src/sap/fe/core/CommonUtils.ts +750 -491
- package/src/sap/fe/core/ExtensionAPI.js +69 -96
- package/src/sap/fe/core/ExtensionAPI.ts +15 -17
- package/src/sap/fe/core/PageController.js +21 -46
- package/src/sap/fe/core/PageController.ts +11 -2
- package/src/sap/fe/core/TemplateComponent.js +6 -51
- package/src/sap/fe/core/TemplateComponent.ts +27 -16
- package/src/sap/fe/core/TemplateModel.js +18 -24
- package/src/sap/fe/core/TemplateModel.ts +25 -6
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
- package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
- package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
- package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
- package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
- package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
- package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +53 -98
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
- package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
- package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/AnyElement.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +4 -26
- package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
- package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
- package/src/sap/fe/core/controls/FileWrapper.js +51 -136
- package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
- package/src/sap/fe/core/controls/FilterBar.js +19 -54
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
- package/src/sap/fe/core/converters/ConverterContext.js +44 -98
- package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
- package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
- package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
- package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
- package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
- package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
- package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
- package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
- package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
- package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
- package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
- package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
- package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
- package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
- package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
- package/src/sap/fe/core/converters/helpers/ID.js +3 -17
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
- package/src/sap/fe/core/converters/helpers/Key.js +10 -19
- package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
- package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
- package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
- package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
- package/src/sap/fe/core/fpm/Component.js +2 -17
- package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
- package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
- package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
- package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
- package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
- package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
- package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
- package/src/sap/fe/core/helpers/EditState.js +2 -5
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
- package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
- package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
- package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
- package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
- package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
- package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
- package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
- package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
- package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
- package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
- package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
- package/src/sap/fe/core/helpers/Synchronization.js +1 -8
- package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
- package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
- package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library.js +9 -48
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/library.support.ts +3 -1
- package/src/sap/fe/core/library.ts +3 -8
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
- package/src/sap/fe/core/messagebundle.properties +113 -67
- package/src/sap/fe/core/messagebundle_ar.properties +20 -3
- package/src/sap/fe/core/messagebundle_bg.properties +22 -5
- package/src/sap/fe/core/messagebundle_ca.properties +21 -4
- package/src/sap/fe/core/messagebundle_cs.properties +21 -4
- package/src/sap/fe/core/messagebundle_cy.properties +22 -5
- package/src/sap/fe/core/messagebundle_da.properties +20 -3
- package/src/sap/fe/core/messagebundle_de.properties +38 -21
- package/src/sap/fe/core/messagebundle_el.properties +20 -3
- package/src/sap/fe/core/messagebundle_en.properties +38 -21
- package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
- package/src/sap/fe/core/messagebundle_es.properties +40 -23
- package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
- package/src/sap/fe/core/messagebundle_et.properties +20 -3
- package/src/sap/fe/core/messagebundle_fi.properties +20 -3
- package/src/sap/fe/core/messagebundle_fr.properties +21 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
- package/src/sap/fe/core/messagebundle_hi.properties +20 -3
- package/src/sap/fe/core/messagebundle_hr.properties +22 -5
- package/src/sap/fe/core/messagebundle_hu.properties +20 -3
- package/src/sap/fe/core/messagebundle_id.properties +20 -3
- package/src/sap/fe/core/messagebundle_it.properties +23 -6
- package/src/sap/fe/core/messagebundle_iw.properties +20 -3
- package/src/sap/fe/core/messagebundle_ja.properties +22 -5
- package/src/sap/fe/core/messagebundle_kk.properties +21 -4
- package/src/sap/fe/core/messagebundle_ko.properties +20 -3
- package/src/sap/fe/core/messagebundle_lt.properties +20 -3
- package/src/sap/fe/core/messagebundle_lv.properties +20 -3
- package/src/sap/fe/core/messagebundle_ms.properties +20 -3
- package/src/sap/fe/core/messagebundle_nl.properties +20 -3
- package/src/sap/fe/core/messagebundle_no.properties +20 -3
- package/src/sap/fe/core/messagebundle_pl.properties +21 -4
- package/src/sap/fe/core/messagebundle_pt.properties +20 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
- package/src/sap/fe/core/messagebundle_ro.properties +20 -3
- package/src/sap/fe/core/messagebundle_ru.properties +20 -3
- package/src/sap/fe/core/messagebundle_sh.properties +20 -3
- package/src/sap/fe/core/messagebundle_sk.properties +20 -3
- package/src/sap/fe/core/messagebundle_sl.properties +26 -9
- package/src/sap/fe/core/messagebundle_sv.properties +20 -3
- package/src/sap/fe/core/messagebundle_th.properties +21 -4
- package/src/sap/fe/core/messagebundle_tr.properties +20 -3
- package/src/sap/fe/core/messagebundle_uk.properties +23 -6
- package/src/sap/fe/core/messagebundle_vi.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
- package/src/sap/fe/core/operationsHelper.js +74 -101
- package/src/sap/fe/core/operationsHelper.ts +113 -44
- package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
- package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
- package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
- package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
- package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
- package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
- package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
- package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
- package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
- package/src/sap/fe/core/support/CommonHelper.js +7 -16
- package/src/sap/fe/core/support/Diagnostics.js +1 -10
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
- package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
- package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
- package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
- package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +40 -111
- package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
- package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
- package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
- package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
- package/src/sap/fe/core/templating/UIFormatters.js +40 -180
- package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
- package/src/sap/fe/core/type/Email.js +1 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -11
- package/ui5.yaml +0 -1
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
- package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
- package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
|
@@ -2,102 +2,85 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/ObjectPath", "sap/fe/core/buildingBlocks/BuildingBlockRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/StableIdHelper", "sap/
|
|
5
|
+
sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/ObjectPath", "sap/fe/core/buildingBlocks/BuildingBlockFragment", "sap/fe/core/buildingBlocks/BuildingBlockRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/helpers/TypeGuards", "sap/ui/base/ManagedObject", "sap/ui/core/Component", "sap/ui/core/util/XMLPreprocessor", "../converters/ConverterContext"], function (deepClone, merge, ObjectPath, BuildingBlockFragment, BuildingBlockRuntime, CommonUtils, BindingToolkit, StableIdHelper, TypeGuards, ManagedObject, Component, XMLPreprocessor, ConverterContext) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
var _templateObject, _templateObject2, _templateObject3;
|
|
9
|
-
|
|
8
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8;
|
|
10
9
|
var _exports = {};
|
|
10
|
+
var isContext = TypeGuards.isContext;
|
|
11
11
|
var generate = StableIdHelper.generate;
|
|
12
12
|
var resolveBindingString = BindingToolkit.resolveBindingString;
|
|
13
|
+
var isUndefinedExpression = BindingToolkit.isUndefinedExpression;
|
|
13
14
|
var xml = BuildingBlockRuntime.xml;
|
|
14
15
|
var registerBuildingBlock = BuildingBlockRuntime.registerBuildingBlock;
|
|
15
|
-
var escapeXMLAttributeValue = BuildingBlockRuntime.escapeXMLAttributeValue;
|
|
16
|
-
|
|
17
16
|
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
18
|
-
|
|
19
17
|
/**
|
|
20
18
|
* Base class for Building Block
|
|
21
19
|
*/
|
|
22
20
|
var BuildingBlockBase = /*#__PURE__*/function () {
|
|
23
21
|
function BuildingBlockBase(oProps, _oControlConfig, _oSettings) {
|
|
24
22
|
var _this = this;
|
|
25
|
-
|
|
26
23
|
this.isPublic = false;
|
|
27
|
-
|
|
28
|
-
this.getConverterContext = function (oVisualizationObjectPath, contextPath, mSettings, mExtraParams) {
|
|
24
|
+
this.getConverterContext = function (dataModelObjectPath, contextPath, mSettings, mExtraParams) {
|
|
29
25
|
var oAppComponent = mSettings.appComponent;
|
|
30
26
|
var originalViewData = mSettings.models.viewData && mSettings.models.viewData.getData();
|
|
31
27
|
var viewData = Object.assign({}, originalViewData);
|
|
32
28
|
delete viewData.resourceBundle;
|
|
33
29
|
viewData = deepClone(viewData);
|
|
34
|
-
viewData.controlConfiguration = merge(viewData.controlConfiguration, mExtraParams);
|
|
35
|
-
return ConverterContext.createConverterContextForMacro(
|
|
30
|
+
viewData.controlConfiguration = merge(viewData.controlConfiguration, mExtraParams || {});
|
|
31
|
+
return ConverterContext.createConverterContextForMacro(dataModelObjectPath.startingEntitySet.name, mSettings.models.metaModel, oAppComponent && oAppComponent.getDiagnostics(), merge, dataModelObjectPath.contextLocation, viewData);
|
|
36
32
|
};
|
|
37
|
-
|
|
38
33
|
Object.keys(oProps).forEach(function (propName) {
|
|
39
34
|
// This needs to be casted as any since we are assigning the properties to the instance without knowing their type
|
|
40
35
|
_this[propName] = oProps[propName];
|
|
41
36
|
});
|
|
42
37
|
}
|
|
38
|
+
_exports.BuildingBlockBase = BuildingBlockBase;
|
|
39
|
+
var _proto = BuildingBlockBase.prototype;
|
|
43
40
|
/**
|
|
44
41
|
* Convert the given local element ID to a globally unique ID by prefixing with the Building Block ID.
|
|
45
42
|
*
|
|
46
43
|
* @param stringParts
|
|
47
44
|
* @returns Either the global ID or undefined if the Building Block doesn't have an ID
|
|
48
45
|
*/
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
_exports.BuildingBlockBase = BuildingBlockBase;
|
|
52
|
-
var _proto = BuildingBlockBase.prototype;
|
|
53
|
-
|
|
54
46
|
_proto.createId = function createId() {
|
|
55
47
|
// If the child instance has an ID property use it otherwise return undefined
|
|
56
48
|
if (this.id) {
|
|
57
49
|
for (var _len = arguments.length, stringParts = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
58
50
|
stringParts[_key] = arguments[_key];
|
|
59
51
|
}
|
|
60
|
-
|
|
61
52
|
return generate([this.id].concat(stringParts));
|
|
62
53
|
}
|
|
63
|
-
|
|
64
54
|
return undefined;
|
|
65
|
-
}
|
|
55
|
+
}
|
|
56
|
+
// This block is commented out because I am not using them for now / need to change this but still want to keep them around
|
|
66
57
|
;
|
|
67
|
-
|
|
68
58
|
_proto.getProperties = function getProperties() {
|
|
69
59
|
var allProperties = {};
|
|
70
|
-
|
|
71
60
|
for (var oInstanceKey in this) {
|
|
72
61
|
if (this.hasOwnProperty(oInstanceKey)) {
|
|
73
62
|
allProperties[oInstanceKey] = this[oInstanceKey];
|
|
74
63
|
}
|
|
75
64
|
}
|
|
76
|
-
|
|
77
65
|
return allProperties;
|
|
78
66
|
};
|
|
79
|
-
|
|
80
|
-
|
|
67
|
+
BuildingBlockBase.register = function register() {
|
|
68
|
+
// To be overriden
|
|
81
69
|
};
|
|
82
|
-
|
|
83
|
-
|
|
70
|
+
BuildingBlockBase.unregister = function unregister() {
|
|
71
|
+
// To be overriden
|
|
84
72
|
};
|
|
85
|
-
|
|
86
|
-
_proto.addConditionally = function addConditionally() {
|
|
87
|
-
var condition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
88
|
-
var partToAdd = arguments.length > 1 ? arguments[1] : undefined;
|
|
89
|
-
|
|
73
|
+
_proto.addConditionally = function addConditionally(condition, partToAdd) {
|
|
90
74
|
if (condition) {
|
|
91
75
|
return partToAdd;
|
|
92
76
|
} else {
|
|
93
77
|
return "";
|
|
94
78
|
}
|
|
95
79
|
};
|
|
96
|
-
|
|
97
80
|
_proto.attr = function attr(attributeName, value) {
|
|
98
|
-
if (value !== undefined) {
|
|
81
|
+
if (value !== undefined && !isUndefinedExpression(value)) {
|
|
99
82
|
return function () {
|
|
100
|
-
return ""
|
|
83
|
+
return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["", "=\"", "\""])), attributeName, value);
|
|
101
84
|
};
|
|
102
85
|
} else {
|
|
103
86
|
return function () {
|
|
@@ -105,27 +88,25 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
|
|
|
105
88
|
};
|
|
106
89
|
}
|
|
107
90
|
};
|
|
108
|
-
|
|
109
91
|
return BuildingBlockBase;
|
|
110
92
|
}();
|
|
111
93
|
/**
|
|
112
94
|
* Base class for runtime building blocks
|
|
113
95
|
*/
|
|
114
|
-
|
|
115
|
-
|
|
116
96
|
_exports.BuildingBlockBase = BuildingBlockBase;
|
|
117
|
-
|
|
118
97
|
var ensureMetadata = function (target) {
|
|
119
98
|
if (!target.hasOwnProperty("metadata")) {
|
|
120
99
|
target.metadata = deepClone(target.metadata || {
|
|
121
100
|
properties: {},
|
|
122
101
|
aggregations: {},
|
|
123
|
-
events: {}
|
|
102
|
+
events: {},
|
|
103
|
+
stereotype: "xmlmacro",
|
|
104
|
+
designtime: ""
|
|
124
105
|
});
|
|
125
106
|
}
|
|
126
|
-
|
|
127
107
|
return target.metadata;
|
|
128
108
|
};
|
|
109
|
+
|
|
129
110
|
/**
|
|
130
111
|
* Indicates that the property shall be declared as an xml attribute that can be used from the outside of the building block.
|
|
131
112
|
*
|
|
@@ -136,54 +117,39 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
|
|
|
136
117
|
* @param attributeDefinition
|
|
137
118
|
* @returns The decorated property
|
|
138
119
|
*/
|
|
139
|
-
|
|
140
|
-
|
|
141
120
|
function xmlAttribute(attributeDefinition) {
|
|
142
121
|
return function (target, propertyKey, propertyDescriptor) {
|
|
143
122
|
var metadata = ensureMetadata(target.constructor);
|
|
144
|
-
|
|
145
123
|
if (attributeDefinition.defaultValue === undefined) {
|
|
146
124
|
var _propertyDescriptor$i;
|
|
147
|
-
|
|
148
125
|
// If there is no defaultValue we can take the value from the initializer (natural way of defining defaults)
|
|
149
126
|
attributeDefinition.defaultValue = (_propertyDescriptor$i = propertyDescriptor.initializer) === null || _propertyDescriptor$i === void 0 ? void 0 : _propertyDescriptor$i.call(propertyDescriptor);
|
|
150
127
|
}
|
|
151
|
-
|
|
152
128
|
delete propertyDescriptor.initializer;
|
|
153
|
-
|
|
154
129
|
if (metadata.properties[propertyKey.toString()] === undefined) {
|
|
155
130
|
metadata.properties[propertyKey.toString()] = attributeDefinition;
|
|
156
131
|
}
|
|
157
|
-
|
|
158
132
|
return propertyDescriptor;
|
|
159
133
|
}; // Needed to make TS happy with those decorators;
|
|
160
134
|
}
|
|
161
|
-
|
|
162
135
|
_exports.xmlAttribute = xmlAttribute;
|
|
163
|
-
|
|
164
136
|
function blockAttribute(attributeDefinition) {
|
|
165
137
|
return xmlAttribute(attributeDefinition);
|
|
166
138
|
}
|
|
167
|
-
|
|
168
139
|
_exports.blockAttribute = blockAttribute;
|
|
169
|
-
|
|
170
140
|
function xmlEvent() {
|
|
171
141
|
return function (target, propertyKey, propertyDescriptor) {
|
|
172
142
|
var metadata = ensureMetadata(target.constructor);
|
|
173
143
|
delete propertyDescriptor.initializer;
|
|
174
|
-
|
|
175
144
|
if (metadata.events[propertyKey.toString()] === undefined) {
|
|
176
145
|
metadata.events[propertyKey.toString()] = {
|
|
177
146
|
type: "Function"
|
|
178
147
|
};
|
|
179
148
|
}
|
|
180
|
-
|
|
181
149
|
return propertyDescriptor;
|
|
182
150
|
}; // Needed to make TS happy with those decorators;
|
|
183
151
|
}
|
|
184
|
-
|
|
185
152
|
_exports.xmlEvent = xmlEvent;
|
|
186
|
-
|
|
187
153
|
function blockEvent() {
|
|
188
154
|
return xmlEvent();
|
|
189
155
|
}
|
|
@@ -193,35 +159,27 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
|
|
|
193
159
|
* @param aggregationDefinition
|
|
194
160
|
* @returns The decorated property
|
|
195
161
|
*/
|
|
196
|
-
|
|
197
|
-
|
|
198
162
|
_exports.blockEvent = blockEvent;
|
|
199
|
-
|
|
200
163
|
function xmlAggregation(aggregationDefinition) {
|
|
201
164
|
return function (target, propertyKey, propertyDescriptor) {
|
|
202
165
|
var metadata = ensureMetadata(target.constructor);
|
|
203
166
|
delete propertyDescriptor.initializer;
|
|
204
|
-
|
|
205
167
|
if (metadata.aggregations[propertyKey] === undefined) {
|
|
206
168
|
metadata.aggregations[propertyKey] = aggregationDefinition;
|
|
207
169
|
}
|
|
208
|
-
|
|
209
170
|
return propertyDescriptor;
|
|
210
171
|
};
|
|
211
172
|
}
|
|
212
|
-
|
|
213
173
|
_exports.xmlAggregation = xmlAggregation;
|
|
214
|
-
|
|
215
174
|
function blockAggregation(aggregationDefinition) {
|
|
216
175
|
return xmlAggregation(aggregationDefinition);
|
|
217
176
|
}
|
|
218
|
-
|
|
219
177
|
_exports.blockAggregation = blockAggregation;
|
|
220
178
|
var RUNTIME_BLOCKS = {};
|
|
221
|
-
|
|
222
179
|
function defineBuildingBlock(oBuildingBlockDefinition) {
|
|
223
180
|
return function (classDefinition) {
|
|
224
|
-
ensureMetadata(classDefinition);
|
|
181
|
+
var metadata = ensureMetadata(classDefinition);
|
|
182
|
+
metadata.designtime = oBuildingBlockDefinition.designtime;
|
|
225
183
|
classDefinition.xmlTag = oBuildingBlockDefinition.name;
|
|
226
184
|
classDefinition.namespace = oBuildingBlockDefinition.namespace;
|
|
227
185
|
classDefinition.publicNamespace = oBuildingBlockDefinition.publicNamespace;
|
|
@@ -229,55 +187,62 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
|
|
|
229
187
|
classDefinition.isOpen = oBuildingBlockDefinition.isOpen;
|
|
230
188
|
classDefinition.isRuntime = oBuildingBlockDefinition.isRuntime;
|
|
231
189
|
classDefinition.apiVersion = 2;
|
|
232
|
-
|
|
233
190
|
if (classDefinition.isRuntime === true) {
|
|
234
|
-
classDefinition.prototype.getTemplate = function () {
|
|
191
|
+
classDefinition.prototype.getTemplate = function (oNode) {
|
|
235
192
|
var className = "".concat(oBuildingBlockDefinition.namespace, ".").concat(oBuildingBlockDefinition.name);
|
|
236
193
|
var extraProps = [];
|
|
237
|
-
|
|
238
|
-
|
|
194
|
+
// Function are defined as string but need to be resolved by UI5, as such we store them in an `event` property and will redispatch them later
|
|
195
|
+
var functionHolderDefinition = [];
|
|
196
|
+
var propertiesAssignedToFunction = [];
|
|
197
|
+
var functionStringInOrder = [];
|
|
198
|
+
for (var propertiesKey in metadata.properties) {
|
|
239
199
|
var propertyValue = this[propertiesKey];
|
|
240
|
-
|
|
241
200
|
if (propertyValue !== undefined && propertyValue !== null) {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
if (((_propertyValue = propertyValue) === null || _propertyValue === void 0 ? void 0 : (_propertyValue$isA = _propertyValue.isA) === null || _propertyValue$isA === void 0 ? void 0 : _propertyValue$isA.call(_propertyValue, "sap.ui.model.Context")) === true) {
|
|
201
|
+
if (isContext(propertyValue)) {
|
|
245
202
|
propertyValue = propertyValue.getPath();
|
|
246
203
|
}
|
|
247
|
-
|
|
248
|
-
|
|
204
|
+
if (metadata.properties[propertiesKey].type === "function") {
|
|
205
|
+
functionHolderDefinition.push(propertyValue);
|
|
206
|
+
functionStringInOrder.push(propertyValue);
|
|
207
|
+
propertiesAssignedToFunction.push(propertiesKey);
|
|
208
|
+
} else {
|
|
209
|
+
extraProps.push(xml(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["feBB:", "=\"", "\""])), propertiesKey, propertyValue));
|
|
210
|
+
}
|
|
249
211
|
}
|
|
250
212
|
}
|
|
251
|
-
|
|
252
|
-
|
|
213
|
+
if (functionHolderDefinition.length > 0) {
|
|
214
|
+
extraProps.push(xml(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["functionHolder=\"", "\""])), functionHolderDefinition.join(";")));
|
|
215
|
+
extraProps.push(xml(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["feBB:functionStringInOrder=\"", "\""])), functionStringInOrder.join(",")));
|
|
216
|
+
extraProps.push(xml(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["feBB:propertiesAssignedToFunction=\"", "\""])), propertiesAssignedToFunction.join(",")));
|
|
217
|
+
}
|
|
218
|
+
for (var eventsKey in metadata.events) {
|
|
253
219
|
var eventsValue = this[eventsKey];
|
|
254
|
-
|
|
255
220
|
if (eventsValue !== undefined) {
|
|
256
|
-
extraProps.push(xml(
|
|
221
|
+
extraProps.push(xml(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["feBB:", "=\"", "\""])), eventsKey, eventsValue));
|
|
257
222
|
}
|
|
258
223
|
}
|
|
259
|
-
|
|
260
|
-
|
|
224
|
+
// core:require need to be defined on the node itself to be picked up due to the templating step
|
|
225
|
+
var coreRequire = oNode.getAttribute("core:require") || undefined;
|
|
226
|
+
if (coreRequire) {
|
|
227
|
+
extraProps.push(xml(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["core:require=\"", "\""])), coreRequire));
|
|
228
|
+
}
|
|
229
|
+
return xml(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["<feBB:BuildingBlockFragment\n\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\txmlns:feBB=\"sap.fe.core.buildingBlocks\"\n\t\t\t\t\tfragmentName=\"", "\"\n\n\t\t\t\t\tid=\"{this>id}\"\n\t\t\t\t\ttype=\"FE_COMPONENTS\"\n\t\t\t\t\t", "\n\t\t\t\t>\n\t\t\t\t</feBB:BuildingBlockFragment>"])), className, extraProps);
|
|
261
230
|
};
|
|
262
231
|
}
|
|
263
|
-
|
|
264
232
|
classDefinition.register = function () {
|
|
265
233
|
registerBuildingBlock(classDefinition);
|
|
266
|
-
|
|
267
234
|
if (classDefinition.isRuntime === true) {
|
|
268
235
|
RUNTIME_BLOCKS["".concat(oBuildingBlockDefinition.namespace, ".").concat(oBuildingBlockDefinition.name)] = classDefinition;
|
|
269
236
|
}
|
|
270
237
|
};
|
|
271
|
-
|
|
272
238
|
classDefinition.unregister = function () {
|
|
273
239
|
XMLPreprocessor.plugIn(null, classDefinition.namespace, classDefinition.name);
|
|
274
240
|
XMLPreprocessor.plugIn(null, classDefinition.publicNamespace, classDefinition.name);
|
|
275
241
|
};
|
|
276
242
|
};
|
|
277
243
|
}
|
|
278
|
-
|
|
279
244
|
_exports.defineBuildingBlock = defineBuildingBlock;
|
|
280
|
-
|
|
245
|
+
BuildingBlockFragment.registerType("FE_COMPONENTS", {
|
|
281
246
|
load: function (mSettings) {
|
|
282
247
|
try {
|
|
283
248
|
return Promise.resolve(RUNTIME_BLOCKS[mSettings.fragmentName]);
|
|
@@ -286,108 +251,109 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
|
|
|
286
251
|
}
|
|
287
252
|
},
|
|
288
253
|
init: function (mSettings) {
|
|
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
|
-
if (
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
vValue = Number(vValue);
|
|
330
|
-
break;
|
|
331
|
-
}
|
|
332
|
-
} else {
|
|
333
|
-
// runtime bindings are allowed, so resolve the values as BindingToolkit expressions
|
|
334
|
-
vValue = resolveBindingString(vValue, propertyMetadata.type);
|
|
254
|
+
var _mSettings$customData,
|
|
255
|
+
_mSettings$customData2,
|
|
256
|
+
_mSettings$customData3,
|
|
257
|
+
_mSettings$customData4,
|
|
258
|
+
_mSettings$functionHo,
|
|
259
|
+
_feCustomData$functio,
|
|
260
|
+
_feCustomData$propert,
|
|
261
|
+
_this2 = this;
|
|
262
|
+
var MyClass = mSettings.fragmentContent;
|
|
263
|
+
if (!MyClass) {
|
|
264
|
+
// In some case we might have been called here synchronously (unstash case for instance), which means we didn't go through the load function
|
|
265
|
+
MyClass = RUNTIME_BLOCKS[mSettings.fragmentName];
|
|
266
|
+
}
|
|
267
|
+
var classSettings = {};
|
|
268
|
+
var feCustomData = (mSettings === null || mSettings === void 0 ? void 0 : (_mSettings$customData = mSettings.customData) === null || _mSettings$customData === void 0 ? void 0 : (_mSettings$customData2 = _mSettings$customData[0]) === null || _mSettings$customData2 === void 0 ? void 0 : (_mSettings$customData3 = _mSettings$customData2.mProperties) === null || _mSettings$customData3 === void 0 ? void 0 : (_mSettings$customData4 = _mSettings$customData3.value) === null || _mSettings$customData4 === void 0 ? void 0 : _mSettings$customData4["sap.fe.core.buildingBlocks"]) || {};
|
|
269
|
+
delete mSettings.customData;
|
|
270
|
+
var functionHolder = (_mSettings$functionHo = mSettings.functionHolder) !== null && _mSettings$functionHo !== void 0 ? _mSettings$functionHo : [];
|
|
271
|
+
delete mSettings.functionHolder;
|
|
272
|
+
var pageComponent = Component.getOwnerComponentFor(mSettings.containingView);
|
|
273
|
+
var appComponent = CommonUtils.getAppComponent(mSettings.containingView);
|
|
274
|
+
var metaModel = appComponent.getMetaModel();
|
|
275
|
+
var pageModel = pageComponent.getModel("_pageModel");
|
|
276
|
+
var functionStringInOrder = (_feCustomData$functio = feCustomData.functionStringInOrder) === null || _feCustomData$functio === void 0 ? void 0 : _feCustomData$functio.split(",");
|
|
277
|
+
var propertiesAssignedToFunction = (_feCustomData$propert = feCustomData.propertiesAssignedToFunction) === null || _feCustomData$propert === void 0 ? void 0 : _feCustomData$propert.split(",");
|
|
278
|
+
for (var propertyName in MyClass.metadata.properties) {
|
|
279
|
+
var propertyMetadata = MyClass.metadata.properties[propertyName];
|
|
280
|
+
var pageModelContext = pageModel.createBindingContext(feCustomData[propertyName]);
|
|
281
|
+
if (pageModelContext === null) {
|
|
282
|
+
// value cannot be resolved, so it is either a runtime binding or a constant
|
|
283
|
+
var vValue = feCustomData[propertyName];
|
|
284
|
+
if (typeof vValue === "string") {
|
|
285
|
+
if (propertyMetadata.bindable !== true) {
|
|
286
|
+
// runtime bindings are not allowed, so convert strings into actual primitive types
|
|
287
|
+
switch (propertyMetadata.type) {
|
|
288
|
+
case "boolean":
|
|
289
|
+
vValue = vValue === "true";
|
|
290
|
+
break;
|
|
291
|
+
case "number":
|
|
292
|
+
vValue = Number(vValue);
|
|
293
|
+
break;
|
|
335
294
|
}
|
|
295
|
+
} else {
|
|
296
|
+
// runtime bindings are allowed, so resolve the values as BindingToolkit expressions
|
|
297
|
+
vValue = resolveBindingString(vValue, propertyMetadata.type);
|
|
336
298
|
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
299
|
+
} else if (propertyMetadata.type === "function") {
|
|
300
|
+
(function () {
|
|
301
|
+
var functionIndex = propertiesAssignedToFunction.indexOf(propertyName);
|
|
302
|
+
var functionString = functionStringInOrder[functionIndex];
|
|
303
|
+
var targetFunction = functionHolder === null || functionHolder === void 0 ? void 0 : functionHolder.find(function (functionDef) {
|
|
304
|
+
var _functionDef$;
|
|
305
|
+
return ((_functionDef$ = functionDef[0]) === null || _functionDef$ === void 0 ? void 0 : _functionDef$._sapui_handlerName) === functionString;
|
|
306
|
+
});
|
|
307
|
+
// We use the _sapui_handlerName to identify which function is the one we want to bind here
|
|
308
|
+
if (targetFunction && targetFunction.length > 1) {
|
|
309
|
+
vValue = targetFunction[0].bind(targetFunction[1]);
|
|
310
|
+
}
|
|
311
|
+
})();
|
|
345
312
|
}
|
|
313
|
+
classSettings[propertyName] = vValue;
|
|
314
|
+
} else if (pageModelContext.getObject() !== undefined) {
|
|
315
|
+
// get value from page model
|
|
316
|
+
classSettings[propertyName] = pageModelContext.getObject();
|
|
317
|
+
} else {
|
|
318
|
+
// bind to metamodel
|
|
319
|
+
classSettings[propertyName] = metaModel.createBindingContext(feCustomData[propertyName]);
|
|
346
320
|
}
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
}
|
|
321
|
+
}
|
|
322
|
+
for (var eventName in MyClass.metadata.events) {
|
|
323
|
+
if (feCustomData[eventName] !== undefined && feCustomData[eventName].startsWith(".")) {
|
|
324
|
+
classSettings[eventName] = ObjectPath.get(feCustomData[eventName].substring(1), mSettings.containingView.getController());
|
|
325
|
+
} else {
|
|
326
|
+
classSettings[eventName] = ""; // For now, might need to resolve more stuff
|
|
354
327
|
}
|
|
328
|
+
}
|
|
355
329
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
var
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
var associationDetailName = _Object$keys[_i];
|
|
377
|
-
|
|
378
|
-
if (controlSettings.hasOwnProperty(associationDetailName)) {
|
|
379
|
-
controlSettings[associationDetailName] = mSettings.containingView.createId(controlSettings[associationDetailName]);
|
|
380
|
-
}
|
|
330
|
+
return ManagedObject.runWithPreprocessors(function () {
|
|
331
|
+
var renderedControl = new MyClass(classSettings, {}, {
|
|
332
|
+
isRuntimeInstantiation: true,
|
|
333
|
+
isPublic: false,
|
|
334
|
+
appComponent: appComponent
|
|
335
|
+
}).render(mSettings.containingView, appComponent);
|
|
336
|
+
if (!_this2._bAsync) {
|
|
337
|
+
_this2._aContent = renderedControl;
|
|
338
|
+
}
|
|
339
|
+
return renderedControl;
|
|
340
|
+
}, {
|
|
341
|
+
id: function (sId) {
|
|
342
|
+
return mSettings.containingView.createId(sId);
|
|
343
|
+
},
|
|
344
|
+
settings: function (controlSettings) {
|
|
345
|
+
var allAssociations = this.getMetadata().getAssociations();
|
|
346
|
+
for (var _i = 0, _Object$keys = Object.keys(allAssociations); _i < _Object$keys.length; _i++) {
|
|
347
|
+
var associationDetailName = _Object$keys[_i];
|
|
348
|
+
if (controlSettings.hasOwnProperty(associationDetailName) && !(controlSettings[associationDetailName] instanceof ManagedObject)) {
|
|
349
|
+
controlSettings[associationDetailName] = mSettings.containingView.createId(controlSettings[associationDetailName]);
|
|
381
350
|
}
|
|
382
|
-
|
|
383
|
-
return controlSettings;
|
|
384
351
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
}
|
|
352
|
+
return controlSettings;
|
|
353
|
+
}
|
|
354
|
+
});
|
|
389
355
|
}
|
|
390
356
|
});
|
|
391
357
|
return _exports;
|
|
392
358
|
}, false);
|
|
393
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdWlsZGluZ0Jsb2NrQmFzZSIsIm9Qcm9wcyIsIl9vQ29udHJvbENvbmZpZyIsIl9vU2V0dGluZ3MiLCJpc1B1YmxpYyIsImdldENvbnZlcnRlckNvbnRleHQiLCJvVmlzdWFsaXphdGlvbk9iamVjdFBhdGgiLCJjb250ZXh0UGF0aCIsIm1TZXR0aW5ncyIsIm1FeHRyYVBhcmFtcyIsIm9BcHBDb21wb25lbnQiLCJhcHBDb21wb25lbnQiLCJvcmlnaW5hbFZpZXdEYXRhIiwibW9kZWxzIiwidmlld0RhdGEiLCJnZXREYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwicmVzb3VyY2VCdW5kbGUiLCJkZWVwQ2xvbmUiLCJjb250cm9sQ29uZmlndXJhdGlvbiIsIm1lcmdlIiwiQ29udmVydGVyQ29udGV4dCIsImNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmFtZSIsIm1ldGFNb2RlbCIsImdldERpYWdub3N0aWNzIiwiY29udGV4dExvY2F0aW9uIiwia2V5cyIsImZvckVhY2giLCJwcm9wTmFtZSIsImNyZWF0ZUlkIiwiaWQiLCJzdHJpbmdQYXJ0cyIsImdlbmVyYXRlIiwidW5kZWZpbmVkIiwiZ2V0UHJvcGVydGllcyIsImFsbFByb3BlcnRpZXMiLCJvSW5zdGFuY2VLZXkiLCJoYXNPd25Qcm9wZXJ0eSIsInJlZ2lzdGVyIiwidW5yZWdpc3RlciIsImFkZENvbmRpdGlvbmFsbHkiLCJjb25kaXRpb24iLCJwYXJ0VG9BZGQiLCJhdHRyIiwiYXR0cmlidXRlTmFtZSIsInZhbHVlIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwicHJvcGVydGllcyIsImFnZ3JlZ2F0aW9ucyIsImV2ZW50cyIsInhtbEF0dHJpYnV0ZSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJwcm9wZXJ0eUtleSIsInByb3BlcnR5RGVzY3JpcHRvciIsImNvbnN0cnVjdG9yIiwiZGVmYXVsdFZhbHVlIiwiaW5pdGlhbGl6ZXIiLCJ0b1N0cmluZyIsImJsb2NrQXR0cmlidXRlIiwieG1sRXZlbnQiLCJ0eXBlIiwiYmxvY2tFdmVudCIsInhtbEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwiYmxvY2tBZ2dyZWdhdGlvbiIsIlJVTlRJTUVfQkxPQ0tTIiwiZGVmaW5lQnVpbGRpbmdCbG9jayIsIm9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiIsImNsYXNzRGVmaW5pdGlvbiIsInhtbFRhZyIsIm5hbWVzcGFjZSIsInB1YmxpY05hbWVzcGFjZSIsImZyYWdtZW50IiwiaXNPcGVuIiwiaXNSdW50aW1lIiwiYXBpVmVyc2lvbiIsInByb3RvdHlwZSIsImdldFRlbXBsYXRlIiwiY2xhc3NOYW1lIiwiZXh0cmFQcm9wcyIsInByb3BlcnRpZXNLZXkiLCJwcm9wZXJ0eVZhbHVlIiwiaXNBIiwiZ2V0UGF0aCIsInB1c2giLCJ4bWwiLCJldmVudHNLZXkiLCJldmVudHNWYWx1ZSIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsIkZyYWdtZW50IiwicmVnaXN0ZXJUeXBlIiwibG9hZCIsImZyYWdtZW50TmFtZSIsImluaXQiLCJNeUNsYXNzIiwiZnJhZ21lbnRDb250ZW50IiwiY2xhc3NTZXR0aW5ncyIsImZlQ3VzdG9tRGF0YSIsImN1c3RvbURhdGEiLCJtUHJvcGVydGllcyIsInBhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsImNvbnRhaW5pbmdWaWV3IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRNZXRhTW9kZWwiLCJwYWdlTW9kZWwiLCJnZXRNb2RlbCIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5TWV0YWRhdGEiLCJwYWdlTW9kZWxDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJ2VmFsdWUiLCJiaW5kYWJsZSIsIk51bWJlciIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwiZ2V0T2JqZWN0IiwiZXZlbnROYW1lIiwic3RhcnRzV2l0aCIsIk9iamVjdFBhdGgiLCJnZXQiLCJzdWJzdHJpbmciLCJnZXRDb250cm9sbGVyIiwiTWFuYWdlZE9iamVjdCIsInJ1bldpdGhQcmVwcm9jZXNzb3JzIiwicmVuZGVyZWRDb250cm9sIiwiaXNSdW50aW1lSW5zdGFudGlhdGlvbiIsInJlbmRlciIsIl9iQXN5bmMiLCJfYUNvbnRlbnQiLCJzSWQiLCJzZXR0aW5ncyIsImNvbnRyb2xTZXR0aW5ncyIsImFsbEFzc29jaWF0aW9ucyIsImdldE1ldGFkYXRhIiwiZ2V0QXNzb2NpYXRpb25zIiwiYXNzb2NpYXRpb25EZXRhaWxOYW1lIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJCdWlsZGluZ0Jsb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHsgZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUsIHJlZ2lzdGVyQnVpbGRpbmdCbG9jaywgeG1sIH0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyByZXNvbHZlQmluZGluZ1N0cmluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL21kYy9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRPYmplY3RFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcblxuLy8gVHlwZSBmb3IgdGhlIGFjY2Vzc29yIGRlY29yYXRvciB0aGF0IHdlIGVuZCB1cCB3aXRoIGluIGJhYmVsLlxudHlwZSBBY2Nlc3NvckRlc2NyaXB0b3I8VD4gPSBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxUPiAmIHsgaW5pdGlhbGl6ZXI/OiAoKSA9PiBUIH07XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRXh0cmFTZXR0aW5ncyA9IHtcblx0aXNQdWJsaWM6IGJvb2xlYW47XG5cdGlzUnVudGltZUluc3RhbnRpYXRpb24/OiBib29sZWFuO1xuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcbn07XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQnVpbGRpbmcgQmxvY2tcbiAqL1xuZXhwb3J0IGNsYXNzIEJ1aWxkaW5nQmxvY2tCYXNlIHtcblx0cHJvdGVjdGVkIGlzUHVibGljID0gZmFsc2U7XG5cdHByb3RlY3RlZCBpZCE6IHN0cmluZztcblx0Y29uc3RydWN0b3Iob1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgX29Db250cm9sQ29uZmlnPzogYW55LCBfb1NldHRpbmdzPzogQnVpbGRpbmdCbG9ja0V4dHJhU2V0dGluZ3MpIHtcblx0XHRPYmplY3Qua2V5cyhvUHJvcHMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIGNhc3RlZCBhcyBhbnkgc2luY2Ugd2UgYXJlIGFzc2lnbmluZyB0aGUgcHJvcGVydGllcyB0byB0aGUgaW5zdGFuY2Ugd2l0aG91dCBrbm93aW5nIHRoZWlyIHR5cGVcblx0XHRcdHRoaXNbcHJvcE5hbWUgYXMga2V5b2YgdGhpc10gPSBvUHJvcHNbcHJvcE5hbWVdIGFzIGFueTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IHRoZSBnaXZlbiBsb2NhbCBlbGVtZW50IElEIHRvIGEgZ2xvYmFsbHkgdW5pcXVlIElEIGJ5IHByZWZpeGluZyB3aXRoIHRoZSBCdWlsZGluZyBCbG9jayBJRC5cblx0ICpcblx0ICogQHBhcmFtIHN0cmluZ1BhcnRzXG5cdCAqIEByZXR1cm5zIEVpdGhlciB0aGUgZ2xvYmFsIElEIG9yIHVuZGVmaW5lZCBpZiB0aGUgQnVpbGRpbmcgQmxvY2sgZG9lc24ndCBoYXZlIGFuIElEXG5cdCAqL1xuXHRwdWJsaWMgY3JlYXRlSWQoLi4uc3RyaW5nUGFydHM6IHN0cmluZ1tdKSB7XG5cdFx0Ly8gSWYgdGhlIGNoaWxkIGluc3RhbmNlIGhhcyBhbiBJRCBwcm9wZXJ0eSB1c2UgaXQgb3RoZXJ3aXNlIHJldHVybiB1bmRlZmluZWRcblx0XHRpZiAodGhpcy5pZCkge1xuXHRcdFx0cmV0dXJuIGdlbmVyYXRlKFsodGhpcyBhcyBhbnkpLmlkLCAuLi5zdHJpbmdQYXJ0c10pO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8vIFRoaXMgYmxvY2sgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIEkgYW0gbm90IHVzaW5nIHRoZW0gZm9yIG5vdyAvIG5lZWQgdG8gY2hhbmdlIHRoaXMgYnV0IHN0aWxsIHdhbnQgdG8ga2VlcCB0aGVtIGFyb3VuZFxuXHRwcm90ZWN0ZWQgZ2V0Q29udmVydGVyQ29udGV4dCA9IGZ1bmN0aW9uIChvVmlzdWFsaXphdGlvbk9iamVjdFBhdGg6IGFueSwgY29udGV4dFBhdGg6IGFueSwgbVNldHRpbmdzOiBhbnksIG1FeHRyYVBhcmFtcz86IGFueSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBtU2V0dGluZ3MuYXBwQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9yaWdpbmFsVmlld0RhdGEgPSBtU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhICYmIG1TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0RGF0YSgpO1xuXHRcdGxldCB2aWV3RGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbmFsVmlld0RhdGEpO1xuXHRcdGRlbGV0ZSB2aWV3RGF0YS5yZXNvdXJjZUJ1bmRsZTtcblx0XHR2aWV3RGF0YSA9IGRlZXBDbG9uZSh2aWV3RGF0YSk7XG5cdFx0dmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24gPSBtZXJnZSh2aWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbiwgbUV4dHJhUGFyYW1zKTtcblx0XHRyZXR1cm4gQ29udmVydGVyQ29udGV4dC5jcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oXG5cdFx0XHRvVmlzdWFsaXphdGlvbk9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZSxcblx0XHRcdG1TZXR0aW5ncy5tb2RlbHMubWV0YU1vZGVsLFxuXHRcdFx0b0FwcENvbXBvbmVudCAmJiBvQXBwQ29tcG9uZW50LmdldERpYWdub3N0aWNzKCksXG5cdFx0XHRtZXJnZSxcblx0XHRcdG9WaXN1YWxpemF0aW9uT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0XHR2aWV3RGF0YVxuXHRcdCk7XG5cdH07XG5cdHB1YmxpYyBnZXRQcm9wZXJ0aWVzKCkge1xuXHRcdGNvbnN0IGFsbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0XHRmb3IgKGNvbnN0IG9JbnN0YW5jZUtleSBpbiB0aGlzKSB7XG5cdFx0XHRpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShvSW5zdGFuY2VLZXkpKSB7XG5cdFx0XHRcdGFsbFByb3BlcnRpZXNbb0luc3RhbmNlS2V5XSA9IHRoaXNbb0luc3RhbmNlS2V5XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFsbFByb3BlcnRpZXM7XG5cdH1cblx0c3RhdGljIHJlZ2lzdGVyKCkge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRlblxuXHR9XG5cdHN0YXRpYyB1bnJlZ2lzdGVyKCkge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRlblxuXHR9XG5cdHB1YmxpYyBhZGRDb25kaXRpb25hbGx5KGNvbmRpdGlvbiA9IGZhbHNlLCBwYXJ0VG9BZGQ/OiBhbnkpIHtcblx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRyZXR1cm4gcGFydFRvQWRkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9XG5cdH1cblx0cHJvdGVjdGVkIGF0dHIoYXR0cmlidXRlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogKCkgPT4gc3RyaW5nIHtcblx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuICgpID0+IGAke2F0dHJpYnV0ZU5hbWV9PVwiJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSl9XCJgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gKCkgPT4gXCJcIjtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIGV4dGVuZHMgQnVpbGRpbmdCbG9ja0Jhc2Uge1xuXHRyZW5kZXIoY29udGFpbmluZ1ZpZXc6IFZpZXcsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogQ29udHJvbDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbiA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRpc1B1YmxpYz86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZT86IGFueTtcblx0Y29tcHV0ZWQ/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdGJpbmRhYmxlPzogYm9vbGVhbjsgLy8gb25seSBjb25zaWRlcmVkIGZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrc1xuXHQka2luZD86IHN0cmluZ1tdO1xufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGlzUHVibGljPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHRjb21wdXRlZD86IGJvb2xlYW47XG5cdCRUeXBlPzogc3RyaW5nW107XG5cdCRraW5kPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0V2ZW50ID0ge307XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uID0ge1xuXHRpc1B1YmxpYz86IGJvb2xlYW47XG5cdHR5cGU6IHN0cmluZztcblx0c2xvdD86IHN0cmluZztcblx0aXNEZWZhdWx0PzogYm9vbGVhbjtcbn07XG50eXBlIENvbW1vbkJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uID0ge1xuXHRuYW1lc3BhY2U6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHR4bWxUYWc/OiBzdHJpbmc7XG5cdGZyYWdtZW50Pzogc3RyaW5nO1xuXHRwdWJsaWNOYW1lc3BhY2U/OiBzdHJpbmc7XG5cblx0aXNSdW50aW1lPzogYm9vbGVhbjtcblx0aXNPcGVuPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYyID0gQ29tbW9uQnVpbGRpbmdCbG9ja0RlZmluaXRpb24gJlxuXHR0eXBlb2YgQnVpbGRpbmdCbG9ja0Jhc2UgJiB7XG5cdFx0YXBpVmVyc2lvbjogMjtcblx0XHRtZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xuXHR9O1xuXG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxID0gQ29tbW9uQnVpbGRpbmdCbG9ja0RlZmluaXRpb24gJiB7XG5cdG5hbWU6IHN0cmluZztcblx0YXBpVmVyc2lvbj86IDE7XG5cdGNyZWF0ZT86IEZ1bmN0aW9uO1xuXHRnZXRUZW1wbGF0ZT86IEZ1bmN0aW9uO1xuXHRtZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uID0gQnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMiB8IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjE7XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSB7XG5cdGV2ZW50czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0V2ZW50Pjtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj47XG59O1xuXG5jb25zdCBlbnN1cmVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0YXJnZXQ6IFBhcnRpYWw8QnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMj4pOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRpZiAoIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShcIm1ldGFkYXRhXCIpKSB7XG5cdFx0dGFyZ2V0Lm1ldGFkYXRhID0gZGVlcENsb25lKFxuXHRcdFx0dGFyZ2V0Lm1ldGFkYXRhIHx8IHtcblx0XHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uczoge30sXG5cdFx0XHRcdGV2ZW50czoge31cblx0XHRcdH1cblx0XHQpO1xuXHR9XG5cdHJldHVybiB0YXJnZXQubWV0YWRhdGEgYXMgQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xufTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydHkgc2hhbGwgYmUgZGVjbGFyZWQgYXMgYW4geG1sIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIGZyb20gdGhlIG91dHNpZGUgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrLlxuICpcbiAqIElmIGRlZmluaW5nIGEgcnVudGltZSBCdWlsZGluZyBCbG9jaywgcGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgdGhlIGNvcnJlY3QgdHlwaW5nczogRGVwZW5kaW5nIG9uIGl0cyBtZXRhZGF0YSxcbiAqIGEgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBhIHtAbGluayBzYXAudWkubW9kZWwuQ29udGV4dH0gKDxjb2RlPnR5cGU6ICdzYXAudWkubW9kZWwuQ29udGV4dCc8L2NvZGU+KSxcbiAqIGEgY29uc3RhbnQgKDxjb2RlPmJpbmRhYmxlOiBmYWxzZTwvY29kZT4pLCBvciBhIHtAbGluayBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb259ICg8Y29kZT5iaW5kYWJsZTogdHJ1ZTwvY29kZT4pLlxuICpcbiAqIEBwYXJhbSBhdHRyaWJ1dGVEZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxBdHRyaWJ1dGUoYXR0cmlidXRlRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IEJ1aWxkaW5nQmxvY2tCYXNlLCBwcm9wZXJ0eUtleTogc3RyaW5nIHwgU3ltYm9sLCBwcm9wZXJ0eURlc2NyaXB0b3I6IEFjY2Vzc29yRGVzY3JpcHRvcjxhbnk+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQuY29uc3RydWN0b3IpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBubyBkZWZhdWx0VmFsdWUgd2UgY2FuIHRha2UgdGhlIHZhbHVlIGZyb20gdGhlIGluaXRpYWxpemVyIChuYXR1cmFsIHdheSBvZiBkZWZpbmluZyBkZWZhdWx0cylcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZGVmYXVsdFZhbHVlID0gcHJvcGVydHlEZXNjcmlwdG9yLmluaXRpYWxpemVyPy4oKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci5pbml0aWFsaXplcjtcblx0XHRpZiAobWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIGFueTsgLy8gTmVlZGVkIHRvIG1ha2UgVFMgaGFwcHkgd2l0aCB0aG9zZSBkZWNvcmF0b3JzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrQXR0cmlidXRlKGF0dHJpYnV0ZURlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24pOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiB4bWxBdHRyaWJ1dGUoYXR0cmlidXRlRGVmaW5pdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB4bWxFdmVudCgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBCdWlsZGluZ0Jsb2NrQmFzZSwgcHJvcGVydHlLZXk6IHN0cmluZyB8IFN5bWJvbCwgcHJvcGVydHlEZXNjcmlwdG9yOiBBY2Nlc3NvckRlc2NyaXB0b3I8YW55Pikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLmluaXRpYWxpemVyO1xuXHRcdGlmIChtZXRhZGF0YS5ldmVudHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bWV0YWRhdGEuZXZlbnRzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0geyB0eXBlOiBcIkZ1bmN0aW9uXCIgfTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIGFueTsgLy8gTmVlZGVkIHRvIG1ha2UgVFMgaGFwcHkgd2l0aCB0aG9zZSBkZWNvcmF0b3JzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrRXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sRXZlbnQoKTtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIHByb3BlcnR5IHNoYWxsIGJlIGRlY2xhcmVkIGFzIGFuIHhtbCBhZ2dyZWdhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZyb20gdGhlIG91dHNpZGUgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhtbEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IEJ1aWxkaW5nQmxvY2tCYXNlLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldC5jb25zdHJ1Y3Rvcik7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgYW55KS5pbml0aWFsaXplcjtcblx0XHRpZiAobWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldID0gYWdncmVnYXRpb25EZWZpbml0aW9uO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgYW55O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrQWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sQWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uKTtcbn1cbmNvbnN0IFJVTlRJTUVfQkxPQ0tTOiBSZWNvcmQ8c3RyaW5nLCBSdW50aW1lQnVpbGRpbmdCbG9jayAmIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjI+ID0ge307XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQnVpbGRpbmdCbG9jayhvQnVpbGRpbmdCbG9ja0RlZmluaXRpb246IENvbW1vbkJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogQ2xhc3NEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKGNsYXNzRGVmaW5pdGlvbjogYW55KSB7XG5cdFx0ZW5zdXJlTWV0YWRhdGEoY2xhc3NEZWZpbml0aW9uKTtcblx0XHRjbGFzc0RlZmluaXRpb24ueG1sVGFnID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWU7XG5cdFx0Y2xhc3NEZWZpbml0aW9uLm5hbWVzcGFjZSA9IG9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2U7XG5cdFx0Y2xhc3NEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSA9IG9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2U7XG5cdFx0Y2xhc3NEZWZpbml0aW9uLmZyYWdtZW50ID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50O1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5pc09wZW4gPSBvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5pc1J1bnRpbWUgPSBvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNSdW50aW1lO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5hcGlWZXJzaW9uID0gMjtcblx0XHRpZiAoY2xhc3NEZWZpbml0aW9uLmlzUnVudGltZSA9PT0gdHJ1ZSkge1xuXHRcdFx0Y2xhc3NEZWZpbml0aW9uLnByb3RvdHlwZS5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3QgY2xhc3NOYW1lID0gYCR7b0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gO1xuXHRcdFx0XHRjb25zdCBleHRyYVByb3BzID0gW107XG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydGllc0tleSBpbiBjbGFzc0RlZmluaXRpb24ubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0XHRcdGxldCBwcm9wZXJ0eVZhbHVlID0gdGhpc1twcm9wZXJ0aWVzS2V5XTtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5VmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlPy5pc0E/LihcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGV4dHJhUHJvcHMucHVzaCh4bWxgZmVCQjoke3Byb3BlcnRpZXNLZXl9PVwiJHtwcm9wZXJ0eVZhbHVlfVwiYCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgZXZlbnRzS2V5IGluIGNsYXNzRGVmaW5pdGlvbi5tZXRhZGF0YS5ldmVudHMpIHtcblx0XHRcdFx0XHRjb25zdCBldmVudHNWYWx1ZSA9IHRoaXNbZXZlbnRzS2V5XTtcblx0XHRcdFx0XHRpZiAoZXZlbnRzVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0ZXh0cmFQcm9wcy5wdXNoKHhtbGBmZUJCOiR7ZXZlbnRzS2V5fT1cIiR7ZXZlbnRzVmFsdWV9XCJgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHhtbGA8Y29yZTpGcmFnbWVudFxuXHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0eG1sbnM6ZmVCQj1cInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzXCJcblx0XHRcdFx0XHRmcmFnbWVudE5hbWU9XCIke2NsYXNzTmFtZX1cIlxuXHRcdFx0XHRcdGlkPVwie3RoaXM+aWR9XCJcblx0XHRcdFx0XHR0eXBlPVwiRkVfQ09NUE9ORU5UU1wiXG5cdFx0XHRcdFx0JHtleHRyYVByb3BzfVxuXHRcdFx0XHQ+XG5cdFx0XHRcdDwvY29yZTpGcmFnbWVudD5gO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjbGFzc0RlZmluaXRpb24ucmVnaXN0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZWdpc3RlckJ1aWxkaW5nQmxvY2soY2xhc3NEZWZpbml0aW9uKTtcblx0XHRcdGlmIChjbGFzc0RlZmluaXRpb24uaXNSdW50aW1lID09PSB0cnVlKSB7XG5cdFx0XHRcdFJVTlRJTUVfQkxPQ0tTW2Ake29CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2V9LiR7b0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YF0gPSBjbGFzc0RlZmluaXRpb247XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjbGFzc0RlZmluaXRpb24udW5yZWdpc3RlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgY2xhc3NEZWZpbml0aW9uLm5hbWVzcGFjZSwgY2xhc3NEZWZpbml0aW9uLm5hbWUpO1xuXHRcdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBjbGFzc0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlLCBjbGFzc0RlZmluaXRpb24ubmFtZSk7XG5cdFx0fTtcblx0fTtcbn1cblxuRnJhZ21lbnQucmVnaXN0ZXJUeXBlKFwiRkVfQ09NUE9ORU5UU1wiLCB7XG5cdGxvYWQ6IGFzeW5jIGZ1bmN0aW9uIChtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0XHRyZXR1cm4gUlVOVElNRV9CTE9DS1NbbVNldHRpbmdzLmZyYWdtZW50TmFtZV07XG5cdH0sXG5cdGluaXQ6IGFzeW5jIGZ1bmN0aW9uIChtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0XHRsZXQgTXlDbGFzczogUnVudGltZUJ1aWxkaW5nQmxvY2sgJiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYyID0gbVNldHRpbmdzLmZyYWdtZW50Q29udGVudDtcblx0XHRpZiAoIU15Q2xhc3MpIHtcblx0XHRcdC8vIEluIHNvbWUgY2FzZSB3ZSBtaWdodCBoYXZlIGJlZW4gY2FsbGVkIGhlcmUgc3luY2hyb25vdXNseSAodW5zdGFzaCBjYXNlIGZvciBpbnN0YW5jZSksIHdoaWNoIG1lYW5zIHdlIGRpZG4ndCBnbyB0aHJvdWdoIHRoZSBsb2FkIGZ1bmN0aW9uXG5cdFx0XHRNeUNsYXNzID0gUlVOVElNRV9CTE9DS1NbbVNldHRpbmdzLmZyYWdtZW50TmFtZV07XG5cdFx0fVxuXHRcdGNvbnN0IGNsYXNzU2V0dGluZ3M6IGFueSA9IHt9O1xuXHRcdGNvbnN0IGZlQ3VzdG9tRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IG1TZXR0aW5ncz8uY3VzdG9tRGF0YT8uWzBdPy5tUHJvcGVydGllcz8udmFsdWU/LltcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzXCJdIHx8IHt9O1xuXHRcdGRlbGV0ZSBtU2V0dGluZ3MuY3VzdG9tRGF0YTtcblx0XHRjb25zdCBwYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG1TZXR0aW5ncy5jb250YWluaW5nVmlldykgYXMgVGVtcGxhdGVDb21wb25lbnQ7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG1TZXR0aW5ncy5jb250YWluaW5nVmlldyk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gYXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHBhZ2VNb2RlbCA9IHBhZ2VDb21wb25lbnQuZ2V0TW9kZWwoXCJfcGFnZU1vZGVsXCIpO1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIE15Q2xhc3MubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlNZXRhZGF0YSA9IE15Q2xhc3MubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0Y29uc3QgcGFnZU1vZGVsQ29udGV4dCA9IHBhZ2VNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChmZUN1c3RvbURhdGFbcHJvcGVydHlOYW1lXSk7XG5cblx0XHRcdGlmIChwYWdlTW9kZWxDb250ZXh0ID09PSBudWxsKSB7XG5cdFx0XHRcdC8vIHZhbHVlIGNhbm5vdCBiZSByZXNvbHZlZCwgc28gaXQgaXMgZWl0aGVyIGEgcnVudGltZSBiaW5kaW5nIG9yIGEgY29uc3RhbnRcblx0XHRcdFx0bGV0IHZWYWx1ZSA9IGZlQ3VzdG9tRGF0YVtwcm9wZXJ0eU5hbWVdO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgdlZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5TWV0YWRhdGEuYmluZGFibGUgIT09IHRydWUpIHtcblx0XHRcdFx0XHRcdC8vIHJ1bnRpbWUgYmluZGluZ3MgYXJlIG5vdCBhbGxvd2VkLCBzbyBjb252ZXJ0IHN0cmluZ3MgaW50byBhY3R1YWwgcHJpbWl0aXZlIHR5cGVzXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHByb3BlcnR5TWV0YWRhdGEudHlwZSkge1xuXHRcdFx0XHRcdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHRcdHZWYWx1ZSA9IHZWYWx1ZSA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRcdFx0XHR2VmFsdWUgPSBOdW1iZXIodlZhbHVlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gcnVudGltZSBiaW5kaW5ncyBhcmUgYWxsb3dlZCwgc28gcmVzb2x2ZSB0aGUgdmFsdWVzIGFzIEJpbmRpbmdUb29sa2l0IGV4cHJlc3Npb25zXG5cdFx0XHRcdFx0XHR2VmFsdWUgPSByZXNvbHZlQmluZGluZ1N0cmluZyh2VmFsdWUsIHByb3BlcnR5TWV0YWRhdGEudHlwZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2xhc3NTZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gdlZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChwYWdlTW9kZWxDb250ZXh0LmdldE9iamVjdCgpICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gZ2V0IHZhbHVlIGZyb20gcGFnZSBtb2RlbFxuXHRcdFx0XHRjbGFzc1NldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSBwYWdlTW9kZWxDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gYmluZCB0byBtZXRhbW9kZWxcblx0XHRcdFx0Y2xhc3NTZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGZlQ3VzdG9tRGF0YVtwcm9wZXJ0eU5hbWVdKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBldmVudE5hbWUgaW4gTXlDbGFzcy5tZXRhZGF0YS5ldmVudHMpIHtcblx0XHRcdGlmIChmZUN1c3RvbURhdGFbZXZlbnROYW1lXSAhPT0gdW5kZWZpbmVkICYmIChmZUN1c3RvbURhdGFbZXZlbnROYW1lXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG5cdFx0XHRcdGNsYXNzU2V0dGluZ3NbZXZlbnROYW1lXSA9IE9iamVjdFBhdGguZ2V0KGZlQ3VzdG9tRGF0YVtldmVudE5hbWVdLnN1YnN0cmluZygxKSwgbVNldHRpbmdzLmNvbnRhaW5pbmdWaWV3LmdldENvbnRyb2xsZXIoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbGFzc1NldHRpbmdzW2V2ZW50TmFtZV0gPSBcIlwiOyAvLyBGb3Igbm93LCBtaWdodCBuZWVkIHRvIHJlc29sdmUgbW9yZSBzdHVmZlxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gKE1hbmFnZWRPYmplY3QgYXMgdW5rbm93biBhcyBNYW5hZ2VkT2JqZWN0RXgpLnJ1bldpdGhQcmVwcm9jZXNzb3JzKFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRjb25zdCByZW5kZXJlZENvbnRyb2wgPSAoXG5cdFx0XHRcdFx0bmV3IE15Q2xhc3MoXG5cdFx0XHRcdFx0XHRjbGFzc1NldHRpbmdzLFxuXHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHR7IGlzUnVudGltZUluc3RhbnRpYXRpb246IHRydWUsIGlzUHVibGljOiBmYWxzZSwgYXBwQ29tcG9uZW50OiBhcHBDb21wb25lbnQgfVxuXHRcdFx0XHRcdCkgYXMgUnVudGltZUJ1aWxkaW5nQmxvY2tcblx0XHRcdFx0KS5yZW5kZXIobVNldHRpbmdzLmNvbnRhaW5pbmdWaWV3LCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRpZiAoISh0aGlzIGFzIGFueSkuX2JBc3luYykge1xuXHRcdFx0XHRcdCh0aGlzIGFzIGFueSkuX2FDb250ZW50ID0gcmVuZGVyZWRDb250cm9sO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZW5kZXJlZENvbnRyb2w7XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRpZDogZnVuY3Rpb24gKHNJZDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1TZXR0aW5ncy5jb250YWluaW5nVmlldy5jcmVhdGVJZChzSWQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZXR0aW5nczogZnVuY3Rpb24gKGNvbnRyb2xTZXR0aW5nczogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgYWxsQXNzb2NpYXRpb25zID0gdGhpcy5nZXRNZXRhZGF0YSgpLmdldEFzc29jaWF0aW9ucygpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgYXNzb2NpYXRpb25EZXRhaWxOYW1lIG9mIE9iamVjdC5rZXlzKGFsbEFzc29jaWF0aW9ucykpIHtcblx0XHRcdFx0XHRcdGlmIChjb250cm9sU2V0dGluZ3MuaGFzT3duUHJvcGVydHkoYXNzb2NpYXRpb25EZXRhaWxOYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRjb250cm9sU2V0dGluZ3NbYXNzb2NpYXRpb25EZXRhaWxOYW1lXSA9IG1TZXR0aW5ncy5jb250YWluaW5nVmlldy5jcmVhdGVJZChcblx0XHRcdFx0XHRcdFx0XHRjb250cm9sU2V0dGluZ3NbYXNzb2NpYXRpb25EZXRhaWxOYW1lXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gY29udHJvbFNldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7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
|
|
359
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdWlsZGluZ0Jsb2NrQmFzZSIsIm9Qcm9wcyIsIl9vQ29udHJvbENvbmZpZyIsIl9vU2V0dGluZ3MiLCJpc1B1YmxpYyIsImdldENvbnZlcnRlckNvbnRleHQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiY29udGV4dFBhdGgiLCJtU2V0dGluZ3MiLCJtRXh0cmFQYXJhbXMiLCJvQXBwQ29tcG9uZW50IiwiYXBwQ29tcG9uZW50Iiwib3JpZ2luYWxWaWV3RGF0YSIsIm1vZGVscyIsInZpZXdEYXRhIiwiZ2V0RGF0YSIsIk9iamVjdCIsImFzc2lnbiIsInJlc291cmNlQnVuZGxlIiwiZGVlcENsb25lIiwiY29udHJvbENvbmZpZ3VyYXRpb24iLCJtZXJnZSIsIkNvbnZlcnRlckNvbnRleHQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8iLCJzdGFydGluZ0VudGl0eVNldCIsIm5hbWUiLCJtZXRhTW9kZWwiLCJnZXREaWFnbm9zdGljcyIsImNvbnRleHRMb2NhdGlvbiIsImtleXMiLCJmb3JFYWNoIiwicHJvcE5hbWUiLCJjcmVhdGVJZCIsImlkIiwic3RyaW5nUGFydHMiLCJnZW5lcmF0ZSIsInVuZGVmaW5lZCIsImdldFByb3BlcnRpZXMiLCJhbGxQcm9wZXJ0aWVzIiwib0luc3RhbmNlS2V5IiwiaGFzT3duUHJvcGVydHkiLCJyZWdpc3RlciIsInVucmVnaXN0ZXIiLCJhZGRDb25kaXRpb25hbGx5IiwiY29uZGl0aW9uIiwicGFydFRvQWRkIiwiYXR0ciIsImF0dHJpYnV0ZU5hbWUiLCJ2YWx1ZSIsImlzVW5kZWZpbmVkRXhwcmVzc2lvbiIsInhtbCIsImVuc3VyZU1ldGFkYXRhIiwidGFyZ2V0IiwibWV0YWRhdGEiLCJwcm9wZXJ0aWVzIiwiYWdncmVnYXRpb25zIiwiZXZlbnRzIiwic3RlcmVvdHlwZSIsImRlc2lnbnRpbWUiLCJ4bWxBdHRyaWJ1dGUiLCJhdHRyaWJ1dGVEZWZpbml0aW9uIiwicHJvcGVydHlLZXkiLCJwcm9wZXJ0eURlc2NyaXB0b3IiLCJjb25zdHJ1Y3RvciIsImRlZmF1bHRWYWx1ZSIsImluaXRpYWxpemVyIiwidG9TdHJpbmciLCJibG9ja0F0dHJpYnV0ZSIsInhtbEV2ZW50IiwidHlwZSIsImJsb2NrRXZlbnQiLCJ4bWxBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiIsImJsb2NrQWdncmVnYXRpb24iLCJSVU5USU1FX0JMT0NLUyIsImRlZmluZUJ1aWxkaW5nQmxvY2siLCJvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJjbGFzc0RlZmluaXRpb24iLCJ4bWxUYWciLCJuYW1lc3BhY2UiLCJwdWJsaWNOYW1lc3BhY2UiLCJmcmFnbWVudCIsImlzT3BlbiIsImlzUnVudGltZSIsImFwaVZlcnNpb24iLCJwcm90b3R5cGUiLCJnZXRUZW1wbGF0ZSIsIm9Ob2RlIiwiY2xhc3NOYW1lIiwiZXh0cmFQcm9wcyIsImZ1bmN0aW9uSG9sZGVyRGVmaW5pdGlvbiIsInByb3BlcnRpZXNBc3NpZ25lZFRvRnVuY3Rpb24iLCJmdW5jdGlvblN0cmluZ0luT3JkZXIiLCJwcm9wZXJ0aWVzS2V5IiwicHJvcGVydHlWYWx1ZSIsImlzQ29udGV4dCIsImdldFBhdGgiLCJwdXNoIiwibGVuZ3RoIiwiam9pbiIsImV2ZW50c0tleSIsImV2ZW50c1ZhbHVlIiwiY29yZVJlcXVpcmUiLCJnZXRBdHRyaWJ1dGUiLCJyZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJYTUxQcmVwcm9jZXNzb3IiLCJwbHVnSW4iLCJCdWlsZGluZ0Jsb2NrRnJhZ21lbnQiLCJyZWdpc3RlclR5cGUiLCJsb2FkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJmcmFnbWVudE5hbWUiLCJpbml0IiwiTXlDbGFzcyIsImZyYWdtZW50Q29udGVudCIsImNsYXNzU2V0dGluZ3MiLCJmZUN1c3RvbURhdGEiLCJjdXN0b21EYXRhIiwibVByb3BlcnRpZXMiLCJmdW5jdGlvbkhvbGRlciIsInBhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsImNvbnRhaW5pbmdWaWV3IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRNZXRhTW9kZWwiLCJwYWdlTW9kZWwiLCJnZXRNb2RlbCIsInNwbGl0IiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlNZXRhZGF0YSIsInBhZ2VNb2RlbENvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInZWYWx1ZSIsImJpbmRhYmxlIiwiTnVtYmVyIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJmdW5jdGlvbkluZGV4IiwiaW5kZXhPZiIsImZ1bmN0aW9uU3RyaW5nIiwidGFyZ2V0RnVuY3Rpb24iLCJmaW5kIiwiZnVuY3Rpb25EZWYiLCJfc2FwdWlfaGFuZGxlck5hbWUiLCJiaW5kIiwiZ2V0T2JqZWN0IiwiZXZlbnROYW1lIiwic3RhcnRzV2l0aCIsIk9iamVjdFBhdGgiLCJnZXQiLCJzdWJzdHJpbmciLCJnZXRDb250cm9sbGVyIiwiTWFuYWdlZE9iamVjdCIsInJ1bldpdGhQcmVwcm9jZXNzb3JzIiwicmVuZGVyZWRDb250cm9sIiwiaXNSdW50aW1lSW5zdGFudGlhdGlvbiIsInJlbmRlciIsIl9iQXN5bmMiLCJfYUNvbnRlbnQiLCJzSWQiLCJzZXR0aW5ncyIsImNvbnRyb2xTZXR0aW5ncyIsImFsbEFzc29jaWF0aW9ucyIsImdldE1ldGFkYXRhIiwiZ2V0QXNzb2NpYXRpb25zIiwiYXNzb2NpYXRpb25EZXRhaWxOYW1lIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJCdWlsZGluZ0Jsb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQnVpbGRpbmdCbG9ja0ZyYWdtZW50IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrRnJhZ21lbnRcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncywgWE1MUHJvY2Vzc29yVHlwZVZhbHVlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5pbXBvcnQgeyByZWdpc3RlckJ1aWxkaW5nQmxvY2ssIHhtbCB9IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrUnVudGltZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgaXNVbmRlZmluZWRFeHByZXNzaW9uLCByZXNvbHZlQmluZGluZ1N0cmluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgeyBpc0NvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL21kYy9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VkT2JqZWN0RXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIE9iamVjdFZhbHVlMiA9IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBDb250ZXh0IHwgdW5kZWZpbmVkIHwgb2JqZWN0IHwgbnVsbDtcbnR5cGUgT2JqZWN0VmFsdWUzPFQ+ID0gVCB8IFJlY29yZDxzdHJpbmcsIFQ+IHwgVFtdO1xuZXhwb3J0IHR5cGUgT2JqZWN0VmFsdWUgPSBPYmplY3RWYWx1ZTM8T2JqZWN0VmFsdWUyIHwgUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPiB8IE9iamVjdFZhbHVlMltdPjtcblxuLy8gVHlwZSBmb3IgdGhlIGFjY2Vzc29yIGRlY29yYXRvciB0aGF0IHdlIGVuZCB1cCB3aXRoIGluIGJhYmVsLlxudHlwZSBBY2Nlc3NvckRlc2NyaXB0b3I8VD4gPSBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxUPiAmIHsgaW5pdGlhbGl6ZXI/OiAoKSA9PiBUIH07XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRXh0cmFTZXR0aW5ncyA9IHtcblx0aXNQdWJsaWM6IGJvb2xlYW47XG5cdGlzUnVudGltZUluc3RhbnRpYXRpb24/OiBib29sZWFuO1xuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcbn07XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQnVpbGRpbmcgQmxvY2tcbiAqL1xuZXhwb3J0IGNsYXNzIEJ1aWxkaW5nQmxvY2tCYXNlIHtcblx0cHJvdGVjdGVkIGlzUHVibGljID0gZmFsc2U7XG5cdHByb3RlY3RlZCBpZCE6IHN0cmluZztcblx0Y29uc3RydWN0b3Iob1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgX29Db250cm9sQ29uZmlnPzogdW5rbm93biwgX29TZXR0aW5ncz86IEJ1aWxkaW5nQmxvY2tFeHRyYVNldHRpbmdzKSB7XG5cdFx0T2JqZWN0LmtleXMob1Byb3BzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0Ly8gVGhpcyBuZWVkcyB0byBiZSBjYXN0ZWQgYXMgYW55IHNpbmNlIHdlIGFyZSBhc3NpZ25pbmcgdGhlIHByb3BlcnRpZXMgdG8gdGhlIGluc3RhbmNlIHdpdGhvdXQga25vd2luZyB0aGVpciB0eXBlXG5cdFx0XHR0aGlzW3Byb3BOYW1lIGFzIGtleW9mIHRoaXNdID0gb1Byb3BzW3Byb3BOYW1lXSBhcyBuZXZlcjtcblx0XHR9KTtcblx0fVxuXHRwdWJsaWMgZ2V0VGVtcGxhdGU/KG9Ob2RlPzogRWxlbWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogQ29udmVydCB0aGUgZ2l2ZW4gbG9jYWwgZWxlbWVudCBJRCB0byBhIGdsb2JhbGx5IHVuaXF1ZSBJRCBieSBwcmVmaXhpbmcgd2l0aCB0aGUgQnVpbGRpbmcgQmxvY2sgSUQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzdHJpbmdQYXJ0c1xuXHQgKiBAcmV0dXJucyBFaXRoZXIgdGhlIGdsb2JhbCBJRCBvciB1bmRlZmluZWQgaWYgdGhlIEJ1aWxkaW5nIEJsb2NrIGRvZXNuJ3QgaGF2ZSBhbiBJRFxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUlkKC4uLnN0cmluZ1BhcnRzOiBzdHJpbmdbXSkge1xuXHRcdC8vIElmIHRoZSBjaGlsZCBpbnN0YW5jZSBoYXMgYW4gSUQgcHJvcGVydHkgdXNlIGl0IG90aGVyd2lzZSByZXR1cm4gdW5kZWZpbmVkXG5cdFx0aWYgKHRoaXMuaWQpIHtcblx0XHRcdHJldHVybiBnZW5lcmF0ZShbdGhpcy5pZCwgLi4uc3RyaW5nUGFydHNdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHQvLyBUaGlzIGJsb2NrIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBJIGFtIG5vdCB1c2luZyB0aGVtIGZvciBub3cgLyBuZWVkIHRvIGNoYW5nZSB0aGlzIGJ1dCBzdGlsbCB3YW50IHRvIGtlZXAgdGhlbSBhcm91bmRcblx0cHJvdGVjdGVkIGdldENvbnZlcnRlckNvbnRleHQgPSBmdW5jdGlvbiAoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRjb250ZXh0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdG1TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0XHRtRXh0cmFQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXHQpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gbVNldHRpbmdzLmFwcENvbXBvbmVudDtcblx0XHRjb25zdCBvcmlnaW5hbFZpZXdEYXRhID0gbVNldHRpbmdzLm1vZGVscy52aWV3RGF0YSAmJiBtU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhLmdldERhdGEoKTtcblx0XHRsZXQgdmlld0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBvcmlnaW5hbFZpZXdEYXRhKTtcblx0XHRkZWxldGUgdmlld0RhdGEucmVzb3VyY2VCdW5kbGU7XG5cdFx0dmlld0RhdGEgPSBkZWVwQ2xvbmUodmlld0RhdGEpO1xuXHRcdHZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uID0gbWVyZ2Uodmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24sIG1FeHRyYVBhcmFtcyB8fCB7fSk7XG5cdFx0cmV0dXJuIENvbnZlcnRlckNvbnRleHQuY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvKFxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lLFxuXHRcdFx0bVNldHRpbmdzLm1vZGVscy5tZXRhTW9kZWwsXG5cdFx0XHRvQXBwQ29tcG9uZW50ICYmIG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKSxcblx0XHRcdG1lcmdlLFxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0XHR2aWV3RGF0YVxuXHRcdCk7XG5cdH07XG5cdHB1YmxpYyBnZXRQcm9wZXJ0aWVzKCkge1xuXHRcdGNvbnN0IGFsbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPiA9IHt9O1xuXHRcdGZvciAoY29uc3Qgb0luc3RhbmNlS2V5IGluIHRoaXMpIHtcblx0XHRcdGlmICh0aGlzLmhhc093blByb3BlcnR5KG9JbnN0YW5jZUtleSkpIHtcblx0XHRcdFx0YWxsUHJvcGVydGllc1tvSW5zdGFuY2VLZXldID0gdGhpc1tvSW5zdGFuY2VLZXldIGFzIHVua25vd24gYXMgT2JqZWN0VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBhbGxQcm9wZXJ0aWVzO1xuXHR9XG5cdHN0YXRpYyByZWdpc3RlcigpIHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW5cblx0fVxuXHRzdGF0aWMgdW5yZWdpc3RlcigpIHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW5cblx0fVxuXHRwdWJsaWMgYWRkQ29uZGl0aW9uYWxseShjb25kaXRpb246IGJvb2xlYW4sIHBhcnRUb0FkZDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRyZXR1cm4gcGFydFRvQWRkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9XG5cdH1cblx0cHJvdGVjdGVkIGF0dHIoYXR0cmlidXRlTmFtZTogc3RyaW5nLCB2YWx1ZT86IFhNTFByb2Nlc3NvclR5cGVWYWx1ZSk6ICgpID0+IHN0cmluZyB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWlzVW5kZWZpbmVkRXhwcmVzc2lvbih2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAoKSA9PiB4bWxgJHthdHRyaWJ1dGVOYW1lfT1cIiR7dmFsdWV9XCJgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gKCkgPT4gXCJcIjtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIGV4dGVuZHMgQnVpbGRpbmdCbG9ja0Jhc2Uge1xuXHRyZW5kZXIoY29udGFpbmluZ1ZpZXc6IFZpZXcsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogQ29udHJvbDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbiA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRpc1B1YmxpYz86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGNvbXB1dGVkPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHRiaW5kYWJsZT86IGJvb2xlYW47IC8vIG9ubHkgY29uc2lkZXJlZCBmb3IgcnVudGltZSBidWlsZGluZyBibG9ja3Ncblx0JGtpbmQ/OiBzdHJpbmdbXTtcblx0JFR5cGU/OiBzdHJpbmdbXTtcblx0dmFsaWRhdGU/OiBGdW5jdGlvbjsgLy8gZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gdmFsaWRhdGUgb3IgdHJhbnNmb3JtIHRoZSBnaXZlbiBpbnB1dFxufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGlzUHVibGljPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHRjb21wdXRlZD86IGJvb2xlYW47XG5cdCRUeXBlPzogc3RyaW5nW107XG5cdCRraW5kPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0V2ZW50ID0ge307XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uID0ge1xuXHRpc1B1YmxpYz86IGJvb2xlYW47XG5cdHR5cGU6IHN0cmluZztcblx0c2xvdD86IHN0cmluZztcblx0aXNEZWZhdWx0PzogYm9vbGVhbjtcblxuXHQvLyBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIGJhc2VkIG9uIGFjdHVhbCBub2RlIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBvciBvbmx5IG9uIFhNTCB0aGF0IHdpbGwgYmUgaW50ZXJwcmV0ZWRcblx0aGFzVmlydHVhbE5vZGU/OiBib29sZWFuO1xuXHRwcm9jZXNzQWdncmVnYXRpb25zPzogRnVuY3Rpb247XG59O1xudHlwZSBDb21tb25CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiA9IHtcblx0bmFtZXNwYWNlOiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0eG1sVGFnPzogc3RyaW5nO1xuXHRmcmFnbWVudD86IHN0cmluZztcblx0cHVibGljTmFtZXNwYWNlPzogc3RyaW5nO1xuXHRkZXNpZ250aW1lPzogc3RyaW5nO1xuXHRpc1J1bnRpbWU/OiBib29sZWFuO1xuXHRpc09wZW4/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjIgPSBDb21tb25CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiAmXG5cdChuZXcgKCkgPT4gQnVpbGRpbmdCbG9ja0Jhc2UpICZcblx0dHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlICYge1xuXHRcdGFwaVZlcnNpb246IDI7XG5cdFx0Z2V0VGVtcGxhdGU/OiBGdW5jdGlvbjtcblx0XHRtZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xuXHR9O1xuXG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxID0gQ29tbW9uQnVpbGRpbmdCbG9ja0RlZmluaXRpb24gJiB7XG5cdG5hbWU6IHN0cmluZztcblx0YXBpVmVyc2lvbj86IDE7XG5cdGNyZWF0ZT86IEZ1bmN0aW9uO1xuXHRnZXRUZW1wbGF0ZT86IEZ1bmN0aW9uO1xuXHRtZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uID0gQnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMiB8IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjE7XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSB7XG5cdGV2ZW50czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0V2ZW50Pjtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj47XG5cdHN0ZXJlb3R5cGU/OiBzdHJpbmc7XG5cdGRlc2lnbnRpbWU/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBlbnN1cmVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0YXJnZXQ6IFBhcnRpYWw8QnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMj4pOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRpZiAoIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShcIm1ldGFkYXRhXCIpKSB7XG5cdFx0dGFyZ2V0Lm1ldGFkYXRhID0gZGVlcENsb25lKFxuXHRcdFx0dGFyZ2V0Lm1ldGFkYXRhIHx8IHtcblx0XHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uczoge30sXG5cdFx0XHRcdGV2ZW50czoge30sXG5cdFx0XHRcdHN0ZXJlb3R5cGU6IFwieG1sbWFjcm9cIixcblx0XHRcdFx0ZGVzaWdudGltZTogXCJcIlxuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHRhcmdldC5tZXRhZGF0YSBhcyBCdWlsZGluZ0Jsb2NrTWV0YWRhdGE7XG59O1xuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0eSBzaGFsbCBiZSBkZWNsYXJlZCBhcyBhbiB4bWwgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgZnJvbSB0aGUgb3V0c2lkZSBvZiB0aGUgYnVpbGRpbmcgYmxvY2suXG4gKlxuICogSWYgZGVmaW5pbmcgYSBydW50aW1lIEJ1aWxkaW5nIEJsb2NrLCBwbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSB0aGUgY29ycmVjdCB0eXBpbmdzOiBEZXBlbmRpbmcgb24gaXRzIG1ldGFkYXRhLFxuICogYSBwcm9wZXJ0eSBjYW4gZWl0aGVyIGJlIGEge0BsaW5rIHNhcC51aS5tb2RlbC5Db250ZXh0fSAoPGNvZGU+dHlwZTogJ3NhcC51aS5tb2RlbC5Db250ZXh0JzwvY29kZT4pLFxuICogYSBjb25zdGFudCAoPGNvZGU+YmluZGFibGU6IGZhbHNlPC9jb2RlPiksIG9yIGEge0BsaW5rIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbn0gKDxjb2RlPmJpbmRhYmxlOiB0cnVlPC9jb2RlPikuXG4gKlxuICogQHBhcmFtIGF0dHJpYnV0ZURlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhtbEF0dHJpYnV0ZShhdHRyaWJ1dGVEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogQnVpbGRpbmdCbG9ja0Jhc2UsIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBTeW1ib2wsIHByb3BlcnR5RGVzY3JpcHRvcjogQWNjZXNzb3JEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQuY29uc3RydWN0b3IpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBubyBkZWZhdWx0VmFsdWUgd2UgY2FuIHRha2UgdGhlIHZhbHVlIGZyb20gdGhlIGluaXRpYWxpemVyIChuYXR1cmFsIHdheSBvZiBkZWZpbmluZyBkZWZhdWx0cylcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZGVmYXVsdFZhbHVlID0gcHJvcGVydHlEZXNjcmlwdG9yLmluaXRpYWxpemVyPy4oKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci5pbml0aWFsaXplcjtcblx0XHRpZiAobWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIE5lZWRlZCB0byBtYWtlIFRTIGhhcHB5IHdpdGggdGhvc2UgZGVjb3JhdG9ycztcbn1cbmV4cG9ydCBmdW5jdGlvbiBibG9ja0F0dHJpYnV0ZShhdHRyaWJ1dGVEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sQXR0cmlidXRlKGF0dHJpYnV0ZURlZmluaXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24geG1sRXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogQnVpbGRpbmdCbG9ja0Jhc2UsIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBTeW1ib2wsIHByb3BlcnR5RGVzY3JpcHRvcjogQWNjZXNzb3JEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQuY29uc3RydWN0b3IpO1xuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3IuaW5pdGlhbGl6ZXI7XG5cdFx0aWYgKG1ldGFkYXRhLmV2ZW50c1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7IHR5cGU6IFwiRnVuY3Rpb25cIiB9O1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gTmVlZGVkIHRvIG1ha2UgVFMgaGFwcHkgd2l0aCB0aG9zZSBkZWNvcmF0b3JzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrRXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sRXZlbnQoKTtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIHByb3BlcnR5IHNoYWxsIGJlIGRlY2xhcmVkIGFzIGFuIHhtbCBhZ2dyZWdhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZyb20gdGhlIG91dHNpZGUgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhtbEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IEJ1aWxkaW5nQmxvY2tCYXNlLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IEFjY2Vzc29yRGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLmluaXRpYWxpemVyO1xuXHRcdGlmIChtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG1ldGFkYXRhLmFnZ3JlZ2F0aW9uc1twcm9wZXJ0eUtleV0gPSBhZ2dyZWdhdGlvbkRlZmluaXRpb247XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrQWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sQWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uKTtcbn1cbmNvbnN0IFJVTlRJTUVfQkxPQ0tTOiBSZWNvcmQ8c3RyaW5nLCBSdW50aW1lQnVpbGRpbmdCbG9jayAmIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjI+ID0ge307XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQnVpbGRpbmdCbG9jayhvQnVpbGRpbmdCbG9ja0RlZmluaXRpb246IENvbW1vbkJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogQ2xhc3NEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKGNsYXNzRGVmaW5pdGlvbjogUGFydGlhbDxCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYyPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEoY2xhc3NEZWZpbml0aW9uKTtcblx0XHRtZXRhZGF0YS5kZXNpZ250aW1lID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmRlc2lnbnRpbWU7XG5cdFx0Y2xhc3NEZWZpbml0aW9uLnhtbFRhZyA9IG9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5uYW1lc3BhY2UgPSBvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UgPSBvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5mcmFnbWVudCA9IG9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5mcmFnbWVudDtcblx0XHRjbGFzc0RlZmluaXRpb24uaXNPcGVuID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzT3Blbjtcblx0XHRjbGFzc0RlZmluaXRpb24uaXNSdW50aW1lID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzUnVudGltZTtcblx0XHRjbGFzc0RlZmluaXRpb24uYXBpVmVyc2lvbiA9IDI7XG5cdFx0aWYgKGNsYXNzRGVmaW5pdGlvbi5pc1J1bnRpbWUgPT09IHRydWUpIHtcblx0XHRcdGNsYXNzRGVmaW5pdGlvbi5wcm90b3R5cGUuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbiAob05vZGU6IEVsZW1lbnQpIHtcblx0XHRcdFx0Y29uc3QgY2xhc3NOYW1lID0gYCR7b0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gO1xuXHRcdFx0XHRjb25zdCBleHRyYVByb3BzID0gW107XG5cdFx0XHRcdC8vIEZ1bmN0aW9uIGFyZSBkZWZpbmVkIGFzIHN0cmluZyBidXQgbmVlZCB0byBiZSByZXNvbHZlZCBieSBVSTUsIGFzIHN1Y2ggd2Ugc3RvcmUgdGhlbSBpbiBhbiBgZXZlbnRgIHByb3BlcnR5IGFuZCB3aWxsIHJlZGlzcGF0Y2ggdGhlbSBsYXRlclxuXHRcdFx0XHRjb25zdCBmdW5jdGlvbkhvbGRlckRlZmluaXRpb24gPSBbXTtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc0Fzc2lnbmVkVG9GdW5jdGlvbiA9IFtdO1xuXHRcdFx0XHRjb25zdCBmdW5jdGlvblN0cmluZ0luT3JkZXIgPSBbXTtcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0aWVzS2V5IGluIG1ldGFkYXRhLnByb3BlcnRpZXMpIHtcblx0XHRcdFx0XHRsZXQgcHJvcGVydHlWYWx1ZSA9IHRoaXNbcHJvcGVydGllc0tleV07XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0eVZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRpZiAoaXNDb250ZXh0KHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnRpZXNLZXldLnR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdFx0XHRmdW5jdGlvbkhvbGRlckRlZmluaXRpb24ucHVzaChwcm9wZXJ0eVZhbHVlKTtcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25TdHJpbmdJbk9yZGVyLnB1c2gocHJvcGVydHlWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnRpZXNBc3NpZ25lZFRvRnVuY3Rpb24ucHVzaChwcm9wZXJ0aWVzS2V5KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGV4dHJhUHJvcHMucHVzaCh4bWxgZmVCQjoke3Byb3BlcnRpZXNLZXl9PVwiJHtwcm9wZXJ0eVZhbHVlIGFzIFhNTFByb2Nlc3NvclR5cGVWYWx1ZX1cImApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZnVuY3Rpb25Ib2xkZXJEZWZpbml0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRleHRyYVByb3BzLnB1c2goeG1sYGZ1bmN0aW9uSG9sZGVyPVwiJHtmdW5jdGlvbkhvbGRlckRlZmluaXRpb24uam9pbihcIjtcIil9XCJgKTtcblx0XHRcdFx0XHRleHRyYVByb3BzLnB1c2goeG1sYGZlQkI6ZnVuY3Rpb25TdHJpbmdJbk9yZGVyPVwiJHtmdW5jdGlvblN0cmluZ0luT3JkZXIuam9pbihcIixcIil9XCJgKTtcblx0XHRcdFx0XHRleHRyYVByb3BzLnB1c2goeG1sYGZlQkI6cHJvcGVydGllc0Fzc2lnbmVkVG9GdW5jdGlvbj1cIiR7cHJvcGVydGllc0Fzc2lnbmVkVG9GdW5jdGlvbi5qb2luKFwiLFwiKX1cImApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgZXZlbnRzS2V5IGluIG1ldGFkYXRhLmV2ZW50cykge1xuXHRcdFx0XHRcdGNvbnN0IGV2ZW50c1ZhbHVlID0gdGhpc1tldmVudHNLZXldO1xuXHRcdFx0XHRcdGlmIChldmVudHNWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRleHRyYVByb3BzLnB1c2goeG1sYGZlQkI6JHtldmVudHNLZXl9PVwiJHtldmVudHNWYWx1ZSBhcyBYTUxQcm9jZXNzb3JUeXBlVmFsdWV9XCJgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gY29yZTpyZXF1aXJlIG5lZWQgdG8gYmUgZGVmaW5lZCBvbiB0aGUgbm9kZSBpdHNlbGYgdG8gYmUgcGlja2VkIHVwIGR1ZSB0byB0aGUgdGVtcGxhdGluZyBzdGVwXG5cdFx0XHRcdGNvbnN0IGNvcmVSZXF1aXJlID0gb05vZGUuZ2V0QXR0cmlidXRlKFwiY29yZTpyZXF1aXJlXCIpIHx8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKGNvcmVSZXF1aXJlKSB7XG5cdFx0XHRcdFx0ZXh0cmFQcm9wcy5wdXNoKHhtbGBjb3JlOnJlcXVpcmU9XCIke2NvcmVSZXF1aXJlfVwiYCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHhtbGA8ZmVCQjpCdWlsZGluZ0Jsb2NrRnJhZ21lbnRcblx0XHRcdFx0XHR4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIlxuXHRcdFx0XHRcdHhtbG5zOmZlQkI9XCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrc1wiXG5cdFx0XHRcdFx0ZnJhZ21lbnROYW1lPVwiJHtjbGFzc05hbWV9XCJcblxuXHRcdFx0XHRcdGlkPVwie3RoaXM+aWR9XCJcblx0XHRcdFx0XHR0eXBlPVwiRkVfQ09NUE9ORU5UU1wiXG5cdFx0XHRcdFx0JHtleHRyYVByb3BzfVxuXHRcdFx0XHQ+XG5cdFx0XHRcdDwvZmVCQjpCdWlsZGluZ0Jsb2NrRnJhZ21lbnQ+YDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y2xhc3NEZWZpbml0aW9uLnJlZ2lzdGVyID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGNsYXNzRGVmaW5pdGlvbiBhcyBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYyKTtcblx0XHRcdGlmIChjbGFzc0RlZmluaXRpb24uaXNSdW50aW1lID09PSB0cnVlKSB7XG5cdFx0XHRcdFJVTlRJTUVfQkxPQ0tTW2Ake29CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2V9LiR7b0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YF0gPVxuXHRcdFx0XHRcdGNsYXNzRGVmaW5pdGlvbiBhcyBSdW50aW1lQnVpbGRpbmdCbG9jayAmIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjI7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjbGFzc0RlZmluaXRpb24udW5yZWdpc3RlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgY2xhc3NEZWZpbml0aW9uLm5hbWVzcGFjZSwgY2xhc3NEZWZpbml0aW9uLm5hbWUpO1xuXHRcdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBjbGFzc0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlLCBjbGFzc0RlZmluaXRpb24ubmFtZSk7XG5cdFx0fTtcblx0fTtcbn1cbnR5cGUgRnJhZ21lbnRDdXN0b21EYXRhID0ge1xuXHRtUHJvcGVydGllczoge1xuXHRcdHZhbHVlOiB7XG5cdFx0XHRcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzXCI/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHRcdH07XG5cdH07XG59O1xudHlwZSBGRUNvbXBvbmVudEZyYWdtZW50U2V0dGluZ3MgPSB7XG5cdGZyYWdtZW50TmFtZTogc3RyaW5nO1xuXHRmcmFnbWVudENvbnRlbnQ/OiBSdW50aW1lQnVpbGRpbmdCbG9jayAmIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjI7XG5cdGNvbnRhaW5pbmdWaWV3OiBWaWV3O1xuXHRjdXN0b21EYXRhPzogRnJhZ21lbnRDdXN0b21EYXRhW107XG5cdGZ1bmN0aW9uSG9sZGVyPzogRnVuY3Rpb25XaXRoSGFuZGxlcltdW107XG59O1xuXG50eXBlIEZ1bmN0aW9uV2l0aEhhbmRsZXIgPSBGdW5jdGlvbiAmIHtcblx0X3NhcHVpX2hhbmRsZXJOYW1lPzogc3RyaW5nO1xufTtcbnR5cGUgRnJhZ21lbnRXaXRoSW50ZXJuYWxzID0ge1xuXHRfYkFzeW5jOiBib29sZWFuO1xuXHRfYUNvbnRlbnQ6IENvbnRyb2wgfCBDb250cm9sW107XG59O1xuQnVpbGRpbmdCbG9ja0ZyYWdtZW50LnJlZ2lzdGVyVHlwZShcIkZFX0NPTVBPTkVOVFNcIiwge1xuXHRsb2FkOiBhc3luYyBmdW5jdGlvbiAobVNldHRpbmdzOiBGRUNvbXBvbmVudEZyYWdtZW50U2V0dGluZ3MpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFJVTlRJTUVfQkxPQ0tTW21TZXR0aW5ncy5mcmFnbWVudE5hbWVdKTtcblx0fSxcblx0aW5pdDogZnVuY3Rpb24gKHRoaXM6IEZyYWdtZW50V2l0aEludGVybmFscywgbVNldHRpbmdzOiBGRUNvbXBvbmVudEZyYWdtZW50U2V0dGluZ3MpIHtcblx0XHRsZXQgTXlDbGFzcyA9IG1TZXR0aW5ncy5mcmFnbWVudENvbnRlbnQ7XG5cdFx0aWYgKCFNeUNsYXNzKSB7XG5cdFx0XHQvLyBJbiBzb21lIGNhc2Ugd2UgbWlnaHQgaGF2ZSBiZWVuIGNhbGxlZCBoZXJlIHN5bmNocm9ub3VzbHkgKHVuc3Rhc2ggY2FzZSBmb3IgaW5zdGFuY2UpLCB3aGljaCBtZWFucyB3ZSBkaWRuJ3QgZ28gdGhyb3VnaCB0aGUgbG9hZCBmdW5jdGlvblxuXHRcdFx0TXlDbGFzcyA9IFJVTlRJTUVfQkxPQ0tTW21TZXR0aW5ncy5mcmFnbWVudE5hbWVdO1xuXHRcdH1cblx0XHRjb25zdCBjbGFzc1NldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdGNvbnN0IGZlQ3VzdG9tRGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IG1TZXR0aW5ncz8uY3VzdG9tRGF0YT8uWzBdPy5tUHJvcGVydGllcz8udmFsdWU/LltcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzXCJdIHx8IHt9O1xuXHRcdGRlbGV0ZSBtU2V0dGluZ3MuY3VzdG9tRGF0YTtcblx0XHRjb25zdCBmdW5jdGlvbkhvbGRlcjogRnVuY3Rpb25XaXRoSGFuZGxlcltdW10gPSBtU2V0dGluZ3MuZnVuY3Rpb25Ib2xkZXIgPz8gW107XG5cdFx0ZGVsZXRlIG1TZXR0aW5ncy5mdW5jdGlvbkhvbGRlcjtcblx0XHRjb25zdCBwYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG1TZXR0aW5ncy5jb250YWluaW5nVmlldykgYXMgVGVtcGxhdGVDb21wb25lbnQ7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG1TZXR0aW5ncy5jb250YWluaW5nVmlldyk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gYXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHBhZ2VNb2RlbCA9IHBhZ2VDb21wb25lbnQuZ2V0TW9kZWwoXCJfcGFnZU1vZGVsXCIpO1xuXG5cdFx0Y29uc3QgZnVuY3Rpb25TdHJpbmdJbk9yZGVyOiBzdHJpbmdbXSA9IGZlQ3VzdG9tRGF0YS5mdW5jdGlvblN0cmluZ0luT3JkZXI/LnNwbGl0KFwiLFwiKTtcblx0XHRjb25zdCBwcm9wZXJ0aWVzQXNzaWduZWRUb0Z1bmN0aW9uOiBzdHJpbmdbXSA9IGZlQ3VzdG9tRGF0YS5wcm9wZXJ0aWVzQXNzaWduZWRUb0Z1bmN0aW9uPy5zcGxpdChcIixcIik7XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gTXlDbGFzcy5tZXRhZGF0YS5wcm9wZXJ0aWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU1ldGFkYXRhID0gTXlDbGFzcy5tZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRjb25zdCBwYWdlTW9kZWxDb250ZXh0ID0gcGFnZU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGZlQ3VzdG9tRGF0YVtwcm9wZXJ0eU5hbWVdKTtcblxuXHRcdFx0aWYgKHBhZ2VNb2RlbENvbnRleHQgPT09IG51bGwpIHtcblx0XHRcdFx0Ly8gdmFsdWUgY2Fubm90IGJlIHJlc29sdmVkLCBzbyBpdCBpcyBlaXRoZXIgYSBydW50aW1lIGJpbmRpbmcgb3IgYSBjb25zdGFudFxuXHRcdFx0XHRsZXQgdlZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXI+ID0gZmVDdXN0b21EYXRhW3Byb3BlcnR5TmFtZV07XG5cblx0XHRcdFx0aWYgKHR5cGVvZiB2VmFsdWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlNZXRhZGF0YS5iaW5kYWJsZSAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Ly8gcnVudGltZSBiaW5kaW5ncyBhcmUgbm90IGFsbG93ZWQsIHNvIGNvbnZlcnQgc3RyaW5ncyBpbnRvIGFjdHVhbCBwcmltaXRpdmUgdHlwZXNcblx0XHRcdFx0XHRcdHN3aXRjaCAocHJvcGVydHlNZXRhZGF0YS50eXBlKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdFx0XHRcdFx0dlZhbHVlID0gdlZhbHVlID09PSBcInRydWVcIjtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0XHRcdFx0XHRcdHZWYWx1ZSA9IE51bWJlcih2VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBydW50aW1lIGJpbmRpbmdzIGFyZSBhbGxvd2VkLCBzbyByZXNvbHZlIHRoZSB2YWx1ZXMgYXMgQmluZGluZ1Rvb2xraXQgZXhwcmVzc2lvbnNcblx0XHRcdFx0XHRcdHZWYWx1ZSA9IHJlc29sdmVCaW5kaW5nU3RyaW5nKHZWYWx1ZSwgcHJvcGVydHlNZXRhZGF0YS50eXBlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHlNZXRhZGF0YS50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRjb25zdCBmdW5jdGlvbkluZGV4ID0gcHJvcGVydGllc0Fzc2lnbmVkVG9GdW5jdGlvbi5pbmRleE9mKHByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0Y29uc3QgZnVuY3Rpb25TdHJpbmcgPSBmdW5jdGlvblN0cmluZ0luT3JkZXJbZnVuY3Rpb25JbmRleF07XG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0RnVuY3Rpb24gPSBmdW5jdGlvbkhvbGRlcj8uZmluZCgoZnVuY3Rpb25EZWYpID0+IGZ1bmN0aW9uRGVmWzBdPy5fc2FwdWlfaGFuZGxlck5hbWUgPT09IGZ1bmN0aW9uU3RyaW5nKTtcblx0XHRcdFx0XHQvLyBXZSB1c2UgdGhlIF9zYXB1aV9oYW5kbGVyTmFtZSB0byBpZGVudGlmeSB3aGljaCBmdW5jdGlvbiBpcyB0aGUgb25lIHdlIHdhbnQgdG8gYmluZCBoZXJlXG5cdFx0XHRcdFx0aWYgKHRhcmdldEZ1bmN0aW9uICYmIHRhcmdldEZ1bmN0aW9uLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdHZWYWx1ZSA9IHRhcmdldEZ1bmN0aW9uWzBdLmJpbmQodGFyZ2V0RnVuY3Rpb25bMV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNsYXNzU2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IHZWYWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAocGFnZU1vZGVsQ29udGV4dC5nZXRPYmplY3QoKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIGdldCB2YWx1ZSBmcm9tIHBhZ2UgbW9kZWxcblx0XHRcdFx0Y2xhc3NTZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gcGFnZU1vZGVsQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGJpbmQgdG8gbWV0YW1vZGVsXG5cdFx0XHRcdGNsYXNzU2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChmZUN1c3RvbURhdGFbcHJvcGVydHlOYW1lXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZXZlbnROYW1lIGluIE15Q2xhc3MubWV0YWRhdGEuZXZlbnRzKSB7XG5cdFx0XHRpZiAoZmVDdXN0b21EYXRhW2V2ZW50TmFtZV0gIT09IHVuZGVmaW5lZCAmJiBmZUN1c3RvbURhdGFbZXZlbnROYW1lXS5zdGFydHNXaXRoKFwiLlwiKSkge1xuXHRcdFx0XHRjbGFzc1NldHRpbmdzW2V2ZW50TmFtZV0gPSBPYmplY3RQYXRoLmdldChmZUN1c3RvbURhdGFbZXZlbnROYW1lXS5zdWJzdHJpbmcoMSksIG1TZXR0aW5ncy5jb250YWluaW5nVmlldy5nZXRDb250cm9sbGVyKCkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xhc3NTZXR0aW5nc1tldmVudE5hbWVdID0gXCJcIjsgLy8gRm9yIG5vdywgbWlnaHQgbmVlZCB0byByZXNvbHZlIG1vcmUgc3R1ZmZcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIChNYW5hZ2VkT2JqZWN0IGFzIHVua25vd24gYXMgTWFuYWdlZE9iamVjdEV4KS5ydW5XaXRoUHJlcHJvY2Vzc29ycyhcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0Y29uc3QgcmVuZGVyZWRDb250cm9sID0gKFxuXHRcdFx0XHRcdG5ldyBNeUNsYXNzIShcblx0XHRcdFx0XHRcdGNsYXNzU2V0dGluZ3MsXG5cdFx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHRcdHsgaXNSdW50aW1lSW5zdGFudGlhdGlvbjogdHJ1ZSwgaXNQdWJsaWM6IGZhbHNlLCBhcHBDb21wb25lbnQ6IGFwcENvbXBvbmVudCB9XG5cdFx0XHRcdFx0KSBhcyBSdW50aW1lQnVpbGRpbmdCbG9ja1xuXHRcdFx0XHQpLnJlbmRlcihtU2V0dGluZ3MuY29udGFpbmluZ1ZpZXcsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdGlmICghdGhpcy5fYkFzeW5jKSB7XG5cdFx0XHRcdFx0dGhpcy5fYUNvbnRlbnQgPSByZW5kZXJlZENvbnRyb2w7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlbmRlcmVkQ29udHJvbDtcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGlkOiBmdW5jdGlvbiAoc0lkOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm4gbVNldHRpbmdzLmNvbnRhaW5pbmdWaWV3LmNyZWF0ZUlkKHNJZCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldHRpbmdzOiBmdW5jdGlvbiAoY29udHJvbFNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBNYW5hZ2VkT2JqZWN0Pikge1xuXHRcdFx0XHRcdGNvbnN0IGFsbEFzc29jaWF0aW9ucyA9IHRoaXMuZ2V0TWV0YWRhdGEoKS5nZXRBc3NvY2lhdGlvbnMoKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGFzc29jaWF0aW9uRGV0YWlsTmFtZSBvZiBPYmplY3Qua2V5cyhhbGxBc3NvY2lhdGlvbnMpKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhc3NvY2lhdGlvbkRldGFpbE5hbWUpICYmXG5cdFx0XHRcdFx0XHRcdCEoY29udHJvbFNldHRpbmdzW2Fzc29jaWF0aW9uRGV0YWlsTmFtZV0gaW5zdGFuY2VvZiBNYW5hZ2VkT2JqZWN0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xTZXR0aW5nc1thc3NvY2lhdGlvbkRldGFpbE5hbWVdID0gbVNldHRpbmdzLmNvbnRhaW5pbmdWaWV3LmNyZWF0ZUlkKFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRyb2xTZXR0aW5nc1thc3NvY2lhdGlvbkRldGFpbE5hbWVdIGFzIHN0cmluZ1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gY29udHJvbFNldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7RUFtQ0E7QUFDQTtBQUNBO0VBRkEsSUFHYUEsaUJBQWlCO0lBRzdCLDJCQUFZQyxNQUErQixFQUFFQyxlQUF5QixFQUFFQyxVQUF1QyxFQUFFO01BQUE7TUFBQSxLQUZ2R0MsUUFBUSxHQUFHLEtBQUs7TUFBQSxLQXdCaEJDLG1CQUFtQixHQUFHLFVBQy9CQyxtQkFBd0MsRUFDeENDLFdBQStCLEVBQy9CQyxTQUFvQyxFQUNwQ0MsWUFBc0MsRUFDckM7UUFDRCxJQUFNQyxhQUFhLEdBQUdGLFNBQVMsQ0FBQ0csWUFBWTtRQUM1QyxJQUFNQyxnQkFBZ0IsR0FBR0osU0FBUyxDQUFDSyxNQUFNLENBQUNDLFFBQVEsSUFBSU4sU0FBUyxDQUFDSyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0MsT0FBTyxFQUFFO1FB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
|