@sapui5/sap.fe.core 1.99.0 → 1.101.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -4
- package/src/sap/fe/core/.library +2 -3
- package/src/sap/fe/core/AnnotationHelper.js +43 -92
- package/src/sap/fe/core/AnnotationHelper.ts +43 -107
- package/src/sap/fe/core/AppComponent.js +381 -399
- package/src/sap/fe/core/AppComponent.ts +397 -0
- package/src/sap/fe/core/AppStateHandler.js +131 -162
- package/src/sap/fe/core/AppStateHandler.ts +2 -2
- package/src/sap/fe/core/BaseController.js +82 -58
- package/src/sap/fe/core/BaseController.ts +67 -0
- package/src/sap/fe/core/CommonUtils.js +179 -31
- package/src/sap/fe/core/CommonUtils.ts +295 -125
- package/src/sap/fe/core/ExtensionAPI.js +279 -274
- package/src/sap/fe/core/ExtensionAPI.ts +242 -0
- package/src/sap/fe/core/PageController.js +158 -29
- package/src/sap/fe/core/PageController.ts +65 -37
- package/src/sap/fe/core/RouterProxy.js +700 -750
- package/src/sap/fe/core/RouterProxy.ts +47 -31
- package/src/sap/fe/core/Synchronization.js +21 -31
- package/src/sap/fe/core/TemplateComponent.js +193 -118
- package/src/sap/fe/core/TemplateComponent.ts +104 -109
- package/src/sap/fe/core/TemplateModel.js +24 -44
- package/src/sap/fe/core/TemplateModel.ts +3 -3
- package/src/sap/fe/core/TransactionHelper.js +1368 -1369
- package/src/sap/fe/core/TransactionHelper.ts +201 -171
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +406 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +362 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +146 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +129 -0
- package/src/sap/fe/core/actions/collaboration/Manage.js +264 -0
- package/src/sap/fe/core/actions/collaboration/Manage.ts +246 -0
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +100 -0
- package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
- package/src/sap/fe/core/actions/draft.js +324 -220
- package/src/sap/fe/core/actions/draft.ts +209 -133
- package/src/sap/fe/core/actions/messageHandling.js +79 -48
- package/src/sap/fe/core/actions/messageHandling.ts +113 -83
- package/src/sap/fe/core/actions/operations.js +37 -18
- package/src/sap/fe/core/actions/operations.ts +51 -20
- package/src/sap/fe/core/actions/sticky.js +17 -4
- package/src/sap/fe/core/actions/sticky.ts +21 -4
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +707 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +628 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1854 -1669
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +1792 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +60 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +716 -779
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +785 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +810 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1056 -1005
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1001 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +498 -532
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +13 -12
- package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +155 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +221 -244
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +215 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +312 -345
- package/src/sap/fe/core/controllerextensions/PageReady.ts +57 -53
- package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
- package/src/sap/fe/core/controllerextensions/Paginator.ts +169 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +149 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
- package/src/sap/fe/core/controllerextensions/Routing.ts +131 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
- package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Share.js +230 -268
- package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +603 -644
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +68 -68
- package/src/sap/fe/core/controllerextensions/ViewState.js +774 -806
- package/src/sap/fe/core/controllerextensions/ViewState.ts +796 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
- package/src/sap/fe/core/controls/Any.js +28 -0
- package/src/sap/fe/core/controls/Any.ts +30 -0
- package/src/sap/fe/core/controls/CommandExecution.js +92 -68
- package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +165 -79
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +74 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +366 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +278 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +167 -125
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +116 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +44 -5
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +163 -122
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +155 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +212 -141
- package/src/sap/fe/core/controls/FieldWrapper.ts +104 -0
- package/src/sap/fe/core/controls/FileWrapper.js +313 -0
- package/src/sap/fe/core/controls/FileWrapper.ts +169 -0
- package/src/sap/fe/core/controls/FilterBar.js +197 -159
- package/src/sap/fe/core/controls/FilterBar.ts +148 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +100 -39
- package/src/sap/fe/core/controls/FormElementWrapper.ts +37 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +147 -115
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +102 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +300 -265
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +252 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +185 -140
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +37 -42
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +75 -74
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +71 -0
- package/src/sap/fe/core/converters/ConverterContext.js +348 -379
- package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
- package/src/sap/fe/core/converters/ManifestSettings.js +13 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +17 -2
- package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
- package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
- package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +26 -13
- package/src/sap/fe/core/converters/annotations/DataField.ts +40 -17
- package/src/sap/fe/core/converters/controls/Common/Action.js +10 -10
- package/src/sap/fe/core/converters/controls/Common/Action.ts +20 -19
- package/src/sap/fe/core/converters/controls/Common/Chart.js +8 -8
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +12 -11
- package/src/sap/fe/core/converters/controls/Common/Form.js +6 -6
- package/src/sap/fe/core/converters/controls/Common/Form.ts +7 -3
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +326 -86
- package/src/sap/fe/core/converters/controls/Common/Table.ts +384 -167
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +120 -55
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +158 -98
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +206 -223
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +263 -287
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +5 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +4 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
- package/src/sap/fe/core/converters/helpers/Key.js +42 -57
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +51 -27
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +69 -43
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +42 -25
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +91 -65
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +11 -9
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +8 -8
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
- package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
- package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
- package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
- package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
- package/src/sap/fe/core/fpm/Component.js +80 -55
- package/src/sap/fe/core/fpm/Component.ts +43 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
- package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
- package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +307 -166
- package/src/sap/fe/core/helpers/ClassSupport.ts +348 -155
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +735 -684
- package/src/sap/fe/core/helpers/MassEditHelper.ts +803 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +53 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +46 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
- package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +7 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +7 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +0 -4
- package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
- package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
- package/src/sap/fe/core/library.js +425 -451
- package/src/sap/fe/core/library.support.js +22 -33
- package/src/sap/fe/core/library.support.ts +23 -0
- package/src/sap/fe/core/library.ts +420 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -4
- package/src/sap/fe/core/messagebundle.properties +45 -13
- package/src/sap/fe/core/messagebundle_ar.properties +29 -7
- package/src/sap/fe/core/messagebundle_bg.properties +29 -7
- package/src/sap/fe/core/messagebundle_ca.properties +29 -7
- package/src/sap/fe/core/messagebundle_cs.properties +29 -7
- package/src/sap/fe/core/messagebundle_cy.properties +29 -7
- package/src/sap/fe/core/messagebundle_da.properties +29 -7
- package/src/sap/fe/core/messagebundle_de.properties +29 -7
- package/src/sap/fe/core/messagebundle_el.properties +29 -7
- package/src/sap/fe/core/messagebundle_en.properties +29 -7
- package/src/sap/fe/core/messagebundle_en_GB.properties +29 -7
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +29 -7
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +29 -7
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +29 -7
- package/src/sap/fe/core/messagebundle_es.properties +29 -7
- package/src/sap/fe/core/messagebundle_es_MX.properties +29 -7
- package/src/sap/fe/core/messagebundle_et.properties +29 -7
- package/src/sap/fe/core/messagebundle_fi.properties +30 -8
- package/src/sap/fe/core/messagebundle_fr.properties +31 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +31 -9
- package/src/sap/fe/core/messagebundle_hi.properties +29 -7
- package/src/sap/fe/core/messagebundle_hr.properties +29 -7
- package/src/sap/fe/core/messagebundle_hu.properties +29 -7
- package/src/sap/fe/core/messagebundle_id.properties +29 -7
- package/src/sap/fe/core/messagebundle_it.properties +29 -7
- package/src/sap/fe/core/messagebundle_iw.properties +29 -7
- package/src/sap/fe/core/messagebundle_ja.properties +28 -6
- package/src/sap/fe/core/messagebundle_kk.properties +29 -7
- package/src/sap/fe/core/messagebundle_ko.properties +29 -7
- package/src/sap/fe/core/messagebundle_lt.properties +29 -7
- package/src/sap/fe/core/messagebundle_lv.properties +30 -8
- package/src/sap/fe/core/messagebundle_ms.properties +29 -7
- package/src/sap/fe/core/messagebundle_nl.properties +29 -7
- package/src/sap/fe/core/messagebundle_no.properties +29 -7
- package/src/sap/fe/core/messagebundle_pl.properties +29 -7
- package/src/sap/fe/core/messagebundle_pt.properties +30 -8
- package/src/sap/fe/core/messagebundle_pt_PT.properties +29 -7
- package/src/sap/fe/core/messagebundle_ro.properties +29 -7
- package/src/sap/fe/core/messagebundle_ru.properties +29 -7
- package/src/sap/fe/core/messagebundle_sh.properties +29 -7
- package/src/sap/fe/core/messagebundle_sk.properties +29 -7
- package/src/sap/fe/core/messagebundle_sl.properties +29 -7
- package/src/sap/fe/core/messagebundle_sv.properties +30 -8
- package/src/sap/fe/core/messagebundle_th.properties +28 -6
- package/src/sap/fe/core/messagebundle_tr.properties +32 -10
- package/src/sap/fe/core/messagebundle_uk.properties +29 -7
- package/src/sap/fe/core/messagebundle_vi.properties +29 -7
- package/src/sap/fe/core/messagebundle_zh_CN.properties +29 -7
- package/src/sap/fe/core/messagebundle_zh_TW.properties +29 -7
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +47 -73
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +158 -196
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +5 -6
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +70 -96
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
- package/src/sap/fe/core/services/NavigationServiceFactory.js +287 -342
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +11 -14
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +70 -105
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +6 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.js +796 -820
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +62 -53
- package/src/sap/fe/core/services/ShellServicesFactory.js +694 -741
- package/src/sap/fe/core/services/ShellServicesFactory.ts +33 -33
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +570 -595
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +23 -4
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +357 -389
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +25 -29
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +7 -4
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +1 -4
- package/src/sap/fe/core/support/Diagnostics.js +36 -48
- package/src/sap/fe/core/templating/DataModelPathHelper.js +91 -90
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +126 -123
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +26 -5
- package/src/sap/fe/core/templating/FilterHelper.js +25 -32
- package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
- package/src/sap/fe/core/templating/PropertyHelper.js +16 -2
- package/src/sap/fe/core/templating/PropertyHelper.ts +31 -24
- package/src/sap/fe/core/templating/UIFormatters.js +150 -44
- package/src/sap/fe/core/templating/UIFormatters.ts +165 -67
- package/src/sap/fe/core/type/Email.js +26 -8
- package/src/sap/fe/core/type/Email.ts +8 -7
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -75
|
@@ -10,12 +10,6 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
10
10
|
var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
|
|
11
11
|
var convertTypes = MetaModelConverter.convertTypes;
|
|
12
12
|
|
|
13
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
14
|
-
|
|
15
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
16
|
-
|
|
17
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
18
|
-
|
|
19
13
|
/**
|
|
20
14
|
* Checks whether an object is an annotation term.
|
|
21
15
|
*
|
|
@@ -30,7 +24,7 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
30
24
|
return objectPart && objectPart.hasOwnProperty("_type");
|
|
31
25
|
}
|
|
32
26
|
|
|
33
|
-
var getDataModelPathForEntitySet = function (resolvedMetaPath) {
|
|
27
|
+
var getDataModelPathForEntitySet = function (resolvedMetaPath, convertedTypes) {
|
|
34
28
|
var rootEntitySet;
|
|
35
29
|
var currentEntitySet;
|
|
36
30
|
var previousEntitySet;
|
|
@@ -78,7 +72,8 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
78
72
|
targetEntitySet: currentEntitySet,
|
|
79
73
|
navigationProperties: navigationProperties,
|
|
80
74
|
contextLocation: undefined,
|
|
81
|
-
targetObject: resolvedMetaPath.target
|
|
75
|
+
targetObject: resolvedMetaPath.target,
|
|
76
|
+
convertedTypes: convertedTypes
|
|
82
77
|
};
|
|
83
78
|
dataModelPath.contextLocation = dataModelPath;
|
|
84
79
|
return dataModelPath;
|
|
@@ -100,8 +95,6 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
100
95
|
|
|
101
96
|
var ConverterContext = /*#__PURE__*/function () {
|
|
102
97
|
function ConverterContext(convertedTypes, manifestSettings, diagnostics, mergeFn, targetDataModelPath) {
|
|
103
|
-
_classCallCheck(this, ConverterContext);
|
|
104
|
-
|
|
105
98
|
this.convertedTypes = convertedTypes;
|
|
106
99
|
this.manifestSettings = manifestSettings;
|
|
107
100
|
this.diagnostics = diagnostics;
|
|
@@ -118,409 +111,385 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
118
111
|
*/
|
|
119
112
|
|
|
120
113
|
|
|
121
|
-
|
|
122
|
-
key: "_getEntityTypeFromFullyQualifiedName",
|
|
123
|
-
value: function _getEntityTypeFromFullyQualifiedName(fullyQualifiedName) {
|
|
124
|
-
var targetEntityType = this.convertedTypes.entityTypes.find(function (entityType) {
|
|
125
|
-
if (fullyQualifiedName.startsWith(entityType.fullyQualifiedName)) {
|
|
126
|
-
var replaceAnnotation = fullyQualifiedName.replace(entityType.fullyQualifiedName, "");
|
|
127
|
-
return replaceAnnotation.startsWith("/") || replaceAnnotation.startsWith("@");
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return false;
|
|
131
|
-
});
|
|
132
|
-
return targetEntityType;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Retrieve the entityType associated with an annotation object.
|
|
136
|
-
*
|
|
137
|
-
* @param annotation The annotation object for which we want to find the entityType
|
|
138
|
-
* @returns {EntityType} The EntityType the annotation refers to
|
|
139
|
-
*/
|
|
140
|
-
|
|
141
|
-
}, {
|
|
142
|
-
key: "getAnnotationEntityType",
|
|
143
|
-
value: function getAnnotationEntityType(annotation) {
|
|
144
|
-
if (annotation) {
|
|
145
|
-
var annotationPath = annotation.fullyQualifiedName;
|
|
146
|
-
|
|
147
|
-
var targetEntityType = this._getEntityTypeFromFullyQualifiedName(annotationPath);
|
|
148
|
-
|
|
149
|
-
if (!targetEntityType) {
|
|
150
|
-
throw new Error("Cannot find Entity Type for " + annotation.fullyQualifiedName);
|
|
151
|
-
}
|
|
114
|
+
var _proto = ConverterContext.prototype;
|
|
152
115
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Retrieve the manifest settings defined for a specific control within controlConfiguration.
|
|
160
|
-
*
|
|
161
|
-
* @param vAnnotationPath The annotation path or object to evaluate
|
|
162
|
-
* @returns The control configuration for that specific anntoation path if it exists
|
|
163
|
-
*/
|
|
164
|
-
|
|
165
|
-
}, {
|
|
166
|
-
key: "getManifestControlConfiguration",
|
|
167
|
-
value: function getManifestControlConfiguration(vAnnotationPath) {
|
|
168
|
-
if (isAnnotationTerm(vAnnotationPath)) {
|
|
169
|
-
return this.manifestWrapper.getControlConfiguration(vAnnotationPath.fullyQualifiedName.replace(this.targetDataModelPath.targetEntityType.fullyQualifiedName, ""));
|
|
116
|
+
_proto._getEntityTypeFromFullyQualifiedName = function _getEntityTypeFromFullyQualifiedName(fullyQualifiedName) {
|
|
117
|
+
var targetEntityType = this.convertedTypes.entityTypes.find(function (entityType) {
|
|
118
|
+
if (fullyQualifiedName.startsWith(entityType.fullyQualifiedName)) {
|
|
119
|
+
var replaceAnnotation = fullyQualifiedName.replace(entityType.fullyQualifiedName, "");
|
|
120
|
+
return replaceAnnotation.startsWith("/") || replaceAnnotation.startsWith("@");
|
|
170
121
|
}
|
|
171
122
|
|
|
172
|
-
return
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
123
|
+
return false;
|
|
124
|
+
});
|
|
125
|
+
return targetEntityType;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Retrieve the entityType associated with an annotation object.
|
|
129
|
+
*
|
|
130
|
+
* @param annotation The annotation object for which we want to find the entityType
|
|
131
|
+
* @returns {EntityType} The EntityType the annotation refers to
|
|
132
|
+
*/
|
|
133
|
+
;
|
|
134
|
+
|
|
135
|
+
_proto.getAnnotationEntityType = function getAnnotationEntityType(annotation) {
|
|
136
|
+
if (annotation) {
|
|
137
|
+
var annotationPath = annotation.fullyQualifiedName;
|
|
187
138
|
|
|
188
|
-
|
|
189
|
-
|
|
139
|
+
var targetEntityType = this._getEntityTypeFromFullyQualifiedName(annotationPath);
|
|
140
|
+
|
|
141
|
+
if (!targetEntityType) {
|
|
142
|
+
throw new Error("Cannot find Entity Type for " + annotation.fullyQualifiedName);
|
|
190
143
|
}
|
|
191
144
|
|
|
192
|
-
return
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Retrieve the current entitySet.
|
|
196
|
-
*
|
|
197
|
-
* @returns The current EntitySet if it exists.
|
|
198
|
-
*/
|
|
199
|
-
|
|
200
|
-
}, {
|
|
201
|
-
key: "getEntitySet",
|
|
202
|
-
value: function getEntitySet() {
|
|
203
|
-
return this.targetDataModelPath.targetEntitySet;
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Retrieve the context path.
|
|
207
|
-
*
|
|
208
|
-
* @returns The context path of the converter.
|
|
209
|
-
*/
|
|
210
|
-
|
|
211
|
-
}, {
|
|
212
|
-
key: "getContextPath",
|
|
213
|
-
value: function getContextPath() {
|
|
214
|
-
return this.baseContextPath;
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Retrieve the current data model object path.
|
|
218
|
-
*
|
|
219
|
-
* @returns The current data model object path
|
|
220
|
-
*/
|
|
221
|
-
|
|
222
|
-
}, {
|
|
223
|
-
key: "getDataModelObjectPath",
|
|
224
|
-
value: function getDataModelObjectPath() {
|
|
225
|
-
return this.targetDataModelPath;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Get the EntityContainer.
|
|
229
|
-
*
|
|
230
|
-
* @returns The current service EntityContainer
|
|
231
|
-
*/
|
|
232
|
-
|
|
233
|
-
}, {
|
|
234
|
-
key: "getEntityContainer",
|
|
235
|
-
value: function getEntityContainer() {
|
|
236
|
-
return this.convertedTypes.entityContainer;
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Get the EntityType based on the fully qualified name.
|
|
240
|
-
*
|
|
241
|
-
* @returns The current EntityType.
|
|
242
|
-
*/
|
|
243
|
-
|
|
244
|
-
}, {
|
|
245
|
-
key: "getEntityType",
|
|
246
|
-
value: function getEntityType() {
|
|
145
|
+
return targetEntityType;
|
|
146
|
+
} else {
|
|
247
147
|
return this.targetDataModelPath.targetEntityType;
|
|
248
148
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Retrieve the manifest settings defined for a specific control within controlConfiguration.
|
|
152
|
+
*
|
|
153
|
+
* @param vAnnotationPath The annotation path or object to evaluate
|
|
154
|
+
* @returns The control configuration for that specific anntoation path if it exists
|
|
155
|
+
*/
|
|
156
|
+
;
|
|
157
|
+
|
|
158
|
+
_proto.getManifestControlConfiguration = function getManifestControlConfiguration(vAnnotationPath) {
|
|
159
|
+
if (isAnnotationTerm(vAnnotationPath)) {
|
|
160
|
+
return this.manifestWrapper.getControlConfiguration(vAnnotationPath.fullyQualifiedName.replace(this.targetDataModelPath.targetEntityType.fullyQualifiedName, ""));
|
|
262
161
|
}
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
162
|
+
|
|
163
|
+
return this.manifestWrapper.getControlConfiguration(vAnnotationPath);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Create an absolute annotation path based on the current meta model context.
|
|
167
|
+
*
|
|
168
|
+
* @param sAnnotationPath The relative annotation path
|
|
169
|
+
* @returns The correct annotation path based on the current context
|
|
170
|
+
*/
|
|
171
|
+
;
|
|
172
|
+
|
|
173
|
+
_proto.getAbsoluteAnnotationPath = function getAbsoluteAnnotationPath(sAnnotationPath) {
|
|
174
|
+
if (!sAnnotationPath) {
|
|
175
|
+
return sAnnotationPath;
|
|
276
176
|
}
|
|
277
|
-
/**
|
|
278
|
-
* Retrieves an annotation from an entity type based on annotation path.
|
|
279
|
-
*
|
|
280
|
-
* @param annotationPath The annotation path to be evaluated
|
|
281
|
-
* @returns The target annotation path as well as a converter context to go with it
|
|
282
|
-
*/
|
|
283
|
-
|
|
284
|
-
}, {
|
|
285
|
-
key: "getEntityTypeAnnotation",
|
|
286
|
-
value: function getEntityTypeAnnotation(annotationPath) {
|
|
287
|
-
var _startingEntityType$a;
|
|
288
|
-
|
|
289
|
-
if (annotationPath.indexOf("@") === -1) {
|
|
290
|
-
annotationPath = "@" + annotationPath;
|
|
291
|
-
}
|
|
292
177
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
var startingEntityType = this.targetDataModelPath.startingEntitySet.entityType;
|
|
297
|
-
var navigationProperties = this.targetDataModelPath.navigationProperties.concat();
|
|
298
|
-
var i = 1;
|
|
299
|
-
var currentObject;
|
|
300
|
-
var navigatedPaths = [];
|
|
301
|
-
var visitedObjects = targetObject.visitedObjects; // In case of parameterized service
|
|
302
|
-
|
|
303
|
-
if (!rootEntitySet && (_startingEntityType$a = startingEntityType.annotations.Common) !== null && _startingEntityType$a !== void 0 && _startingEntityType$a.ResultContext) {
|
|
304
|
-
rootEntitySet = this.targetDataModelPath.startingEntitySet;
|
|
305
|
-
this.targetDataModelPath.navigationProperties.forEach(function (navObject) {
|
|
306
|
-
navigatedPaths.push(navObject.name);
|
|
307
|
-
});
|
|
308
|
-
}
|
|
178
|
+
if (sAnnotationPath[0] === "/") {
|
|
179
|
+
return sAnnotationPath;
|
|
180
|
+
}
|
|
309
181
|
|
|
310
|
-
|
|
311
|
-
|
|
182
|
+
return this.baseContextPath + "/" + sAnnotationPath;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Retrieve the current entitySet.
|
|
186
|
+
*
|
|
187
|
+
* @returns The current EntitySet if it exists.
|
|
188
|
+
*/
|
|
189
|
+
;
|
|
312
190
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
191
|
+
_proto.getEntitySet = function getEntitySet() {
|
|
192
|
+
return this.targetDataModelPath.targetEntitySet;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Retrieve the context path.
|
|
196
|
+
*
|
|
197
|
+
* @returns The context path of the converter.
|
|
198
|
+
*/
|
|
199
|
+
;
|
|
317
200
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
201
|
+
_proto.getContextPath = function getContextPath() {
|
|
202
|
+
return this.baseContextPath;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Retrieve the current data model object path.
|
|
206
|
+
*
|
|
207
|
+
* @returns The current data model object path
|
|
208
|
+
*/
|
|
209
|
+
;
|
|
326
210
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
211
|
+
_proto.getDataModelObjectPath = function getDataModelObjectPath() {
|
|
212
|
+
return this.targetDataModelPath;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get the EntityContainer.
|
|
216
|
+
*
|
|
217
|
+
* @returns The current service EntityContainer
|
|
218
|
+
*/
|
|
219
|
+
;
|
|
332
220
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
221
|
+
_proto.getEntityContainer = function getEntityContainer() {
|
|
222
|
+
return this.convertedTypes.entityContainer;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get the EntityType based on the fully qualified name.
|
|
226
|
+
*
|
|
227
|
+
* @returns The current EntityType.
|
|
228
|
+
*/
|
|
229
|
+
;
|
|
230
|
+
|
|
231
|
+
_proto.getEntityType = function getEntityType() {
|
|
232
|
+
return this.targetDataModelPath.targetEntityType;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Gets the entity type of the parameter in case of a parameterized service.
|
|
236
|
+
* @returns {EntityType} The entity type of the parameter
|
|
237
|
+
*/
|
|
238
|
+
;
|
|
239
|
+
|
|
240
|
+
_proto.getParameterEntityType = function getParameterEntityType() {
|
|
241
|
+
var _parameterEntityType$, _parameterEntityType$2;
|
|
242
|
+
|
|
243
|
+
var parameterEntityType = this.targetDataModelPath.startingEntitySet.entityType;
|
|
244
|
+
var isParameterized = !!((_parameterEntityType$ = parameterEntityType.annotations) !== null && _parameterEntityType$ !== void 0 && (_parameterEntityType$2 = _parameterEntityType$.Common) !== null && _parameterEntityType$2 !== void 0 && _parameterEntityType$2.ResultContext);
|
|
245
|
+
return isParameterized && parameterEntityType;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Retrieves an annotation from an entity type based on annotation path.
|
|
249
|
+
*
|
|
250
|
+
* @param annotationPath The annotation path to be evaluated
|
|
251
|
+
* @returns The target annotation path as well as a converter context to go with it
|
|
252
|
+
*/
|
|
253
|
+
;
|
|
254
|
+
|
|
255
|
+
_proto.getEntityTypeAnnotation = function getEntityTypeAnnotation(annotationPath) {
|
|
256
|
+
var _startingEntityType$a;
|
|
257
|
+
|
|
258
|
+
if (annotationPath.indexOf("@") === -1) {
|
|
259
|
+
annotationPath = "@" + annotationPath;
|
|
356
260
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
261
|
+
|
|
262
|
+
var targetObject = this.targetDataModelPath.targetEntityType.resolvePath(annotationPath, true);
|
|
263
|
+
var rootEntitySet = this.targetDataModelPath.targetEntitySet;
|
|
264
|
+
var currentEntityType = this.targetDataModelPath.targetEntityType;
|
|
265
|
+
var startingEntityType = this.targetDataModelPath.startingEntitySet.entityType;
|
|
266
|
+
var navigationProperties = this.targetDataModelPath.navigationProperties.concat();
|
|
267
|
+
var i = 1;
|
|
268
|
+
var currentObject;
|
|
269
|
+
var navigatedPaths = [];
|
|
270
|
+
var visitedObjects = targetObject.visitedObjects; // In case of parameterized service
|
|
271
|
+
|
|
272
|
+
if (!rootEntitySet && (_startingEntityType$a = startingEntityType.annotations.Common) !== null && _startingEntityType$a !== void 0 && _startingEntityType$a.ResultContext) {
|
|
273
|
+
rootEntitySet = this.targetDataModelPath.startingEntitySet;
|
|
274
|
+
this.targetDataModelPath.navigationProperties.forEach(function (navObject) {
|
|
275
|
+
navigatedPaths.push(navObject.name);
|
|
276
|
+
});
|
|
369
277
|
}
|
|
370
|
-
/**
|
|
371
|
-
* Transform an entityType based path to an entitySet based one (ui5 templating generally expect an entitySetBasedPath).
|
|
372
|
-
*
|
|
373
|
-
* @param annotationPath
|
|
374
|
-
* @returns The EntitySet based annotation path
|
|
375
|
-
*/
|
|
376
|
-
|
|
377
|
-
}, {
|
|
378
|
-
key: "getEntitySetBasedAnnotationPath",
|
|
379
|
-
value: function getEntitySetBasedAnnotationPath(annotationPath) {
|
|
380
|
-
if (!annotationPath) {
|
|
381
|
-
return annotationPath;
|
|
382
|
-
}
|
|
383
278
|
|
|
384
|
-
|
|
279
|
+
while (i < visitedObjects.length) {
|
|
280
|
+
currentObject = visitedObjects[i++];
|
|
385
281
|
|
|
386
|
-
if (
|
|
387
|
-
|
|
282
|
+
if (currentObject._type === "NavigationProperty") {
|
|
283
|
+
navigatedPaths.push(currentObject.name);
|
|
284
|
+
navigationProperties.push(currentObject);
|
|
285
|
+
currentEntityType = currentObject.targetType;
|
|
388
286
|
|
|
389
|
-
if (
|
|
390
|
-
|
|
287
|
+
if (rootEntitySet && rootEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
|
|
288
|
+
var navPath = navigatedPaths.join("/");
|
|
289
|
+
rootEntitySet = rootEntitySet.navigationPropertyBinding[currentObject.name] || rootEntitySet.navigationPropertyBinding[navPath];
|
|
290
|
+
navigatedPaths = [];
|
|
291
|
+
} else {
|
|
292
|
+
rootEntitySet = undefined;
|
|
391
293
|
}
|
|
294
|
+
}
|
|
392
295
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
296
|
+
if (currentObject._type === "EntitySet") {
|
|
297
|
+
rootEntitySet = currentObject;
|
|
298
|
+
currentEntityType = rootEntitySet.entityType;
|
|
396
299
|
}
|
|
397
300
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
301
|
+
|
|
302
|
+
var outDataModelPath = {
|
|
303
|
+
startingEntitySet: this.targetDataModelPath.startingEntitySet,
|
|
304
|
+
targetEntitySet: rootEntitySet,
|
|
305
|
+
targetEntityType: currentEntityType,
|
|
306
|
+
targetObject: navigationProperties[navigationProperties.length - 1],
|
|
307
|
+
navigationProperties: navigationProperties,
|
|
308
|
+
contextLocation: this.targetDataModelPath.contextLocation,
|
|
309
|
+
convertedTypes: this.convertedTypes
|
|
310
|
+
};
|
|
311
|
+
return {
|
|
312
|
+
annotation: targetObject.target,
|
|
313
|
+
converterContext: new ConverterContext(this.convertedTypes, this.manifestSettings, this.diagnostics, this.mergeFn, outDataModelPath)
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Retrieve the type of template we're working on (e.g. ListReport / ObjectPage / ...).
|
|
318
|
+
*
|
|
319
|
+
* @returns The current tenplate type
|
|
320
|
+
*/
|
|
321
|
+
;
|
|
322
|
+
|
|
323
|
+
_proto.getTemplateType = function getTemplateType() {
|
|
324
|
+
return this.manifestWrapper.getTemplateType();
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Retrieve the converted types.
|
|
328
|
+
* @returns The current converted types
|
|
329
|
+
*/
|
|
330
|
+
;
|
|
331
|
+
|
|
332
|
+
_proto.getConvertedTypes = function getConvertedTypes() {
|
|
333
|
+
return this.convertedTypes;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Retrieve a relative annotation path between an annotation path and an entity type.
|
|
337
|
+
*
|
|
338
|
+
* @param annotationPath
|
|
339
|
+
* @param entityType
|
|
340
|
+
* @returns The relative anntotation path.
|
|
341
|
+
*/
|
|
342
|
+
;
|
|
343
|
+
|
|
344
|
+
_proto.getRelativeAnnotationPath = function getRelativeAnnotationPath(annotationPath, entityType) {
|
|
345
|
+
return annotationPath.replace(entityType.fullyQualifiedName, "");
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Transform an entityType based path to an entitySet based one (ui5 templating generally expect an entitySetBasedPath).
|
|
349
|
+
*
|
|
350
|
+
* @param annotationPath
|
|
351
|
+
* @returns The EntitySet based annotation path
|
|
352
|
+
*/
|
|
353
|
+
;
|
|
354
|
+
|
|
355
|
+
_proto.getEntitySetBasedAnnotationPath = function getEntitySetBasedAnnotationPath(annotationPath) {
|
|
356
|
+
if (!annotationPath) {
|
|
357
|
+
return annotationPath;
|
|
425
358
|
}
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
return
|
|
359
|
+
|
|
360
|
+
var entityTypeFQN = this.targetDataModelPath.targetEntityType.fullyQualifiedName;
|
|
361
|
+
|
|
362
|
+
if (this.targetDataModelPath.targetEntitySet || (this.baseContextPath.startsWith("/") && this.baseContextPath.match(/\//g) || []).length > 1) {
|
|
363
|
+
var replacedAnnotationPath = annotationPath.replace(entityTypeFQN, "/");
|
|
364
|
+
|
|
365
|
+
if (replacedAnnotationPath.length > 2 && replacedAnnotationPath[0] === "/" && replacedAnnotationPath[1] === "/") {
|
|
366
|
+
replacedAnnotationPath = replacedAnnotationPath.substr(1);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
return this.baseContextPath + (replacedAnnotationPath.startsWith("/") ? replacedAnnotationPath : "/" + replacedAnnotationPath);
|
|
370
|
+
} else {
|
|
371
|
+
return "/" + annotationPath;
|
|
439
372
|
}
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Retrieve the manifest wrapper for the current context.
|
|
376
|
+
*
|
|
377
|
+
* @returns The current manifest wrapper
|
|
378
|
+
*/
|
|
379
|
+
;
|
|
380
|
+
|
|
381
|
+
_proto.getManifestWrapper = function getManifestWrapper() {
|
|
382
|
+
return this.manifestWrapper;
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
_proto.getDiagnostics = function getDiagnostics() {
|
|
386
|
+
return this.diagnostics;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Retrieve the target from an absolute path.
|
|
390
|
+
*
|
|
391
|
+
* @param {string} path The path we want to get the target
|
|
392
|
+
* @returns {ConverterContext}
|
|
393
|
+
*/
|
|
394
|
+
;
|
|
395
|
+
|
|
396
|
+
_proto.resolveAbsolutePath = function resolveAbsolutePath(path) {
|
|
397
|
+
return this.convertedTypes.resolvePath(path);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Retrieve a new converter context, scoped for a different context path.
|
|
401
|
+
*
|
|
402
|
+
* @param {string} contextPath The path we want to orchestrate the converter context around
|
|
403
|
+
* @returns {ConverterContext}
|
|
404
|
+
*/
|
|
405
|
+
;
|
|
406
|
+
|
|
407
|
+
_proto.getConverterContextFor = function getConverterContextFor(contextPath) {
|
|
408
|
+
var resolvedMetaPath = this.convertedTypes.resolvePath(contextPath);
|
|
409
|
+
var targetPath = getDataModelPathForEntitySet(resolvedMetaPath, this.convertedTypes);
|
|
410
|
+
return new ConverterContext(this.convertedTypes, this.manifestSettings, this.diagnostics, this.mergeFn, targetPath);
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Get all annotations of a given term and vocabulary on an entity type
|
|
414
|
+
* (or on the current entity type if entityType isn't specified).
|
|
415
|
+
*
|
|
416
|
+
* @param vocabularyName
|
|
417
|
+
* @param annotationTerm
|
|
418
|
+
* @param [annotationSources]
|
|
419
|
+
* @returns All the annotation for a specific term and vocabulary from an entity type
|
|
420
|
+
*/
|
|
421
|
+
;
|
|
422
|
+
|
|
423
|
+
_proto.getAnnotationsByTerm = function getAnnotationsByTerm(vocabularyName, annotationTerm) {
|
|
424
|
+
var annotationSources = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [this.getEntityType()];
|
|
425
|
+
var outAnnotations = [];
|
|
426
|
+
annotationSources.forEach(function (annotationSource) {
|
|
427
|
+
if (annotationSource) {
|
|
428
|
+
var annotations = (annotationSource === null || annotationSource === void 0 ? void 0 : annotationSource.annotations[vocabularyName]) || {};
|
|
429
|
+
|
|
430
|
+
if (annotations) {
|
|
431
|
+
outAnnotations = Object.keys(annotations).filter(function (annotation) {
|
|
432
|
+
return annotations[annotation].term === annotationTerm;
|
|
433
|
+
}).reduce(function (previousValue, key) {
|
|
434
|
+
previousValue.push(annotations[key]);
|
|
435
|
+
return previousValue;
|
|
436
|
+
}, outAnnotations);
|
|
467
437
|
}
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
return outAnnotations;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Retrieves the relative model path based on the current context path.
|
|
444
|
+
*
|
|
445
|
+
* @returns {string|undefined} The relative model path or undefined if the path is not resolveable
|
|
446
|
+
*/
|
|
447
|
+
;
|
|
448
|
+
|
|
449
|
+
_proto.getRelativeModelPathFunction = function getRelativeModelPathFunction() {
|
|
450
|
+
var targetDataModelPath = this.targetDataModelPath;
|
|
451
|
+
return function (sPath) {
|
|
452
|
+
var enhancedPath = enhanceDataModelPath(targetDataModelPath, sPath);
|
|
453
|
+
return getContextRelativeTargetObjectPath(enhancedPath, true);
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Create the converter context necessary for a macro based on a metamodel context.
|
|
458
|
+
* @param sEntitySetName
|
|
459
|
+
* @param oMetaModelContext
|
|
460
|
+
* @param diagnostics
|
|
461
|
+
* @param mergeFn
|
|
462
|
+
* @param targetDataModelPath
|
|
463
|
+
* @param manifestSettings
|
|
464
|
+
* @returns {ConverterContext} The current converter context
|
|
465
|
+
*/
|
|
466
|
+
;
|
|
467
|
+
|
|
468
|
+
ConverterContext.createConverterContextForMacro = function createConverterContextForMacro(sEntitySetName, oMetaModelContext, diagnostics, mergeFn, targetDataModelPath) {
|
|
469
|
+
var manifestSettings = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
|
|
470
|
+
var oMetaModel = oMetaModelContext.isA("sap.ui.model.odata.v4.ODataMetaModel") ? oMetaModelContext : oMetaModelContext.getModel();
|
|
471
|
+
var oConverterOutput = convertTypes(oMetaModel);
|
|
472
|
+
var targetEntitySet = oConverterOutput.entitySets.find(function (entitySet) {
|
|
473
|
+
return entitySet.name === sEntitySetName;
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
if (!targetDataModelPath) {
|
|
477
|
+
targetDataModelPath = {
|
|
478
|
+
startingEntitySet: targetEntitySet,
|
|
479
|
+
navigationProperties: [],
|
|
480
|
+
targetEntitySet: targetEntitySet,
|
|
481
|
+
targetEntityType: targetEntitySet.entityType,
|
|
482
|
+
targetObject: targetEntitySet,
|
|
483
|
+
convertedTypes: oConverterOutput
|
|
484
484
|
};
|
|
485
485
|
}
|
|
486
|
-
/**
|
|
487
|
-
* Create the converter context necessary for a macro based on a metamodel context.
|
|
488
|
-
* @param sEntitySetName
|
|
489
|
-
* @param oMetaModelContext
|
|
490
|
-
* @param diagnostics
|
|
491
|
-
* @param mergeFn
|
|
492
|
-
* @param targetDataModelPath
|
|
493
|
-
* @param manifestSettings
|
|
494
|
-
* @returns {ConverterContext} The current converter context
|
|
495
|
-
*/
|
|
496
|
-
|
|
497
|
-
}], [{
|
|
498
|
-
key: "createConverterContextForMacro",
|
|
499
|
-
value: function createConverterContextForMacro(sEntitySetName, oMetaModelContext, diagnostics, mergeFn, targetDataModelPath) {
|
|
500
|
-
var manifestSettings = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
|
|
501
|
-
var oMetaModel = oMetaModelContext.isA("sap.ui.model.odata.v4.ODataMetaModel") ? oMetaModelContext : oMetaModelContext.getModel();
|
|
502
|
-
var oConverterOutput = convertTypes(oMetaModel);
|
|
503
|
-
var targetEntitySet = oConverterOutput.entitySets.find(function (entitySet) {
|
|
504
|
-
return entitySet.name === sEntitySetName;
|
|
505
|
-
});
|
|
506
486
|
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
startingEntitySet: targetEntitySet,
|
|
510
|
-
navigationProperties: [],
|
|
511
|
-
targetEntitySet: targetEntitySet,
|
|
512
|
-
targetEntityType: targetEntitySet.entityType,
|
|
513
|
-
targetObject: targetEntitySet
|
|
514
|
-
};
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
return new ConverterContext(oConverterOutput, manifestSettings, diagnostics, mergeFn, targetDataModelPath);
|
|
518
|
-
}
|
|
519
|
-
}]);
|
|
487
|
+
return new ConverterContext(oConverterOutput, manifestSettings, diagnostics, mergeFn, targetDataModelPath);
|
|
488
|
+
};
|
|
520
489
|
|
|
521
490
|
return ConverterContext;
|
|
522
491
|
}();
|
|
523
492
|
|
|
524
493
|
return ConverterContext;
|
|
525
494
|
}, false);
|
|
526
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnZlcnRlckNvbnRleHQudHMiXSwibmFtZXMiOlsiaXNBbm5vdGF0aW9uVGVybSIsInZBbm5vdGF0aW9uUGF0aCIsImlzU2VydmljZU9iamVjdCIsIm9iamVjdFBhcnQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldERhdGFNb2RlbFBhdGhGb3JFbnRpdHlTZXQiLCJyZXNvbHZlZE1ldGFQYXRoIiwicm9vdEVudGl0eVNldCIsImN1cnJlbnRFbnRpdHlTZXQiLCJwcmV2aW91c0VudGl0eVNldCIsImN1cnJlbnRFbnRpdHlUeXBlIiwibmF2aWdhdGVkUGF0aHMiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsIm9iamVjdFBhdGgiLCJmb3JFYWNoIiwiX3R5cGUiLCJwdXNoIiwibmFtZSIsInRhcmdldFR5cGUiLCJuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nIiwiam9pbiIsInVuZGVmaW5lZCIsImVudGl0eVR5cGUiLCJkYXRhTW9kZWxQYXRoIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwidGFyZ2V0RW50aXR5U2V0IiwiY29udGV4dExvY2F0aW9uIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0IiwiQ29udmVydGVyQ29udGV4dCIsImNvbnZlcnRlZFR5cGVzIiwibWFuaWZlc3RTZXR0aW5ncyIsImRpYWdub3N0aWNzIiwibWVyZ2VGbiIsInRhcmdldERhdGFNb2RlbFBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJNYW5pZmVzdFdyYXBwZXIiLCJiYXNlQ29udGV4dFBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwic3RhcnRzV2l0aCIsInJlcGxhY2VBbm5vdGF0aW9uIiwicmVwbGFjZSIsImFubm90YXRpb24iLCJhbm5vdGF0aW9uUGF0aCIsIl9nZXRFbnRpdHlUeXBlRnJvbUZ1bGx5UXVhbGlmaWVkTmFtZSIsIkVycm9yIiwiZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24iLCJzQW5ub3RhdGlvblBhdGgiLCJlbnRpdHlDb250YWluZXIiLCJzaW5nbGV0b25zIiwic2luZ2xldG9uIiwicGFyYW1ldGVyRW50aXR5VHlwZSIsImlzUGFyYW1ldGVyaXplZCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiUmVzdWx0Q29udGV4dCIsImluZGV4T2YiLCJyZXNvbHZlUGF0aCIsInN0YXJ0aW5nRW50aXR5VHlwZSIsImNvbmNhdCIsImkiLCJjdXJyZW50T2JqZWN0IiwidmlzaXRlZE9iamVjdHMiLCJuYXZPYmplY3QiLCJsZW5ndGgiLCJuYXZQYXRoIiwib3V0RGF0YU1vZGVsUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJnZXRUZW1wbGF0ZVR5cGUiLCJlbnRpdHlUeXBlRlFOIiwibWF0Y2giLCJyZXBsYWNlZEFubm90YXRpb25QYXRoIiwic3Vic3RyIiwicGF0aCIsImNvbnRleHRQYXRoIiwidGFyZ2V0UGF0aCIsInZvY2FidWxhcnlOYW1lIiwiYW5ub3RhdGlvblRlcm0iLCJhbm5vdGF0aW9uU291cmNlcyIsImdldEVudGl0eVR5cGUiLCJvdXRBbm5vdGF0aW9ucyIsImFubm90YXRpb25Tb3VyY2UiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwidGVybSIsInJlZHVjZSIsInByZXZpb3VzVmFsdWUiLCJrZXkiLCJzUGF0aCIsImVuaGFuY2VkUGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsInNFbnRpdHlTZXROYW1lIiwib01ldGFNb2RlbENvbnRleHQiLCJvTWV0YU1vZGVsIiwiaXNBIiwiZ2V0TW9kZWwiLCJvQ29udmVydGVyT3V0cHV0IiwiY29udmVydFR5cGVzIiwiZW50aXR5U2V0cyIsImVudGl0eVNldCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLGdCQUFnQixHQUFHLFVBQVNDLGVBQVQs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QUFNQyxnQkFBZ0IsR0FBR0MsWUFBWSxDQUFDSixVQUFELENBQXJDO0FBQ0EsWUFBTXpFLGVBQWUsR0FBRzRFLGdCQUFnQixDQUFDRSxVQUFqQixDQUE0QjlELElBQTVCLENBQWlDLFVBQUErRCxTQUFTO0FBQUEsaUJBQUlBLFNBQVMsQ0FBQ3hGLElBQVYsS0FBbUJnRixjQUF2QjtBQUFBLFNBQTFDLENBQXhCOztBQUNBLFlBQUksQ0FBQzlELG1CQUFMLEVBQTBCO0FBQ3pCQSxVQUFBQSxtQkFBbUIsR0FBRztBQUNyQlgsWUFBQUEsaUJBQWlCLEVBQUVFLGVBREU7QUFFckJkLFlBQUFBLG9CQUFvQixFQUFFLEVBRkQ7QUFHckJjLFlBQUFBLGVBQWUsRUFBRUEsZUFISTtBQUlyQkQsWUFBQUEsZ0JBQWdCLEVBQUVDLGVBQWUsQ0FBQ0osVUFKYjtBQUtyQk0sWUFBQUEsWUFBWSxFQUFFRjtBQUxPLFdBQXRCO0FBT0E7O0FBQ0QsZUFBTyxJQUFJSSxnQkFBSixDQUFxQndFLGdCQUFyQixFQUF1Q3RFLGdCQUF2QyxFQUF5REMsV0FBekQsRUFBc0VDLE9BQXRFLEVBQStFQyxtQkFBL0UsQ0FBUDtBQUNBOzs7Ozs7U0FHYUwsZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25UZXJtIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBbnlBbm5vdGF0aW9uLFxuXHRDb252ZXJ0ZXJPdXRwdXQsXG5cdEVudGl0eVNldCxcblx0RW50aXR5VHlwZSxcblx0RW50aXR5Q29udGFpbmVyLFxuXHROYXZpZ2F0aW9uUHJvcGVydHksXG5cdFNlcnZpY2VPYmplY3QsXG5cdFNpbmdsZXRvbixcblx0UmVzb2x1dGlvblRhcmdldCxcblx0U2VydmljZU9iamVjdEFuZEFubm90YXRpb25cbn0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7IEJhc2VNYW5pZmVzdFNldHRpbmdzLCBUZW1wbGF0ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIFJlc29sdmVkVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBJRGlhZ25vc3RpY3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHtcblx0RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0ZW5oYW5jZURhdGFNb2RlbFBhdGgsXG5cdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGhcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgRW50aXR5VHlwZUFubm90YXRpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL2dlbmVyYXRlZC9FZG1fVHlwZXNcIjtcbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RXcmFwcGVyXCI7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVkQW5ub3RhdGlvbkNvbnRleHQgPSB7XG5cdGFubm90YXRpb246IEFueUFubm90YXRpb247XG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIG9iamVjdCBpcyBhbiBhbm5vdGF0aW9uIHRlcm0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QW5ub3RhdGlvblRlcm08b2JqZWN0Pn0gdkFubm90YXRpb25QYXRoXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNBbm5vdGF0aW9uVGVybSA9IGZ1bmN0aW9uKHZBbm5vdGF0aW9uUGF0aDogc3RyaW5nIHwgQW5ub3RhdGlvblRlcm08YW55Pik6IHZBbm5vdGF0aW9uUGF0aCBpcyBBbm5vdGF0aW9uVGVybTxhbnk+IHtcblx0cmV0dXJuIHR5cGVvZiB2QW5ub3RhdGlvblBhdGggPT09IFwib2JqZWN0XCI7XG59O1xuXG5mdW5jdGlvbiBpc1NlcnZpY2VPYmplY3Qob2JqZWN0UGFydDogU2VydmljZU9iamVjdEFuZEFubm90YXRpb24pOiBvYmplY3RQYXJ0IGlzIFNlcnZpY2VPYmplY3Qge1xuXHRyZXR1cm4gb2JqZWN0UGFydCAmJiBvYmplY3RQYXJ0Lmhhc093blByb3BlcnR5KFwiX3R5cGVcIik7XG59XG5cbmNvbnN0IGdldERhdGFNb2RlbFBhdGhGb3JFbnRpdHlTZXQgPSBmdW5jdGlvbihyZXNvbHZlZE1ldGFQYXRoOiBSZXNvbHV0aW9uVGFyZ2V0PGFueT4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0bGV0IHJvb3RFbnRpdHlTZXQ6IEVudGl0eVNldCB8IHVuZGVmaW5lZDtcblx0bGV0IGN1cnJlbnRFbnRpdHlTZXQ6IEVudGl0eVNldCB8IHVuZGVmaW5lZDtcblx0bGV0IHByZXZpb3VzRW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZDtcblx0bGV0IG5hdmlnYXRlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllczogTmF2aWdhdGlvblByb3BlcnR5W10gPSBbXTtcblx0cmVzb2x2ZWRNZXRhUGF0aC5vYmplY3RQYXRoLmZvckVhY2goKG9iamVjdFBhcnQ6IFNlcnZpY2VPYmplY3RBbmRBbm5vdGF0aW9uKSA9PiB7XG5cdFx0aWYgKGlzU2VydmljZU9iamVjdChvYmplY3RQYXJ0KSkge1xuXHRcdFx0c3dpdGNoIChvYmplY3RQYXJ0Ll90eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJOYXZpZ2F0aW9uUHJvcGVydHlcIjpcblx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKG9iamVjdFBhcnQubmFtZSk7XG5cdFx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChvYmplY3RQYXJ0KTtcblx0XHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IG9iamVjdFBhcnQudGFyZ2V0VHlwZTtcblx0XHRcdFx0XHRpZiAocHJldmlvdXNFbnRpdHlTZXQgJiYgcHJldmlvdXNFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZy5oYXNPd25Qcm9wZXJ0eShuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKSkpIHtcblx0XHRcdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBwcmV2aW91c0VudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW25hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpXTtcblx0XHRcdFx0XHRcdHByZXZpb3VzRW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldDtcblx0XHRcdFx0XHRcdG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiRW50aXR5U2V0XCI6XG5cdFx0XHRcdFx0aWYgKHJvb3RFbnRpdHlTZXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cm9vdEVudGl0eVNldCA9IG9iamVjdFBhcnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBvYmplY3RQYXJ0O1xuXHRcdFx0XHRcdHByZXZpb3VzRW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldDtcblx0XHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IGN1cnJlbnRFbnRpdHlTZXQ/LmVudGl0eVR5cGU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgZGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogcm9vdEVudGl0eVNldCBhcyBFbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogY3VycmVudEVudGl0eVR5cGUgYXMgRW50aXR5VHlwZSxcblx0XHR0YXJnZXRFbnRpdHlTZXQ6IGN1cnJlbnRFbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IG5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRcdGNvbnRleHRMb2NhdGlvbjogdW5kZWZpbmVkLFxuXHRcdHRhcmdldE9iamVjdDogcmVzb2x2ZWRNZXRhUGF0aC50YXJnZXRcblx0fTtcblx0ZGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24gPSBkYXRhTW9kZWxQYXRoO1xuXHRyZXR1cm4gZGF0YU1vZGVsUGF0aDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgQ29udmVydGVyQ29udGV4dCBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aGluIHRoZSBjb252ZXJ0ZXJzLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyT3V0cHV0fSBvQ29udmVydGVkVHlwZXMgVGhlIGNvbnZlcnRlZCBhbm5vdGF0aW9uIGFuZCBzZXJ2aWNlIHR5cGVzXG4gKiBAcGFyYW0ge0Jhc2VNYW5pZmVzdFNldHRpbmdzfSBvTWFuaWZlc3RTZXR0aW5ncyBUaGUgbWFuaWZlc3RTZXR0aW5ncyB0aGF0IGFwcGxpZXMgdG8gdGhpcyBwYWdlXG4gKiBAcGFyYW0ge1RlbXBsYXRlVHlwZX0gdGVtcGxhdGVUeXBlIFRoZSB0eXBlIG9mIHRlbXBsYXRlIHdlJ3JlIGxvb2tpbmcgYXQgcmlnaHQgbm93XG4gKiBAcGFyYW0ge0lTaGVsbFNlcnZpY2VzUHJveHl9IHNoZWxsU2VydmljZXMgVGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIHNoZWxsc2VydmljZVxuICogQHBhcmFtIHtJRGlhZ25vc3RpY3N9IGRpYWdub3N0aWNzIFRoZSBkaWFnbm9zdGljcyBzaGltXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZuIFRoZSBmdW5jdGlvbiB0byBiZSB1c2VkIHRvIHBlcmZvbSBzb21lIGRlZXAgbWVyZ2VzIGJldHdlZW4gb2JqZWN0XG4gKiBAcGFyYW0ge0RhdGFNb2RlbE9iamVjdFBhdGh9IHRhcmdldERhdGFNb2RlbFBhdGggVGhlIGdsb2JhbCBwYXRoIHRvIHJlYWNoIHRoZSBlbnRpdHlTZXRcbiAqXG4gKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH0gQSBjb252ZXJ0ZXIgY29udGV4dCBmb3IgdGhlIGNvbnZlcnRlcnNcbiAqL1xuY2xhc3MgQ29udmVydGVyQ29udGV4dCB7XG5cdHByaXZhdGUgbWFuaWZlc3RXcmFwcGVyOiBNYW5pZmVzdFdyYXBwZXI7XG5cdHByaXZhdGUgYmFzZUNvbnRleHRQYXRoOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSBjb252ZXJ0ZWRUeXBlczogQ29udmVydGVyT3V0cHV0LFxuXHRcdHByaXZhdGUgbWFuaWZlc3RTZXR0aW5nczogQmFzZU1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0cHJpdmF0ZSBkaWFnbm9zdGljczogSURpYWdub3N0aWNzLFxuXHRcdHByaXZhdGUgbWVyZ2VGbjogRnVuY3Rpb24sXG5cdFx0cHJpdmF0ZSB0YXJnZXREYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG5cdCkge1xuXHRcdHRoaXMubWFuaWZlc3RXcmFwcGVyID0gbmV3IE1hbmlmZXN0V3JhcHBlcih0aGlzLm1hbmlmZXN0U2V0dGluZ3MsIG1lcmdlRm4pO1xuXHRcdHRoaXMuYmFzZUNvbnRleHRQYXRoID0gZ2V0VGFyZ2V0T2JqZWN0UGF0aCh0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWVcblx0ICogQHJldHVybnMge1Byb3BlcnR5fSBUaGUgcHJvcGVydHkgRW50aXR5VHlwZSBiYXNlZFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RW50aXR5VHlwZUZyb21GdWxseVF1YWxpZmllZE5hbWUoZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gdGhpcy5jb252ZXJ0ZWRUeXBlcy5lbnRpdHlUeXBlcy5maW5kKGVudGl0eVR5cGUgPT4ge1xuXHRcdFx0aWYgKGZ1bGx5UXVhbGlmaWVkTmFtZS5zdGFydHNXaXRoKGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lKSkge1xuXHRcdFx0XHRjb25zdCByZXBsYWNlQW5ub3RhdGlvbiA9IGZ1bGx5UXVhbGlmaWVkTmFtZS5yZXBsYWNlKGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBcIlwiKTtcblx0XHRcdFx0cmV0dXJuIHJlcGxhY2VBbm5vdGF0aW9uLnN0YXJ0c1dpdGgoXCIvXCIpIHx8IHJlcGxhY2VBbm5vdGF0aW9uLnN0YXJ0c1dpdGgoXCJAXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXHRcdHJldHVybiB0YXJnZXRFbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBlbnRpdHlUeXBlIGFzc29jaWF0ZWQgd2l0aCBhbiBhbm5vdGF0aW9uIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24gb2JqZWN0IGZvciB3aGljaCB3ZSB3YW50IHRvIGZpbmQgdGhlIGVudGl0eVR5cGVcblx0ICogQHJldHVybnMge0VudGl0eVR5cGV9IFRoZSBFbnRpdHlUeXBlIHRoZSBhbm5vdGF0aW9uIHJlZmVycyB0b1xuXHQgKi9cblx0Z2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoYW5ub3RhdGlvbj86IEFubm90YXRpb25UZXJtPGFueT4pOiBFbnRpdHlUeXBlIHtcblx0XHRpZiAoYW5ub3RhdGlvbikge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSB0aGlzLl9nZXRFbnRpdHlUeXBlRnJvbUZ1bGx5UXVhbGlmaWVkTmFtZShhbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRpZiAoIXRhcmdldEVudGl0eVR5cGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgRW50aXR5IFR5cGUgZm9yIFwiICsgYW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRhcmdldEVudGl0eVR5cGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIG1hbmlmZXN0IHNldHRpbmdzIGRlZmluZWQgZm9yIGEgc3BlY2lmaWMgY29udHJvbCB3aXRoaW4gY29udHJvbENvbmZpZ3VyYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB2QW5ub3RhdGlvblBhdGggVGhlIGFubm90YXRpb24gcGF0aCBvciBvYmplY3QgdG8gZXZhbHVhdGVcblx0ICogQHJldHVybnMgVGhlIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyBhbm50b2F0aW9uIHBhdGggaWYgaXQgZXhpc3RzXG5cdCAqL1xuXHRnZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZBbm5vdGF0aW9uUGF0aDogc3RyaW5nIHwgQW5ub3RhdGlvblRlcm08YW55Pik6IGFueSB7XG5cdFx0aWYgKGlzQW5ub3RhdGlvblRlcm0odkFubm90YXRpb25QYXRoKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMubWFuaWZlc3RXcmFwcGVyLmdldENvbnRyb2xDb25maWd1cmF0aW9uKFxuXHRcdFx0XHR2QW5ub3RhdGlvblBhdGguZnVsbHlRdWFsaWZpZWROYW1lLnJlcGxhY2UodGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBcIlwiKVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMubWFuaWZlc3RXcmFwcGVyLmdldENvbnRyb2xDb25maWd1cmF0aW9uKHZBbm5vdGF0aW9uUGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIGFic29sdXRlIGFubm90YXRpb24gcGF0aCBiYXNlZCBvbiB0aGUgY3VycmVudCBtZXRhIG1vZGVsIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzQW5ub3RhdGlvblBhdGggVGhlIHJlbGF0aXZlIGFubm90YXRpb24gcGF0aFxuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVjdCBhbm5vdGF0aW9uIHBhdGggYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHQgKi9cblx0Z2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChzQW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0aWYgKCFzQW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdHJldHVybiBzQW5ub3RhdGlvblBhdGg7XG5cdFx0fVxuXHRcdGlmIChzQW5ub3RhdGlvblBhdGhbMF0gPT09IFwiL1wiKSB7XG5cdFx0XHRyZXR1cm4gc0Fubm90YXRpb25QYXRoO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5iYXNlQ29udGV4dFBhdGggKyBcIi9cIiArIHNBbm5vdGF0aW9uUGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBlbnRpdHlTZXQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEVudGl0eVNldCBpZiBpdCBleGlzdHMuXG5cdCAqL1xuXHRnZXRFbnRpdHlTZXQoKTogRW50aXR5U2V0IHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY29udGV4dCBwYXRoLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSBjb252ZXJ0ZXIuXG5cdCAqL1xuXHRnZXRDb250ZXh0UGF0aCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmJhc2VDb250ZXh0UGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBkYXRhIG1vZGVsIG9iamVjdCBwYXRoLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBkYXRhIG1vZGVsIG9iamVjdCBwYXRoXG5cdCAqL1xuXHRnZXREYXRhTW9kZWxPYmplY3RQYXRoKCk6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRcdHJldHVybiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGg7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBFbnRpdHlDb250YWluZXIuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHNlcnZpY2UgRW50aXR5Q29udGFpbmVyXG5cdCAqL1xuXHRnZXRFbnRpdHlDb250YWluZXIoKTogRW50aXR5Q29udGFpbmVyIHtcblx0XHRyZXR1cm4gdGhpcy5jb252ZXJ0ZWRUeXBlcy5lbnRpdHlDb250YWluZXI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBFbnRpdHlUeXBlIGJhc2VkIG9uIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgRW50aXR5VHlwZS5cblx0ICovXG5cdGdldEVudGl0eVR5cGUoKTogRW50aXR5VHlwZSB7XG5cdFx0cmV0dXJuIHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgYSBzaW5nbGV0b24gYmFzZWQgb24gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2luZ2xldG9uXG5cdCAqIEByZXR1cm5zIHtTaW5nbGV0b24gfCB1bmRlZmluZWR9IFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuXG5cdCAqL1xuXHRnZXRTaW5nbGV0b24oZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBTaW5nbGV0b24gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmNvbnZlcnRlZFR5cGVzLnNpbmdsZXRvbnMuZmluZChzaW5nbGV0b24gPT4gc2luZ2xldG9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIGluIGNhc2Ugb2YgYSBwYXJhbWV0ZXJpemVkIHNlcnZpY2UuXG5cdCAqIEByZXR1cm5zIHtFbnRpdHlUeXBlfSBUaGUgZW50aXR5IHR5cGUgb2YgdGhlIHBhcmFtZXRlclxuXHQgKi9cblx0Z2V0UGFyYW1ldGVyRW50aXR5VHlwZSgpOiBFbnRpdHlUeXBlIHtcblx0XHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdFx0Y29uc3QgaXNQYXJhbWV0ZXJpemVkID0gISFwYXJhbWV0ZXJFbnRpdHlUeXBlLmFubm90YXRpb25zPy5Db21tb24/LlJlc3VsdENvbnRleHQ7XG5cdFx0cmV0dXJuIChpc1BhcmFtZXRlcml6ZWQgJiYgcGFyYW1ldGVyRW50aXR5VHlwZSkgYXMgRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgYW4gYW5ub3RhdGlvbiBmcm9tIGFuIGVudGl0eSB0eXBlIGJhc2VkIG9uIGFubm90YXRpb24gcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIGFubm90YXRpb25QYXRoIFRoZSBhbm5vdGF0aW9uIHBhdGggdG8gYmUgZXZhbHVhdGVkXG5cdCAqIEByZXR1cm5zIFRoZSB0YXJnZXQgYW5ub3RhdGlvbiBwYXRoIGFzIHdlbGwgYXMgYSBjb252ZXJ0ZXIgY29udGV4dCB0byBnbyB3aXRoIGl0XG5cdCAqL1xuXHRnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihhbm5vdGF0aW9uUGF0aDogc3RyaW5nKTogUmVzb2x2ZWRBbm5vdGF0aW9uQ29udGV4dCB7XG5cdFx0aWYgKGFubm90YXRpb25QYXRoLmluZGV4T2YoXCJAXCIpID09PSAtMSkge1xuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBcIkBcIiArIGFubm90YXRpb25QYXRoO1xuXHRcdH1cblx0XHRjb25zdCB0YXJnZXRPYmplY3Q6IFJlc29sdmVkVGFyZ2V0ID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgoYW5ub3RhdGlvblBhdGgsIHRydWUpO1xuXG5cdFx0bGV0IHJvb3RFbnRpdHlTZXQgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0O1xuXHRcdGxldCBjdXJyZW50RW50aXR5VHlwZSA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IHN0YXJ0aW5nRW50aXR5VHlwZSA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmNvbmNhdCgpO1xuXHRcdGxldCBpID0gMTtcblx0XHRsZXQgY3VycmVudE9iamVjdDtcblx0XHRsZXQgbmF2aWdhdGVkUGF0aHMgPSBbXTtcblx0XHRjb25zdCB2aXNpdGVkT2JqZWN0cyA9IHRhcmdldE9iamVjdC52aXNpdGVkT2JqZWN0cztcblx0XHQvLyBJbiBjYXNlIG9mIHBhcmFtZXRlcml6ZWQgc2VydmljZVxuXHRcdGlmICghcm9vdEVudGl0eVNldCAmJiBzdGFydGluZ0VudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5SZXN1bHRDb250ZXh0KSB7XG5cdFx0XHRyb290RW50aXR5U2V0ID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0O1xuXHRcdFx0dGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24obmF2T2JqZWN0KSB7XG5cdFx0XHRcdG5hdmlnYXRlZFBhdGhzLnB1c2gobmF2T2JqZWN0Lm5hbWUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHdoaWxlIChpIDwgdmlzaXRlZE9iamVjdHMubGVuZ3RoKSB7XG5cdFx0XHRjdXJyZW50T2JqZWN0ID0gdmlzaXRlZE9iamVjdHNbaSsrXTtcblx0XHRcdGlmIChjdXJyZW50T2JqZWN0Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdG5hdmlnYXRlZFBhdGhzLnB1c2goY3VycmVudE9iamVjdC5uYW1lKTtcblx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChjdXJyZW50T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSk7XG5cdFx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID0gKGN1cnJlbnRPYmplY3QgYXMgTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlO1xuXHRcdFx0XHRpZiAocm9vdEVudGl0eVNldCAmJiByb290RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkobmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIikpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbmF2UGF0aCA9IG5hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpO1xuXHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPVxuXHRcdFx0XHRcdFx0cm9vdEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW2N1cnJlbnRPYmplY3QubmFtZV0gfHwgcm9vdEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW25hdlBhdGhdO1xuXHRcdFx0XHRcdG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cm9vdEVudGl0eVNldCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRPYmplY3QuX3R5cGUgPT09IFwiRW50aXR5U2V0XCIpIHtcblx0XHRcdFx0cm9vdEVudGl0eVNldCA9IGN1cnJlbnRPYmplY3QgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IHJvb3RFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3Qgb3V0RGF0YU1vZGVsUGF0aCA9IHtcblx0XHRcdHN0YXJ0aW5nRW50aXR5U2V0OiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQsXG5cdFx0XHR0YXJnZXRFbnRpdHlTZXQ6IHJvb3RFbnRpdHlTZXQsXG5cdFx0XHR0YXJnZXRFbnRpdHlUeXBlOiBjdXJyZW50RW50aXR5VHlwZSxcblx0XHRcdHRhcmdldE9iamVjdDogbmF2aWdhdGlvblByb3BlcnRpZXNbbmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoIC0gMV0sXG5cdFx0XHRuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRcdGNvbnRleHRMb2NhdGlvbjogdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvblxuXHRcdH07XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFubm90YXRpb246IHRhcmdldE9iamVjdC50YXJnZXQgYXMgQW55QW5ub3RhdGlvbixcblx0XHRcdGNvbnZlcnRlckNvbnRleHQ6IG5ldyBDb252ZXJ0ZXJDb250ZXh0KFxuXHRcdFx0XHR0aGlzLmNvbnZlcnRlZFR5cGVzLFxuXHRcdFx0XHR0aGlzLm1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdHRoaXMuZGlhZ25vc3RpY3MsXG5cdFx0XHRcdHRoaXMubWVyZ2VGbixcblx0XHRcdFx0b3V0RGF0YU1vZGVsUGF0aFxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHR5cGUgb2YgdGVtcGxhdGUgd2UncmUgd29ya2luZyBvbiAoZS5nLiBMaXN0UmVwb3J0IC8gT2JqZWN0UGFnZSAvIC4uLikuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRlbnBsYXRlIHR5cGVcblx0ICovXG5cdGdldFRlbXBsYXRlVHlwZSgpOiBUZW1wbGF0ZVR5cGUge1xuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlci5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBhIHJlbGF0aXZlIGFubm90YXRpb24gcGF0aCBiZXR3ZWVuIGFuIGFubm90YXRpb24gcGF0aCBhbmQgYW4gZW50aXR5IHR5cGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uUGF0aFxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgYW5udG90YXRpb24gcGF0aC5cblx0ICovXG5cdGdldFJlbGF0aXZlQW5ub3RhdGlvblBhdGgoYW5ub3RhdGlvblBhdGg6IHN0cmluZywgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25QYXRoLnJlcGxhY2UoZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyYW5zZm9ybSBhbiBlbnRpdHlUeXBlIGJhc2VkIHBhdGggdG8gYW4gZW50aXR5U2V0IGJhc2VkIG9uZSAodWk1IHRlbXBsYXRpbmcgZ2VuZXJhbGx5IGV4cGVjdCBhbiBlbnRpdHlTZXRCYXNlZFBhdGgpLlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvblBhdGhcblx0ICogQHJldHVybnMgVGhlIEVudGl0eVNldCBiYXNlZCBhbm5vdGF0aW9uIHBhdGhcblx0ICovXG5cdGdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoYW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0aWYgKCFhbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25QYXRoO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlRlFOID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdGlmIChcblx0XHRcdHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQgfHxcblx0XHRcdCgodGhpcy5iYXNlQ29udGV4dFBhdGguc3RhcnRzV2l0aChcIi9cIikgJiYgdGhpcy5iYXNlQ29udGV4dFBhdGgubWF0Y2goL1xcLy9nKSkgfHwgW10pLmxlbmd0aCA+IDFcblx0XHQpIHtcblx0XHRcdGxldCByZXBsYWNlZEFubm90YXRpb25QYXRoID0gYW5ub3RhdGlvblBhdGgucmVwbGFjZShlbnRpdHlUeXBlRlFOLCBcIi9cIik7XG5cdFx0XHRpZiAocmVwbGFjZWRBbm5vdGF0aW9uUGF0aC5sZW5ndGggPiAyICYmIHJlcGxhY2VkQW5ub3RhdGlvblBhdGhbMF0gPT09IFwiL1wiICYmIHJlcGxhY2VkQW5ub3RhdGlvblBhdGhbMV0gPT09IFwiL1wiKSB7XG5cdFx0XHRcdHJlcGxhY2VkQW5ub3RhdGlvblBhdGggPSByZXBsYWNlZEFubm90YXRpb25QYXRoLnN1YnN0cigxKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmJhc2VDb250ZXh0UGF0aCArIChyZXBsYWNlZEFubm90YXRpb25QYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcmVwbGFjZWRBbm5vdGF0aW9uUGF0aCA6IFwiL1wiICsgcmVwbGFjZWRBbm5vdGF0aW9uUGF0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBcIi9cIiArIGFubm90YXRpb25QYXRoO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgbWFuaWZlc3Qgd3JhcHBlciBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgbWFuaWZlc3Qgd3JhcHBlclxuXHQgKi9cblx0Z2V0TWFuaWZlc3RXcmFwcGVyKCk6IE1hbmlmZXN0V3JhcHBlciB7XG5cdFx0cmV0dXJuIHRoaXMubWFuaWZlc3RXcmFwcGVyO1xuXHR9XG5cblx0Z2V0RGlhZ25vc3RpY3MoKTogSURpYWdub3N0aWNzIHtcblx0XHRyZXR1cm4gdGhpcy5kaWFnbm9zdGljcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgdGFyZ2V0IGZyb20gYW4gYWJzb2x1dGUgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggd2Ugd2FudCB0byBnZXQgdGhlIHRhcmdldFxuXHQgKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH1cblx0ICovXG5cdHJlc29sdmVBYnNvbHV0ZVBhdGg8VD4ocGF0aDogc3RyaW5nKTogUmVzb2x1dGlvblRhcmdldDxUPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGgocGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBuZXcgY29udmVydGVyIGNvbnRleHQsIHNjb3BlZCBmb3IgYSBkaWZmZXJlbnQgY29udGV4dCBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29udGV4dFBhdGggVGhlIHBhdGggd2Ugd2FudCB0byBvcmNoZXN0cmF0ZSB0aGUgY29udmVydGVyIGNvbnRleHQgYXJvdW5kXG5cdCAqIEByZXR1cm5zIHtDb252ZXJ0ZXJDb250ZXh0fVxuXHQgKi9cblx0Z2V0Q29udmVydGVyQ29udGV4dEZvcjxUPihjb250ZXh0UGF0aDogc3RyaW5nKTogQ29udmVydGVyQ29udGV4dCB7XG5cdFx0Y29uc3QgcmVzb2x2ZWRNZXRhUGF0aDogUmVzb2x1dGlvblRhcmdldDxUPiA9IHRoaXMuY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGgoY29udGV4dFBhdGgpO1xuXHRcdGNvbnN0IHRhcmdldFBhdGggPSBnZXREYXRhTW9kZWxQYXRoRm9yRW50aXR5U2V0KHJlc29sdmVkTWV0YVBhdGgpO1xuXHRcdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dCh0aGlzLmNvbnZlcnRlZFR5cGVzLCB0aGlzLm1hbmlmZXN0U2V0dGluZ3MsIHRoaXMuZGlhZ25vc3RpY3MsIHRoaXMubWVyZ2VGbiwgdGFyZ2V0UGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFsbCBhbm5vdGF0aW9ucyBvZiBhIGdpdmVuIHRlcm0gYW5kIHZvY2FidWxhcnkgb24gYW4gZW50aXR5IHR5cGVcblx0ICogKG9yIG9uIHRoZSBjdXJyZW50IGVudGl0eSB0eXBlIGlmIGVudGl0eVR5cGUgaXNuJ3Qgc3BlY2lmaWVkKS5cblx0ICpcblx0ICogQHBhcmFtIHZvY2FidWxhcnlOYW1lXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uVGVybVxuXHQgKiBAcGFyYW0gW2Fubm90YXRpb25Tb3VyY2VzXVxuXHQgKiBAcmV0dXJucyBBbGwgdGhlIGFubm90YXRpb24gZm9yIGEgc3BlY2lmaWMgdGVybSBhbmQgdm9jYWJ1bGFyeSBmcm9tIGFuIGVudGl0eSB0eXBlXG5cdCAqL1xuXHRnZXRBbm5vdGF0aW9uc0J5VGVybShcblx0XHR2b2NhYnVsYXJ5TmFtZToga2V5b2YgRW50aXR5VHlwZUFubm90YXRpb25zLFxuXHRcdGFubm90YXRpb25UZXJtOiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvblNvdXJjZXM6IChTZXJ2aWNlT2JqZWN0IHwgdW5kZWZpbmVkKVtdID0gW3RoaXMuZ2V0RW50aXR5VHlwZSgpXVxuXHQpOiBBbm5vdGF0aW9uVGVybTxhbnk+W10ge1xuXHRcdGxldCBvdXRBbm5vdGF0aW9uczogQW5ub3RhdGlvblRlcm08YW55PltdID0gW107XG5cdFx0YW5ub3RhdGlvblNvdXJjZXMuZm9yRWFjaChhbm5vdGF0aW9uU291cmNlID0+IHtcblx0XHRcdGlmIChhbm5vdGF0aW9uU291cmNlKSB7XG5cdFx0XHRcdGNvbnN0IGFubm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBBbm5vdGF0aW9uVGVybTxhbnk+PiA9IGFubm90YXRpb25Tb3VyY2U/LmFubm90YXRpb25zW3ZvY2FidWxhcnlOYW1lXSB8fCB7fTtcblx0XHRcdFx0aWYgKGFubm90YXRpb25zKSB7XG5cdFx0XHRcdFx0b3V0QW5ub3RhdGlvbnMgPSBPYmplY3Qua2V5cyhhbm5vdGF0aW9ucylcblx0XHRcdFx0XHRcdC5maWx0ZXIoYW5ub3RhdGlvbiA9PiBhbm5vdGF0aW9uc1thbm5vdGF0aW9uXS50ZXJtID09PSBhbm5vdGF0aW9uVGVybSlcblx0XHRcdFx0XHRcdC5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IEFubm90YXRpb25UZXJtPGFueT5bXSwga2V5OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdFx0cHJldmlvdXNWYWx1ZS5wdXNoKGFubm90YXRpb25zW2tleV0pO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJldmlvdXNWYWx1ZTtcblx0XHRcdFx0XHRcdH0sIG91dEFubm90YXRpb25zKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBvdXRBbm5vdGF0aW9ucztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHJlbGF0aXZlIG1vZGVsIHBhdGggYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGV4dCBwYXRoLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gVGhlIHJlbGF0aXZlIG1vZGVsIHBhdGggb3IgdW5kZWZpbmVkIGlmIHRoZSBwYXRoIGlzIG5vdCByZXNvbHZlYWJsZVxuXHQgKi9cblx0Z2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbigpOiBGdW5jdGlvbiB7XG5cdFx0Y29uc3QgdGFyZ2V0RGF0YU1vZGVsUGF0aCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aDtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0Y29uc3QgZW5oYW5jZWRQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgodGFyZ2V0RGF0YU1vZGVsUGF0aCwgc1BhdGgpO1xuXHRcdFx0cmV0dXJuIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgoZW5oYW5jZWRQYXRoLCB0cnVlKTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgY29udmVydGVyIGNvbnRleHQgbmVjZXNzYXJ5IGZvciBhIG1hY3JvIGJhc2VkIG9uIGEgbWV0YW1vZGVsIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBzRW50aXR5U2V0TmFtZVxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIGRpYWdub3N0aWNzXG5cdCAqIEBwYXJhbSBtZXJnZUZuXG5cdCAqIEBwYXJhbSB0YXJnZXREYXRhTW9kZWxQYXRoXG5cdCAqIEBwYXJhbSBtYW5pZmVzdFNldHRpbmdzXG5cdCAqIEByZXR1cm5zIHtDb252ZXJ0ZXJDb250ZXh0fSBUaGUgY3VycmVudCBjb252ZXJ0ZXIgY29udGV4dFxuXHQgKi9cblx0c3RhdGljIGNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyhcblx0XHRzRW50aXR5U2V0TmFtZTogc3RyaW5nLFxuXHRcdG9NZXRhTW9kZWxDb250ZXh0OiBDb250ZXh0IHwgT0RhdGFNZXRhTW9kZWwsXG5cdFx0ZGlhZ25vc3RpY3M6IElEaWFnbm9zdGljcyxcblx0XHRtZXJnZUZuOiBGdW5jdGlvbixcblx0XHR0YXJnZXREYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRcdG1hbmlmZXN0U2V0dGluZ3M6IEJhc2VNYW5pZmVzdFNldHRpbmdzID0ge30gYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3Ncblx0KTogQ29udmVydGVyQ29udGV4dCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvTWV0YU1vZGVsQ29udGV4dC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdD8gKG9NZXRhTW9kZWxDb250ZXh0IGFzIE9EYXRhTWV0YU1vZGVsKVxuXHRcdFx0OiAoKG9NZXRhTW9kZWxDb250ZXh0IGFzIENvbnRleHQpLmdldE1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdGNvbnN0IG9Db252ZXJ0ZXJPdXRwdXQgPSBjb252ZXJ0VHlwZXMob01ldGFNb2RlbCk7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5U2V0ID0gb0NvbnZlcnRlck91dHB1dC5lbnRpdHlTZXRzLmZpbmQoZW50aXR5U2V0ID0+IGVudGl0eVNldC5uYW1lID09PSBzRW50aXR5U2V0TmFtZSkgYXMgRW50aXR5U2V0O1xuXHRcdGlmICghdGFyZ2V0RGF0YU1vZGVsUGF0aCkge1xuXHRcdFx0dGFyZ2V0RGF0YU1vZGVsUGF0aCA9IHtcblx0XHRcdFx0c3RhcnRpbmdFbnRpdHlTZXQ6IHRhcmdldEVudGl0eVNldCxcblx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdFx0XHR0YXJnZXRFbnRpdHlTZXQ6IHRhcmdldEVudGl0eVNldCxcblx0XHRcdFx0dGFyZ2V0RW50aXR5VHlwZTogdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0XHRcdHRhcmdldE9iamVjdDogdGFyZ2V0RW50aXR5U2V0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQob0NvbnZlcnRlck91dHB1dCwgbWFuaWZlc3RTZXR0aW5ncywgZGlhZ25vc3RpY3MsIG1lcmdlRm4sIHRhcmdldERhdGFNb2RlbFBhdGgpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbnZlcnRlckNvbnRleHQ7XG4iXX0=
|
|
495
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnZlcnRlckNvbnRleHQudHMiXSwibmFtZXMiOlsiaXNBbm5vdGF0aW9uVGVybSIsInZBbm5vdGF0aW9uUGF0aCIsImlzU2VydmljZU9iamVjdCIsIm9iamVjdFBhcnQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldERhdGFNb2RlbFBhdGhGb3JFbnRpdHlTZXQiLCJyZXNvbHZlZE1ldGFQYXRoIiwiY29udmVydGVkVHlwZXMiLCJyb290RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVNldCIsInByZXZpb3VzRW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJuYXZpZ2F0ZWRQYXRocyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwib2JqZWN0UGF0aCIsImZvckVhY2giLCJfdHlwZSIsInB1c2giLCJuYW1lIiwidGFyZ2V0VHlwZSIsIm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJqb2luIiwidW5kZWZpbmVkIiwiZW50aXR5VHlwZSIsImRhdGFNb2RlbFBhdGgiLCJzdGFydGluZ0VudGl0eVNldCIsInRhcmdldEVudGl0eVR5cGUiLCJ0YXJnZXRFbnRpdHlTZXQiLCJjb250ZXh0TG9jYXRpb24iLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXQiLCJDb252ZXJ0ZXJDb250ZXh0IiwibWFuaWZlc3RTZXR0aW5ncyIsImRpYWdub3N0aWNzIiwibWVyZ2VGbiIsInRhcmdldERhdGFNb2RlbFBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJNYW5pZmVzdFdyYXBwZXIiLCJiYXNlQ29udGV4dFBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiX2dldEVudGl0eVR5cGVGcm9tRnVsbHlRdWFsaWZpZWROYW1lIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwic3RhcnRzV2l0aCIsInJlcGxhY2VBbm5vdGF0aW9uIiwicmVwbGFjZSIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwiYW5ub3RhdGlvbiIsImFubm90YXRpb25QYXRoIiwiRXJyb3IiLCJnZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uIiwiZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24iLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwic0Fubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0IiwiZ2V0Q29udGV4dFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RW50aXR5Q29udGFpbmVyIiwiZW50aXR5Q29udGFpbmVyIiwiZ2V0RW50aXR5VHlwZSIsImdldFBhcmFtZXRlckVudGl0eVR5cGUiLCJwYXJhbWV0ZXJFbnRpdHlUeXBlIiwiaXNQYXJhbWV0ZXJpemVkIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJSZXN1bHRDb250ZXh0IiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJpbmRleE9mIiwicmVzb2x2ZVBhdGgiLCJzdGFydGluZ0VudGl0eVR5cGUiLCJjb25jYXQiLCJpIiwiY3VycmVudE9iamVjdCIsInZpc2l0ZWRPYmplY3RzIiwibmF2T2JqZWN0IiwibGVuZ3RoIiwibmF2UGF0aCIsIm91dERhdGFNb2RlbFBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0IiwiZ2V0VGVtcGxhdGVUeXBlIiwiZ2V0Q29udmVydGVkVHlwZXMiLCJnZXRSZWxhdGl2ZUFubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImVudGl0eVR5cGVGUU4iLCJtYXRjaCIsInJlcGxhY2VkQW5ub3RhdGlvblBhdGgiLCJzdWJzdHIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXREaWFnbm9zdGljcyIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJwYXRoIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImNvbnRleHRQYXRoIiwidGFyZ2V0UGF0aCIsImdldEFubm90YXRpb25zQnlUZXJtIiwidm9jYWJ1bGFyeU5hbWUiLCJhbm5vdGF0aW9uVGVybSIsImFubm90YXRpb25Tb3VyY2VzIiwib3V0QW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uU291cmNlIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsInRlcm0iLCJyZWR1Y2UiLCJwcmV2aW91c1ZhbHVlIiwia2V5IiwiZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbiIsInNQYXRoIiwiZW5oYW5jZWRQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwiY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvIiwic0VudGl0eVNldE5hbWUiLCJvTWV0YU1vZGVsQ29udGV4dCIsIm9NZXRhTW9kZWwiLCJpc0EiLCJnZXRNb2RlbCIsIm9Db252ZXJ0ZXJPdXRwdXQiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlTZXRzIiwiZW50aXR5U2V0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUE2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUEsZ0JBQWdCLEdBQUcsVUFBU0MsZUFBVCxFQUFnRztBQUN4SCxXQUFPLE9BQU9BLGVBQVAsS0FBMkIsUUFBbEM7QUFDQSxHQUZEOztBQUlBLFdBQVNDLGVBQVQsQ0FBeUJDLFVBQXpCLEVBQThGO0FBQzdGLFdBQU9BLFVBQVUsSUFBSUEsVUFBVSxDQUFDQyxjQUFYLENBQTBCLE9BQTFCLENBQXJCO0FBQ0E7O0FBRUQsTUFBTUMsNEJBQTRCLEdBQUcsVUFDcENDLGdCQURvQyxFQUVwQ0MsY0FGb0MsRUFHZDtBQUN0QixRQUFJQyxhQUFKO0FBQ0EsUUFBSUMsZ0JBQUo7QUFDQSxRQUFJQyxpQkFBSjtBQUNBLFFBQUlDLGlCQUFKO0FBQ0EsUUFBSUMsY0FBd0IsR0FBRyxFQUEvQjtBQUNBLFFBQU1DLG9CQUEwQyxHQUFHLEVBQW5EO0FBQ0FQLElBQUFBLGdCQUFnQixDQUFDUSxVQUFqQixDQUE0QkMsT0FBNUIsQ0FBb0MsVUFBQ1osVUFBRCxFQUE0QztBQUFBOztBQUMvRSxVQUFJRCxlQUFlLENBQUNDLFVBQUQsQ0FBbkIsRUFBaUM7QUFDaEMsZ0JBQVFBLFVBQVUs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ckJjLFVBQUFBLGVBQWUsRUFBRUEsZUFISTtBQUlyQkQsVUFBQUEsZ0JBQWdCLEVBQUVDLGVBQWUsQ0FBQ0osVUFKYjtBQUtyQk0sVUFBQUEsWUFBWSxFQUFFRixlQUxPO0FBTXJCcEIsVUFBQUEsY0FBYyxFQUFFZ0g7QUFOSyxTQUF0QjtBQVFBOztBQUNELGFBQU8sSUFBSXhGLGdCQUFKLENBQXFCd0YsZ0JBQXJCLEVBQXVDdkYsZ0JBQXZDLEVBQXlEQyxXQUF6RCxFQUFzRUMsT0FBdEUsRUFBK0VDLG1CQUEvRSxDQUFQO0FBQ0EsSzs7Ozs7U0FHYUosZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25UZXJtIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBbnlBbm5vdGF0aW9uLFxuXHRDb252ZXJ0ZXJPdXRwdXQsXG5cdEVudGl0eVNldCxcblx0RW50aXR5VHlwZSxcblx0RW50aXR5Q29udGFpbmVyLFxuXHROYXZpZ2F0aW9uUHJvcGVydHksXG5cdFNlcnZpY2VPYmplY3QsXG5cdFJlc29sdXRpb25UYXJnZXQsXG5cdFNlcnZpY2VPYmplY3RBbmRBbm5vdGF0aW9uXG59IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBCYXNlTWFuaWZlc3RTZXR0aW5ncywgVGVtcGxhdGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBSZXNvbHZlZFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgSURpYWdub3N0aWNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IEVudGl0eVR5cGVBbm5vdGF0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy90eXBlcy9nZW5lcmF0ZWQvRWRtX1R5cGVzXCI7XG5pbXBvcnQgTWFuaWZlc3RXcmFwcGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0V3JhcHBlclwiO1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEFubm90YXRpb25Db250ZXh0ID0ge1xuXHRhbm5vdGF0aW9uOiBBbnlBbm5vdGF0aW9uO1xuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0O1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvYmplY3QgaXMgYW4gYW5ub3RhdGlvbiB0ZXJtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEFubm90YXRpb25UZXJtPG9iamVjdD59IHZBbm5vdGF0aW9uUGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzQW5ub3RhdGlvblRlcm0gPSBmdW5jdGlvbih2QW5ub3RhdGlvblBhdGg6IHN0cmluZyB8IEFubm90YXRpb25UZXJtPGFueT4pOiB2QW5ub3RhdGlvblBhdGggaXMgQW5ub3RhdGlvblRlcm08YW55PiB7XG5cdHJldHVybiB0eXBlb2YgdkFubm90YXRpb25QYXRoID09PSBcIm9iamVjdFwiO1xufTtcblxuZnVuY3Rpb24gaXNTZXJ2aWNlT2JqZWN0KG9iamVjdFBhcnQ6IFNlcnZpY2VPYmplY3RBbmRBbm5vdGF0aW9uKTogb2JqZWN0UGFydCBpcyBTZXJ2aWNlT2JqZWN0IHtcblx0cmV0dXJuIG9iamVjdFBhcnQgJiYgb2JqZWN0UGFydC5oYXNPd25Qcm9wZXJ0eShcIl90eXBlXCIpO1xufVxuXG5jb25zdCBnZXREYXRhTW9kZWxQYXRoRm9yRW50aXR5U2V0ID0gZnVuY3Rpb24oXG5cdHJlc29sdmVkTWV0YVBhdGg6IFJlc29sdXRpb25UYXJnZXQ8YW55Pixcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlck91dHB1dFxuKTogRGF0YU1vZGVsT2JqZWN0UGF0aCB7XG5cdGxldCByb290RW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBjdXJyZW50RW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBwcmV2aW91c0VudGl0eVNldDogRW50aXR5U2V0IHwgdW5kZWZpbmVkO1xuXHRsZXQgY3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQ7XG5cdGxldCBuYXZpZ2F0ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdHJlc29sdmVkTWV0YVBhdGgub2JqZWN0UGF0aC5mb3JFYWNoKChvYmplY3RQYXJ0OiBTZXJ2aWNlT2JqZWN0QW5kQW5ub3RhdGlvbikgPT4ge1xuXHRcdGlmIChpc1NlcnZpY2VPYmplY3Qob2JqZWN0UGFydCkpIHtcblx0XHRcdHN3aXRjaCAob2JqZWN0UGFydC5fdHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiTmF2aWdhdGlvblByb3BlcnR5XCI6XG5cdFx0XHRcdFx0bmF2aWdhdGVkUGF0aHMucHVzaChvYmplY3RQYXJ0Lm5hbWUpO1xuXHRcdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2gob2JqZWN0UGFydCk7XG5cdFx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSBvYmplY3RQYXJ0LnRhcmdldFR5cGU7XG5cdFx0XHRcdFx0aWYgKHByZXZpb3VzRW50aXR5U2V0ICYmIHByZXZpb3VzRW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkobmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIikpKSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gcHJldmlvdXNFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKV07XG5cdFx0XHRcdFx0XHRwcmV2aW91c0VudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkVudGl0eVNldFwiOlxuXHRcdFx0XHRcdGlmIChyb290RW50aXR5U2V0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSBvYmplY3RQYXJ0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gb2JqZWN0UGFydDtcblx0XHRcdFx0XHRwcmV2aW91c0VudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSBjdXJyZW50RW50aXR5U2V0Py5lbnRpdHlUeXBlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggPSB7XG5cdFx0c3RhcnRpbmdFbnRpdHlTZXQ6IHJvb3RFbnRpdHlTZXQgYXMgRW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGN1cnJlbnRFbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUsXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBjdXJyZW50RW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRjb250ZXh0TG9jYXRpb246IHVuZGVmaW5lZCxcblx0XHR0YXJnZXRPYmplY3Q6IHJlc29sdmVkTWV0YVBhdGgudGFyZ2V0LFxuXHRcdGNvbnZlcnRlZFR5cGVzOiBjb252ZXJ0ZWRUeXBlc1xuXHR9O1xuXHRkYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbiA9IGRhdGFNb2RlbFBhdGg7XG5cdHJldHVybiBkYXRhTW9kZWxQYXRoO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBDb252ZXJ0ZXJDb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoaW4gdGhlIGNvbnZlcnRlcnMuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJPdXRwdXR9IG9Db252ZXJ0ZWRUeXBlcyBUaGUgY29udmVydGVkIGFubm90YXRpb24gYW5kIHNlcnZpY2UgdHlwZXNcbiAqIEBwYXJhbSB7QmFzZU1hbmlmZXN0U2V0dGluZ3N9IG9NYW5pZmVzdFNldHRpbmdzIFRoZSBtYW5pZmVzdFNldHRpbmdzIHRoYXQgYXBwbGllcyB0byB0aGlzIHBhZ2VcbiAqIEBwYXJhbSB7VGVtcGxhdGVUeXBlfSB0ZW1wbGF0ZVR5cGUgVGhlIHR5cGUgb2YgdGVtcGxhdGUgd2UncmUgbG9va2luZyBhdCByaWdodCBub3dcbiAqIEBwYXJhbSB7SVNoZWxsU2VydmljZXNQcm94eX0gc2hlbGxTZXJ2aWNlcyBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgc2hlbGxzZXJ2aWNlXG4gKiBAcGFyYW0ge0lEaWFnbm9zdGljc30gZGlhZ25vc3RpY3MgVGhlIGRpYWdub3N0aWNzIHNoaW1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRm4gVGhlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gcGVyZm9tIHNvbWUgZGVlcCBtZXJnZXMgYmV0d2VlbiBvYmplY3RcbiAqIEBwYXJhbSB7RGF0YU1vZGVsT2JqZWN0UGF0aH0gdGFyZ2V0RGF0YU1vZGVsUGF0aCBUaGUgZ2xvYmFsIHBhdGggdG8gcmVhY2ggdGhlIGVudGl0eVNldFxuICpcbiAqIEByZXR1cm5zIHtDb252ZXJ0ZXJDb250ZXh0fSBBIGNvbnZlcnRlciBjb250ZXh0IGZvciB0aGUgY29udmVydGVyc1xuICovXG5jbGFzcyBDb252ZXJ0ZXJDb250ZXh0IHtcblx0cHJpdmF0ZSBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlcjtcblx0cHJpdmF0ZSBiYXNlQ29udGV4dFBhdGg6IHN0cmluZztcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZXJPdXRwdXQsXG5cdFx0cHJpdmF0ZSBtYW5pZmVzdFNldHRpbmdzOiBCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0XHRwcml2YXRlIGRpYWdub3N0aWNzOiBJRGlhZ25vc3RpY3MsXG5cdFx0cHJpdmF0ZSBtZXJnZUZuOiBGdW5jdGlvbixcblx0XHRwcml2YXRlIHRhcmdldERhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcblx0KSB7XG5cdFx0dGhpcy5tYW5pZmVzdFdyYXBwZXIgPSBuZXcgTWFuaWZlc3RXcmFwcGVyKHRoaXMubWFuaWZlc3RTZXR0aW5ncywgbWVyZ2VGbik7XG5cdFx0dGhpcy5iYXNlQ29udGV4dFBhdGggPSBnZXRUYXJnZXRPYmplY3RQYXRoKHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyB7UHJvcGVydHl9IFRoZSBwcm9wZXJ0eSBFbnRpdHlUeXBlIGJhc2VkXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRFbnRpdHlUeXBlRnJvbUZ1bGx5UXVhbGlmaWVkTmFtZShmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZyk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSB0aGlzLmNvbnZlcnRlZFR5cGVzLmVudGl0eVR5cGVzLmZpbmQoZW50aXR5VHlwZSA9PiB7XG5cdFx0XHRpZiAoZnVsbHlRdWFsaWZpZWROYW1lLnN0YXJ0c1dpdGgoZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUpKSB7XG5cdFx0XHRcdGNvbnN0IHJlcGxhY2VBbm5vdGF0aW9uID0gZnVsbHlRdWFsaWZpZWROYW1lLnJlcGxhY2UoZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIFwiXCIpO1xuXHRcdFx0XHRyZXR1cm4gcmVwbGFjZUFubm90YXRpb24uc3RhcnRzV2l0aChcIi9cIikgfHwgcmVwbGFjZUFubm90YXRpb24uc3RhcnRzV2l0aChcIkBcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRhcmdldEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIGVudGl0eVR5cGUgYXNzb2NpYXRlZCB3aXRoIGFuIGFubm90YXRpb24gb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbiBvYmplY3QgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCB0aGUgZW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyB7RW50aXR5VHlwZX0gVGhlIEVudGl0eVR5cGUgdGhlIGFubm90YXRpb24gcmVmZXJzIHRvXG5cdCAqL1xuXHRnZXRBbm5vdGF0aW9uRW50aXR5VHlwZShhbm5vdGF0aW9uPzogQW5ub3RhdGlvblRlcm08YW55Pik6IEVudGl0eVR5cGUge1xuXHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aCA9IGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRnVsbHlRdWFsaWZpZWROYW1lKGFubm90YXRpb25QYXRoKTtcblx0XHRcdGlmICghdGFyZ2V0RW50aXR5VHlwZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBFbnRpdHkgVHlwZSBmb3IgXCIgKyBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0RW50aXR5VHlwZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgbWFuaWZlc3Qgc2V0dGluZ3MgZGVmaW5lZCBmb3IgYSBzcGVjaWZpYyBjb250cm9sIHdpdGhpbiBjb250cm9sQ29uZmlndXJhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHZBbm5vdGF0aW9uUGF0aCBUaGUgYW5ub3RhdGlvbiBwYXRoIG9yIG9iamVjdCB0byBldmFsdWF0ZVxuXHQgKiBAcmV0dXJucyBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHNwZWNpZmljIGFubnRvYXRpb24gcGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odkFubm90YXRpb25QYXRoOiBzdHJpbmcgfCBBbm5vdGF0aW9uVGVybTxhbnk+KTogYW55IHtcblx0XHRpZiAoaXNBbm5vdGF0aW9uVGVybSh2QW5ub3RhdGlvblBhdGgpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5tYW5pZmVzdFdyYXBwZXIuZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24oXG5cdFx0XHRcdHZBbm5vdGF0aW9uUGF0aC5mdWxseVF1YWxpZmllZE5hbWUucmVwbGFjZSh0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIFwiXCIpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5tYW5pZmVzdFdyYXBwZXIuZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24odkFubm90YXRpb25QYXRoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYW4gYWJzb2x1dGUgYW5ub3RhdGlvbiBwYXRoIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1ldGEgbW9kZWwgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHNBbm5vdGF0aW9uUGF0aCBUaGUgcmVsYXRpdmUgYW5ub3RhdGlvbiBwYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBjb3JyZWN0IGFubm90YXRpb24gcGF0aCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdCAqL1xuXHRnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKHNBbm5vdGF0aW9uUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRpZiAoIXNBbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0cmV0dXJuIHNBbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0aWYgKHNBbm5vdGF0aW9uUGF0aFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdHJldHVybiBzQW5ub3RhdGlvblBhdGg7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmJhc2VDb250ZXh0UGF0aCArIFwiL1wiICsgc0Fubm90YXRpb25QYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGVudGl0eVNldC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgRW50aXR5U2V0IGlmIGl0IGV4aXN0cy5cblx0ICovXG5cdGdldEVudGl0eVNldCgpOiBFbnRpdHlTZXQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBjb250ZXh0IHBhdGguXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGNvbnZlcnRlci5cblx0ICovXG5cdGdldENvbnRleHRQYXRoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZUNvbnRleHRQYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGRhdGEgbW9kZWwgb2JqZWN0IHBhdGguXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGRhdGEgbW9kZWwgb2JqZWN0IHBhdGhcblx0ICovXG5cdGdldERhdGFNb2RlbE9iamVjdFBhdGgoKTogRGF0YU1vZGVsT2JqZWN0UGF0aCB7XG5cdFx0cmV0dXJuIHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEVudGl0eUNvbnRhaW5lci5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2VydmljZSBFbnRpdHlDb250YWluZXJcblx0ICovXG5cdGdldEVudGl0eUNvbnRhaW5lcigpOiBFbnRpdHlDb250YWluZXIge1xuXHRcdHJldHVybiB0aGlzLmNvbnZlcnRlZFR5cGVzLmVudGl0eUNvbnRhaW5lcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEVudGl0eVR5cGUgYmFzZWQgb24gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBFbnRpdHlUeXBlLlxuXHQgKi9cblx0Z2V0RW50aXR5VHlwZSgpOiBFbnRpdHlUeXBlIHtcblx0XHRyZXR1cm4gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgdGhlIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuXHQgKiBAcmV0dXJucyB7RW50aXR5VHlwZX0gVGhlIGVudGl0eSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXJcblx0ICovXG5cdGdldFBhcmFtZXRlckVudGl0eVR5cGUoKTogRW50aXR5VHlwZSB7XG5cdFx0Y29uc3QgcGFyYW1ldGVyRW50aXR5VHlwZSA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGlzUGFyYW1ldGVyaXplZCA9ICEhcGFyYW1ldGVyRW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHRcdHJldHVybiAoaXNQYXJhbWV0ZXJpemVkICYmIHBhcmFtZXRlckVudGl0eVR5cGUpIGFzIEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFuIGFubm90YXRpb24gZnJvbSBhbiBlbnRpdHkgdHlwZSBiYXNlZCBvbiBhbm5vdGF0aW9uIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uUGF0aCBUaGUgYW5ub3RhdGlvbiBwYXRoIHRvIGJlIGV2YWx1YXRlZFxuXHQgKiBAcmV0dXJucyBUaGUgdGFyZ2V0IGFubm90YXRpb24gcGF0aCBhcyB3ZWxsIGFzIGEgY29udmVydGVyIGNvbnRleHQgdG8gZ28gd2l0aCBpdFxuXHQgKi9cblx0Z2V0RW50aXR5VHlwZUFubm90YXRpb24oYW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IFJlc29sdmVkQW5ub3RhdGlvbkNvbnRleHQge1xuXHRcdGlmIChhbm5vdGF0aW9uUGF0aC5pbmRleE9mKFwiQFwiKSA9PT0gLTEpIHtcblx0XHRcdGFubm90YXRpb25QYXRoID0gXCJAXCIgKyBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgdGFyZ2V0T2JqZWN0OiBSZXNvbHZlZFRhcmdldCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlLnJlc29sdmVQYXRoKGFubm90YXRpb25QYXRoLCB0cnVlKTtcblxuXHRcdGxldCByb290RW50aXR5U2V0ID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldDtcblx0XHRsZXQgY3VycmVudEVudGl0eVR5cGUgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBzdGFydGluZ0VudGl0eVR5cGUgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5jb25jYXQoKTtcblx0XHRsZXQgaSA9IDE7XG5cdFx0bGV0IGN1cnJlbnRPYmplY3Q7XG5cdFx0bGV0IG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0Y29uc3QgdmlzaXRlZE9iamVjdHMgPSB0YXJnZXRPYmplY3QudmlzaXRlZE9iamVjdHM7XG5cdFx0Ly8gSW4gY2FzZSBvZiBwYXJhbWV0ZXJpemVkIHNlcnZpY2Vcblx0XHRpZiAoIXJvb3RFbnRpdHlTZXQgJiYgc3RhcnRpbmdFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uUmVzdWx0Q29udGV4dCkge1xuXHRcdFx0cm9vdEVudGl0eVNldCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldDtcblx0XHRcdHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKG5hdk9iamVjdCkge1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKG5hdk9iamVjdC5uYW1lKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR3aGlsZSAoaSA8IHZpc2l0ZWRPYmplY3RzLmxlbmd0aCkge1xuXHRcdFx0Y3VycmVudE9iamVjdCA9IHZpc2l0ZWRPYmplY3RzW2krK107XG5cdFx0XHRpZiAoY3VycmVudE9iamVjdC5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKGN1cnJlbnRPYmplY3QubmFtZSk7XG5cdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2goY3VycmVudE9iamVjdCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IChjdXJyZW50T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZTtcblx0XHRcdFx0aWYgKHJvb3RFbnRpdHlTZXQgJiYgcm9vdEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KG5hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpKSkge1xuXHRcdFx0XHRcdGNvbnN0IG5hdlBhdGggPSBuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKTtcblx0XHRcdFx0XHRyb290RW50aXR5U2V0ID1cblx0XHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tjdXJyZW50T2JqZWN0Lm5hbWVdIHx8IHJvb3RFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZQYXRoXTtcblx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50T2JqZWN0Ll90eXBlID09PSBcIkVudGl0eVNldFwiKSB7XG5cdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSBjdXJyZW50T2JqZWN0IGFzIEVudGl0eVNldDtcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSByb290RW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IG91dERhdGFNb2RlbFBhdGggPSB7XG5cdFx0XHRzdGFydGluZ0VudGl0eVNldDogdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5U2V0OiByb290RW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5VHlwZTogY3VycmVudEVudGl0eVR5cGUsXG5cdFx0XHR0YXJnZXRPYmplY3Q6IG5hdmlnYXRpb25Qcm9wZXJ0aWVzW25hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAtIDFdLFxuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMsXG5cdFx0XHRjb250ZXh0TG9jYXRpb246IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0XHRjb252ZXJ0ZWRUeXBlczogdGhpcy5jb252ZXJ0ZWRUeXBlc1xuXHRcdH07XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFubm90YXRpb246IHRhcmdldE9iamVjdC50YXJnZXQgYXMgQW55QW5ub3RhdGlvbixcblx0XHRcdGNvbnZlcnRlckNvbnRleHQ6IG5ldyBDb252ZXJ0ZXJDb250ZXh0KFxuXHRcdFx0XHR0aGlzLmNvbnZlcnRlZFR5cGVzLFxuXHRcdFx0XHR0aGlzLm1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdHRoaXMuZGlhZ25vc3RpY3MsXG5cdFx0XHRcdHRoaXMubWVyZ2VGbixcblx0XHRcdFx0b3V0RGF0YU1vZGVsUGF0aFxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHR5cGUgb2YgdGVtcGxhdGUgd2UncmUgd29ya2luZyBvbiAoZS5nLiBMaXN0UmVwb3J0IC8gT2JqZWN0UGFnZSAvIC4uLikuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRlbnBsYXRlIHR5cGVcblx0ICovXG5cdGdldFRlbXBsYXRlVHlwZSgpOiBUZW1wbGF0ZVR5cGUge1xuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlci5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY29udmVydGVkIHR5cGVzLlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBjb252ZXJ0ZWQgdHlwZXNcblx0ICovXG5cdGdldENvbnZlcnRlZFR5cGVzKCk6IENvbnZlcnRlck91dHB1dCB7XG5cdFx0cmV0dXJuIHRoaXMuY29udmVydGVkVHlwZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSByZWxhdGl2ZSBhbm5vdGF0aW9uIHBhdGggYmV0d2VlbiBhbiBhbm5vdGF0aW9uIHBhdGggYW5kIGFuIGVudGl0eSB0eXBlLlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvblBhdGhcblx0ICogQHBhcmFtIGVudGl0eVR5cGVcblx0ICogQHJldHVybnMgVGhlIHJlbGF0aXZlIGFubnRvdGF0aW9uIHBhdGguXG5cdCAqL1xuXHRnZXRSZWxhdGl2ZUFubm90YXRpb25QYXRoKGFubm90YXRpb25QYXRoOiBzdHJpbmcsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBzdHJpbmcge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uUGF0aC5yZXBsYWNlKGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBcIlwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2Zvcm0gYW4gZW50aXR5VHlwZSBiYXNlZCBwYXRoIHRvIGFuIGVudGl0eVNldCBiYXNlZCBvbmUgKHVpNSB0ZW1wbGF0aW5nIGdlbmVyYWxseSBleHBlY3QgYW4gZW50aXR5U2V0QmFzZWRQYXRoKS5cblx0ICpcblx0ICogQHBhcmFtIGFubm90YXRpb25QYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBFbnRpdHlTZXQgYmFzZWQgYW5ub3RhdGlvbiBwYXRoXG5cdCAqL1xuXHRnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGFubm90YXRpb25QYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGlmICghYW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgZW50aXR5VHlwZUZRTiA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0IHx8XG5cdFx0XHQoKHRoaXMuYmFzZUNvbnRleHRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmIHRoaXMuYmFzZUNvbnRleHRQYXRoLm1hdGNoKC9cXC8vZykpIHx8IFtdKS5sZW5ndGggPiAxXG5cdFx0KSB7XG5cdFx0XHRsZXQgcmVwbGFjZWRBbm5vdGF0aW9uUGF0aCA9IGFubm90YXRpb25QYXRoLnJlcGxhY2UoZW50aXR5VHlwZUZRTiwgXCIvXCIpO1xuXHRcdFx0aWYgKHJlcGxhY2VkQW5ub3RhdGlvblBhdGgubGVuZ3RoID4gMiAmJiByZXBsYWNlZEFubm90YXRpb25QYXRoWzBdID09PSBcIi9cIiAmJiByZXBsYWNlZEFubm90YXRpb25QYXRoWzFdID09PSBcIi9cIikge1xuXHRcdFx0XHRyZXBsYWNlZEFubm90YXRpb25QYXRoID0gcmVwbGFjZWRBbm5vdGF0aW9uUGF0aC5zdWJzdHIoMSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlQ29udGV4dFBhdGggKyAocmVwbGFjZWRBbm5vdGF0aW9uUGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHJlcGxhY2VkQW5ub3RhdGlvblBhdGggOiBcIi9cIiArIHJlcGxhY2VkQW5ub3RhdGlvblBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCIvXCIgKyBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIG1hbmlmZXN0IHdyYXBwZXIgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IG1hbmlmZXN0IHdyYXBwZXJcblx0ICovXG5cdGdldE1hbmlmZXN0V3JhcHBlcigpOiBNYW5pZmVzdFdyYXBwZXIge1xuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlcjtcblx0fVxuXG5cdGdldERpYWdub3N0aWNzKCk6IElEaWFnbm9zdGljcyB7XG5cdFx0cmV0dXJuIHRoaXMuZGlhZ25vc3RpY3M7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHRhcmdldCBmcm9tIGFuIGFic29sdXRlIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHdlIHdhbnQgdG8gZ2V0IHRoZSB0YXJnZXRcblx0ICogQHJldHVybnMge0NvbnZlcnRlckNvbnRleHR9XG5cdCAqL1xuXHRyZXNvbHZlQWJzb2x1dGVQYXRoPFQ+KHBhdGg6IHN0cmluZyk6IFJlc29sdXRpb25UYXJnZXQ8VD4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoKHBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIGEgbmV3IGNvbnZlcnRlciBjb250ZXh0LCBzY29wZWQgZm9yIGEgZGlmZmVyZW50IGNvbnRleHQgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHRQYXRoIFRoZSBwYXRoIHdlIHdhbnQgdG8gb3JjaGVzdHJhdGUgdGhlIGNvbnZlcnRlciBjb250ZXh0IGFyb3VuZFxuXHQgKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH1cblx0ICovXG5cdGdldENvbnZlcnRlckNvbnRleHRGb3I8VD4oY29udGV4dFBhdGg6IHN0cmluZyk6IENvbnZlcnRlckNvbnRleHQge1xuXHRcdGNvbnN0IHJlc29sdmVkTWV0YVBhdGg6IFJlc29sdXRpb25UYXJnZXQ8VD4gPSB0aGlzLmNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoKGNvbnRleHRQYXRoKTtcblx0XHRjb25zdCB0YXJnZXRQYXRoID0gZ2V0RGF0YU1vZGVsUGF0aEZvckVudGl0eVNldChyZXNvbHZlZE1ldGFQYXRoLCB0aGlzLmNvbnZlcnRlZFR5cGVzKTtcblx0XHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQodGhpcy5jb252ZXJ0ZWRUeXBlcywgdGhpcy5tYW5pZmVzdFNldHRpbmdzLCB0aGlzLmRpYWdub3N0aWNzLCB0aGlzLm1lcmdlRm4sIHRhcmdldFBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhbGwgYW5ub3RhdGlvbnMgb2YgYSBnaXZlbiB0ZXJtIGFuZCB2b2NhYnVsYXJ5IG9uIGFuIGVudGl0eSB0eXBlXG5cdCAqIChvciBvbiB0aGUgY3VycmVudCBlbnRpdHkgdHlwZSBpZiBlbnRpdHlUeXBlIGlzbid0IHNwZWNpZmllZCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB2b2NhYnVsYXJ5TmFtZVxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvblRlcm1cblx0ICogQHBhcmFtIFthbm5vdGF0aW9uU291cmNlc11cblx0ICogQHJldHVybnMgQWxsIHRoZSBhbm5vdGF0aW9uIGZvciBhIHNwZWNpZmljIHRlcm0gYW5kIHZvY2FidWxhcnkgZnJvbSBhbiBlbnRpdHkgdHlwZVxuXHQgKi9cblx0Z2V0QW5ub3RhdGlvbnNCeVRlcm0oXG5cdFx0dm9jYWJ1bGFyeU5hbWU6IGtleW9mIEVudGl0eVR5cGVBbm5vdGF0aW9ucyxcblx0XHRhbm5vdGF0aW9uVGVybTogc3RyaW5nLFxuXHRcdGFubm90YXRpb25Tb3VyY2VzOiAoU2VydmljZU9iamVjdCB8IHVuZGVmaW5lZClbXSA9IFt0aGlzLmdldEVudGl0eVR5cGUoKV1cblx0KTogQW5ub3RhdGlvblRlcm08YW55PltdIHtcblx0XHRsZXQgb3V0QW5ub3RhdGlvbnM6IEFubm90YXRpb25UZXJtPGFueT5bXSA9IFtdO1xuXHRcdGFubm90YXRpb25Tb3VyY2VzLmZvckVhY2goYW5ub3RhdGlvblNvdXJjZSA9PiB7XG5cdFx0XHRpZiAoYW5ub3RhdGlvblNvdXJjZSkge1xuXHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgQW5ub3RhdGlvblRlcm08YW55Pj4gPSBhbm5vdGF0aW9uU291cmNlPy5hbm5vdGF0aW9uc1t2b2NhYnVsYXJ5TmFtZV0gfHwge307XG5cdFx0XHRcdGlmIChhbm5vdGF0aW9ucykge1xuXHRcdFx0XHRcdG91dEFubm90YXRpb25zID0gT2JqZWN0LmtleXMoYW5ub3RhdGlvbnMpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGFubm90YXRpb24gPT4gYW5ub3RhdGlvbnNbYW5ub3RhdGlvbl0udGVybSA9PT0gYW5ub3RhdGlvblRlcm0pXG5cdFx0XHRcdFx0XHQucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBBbm5vdGF0aW9uVGVybTxhbnk+W10sIGtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHByZXZpb3VzVmFsdWUucHVzaChhbm5vdGF0aW9uc1trZXldKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdFx0XHRcdFx0XHR9LCBvdXRBbm5vdGF0aW9ucyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gb3V0QW5ub3RhdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSByZWxhdGl2ZSBtb2RlbCBwYXRoIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgcGF0aC5cblx0ICpcblx0ICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFRoZSByZWxhdGl2ZSBtb2RlbCBwYXRoIG9yIHVuZGVmaW5lZCBpZiB0aGUgcGF0aCBpcyBub3QgcmVzb2x2ZWFibGVcblx0ICovXG5cdGdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24oKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHRhcmdldERhdGFNb2RlbFBhdGggPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGg7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGNvbnN0IGVuaGFuY2VkUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKHRhcmdldERhdGFNb2RlbFBhdGgsIHNQYXRoKTtcblx0XHRcdHJldHVybiBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKGVuaGFuY2VkUGF0aCwgdHJ1ZSk7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGNvbnZlcnRlciBjb250ZXh0IG5lY2Vzc2FyeSBmb3IgYSBtYWNybyBiYXNlZCBvbiBhIG1ldGFtb2RlbCBjb250ZXh0LlxuXHQgKiBAcGFyYW0gc0VudGl0eVNldE5hbWVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBkaWFnbm9zdGljc1xuXHQgKiBAcGFyYW0gbWVyZ2VGblxuXHQgKiBAcGFyYW0gdGFyZ2V0RGF0YU1vZGVsUGF0aFxuXHQgKiBAcGFyYW0gbWFuaWZlc3RTZXR0aW5nc1xuXHQgKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH0gVGhlIGN1cnJlbnQgY29udmVydGVyIGNvbnRleHRcblx0ICovXG5cdHN0YXRpYyBjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oXG5cdFx0c0VudGl0eVNldE5hbWU6IHN0cmluZyxcblx0XHRvTWV0YU1vZGVsQ29udGV4dDogQ29udGV4dCB8IE9EYXRhTWV0YU1vZGVsLFxuXHRcdGRpYWdub3N0aWNzOiBJRGlhZ25vc3RpY3MsXG5cdFx0bWVyZ2VGbjogRnVuY3Rpb24sXG5cdFx0dGFyZ2V0RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0XHRtYW5pZmVzdFNldHRpbmdzOiBCYXNlTWFuaWZlc3RTZXR0aW5ncyA9IHt9IGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzXG5cdCk6IENvbnZlcnRlckNvbnRleHQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gb01ldGFNb2RlbENvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsXCIpXG5cdFx0XHQ/IChvTWV0YU1vZGVsQ29udGV4dCBhcyBPRGF0YU1ldGFNb2RlbClcblx0XHRcdDogKChvTWV0YU1vZGVsQ29udGV4dCBhcyBDb250ZXh0KS5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHRjb25zdCBvQ29udmVydGVyT3V0cHV0ID0gY29udmVydFR5cGVzKG9NZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVNldCA9IG9Db252ZXJ0ZXJPdXRwdXQuZW50aXR5U2V0cy5maW5kKGVudGl0eVNldCA9PiBlbnRpdHlTZXQubmFtZSA9PT0gc0VudGl0eVNldE5hbWUpIGFzIEVudGl0eVNldDtcblx0XHRpZiAoIXRhcmdldERhdGFNb2RlbFBhdGgpIHtcblx0XHRcdHRhcmdldERhdGFNb2RlbFBhdGggPSB7XG5cdFx0XHRcdHN0YXJ0aW5nRW50aXR5U2V0OiB0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHRcdFx0dGFyZ2V0RW50aXR5U2V0OiB0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRcdHRhcmdldEVudGl0eVR5cGU6IHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLFxuXHRcdFx0XHR0YXJnZXRPYmplY3Q6IHRhcmdldEVudGl0eVNldCxcblx0XHRcdFx0Y29udmVydGVkVHlwZXM6IG9Db252ZXJ0ZXJPdXRwdXRcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dChvQ29udmVydGVyT3V0cHV0LCBtYW5pZmVzdFNldHRpbmdzLCBkaWFnbm9zdGljcywgbWVyZ2VGbiwgdGFyZ2V0RGF0YU1vZGVsUGF0aCk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29udmVydGVyQ29udGV4dDtcbiJdfQ==
|