@sapui5/sap.fe.core 1.100.0 → 1.102.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/src/sap/fe/core/.library +2 -3
- package/src/sap/fe/core/AppComponent.js +23 -30
- package/src/sap/fe/core/AppComponent.ts +35 -40
- package/src/sap/fe/core/AppStateHandler.js +8 -8
- package/src/sap/fe/core/AppStateHandler.ts +11 -11
- package/src/sap/fe/core/BaseController.js +9 -9
- package/src/sap/fe/core/BaseController.ts +3 -4
- package/src/sap/fe/core/CommonUtils.js +122 -101
- package/src/sap/fe/core/CommonUtils.ts +239 -193
- package/src/sap/fe/core/ExtensionAPI.js +12 -13
- package/src/sap/fe/core/ExtensionAPI.ts +21 -31
- package/src/sap/fe/core/PageController.js +19 -13
- package/src/sap/fe/core/PageController.ts +40 -34
- package/src/sap/fe/core/TemplateComponent.js +198 -123
- package/src/sap/fe/core/TemplateComponent.ts +109 -121
- package/src/sap/fe/core/TemplateModel.js +7 -9
- package/src/sap/fe/core/TemplateModel.ts +3 -3
- 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 +935 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -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/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
- package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
- package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
- package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
- package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
- package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
- package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
- package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
- package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +34 -16
- package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
- package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
- package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
- package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
- package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
- package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
- package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
- 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 +50 -16
- package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
- package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
- package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
- package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
- package/src/sap/fe/core/controls/FileWrapper.js +360 -0
- package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
- package/src/sap/fe/core/controls/FilterBar.js +154 -119
- package/src/sap/fe/core/controls/FilterBar.ts +128 -123
- package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
- package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
- package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
- package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
- package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
- package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
- package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
- package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
- package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
- package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
- package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
- package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
- package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
- package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
- package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
- 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 +30 -25
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
- package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
- 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 +27 -24
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
- 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 +74 -13
- package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
- 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 +46 -17
- package/src/sap/fe/core/fpm/Component.ts +11 -16
- package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
- package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
- package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
- package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
- package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
- package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
- package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
- package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
- 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 +3 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -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 +5 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
- package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
- package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
- 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 +13 -5
- package/src/sap/fe/core/library.ts +26 -17
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
- package/src/sap/fe/core/messagebundle.properties +135 -180
- package/src/sap/fe/core/messagebundle_ar.properties +31 -64
- package/src/sap/fe/core/messagebundle_bg.properties +31 -64
- package/src/sap/fe/core/messagebundle_ca.properties +31 -64
- package/src/sap/fe/core/messagebundle_cs.properties +31 -64
- package/src/sap/fe/core/messagebundle_cy.properties +32 -65
- package/src/sap/fe/core/messagebundle_da.properties +31 -64
- package/src/sap/fe/core/messagebundle_de.properties +29 -62
- package/src/sap/fe/core/messagebundle_el.properties +32 -65
- package/src/sap/fe/core/messagebundle_en.properties +32 -65
- package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
- package/src/sap/fe/core/messagebundle_es.properties +31 -64
- package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
- package/src/sap/fe/core/messagebundle_et.properties +31 -64
- package/src/sap/fe/core/messagebundle_fi.properties +29 -62
- package/src/sap/fe/core/messagebundle_fr.properties +36 -69
- package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
- package/src/sap/fe/core/messagebundle_hi.properties +29 -62
- package/src/sap/fe/core/messagebundle_hr.properties +32 -65
- package/src/sap/fe/core/messagebundle_hu.properties +30 -63
- package/src/sap/fe/core/messagebundle_id.properties +32 -65
- package/src/sap/fe/core/messagebundle_it.properties +31 -64
- package/src/sap/fe/core/messagebundle_iw.properties +31 -64
- package/src/sap/fe/core/messagebundle_ja.properties +29 -62
- package/src/sap/fe/core/messagebundle_kk.properties +31 -64
- package/src/sap/fe/core/messagebundle_ko.properties +31 -64
- package/src/sap/fe/core/messagebundle_lt.properties +31 -64
- package/src/sap/fe/core/messagebundle_lv.properties +32 -65
- package/src/sap/fe/core/messagebundle_ms.properties +31 -64
- package/src/sap/fe/core/messagebundle_nl.properties +31 -64
- package/src/sap/fe/core/messagebundle_no.properties +31 -64
- package/src/sap/fe/core/messagebundle_pl.properties +34 -67
- package/src/sap/fe/core/messagebundle_pt.properties +32 -65
- package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
- package/src/sap/fe/core/messagebundle_ro.properties +33 -66
- package/src/sap/fe/core/messagebundle_ru.properties +33 -66
- package/src/sap/fe/core/messagebundle_sh.properties +31 -64
- package/src/sap/fe/core/messagebundle_sk.properties +31 -64
- package/src/sap/fe/core/messagebundle_sl.properties +29 -62
- package/src/sap/fe/core/messagebundle_sv.properties +30 -63
- package/src/sap/fe/core/messagebundle_th.properties +31 -64
- package/src/sap/fe/core/messagebundle_tr.properties +31 -64
- package/src/sap/fe/core/messagebundle_uk.properties +32 -65
- package/src/sap/fe/core/messagebundle_vi.properties +31 -64
- package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
- package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
- package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
- package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
- package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +0 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
- package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
- package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
- package/src/sap/fe/core/templating/FilterHelper.js +4 -4
- package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
- package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
- package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
- package/src/sap/fe/core/templating/UIFormatters.js +133 -22
- package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
- 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/AnnotationHelper.js +0 -312
- package/src/sap/fe/core/AnnotationHelper.ts +0 -315
- package/src/sap/fe/core/RouterProxy.js +0 -926
- package/src/sap/fe/core/TransactionHelper.js +0 -1562
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
- package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
- package/src/sap/fe/core/actions/draft.js +0 -523
- package/src/sap/fe/core/actions/messageHandling.js +0 -567
- package/src/sap/fe/core/actions/nonDraft.js +0 -20
- package/src/sap/fe/core/actions/nonDraft.ts +0 -12
- package/src/sap/fe/core/actions/operations.js +0 -1096
- package/src/sap/fe/core/actions/sticky.js +0 -130
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
|
@@ -2,18 +2,26 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldTemplating", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/mdc/enum/EditMode", "sap/ui/model/json/JSONModel", "../controls/Any", "../converters/MetaModelConverter", "../templating/FieldControlHelper", "../templating/UIFormatters"], function (Log, CommonUtils, FELibrary, DataModelPathHelper, PropertyHelper, FieldTemplating, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
var
|
|
9
|
-
var isReadOnlyExpression = FieldControlHelper.isReadOnlyExpression;
|
|
8
|
+
var isCollectionField = UIFormatters.isCollectionField;
|
|
10
9
|
var getRequiredExpression = UIFormatters.getRequiredExpression;
|
|
11
|
-
var
|
|
12
|
-
var
|
|
10
|
+
var getEditMode = UIFormatters.getEditMode;
|
|
11
|
+
var isReadOnlyExpression = FieldControlHelper.isReadOnlyExpression;
|
|
13
12
|
var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
|
|
14
13
|
var convertMetaModelContext = MetaModelConverter.convertMetaModelContext;
|
|
14
|
+
var setEditStyleProperties = FieldTemplating.setEditStyleProperties;
|
|
15
|
+
var getTextBinding = FieldTemplating.getTextBinding;
|
|
16
|
+
var hasValueHelpWithFixedValues = PropertyHelper.hasValueHelpWithFixedValues;
|
|
17
|
+
var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
|
|
18
|
+
|
|
19
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
20
|
+
|
|
21
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
22
|
+
|
|
23
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
15
24
|
|
|
16
|
-
var aValidDataTypes = ["Edm.Boolean", "Edm.Byte", "Edm.Decimal", "Edm.Double", "Edm.Float", "Edm.Guid", "Edm.Int16", "Edm.Int32", "Edm.Int64", "Edm.SByte", "Edm.Single", "Edm.String"];
|
|
17
25
|
var MassEditHelper = {
|
|
18
26
|
/**
|
|
19
27
|
* Initializes the value at final or deepest level path with a blank array.
|
|
@@ -57,7 +65,7 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
57
65
|
* @returns {boolean}
|
|
58
66
|
*/
|
|
59
67
|
getUniqueValues: function (sValue, index, self) {
|
|
60
|
-
if (sValue) {
|
|
68
|
+
if (sValue != undefined && sValue != null) {
|
|
61
69
|
return self.indexOf(sValue) === index;
|
|
62
70
|
}
|
|
63
71
|
},
|
|
@@ -111,7 +119,7 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
111
119
|
} else if (aUniquePropertyValues.length === 0) {
|
|
112
120
|
return "Empty/" + sDataPropertyPath;
|
|
113
121
|
} else if (aUniquePropertyValues.length === 1) {
|
|
114
|
-
return sDataPropertyPath;
|
|
122
|
+
return sDataPropertyPath + "/" + aUniquePropertyValues[0];
|
|
115
123
|
}
|
|
116
124
|
}
|
|
117
125
|
},
|
|
@@ -132,6 +140,47 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
132
140
|
|
|
133
141
|
return hiddenValue;
|
|
134
142
|
},
|
|
143
|
+
getInputType: function (propertyInfo, dataFieldConverted, oDataModelPath) {
|
|
144
|
+
var editStyleProperties = {};
|
|
145
|
+
var inputType;
|
|
146
|
+
|
|
147
|
+
if (propertyInfo) {
|
|
148
|
+
setEditStyleProperties(editStyleProperties, dataFieldConverted, oDataModelPath, true);
|
|
149
|
+
inputType = (editStyleProperties === null || editStyleProperties === void 0 ? void 0 : editStyleProperties.editStyle) || "";
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
var isValidForMassEdit = inputType && ["DatePicker", "TimePicker", "DateTimePicker", "RatingIndicator"].indexOf(inputType) === -1 && !isCollectionField(oDataModelPath) && !hasValueHelpWithFixedValues(propertyInfo);
|
|
153
|
+
return (isValidForMassEdit || "") && inputType;
|
|
154
|
+
},
|
|
155
|
+
getIsFieldGrp: function (dataFieldConverted) {
|
|
156
|
+
return dataFieldConverted && dataFieldConverted.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataFieldConverted.Target && dataFieldConverted.Target.value && dataFieldConverted.Target.value.indexOf("FieldGroup") > -1;
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Get text path for the mass edit field.
|
|
161
|
+
*
|
|
162
|
+
* @param {string} property Property path
|
|
163
|
+
* @param {any} textBinding Text Binding Info
|
|
164
|
+
* @param {string} displayMode Display mode
|
|
165
|
+
* @returns {string | undefined} Text Property Path if it exists
|
|
166
|
+
*/
|
|
167
|
+
getTextPath: function (property, textBinding, displayMode) {
|
|
168
|
+
var descriptionPath;
|
|
169
|
+
|
|
170
|
+
if (textBinding && (textBinding.path || textBinding.parameters && textBinding.parameters.length) && property) {
|
|
171
|
+
if (textBinding.path && displayMode === "Description") {
|
|
172
|
+
descriptionPath = textBinding.path;
|
|
173
|
+
} else if (textBinding.parameters) {
|
|
174
|
+
textBinding.parameters.forEach(function (props) {
|
|
175
|
+
if (props.path && props.path !== property) {
|
|
176
|
+
descriptionPath = props.path;
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return descriptionPath;
|
|
183
|
+
},
|
|
135
184
|
|
|
136
185
|
/**
|
|
137
186
|
* Initializes a JSON Model for properties of dialog fields [label, visiblity, dataproperty, etc.].
|
|
@@ -146,6 +195,7 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
146
195
|
sCurrentEntitySetName = oTable.data("metaPath"),
|
|
147
196
|
aTableFields = MassEditHelper.getTableFields(oTable),
|
|
148
197
|
oEntityTypeContext = oMetaModel.getContext(sCurrentEntitySetName + "/@"),
|
|
198
|
+
oEntitySetContext = oMetaModel.getContext(sCurrentEntitySetName),
|
|
149
199
|
oDataModelObjectPath = getInvolvedDataModelObjects(oEntityTypeContext);
|
|
150
200
|
var oDataFieldModel = new JSONModel();
|
|
151
201
|
var oResult;
|
|
@@ -153,20 +203,17 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
153
203
|
var bValueHelpEnabled;
|
|
154
204
|
var sUnitPropertyPath;
|
|
155
205
|
var bValueHelpEnabledForUnit;
|
|
156
|
-
var bIsImmutable;
|
|
157
|
-
var bIsComputed;
|
|
158
|
-
var bChartProperty;
|
|
159
206
|
var oTextBinding;
|
|
160
|
-
var bValidDataType;
|
|
161
|
-
var bInValidInputType;
|
|
162
207
|
aTableFields.forEach(function (oColumnInfo) {
|
|
163
208
|
var sDataPropertyPath = oColumnInfo.dataProperty;
|
|
164
209
|
|
|
165
210
|
if (sDataPropertyPath) {
|
|
211
|
+
var _oDataFieldConverted$, _oDataFieldConverted$2;
|
|
212
|
+
|
|
166
213
|
var oPropertyInfo = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@");
|
|
167
214
|
bValueHelpEnabled = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
|
|
168
215
|
sUnitPropertyPath = oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.Unit"] && oPropertyInfo["@Org.OData.Measures.V1.Unit"].$Path || oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"] && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"].$Path;
|
|
169
|
-
sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"];
|
|
216
|
+
sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"] || oColumnInfo.dataProperty;
|
|
170
217
|
bValueHelpEnabledForUnit = sUnitPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
|
|
171
218
|
|
|
172
219
|
if (oDataModelObjectPath) {
|
|
@@ -181,9 +228,14 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
181
228
|
oDataFieldConverted = convertMetaModelContext(oFieldContext),
|
|
182
229
|
oPropertyContext = oMetaModel.getContext(sCurrentEntitySetName + "/" + sDataPropertyPath + "@"),
|
|
183
230
|
oInterface = oPropertyContext && oPropertyContext.getInterface();
|
|
184
|
-
|
|
185
|
-
|
|
231
|
+
var oDataModelPath = getInvolvedDataModelObjects(oFieldContext, oEntitySetContext);
|
|
232
|
+
|
|
233
|
+
if ((oDataFieldConverted === null || oDataFieldConverted === void 0 ? void 0 : (_oDataFieldConverted$ = oDataFieldConverted.Value) === null || _oDataFieldConverted$ === void 0 ? void 0 : (_oDataFieldConverted$2 = _oDataFieldConverted$.path) === null || _oDataFieldConverted$2 === void 0 ? void 0 : _oDataFieldConverted$2.length) > 0) {
|
|
234
|
+
oDataModelPath = enhanceDataModelPath(oDataModelPath, sDataPropertyPath);
|
|
235
|
+
}
|
|
236
|
+
|
|
186
237
|
var bHiddenField = MassEditHelper.getHiddenValueForContexts(oFieldContext && oFieldContext.getObject()["@com.sap.vocabularies.UI.v1.Hidden"], aContexts) || false;
|
|
238
|
+
var isImage = oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.UI.v1.IsImageURL"];
|
|
187
239
|
oInterface.context = {
|
|
188
240
|
getModel: function () {
|
|
189
241
|
return oInterface.getModel();
|
|
@@ -192,17 +244,34 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
192
244
|
return sCurrentEntitySetName + "/" + sDataPropertyPath;
|
|
193
245
|
}
|
|
194
246
|
};
|
|
195
|
-
oPropertyInfo = oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target || oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target; // Datafield is not included in the FieldControl calculation, needs to be implemented
|
|
247
|
+
oPropertyInfo = oDataFieldConverted._type === "Property" ? oDataFieldConverted : oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target || oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target; // Datafield is not included in the FieldControl calculation, needs to be implemented
|
|
248
|
+
|
|
249
|
+
var chartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
|
|
250
|
+
var isAction = !!oDataFieldConverted.Action;
|
|
251
|
+
var isFieldGrp = MassEditHelper.getIsFieldGrp(oDataFieldConverted);
|
|
252
|
+
|
|
253
|
+
if (isImage || bHiddenField || chartProperty || isAction || isFieldGrp) {
|
|
254
|
+
return;
|
|
255
|
+
} // EditMode and InputType
|
|
196
256
|
|
|
197
|
-
var isReadOnly = isReadOnlyExpression(oPropertyInfo);
|
|
198
|
-
bChartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
|
|
199
|
-
bValidDataType = oPropertyInfo && aValidDataTypes.indexOf(oPropertyInfo.type) !== -1;
|
|
200
|
-
bInValidInputType = oColumnInfo && oColumnInfo.inputType && (oColumnInfo.inputType === "sap.m.RatingIndicator" || oColumnInfo.inputType === "sap.ui.mdc.MultiValueField") || hasValueHelpWithFixedValues(oPropertyInfo);
|
|
201
257
|
|
|
202
|
-
|
|
258
|
+
var propertyForFieldControl = oPropertyInfo && oPropertyInfo.Value ? oPropertyInfo.Value : oPropertyInfo;
|
|
259
|
+
var expBinding = getEditMode(propertyForFieldControl, oDataModelPath, false, false, oDataFieldConverted, true);
|
|
260
|
+
var editModeValues = Object.keys(EditMode);
|
|
261
|
+
var editModeIsStatic = !!expBinding && editModeValues.includes(expBinding);
|
|
262
|
+
var editable = !!expBinding && (editModeIsStatic && expBinding === EditMode.Editable || !editModeIsStatic);
|
|
263
|
+
|
|
264
|
+
if (!editable) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
var inputType = MassEditHelper.getInputType(oPropertyInfo, oDataFieldConverted, oDataModelPath);
|
|
269
|
+
|
|
270
|
+
if (inputType) {
|
|
271
|
+
var isReadOnly = isReadOnlyExpression(oPropertyInfo);
|
|
272
|
+
var displayMode = CommonUtils.computeDisplayMode(oPropertyContext.getObject());
|
|
203
273
|
oResult = {
|
|
204
|
-
"label": sLabelText
|
|
205
|
-
"visible": sDataPropertyPath && !bHiddenField && !bIsImmutable && !bIsComputed && getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath),
|
|
274
|
+
"label": sLabelText,
|
|
206
275
|
"dataProperty": sDataPropertyPath,
|
|
207
276
|
"isValueHelpEnabled": bValueHelpEnabled ? bValueHelpEnabled : false,
|
|
208
277
|
"unitProperty": sUnitPropertyPath ? sUnitPropertyPath : false,
|
|
@@ -213,9 +282,14 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
213
282
|
"defaultSelectionPath": sDataPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath) : false,
|
|
214
283
|
"defaultSelectionUnitPath": sUnitPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sUnitPropertyPath) : false,
|
|
215
284
|
"entitySet": sCurrentEntitySetName,
|
|
216
|
-
"
|
|
285
|
+
"display": displayMode,
|
|
286
|
+
"descriptionPath": MassEditHelper.getTextPath(sDataPropertyPath, oTextBinding, displayMode),
|
|
217
287
|
"nullable": oPropertyInfo.nullable !== undefined ? oPropertyInfo.nullable : true,
|
|
218
|
-
"isPropertyReadOnly": isReadOnly !== undefined ? isReadOnly : false
|
|
288
|
+
"isPropertyReadOnly": isReadOnly !== undefined ? isReadOnly : false,
|
|
289
|
+
"inputType": inputType,
|
|
290
|
+
"editMode": editable ? expBinding : undefined,
|
|
291
|
+
"unitDataPath": sUnitPropertyPath && "fieldsInfo>/unitData/",
|
|
292
|
+
"valuesPath": "fieldsInfo>/values/"
|
|
219
293
|
};
|
|
220
294
|
aDataArray.push(oResult);
|
|
221
295
|
}
|
|
@@ -224,21 +298,18 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
224
298
|
oDataFieldModel.setData(aDataArray);
|
|
225
299
|
return oDataFieldModel;
|
|
226
300
|
},
|
|
227
|
-
getInputTypeForColumn: function (oColumn) {
|
|
228
|
-
return oColumn.getTemplate().getContent && oColumn.getTemplate().getContent() && oColumn.getTemplate().getContent().getContentEdit && oColumn.getTemplate().getContent().getContentEdit() && oColumn.getTemplate().getContent().getContentEdit()[0] && oColumn.getTemplate().getContent().getContentEdit()[0].getMetadata().getName();
|
|
229
|
-
},
|
|
230
301
|
getTableFields: function (oTable) {
|
|
231
302
|
var aColumns = oTable && oTable.getColumns() || [];
|
|
303
|
+
var columnsData = oTable && oTable.getParent().getTableDefinition().columns;
|
|
232
304
|
return aColumns.map(function (oColumn) {
|
|
233
305
|
var sDataProperty = oColumn && oColumn.getDataProperty(),
|
|
234
|
-
aRealtedColumnInfo =
|
|
306
|
+
aRealtedColumnInfo = columnsData && columnsData.filter(function (oColumnInfo) {
|
|
235
307
|
return oColumnInfo.name === sDataProperty && oColumnInfo.type === "Annotation";
|
|
236
308
|
});
|
|
237
309
|
return {
|
|
238
310
|
"dataProperty": sDataProperty,
|
|
239
311
|
"label": oColumn.getHeader(),
|
|
240
|
-
"annotationPath": aRealtedColumnInfo && aRealtedColumnInfo[0] && aRealtedColumnInfo[0].annotationPath
|
|
241
|
-
"inputType": MassEditHelper.getInputTypeForColumn(oColumn)
|
|
312
|
+
"annotationPath": aRealtedColumnInfo && aRealtedColumnInfo[0] && aRealtedColumnInfo[0].annotationPath
|
|
242
313
|
};
|
|
243
314
|
});
|
|
244
315
|
},
|
|
@@ -251,6 +322,7 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
251
322
|
"clearFieldValue": "< Clear Values >",
|
|
252
323
|
"massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
|
|
253
324
|
"applyButtonText": bDisplayMode ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT") : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
|
|
325
|
+
"useValueHelpValue": "< Use Value Help >",
|
|
254
326
|
"cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT")
|
|
255
327
|
};
|
|
256
328
|
},
|
|
@@ -266,13 +338,16 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
266
338
|
|
|
267
339
|
switch (sInputType) {
|
|
268
340
|
//TODO - Add for other control types as well (Radio Button, Email, Input, MDC Fields, Image etc.)
|
|
269
|
-
case "
|
|
341
|
+
case "DatePicker":
|
|
270
342
|
sResult = "Dates";
|
|
271
343
|
break;
|
|
272
344
|
|
|
273
|
-
case "
|
|
345
|
+
case "CheckBox":
|
|
274
346
|
sResult = "Settings";
|
|
275
347
|
break;
|
|
348
|
+
|
|
349
|
+
default:
|
|
350
|
+
sResult = "Values";
|
|
276
351
|
}
|
|
277
352
|
|
|
278
353
|
return sResult;
|
|
@@ -288,77 +363,205 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
288
363
|
* @param {boolean} bUOMField
|
|
289
364
|
*/
|
|
290
365
|
setDefaultValuesToDialog: function (aValues, aContexts, oDefaultValues, oPropertyInfo, bUOMField) {
|
|
291
|
-
var sPropertyPath = oPropertyInfo.dataProperty,
|
|
366
|
+
var sPropertyPath = bUOMField ? oPropertyInfo.unitProperty : oPropertyInfo.dataProperty,
|
|
292
367
|
sInputType = oPropertyInfo.inputType,
|
|
293
368
|
bPropertyRequired = oPropertyInfo.isFieldRequired;
|
|
294
|
-
var sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType);
|
|
369
|
+
var sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType);
|
|
370
|
+
aValues.defaultOptions = aValues.defaultOptions || []; //TODO - Add <<Use Value Help or control implmentation>> and related key by checking if value help is enabled for property or Unit.
|
|
295
371
|
//TODO - Add option Apply to Empty Fields only for Both Value Help and controls.
|
|
296
372
|
|
|
297
373
|
var bValueExistsForPropertyPath = aContexts.some(function (oSelectedContext) {
|
|
298
374
|
return oSelectedContext.getObject(sPropertyPath);
|
|
299
375
|
});
|
|
300
376
|
|
|
377
|
+
if (sInputType === "CheckBox") {
|
|
378
|
+
var falseEntry = {
|
|
379
|
+
text: "No",
|
|
380
|
+
key: "".concat(sPropertyPath, "/false"),
|
|
381
|
+
textInfo: {
|
|
382
|
+
value: false
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
var truthyEntry = {
|
|
386
|
+
text: "Yes",
|
|
387
|
+
key: "".concat(sPropertyPath, "/true"),
|
|
388
|
+
textInfo: {
|
|
389
|
+
value: true
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
aValues.unshift(falseEntry);
|
|
393
|
+
aValues.defaultOptions.unshift(falseEntry);
|
|
394
|
+
aValues.unshift(truthyEntry);
|
|
395
|
+
aValues.defaultOptions.unshift(truthyEntry);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
if (oPropertyInfo.isValueHelpEnabled || oPropertyInfo.isValueHelpEnabledForUnit && bUOMField) {
|
|
399
|
+
var vhdEntry = {
|
|
400
|
+
text: oDefaultValues.useValueHelpValue,
|
|
401
|
+
key: "UseValueHelpValue/" + sPropertyPath
|
|
402
|
+
};
|
|
403
|
+
aValues.unshift(vhdEntry);
|
|
404
|
+
aValues.defaultOptions.unshift(vhdEntry);
|
|
405
|
+
}
|
|
406
|
+
|
|
301
407
|
if (bValueExistsForPropertyPath) {
|
|
302
408
|
if (bPropertyRequired !== "true" && !bUOMField) {
|
|
303
|
-
|
|
409
|
+
var clearEntry = {
|
|
304
410
|
text: oDefaultValues.clearFieldValue,
|
|
305
411
|
key: "ClearFieldValue/" + sPropertyPath
|
|
306
|
-
}
|
|
412
|
+
};
|
|
413
|
+
aValues.unshift(clearEntry);
|
|
414
|
+
aValues.defaultOptions.unshift(clearEntry);
|
|
307
415
|
}
|
|
308
416
|
} else {
|
|
309
|
-
|
|
417
|
+
var emptyEntry = {
|
|
310
418
|
text: oDefaultValues.leaveBlankValue,
|
|
311
419
|
key: "Empty/" + sPropertyPath
|
|
312
|
-
}
|
|
420
|
+
};
|
|
421
|
+
aValues.unshift(emptyEntry);
|
|
422
|
+
aValues.defaultOptions.unshift(emptyEntry);
|
|
313
423
|
}
|
|
314
424
|
|
|
315
|
-
|
|
425
|
+
var keepEntry = {
|
|
316
426
|
text: oDefaultValues.keepExistingPrefix + " " + sSuffixForKeepExisting + " >",
|
|
317
427
|
key: "Default/" + sPropertyPath
|
|
318
|
-
}
|
|
428
|
+
};
|
|
429
|
+
aValues.unshift(keepEntry);
|
|
430
|
+
aValues.defaultOptions.unshift(keepEntry);
|
|
319
431
|
},
|
|
320
|
-
getTextArrangementInfo: function (sProperty, oTextBinding, sCurrentEntitySet, oSelectedContext) {
|
|
321
|
-
var oMetaModel = oSelectedContext.getModel().getMetaModel();
|
|
322
|
-
var sDisplayMode = CommonUtils.computeDisplayMode(oMetaModel.getObject(sCurrentEntitySet + "/" + sProperty + "@"));
|
|
323
|
-
var sDescriptionPath, sValue, sDescriptionValue, sFullText;
|
|
324
|
-
|
|
325
|
-
if (oTextBinding && (oTextBinding.path || oTextBinding.parameters && oTextBinding.parameters.length) && sProperty) {
|
|
326
|
-
if (oTextBinding.path) {
|
|
327
|
-
if (sDisplayMode === "Description") {
|
|
328
|
-
sValue = oSelectedContext.getObject(sProperty);
|
|
329
|
-
sDescriptionValue = oSelectedContext.getObject(oTextBinding.path);
|
|
330
|
-
sFullText = sDescriptionValue;
|
|
331
|
-
} else if (sDisplayMode === "Value") {
|
|
332
|
-
sValue = oSelectedContext.getObject(sProperty);
|
|
333
|
-
sFullText = sValue;
|
|
334
|
-
}
|
|
335
|
-
} else if (oTextBinding.parameters) {
|
|
336
|
-
oTextBinding.parameters.forEach(function (oProps) {
|
|
337
|
-
if (oProps.path && oProps.path !== sProperty) {
|
|
338
|
-
sDescriptionPath = oProps.path;
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
sValue = oSelectedContext.getObject(sProperty);
|
|
342
|
-
sDescriptionValue = oSelectedContext.getObject(sDescriptionPath);
|
|
343
432
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
433
|
+
/**
|
|
434
|
+
* Get text arrangement info for a context property.
|
|
435
|
+
*
|
|
436
|
+
* @param {string} property Property Path
|
|
437
|
+
* @param {string} descriptionPath Path to text association of the property
|
|
438
|
+
* @param {string} displayMode Display mode of the property and text association
|
|
439
|
+
* @param {Context} selectedContext Context to find the full text
|
|
440
|
+
* @returns {TextArrangementInfo}
|
|
441
|
+
*/
|
|
442
|
+
getTextArrangementInfo: function (property, descriptionPath, displayMode, selectedContext) {
|
|
443
|
+
var value = selectedContext.getObject(property),
|
|
444
|
+
descriptionValue,
|
|
445
|
+
fullText;
|
|
446
|
+
|
|
447
|
+
if (descriptionPath && property) {
|
|
448
|
+
switch (displayMode) {
|
|
449
|
+
case "Description":
|
|
450
|
+
descriptionValue = selectedContext.getObject(descriptionPath);
|
|
451
|
+
fullText = descriptionValue;
|
|
452
|
+
break;
|
|
453
|
+
|
|
454
|
+
case "Value":
|
|
455
|
+
value = selectedContext.getObject(property);
|
|
456
|
+
fullText = value;
|
|
457
|
+
break;
|
|
458
|
+
|
|
459
|
+
case "ValueDescription":
|
|
460
|
+
value = selectedContext.getObject(property);
|
|
461
|
+
descriptionValue = selectedContext.getObject(descriptionPath);
|
|
462
|
+
fullText = value + " (" + descriptionValue + ")";
|
|
463
|
+
break;
|
|
464
|
+
|
|
465
|
+
case "DescriptionValue":
|
|
466
|
+
value = selectedContext.getObject(property);
|
|
467
|
+
descriptionValue = selectedContext.getObject(descriptionPath);
|
|
468
|
+
fullText = descriptionValue + " (" + value + ")";
|
|
469
|
+
break;
|
|
470
|
+
|
|
471
|
+
default:
|
|
472
|
+
Log.info("Display Property not applicable: " + property);
|
|
473
|
+
break;
|
|
349
474
|
}
|
|
475
|
+
}
|
|
350
476
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
477
|
+
return {
|
|
478
|
+
"textArrangement": displayMode,
|
|
479
|
+
"valuePath": property,
|
|
480
|
+
"descriptionPath": descriptionPath,
|
|
481
|
+
"value": value,
|
|
482
|
+
"description": descriptionValue,
|
|
483
|
+
"fullText": fullText
|
|
484
|
+
};
|
|
485
|
+
},
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Return the visibility valuue for the ManagedObject Any.
|
|
489
|
+
*
|
|
490
|
+
* @param {AnyType} any The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
491
|
+
* @returns {boolean} Returns true if the mass edit field is editable.
|
|
492
|
+
*/
|
|
493
|
+
isEditable: function (any) {
|
|
494
|
+
var binding = any.getBinding("any");
|
|
495
|
+
var value = binding.getExternalValue();
|
|
496
|
+
return value === EditMode.Editable;
|
|
497
|
+
},
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Calculate and update the visibility of mass edit field on change of the ManagedObject Any binding.
|
|
501
|
+
*
|
|
502
|
+
* @param {JSONModel} oDialogDataModel Model to be used runtime.
|
|
503
|
+
* @param {string} dataProperty Field name.
|
|
504
|
+
*/
|
|
505
|
+
onContextEditableChange: function (oDialogDataModel, dataProperty) {
|
|
506
|
+
var objectsForVisibility = oDialogDataModel.getProperty("/values/" + dataProperty + "/objectsForVisibility") || [];
|
|
507
|
+
var editable = objectsForVisibility.some(MassEditHelper.isEditable);
|
|
508
|
+
|
|
509
|
+
if (editable) {
|
|
510
|
+
oDialogDataModel.setProperty("/values/" + dataProperty + "/visible", editable);
|
|
359
511
|
}
|
|
512
|
+
},
|
|
360
513
|
|
|
361
|
-
|
|
514
|
+
/**
|
|
515
|
+
* Update Managed Object Any for visibility of the mass edit fields.
|
|
516
|
+
*
|
|
517
|
+
* @param {AnyType} mOToUse The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
518
|
+
* @param {JSONModel} oDialogDataModel Model to be used runtime.
|
|
519
|
+
* @param {string} dataProperty Field name.
|
|
520
|
+
* @param {any} values Values of the field.
|
|
521
|
+
*/
|
|
522
|
+
updateOnContextChange: function (mOToUse, oDialogDataModel, dataProperty, values) {
|
|
523
|
+
var binding = mOToUse.getBinding("any");
|
|
524
|
+
values.objectsForVisibility = values.objectsForVisibility || [];
|
|
525
|
+
values.objectsForVisibility.push(mOToUse);
|
|
526
|
+
binding.attachChange(MassEditHelper.onContextEditableChange.bind(null, oDialogDataModel, dataProperty));
|
|
527
|
+
},
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Get bound object to calculate the visibility of contexts.
|
|
531
|
+
*
|
|
532
|
+
* @param {BindingExpression<boolean> | ExpressionOrPrimitive<boolean>} expBinding Binding String object.
|
|
533
|
+
* @param {object} context Context the binding value.
|
|
534
|
+
* @returns {AnyType} The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
535
|
+
*/
|
|
536
|
+
getBoundObject: function (expBinding, context) {
|
|
537
|
+
var mOToUse = new Any({
|
|
538
|
+
any: expBinding
|
|
539
|
+
});
|
|
540
|
+
var model = context.getModel();
|
|
541
|
+
mOToUse.setModel(model);
|
|
542
|
+
mOToUse.setBindingContext(context);
|
|
543
|
+
return mOToUse;
|
|
544
|
+
},
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Get the visibility of the field.
|
|
548
|
+
*
|
|
549
|
+
* @param {BindingExpression<boolean> | ExpressionOrPrimitive<boolean>} expBinding Binding String object.
|
|
550
|
+
* @param {JSONModel} oDialogDataModel Model to be used runtime.
|
|
551
|
+
* @param {string} dataProperty Field name.
|
|
552
|
+
* @param {any} values Values of the field.
|
|
553
|
+
* @param {object} context Context the binding value.
|
|
554
|
+
* @returns {boolean} Returns true if the mass edit field is editable.
|
|
555
|
+
*/
|
|
556
|
+
getFieldVisiblity: function (expBinding, oDialogDataModel, dataProperty, values, context) {
|
|
557
|
+
var mOToUse = MassEditHelper.getBoundObject(expBinding, context);
|
|
558
|
+
var isContextEditable = MassEditHelper.isEditable(mOToUse);
|
|
559
|
+
|
|
560
|
+
if (!isContextEditable) {
|
|
561
|
+
MassEditHelper.updateOnContextChange(mOToUse, oDialogDataModel, dataProperty, values);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
return isContextEditable;
|
|
362
565
|
},
|
|
363
566
|
|
|
364
567
|
/**
|
|
@@ -369,76 +572,146 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
369
572
|
* @param {Array} aContexts Contexts for mass edit
|
|
370
573
|
* @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
|
|
371
574
|
* @param {object} oDefaultValues Default values from i18n
|
|
575
|
+
* @param {Context} dialogContext Transient context for mass edit dialog.
|
|
372
576
|
* @returns {object}
|
|
373
577
|
*/
|
|
374
|
-
setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues) {
|
|
578
|
+
setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues, dialogContext) {
|
|
375
579
|
var aValues = [];
|
|
376
580
|
var aUnitData = [];
|
|
377
581
|
var aResults = [];
|
|
378
582
|
var aReadOnlyFieldInfo = [];
|
|
379
|
-
var
|
|
380
|
-
|
|
583
|
+
var oData = {
|
|
584
|
+
"values": aValues,
|
|
585
|
+
"unitData": aUnitData,
|
|
586
|
+
"results": aResults,
|
|
587
|
+
"readablePropertyData": aReadOnlyFieldInfo,
|
|
588
|
+
"selectedKey": undefined
|
|
589
|
+
};
|
|
590
|
+
var oDialogDataModel = new JSONModel(oData);
|
|
381
591
|
aDataArray.forEach(function (oData) {
|
|
382
592
|
var oTextInfo;
|
|
593
|
+
var sPropertyKey;
|
|
594
|
+
var sUnitPropertyName;
|
|
595
|
+
var oDistinctValueMap = {};
|
|
596
|
+
var oDistinctUnitMap = {};
|
|
383
597
|
|
|
384
598
|
if (oData.dataProperty && oData.dataProperty.indexOf("/") > -1) {
|
|
385
|
-
var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oData.dataProperty, aValues
|
|
599
|
+
var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oData.dataProperty, aValues
|
|
600
|
+
/*, dialogContext */
|
|
601
|
+
);
|
|
386
602
|
var aPropertyPaths = oData.dataProperty.split("/");
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
603
|
+
|
|
604
|
+
var _iterator = _createForOfIteratorHelper(aContexts),
|
|
605
|
+
_step;
|
|
606
|
+
|
|
607
|
+
try {
|
|
608
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
609
|
+
var context = _step.value;
|
|
610
|
+
var sMultiLevelPathValue = context.getObject(oData.dataProperty);
|
|
611
|
+
sPropertyKey = oData.dataProperty + "/" + sMultiLevelPathValue;
|
|
612
|
+
|
|
613
|
+
if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
|
|
614
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.descriptionPath, oData.display, context);
|
|
615
|
+
aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
|
|
616
|
+
"text": oTextInfo && oTextInfo.fullText || sMultiLevelPathValue,
|
|
617
|
+
"key": sPropertyKey,
|
|
618
|
+
"textInfo": oTextInfo
|
|
619
|
+
});
|
|
620
|
+
oDistinctValueMap[sPropertyKey] = sMultiLevelPathValue;
|
|
621
|
+
}
|
|
622
|
+
} // if (Object.keys(oDistinctValueMap).length === 1) {
|
|
623
|
+
// dialogContext.setProperty(oData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
|
|
624
|
+
// }
|
|
625
|
+
|
|
626
|
+
} catch (err) {
|
|
627
|
+
_iterator.e(err);
|
|
628
|
+
} finally {
|
|
629
|
+
_iterator.f();
|
|
402
630
|
}
|
|
631
|
+
|
|
632
|
+
aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].textInfo = {
|
|
633
|
+
descriptionPath: oData.descriptionPath,
|
|
634
|
+
valuePath: oData.dataProperty,
|
|
635
|
+
displayMode: oData.display
|
|
636
|
+
};
|
|
403
637
|
} else {
|
|
404
638
|
aValues[oData.dataProperty] = aValues[oData.dataProperty] || [];
|
|
639
|
+
aValues[oData.dataProperty]["selectOptions"] = aValues[oData.dataProperty]["selectOptions"] || [];
|
|
405
640
|
|
|
406
641
|
if (oData.unitProperty) {
|
|
407
642
|
aUnitData[oData.unitProperty] = aUnitData[oData.unitProperty] || [];
|
|
643
|
+
aUnitData[oData.unitProperty]["selectOptions"] = aUnitData[oData.unitProperty]["selectOptions"] || [];
|
|
408
644
|
}
|
|
409
645
|
|
|
410
|
-
|
|
411
|
-
|
|
646
|
+
var _iterator2 = _createForOfIteratorHelper(aContexts),
|
|
647
|
+
_step2;
|
|
412
648
|
|
|
413
|
-
|
|
649
|
+
try {
|
|
650
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
651
|
+
var _context = _step2.value;
|
|
414
652
|
|
|
415
|
-
|
|
416
|
-
oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.textBinding, oData.entitySet, aContexts[_i]);
|
|
417
|
-
aValues[oData.dataProperty].push({
|
|
418
|
-
"text": oTextInfo && oTextInfo.fullText || oDataObject[oData.dataProperty],
|
|
419
|
-
"key": oData.dataProperty,
|
|
420
|
-
"textInfo": oTextInfo
|
|
421
|
-
});
|
|
422
|
-
oDistinctValueMap[sPropertyName] = oDataObject[oData.dataProperty];
|
|
423
|
-
}
|
|
653
|
+
var oDataObject = _context.getObject();
|
|
424
654
|
|
|
425
|
-
|
|
426
|
-
sPropertyName = oData.unitProperty + "/" + oDataObject[oData.unitProperty];
|
|
655
|
+
sPropertyKey = oData.dataProperty + "/" + oDataObject[oData.dataProperty];
|
|
427
656
|
|
|
428
|
-
if (!oDistinctValueMap[
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
657
|
+
if (oData.dataProperty && oDataObject[oData.dataProperty] && !oDistinctValueMap[sPropertyKey]) {
|
|
658
|
+
if (oData.inputType != "CheckBox") {
|
|
659
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.descriptionPath, oData.display, _context);
|
|
660
|
+
var entry = {
|
|
661
|
+
"text": oTextInfo && oTextInfo.fullText || oDataObject[oData.dataProperty],
|
|
662
|
+
"key": sPropertyKey,
|
|
663
|
+
"textInfo": oTextInfo
|
|
664
|
+
};
|
|
665
|
+
aValues[oData.dataProperty].push(entry);
|
|
666
|
+
aValues[oData.dataProperty]["selectOptions"].push(entry);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
oDistinctValueMap[sPropertyKey] = oDataObject[oData.dataProperty];
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
if (oData.unitProperty && oDataObject[oData.unitProperty]) {
|
|
673
|
+
sUnitPropertyName = oData.unitProperty + "/" + oDataObject[oData.unitProperty];
|
|
674
|
+
|
|
675
|
+
if (!oDistinctUnitMap[sUnitPropertyName]) {
|
|
676
|
+
if (oData.inputType != "CheckBox") {
|
|
677
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oData.unitProperty, oData.descriptionPath, oData.display, _context);
|
|
678
|
+
var unitEntry = {
|
|
679
|
+
"text": oTextInfo && oTextInfo.fullText || oDataObject[oData.unitProperty],
|
|
680
|
+
"key": sUnitPropertyName,
|
|
681
|
+
"textInfo": oTextInfo
|
|
682
|
+
};
|
|
683
|
+
aUnitData[oData.unitProperty].push(unitEntry);
|
|
684
|
+
aUnitData[oData.unitProperty]["selectOptions"].push(unitEntry);
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
oDistinctUnitMap[sUnitPropertyName] = oDataObject[oData.unitProperty];
|
|
688
|
+
}
|
|
436
689
|
}
|
|
437
690
|
}
|
|
691
|
+
} catch (err) {
|
|
692
|
+
_iterator2.e(err);
|
|
693
|
+
} finally {
|
|
694
|
+
_iterator2.f();
|
|
438
695
|
}
|
|
696
|
+
|
|
697
|
+
aValues[oData.dataProperty].textInfo = {
|
|
698
|
+
descriptionPath: oData.descriptionPath,
|
|
699
|
+
valuePath: oData.dataProperty,
|
|
700
|
+
displayMode: oData.display
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
if (Object.keys(oDistinctValueMap).length === 1) {
|
|
705
|
+
dialogContext.setProperty(oData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
if (Object.keys(oDistinctUnitMap).length === 1) {
|
|
709
|
+
dialogContext.setProperty(oData.unitProperty, sUnitPropertyName && oDistinctUnitMap[sUnitPropertyName]);
|
|
439
710
|
}
|
|
440
711
|
});
|
|
441
712
|
aDataArray.forEach(function (oData) {
|
|
713
|
+
var values = {};
|
|
714
|
+
|
|
442
715
|
if (oData.dataProperty.indexOf("/") > -1) {
|
|
443
716
|
var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oData.dataProperty, aValues);
|
|
444
717
|
|
|
@@ -450,12 +723,19 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
450
723
|
} else {
|
|
451
724
|
MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, aContexts, oDefaultValues, oData);
|
|
452
725
|
}
|
|
453
|
-
|
|
726
|
+
|
|
727
|
+
values = sMultiLevelPropPathValue;
|
|
728
|
+
} else if (aValues[oData.dataProperty]) {
|
|
729
|
+
aValues[oData.dataProperty] = aValues[oData.dataProperty] || [];
|
|
454
730
|
MassEditHelper.setDefaultValuesToDialog(aValues[oData.dataProperty], aContexts, oDefaultValues, oData);
|
|
731
|
+
values = aValues[oData.dataProperty];
|
|
455
732
|
}
|
|
456
733
|
|
|
457
734
|
if (aUnitData[oData.unitProperty] && aUnitData[oData.unitProperty].length) {
|
|
458
735
|
MassEditHelper.setDefaultValuesToDialog(aUnitData[oData.unitProperty], aContexts, oDefaultValues, oData, true);
|
|
736
|
+
aUnitData[oData.unitProperty].textInfo = {};
|
|
737
|
+
aUnitData[oData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oData.unitProperty);
|
|
738
|
+
aUnitData[oData.unitProperty].inputType = oData.inputType;
|
|
459
739
|
} else if (oData.dataProperty && aValues[oData.dataProperty] && !aValues[oData.dataProperty].length || oData.unitProperty && aUnitData[oData.unitProperty] && !aUnitData[oData.unitProperty].length) {
|
|
460
740
|
var bClearFieldOrBlankValueExists = aValues[oData.dataProperty] && aValues[oData.dataProperty].some(function (obj) {
|
|
461
741
|
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
@@ -472,11 +752,17 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
472
752
|
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
473
753
|
});
|
|
474
754
|
|
|
475
|
-
if (oData.unitProperty
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
755
|
+
if (oData.unitProperty) {
|
|
756
|
+
if (!bClearFieldOrBlankUnitValueExists) {
|
|
757
|
+
aUnitData[oData.unitProperty].push({
|
|
758
|
+
text: oDefaultValues.leaveBlankValue,
|
|
759
|
+
key: "Empty/" + oData.unitProperty
|
|
760
|
+
});
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
aUnitData[oData.unitProperty].textInfo = {};
|
|
764
|
+
aUnitData[oData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oData.unitProperty);
|
|
765
|
+
aUnitData[oData.unitProperty].inputType = oData.inputType;
|
|
480
766
|
}
|
|
481
767
|
}
|
|
482
768
|
|
|
@@ -494,18 +780,54 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
494
780
|
propertyValue: oData.isPropertyReadOnly.operands[0].operand2.value,
|
|
495
781
|
type: "Path"
|
|
496
782
|
});
|
|
783
|
+
} // Setting visbility of the mass edit field.
|
|
784
|
+
|
|
785
|
+
|
|
786
|
+
if (oData.editMode) {
|
|
787
|
+
values.visible = oData.editMode === EditMode.Editable || aContexts.some(MassEditHelper.getFieldVisiblity.bind(MassEditHelper, oData.editMode, oDialogDataModel, oData.dataProperty, values));
|
|
788
|
+
} else {
|
|
789
|
+
values.visible = true;
|
|
497
790
|
}
|
|
791
|
+
|
|
792
|
+
values.selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oData.dataProperty);
|
|
793
|
+
values.inputType = oData.inputType;
|
|
794
|
+
values.unitProperty = oData.unitProperty;
|
|
498
795
|
});
|
|
499
|
-
var oData = {
|
|
500
|
-
"values": aValues,
|
|
501
|
-
"unitData": aUnitData,
|
|
502
|
-
"results": aResults,
|
|
503
|
-
"readablePropertyData": aReadOnlyFieldInfo
|
|
504
|
-
};
|
|
505
|
-
var oDialogDataModel = new JSONModel(oData);
|
|
506
796
|
return oDialogDataModel;
|
|
507
797
|
},
|
|
508
798
|
|
|
799
|
+
/**
|
|
800
|
+
* Gets transient context for dialog.
|
|
801
|
+
*
|
|
802
|
+
* @param {Table} table Instance of Table.
|
|
803
|
+
* @param {Dialog} dialog Mass Edit Dialog.
|
|
804
|
+
* @returns {object} Promise returning instance of dialog.
|
|
805
|
+
*/
|
|
806
|
+
getDialogContext: function (table, dialog) {
|
|
807
|
+
var transCtx = dialog && dialog.getBindingContext();
|
|
808
|
+
|
|
809
|
+
if (!transCtx) {
|
|
810
|
+
var model = table.getModel();
|
|
811
|
+
var listBinding = table.getRowBinding();
|
|
812
|
+
var transientListBinding = model.bindList(listBinding.getPath(), listBinding.getContext(), [], [], {
|
|
813
|
+
$$updateGroupId: "submitLater"
|
|
814
|
+
});
|
|
815
|
+
|
|
816
|
+
transientListBinding.refreshInternal = function () {
|
|
817
|
+
/* */
|
|
818
|
+
};
|
|
819
|
+
|
|
820
|
+
transCtx = transientListBinding.create({}, true);
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
return transCtx;
|
|
824
|
+
},
|
|
825
|
+
onDialogOpen: function (event) {
|
|
826
|
+
var source = event.getSource();
|
|
827
|
+
var fieldsInfoModel = source.getModel("fieldsInfo");
|
|
828
|
+
fieldsInfoModel.setProperty("/isOpen", true);
|
|
829
|
+
},
|
|
830
|
+
|
|
509
831
|
/**
|
|
510
832
|
* Create the mass edit dialog.
|
|
511
833
|
*
|
|
@@ -517,10 +839,11 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
517
839
|
createDialog: function (oTable, aContexts, oController) {
|
|
518
840
|
var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
|
|
519
841
|
aDataArray = [],
|
|
520
|
-
oResourceBundle =
|
|
842
|
+
oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
|
|
521
843
|
oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
|
|
522
844
|
oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
|
|
523
|
-
|
|
845
|
+
dialogContext = MassEditHelper.getDialogContext(oTable),
|
|
846
|
+
oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues, dialogContext);
|
|
524
847
|
return new Promise(function (resolve, reject) {
|
|
525
848
|
var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
|
|
526
849
|
return Promise.resolve(XMLPreprocessor.process(oFragment, {
|
|
@@ -536,20 +859,28 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
536
859
|
return Fragment.load({
|
|
537
860
|
definition: oFragment
|
|
538
861
|
}).then(function (oDialogContent) {
|
|
862
|
+
var DraftStatus = FELibrary.DraftStatus;
|
|
539
863
|
var oDialog = new Dialog({
|
|
540
864
|
title: oDefaultValues.massEditTitle,
|
|
541
865
|
content: [oDialogContent],
|
|
866
|
+
afterOpen: MassEditHelper.onDialogOpen,
|
|
542
867
|
beginButton: new Button({
|
|
543
868
|
text: oDefaultValues.applyButtonText,
|
|
544
869
|
type: "Emphasized",
|
|
545
870
|
press: function (oEvent) {
|
|
871
|
+
var _oController$getView, _oController$getView$;
|
|
872
|
+
|
|
873
|
+
(_oController$getView = oController.getView()) === null || _oController$getView === void 0 ? void 0 : (_oController$getView$ = _oController$getView.getBindingContext("internal")) === null || _oController$getView$ === void 0 ? void 0 : _oController$getView$.setProperty("skipPatchHandlers", true);
|
|
546
874
|
var oDialog = oEvent.getSource().getParent();
|
|
547
875
|
var oModel = oDialog.getModel("fieldsInfo");
|
|
548
876
|
var aResults = oModel.getProperty("/results");
|
|
549
877
|
var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
|
|
550
878
|
var changePromise = [];
|
|
551
879
|
var bReadOnlyField = false;
|
|
552
|
-
|
|
880
|
+
var groupId; //let index = 0;
|
|
881
|
+
|
|
882
|
+
var errorValues = [];
|
|
883
|
+
aContexts.forEach(function (oSelectedContext, idx) {
|
|
553
884
|
aResults.forEach(function (oResult) {
|
|
554
885
|
//TODO - Add save implementation for Value Help.
|
|
555
886
|
if (aPropertyReadableInfo) {
|
|
@@ -564,22 +895,63 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
564
895
|
});
|
|
565
896
|
}
|
|
566
897
|
|
|
898
|
+
groupId = "$auto." + idx; //index += 1;
|
|
899
|
+
|
|
900
|
+
oController._editFlow.setDraftStatus(DraftStatus.Saving); //let promiseCount = 0;
|
|
901
|
+
|
|
902
|
+
|
|
567
903
|
if (oResult.keyValue && oResult.value !== "Default" && !bReadOnlyField) {
|
|
568
|
-
changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value))
|
|
904
|
+
changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value, groupId).then(function () {
|
|
905
|
+
return oSelectedContext;
|
|
906
|
+
}).catch(function (oError) {
|
|
907
|
+
errorValues.push(oSelectedContext.getObject());
|
|
908
|
+
Log.error("Mass Edit: Something went wrong in updating entries.", oError);
|
|
909
|
+
}));
|
|
569
910
|
}
|
|
570
911
|
});
|
|
571
912
|
});
|
|
572
|
-
|
|
573
|
-
var oListBinding = oTable.getRowBinding()
|
|
574
|
-
|
|
913
|
+
Promise.allSettled(changePromise).then(function () {
|
|
914
|
+
var oListBinding = oTable.getRowBinding();
|
|
915
|
+
var oExtensionAPI = oController && oController.getExtensionAPI();
|
|
575
916
|
return oExtensionAPI.refresh(oListBinding.getPath()).then(function () {
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
917
|
+
var subtitleColumn = CommonUtils.getMessageColumn(oTable);
|
|
918
|
+
var messages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
|
|
919
|
+
var boundTransitionErrorContexts = [];
|
|
920
|
+
messages.forEach(function (message, idx) {
|
|
921
|
+
var messageTargets = message.getTargets();
|
|
922
|
+
|
|
923
|
+
if (messageTargets && messageTargets.length === 1 && messageTargets[0].length && message.persistent === true) {
|
|
924
|
+
var boundTransitionErrorContext = aContexts.find(function (oContext) {
|
|
925
|
+
return message.getTarget().indexOf(oContext.getPath()) !== -1;
|
|
926
|
+
});
|
|
927
|
+
boundTransitionErrorContexts.push(boundTransitionErrorContext);
|
|
928
|
+
message.additionalText = boundTransitionErrorContext ? boundTransitionErrorContext.getObject()[subtitleColumn] : undefined;
|
|
929
|
+
}
|
|
930
|
+
});
|
|
931
|
+
|
|
932
|
+
if (boundTransitionErrorContexts.length === 0 && errorValues.length === 0) {
|
|
933
|
+
oController._editFlow.setDraftStatus(DraftStatus.Saved);
|
|
934
|
+
|
|
935
|
+
var successToast = oResourceBundle.getText("C_MASS_EDIT_SUCCESS_TOAST");
|
|
936
|
+
MessageToast.show(successToast);
|
|
937
|
+
} else {
|
|
938
|
+
if (errorValues.length + boundTransitionErrorContexts.length < oTable.getSelectedContexts().length) {
|
|
939
|
+
oController._editFlow.setDraftStatus(DraftStatus.Saved);
|
|
940
|
+
} else if (errorValues.length + boundTransitionErrorContexts.length === oTable.getSelectedContexts().length) {
|
|
941
|
+
oController._editFlow.setDraftStatus(DraftStatus.Clear);
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
oController._editFlow.getMessageHandler().showMessages();
|
|
946
|
+
|
|
947
|
+
if (oDialog.isOpen()) {
|
|
948
|
+
var _oController$getView2, _oController$getView3;
|
|
949
|
+
|
|
950
|
+
oDialog.close();
|
|
951
|
+
oDialog.destroy();
|
|
952
|
+
(_oController$getView2 = oController.getView()) === null || _oController$getView2 === void 0 ? void 0 : (_oController$getView3 = _oController$getView2.getBindingContext("internal")) === null || _oController$getView3 === void 0 ? void 0 : _oController$getView3.setProperty("skipPatchHandlers", false);
|
|
953
|
+
}
|
|
579
954
|
});
|
|
580
|
-
}).catch(function (oError) {
|
|
581
|
-
//TODO - Add error handling part for the Dialog
|
|
582
|
-
Log.error("Mass Edit: Something went wrong in updating entries.", oError);
|
|
583
955
|
});
|
|
584
956
|
}
|
|
585
957
|
}),
|
|
@@ -592,7 +964,10 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
592
964
|
}
|
|
593
965
|
})
|
|
594
966
|
});
|
|
967
|
+
var model = oTable.getModel();
|
|
595
968
|
oDialog.setModel(oDialogDataModel, "fieldsInfo");
|
|
969
|
+
oDialog.setModel(model);
|
|
970
|
+
oDialog.setBindingContext(dialogContext);
|
|
596
971
|
resolve(oDialog);
|
|
597
972
|
});
|
|
598
973
|
}).catch(reject);
|
|
@@ -601,4 +976,4 @@ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model
|
|
|
601
976
|
};
|
|
602
977
|
return MassEditHelper;
|
|
603
978
|
}, false);
|
|
604
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbImFWYWxpZERhdGFUeXBlcyIsIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwicHJlcGFyZURhdGFGb3JEaWFsb2ciLCJvVGFibGUiLCJhRGF0YUFycmF5Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0N1cnJlbnRFbnRpdHlTZXROYW1lIiwiZGF0YSIsImFUYWJsZUZpZWxkcyIsImdldFRhYmxlRmllbGRzIiwib0VudGl0eVR5cGVDb250ZXh0IiwiZ2V0Q29udGV4dCIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwib0RhdGFGaWVsZE1vZGVsIiwiSlNPTk1vZGVsIiwib1Jlc3VsdCIsInNMYWJlbFRleHQiLCJiVmFsdWVIZWxwRW5hYmxlZCIsInNVbml0UHJvcGVydHlQYXRoIiwiYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0IiwiYklzSW1tdXRhYmxlIiwiYklzQ29tcHV0ZWQiLCJiQ2hhcnRQcm9wZXJ0eSIsIm9UZXh0QmluZGluZyIsImJWYWxpZERhdGFUeXBlIiwiYkluVmFsaWRJbnB1dFR5cGUiLCJvQ29sdW1uSW5mbyIsImRhdGFQcm9wZXJ0eSIsIm9Qcm9wZXJ0eUluZm8iLCJsYWJlbCIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwib1Byb3BlcnR5IiwibmFtZSIsImdldFRleHRCaW5kaW5nIiwib0ZpZWxkQ29udGV4dCIsImFubm90YXRpb25QYXRoIiwib0RhdGFGaWVsZENvbnZlcnRlZCIsImNvbnZlcnRNZXRhTW9kZWxDb250ZXh0Iiwib1Byb3BlcnR5Q29udGV4dCIsIm9JbnRlcmZhY2UiLCJnZXRJbnRlcmZhY2UiLCJnZXRQcm9wZXJ0eSIsImJIaWRkZW5GaWVsZCIsImNvbnRleHQiLCJnZXRQYXRoIiwiVmFsdWUiLCIkdGFyZ2V0IiwiVGFyZ2V0IiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwidGVybSIsInR5cGUiLCJpbnB1dFR5cGUiLCJoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInVuZGVmaW5lZCIsInNldERhdGEiLCJnZXRJbnB1dFR5cGVGb3JDb2x1bW4iLCJvQ29sdW1uIiwiZ2V0VGVtcGxhdGUiLCJnZXRDb250ZW50IiwiZ2V0Q29udGVudEVkaXQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJtYXAiLCJzRGF0YVByb3BlcnR5IiwiZ2V0RGF0YVByb3BlcnR5IiwiYVJlYWx0ZWRDb2x1bW5JbmZvIiwiY3VzdG9tRGF0YSIsImdldEhlYWRlciIsImdldERlZmF1bHRUZXh0c0ZvckRpYWxvZyIsIm9SZXNvdXJjZUJ1bmRsZSIsImlTZWxlY3RlZENvbnRleHRzIiwiYkRpc3BsYXlNb2RlIiwiZ2V0VGV4dCIsInRvU3RyaW5nIiwiZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZyIsInNJbnB1dFR5cGUiLCJzUmVzdWx0Iiwic2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nIiwib0RlZmF1bHRWYWx1ZXMiLCJiVU9NRmllbGQiLCJiUHJvcGVydHlSZXF1aXJlZCIsImlzRmllbGRSZXF1aXJlZCIsInNTdWZmaXhGb3JLZWVwRXhpc3RpbmciLCJiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgiLCJ1bnNoaWZ0IiwidGV4dCIsImNsZWFyRmllbGRWYWx1ZSIsImtleSIsImxlYXZlQmxhbmtWYWx1ZSIsImtlZXBFeGlzdGluZ1ByZWZpeCIsImdldFRleHRBcnJhbmdlbWVudEluZm8iLCJzUHJvcGVydHkiLCJzQ3VycmVudEVudGl0eVNldCIsInNEaXNwbGF5TW9kZSIsIkNvbW1vblV0aWxzIiwiY29tcHV0ZURpc3BsYXlNb2RlIiwic0Rlc2NyaXB0aW9uUGF0aCIsInNEZXNjcmlwdGlvblZhbHVlIiwic0Z1bGxUZXh0IiwicGF0aCIsInBhcmFtZXRlcnMiLCJvUHJvcHMiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImFVbml0RGF0YSIsImFSZXN1bHRzIiwiYVJlYWRPbmx5RmllbGRJbmZvIiwib0Rpc3RpbmN0VmFsdWVNYXAiLCJzUHJvcGVydHlOYW1lIiwib0RhdGEiLCJvVGV4dEluZm8iLCJzUHJvcGVydHlLZXkiLCJpIiwic011bHRpTGV2ZWxQYXRoVmFsdWUiLCJ0ZXh0QmluZGluZyIsImVudGl0eVNldCIsImZ1bGxUZXh0IiwidW5pdFByb3BlcnR5Iiwic011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlIiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJ2YWx1ZSIsIm9wZXJhbmRzIiwib3BlcmFuZDEiLCJvcGVyYW5kMiIsInByb3BlcnR5UGF0aCIsInByb3BlcnR5VmFsdWUiLCJvRGlhbG9nRGF0YU1vZGVsIiwiY3JlYXRlRGlhbG9nIiwib0NvbnRyb2xsZXIiLCJzRnJhZ21lbnROYW1lIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJiaW5kaW5nQ29udGV4dHMiLCJkYXRhRmllbGRNb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwidGhlbiIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsIm1hc3NFZGl0VGl0bGUiLCJjb250ZW50IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJhcHBseUJ1dHRvblRleHQiLCJwcmVzcyIsIm9FdmVudCIsImdldFNvdXJjZSIsImdldFBhcmVudCIsIm9Nb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImNoYW5nZVByb21pc2UiLCJiUmVhZE9ubHlGaWVsZCIsImtleVZhbHVlIiwicHJvcGVydHkiLCJzZXRQcm9wZXJ0eSIsImFsbCIsIm9SZXMiLCJvTGlzdEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwib0V4dGVuc2lvbkFQSSIsImdldEV4dGVuc2lvbkFQSSIsInJlZnJlc2giLCJjbG9zZSIsImRlc3Ryb3kiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZW5kQnV0dG9uIiwiY2FuY2VsQnV0dG9uVGV4dCIsInNldE1vZGVsIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUF3QkEsTUFBTUEsZUFBZSxHQUFHLENBQ3ZCLGFBRHVCLEVBRXZCLFVBRnVCLEVBR3ZCLGFBSHVCLEVBSXZCLFlBSnVCLEVBS3ZCLFdBTHVCLEVBTXZCLFVBTnVCLEVBT3ZCLFdBUHVCLEVBUXZCLFdBUnVCLEVBU3ZCLFdBVHVCLEVBVXZCLFdBVnVCLEVBV3ZCLFlBWHVCLEVBWXZCLFlBWnVCLENBQXhCO0FBY0EsTUFBTUMsY0FBYyxHQUFHO0FBQ3RCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEsMkJBQTJCLEVBQUUsVUFBU0MsS0FBVCxFQUF3QkMsT0FBeEIsRUFBc0M7QUFDbEUsVUFBSUMsVUFBSjtBQUNBLFVBQUlDLEtBQUssR0FBRyxDQUFaO0FBQ0EsVUFBTUMsTUFBTSxHQUFHSixLQUFLLENBQUNLLEtBQU4sQ0FBWSxHQUFaLENBQWY7QUFDQSxVQUFJQyxTQUFTLEdBQUcsRUFBaEI7QUFDQUYsTUFBQUEsTUFBTSxDQUFDRyxPQUFQLENBQWUsVUFBU0MsYUFBVCxFQUFnQztBQUM5QyxZQUFJLENBQUNQLE9BQU8sQ0FBQ08sYUFBRCxDQUFSLElBQTJCTCxLQUFLLEtBQUssQ0FBekMsRUFBNEM7QUFDM0NGLFVBQUFBLE9BQU8sQ0FBQ08sYUFBRCxDQUFQLEdBQXlCLEVBQXpCO0FBQ0FOLFVBQUFBLFVBQVUsR0FBR0QsT0FBTyxDQUFDTyxhQUFELENBQXBCO0FBQ0FGLFVBQUFBLFNBQVMsR0FBR0EsU0FBUyxHQUFHRSxhQUF4QjtBQUNBTCxVQUFBQSxLQUFLO0FBQ0wsU0FMRCxNQUtPLElBQUksQ0FBQ0QsVUFBVSxDQUFDTSxhQUFELENBQWYsRUFBZ0M7QUFDdENGLFVBQUFBLFNBQVMsR0FBR0EsU0FBUyxHQUFHLEdBQVosR0FBa0JFLGFBQTlCOztBQUNBLGNBQUlGLFNBQVMsS0FBS04sS0FBbEIsRUFBeUI7QUFDeEJFLFlBQUFBLFVBQVUsQ0FBQ00sYUFBRCxDQUFWLEdBQTRCLEVBQTVCO0FBQ0FOLFlBQUFBLFVBQVUsR0FBR0EsVUFBVSxDQUFDTSxhQUFELENBQXZCO0FBQ0EsV0FIRCxNQUdPO0FBQ05OLFlBQUFBLFVBQVUsQ0FBQ00sYUFBRCxDQUFWLEdBQTRCLEVBQTVCO0FBQ0E7QUFDRDtBQUNELE9BZkQ7QUFnQkEsYUFBT04sVUFBUDtBQUNBLEtBL0JxQjs7QUFpQ3RCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ08sSUFBQUEsZUFBZSxFQUFFLFVBQVNDLE1BQVQsRUFBeUJQLEtBQXpCLEVBQXdDUSxJQUF4QyxFQUFxRDtBQUNyRSxVQUFJRCxNQUFKLEVBQVk7QUFDWCxlQUFPQyxJQUFJLENBQUNDLE9BQUwsQ0FBYUYsTUFBYixNQUF5QlAsS0FBaEM7QUFDQTtBQUNELEtBN0NxQjs7QUErQ3RCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ1UsSUFBQUEseUJBQXlCLEVBQUUsVUFBU0MsaUJBQVQsRUFBb0NDLE9BQXBDLEVBQWtEO0FBQzVFLFVBQUlELGlCQUFpQixJQUFJQSxpQkFBaUIsQ0FBQ0YsT0FBbEIsQ0FBMEIsR0FBMUIsSUFBaUMsQ0FBMUQsRUFBNkQ7QUFDNUQsWUFBTUksY0FBYyxHQUFHRixpQkFBaUIsQ0FBQ1QsS0FBbEIsQ0FBd0IsR0FBeEIsQ0FBdkI7QUFDQSxZQUFJWSxNQUFKO0FBQ0FELFFBQUFBLGNBQWMsQ0FBQ1QsT0FBZixDQUF1QixVQUFTUCxLQUFULEVBQXdCO0FBQzlDaUIsVUFBQUEsTUFBTSxHQUFHRixPQUFPLElBQUlBLE9BQU8sQ0FBQ2YsS0FBRCxDQUFsQixHQUE0QmUsT0FBTyxDQUFDZixLQUFELENBQW5DLEdBQTZDaUIsTUFBTSxJQUFJQSxNQUFNLENBQUNqQixLQUFELENBQXRFO0FBQ0EsU0FGRDtBQUdBLGVBQU9pQixNQUFQO0FBQ0E7QUFDRCxLQWhFcUI7O0FBa0V0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLCtCQUErQixFQUFFLFVBQVNDLFNBQVQsRUFBMkJMLGlCQUEzQixFQUFzRDtBQUN0RixVQUFJQSxpQkFBaUIsSUFBSUssU0FBUyxDQUFDQyxNQUFWLEdBQW1CLENBQTVDLEVBQStDO0FBQzlDLFlBQU1DLGdCQUFnQixHQUFHRixTQUF6QjtBQUFBLFlBQ0NHLGVBQXNCLEdBQUcsRUFEMUI7QUFFQUQsUUFBQUEsZ0JBQWdCLENBQUNkLE9BQWpCLENBQXlCLFVBQVNnQixRQUFULEVBQXdCO0FBQ2hELGNBQU1DLFdBQVcsR0FBR0QsUUFBUSxDQUFDRSxTQUFULEVBQXBCO0FBQ0EsY0FBTUMsd0JBQXdCLEdBQzdCWixpQkFBaUIsQ0FBQ0YsT0FBbEIsQ0FBMEIsR0FBMUIsSUFBaUMsQ0FBQyxDQUFsQyxJQUF1Q1ksV0FBVyxDQUFDRyxjQUFaLENBQTJCYixpQkFBaUIsQ0FBQ1QsS0FBbEIsQ0FBd0IsR0FBeEIsRUFBNkIsQ0FBN0IsQ0FBM0IsQ0FEeEM7O0FBRUEsY0FBSWtCLFFBQVEsS0FBS0MsV0FBVyxDQUFDRyxjQUFaLENBQTJCYixpQkFBM0IsS0FBaURZLHdCQUF0RCxDQUFaLEVBQTZGO0FBQzVGSixZQUFBQSxlQUFlLENBQUNNLElBQWhCLENBQXFCTCxRQUFRLENBQUNFLFNBQVQsQ0FBbUJYLGlCQUFuQixDQUFyQjtBQUNBO0FBQ0QsU0FQRDtBQVFBLFlBQU1lLHFCQUFxQixHQUFHUCxlQUFlLENBQUNRLE1BQWhCLENBQXVCaEMsY0FBYyxDQUFDVyxlQUF0QyxDQUE5Qjs7QUFDQSxZQUFJb0IscUJBQXFCLENBQUNULE1BQXRCLEdBQStCLENBQW5DLEVBQXNDO0FBQ3JDLGlCQUFPLGFBQWFOLGlCQUFwQjtBQUNBLFNBRkQsTUFFTyxJQUFJZSxxQkFBcUIsQ0FBQ1QsTUFBdEIsS0FBaUMsQ0FBckMsRUFBd0M7QUFDOUMsaUJBQU8sV0FBV04saUJBQWxCO0FBQ0EsU0FGTSxNQUVBLElBQUllLHFCQUFxQixDQUFDVCxNQUF0QixLQUFpQyxDQUFyQyxFQUF3QztBQUM5QyxpQkFBT04saUJBQVA7QUFDQTtBQUNEO0FBQ0QsS0FsR3FCOztBQW9HdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ2lCLElBQUFBLHlCQUF5QixFQUFFLFVBQVNDLFdBQVQsRUFBMkJiLFNBQTNCLEVBQTZDO0FBQ3ZFLFVBQUlhLFdBQVcsSUFBSUEsV0FBVyxDQUFDQyxLQUEvQixFQUFzQztBQUNyQyxlQUFPLENBQUNkLFNBQVMsQ0FBQ2UsSUFBVixDQUFlLFVBQVNiLGdCQUFULEVBQWdDO0FBQ3RELGlCQUFPQSxnQkFBZ0IsQ0FBQ0ksU0FBakIsQ0FBMkJPLFdBQVcsQ0FBQ0MsS0FBdkMsTUFBa0QsS0FBekQ7QUFDQSxTQUZPLENBQVI7QUFHQTs7QUFDRCxhQUFPRCxXQUFQO0FBQ0EsS0FsSHFCOztBQW9IdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDRyxJQUFBQSxvQkFBb0IsRUFBRSxVQUFTQyxNQUFULEVBQXdCakIsU0FBeEIsRUFBMENrQixVQUExQyxFQUE2RDtBQUNsRixVQUFNQyxVQUFVLEdBQUdGLE1BQU0sSUFBS0EsTUFBTSxDQUFDRyxRQUFQLEdBQWtCQyxZQUFsQixFQUE5QjtBQUFBLFVBQ0NDLHFCQUFxQixHQUFHTCxNQUFNLENBQUNNLElBQVAsQ0FBWSxVQUFaLENBRHpCO0FBQUEsVUFFQ0MsWUFBWSxHQUFHN0MsY0FBYyxDQUFDOEMsY0FBZixDQUE4QlIsTUFBOUIsQ0FGaEI7QUFBQSxVQUdDUyxrQkFBa0IsR0FBR1AsVUFBVSxDQUFDUSxVQUFYLENBQXNCTCxxQkFBcUIsR0FBRyxJQUE5QyxDQUh0QjtBQUFBLFVBSUNNLG9CQUFvQixHQUFHQywyQkFBMkIsQ0FBQ0gsa0JBQUQsQ0FKbkQ7QUFNQSxVQUFNSSxlQUFlLEdBQUcsSUFBSUMsU0FBSixFQUF4QjtBQUNBLFVBQUlDLE9BQUo7QUFDQSxVQUFJQyxVQUFKO0FBQ0EsVUFBSUMsaUJBQUo7QUFDQSxVQUFJQyxpQkFBSjtBQUNBLFVBQUlDLHdCQUFKO0FBQ0EsVUFBSUMsWUFBSjtBQUNBLFVBQUlDLFdBQUo7QUFDQSxVQUFJQyxjQUFKO0FBQ0EsVUFBSUMsWUFBSjtBQUNBLFVBQUlDLGNBQUo7QUFDQSxVQUFJQyxpQkFBSjtBQUVBbEIsTUFBQUEsWUFBWSxDQUFDcEMsT0FBYixDQUFxQixVQUFTdUQsV0FBVCxFQUEyQjtBQUMvQyxZQUFNaEQsaUJBQWlCLEdBQUdnRCxXQUFXLENBQUNDLFlBQXRDOztBQUNBLFlBQUlqRCxpQkFBSixFQUF1QjtBQUN0QixjQUFJa0QsYUFBYSxHQUFHbEQsaUJBQWlCLElBQUl3QixVQUFVLENBQUNiLFNBQVgsQ0FBcUJnQixxQkFBcUIsR0FBRyxHQUF4QixHQUE4QjNCLGlCQUE5QixHQUFrRCxHQUF2RSxDQUF6QztBQUNBdUMsVUFBQUEsaUJBQWlCLEdBQ2hCdkMsaUJBQWlCLElBQ2pCd0IsVUFBVSxDQUFDYixTQUFYLENBQXFCZ0IscUJBQXFCLEdBQUcsR0FBeEIsR0FBOEIzQixpQkFBOUIsR0FBa0QsR0FBdkUsQ0FEQSxJQUVBd0IsVUFBVSxDQUFDYixTQUFYLENBQXFCZ0IscUJBQXFCLEdBQUcsR0FBeEIsR0FBOEIzQixpQkFBOUIsR0FBa0QsR0FBdkUsRUFDQywyQ0FERCxDQUhEO0FBTUF3QyxVQUFBQSxpQkFBaUIsR0FDZlUsYUFBYSxJQUFJQSxhQUFhLENBQUMsNkJBQUQsQ0FBOUIsSUFBaUVBLGFBQWEsQ0FBQyw2QkFBRCxDQUFiLENBQTZDL0IsS0FBL0csSUFDQytCLGFBQWEsSUFDYkEsYUFBYSxDQUFDLG9DQUFELENBRGIsSUFFQUEsYUFBYSxDQUFDLG9DQUFELENBQWIsQ0FBb0QvQixLQUp0RDtBQUtBbUIsVUFBQUEsVUFBVSxHQUFHVSxXQUFXLENBQUNHLEtBQVosSUFBc0JELGFBQWEsSUFBSUEsYUFBYSxDQUFDLHVDQUFELENBQWpFO0FBQ0FULFVBQUFBLHdCQUF3QixHQUN2QkQsaUJBQWlCLElBQ2pCaEIsVUFBVSxDQUFDYixTQUFYLENBQXFCZ0IscUJBQXFCLEdBQUcsR0FBeEIsR0FBOEJhLGlCQUE5QixHQUFrRCxHQUF2RSxDQURBLElBRUFoQixVQUFVLENBQUNiLFNBQVgsQ0FBcUJnQixxQkFBcUIsR0FBRyxHQUF4QixHQUE4QmEsaUJBQTlCLEdBQWtELEdBQXZFLEVBQ0MsMkNBREQsQ0FIRDs7QUFNQSxjQUFJUCxvQkFBSixFQUEwQjtBQUN6QkEsWUFBQUEsb0JBQW9CLENBQUNtQixZQUFyQixHQUFvQ25CLG9CQUFvQixDQUFDb0IsZ0JBQXJCLENBQXNDQyxnQkFBdEMsQ0FBdUR0QyxNQUF2RCxDQUE4RCxVQUNqR3VDLFNBRGlHLEVBRWhHO0FBQ0QscUJBQU9BLFNBQVMsQ0FBQ0MsSUFBVixLQUFtQnhELGlCQUExQjtBQUNBLGFBSm1DLENBQXBDO0FBS0E7O0FBQ0RpQyxVQUFBQSxvQkFBb0IsQ0FBQ21CLFlBQXJCLEdBQW9DbkIsb0JBQW9CLENBQUNtQixZQUFyQixDQUFrQyxDQUFsQyxLQUF3QyxFQUE1RTtBQUNBUCxVQUFBQSxZQUFZLEdBQUdZLGNBQWMsQ0FBQ3hCLG9CQUFELEVBQXVCLEVBQXZCLEVBQTJCLElBQTNCLENBQWQsSUFBa0QsRUFBakU7QUFDQSxjQUFNeUIsYUFBYSxHQUFHbEMsVUFBVSxDQUFDUSxVQUFYLENBQXNCZ0IsV0FBVyxDQUFDVyxjQUFsQyxDQUF0QjtBQUFBLGNBQ0NDLG1CQUFtQixHQUFHQyx1QkFBdUIsQ0FBQ0gsYUFBRCxDQUQ5QztBQUFBLGNBRUNJLGdCQUFnQixHQUFHdEMsVUFBVSxDQUFDUSxVQUFYLENBQXNCTCxxQkFBcUIsR0FBRyxHQUF4QixHQUE4QjNCLGlCQUE5QixHQUFrRCxHQUF4RSxDQUZwQjtBQUFBLGNBR0MrRCxVQUFVLEdBQUdELGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ0UsWUFBakIsRUFIbEM7QUFJQXRCLFVBQUFBLFlBQVksR0FDWG9CLGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ0csV0FBakIsRUFBcEIsSUFBc0RILGdCQUFnQixDQUFDRyxXQUFqQixHQUErQiw4QkFBL0IsQ0FEdkQ7QUFFQXRCLFVBQUFBLFdBQVcsR0FDVm1CLGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ0csV0FBakIsRUFBcEIsSUFBc0RILGdCQUFnQixDQUFDRyxXQUFqQixHQUErQiw2QkFBL0IsQ0FEdkQ7QUFFQSxjQUFNQyxZQUFZLEdBQ2pCbEYsY0FBYyxDQUFDaUMseUJBQWYsQ0FDQ3lDLGFBQWEsSUFBSUEsYUFBYSxDQUFDL0MsU0FBZCxHQUEwQixvQ0FBMUIsQ0FEbEIsRUFFQ04sU0FGRCxLQUdLLEtBSk47QUFLQTBELFVBQUFBLFVBQVUsQ0FBQ0ksT0FBWCxHQUFxQjtBQUNwQjFDLFlBQUFBLFFBQVEsRUFBRSxZQUFXO0FBQ3BCLHFCQUFPc0MsVUFBVSxDQUFDdEMsUUFBWCxFQUFQO0FBQ0EsYUFIbUI7QUFJcEIyQyxZQUFBQSxPQUFPLEVBQUUsWUFBVztBQUNuQixxQkFBT3pDLHFCQUFxQixHQUFHLEdBQXhCLEdBQThCM0IsaUJBQXJDO0FBQ0E7QUFObUIsV0FBckI7QUFRQWtELFVBQUFBLGFBQWEsR0FDWFUsbUJBQW1CLElBQUlBLG1CQUFtQixDQUFDUyxLQUEzQyxJQUFvRFQsbUJBQW1CLENBQUNTLEtBQXBCLENBQTBCQyxPQUEvRSxJQUNDVixtQkFBbUIsSUFBSUEsbUJBQW1CLENBQUNXLE1BQTNDLElBQXFEWCxtQkFBbUIsQ0FBQ1csTUFBcEIsQ0FBMkJELE9BRmxGLENBbERzQixDQXFEdEI7O0FBQ0EsY0FBTUUsVUFBVSxHQUFHQyxvQkFBb0IsQ0FBQ3ZCLGFBQUQsQ0FBdkM7QUFDQU4sVUFBQUEsY0FBYyxHQUFHTSxhQUFhLElBQUlBLGFBQWEsQ0FBQ3dCLElBQS9CLElBQXVDeEIsYUFBYSxDQUFDd0IsSUFBZCxLQUF1QixrQ0FBL0U7QUFDQTVCLFVBQUFBLGNBQWMsR0FBR0ksYUFBYSxJQUFJbkUsZUFBZSxDQUFDZSxPQUFoQixDQUF3Qm9ELGFBQWEsQ0FBQ3lCLElBQXRDLE1BQWdELENBQUMsQ0FBbkY7QUFDQTVCLFVBQUFBLGlCQUFpQixHQUNmQyxXQUFXLElBQ1hBLFdBQVcsQ0FBQzRCLFNBRFosS0FFQzVCLFdBQVcsQ0FBQzRCLFNBQVosS0FBMEIsdUJBQTFCLElBQXFENUIsV0FBVyxDQUFDNEIsU0FBWixLQUEwQiw0QkFGaEYsQ0FBRCxJQUdBQywyQkFBMkIsQ0FBQzNCLGFBQUQsQ0FKNUI7O0FBS0EsY0FDQ2xELGlCQUFpQixJQUNqQixDQUFDa0UsWUFERCxJQUVBLENBQUN4QixZQUZELElBR0EsQ0FBQ0MsV0FIRCxJQUlBLENBQUNDLGNBSkQsSUFLQUUsY0FMQSxJQU1BLENBQUNDLGlCQU5ELElBT0FDLFdBQVcsQ0FBQzRCLFNBUFosSUFRQUUscUJBQXFCLENBQUM1QixhQUFELEVBQWdCVSxtQkFBaEIsRUFBcUMzQixvQkFBckMsQ0FBckIsS0FBb0YsT0FUckYsRUFVRTtBQUNESSxZQUFBQSxPQUFPLEdBQUc7QUFDVCx1QkFBU0MsVUFBVSxHQUFHLEdBRGI7QUFFVCx5QkFDQ3RDLGlCQUFpQixJQUNqQixDQUFDa0UsWUFERCxJQUVBLENBQUN4QixZQUZELElBR0EsQ0FBQ0MsV0FIRCxJQUlBbUMscUJBQXFCLENBQUM1QixhQUFELEVBQWdCVSxtQkFBaEIsRUFBcUMzQixvQkFBckMsQ0FQYjtBQVFULDhCQUFnQmpDLGlCQVJQO0FBU1Qsb0NBQXNCdUMsaUJBQWlCLEdBQUdBLGlCQUFILEdBQXVCLEtBVHJEO0FBVVQsOEJBQWdCQyxpQkFBaUIsR0FBR0EsaUJBQUgsR0FBdUIsS0FWL0M7QUFXVCwyQ0FBNkJDLHdCQUF3QixHQUFHQSx3QkFBSCxHQUE4QixLQVgxRTtBQVlULDBDQUE0QmQscUJBQXFCLEdBQUcsR0FBeEIsR0FBOEIzQixpQkFaakQ7QUFhVCw4Q0FBZ0MyQixxQkFBcUIsR0FBRyxHQUF4QixHQUE4QmEsaUJBYnJEO0FBY1QsaUNBQW1CdUMscUJBQXFCLENBQUM3QixhQUFELEVBQWdCVSxtQkFBaEIsRUFBcUMsSUFBckMsQ0FkL0I7QUFlVCxzQ0FBd0I1RCxpQkFBaUIsR0FDdENoQixjQUFjLENBQUNvQiwrQkFBZixDQUErQ0MsU0FBL0MsRUFBMERMLGlCQUExRCxDQURzQyxHQUV0QyxLQWpCTTtBQWtCVCwwQ0FBNEJ3QyxpQkFBaUIsR0FDMUN4RCxjQUFjLENBQUNvQiwrQkFBZixDQUErQ0MsU0FBL0MsRUFBMERtQyxpQkFBMUQsQ0FEMEMsR0FFMUMsS0FwQk07QUFxQlQsMkJBQWFiLHFCQXJCSjtBQXNCVCw2QkFBZWtCLFlBdEJOO0FBdUJULDBCQUFZSyxhQUFhLENBQUM4QixRQUFkLEtBQTJCQyxTQUEzQixHQUF1Qy9CLGFBQWEsQ0FBQzhCLFFBQXJELEdBQWdFLElBdkJuRTtBQXdCVCxvQ0FBc0JSLFVBQVUsS0FBS1MsU0FBZixHQUEyQlQsVUFBM0IsR0FBd0M7QUF4QnJELGFBQVY7QUEwQkFqRCxZQUFBQSxVQUFVLENBQUNULElBQVgsQ0FBZ0J1QixPQUFoQjtBQUNBO0FBQ0Q7QUFDRCxPQXhHRDtBQXlHQUYsTUFBQUEsZUFBZSxDQUFDK0MsT0FBaEIsQ0FBd0IzRCxVQUF4QjtBQUNBLGFBQU9ZLGVBQVA7QUFDQSxLQTNQcUI7QUE2UHRCZ0QsSUFBQUEscUJBQXFCLEVBQUUsVUFBU0MsT0FBVCxFQUF1QjtBQUM3QyxhQUNDQSxPQUFPLENBQUNDLFdBQVIsR0FBc0JDLFVBQXRCLElBQ0FGLE9BQU8sQ0FBQ0MsV0FBUixHQUFzQkMsVUFBdEIsRUFEQSxJQUVBRixPQUFPLENBQUNDLFdBQVIsR0FBc0JDLFVBQXRCLEdBQW1DQyxjQUZuQyxJQUdBSCxPQUFPLENBQ0xDLFdBREYsR0FFRUMsVUFGRixHQUdFQyxjQUhGLEVBSEEsSUFPQUgsT0FBTyxDQUNMQyxXQURGLEdBRUVDLFVBRkYsR0FHRUMsY0FIRixHQUdtQixDQUhuQixDQVBBLElBV0FILE9BQU8sQ0FDTEMsV0FERixHQUVFQyxVQUZGLEdBR0VDLGNBSEYsR0FHbUIsQ0FIbkIsRUFJRUMsV0FKRixHQUtFQyxPQUxGLEVBWkQ7QUFtQkEsS0FqUnFCO0FBbVJ0QjNELElBQUFBLGNBQWMsRUFBRSxVQUFTUixNQUFULEVBQXNCO0FBQ3JDLFVBQU1vRSxRQUFRLEdBQUlwRSxNQUFNLElBQUlBLE1BQU0sQ0FBQ3FFLFVBQVAsRUFBWCxJQUFtQyxFQUFwRDtBQUNBLGFBQU9ELFFBQVEsQ0FBQ0UsR0FBVCxDQUFhLFVBQVNSLE9BQVQsRUFBdUI7QUFDMUMsWUFBTVMsYUFBYSxHQUFHVCxPQUFPLElBQUlBLE9BQU8sQ0FBQ1UsZUFBUixFQUFqQztBQUFBLFlBQ0NDLGtCQUFrQixHQUNqQnpFLE1BQU0sQ0FBQ00sSUFBUCxDQUFZLFNBQVosS0FDQU4sTUFBTSxDQUFDTSxJQUFQLENBQVksU0FBWixFQUF1Qm9FLFVBQXZCLENBQWtDaEYsTUFBbEMsQ0FBeUMsVUFBU2dDLFdBQVQsRUFBMkI7QUFDbkUsaUJBQU9BLFdBQVcsQ0FBQ1EsSUFBWixLQUFxQnFDLGFBQXJCLElBQXNDN0MsV0FBVyxDQUFDMkIsSUFBWixLQUFxQixZQUFsRTtBQUNBLFNBRkQsQ0FIRjtBQU1BLGVBQU87QUFDTiwwQkFBZ0JrQixhQURWO0FBRU4sbUJBQVNULE9BQU8sQ0FBQ2EsU0FBUixFQUZIO0FBR04sNEJBQWtCRixrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUMsQ0FBRCxDQUF4QyxJQUErQ0Esa0JBQWtCLENBQUMsQ0FBRCxDQUFsQixDQUFzQnBDLGNBSGpGO0FBSU4sdUJBQWEzRSxjQUFjLENBQUNtRyxxQkFBZixDQUFxQ0MsT0FBckM7QUFKUCxTQUFQO0FBTUEsT0FiTSxDQUFQO0FBY0EsS0FuU3FCO0FBcVN0QmMsSUFBQUEsd0JBQXdCLEVBQUUsVUFBU0MsZUFBVCxFQUErQkMsaUJBQS9CLEVBQXVEOUUsTUFBdkQsRUFBb0U7QUFDN0Y7QUFDQSxVQUFNK0UsWUFBWSxHQUFHL0UsTUFBTSxDQUFDTSxJQUFQLENBQVksNEJBQVosTUFBOEMsTUFBbkU7QUFFQSxhQUFPO0FBQ04sOEJBQXNCLFFBRGhCO0FBRU4sMkJBQW1CLGlCQUZiO0FBR04sMkJBQW1CLGtCQUhiO0FBSU4seUJBQWlCdUUsZUFBZSxDQUFDRyxPQUFoQixDQUF3QiwwQkFBeEIsRUFBb0RGLGlCQUFpQixDQUFDRyxRQUFsQixFQUFwRCxDQUpYO0FBS04sMkJBQW1CRixZQUFZLEdBQzVCRixlQUFlLENBQUNHLE9BQWhCLENBQXdCLDhCQUF4QixDQUQ0QixHQUU1QkgsZUFBZSxDQUFDRyxPQUFoQixDQUF3QiwrQkFBeEIsQ0FQRztBQVFOLDRCQUFvQkgsZUFBZSxDQUFDRyxPQUFoQixDQUF3QixnQ0FBeEI7QUFSZCxPQUFQO0FBVUEsS0FuVHFCOztBQXFUdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NFLElBQUFBLHlCQUF5QixFQUFFLFVBQVNDLFVBQVQsRUFBNkI7QUFDdkQsVUFBSUMsT0FBTyxHQUFHLFFBQWQ7O0FBRUEsY0FBUUQsVUFBUjtBQUNDO0FBQ0EsYUFBSyxrQkFBTDtBQUNDQyxVQUFBQSxPQUFPLEdBQUcsT0FBVjtBQUNBOztBQUNELGFBQUssZ0JBQUw7QUFDQ0EsVUFBQUEsT0FBTyxHQUFHLFVBQVY7QUFDQTtBQVBGOztBQVNBLGFBQU9BLE9BQVA7QUFDQSxLQXhVcUI7O0FBMFV0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEsd0JBQXdCLEVBQUUsVUFBU3hILE9BQVQsRUFBeUJrQixTQUF6QixFQUEyQ3VHLGNBQTNDLEVBQWdFMUQsYUFBaEUsRUFBb0YyRCxTQUFwRixFQUF5RztBQUNsSSxVQUFNbkgsYUFBYSxHQUFHd0QsYUFBYSxDQUFDRCxZQUFwQztBQUFBLFVBQ0N3RCxVQUFVLEdBQUd2RCxhQUFhLENBQUMwQixTQUQ1QjtBQUFBLFVBRUNrQyxpQkFBaUIsR0FBRzVELGFBQWEsQ0FBQzZELGVBRm5DO0FBR0EsVUFBTUMsc0JBQXNCLEdBQUdoSSxjQUFjLENBQUN3SCx5QkFBZixDQUF5Q0MsVUFBekMsQ0FBL0IsQ0FKa0ksQ0FLbEk7QUFDQTs7QUFDQSxVQUFNUSwyQkFBMkIsR0FBRzVHLFNBQVMsQ0FBQ2UsSUFBVixDQUFlLFVBQVNiLGdCQUFULEVBQWdDO0FBQ2xGLGVBQU9BLGdCQUFnQixDQUFDSSxTQUFqQixDQUEyQmpCLGFBQTNCLENBQVA7QUFDQSxPQUZtQyxDQUFwQzs7QUFHQSxVQUFJdUgsMkJBQUosRUFBaUM7QUFDaEMsWUFBSUgsaUJBQWlCLEtBQUssTUFBdEIsSUFBZ0MsQ0FBQ0QsU0FBckMsRUFBZ0Q7QUFDL0MxSCxVQUFBQSxPQUFPLENBQUMrSCxPQUFSLENBQWdCO0FBQUVDLFlBQUFBLElBQUksRUFBRVAsY0FBYyxDQUFDUSxlQUF2QjtBQUF3Q0MsWUFBQUEsR0FBRyxFQUFFLHFCQUFxQjNIO0FBQWxFLFdBQWhCO0FBQ0E7QUFDRCxPQUpELE1BSU87QUFDTlAsUUFBQUEsT0FBTyxDQUFDK0gsT0FBUixDQUFnQjtBQUFFQyxVQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ1UsZUFBdkI7QUFBd0NELFVBQUFBLEdBQUcsRUFBRSxXQUFXM0g7QUFBeEQsU0FBaEI7QUFDQTs7QUFDRFAsTUFBQUEsT0FBTyxDQUFDK0gsT0FBUixDQUFnQjtBQUNmQyxRQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ1csa0JBQWYsR0FBb0MsR0FBcEMsR0FBMENQLHNCQUExQyxHQUFtRSxJQUQxRDtBQUVmSyxRQUFBQSxHQUFHLEVBQUUsYUFBYTNIO0FBRkgsT0FBaEI7QUFJQSxLQXhXcUI7QUEwV3RCOEgsSUFBQUEsc0JBQXNCLEVBQUUsVUFDdkJDLFNBRHVCLEVBRXZCNUUsWUFGdUIsRUFHdkI2RSxpQkFIdUIsRUFJdkJuSCxnQkFKdUIsRUFLVztBQUNsQyxVQUFNaUIsVUFBVSxHQUFHakIsZ0JBQWdCLENBQUNrQixRQUFqQixHQUE0QkMsWUFBNUIsRUFBbkI7QUFDQSxVQUFNaUcsWUFBWSxHQUFHQyxXQUFXLENBQUNDLGtCQUFaLENBQStCckcsVUFBVSxDQUFDYixTQUFYLENBQXFCK0csaUJBQWlCLEdBQUcsR0FBcEIsR0FBMEJELFNBQTFCLEdBQXNDLEdBQTNELENBQS9CLENBQXJCO0FBQ0EsVUFBSUssZ0JBQUosRUFBc0JsSSxNQUF0QixFQUE4Qm1JLGlCQUE5QixFQUFpREMsU0FBakQ7O0FBQ0EsVUFBSW5GLFlBQVksS0FBS0EsWUFBWSxDQUFDb0YsSUFBYixJQUFzQnBGLFlBQVksQ0FBQ3FGLFVBQWIsSUFBMkJyRixZQUFZLENBQUNxRixVQUFiLENBQXdCNUgsTUFBOUUsQ0FBWixJQUFzR21ILFNBQTFHLEVBQXFIO0FBQ3BILFlBQUk1RSxZQUFZLENBQUNvRixJQUFqQixFQUF1QjtBQUN0QixjQUFJTixZQUFZLEtBQUssYUFBckIsRUFBb0M7QUFDbkMvSCxZQUFBQSxNQUFNLEdBQUdXLGdCQUFnQixDQUFDSSxTQUFqQixDQUEyQjhHLFNBQTNCLENBQVQ7QUFDQU0sWUFBQUEsaUJBQWlCLEdBQUd4SCxnQkFBZ0IsQ0FBQ0ksU0FBakIsQ0FBMkJrQyxZQUFZLENBQUNvRixJQUF4QyxDQUFwQjtBQUNBRCxZQUFBQSxTQUFTLEdBQUdELGlCQUFaO0FBQ0EsV0FKRCxNQUlPLElBQUlKLFlBQVksS0FBSyxPQUFyQixFQUE4QjtBQUNwQy9ILFlBQUFBLE1BQU0sR0FBR1csZ0JBQWdCLENBQUNJLFNBQWpCLENBQTJCOEcsU0FBM0IsQ0FBVDtBQUNBTyxZQUFBQSxTQUFTLEdBQUdwSSxNQUFaO0FBQ0E7QUFDRCxTQVRELE1BU08sSUFBSWlELFlBQVksQ0FBQ3FGLFVBQWpCLEVBQTZCO0FBQ25DckYsVUFBQUEsWUFBWSxDQUFDcUYsVUFBYixDQUF3QnpJLE9BQXhCLENBQWdDLFVBQVMwSSxNQUFULEVBQXNCO0FBQ3JELGdCQUFJQSxNQUFNLENBQUNGLElBQVAsSUFBZUUsTUFBTSxDQUFDRixJQUFQLEtBQWdCUixTQUFuQyxFQUE4QztBQUM3Q0ssY0FBQUEsZ0JBQWdCLEdBQUdLLE1BQU0sQ0FBQ0YsSUFBMUI7QUFDQTtBQUNELFdBSkQ7QUFLQXJJLFVBQUFBLE1BQU0sR0FBR1csZ0JBQWdCLENBQUNJLFNBQWpCLENBQTJCOEcsU0FBM0IsQ0FBVDtBQUNBTSxVQUFBQSxpQkFBaUIsR0FBR3hILGdCQUFnQixDQUFDSSxTQUFqQixDQUEyQm1ILGdCQUEzQixDQUFwQjs7QUFDQSxjQUFJSCxZQUFZLEtBQUssa0JBQWpCLElBQXVDL0gsTUFBdkMsSUFBaURtSSxpQkFBckQsRUFBd0U7QUFDdkVDLFlBQUFBLFNBQVMsR0FBR3BJLE1BQU0sR0FBRyxJQUFULEdBQWdCbUksaUJBQWhCLEdBQW9DLEdBQWhEO0FBQ0EsV0FGRCxNQUVPLElBQUlKLFlBQVksS0FBSyxrQkFBakIsSUFBdUNJLGlCQUF2QyxJQUE0RG5JLE1BQWhFLEVBQXdFO0FBQzlFb0ksWUFBQUEsU0FBUyxHQUFHRCxpQkFBaUIsR0FBRyxJQUFwQixHQUEyQm5JLE1BQTNCLEdBQW9DLEdBQWhEO0FBQ0E7QUFDRDs7QUFDRCxlQUFPO0FBQ04sNkJBQW1CK0gsWUFEYjtBQUVOLHVCQUFhRixTQUZQO0FBR04sNkJBQW1CSyxnQkFIYjtBQUlOLG1CQUFTbEksTUFKSDtBQUtOLHlCQUFlbUksaUJBTFQ7QUFNTixzQkFBWUM7QUFOTixTQUFQO0FBUUE7O0FBQ0QsYUFBTy9DLFNBQVA7QUFDQSxLQXJacUI7O0FBdVp0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDbUQsSUFBQUEsdUJBQXVCLEVBQUUsVUFBUy9ILFNBQVQsRUFBMkJrQixVQUEzQixFQUE4Q3FGLGNBQTlDLEVBQW1FO0FBQzNGLFVBQU16SCxPQUFjLEdBQUcsRUFBdkI7QUFDQSxVQUFNa0osU0FBZ0IsR0FBRyxFQUF6QjtBQUNBLFVBQU1DLFFBQWUsR0FBRyxFQUF4QjtBQUNBLFVBQU1DLGtCQUF5QixHQUFHLEVBQWxDO0FBQ0EsVUFBTUMsaUJBQXNCLEdBQUcsRUFBL0I7QUFDQSxVQUFJQyxhQUFKO0FBQ0FsSCxNQUFBQSxVQUFVLENBQUM5QixPQUFYLENBQW1CLFVBQVNpSixLQUFULEVBQXFCO0FBQ3ZDLFlBQUlDLFNBQUo7O0FBQ0EsWUFBSUQsS0FBSyxDQUFDekYsWUFBTixJQUFzQnlGLEtBQUssQ0FBQ3pGLFlBQU4sQ0FBbUJuRCxPQUFuQixDQUEyQixHQUEzQixJQUFrQyxDQUFDLENBQTdELEVBQWdFO0FBQy9ELGNBQU1WLFVBQVUsR0FBR0osY0FBYyxDQUFDQywyQkFBZixDQUEyQ3lKLEtBQUssQ0FBQ3pGLFlBQWpELEVBQStEOUQsT0FBL0QsQ0FBbkI7QUFDQSxjQUFNZSxjQUFjLEdBQUd3SSxLQUFLLENBQUN6RixZQUFOLENBQW1CMUQsS0FBbkIsQ0FBeUIsR0FBekIsQ0FBdkI7QUFDQSxjQUFJcUosWUFBSjs7QUFDQSxlQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUd4SSxTQUFTLENBQUNDLE1BQTlCLEVBQXNDdUksQ0FBQyxFQUF2QyxFQUEyQztBQUMxQyxnQkFBTUMsb0JBQW9CLEdBQUd6SSxTQUFTLENBQUN3SSxDQUFELENBQVQsQ0FBYWxJLFNBQWIsQ0FBdUIrSCxLQUFLLENBQUN6RixZQUE3QixDQUE3QjtBQUNBMkYsWUFBQUEsWUFBWSxHQUFHRixLQUFLLENBQUN6RixZQUFOLEdBQXFCLEdBQXJCLEdBQTJCNkYsb0JBQTFDOztBQUNBLGdCQUFJLENBQUNOLGlCQUFpQixDQUFDSSxZQUFELENBQWxCLElBQW9DeEosVUFBVSxDQUFDYyxjQUFjLENBQUNBLGNBQWMsQ0FBQ0ksTUFBZixHQUF3QixDQUF6QixDQUFmLENBQWxELEVBQStGO0FBQzlGcUksY0FBQUEsU0FBUyxHQUFHM0osY0FBYyxDQUFDd0ksc0JBQWYsQ0FDWGtCLEtBQUssQ0FBQ3pGLFlBREssRUFFWHlGLEtBQUssQ0FBQ0ssV0FGSyxFQUdYTCxLQUFLLENBQUNNLFNBSEssRUFJWDNJLFNBQVMsQ0FBQ3dJLENBQUQsQ0FKRSxDQUFaO0FBTUF6SixjQUFBQSxVQUFVLENBQUNjLGNBQWMsQ0FBQ0EsY0FBYyxDQUFDSSxNQUFmLEdBQXdCLENBQXpCLENBQWYsQ0FBVixDQUFzRFEsSUFBdEQsQ0FBMkQ7QUFDMUQsd0JBQVM2SCxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sUUFBeEIsSUFBcUNILG9CQURhO0FBRTFELHVCQUFPSixLQUFLLENBQUN6RixZQUY2QztBQUcxRCw0QkFBWTBGO0FBSDhDLGVBQTNEO0FBS0FILGNBQUFBLGlCQUFpQixDQUFDSSxZQUFELENBQWpCLEdBQWtDRSxvQkFBbEM7QUFDQTtBQUNEO0FBQ0QsU0F0QkQsTUFzQk87QUFDTjNKLFVBQUFBLE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxHQUE4QjlELE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxJQUErQixFQUE3RDs7QUFDQSxjQUFJeUYsS0FBSyxDQUFDUSxZQUFWLEVBQXdCO0FBQ3ZCYixZQUFBQSxTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULEdBQWdDYixTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULElBQWlDLEVBQWpFO0FBQ0E7O0FBQ0QsZUFBSyxJQUFJTCxFQUFDLEdBQUcsQ0FBYixFQUFnQkEsRUFBQyxHQUFHeEksU0FBUyxDQUFDQyxNQUE5QixFQUFzQ3VJLEVBQUMsRUFBdkMsRUFBMkM7QUFDMUMsZ0JBQU1uSSxXQUFXLEdBQUdMLFNBQVMsQ0FBQ3dJLEVBQUQsQ0FBVCxDQUFhbEksU0FBYixFQUFwQjs7QUFDQThILFlBQUFBLGFBQWEsR0FBR0MsS0FBSyxDQUFDekYsWUFBTixHQUFxQixHQUFyQixHQUEyQnZDLFdBQVcsQ0FBQ2dJLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBdEQ7O0FBQ0EsZ0JBQUl5RixLQUFLLENBQUN6RixZQUFOLElBQXNCdkMsV0FBVyxDQUFDZ0ksS0FBSyxDQUFDekYsWUFBUCxDQUFqQyxJQUF5RCxDQUFDdUYsaUJBQWlCLENBQUNDLGFBQUQsQ0FBL0UsRUFBZ0c7QUFDL0ZFLGNBQUFBLFNBQVMsR0FBRzNKLGNBQWMsQ0FBQ3dJLHNCQUFmLENBQ1hrQixLQUFLLENBQUN6RixZQURLLEVBRVh5RixLQUFLLENBQUNLLFdBRkssRUFHWEwsS0FBSyxDQUFDTSxTQUhLLEVBSVgzSSxTQUFTLENBQUN3SSxFQUFELENBSkUsQ0FBWjtBQU1BMUosY0FBQUEsT0FBTyxDQUFDdUosS0FBSyxDQUFDekYsWUFBUCxDQUFQLENBQTRCbkMsSUFBNUIsQ0FBaUM7QUFDaEMsd0JBQVM2SCxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sUUFBeEIsSUFBcUN2SSxXQUFXLENBQUNnSSxLQUFLLENBQUN6RixZQUFQLENBRHhCO0FBRWhDLHVCQUFPeUYsS0FBSyxDQUFDekYsWUFGbUI7QUFHaEMsNEJBQVkwRjtBQUhvQixlQUFqQztBQUtBSCxjQUFBQSxpQkFBaUIsQ0FBQ0MsYUFBRCxDQUFqQixHQUFtQy9ILFdBQVcsQ0FBQ2dJLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBOUM7QUFDQTs7QUFDRCxnQkFBSXlGLEtBQUssQ0FBQ1EsWUFBTixJQUFzQnhJLFdBQVcsQ0FBQ2dJLEtBQUssQ0FBQ1EsWUFBUCxDQUFyQyxFQUEyRDtBQUMxRFQsY0FBQUEsYUFBYSxHQUFHQyxLQUFLLENBQUNRLFlBQU4sR0FBcUIsR0FBckIsR0FBMkJ4SSxXQUFXLENBQUNnSSxLQUFLLENBQUNRLFlBQVAsQ0FBdEQ7O0FBQ0Esa0JBQUksQ0FBQ1YsaUJBQWlCLENBQUNDLGFBQUQsQ0FBdEIsRUFBdUM7QUFDdENFLGdCQUFBQSxTQUFTLEdBQUczSixjQUFjLENBQUN3SSxzQkFBZixDQUNYa0IsS0FBSyxDQUFDUSxZQURLLEVBRVhSLEtBQUssQ0FBQ0ssV0FGSyxFQUdYTCxLQUFLLENBQUNNLFNBSEssRUFJWDNJLFNBQVMsQ0FBQ3dJLEVBQUQsQ0FKRSxDQUFaO0FBTUFSLGdCQUFBQSxTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULENBQThCcEksSUFBOUIsQ0FBbUM7QUFDbEMsMEJBQVM2SCxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sUUFBeEIsSUFBcUN2SSxXQUFXLENBQUNnSSxLQUFLLENBQUNRLFlBQVAsQ0FEdEI7QUFFbEMseUJBQU9SLEtBQUssQ0FBQ1EsWUFGcUI7QUFHbEMsOEJBQVlQO0FBSHNCLGlCQUFuQztBQUtBSCxnQkFBQUEsaUJBQWlCLENBQUNDLGFBQUQsQ0FBakIsR0FBbUMvSCxXQUFXLENBQUNnSSxLQUFLLENBQUNRLFlBQVAsQ0FBOUM7QUFDQTtBQUNEO0FBQ0Q7QUFDRDtBQUNELE9BakVEO0FBa0VBM0gsTUFBQUEsVUFBVSxDQUFDOUIsT0FBWCxDQUFtQixVQUFTaUosS0FBVCxFQUFxQjtBQUN2QyxZQUFJQSxLQUFLLENBQUN6RixZQUFOLENBQW1CbkQsT0FBbkIsQ0FBMkIsR0FBM0IsSUFBa0MsQ0FBQyxDQUF2QyxFQUEwQztBQUN6QyxjQUFNcUosd0JBQXdCLEdBQUduSyxjQUFjLENBQUNlLHlCQUFmLENBQXlDMkksS0FBSyxDQUFDekYsWUFBL0MsRUFBNkQ5RCxPQUE3RCxDQUFqQzs7QUFDQSxjQUFJLENBQUNnSyx3QkFBTCxFQUErQjtBQUM5QkEsWUFBQUEsd0JBQXdCLENBQUNySSxJQUF6QixDQUE4QjtBQUFFcUcsY0FBQUEsSUFBSSxFQUFFUCxjQUFjLENBQUNVLGVBQXZCO0FBQXdDRCxjQUFBQSxHQUFHLEVBQUUsV0FBV3FCLEtBQUssQ0FBQ3pGO0FBQTlELGFBQTlCO0FBQ0EsV0FGRCxNQUVPO0FBQ05qRSxZQUFBQSxjQUFjLENBQUMySCx3QkFBZixDQUF3Q3dDLHdCQUF4QyxFQUFrRTlJLFNBQWxFLEVBQTZFdUcsY0FBN0UsRUFBNkY4QixLQUE3RjtBQUNBO0FBQ0QsU0FQRCxNQU9PLElBQUl2SixPQUFPLENBQUN1SixLQUFLLENBQUN6RixZQUFQLENBQVAsSUFBK0I5RCxPQUFPLENBQUN1SixLQUFLLENBQUN6RixZQUFQLENBQVAsQ0FBNEIzQyxNQUEvRCxFQUF1RTtBQUM3RXRCLFVBQUFBLGNBQWMsQ0FBQzJILHdCQUFmLENBQXdDeEgsT0FBTyxDQUFDdUosS0FBSyxDQUFDekYsWUFBUCxDQUEvQyxFQUFxRTVDLFNBQXJFLEVBQWdGdUcsY0FBaEYsRUFBZ0c4QixLQUFoRztBQUNBOztBQUNELFlBQUlMLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDUSxZQUFQLENBQVQsSUFBaUNiLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDUSxZQUFQLENBQVQsQ0FBOEI1SSxNQUFuRSxFQUEyRTtBQUMxRXRCLFVBQUFBLGNBQWMsQ0FBQzJILHdCQUFmLENBQXdDMEIsU0FBUyxDQUFDSyxLQUFLLENBQUNRLFlBQVAsQ0FBakQsRUFBdUU3SSxTQUF2RSxFQUFrRnVHLGNBQWxGLEVBQWtHOEIsS0FBbEcsRUFBeUcsSUFBekc7QUFDQSxTQUZELE1BRU8sSUFDTEEsS0FBSyxDQUFDekYsWUFBTixJQUFzQjlELE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBN0IsSUFBcUQsQ0FBQzlELE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxDQUE0QjNDLE1BQW5GLElBQ0NvSSxLQUFLLENBQUNRLFlBQU4sSUFBc0JiLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDUSxZQUFQLENBQS9CLElBQXVELENBQUNiLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDUSxZQUFQLENBQVQsQ0FBOEI1SSxNQUZqRixFQUdMO0FBQ0QsY0FBTThJLDZCQUE2QixHQUNsQ2pLLE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxJQUNBOUQsT0FBTyxDQUFDdUosS0FBSyxDQUFDekYsWUFBUCxDQUFQLENBQTRCN0IsSUFBNUIsQ0FBaUMsVUFBU2lJLEdBQVQsRUFBbUI7QUFDbkQsbUJBQU9BLEdBQUcsQ0FBQ2xDLElBQUosS0FBYSxrQkFBYixJQUFtQ2tDLEdBQUcsQ0FBQ2xDLElBQUosS0FBYSxpQkFBdkQ7QUFDQSxXQUZELENBRkQ7O0FBS0EsY0FBSXVCLEtBQUssQ0FBQ3pGLFlBQU4sSUFBc0IsQ0FBQ21HLDZCQUEzQixFQUEwRDtBQUN6RGpLLFlBQUFBLE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxDQUE0Qm5DLElBQTVCLENBQWlDO0FBQUVxRyxjQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ1UsZUFBdkI7QUFBd0NELGNBQUFBLEdBQUcsRUFBRSxXQUFXcUIsS0FBSyxDQUFDekY7QUFBOUQsYUFBakM7QUFDQTs7QUFDRCxjQUFNcUcsaUNBQWlDLEdBQ3RDakIsU0FBUyxDQUFDSyxLQUFLLENBQUNRLFlBQVAsQ0FBVCxJQUNBYixTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULENBQThCOUgsSUFBOUIsQ0FBbUMsVUFBU2lJLEdBQVQsRUFBbUI7QUFDckQsbUJBQU9BLEdBQUcsQ0FBQ2xDLElBQUosS0FBYSxrQkFBYixJQUFtQ2tDLEdBQUcsQ0FBQ2xDLElBQUosS0FBYSxpQkFBdkQ7QUFDQSxXQUZELENBRkQ7O0FBS0EsY0FBSXVCLEtBQUssQ0FBQ1EsWUFBTixJQUFzQixDQUFDSSxpQ0FBM0IsRUFBOEQ7QUFDN0RqQixZQUFBQSxTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULENBQThCcEksSUFBOUIsQ0FBbUM7QUFDbENxRyxjQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ1UsZUFEYTtBQUVsQ0QsY0FBQUEsR0FBRyxFQUFFLFdBQVdxQixLQUFLLENBQUNRO0FBRlksYUFBbkM7QUFJQTtBQUNEOztBQUNELFlBQUlSLEtBQUssQ0FBQ2Esa0JBQU4sSUFBNEIsT0FBT2IsS0FBSyxDQUFDYSxrQkFBYixLQUFvQyxTQUFwRSxFQUErRTtBQUM5RWhCLFVBQUFBLGtCQUFrQixDQUFDekgsSUFBbkIsQ0FBd0I7QUFBRSx3QkFBWTRILEtBQUssQ0FBQ3pGLFlBQXBCO0FBQWtDdUcsWUFBQUEsS0FBSyxFQUFFZCxLQUFLLENBQUNhLGtCQUEvQztBQUFtRTVFLFlBQUFBLElBQUksRUFBRTtBQUF6RSxXQUF4QjtBQUNBLFNBRkQsTUFFTyxJQUNOK0QsS0FBSyxDQUFDYSxrQkFBTixJQUNBYixLQUFLLENBQUNhLGtCQUFOLENBQXlCRSxRQUR6QixJQUVBZixLQUFLLENBQUNhLGtCQUFOLENBQXlCRSxRQUF6QixDQUFrQyxDQUFsQyxDQUZBLElBR0FmLEtBQUssQ0FBQ2Esa0JBQU4sQ0FBeUJFLFFBQXpCLENBQWtDLENBQWxDLEVBQXFDQyxRQUhyQyxJQUlBaEIsS0FBSyxDQUFDYSxrQkFBTixDQUF5QkUsUUFBekIsQ0FBa0MsQ0FBbEMsRUFBcUNFLFFBTC9CLEVBTUw7QUFDRDtBQUNBcEIsVUFBQUEsa0JBQWtCLENBQUN6SCxJQUFuQixDQUF3QjtBQUN2Qix3QkFBWTRILEtBQUssQ0FBQ3pGLFlBREs7QUFFdkIyRyxZQUFBQSxZQUFZLEVBQUVsQixLQUFLLENBQUNhLGtCQUFOLENBQXlCRSxRQUF6QixDQUFrQyxDQUFsQyxFQUFxQ0MsUUFBckMsQ0FBOEN6QixJQUZyQztBQUd2QjRCLFlBQUFBLGFBQWEsRUFBRW5CLEtBQUssQ0FBQ2Esa0JBQU4sQ0FBeUJFLFFBQXpCLENBQWtDLENBQWxDLEVBQXFDRSxRQUFyQyxDQUE4Q0gsS0FIdEM7QUFJdkI3RSxZQUFBQSxJQUFJLEVBQUU7QUFKaUIsV0FBeEI7QUFNQTtBQUNELE9BdEREO0FBdURBLFVBQU0rRCxLQUFLLEdBQUc7QUFBRSxrQkFBVXZKLE9BQVo7QUFBcUIsb0JBQVlrSixTQUFqQztBQUE0QyxtQkFBV0MsUUFBdkQ7QUFBaUUsZ0NBQXdCQztBQUF6RixPQUFkO0FBQ0EsVUFBTXVCLGdCQUFnQixHQUFHLElBQUkxSCxTQUFKLENBQWNzRyxLQUFkLENBQXpCO0FBQ0EsYUFBT29CLGdCQUFQO0FBQ0EsS0FwaUJxQjs7QUFzaUJ0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLFlBQVksRUFBRSxVQUFTekksTUFBVCxFQUF3QmpCLFNBQXhCLEVBQTBDMkosV0FBMUMsRUFBdUU7QUFDcEYsVUFBTUMsYUFBYSxHQUFHLDhDQUF0QjtBQUFBLFVBQ0MxSSxVQUFpQixHQUFHLEVBRHJCO0FBQUEsVUFFQzRFLGVBQWUsR0FBRytELEdBQUcsQ0FBQ0MsRUFBSixDQUFPQyxPQUFQLEdBQWlCQyx3QkFBakIsQ0FBMEMsYUFBMUMsQ0FGbkI7QUFBQSxVQUdDekQsY0FBYyxHQUFHNUgsY0FBYyxDQUFDa0gsd0JBQWYsQ0FBd0NDLGVBQXhDLEVBQXlEOUYsU0FBUyxDQUFDQyxNQUFuRSxFQUEyRWdCLE1BQTNFLENBSGxCO0FBQUEsVUFJQ2EsZUFBZSxHQUFHbkQsY0FBYyxDQUFDcUMsb0JBQWYsQ0FBb0NDLE1BQXBDLEVBQTRDakIsU0FBNUMsRUFBdURrQixVQUF2RCxDQUpuQjtBQUFBLFVBS0N1SSxnQkFBZ0IsR0FBRzlLLGNBQWMsQ0FBQ29KLHVCQUFmLENBQXVDL0gsU0FBdkMsRUFBa0RrQixVQUFsRCxFQUE4RHFGLGNBQTlELENBTHBCO0FBT0EsYUFBTyxJQUFJMEQsT0FBSixDQUFZLFVBQVNDLE9BQVQsRUFBd0NDLE1BQXhDLEVBQXdFO0FBQzFGLFlBQU1DLFNBQVMsR0FBR0Msb0JBQW9CLENBQUNDLFlBQXJCLENBQWtDVixhQUFsQyxFQUFpRCxVQUFqRCxDQUFsQjtBQUNBLGVBQU9LLE9BQU8sQ0FBQ0MsT0FBUixDQUNOSyxlQUFlLENBQUNDLE9BQWhCLENBQ0NKLFNBREQsRUFFQztBQUFFakgsVUFBQUEsSUFBSSxFQUFFeUc7QUFBUixTQUZELEVBR0M7QUFDQ2EsVUFBQUEsZUFBZSxFQUFFO0FBQ2hCQyxZQUFBQSxjQUFjLEVBQUU1SSxlQUFlLENBQUM2SSxvQkFBaEIsQ0FBcUMsR0FBckM7QUFEQSxXQURsQjtBQUlDQyxVQUFBQSxNQUFNLEVBQUU7QUFDUEYsWUFBQUEsY0FBYyxFQUFFNUk7QUFEVDtBQUpULFNBSEQsQ0FETSxFQWNMK0ksSUFkSyxDQWNBLFVBQVNULFNBQVQsRUFBeUI7QUFDOUIsaUJBQU9VLFFBQVEsQ0FBQ0MsSUFBVCxDQUFjO0FBQUVDLFlBQUFBLFVBQVUsRUFBRVo7QUFBZCxXQUFkLEVBQXlDUyxJQUF6QyxDQUE4QyxVQUFTSSxjQUFULEVBQThCO0FBQ2xGLGdCQUFNQyxPQUFPLEdBQUcsSUFBSUMsTUFBSixDQUFXO0FBQzFCQyxjQUFBQSxLQUFLLEVBQUU3RSxjQUFjLENBQUM4RSxhQURJO0FBRTFCQyxjQUFBQSxPQUFPLEVBQUUsQ0FBQ0wsY0FBRCxDQUZpQjtBQUcxQk0sY0FBQUEsV0FBVyxFQUFFLElBQUlDLE1BQUosQ0FBVztBQUN2QjFFLGdCQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ2tGLGVBREU7QUFFdkJuSCxnQkFBQUEsSUFBSSxFQUFFLFlBRmlCO0FBR3ZCb0gsZ0JBQUFBLEtBQUssRUFBRSxVQUFTQyxNQUFULEVBQXNCO0FBQzVCLHNCQUFNVCxPQUFPLEdBQUdTLE1BQU0sQ0FBQ0MsU0FBUCxHQUFtQkMsU0FBbkIsRUFBaEI7QUFDQSxzQkFBTUMsTUFBTSxHQUFHWixPQUFPLENBQUM5SixRQUFSLENBQWlCLFlBQWpCLENBQWY7QUFDQSxzQkFBTTZHLFFBQVEsR0FBRzZELE1BQU0sQ0FBQ2xJLFdBQVAsQ0FBbUIsVUFBbkIsQ0FBakI7QUFDQSxzQkFBTW1JLHFCQUFxQixHQUFHRCxNQUFNLENBQUNsSSxXQUFQLENBQW1CLHVCQUFuQixDQUE5QjtBQUNBLHNCQUFNb0ksYUFBb0IsR0FBRyxFQUE3QjtBQUNBLHNCQUFJQyxjQUFjLEdBQUcsS0FBckI7QUFFQWpNLGtCQUFBQSxTQUFTLENBQUNaLE9BQVYsQ0FBa0IsVUFBU2MsZ0JBQVQsRUFBZ0M7QUFDakQrSCxvQkFBQUEsUUFBUSxDQUFDN0ksT0FBVCxDQUFpQixVQUFTNEMsT0FBVCxFQUF1QjtBQUN2QztBQUNBLDBCQUFJK0oscUJBQUosRUFBMkI7QUFDMUJFLHdCQUFBQSxjQUFjLEdBQUdGLHFCQUFxQixDQUFDaEwsSUFBdEIsQ0FBMkIsVUFBUzhCLGFBQVQsRUFBNkI7QUFDeEUsOEJBQUliLE9BQU8sQ0FBQ2tLLFFBQVIsS0FBcUJySixhQUFhLENBQUNzSixRQUF2QyxFQUFpRDtBQUNoRCxnQ0FBSXRKLGFBQWEsQ0FBQ3lCLElBQWQsS0FBdUIsU0FBM0IsRUFBc0M7QUFDckMscUNBQU96QixhQUFhLENBQUNzRyxLQUFkLEtBQXdCLElBQS9CO0FBQ0EsNkJBRkQsTUFFTyxJQUNOdEcsYUFBYSxDQUFDeUIsSUFBZCxLQUF1QixNQUF2QixJQUNBekIsYUFBYSxDQUFDMkcsYUFEZCxJQUVBM0csYUFBYSxDQUFDMEcsWUFIUixFQUlMO0FBQ0QscUNBQ0NySixnQkFBZ0IsQ0FBQ0ksU0FBakIsQ0FBMkJ1QyxhQUFhLENBQUMwRyxZQUF6QyxNQUNBMUcsYUFBYSxDQUFDMkcsYUFGZjtBQUlBO0FBQ0Q7QUFDRCx5QkFmZ0IsQ0FBakI7QUFnQkE7O0FBQ0QsMEJBQUl4SCxPQUFPLENBQUNrSyxRQUFSLElBQW9CbEssT0FBTyxDQUFDbUgsS0FBUixLQUFrQixTQUF0QyxJQUFtRCxDQUFDOEMsY0FBeEQsRUFBd0U7QUFDdkVELHdCQUFBQSxhQUFhLENBQUN2TCxJQUFkLENBQW1CUCxnQkFBZ0IsQ0FBQ2tNLFdBQWpCLENBQTZCcEssT0FBTyxDQUFDa0ssUUFBckMsRUFBK0NsSyxPQUFPLENBQUNtSCxLQUF2RCxDQUFuQjtBQUNBO0FBQ0QscUJBdkJEO0FBd0JBLG1CQXpCRDtBQTBCQSx5QkFBT2MsT0FBTyxDQUFDb0MsR0FBUixDQUFZTCxhQUFaLEVBQ0xuQixJQURLLENBQ0EsVUFBU3lCLElBQVQsRUFBc0I7QUFDM0Isd0JBQU1DLFlBQVksR0FBR3RMLE1BQU0sQ0FBQ3VMLGFBQVAsRUFBckI7QUFBQSx3QkFDQ0MsYUFBYSxHQUFHOUMsV0FBVyxJQUFLQSxXQUFXLENBQUMrQyxlQUFaLEVBRGpDO0FBRUEsMkJBQU9ELGFBQWEsQ0FBQ0UsT0FBZCxDQUFzQkosWUFBWSxDQUFDeEksT0FBYixFQUF0QixFQUE4QzhHLElBQTlDLENBQW1ELFlBQVc7QUFDcEVLLHNCQUFBQSxPQUFPLENBQUMwQixLQUFSO0FBQ0ExQixzQkFBQUEsT0FBTyxDQUFDMkIsT0FBUjtBQUNBLDZCQUFPUCxJQUFQO0FBQ0EscUJBSk0sQ0FBUDtBQUtBLG1CQVRLLEVBVUxRLEtBVkssQ0FVQyxVQUFTQyxNQUFULEVBQXNCO0FBQzVCO0FBQ0FDLG9CQUFBQSxHQUFHLENBQUNDLEtBQUosQ0FBVSxzREFBVixFQUFrRUYsTUFBbEU7QUFDQSxtQkFiSyxDQUFQO0FBY0E7QUFuRHNCLGVBQVgsQ0FIYTtBQXdEMUJHLGNBQUFBLFNBQVMsRUFBRSxJQUFJMUIsTUFBSixDQUFXO0FBQ3JCMUUsZ0JBQUFBLElBQUksRUFBRVAsY0FBYyxDQUFDNEcsZ0JBREE7QUFFckJ6QixnQkFBQUEsS0FBSyxFQUFFLFVBQVNDLE1BQVQsRUFBc0I7QUFDNUIsc0JBQU1ULE9BQU8sR0FBR1MsTUFBTSxDQUFDQyxTQUFQLEdBQW1CQyxTQUFuQixFQUFoQjtBQUNBWCxrQkFBQUEsT0FBTyxDQUFDMEIsS0FBUjtBQUNBMUIsa0JBQUFBLE9BQU8sQ0FBQzJCLE9BQVI7QUFDQTtBQU5vQixlQUFYO0FBeERlLGFBQVgsQ0FBaEI7QUFpRUEzQixZQUFBQSxPQUFPLENBQUNrQyxRQUFSLENBQWlCM0QsZ0JBQWpCLEVBQW1DLFlBQW5DO0FBQ0FTLFlBQUFBLE9BQU8sQ0FBQ2dCLE9BQUQsQ0FBUDtBQUNBLFdBcEVNLENBQVA7QUFxRUEsU0FwRkssRUFxRkw0QixLQXJGSyxDQXFGQzNDLE1BckZELENBQVA7QUFzRkEsT0F4Rk0sQ0FBUDtBQXlGQTtBQS9vQnFCLEdBQXZCO1NBa3BCZXhMLGMiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCwgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBnZXRUZXh0QmluZGluZyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHsgZ2V0RWRpdGFibGVFeHByZXNzaW9uLCBnZXRSZXF1aXJlZEV4cHJlc3Npb24gfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuXG4vKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBmb3IgbWFzcyBlZGl0IGZ1bmN0aW9uYWxpdHkgKi9cbnR5cGUgVGV4dEFycmFuZ2VtZW50SW5mbyA9IHtcblx0dGV4dEFycmFuZ2VtZW50OiBzdHJpbmc7XG5cdHZhbHVlUGF0aDogc3RyaW5nO1xuXHRkZXNjcmlwdGlvblBhdGg/OiBzdHJpbmc7XG5cdHZhbHVlOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdGZ1bGxUZXh0OiBzdHJpbmc7XG59O1xuY29uc3QgYVZhbGlkRGF0YVR5cGVzID0gW1xuXHRcIkVkbS5Cb29sZWFuXCIsXG5cdFwiRWRtLkJ5dGVcIixcblx0XCJFZG0uRGVjaW1hbFwiLFxuXHRcIkVkbS5Eb3VibGVcIixcblx0XCJFZG0uRmxvYXRcIixcblx0XCJFZG0uR3VpZFwiLFxuXHRcIkVkbS5JbnQxNlwiLFxuXHRcIkVkbS5JbnQzMlwiLFxuXHRcIkVkbS5JbnQ2NFwiLFxuXHRcIkVkbS5TQnl0ZVwiLFxuXHRcIkVkbS5TaW5nbGVcIixcblx0XCJFZG0uU3RyaW5nXCJcbl07XG5jb25zdCBNYXNzRWRpdEhlbHBlciA9IHtcblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBhdCBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGggd2l0aCBhIGJsYW5rIGFycmF5LlxuXHQgKiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkgcG9pbnRpbmcgdG8gdGhlIGZpbmFsIG9yIGRlZXBlc3QgbGV2ZWwgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEByZXR1cm5zIHtBcnJheX1cblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZywgYVZhbHVlczogYW55KSB7XG5cdFx0bGV0IGFGaW5hbFBhdGg6IGFueTtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdGNvbnN0IGFQYXRocyA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgc0Z1bGxQYXRoID0gXCJcIjtcblx0XHRhUGF0aHMuZm9yRWFjaChmdW5jdGlvbihzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGlmICghYVZhbHVlc1tzUHJvcGVydHlQYXRoXSAmJiBpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdGFGaW5hbFBhdGggPSBhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fSBlbHNlIGlmICghYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBcIi9cIiArIHNQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGlmIChzRnVsbFBhdGggIT09IHNQYXRoKSB7XG5cdFx0XHRcdFx0YUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSA9IHt9O1xuXHRcdFx0XHRcdGFGaW5hbFBhdGggPSBhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhRmluYWxQYXRoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHVuaXF1ZSB2YWx1ZXMgZm9yIGdpdmVuIGFycmF5IHZhbHVlcy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNWYWx1ZSBQcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggb2YgdGhlIHByb3BlcnR5IHZhbHVlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgSW5zdGFuY2Ugb2YgdGhlIGFycmF5XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0Z2V0VW5pcXVlVmFsdWVzOiBmdW5jdGlvbihzVmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgc2VsZjogYW55W10pIHtcblx0XHRpZiAoc1ZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gc2VsZi5pbmRleE9mKHNWYWx1ZSkgPT09IGluZGV4O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGEgbXVsdGktbGV2ZWwgcGF0aCAoZm9yIGV4YW1wbGU6IF9NYXRlcmlhbHMvTWF0ZXJpYWxfRGV0YWlscyBnZXRzIHRoZSB2YWx1ZSBvZiBNYXRlcmlhbF9EZXRhaWxzIHVuZGVyIF9NYXRlcmlhbHMgT2JqZWN0KS5cblx0ICogUmV0dXJucyB0aGUgcHJvcGVydHlWYWx1ZSwgd2hpY2ggY2FuIGJlIG9mIGFueSB0eXBlIChzdHJpbmcsIG51bWJlciwgZXRjLi4pLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0RhdGFQcm9wZXJ0eVBhdGggUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZhbHVlcyBPYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Z2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aDogZnVuY3Rpb24oc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZywgb1ZhbHVlczogYW55KSB7XG5cdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoICYmIHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRsZXQgUmVzdWx0OiBhbnk7XG5cdFx0XHRhUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0UmVzdWx0ID0gb1ZhbHVlcyAmJiBvVmFsdWVzW3NQYXRoXSA/IG9WYWx1ZXNbc1BhdGhdIDogUmVzdWx0ICYmIFJlc3VsdFtzUGF0aF07XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBSZXN1bHQ7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBrZXkgcGF0aCBmb3IgdGhlIGtleSBvZiBhIGNvbWJvIGJveCB0aGF0IG11c3QgYmUgc2VsZWN0ZWQgaW5pdGlhbGx5IHdoZW4gdGhlIGRpYWxvZyBvcGVuczpcblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGRpZmZlcmVudCwgdGhlbiA8IEtlZXAgRXhpc3RpbmcgVmFsdWVzID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyB0aGUgc2FtZSwgdGhlbiB0aGUgcHJvcGVydHlWYWx1ZSBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGVtcHR5LCB0aGVuIDwgTGVhdmUgQmxhbmsgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICpcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIERhdGEgcHJvcGVydHkgcGF0aFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24oYUNvbnRleHRzOiBhbnlbXSwgc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGFDb250ZXh0cyxcblx0XHRcdFx0YVByb3BlcnR5VmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0b1NlbGVjdGVkQ29udGV4dC5mb3JFYWNoKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGFPYmplY3QgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0Y29uc3Qgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uID1cblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xICYmIG9EYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KHNEYXRhUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKVswXSk7XG5cdFx0XHRcdGlmIChvQ29udGV4dCAmJiAob0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGgpIHx8IHNNdWx0aUxldmVsUGF0aENvbmRpdGlvbikpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlWYWx1ZXMucHVzaChvQ29udGV4dC5nZXRPYmplY3Qoc0RhdGFQcm9wZXJ0eVBhdGgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhVW5pcXVlUHJvcGVydHlWYWx1ZXMgPSBhUHJvcGVydHlWYWx1ZXMuZmlsdGVyKE1hc3NFZGl0SGVscGVyLmdldFVuaXF1ZVZhbHVlcyk7XG5cdFx0XHRpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0cmV0dXJuIFwiRGVmYXVsdC9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiBcIkVtcHR5L1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHR9IGVsc2UgaWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGhpZGRlbiBhbm5vdGF0aW9uIHZhbHVlIFtib3RoIHN0YXRpYyBhbmQgcGF0aCBiYXNlZF0gZm9yIHRhYmxlJ3Mgc2VsZWN0ZWQgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHsqfSBoaWRkZW5WYWx1ZSBIaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSAvIHBhdGggZm9yIGZpZWxkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0Z2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0czogZnVuY3Rpb24oaGlkZGVuVmFsdWU6IGFueSwgYUNvbnRleHRzOiBhbnlbXSkge1xuXHRcdGlmIChoaWRkZW5WYWx1ZSAmJiBoaWRkZW5WYWx1ZS4kUGF0aCkge1xuXHRcdFx0cmV0dXJuICFhQ29udGV4dHMuc29tZShmdW5jdGlvbihvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIEpTT04gTW9kZWwgZm9yIHByb3BlcnRpZXMgb2YgZGlhbG9nIGZpZWxkcyBbbGFiZWwsIHZpc2libGl0eSwgZGF0YXByb3BlcnR5LCBldGMuXS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9UYWJsZSBJbnN0YW5jZSBvZiBUYWJsZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9XG5cdCAqL1xuXHRwcmVwYXJlRGF0YUZvckRpYWxvZzogZnVuY3Rpb24ob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1RhYmxlICYmIChvVGFibGUuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLFxuXHRcdFx0c0N1cnJlbnRFbnRpdHlTZXROYW1lID0gb1RhYmxlLmRhdGEoXCJtZXRhUGF0aFwiKSxcblx0XHRcdGFUYWJsZUZpZWxkcyA9IE1hc3NFZGl0SGVscGVyLmdldFRhYmxlRmllbGRzKG9UYWJsZSksXG5cdFx0XHRvRW50aXR5VHlwZUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvQFwiKSxcblx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlUeXBlQ29udGV4dCk7XG5cblx0XHRjb25zdCBvRGF0YUZpZWxkTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0bGV0IG9SZXN1bHQ7XG5cdFx0bGV0IHNMYWJlbFRleHQ7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkO1xuXHRcdGxldCBzVW5pdFByb3BlcnR5UGF0aDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0O1xuXHRcdGxldCBiSXNJbW11dGFibGU7XG5cdFx0bGV0IGJJc0NvbXB1dGVkO1xuXHRcdGxldCBiQ2hhcnRQcm9wZXJ0eTtcblx0XHRsZXQgb1RleHRCaW5kaW5nO1xuXHRcdGxldCBiVmFsaWREYXRhVHlwZTtcblx0XHRsZXQgYkluVmFsaWRJbnB1dFR5cGU7XG5cblx0XHRhVGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbihvQ29sdW1uSW5mbzogYW55KSB7XG5cdFx0XHRjb25zdCBzRGF0YVByb3BlcnR5UGF0aCA9IG9Db2x1bW5JbmZvLmRhdGFQcm9wZXJ0eTtcblx0XHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCkge1xuXHRcdFx0XHRsZXQgb1Byb3BlcnR5SW5mbyA9IHNEYXRhUHJvcGVydHlQYXRoICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGggKyBcIkBcIik7XG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkID1cblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGggKyBcIkBcIikgJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpW1xuXHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFwiXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0c1VuaXRQcm9wZXJ0eVBhdGggPVxuXHRcdFx0XHRcdChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLlVuaXRcIl0gJiYgb1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuVW5pdFwiXS4kUGF0aCkgfHxcblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJlxuXHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuSVNPQ3VycmVuY3lcIl0gJiZcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLklTT0N1cnJlbmN5XCJdLiRQYXRoKTtcblx0XHRcdFx0c0xhYmVsVGV4dCA9IG9Db2x1bW5JbmZvLmxhYmVsIHx8IChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsXCJdKTtcblx0XHRcdFx0YlZhbHVlSGVscEVuYWJsZWRGb3JVbml0ID1cblx0XHRcdFx0XHRzVW5pdFByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc1VuaXRQcm9wZXJ0eVBhdGggKyBcIkBcIikgJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNVbml0UHJvcGVydHlQYXRoICsgXCJAXCIpW1xuXHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFwiXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0aWYgKG9EYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0XHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbihcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXHRcdFx0XHRiSXNJbW11dGFibGUgPVxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgJiYgb1Byb3BlcnR5Q29udGV4dC5nZXRQcm9wZXJ0eSgpICYmIG9Qcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoKVtcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl07XG5cdFx0XHRcdGJJc0NvbXB1dGVkID1cblx0XHRcdFx0XHRvUHJvcGVydHlDb250ZXh0ICYmIG9Qcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoKSAmJiBvUHJvcGVydHlDb250ZXh0LmdldFByb3BlcnR5KClbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl07XG5cdFx0XHRcdGNvbnN0IGJIaWRkZW5GaWVsZCA9XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyhcblx0XHRcdFx0XHRcdG9GaWVsZENvbnRleHQgJiYgb0ZpZWxkQ29udGV4dC5nZXRPYmplY3QoKVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl0sXG5cdFx0XHRcdFx0XHRhQ29udGV4dHNcblx0XHRcdFx0XHQpIHx8IGZhbHNlO1xuXHRcdFx0XHRvSW50ZXJmYWNlLmNvbnRleHQgPSB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvUHJvcGVydHlJbmZvID1cblx0XHRcdFx0XHQob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUuJHRhcmdldCkgfHxcblx0XHRcdFx0XHQob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC4kdGFyZ2V0KTtcblx0XHRcdFx0Ly8gRGF0YWZpZWxkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgRmllbGRDb250cm9sIGNhbGN1bGF0aW9uLCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0XHRjb25zdCBpc1JlYWRPbmx5ID0gaXNSZWFkT25seUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGJDaGFydFByb3BlcnR5ID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLnRlcm0gJiYgb1Byb3BlcnR5SW5mby50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHRcdGJWYWxpZERhdGFUeXBlID0gb1Byb3BlcnR5SW5mbyAmJiBhVmFsaWREYXRhVHlwZXMuaW5kZXhPZihvUHJvcGVydHlJbmZvLnR5cGUpICE9PSAtMTtcblx0XHRcdFx0YkluVmFsaWRJbnB1dFR5cGUgPVxuXHRcdFx0XHRcdChvQ29sdW1uSW5mbyAmJlxuXHRcdFx0XHRcdFx0b0NvbHVtbkluZm8uaW5wdXRUeXBlICYmXG5cdFx0XHRcdFx0XHQob0NvbHVtbkluZm8uaW5wdXRUeXBlID09PSBcInNhcC5tLlJhdGluZ0luZGljYXRvclwiIHx8IG9Db2x1bW5JbmZvLmlucHV0VHlwZSA9PT0gXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkgfHxcblx0XHRcdFx0XHRoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdCFiSGlkZGVuRmllbGQgJiZcblx0XHRcdFx0XHQhYklzSW1tdXRhYmxlICYmXG5cdFx0XHRcdFx0IWJJc0NvbXB1dGVkICYmXG5cdFx0XHRcdFx0IWJDaGFydFByb3BlcnR5ICYmXG5cdFx0XHRcdFx0YlZhbGlkRGF0YVR5cGUgJiZcblx0XHRcdFx0XHQhYkluVmFsaWRJbnB1dFR5cGUgJiZcblx0XHRcdFx0XHRvQ29sdW1uSW5mby5pbnB1dFR5cGUgJiZcblx0XHRcdFx0XHRnZXRFZGl0YWJsZUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbywgb0RhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpICE9PSBcImZhbHNlXCJcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b1Jlc3VsdCA9IHtcblx0XHRcdFx0XHRcdFwibGFiZWxcIjogc0xhYmVsVGV4dCArIFwiOlwiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6XG5cdFx0XHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoICYmXG5cdFx0XHRcdFx0XHRcdCFiSGlkZGVuRmllbGQgJiZcblx0XHRcdFx0XHRcdFx0IWJJc0ltbXV0YWJsZSAmJlxuXHRcdFx0XHRcdFx0XHQhYklzQ29tcHV0ZWQgJiZcblx0XHRcdFx0XHRcdFx0Z2V0RWRpdGFibGVFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxPYmplY3RQYXRoKSxcblx0XHRcdFx0XHRcdFwiZGF0YVByb3BlcnR5XCI6IHNEYXRhUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRcIjogYlZhbHVlSGVscEVuYWJsZWQgPyBiVmFsdWVIZWxwRW5hYmxlZCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJ1bml0UHJvcGVydHlcIjogc1VuaXRQcm9wZXJ0eVBhdGggPyBzVW5pdFByb3BlcnR5UGF0aCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0XCI6IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA/IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJwcm9wZXJ0eVBhdGhGb3JWYWx1ZUhlbHBcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwVW5pdFwiOiBzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNVbml0UHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XCJpc0ZpZWxkUmVxdWlyZWRcIjogZ2V0UmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIHRydWUpLFxuXHRcdFx0XHRcdFx0XCJkZWZhdWx0U2VsZWN0aW9uUGF0aFwiOiBzRGF0YVByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzRGF0YVByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblVuaXRQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdD8gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIHNVbml0UHJvcGVydHlQYXRoKVxuXHRcdFx0XHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJlbnRpdHlTZXRcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdFx0XCJ0ZXh0QmluZGluZ1wiOiBvVGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcIm51bGxhYmxlXCI6IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgIT09IHVuZGVmaW5lZCA/IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJpc1Byb3BlcnR5UmVhZE9ubHlcIjogaXNSZWFkT25seSAhPT0gdW5kZWZpbmVkID8gaXNSZWFkT25seSA6IGZhbHNlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhRGF0YUFycmF5LnB1c2gob1Jlc3VsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGF0YUZpZWxkTW9kZWwuc2V0RGF0YShhRGF0YUFycmF5KTtcblx0XHRyZXR1cm4gb0RhdGFGaWVsZE1vZGVsO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZUZvckNvbHVtbjogZnVuY3Rpb24ob0NvbHVtbjogYW55KSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG9Db2x1bW4uZ2V0VGVtcGxhdGUoKS5nZXRDb250ZW50ICYmXG5cdFx0XHRvQ29sdW1uLmdldFRlbXBsYXRlKCkuZ2V0Q29udGVudCgpICYmXG5cdFx0XHRvQ29sdW1uLmdldFRlbXBsYXRlKCkuZ2V0Q29udGVudCgpLmdldENvbnRlbnRFZGl0ICYmXG5cdFx0XHRvQ29sdW1uXG5cdFx0XHRcdC5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdC5nZXRDb250ZW50KClcblx0XHRcdFx0LmdldENvbnRlbnRFZGl0KCkgJiZcblx0XHRcdG9Db2x1bW5cblx0XHRcdFx0LmdldFRlbXBsYXRlKClcblx0XHRcdFx0LmdldENvbnRlbnQoKVxuXHRcdFx0XHQuZ2V0Q29udGVudEVkaXQoKVswXSAmJlxuXHRcdFx0b0NvbHVtblxuXHRcdFx0XHQuZ2V0VGVtcGxhdGUoKVxuXHRcdFx0XHQuZ2V0Q29udGVudCgpXG5cdFx0XHRcdC5nZXRDb250ZW50RWRpdCgpWzBdXG5cdFx0XHRcdC5nZXRNZXRhZGF0YSgpXG5cdFx0XHRcdC5nZXROYW1lKClcblx0XHQpO1xuXHR9LFxuXG5cdGdldFRhYmxlRmllbGRzOiBmdW5jdGlvbihvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uKG9Db2x1bW46IGFueSkge1xuXHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eSA9IG9Db2x1bW4gJiYgb0NvbHVtbi5nZXREYXRhUHJvcGVydHkoKSxcblx0XHRcdFx0YVJlYWx0ZWRDb2x1bW5JbmZvID1cblx0XHRcdFx0XHRvVGFibGUuZGF0YShcImNvbHVtbnNcIikgJiZcblx0XHRcdFx0XHRvVGFibGUuZGF0YShcImNvbHVtbnNcIikuY3VzdG9tRGF0YS5maWx0ZXIoZnVuY3Rpb24ob0NvbHVtbkluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db2x1bW5JbmZvLm5hbWUgPT09IHNEYXRhUHJvcGVydHkgJiYgb0NvbHVtbkluZm8udHlwZSA9PT0gXCJBbm5vdGF0aW9uXCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcImxhYmVsXCI6IG9Db2x1bW4uZ2V0SGVhZGVyKCksXG5cdFx0XHRcdFwiYW5ub3RhdGlvblBhdGhcIjogYVJlYWx0ZWRDb2x1bW5JbmZvICYmIGFSZWFsdGVkQ29sdW1uSW5mb1swXSAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0uYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFwiaW5wdXRUeXBlXCI6IE1hc3NFZGl0SGVscGVyLmdldElucHV0VHlwZUZvckNvbHVtbihvQ29sdW1uKVxuXHRcdFx0fTtcblx0XHR9KTtcblx0fSxcblxuXHRnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2c6IGZ1bmN0aW9uKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmc6IGZ1bmN0aW9uKHNJbnB1dFR5cGU6IHN0cmluZykge1xuXHRcdGxldCBzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblxuXHRcdHN3aXRjaCAoc0lucHV0VHlwZSkge1xuXHRcdFx0Ly9UT0RPIC0gQWRkIGZvciBvdGhlciBjb250cm9sIHR5cGVzIGFzIHdlbGwgKFJhZGlvIEJ1dHRvbiwgRW1haWwsIElucHV0LCBNREMgRmllbGRzLCBJbWFnZSBldGMuKVxuXHRcdFx0Y2FzZSBcInNhcC5tLkRhdGVQaWNrZXJcIjpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiRGF0ZXNcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwic2FwLm0uQ2hlY2tCb3hcIjpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiU2V0dGluZ3NcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybiBzUmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBtb2RlbCBbS2VlcCBFeGlzdGluZyBWYWx1ZXMsIExlYXZlIEJsYW5rXS5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlVPTUZpZWxkXG5cdCAqL1xuXHRzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2c6IGZ1bmN0aW9uKGFWYWx1ZXM6IGFueVtdLCBhQ29udGV4dHM6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBvUHJvcGVydHlJbmZvOiBhbnksIGJVT01GaWVsZD86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gb1Byb3BlcnR5SW5mby5kYXRhUHJvcGVydHksXG5cdFx0XHRzSW5wdXRUeXBlID0gb1Byb3BlcnR5SW5mby5pbnB1dFR5cGUsXG5cdFx0XHRiUHJvcGVydHlSZXF1aXJlZCA9IG9Qcm9wZXJ0eUluZm8uaXNGaWVsZFJlcXVpcmVkO1xuXHRcdGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBNYXNzRWRpdEhlbHBlci5nZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nKHNJbnB1dFR5cGUpO1xuXHRcdC8vVE9ETyAtIEFkZCA8PFVzZSBWYWx1ZSBIZWxwIG9yIGNvbnRyb2wgaW1wbG1lbnRhdGlvbj4+IGFuZCByZWxhdGVkIGtleSBieSBjaGVja2luZyBpZiB2YWx1ZSBoZWxwIGlzIGVuYWJsZWQgZm9yIHByb3BlcnR5IG9yIFVuaXQuXG5cdFx0Ly9UT0RPIC0gQWRkIG9wdGlvbiBBcHBseSB0byBFbXB0eSBGaWVsZHMgb25seSBmb3IgQm90aCBWYWx1ZSBIZWxwIGFuZCBjb250cm9scy5cblx0XHRjb25zdCBiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGggPSBhQ29udGV4dHMuc29tZShmdW5jdGlvbihvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHlQYXRoKTtcblx0XHR9KTtcblx0XHRpZiAoYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRpZiAoYlByb3BlcnR5UmVxdWlyZWQgIT09IFwidHJ1ZVwiICYmICFiVU9NRmllbGQpIHtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IFwiQ2xlYXJGaWVsZFZhbHVlL1wiICsgc1Byb3BlcnR5UGF0aCB9KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBzUHJvcGVydHlQYXRoIH0pO1xuXHRcdH1cblx0XHRhVmFsdWVzLnVuc2hpZnQoe1xuXHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4ICsgXCIgXCIgKyBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nICsgXCIgPlwiLFxuXHRcdFx0a2V5OiBcIkRlZmF1bHQvXCIgKyBzUHJvcGVydHlQYXRoXG5cdFx0fSk7XG5cdH0sXG5cblx0Z2V0VGV4dEFycmFuZ2VtZW50SW5mbzogZnVuY3Rpb24oXG5cdFx0c1Byb3BlcnR5OiBhbnksXG5cdFx0b1RleHRCaW5kaW5nOiBhbnksXG5cdFx0c0N1cnJlbnRFbnRpdHlTZXQ6IGFueSxcblx0XHRvU2VsZWN0ZWRDb250ZXh0OiBhbnlcblx0KTogVGV4dEFycmFuZ2VtZW50SW5mbyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9TZWxlY3RlZENvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzRGlzcGxheU1vZGUgPSBDb21tb25VdGlscy5jb21wdXRlRGlzcGxheU1vZGUob01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXQgKyBcIi9cIiArIHNQcm9wZXJ0eSArIFwiQFwiKSk7XG5cdFx0bGV0IHNEZXNjcmlwdGlvblBhdGgsIHNWYWx1ZSwgc0Rlc2NyaXB0aW9uVmFsdWUsIHNGdWxsVGV4dDtcblx0XHRpZiAob1RleHRCaW5kaW5nICYmIChvVGV4dEJpbmRpbmcucGF0aCB8fCAob1RleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgb1RleHRCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoKSkgJiYgc1Byb3BlcnR5KSB7XG5cdFx0XHRpZiAob1RleHRCaW5kaW5nLnBhdGgpIHtcblx0XHRcdFx0aWYgKHNEaXNwbGF5TW9kZSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdFx0c1ZhbHVlID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc1Byb3BlcnR5KTtcblx0XHRcdFx0XHRzRGVzY3JpcHRpb25WYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KG9UZXh0QmluZGluZy5wYXRoKTtcblx0XHRcdFx0XHRzRnVsbFRleHQgPSBzRGVzY3JpcHRpb25WYWx1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChzRGlzcGxheU1vZGUgPT09IFwiVmFsdWVcIikge1xuXHRcdFx0XHRcdHNWYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c0Z1bGxUZXh0ID0gc1ZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24ob1Byb3BzOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob1Byb3BzLnBhdGggJiYgb1Byb3BzLnBhdGggIT09IHNQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0c0Rlc2NyaXB0aW9uUGF0aCA9IG9Qcm9wcy5wYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNWYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSk7XG5cdFx0XHRcdHNEZXNjcmlwdGlvblZhbHVlID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc0Rlc2NyaXB0aW9uUGF0aCk7XG5cdFx0XHRcdGlmIChzRGlzcGxheU1vZGUgPT09IFwiVmFsdWVEZXNjcmlwdGlvblwiICYmIHNWYWx1ZSAmJiBzRGVzY3JpcHRpb25WYWx1ZSkge1xuXHRcdFx0XHRcdHNGdWxsVGV4dCA9IHNWYWx1ZSArIFwiIChcIiArIHNEZXNjcmlwdGlvblZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Rpc3BsYXlNb2RlID09PSBcIkRlc2NyaXB0aW9uVmFsdWVcIiAmJiBzRGVzY3JpcHRpb25WYWx1ZSAmJiBzVmFsdWUpIHtcblx0XHRcdFx0XHRzRnVsbFRleHQgPSBzRGVzY3JpcHRpb25WYWx1ZSArIFwiIChcIiArIHNWYWx1ZSArIFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcInRleHRBcnJhbmdlbWVudFwiOiBzRGlzcGxheU1vZGUsXG5cdFx0XHRcdFwidmFsdWVQYXRoXCI6IHNQcm9wZXJ0eSxcblx0XHRcdFx0XCJkZXNjcmlwdGlvblBhdGhcIjogc0Rlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XCJ2YWx1ZVwiOiBzVmFsdWUsXG5cdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogc0Rlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcdFwiZnVsbFRleHRcIjogc0Z1bGxUZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIHJ1bnRpbWUgbW9kZWw6XG5cdCAqID0+IFRoZSBtb2RlbCBjb25zaXN0cyBvZiB2YWx1ZXMgc2hvd24gaW4gdGhlIGNvbWJvQm94IG9mIHRoZSBkaWFsb2cgKExlYXZlIEJsYW5rLCBLZWVwIEV4aXN0aW5nIFZhbHVlcywgb3IgYW55IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgY29udGV4dCwgZXRjLilcblx0ICogPT4gVGhlIG1vZGVsIHdpbGwgY2FwdHVyZSBydW50aW1lIGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgcHJvcGVydHkgKHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBjb21ib0JveCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0c2V0UnVudGltZU1vZGVsT25EaWFsb2c6IGZ1bmN0aW9uKGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55KSB7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhVW5pdERhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlYWRPbmx5RmllbGRJbmZvOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9EaXN0aW5jdFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRsZXQgc1Byb3BlcnR5TmFtZTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24ob0RhdGE6IGFueSkge1xuXHRcdFx0bGV0IG9UZXh0SW5mbztcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMpO1xuXHRcdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IG9EYXRhLmRhdGFQcm9wZXJ0eS5zcGxpdChcIi9cIik7XG5cdFx0XHRcdGxldCBzUHJvcGVydHlLZXk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc011bHRpTGV2ZWxQYXRoVmFsdWUgPSBhQ29udGV4dHNbaV0uZ2V0T2JqZWN0KG9EYXRhLmRhdGFQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c1Byb3BlcnR5S2V5ID0gb0RhdGEuZGF0YVByb3BlcnR5ICsgXCIvXCIgKyBzTXVsdGlMZXZlbFBhdGhWYWx1ZTtcblx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eUtleV0gJiYgYUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0pIHtcblx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0b0RhdGEudGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmVudGl0eVNldCxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzW2ldXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0YUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgc011bHRpTGV2ZWxQYXRoVmFsdWUsXG5cdFx0XHRcdFx0XHRcdFwia2V5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IHNNdWx0aUxldmVsUGF0aFZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gYUNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdHNQcm9wZXJ0eU5hbWUgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eSAmJiBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRvRGF0YS50ZXh0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b0RhdGEuZW50aXR5U2V0LFxuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHNbaV1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgb0RhdGFPYmplY3Rbb0RhdGEuZGF0YVByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogb0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XSkge1xuXHRcdFx0XHRcdFx0c1Byb3BlcnR5TmFtZSA9IG9EYXRhLnVuaXRQcm9wZXJ0eSArIFwiL1wiICsgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XTtcblx0XHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5TmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRvRGF0YS51bml0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEudGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEuZW50aXR5U2V0LFxuXHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0c1tpXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogb0RhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YURhdGFBcnJheS5mb3JFYWNoKGZ1bmN0aW9uKG9EYXRhOiBhbnkpIHtcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPiAtMSkge1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUgPSBNYXNzRWRpdEhlbHBlci5nZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoKG9EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyk7XG5cdFx0XHRcdGlmICghc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlKSB7XG5cdFx0XHRcdFx0c011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIG9EYXRhLmRhdGFQcm9wZXJ0eSB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLCBhQ29udGV4dHMsIG9EZWZhdWx0VmFsdWVzLCBvRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmIGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSwgYUNvbnRleHRzLCBvRGVmYXVsdFZhbHVlcywgb0RhdGEpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhLCB0cnVlKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChvRGF0YS5kYXRhUHJvcGVydHkgJiYgYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ubGVuZ3RoKSB8fFxuXHRcdFx0XHQob0RhdGEudW5pdFByb3BlcnR5ICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5sZW5ndGgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0RhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBvRGF0YS5kYXRhUHJvcGVydHkgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzID1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24ob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnB1c2goe1xuXHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLFxuXHRcdFx0XHRcdFx0a2V5OiBcIkVtcHR5L1wiICsgb0RhdGEudW5pdFByb3BlcnR5XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiYgdHlwZW9mIG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBcInByb3BlcnR5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSwgdmFsdWU6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSwgdHlwZTogXCJEZWZhdWx0XCIgfSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzICYmXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdLm9wZXJhbmQyXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBuZWVkcyB0byBiZSByZWZhY3RvcmVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgUmVhZE9ubHlFeHByZXNzaW9uIGNoYW5nZVxuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7XG5cdFx0XHRcdFx0XCJwcm9wZXJ0eVwiOiBvRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDIudmFsdWUsXG5cdFx0XHRcdFx0dHlwZTogXCJQYXRoXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb0RhdGEgPSB7IFwidmFsdWVzXCI6IGFWYWx1ZXMsIFwidW5pdERhdGFcIjogYVVuaXREYXRhLCBcInJlc3VsdHNcIjogYVJlc3VsdHMsIFwicmVhZGFibGVQcm9wZXJ0eURhdGFcIjogYVJlYWRPbmx5RmllbGRJbmZvIH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdHJldHVybiBvRGlhbG9nRGF0YU1vZGVsO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sbGVyIENvbnRyb2xsZXIgZm9yIHRoZSB2aWV3XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgcmV0dXJuaW5nIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGNyZWF0ZURpYWxvZzogZnVuY3Rpb24ob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgb0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0b0RpYWxvZ0RhdGFNb2RlbCA9IE1hc3NFZGl0SGVscGVyLnNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nKGFDb250ZXh0cywgYURhdGFBcnJheSwgb0RlZmF1bHRWYWx1ZXMpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQgfSkudGhlbihmdW5jdGlvbihvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBvRGVmYXVsdFZhbHVlcy5tYXNzRWRpdFRpdGxlLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbihvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9EaWFsb2cuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3VsdHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVzdWx0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVJlYWRhYmxlSW5mbyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWFkYWJsZVByb3BlcnR5RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZVByb21pc2U6IGFueVtdID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlJlYWRPbmx5RmllbGQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24ob1NlbGVjdGVkQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24ob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbihvUHJvcGVydHlJbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgPT09IG9Qcm9wZXJ0eUluZm8ucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5SW5mby50eXBlID09PSBcIkRlZmF1bHRcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eUluZm8udmFsdWUgPT09IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJQYXRoXCIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlICYmIG9SZXN1bHQudmFsdWUgIT09IFwiRGVmYXVsdFwiICYmICFiUmVhZE9ubHlGaWVsZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hhbmdlUHJvbWlzZS5wdXNoKG9TZWxlY3RlZENvbnRleHQuc2V0UHJvcGVydHkob1Jlc3VsdC5rZXlWYWx1ZSwgb1Jlc3VsdC52YWx1ZSkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChjaGFuZ2VQcm9taXNlKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvUmVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXh0ZW5zaW9uQVBJID0gb0NvbnRyb2xsZXIgJiYgKG9Db250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9FeHRlbnNpb25BUEkucmVmcmVzaChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1Jlcztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIGVycm9yIGhhbmRsaW5nIHBhcnQgZm9yIHRoZSBEaWFsb2dcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHVwZGF0aW5nIGVudHJpZXMuXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuY2FuY2VsQnV0dG9uVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24ob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob0RpYWxvZ0RhdGFNb2RlbCwgXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvRGlhbG9nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGVscGVyO1xuIl19
|
|
979
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwiZ2V0SW5wdXRUeXBlIiwicHJvcGVydHlJbmZvIiwiZGF0YUZpZWxkQ29udmVydGVkIiwib0RhdGFNb2RlbFBhdGgiLCJlZGl0U3R5bGVQcm9wZXJ0aWVzIiwiaW5wdXRUeXBlIiwic2V0RWRpdFN0eWxlUHJvcGVydGllcyIsImVkaXRTdHlsZSIsImlzVmFsaWRGb3JNYXNzRWRpdCIsImlzQ29sbGVjdGlvbkZpZWxkIiwiaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIiwiZ2V0SXNGaWVsZEdycCIsIiRUeXBlIiwiVGFyZ2V0IiwidmFsdWUiLCJnZXRUZXh0UGF0aCIsInByb3BlcnR5IiwidGV4dEJpbmRpbmciLCJkaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJwYXJhbWV0ZXJzIiwicHJvcHMiLCJwcmVwYXJlRGF0YUZvckRpYWxvZyIsIm9UYWJsZSIsImFEYXRhQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzQ3VycmVudEVudGl0eVNldE5hbWUiLCJkYXRhIiwiYVRhYmxlRmllbGRzIiwiZ2V0VGFibGVGaWVsZHMiLCJvRW50aXR5VHlwZUNvbnRleHQiLCJnZXRDb250ZXh0Iiwib0VudGl0eVNldENvbnRleHQiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm9EYXRhRmllbGRNb2RlbCIsIkpTT05Nb2RlbCIsIm9SZXN1bHQiLCJzTGFiZWxUZXh0IiwiYlZhbHVlSGVscEVuYWJsZWQiLCJzVW5pdFByb3BlcnR5UGF0aCIsImJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsIm9UZXh0QmluZGluZyIsIm9Db2x1bW5JbmZvIiwiZGF0YVByb3BlcnR5Iiwib1Byb3BlcnR5SW5mbyIsImxhYmVsIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwiZ2V0VGV4dEJpbmRpbmciLCJvRmllbGRDb250ZXh0IiwiYW5ub3RhdGlvblBhdGgiLCJvRGF0YUZpZWxkQ29udmVydGVkIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJvUHJvcGVydHlDb250ZXh0Iiwib0ludGVyZmFjZSIsImdldEludGVyZmFjZSIsIlZhbHVlIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJiSGlkZGVuRmllbGQiLCJpc0ltYWdlIiwiY29udGV4dCIsImdldFBhdGgiLCJfdHlwZSIsIiR0YXJnZXQiLCJjaGFydFByb3BlcnR5IiwidGVybSIsImlzQWN0aW9uIiwiQWN0aW9uIiwiaXNGaWVsZEdycCIsInByb3BlcnR5Rm9yRmllbGRDb250cm9sIiwiZXhwQmluZGluZyIsImdldEVkaXRNb2RlIiwiZWRpdE1vZGVWYWx1ZXMiLCJPYmplY3QiLCJrZXlzIiwiRWRpdE1vZGUiLCJlZGl0TW9kZUlzU3RhdGljIiwiaW5jbHVkZXMiLCJlZGl0YWJsZSIsIkVkaXRhYmxlIiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiQ29tbW9uVXRpbHMiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInNldERhdGEiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJjb2x1bW5zRGF0YSIsImdldFBhcmVudCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJtYXAiLCJvQ29sdW1uIiwic0RhdGFQcm9wZXJ0eSIsImdldERhdGFQcm9wZXJ0eSIsImFSZWFsdGVkQ29sdW1uSW5mbyIsInR5cGUiLCJnZXRIZWFkZXIiLCJnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2ciLCJvUmVzb3VyY2VCdW5kbGUiLCJpU2VsZWN0ZWRDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImdldFRleHQiLCJ0b1N0cmluZyIsImdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmciLCJzSW5wdXRUeXBlIiwic1Jlc3VsdCIsInNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyIsIm9EZWZhdWx0VmFsdWVzIiwiYlVPTUZpZWxkIiwidW5pdFByb3BlcnR5IiwiYlByb3BlcnR5UmVxdWlyZWQiLCJpc0ZpZWxkUmVxdWlyZWQiLCJzU3VmZml4Rm9yS2VlcEV4aXN0aW5nIiwiZGVmYXVsdE9wdGlvbnMiLCJiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgiLCJmYWxzZUVudHJ5IiwidGV4dCIsImtleSIsInRleHRJbmZvIiwidHJ1dGh5RW50cnkiLCJ1bnNoaWZ0IiwiaXNWYWx1ZUhlbHBFbmFibGVkIiwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsInZoZEVudHJ5IiwidXNlVmFsdWVIZWxwVmFsdWUiLCJjbGVhckVudHJ5IiwiY2xlYXJGaWVsZFZhbHVlIiwiZW1wdHlFbnRyeSIsImxlYXZlQmxhbmtWYWx1ZSIsImtlZXBFbnRyeSIsImtlZXBFeGlzdGluZ1ByZWZpeCIsImdldFRleHRBcnJhbmdlbWVudEluZm8iLCJzZWxlY3RlZENvbnRleHQiLCJkZXNjcmlwdGlvblZhbHVlIiwiZnVsbFRleHQiLCJMb2ciLCJpbmZvIiwiaXNFZGl0YWJsZSIsImFueSIsImJpbmRpbmciLCJnZXRCaW5kaW5nIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsIm9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlIiwib0RpYWxvZ0RhdGFNb2RlbCIsIm9iamVjdHNGb3JWaXNpYmlsaXR5IiwiZ2V0UHJvcGVydHkiLCJzZXRQcm9wZXJ0eSIsInVwZGF0ZU9uQ29udGV4dENoYW5nZSIsIm1PVG9Vc2UiLCJ2YWx1ZXMiLCJhdHRhY2hDaGFuZ2UiLCJiaW5kIiwiZ2V0Qm91bmRPYmplY3QiLCJBbnkiLCJtb2RlbCIsInNldE1vZGVsIiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRGaWVsZFZpc2libGl0eSIsImlzQ29udGV4dEVkaXRhYmxlIiwic2V0UnVudGltZU1vZGVsT25EaWFsb2ciLCJkaWFsb2dDb250ZXh0IiwiYVVuaXREYXRhIiwiYVJlc3VsdHMiLCJhUmVhZE9ubHlGaWVsZEluZm8iLCJvRGF0YSIsIm9UZXh0SW5mbyIsInNQcm9wZXJ0eUtleSIsInNVbml0UHJvcGVydHlOYW1lIiwib0Rpc3RpbmN0VmFsdWVNYXAiLCJvRGlzdGluY3RVbml0TWFwIiwic011bHRpTGV2ZWxQYXRoVmFsdWUiLCJkaXNwbGF5IiwidmFsdWVQYXRoIiwiZW50cnkiLCJ1bml0RW50cnkiLCJzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUiLCJzZWxlY3RlZEtleSIsImJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzIiwib2JqIiwiYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzIiwiaXNQcm9wZXJ0eVJlYWRPbmx5Iiwib3BlcmFuZHMiLCJvcGVyYW5kMSIsIm9wZXJhbmQyIiwicHJvcGVydHlQYXRoIiwicHJvcGVydHlWYWx1ZSIsImVkaXRNb2RlIiwidmlzaWJsZSIsImdldERpYWxvZ0NvbnRleHQiLCJ0YWJsZSIsImRpYWxvZyIsInRyYW5zQ3R4IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJsaXN0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJ0cmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwib25EaWFsb2dPcGVuIiwiZXZlbnQiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJjcmVhdGVEaWFsb2ciLCJvQ29udHJvbGxlciIsInNGcmFnbWVudE5hbWUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJiaW5kaW5nQ29udGV4dHMiLCJkYXRhRmllbGRNb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwidGhlbiIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIkRyYWZ0U3RhdHVzIiwiRkVMaWJyYXJ5Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwibWFzc0VkaXRUaXRsZSIsImNvbnRlbnQiLCJhZnRlck9wZW4iLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsImFwcGx5QnV0dG9uVGV4dCIsInByZXNzIiwib0V2ZW50IiwiZ2V0VmlldyIsIm9Nb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImNoYW5nZVByb21pc2UiLCJiUmVhZE9ubHlGaWVsZCIsImdyb3VwSWQiLCJlcnJvclZhbHVlcyIsImlkeCIsImtleVZhbHVlIiwiX2VkaXRGbG93Iiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjYXRjaCIsIm9FcnJvciIsImVycm9yIiwiYWxsU2V0dGxlZCIsIm9MaXN0QmluZGluZyIsIm9FeHRlbnNpb25BUEkiLCJnZXRFeHRlbnNpb25BUEkiLCJyZWZyZXNoIiwic3VidGl0bGVDb2x1bW4iLCJnZXRNZXNzYWdlQ29sdW1uIiwibWVzc2FnZXMiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzIiwibWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXRzIiwiZ2V0VGFyZ2V0cyIsInBlcnNpc3RlbnQiLCJib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQiLCJmaW5kIiwiZ2V0VGFyZ2V0IiwiYWRkaXRpb25hbFRleHQiLCJTYXZlZCIsInN1Y2Nlc3NUb2FzdCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiQ2xlYXIiLCJnZXRNZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlcyIsImlzT3BlbiIsImNsb3NlIiwiZGVzdHJveSIsImVuZEJ1dHRvbiIsImNhbmNlbEJ1dHRvblRleHQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBDQSxNQUFNQSxjQUFjLEdBQUc7QUFDdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSwyQkFBMkIsRUFBRSxVQUFVQyxLQUFWLEVBQXlCQyxPQUF6QixFQUFnRTtBQUM1RixVQUFJQyxVQUFKO0FBQ0EsVUFBSUMsS0FBSyxHQUFHLENBQVo7QUFDQSxVQUFNQyxNQUFNLEdBQUdKLEtBQUssQ0FBQ0ssS0FBTixDQUFZLEdBQVosQ0FBZjtBQUNBLFVBQUlDLFNBQVMsR0FBRyxFQUFoQjtBQUNBRixNQUFBQSxNQUFNLENBQUNHLE9BQVAsQ0FBZSxVQUFVQyxhQUFWLEVBQWlDO0FBQy9DLFlBQUksQ0FBQ1AsT0FBTyxDQUFDTyxhQUFELENB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Q0EsaURBQUNsRixXQUFXLENBQUNrQyxPQUFaLEVBQUQsbUZBQUMsc0JBQXVCaEQsaUJBQXZCLENBQXlDLFVBQXpDLENBQUQsZ0ZBQWdGOUMsV0FBaEYsQ0FDQyxtQkFERCxFQUVDLEtBRkQ7QUFJQTtBQUNELHFCQS9DTSxDQUFQO0FBZ0RBLG1CQW5ERDtBQW9EQTtBQTlHc0IsZUFBWCxDQUphO0FBb0gxQitJLGNBQUFBLFNBQVMsRUFBRSxJQUFJckQsTUFBSixDQUFXO0FBQ3JCeEgsZ0JBQUFBLElBQUksRUFBRVQsY0FBYyxDQUFDdUwsZ0JBREE7QUFFckJwRCxnQkFBQUEsS0FBSyxFQUFFLFVBQVVDLE1BQVYsRUFBdUI7QUFDN0Isc0JBQU1WLE9BQU8sR0FBR1UsTUFBTSxDQUFDcEMsU0FBUCxHQUFtQnBILFNBQW5CLEVBQWhCO0FBQ0E4SSxrQkFBQUEsT0FBTyxDQUFDMEQsS0FBUjtBQUNBMUQsa0JBQUFBLE9BQU8sQ0FBQzJELE9BQVI7QUFDQTtBQU5vQixlQUFYO0FBcEhlLGFBQVgsQ0FBaEI7QUE2SEEsZ0JBQU10SSxLQUFLLEdBQUc1SSxNQUFNLENBQUNHLFFBQVAsRUFBZDtBQUNBb04sWUFBQUEsT0FBTyxDQUFDMUUsUUFBUixDQUFpQlosZ0JBQWpCLEVBQW1DLFlBQW5DO0FBQ0FzRixZQUFBQSxPQUFPLENBQUMxRSxRQUFSLENBQWlCRCxLQUFqQjtBQUNBMkUsWUFBQUEsT0FBTyxDQUFDekUsaUJBQVIsQ0FBMEJJLGFBQTFCO0FBQ0FtRCxZQUFBQSxPQUFPLENBQUNrQixPQUFELENBQVA7QUFDQSxXQXBJTSxDQUFQO0FBcUlBLFNBcEpLLEVBcUpMdUIsS0FySkssQ0FxSkN4QyxNQXJKRCxDQUFQO0FBc0pBLE9BeEpNLENBQVA7QUF5SkE7QUFsOUJxQixHQUF2QjtTQXE5QmVwUSxjIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IEJpbmRpbmdFeHByZXNzaW9uLCBFeHByZXNzaW9uT3JQcmltaXRpdmUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZW5oYW5jZURhdGFNb2RlbFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB7IEZpZWxkUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL0ZpZWxkLm1ldGFkYXRhXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBFZGl0TW9kZSBmcm9tIFwic2FwL3VpL21kYy9lbnVtL0VkaXRNb2RlXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCBBbnksIHsgQW55VHlwZSB9IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRFZGl0TW9kZSwgZ2V0UmVxdWlyZWRFeHByZXNzaW9uLCBpc0NvbGxlY3Rpb25GaWVsZCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwiLi9Nb2RlbEhlbHBlclwiO1xuXG4vKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBmb3IgbWFzcyBlZGl0IGZ1bmN0aW9uYWxpdHkgKi9cbnR5cGUgVGV4dEFycmFuZ2VtZW50SW5mbyA9IHtcblx0dGV4dEFycmFuZ2VtZW50OiBzdHJpbmc7XG5cdHZhbHVlUGF0aDogc3RyaW5nO1xuXHRkZXNjcmlwdGlvblBhdGg/OiBzdHJpbmc7XG5cdHZhbHVlOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdGZ1bGxUZXh0OiBzdHJpbmc7XG59O1xuXG50eXBlIEJpbmRpbmdJbmZvID0ge1xuXHRwYXRoPzogc3RyaW5nO1xuXHRtb2RlbD86IHN0cmluZyB8IG9iamVjdDtcblx0cGFyYW1ldGVycz86IEFycmF5PEJpbmRpbmdJbmZvPjtcbn07XG5cbmNvbnN0IE1hc3NFZGl0SGVscGVyID0ge1xuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgdGhlIHZhbHVlIGF0IGZpbmFsIG9yIGRlZXBlc3QgbGV2ZWwgcGF0aCB3aXRoIGEgYmxhbmsgYXJyYXkuXG5cdCAqIFJldHVybiBhbiBlbXB0eSBhcnJheSBwb2ludGluZyB0byB0aGUgZmluYWwgb3IgZGVlcGVzdCBsZXZlbCBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGggUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybnMge0FycmF5fVxuXHQgKi9cblx0aW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoOiBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgYVZhbHVlczogYW55IC8qLCB0cmFuc0N0eDogQ29udGV4dCAqLykge1xuXHRcdGxldCBhRmluYWxQYXRoOiBhbnk7XG5cdFx0bGV0IGluZGV4ID0gMDtcblx0XHRjb25zdCBhUGF0aHMgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHNGdWxsUGF0aCA9IFwiXCI7XG5cdFx0YVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0aWYgKCFhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdICYmIGluZGV4ID09PSAwKSB7XG5cdFx0XHRcdGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZpbmFsUGF0aCA9IGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdHNGdWxsUGF0aCA9IHNGdWxsUGF0aCArIHNQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9IGVsc2UgaWYgKCFhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdHNGdWxsUGF0aCA9IHNGdWxsUGF0aCArIFwiL1wiICsgc1Byb3BlcnR5UGF0aDtcblx0XHRcdFx0aWYgKHNGdWxsUGF0aCAhPT0gc1BhdGgpIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdFx0YUZpbmFsUGF0aCA9IGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFGaW5hbFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdW5pcXVlIHZhbHVlcyBmb3IgZ2l2ZW4gYXJyYXkgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlIFByb3BlcnR5IHZhbHVlXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBvZiB0aGUgcHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIHtBcnJheX0gc2VsZiBJbnN0YW5jZSBvZiB0aGUgYXJyYXlcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRnZXRVbmlxdWVWYWx1ZXM6IGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgc2VsZjogYW55W10pIHtcblx0XHRpZiAoc1ZhbHVlICE9IHVuZGVmaW5lZCAmJiBzVmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHNlbGYuaW5kZXhPZihzVmFsdWUpID09PSBpbmRleDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciBhIG11bHRpLWxldmVsIHBhdGggKGZvciBleGFtcGxlOiBfTWF0ZXJpYWxzL01hdGVyaWFsX0RldGFpbHMgZ2V0cyB0aGUgdmFsdWUgb2YgTWF0ZXJpYWxfRGV0YWlscyB1bmRlciBfTWF0ZXJpYWxzIE9iamVjdCkuXG5cdCAqIFJldHVybnMgdGhlIHByb3BlcnR5VmFsdWUsIHdoaWNoIGNhbiBiZSBvZiBhbnkgdHlwZSAoc3RyaW5nLCBudW1iZXIsIGV0Yy4uKS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WYWx1ZXMgT2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlc1xuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICovXG5cdGdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGg6IGZ1bmN0aW9uIChzRGF0YVByb3BlcnR5UGF0aDogc3RyaW5nLCBvVmFsdWVzOiBhbnkpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgc0RhdGFQcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IHNEYXRhUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGxldCBSZXN1bHQ6IGFueTtcblx0XHRcdGFQcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0UmVzdWx0ID0gb1ZhbHVlcyAmJiBvVmFsdWVzW3NQYXRoXSA/IG9WYWx1ZXNbc1BhdGhdIDogUmVzdWx0ICYmIFJlc3VsdFtzUGF0aF07XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBSZXN1bHQ7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBrZXkgcGF0aCBmb3IgdGhlIGtleSBvZiBhIGNvbWJvIGJveCB0aGF0IG11c3QgYmUgc2VsZWN0ZWQgaW5pdGlhbGx5IHdoZW4gdGhlIGRpYWxvZyBvcGVuczpcblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGRpZmZlcmVudCwgdGhlbiA8IEtlZXAgRXhpc3RpbmcgVmFsdWVzID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyB0aGUgc2FtZSwgdGhlbiB0aGUgcHJvcGVydHlWYWx1ZSBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGVtcHR5LCB0aGVuIDwgTGVhdmUgQmxhbmsgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICpcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIERhdGEgcHJvcGVydHkgcGF0aFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIHNEYXRhUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9TZWxlY3RlZENvbnRleHQgPSBhQ29udGV4dHMsXG5cdFx0XHRcdGFQcm9wZXJ0eVZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdG9TZWxlY3RlZENvbnRleHQuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24gPVxuXHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gLTEgJiYgb0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzBdKTtcblx0XHRcdFx0aWYgKG9Db250ZXh0ICYmIChvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aCkgfHwgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVZhbHVlcy5wdXNoKG9Db250ZXh0LmdldE9iamVjdChzRGF0YVByb3BlcnR5UGF0aCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFVbmlxdWVQcm9wZXJ0eVZhbHVlcyA9IGFQcm9wZXJ0eVZhbHVlcy5maWx0ZXIoTWFzc0VkaXRIZWxwZXIuZ2V0VW5pcXVlVmFsdWVzKTtcblx0XHRcdGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRyZXR1cm4gXCJEZWZhdWx0L1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHR9IGVsc2UgaWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIFwiRW1wdHkvXCIgKyBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdH0gZWxzZSBpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc0RhdGFQcm9wZXJ0eVBhdGggKyBcIi9cIiArIGFVbmlxdWVQcm9wZXJ0eVZhbHVlc1swXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBoaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSBbYm90aCBzdGF0aWMgYW5kIHBhdGggYmFzZWRdIGZvciB0YWJsZSdzIHNlbGVjdGVkIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gaGlkZGVuVmFsdWUgSGlkZGVuIGFubm90YXRpb24gdmFsdWUgLyBwYXRoIGZvciBmaWVsZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGdldEhpZGRlblZhbHVlRm9yQ29udGV4dHM6IGZ1bmN0aW9uIChoaWRkZW5WYWx1ZTogYW55LCBhQ29udGV4dHM6IGFueVtdKSB7XG5cdFx0aWYgKGhpZGRlblZhbHVlICYmIGhpZGRlblZhbHVlLiRQYXRoKSB7XG5cdFx0XHRyZXR1cm4gIWFDb250ZXh0cy5zb21lKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZTogZnVuY3Rpb24gKHByb3BlcnR5SW5mbzogYW55LCBkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSwgb0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZFByb3BlcnRpZXM7XG5cdFx0bGV0IGlucHV0VHlwZSE6IHN0cmluZztcblx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgsIHRydWUpO1xuXHRcdFx0aW5wdXRUeXBlID0gZWRpdFN0eWxlUHJvcGVydGllcz8uZWRpdFN0eWxlIHx8IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IGlzVmFsaWRGb3JNYXNzRWRpdCA9XG5cdFx0XHRpbnB1dFR5cGUgJiZcblx0XHRcdFtcIkRhdGVQaWNrZXJcIiwgXCJUaW1lUGlja2VyXCIsIFwiRGF0ZVRpbWVQaWNrZXJcIiwgXCJSYXRpbmdJbmRpY2F0b3JcIl0uaW5kZXhPZihpbnB1dFR5cGUpID09PSAtMSAmJlxuXHRcdFx0IWlzQ29sbGVjdGlvbkZpZWxkKG9EYXRhTW9kZWxQYXRoKSAmJlxuXHRcdFx0IWhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyhwcm9wZXJ0eUluZm8pO1xuXG5cdFx0cmV0dXJuIChpc1ZhbGlkRm9yTWFzc0VkaXQgfHwgXCJcIikgJiYgaW5wdXRUeXBlO1xuXHR9LFxuXG5cdGdldElzRmllbGRHcnA6IGZ1bmN0aW9uIChkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUuaW5kZXhPZihcIkZpZWxkR3JvdXBcIikgPiAtMVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IHBhdGggZm9yIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB7YW55fSB0ZXh0QmluZGluZyBUZXh0IEJpbmRpbmcgSW5mb1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGxheU1vZGUgRGlzcGxheSBtb2RlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRleHQgUHJvcGVydHkgUGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldFRleHRQYXRoOiBmdW5jdGlvbiAocHJvcGVydHk6IHN0cmluZywgdGV4dEJpbmRpbmc6IGFueSwgZGlzcGxheU1vZGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGRlc2NyaXB0aW9uUGF0aDtcblx0XHRpZiAodGV4dEJpbmRpbmcgJiYgKHRleHRCaW5kaW5nLnBhdGggfHwgKHRleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgdGV4dEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGgpKSAmJiBwcm9wZXJ0eSkge1xuXHRcdFx0aWYgKHRleHRCaW5kaW5nLnBhdGggJiYgZGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRkZXNjcmlwdGlvblBhdGggPSB0ZXh0QmluZGluZy5wYXRoO1xuXHRcdFx0fSBlbHNlIGlmICh0ZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdHRleHRCaW5kaW5nLnBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvcHM6IEJpbmRpbmdJbmZvKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BzLnBhdGggJiYgcHJvcHMucGF0aCAhPT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aCA9IHByb3BzLnBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlc2NyaXB0aW9uUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBKU09OIE1vZGVsIGZvciBwcm9wZXJ0aWVzIG9mIGRpYWxvZyBmaWVsZHMgW2xhYmVsLCB2aXNpYmxpdHksIGRhdGFwcm9wZXJ0eSwgZXRjLl0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtBcnJheX0gYURhdGFBcnJheSBBcnJheSBjb250YWluaW5nIGRhdGEgcmVsYXRlZCB0byB0aGUgZGlhbG9nIHVzZWQgYnkgYm90aCB0aGUgc3RhdGljIGFuZCB0aGUgcnVudGltZSBtb2RlbFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0cHJlcGFyZURhdGFGb3JEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBhRGF0YUFycmF5OiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSksXG5cdFx0XHRzQ3VycmVudEVudGl0eVNldE5hbWUgPSBvVGFibGUuZGF0YShcIm1ldGFQYXRoXCIpLFxuXHRcdFx0YVRhYmxlRmllbGRzID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGFibGVGaWVsZHMob1RhYmxlKSxcblx0XHRcdG9FbnRpdHlUeXBlQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9AXCIpLFxuXHRcdFx0b0VudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lKSxcblx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlUeXBlQ29udGV4dCk7XG5cblx0XHRjb25zdCBvRGF0YUZpZWxkTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0bGV0IG9SZXN1bHQ7XG5cdFx0bGV0IHNMYWJlbFRleHQ7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkO1xuXHRcdGxldCBzVW5pdFByb3BlcnR5UGF0aDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0O1xuXHRcdGxldCBvVGV4dEJpbmRpbmc7XG5cblx0XHRhVGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbHVtbkluZm86IGFueSkge1xuXHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eVBhdGggPSBvQ29sdW1uSW5mby5kYXRhUHJvcGVydHk7XG5cdFx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0bGV0IG9Qcm9wZXJ0eUluZm8gPSBzRGF0YVByb3BlcnR5UGF0aCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpO1xuXHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZCA9XG5cdFx0XHRcdFx0c0RhdGFQcm9wZXJ0eVBhdGggJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKVtcblx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RcIlxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdHNVbml0UHJvcGVydHlQYXRoID1cblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvW1wiQE9yZy5PRGF0YS5NZWFzdXJlcy5WMS5Vbml0XCJdICYmIG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLlVuaXRcIl0uJFBhdGgpIHx8XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUluZm8gJiZcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLklTT0N1cnJlbmN5XCJdICYmXG5cdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvW1wiQE9yZy5PRGF0YS5NZWFzdXJlcy5WMS5JU09DdXJyZW5jeVwiXS4kUGF0aCk7XG5cdFx0XHRcdHNMYWJlbFRleHQgPVxuXHRcdFx0XHRcdG9Db2x1bW5JbmZvLmxhYmVsIHx8XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxcIl0pIHx8XG5cdFx0XHRcdFx0b0NvbHVtbkluZm8uZGF0YVByb3BlcnR5O1xuXHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPVxuXHRcdFx0XHRcdHNVbml0UHJvcGVydHlQYXRoICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzVW5pdFByb3BlcnR5UGF0aCArIFwiQFwiKSAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc1VuaXRQcm9wZXJ0eVBhdGggKyBcIkBcIilbXG5cdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0XCJcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHRpZiAob0RhdGFNb2RlbE9iamVjdFBhdGgpIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXG5cdFx0XHRcdGxldCBvRGF0YU1vZGVsUGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRmllbGRDb250ZXh0LCBvRW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdGlmIChvRGF0YUZpZWxkQ29udmVydGVkPy5WYWx1ZT8ucGF0aD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgob0RhdGFNb2RlbFBhdGgsIHNEYXRhUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiSGlkZGVuRmllbGQgPVxuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLmdldEhpZGRlblZhbHVlRm9yQ29udGV4dHMoXG5cdFx0XHRcdFx0XHRvRmllbGRDb250ZXh0ICYmIG9GaWVsZENvbnRleHQuZ2V0T2JqZWN0KClbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzXG5cdFx0XHRcdFx0KSB8fCBmYWxzZTtcblx0XHRcdFx0Y29uc3QgaXNJbWFnZSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMXCJdO1xuXG5cdFx0XHRcdG9JbnRlcmZhY2UuY29udGV4dCA9IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0b1Byb3BlcnR5SW5mbyA9XG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZC5fdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHQ/IG9EYXRhRmllbGRDb252ZXJ0ZWRcblx0XHRcdFx0XHRcdDogKG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5WYWx1ZSAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlLiR0YXJnZXQpIHx8XG5cdFx0XHRcdFx0XHQgIChvRGF0YUZpZWxkQ29udmVydGVkICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0ICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0LiR0YXJnZXQpO1xuXHRcdFx0XHQvLyBEYXRhZmllbGQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBGaWVsZENvbnRyb2wgY2FsY3VsYXRpb24sIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkXG5cblx0XHRcdFx0Y29uc3QgY2hhcnRQcm9wZXJ0eSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mby50ZXJtICYmIG9Qcm9wZXJ0eUluZm8udGVybSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiO1xuXHRcdFx0XHRjb25zdCBpc0FjdGlvbiA9ICEhb0RhdGFGaWVsZENvbnZlcnRlZC5BY3Rpb247XG5cdFx0XHRcdGNvbnN0IGlzRmllbGRHcnAgPSBNYXNzRWRpdEhlbHBlci5nZXRJc0ZpZWxkR3JwKG9EYXRhRmllbGRDb252ZXJ0ZWQpO1xuXG5cdFx0XHRcdGlmIChpc0ltYWdlIHx8IGJIaWRkZW5GaWVsZCB8fCBjaGFydFByb3BlcnR5IHx8IGlzQWN0aW9uIHx8IGlzRmllbGRHcnApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBFZGl0TW9kZSBhbmQgSW5wdXRUeXBlXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5Rm9yRmllbGRDb250cm9sID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLlZhbHVlID8gb1Byb3BlcnR5SW5mby5WYWx1ZSA6IG9Qcm9wZXJ0eUluZm87XG5cdFx0XHRcdGNvbnN0IGV4cEJpbmRpbmcgPSBnZXRFZGl0TW9kZShwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCwgb0RhdGFNb2RlbFBhdGgsIGZhbHNlLCBmYWxzZSwgb0RhdGFGaWVsZENvbnZlcnRlZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlVmFsdWVzID0gT2JqZWN0LmtleXMoRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0TW9kZUlzU3RhdGljID0gISFleHBCaW5kaW5nICYmIGVkaXRNb2RlVmFsdWVzLmluY2x1ZGVzKGV4cEJpbmRpbmcgYXMgRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0YWJsZSA9ICEhZXhwQmluZGluZyAmJiAoKGVkaXRNb2RlSXNTdGF0aWMgJiYgZXhwQmluZGluZyA9PT0gRWRpdE1vZGUuRWRpdGFibGUpIHx8ICFlZGl0TW9kZUlzU3RhdGljKTtcblxuXHRcdFx0XHRpZiAoIWVkaXRhYmxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5wdXRUeXBlID0gTWFzc0VkaXRIZWxwZXIuZ2V0SW5wdXRUeXBlKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxQYXRoKTtcblxuXHRcdFx0XHRpZiAoaW5wdXRUeXBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRcdG9SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcImxhYmVsXCI6IHNMYWJlbFRleHQsXG5cdFx0XHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkXCI6IGJWYWx1ZUhlbHBFbmFibGVkID8gYlZhbHVlSGVscEVuYWJsZWQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwidW5pdFByb3BlcnR5XCI6IHNVbml0UHJvcGVydHlQYXRoID8gc1VuaXRQcm9wZXJ0eVBhdGggOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdFwiOiBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPyBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwXCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcInByb3BlcnR5UGF0aEZvclZhbHVlSGVscFVuaXRcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzVW5pdFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNGaWVsZFJlcXVpcmVkXCI6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHlJbmZvLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblBhdGhcIjogc0RhdGFQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc0RhdGFQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImRlZmF1bHRTZWxlY3Rpb25Vbml0UGF0aFwiOiBzVW5pdFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzVW5pdFByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZW50aXR5U2V0XCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdFwiZGlzcGxheVwiOiBkaXNwbGF5TW9kZSxcblx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IE1hc3NFZGl0SGVscGVyLmdldFRleHRQYXRoKHNEYXRhUHJvcGVydHlQYXRoLCBvVGV4dEJpbmRpbmcsIGRpc3BsYXlNb2RlKSxcblx0XHRcdFx0XHRcdFwibnVsbGFibGVcIjogb1Byb3BlcnR5SW5mby5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gb1Byb3BlcnR5SW5mby5udWxsYWJsZSA6IHRydWUsXG5cdFx0XHRcdFx0XHRcImlzUHJvcGVydHlSZWFkT25seVwiOiBpc1JlYWRPbmx5ICE9PSB1bmRlZmluZWQgPyBpc1JlYWRPbmx5IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImlucHV0VHlwZVwiOiBpbnB1dFR5cGUsXG5cdFx0XHRcdFx0XHRcImVkaXRNb2RlXCI6IGVkaXRhYmxlID8gZXhwQmluZGluZyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFwidW5pdERhdGFQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoICYmIFwiZmllbGRzSW5mbz4vdW5pdERhdGEvXCIsXG5cdFx0XHRcdFx0XHRcInZhbHVlc1BhdGhcIjogXCJmaWVsZHNJbmZvPi92YWx1ZXMvXCJcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGFEYXRhQXJyYXkucHVzaChvUmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9EYXRhRmllbGRNb2RlbC5zZXREYXRhKGFEYXRhQXJyYXkpO1xuXHRcdHJldHVybiBvRGF0YUZpZWxkTW9kZWw7XG5cdH0sXG5cblx0Z2V0VGFibGVGaWVsZHM6IGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRjb25zdCBjb2x1bW5zRGF0YSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0UGFyZW50KCkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29sdW1ucztcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHkgPSBvQ29sdW1uICYmIG9Db2x1bW4uZ2V0RGF0YVByb3BlcnR5KCksXG5cdFx0XHRcdGFSZWFsdGVkQ29sdW1uSW5mbyA9XG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEgJiZcblx0XHRcdFx0XHRjb2x1bW5zRGF0YS5maWx0ZXIoZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29sdW1uSW5mby5uYW1lID09PSBzRGF0YVByb3BlcnR5ICYmIG9Db2x1bW5JbmZvLnR5cGUgPT09IFwiQW5ub3RhdGlvblwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJkYXRhUHJvcGVydHlcIjogc0RhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XCJsYWJlbFwiOiBvQ29sdW1uLmdldEhlYWRlcigpLFxuXHRcdFx0XHRcImFubm90YXRpb25QYXRoXCI6IGFSZWFsdGVkQ29sdW1uSW5mbyAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdLmFubm90YXRpb25QYXRoXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdldERlZmF1bHRUZXh0c0ZvckRpYWxvZzogZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwidXNlVmFsdWVIZWxwVmFsdWVcIjogXCI8IFVzZSBWYWx1ZSBIZWxwID5cIixcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmc6IGZ1bmN0aW9uIChzSW5wdXRUeXBlOiBzdHJpbmcpIHtcblx0XHRsZXQgc1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cblx0XHRzd2l0Y2ggKHNJbnB1dFR5cGUpIHtcblx0XHRcdC8vVE9ETyAtIEFkZCBmb3Igb3RoZXIgY29udHJvbCB0eXBlcyBhcyB3ZWxsIChSYWRpbyBCdXR0b24sIEVtYWlsLCBJbnB1dCwgTURDIEZpZWxkcywgSW1hZ2UgZXRjLilcblx0XHRcdGNhc2UgXCJEYXRlUGlja2VyXCI6XG5cdFx0XHRcdHNSZXN1bHQgPSBcIkRhdGVzXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkNoZWNrQm94XCI6XG5cdFx0XHRcdHNSZXN1bHQgPSBcIlNldHRpbmdzXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cdFx0fVxuXHRcdHJldHVybiBzUmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBtb2RlbCBbS2VlcCBFeGlzdGluZyBWYWx1ZXMsIExlYXZlIEJsYW5rXS5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlVPTUZpZWxkXG5cdCAqL1xuXHRzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2c6IGZ1bmN0aW9uIChhVmFsdWVzOiBhbnksIGFDb250ZXh0czogYW55W10sIG9EZWZhdWx0VmFsdWVzOiBhbnksIG9Qcm9wZXJ0eUluZm86IGFueSwgYlVPTUZpZWxkPzogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBiVU9NRmllbGQgPyBvUHJvcGVydHlJbmZvLnVuaXRQcm9wZXJ0eSA6IG9Qcm9wZXJ0eUluZm8uZGF0YVByb3BlcnR5LFxuXHRcdFx0c0lucHV0VHlwZSA9IG9Qcm9wZXJ0eUluZm8uaW5wdXRUeXBlLFxuXHRcdFx0YlByb3BlcnR5UmVxdWlyZWQgPSBvUHJvcGVydHlJbmZvLmlzRmllbGRSZXF1aXJlZDtcblx0XHRjb25zdCBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nID0gTWFzc0VkaXRIZWxwZXIuZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZyhzSW5wdXRUeXBlKTtcblx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zID0gYVZhbHVlcy5kZWZhdWx0T3B0aW9ucyB8fCBbXTtcblx0XHQvL1RPRE8gLSBBZGQgPDxVc2UgVmFsdWUgSGVscCBvciBjb250cm9sIGltcGxtZW50YXRpb24+PiBhbmQgcmVsYXRlZCBrZXkgYnkgY2hlY2tpbmcgaWYgdmFsdWUgaGVscCBpcyBlbmFibGVkIGZvciBwcm9wZXJ0eSBvciBVbml0LlxuXHRcdC8vVE9ETyAtIEFkZCBvcHRpb24gQXBwbHkgdG8gRW1wdHkgRmllbGRzIG9ubHkgZm9yIEJvdGggVmFsdWUgSGVscCBhbmQgY29udHJvbHMuXG5cdFx0Y29uc3QgYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoID0gYUNvbnRleHRzLnNvbWUoZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eVBhdGgpO1xuXHRcdH0pO1xuXG5cdFx0aWYgKHNJbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0Y29uc3QgZmFsc2VFbnRyeSA9IHsgdGV4dDogXCJOb1wiLCBrZXk6IGAke3NQcm9wZXJ0eVBhdGh9L2ZhbHNlYCwgdGV4dEluZm86IHsgdmFsdWU6IGZhbHNlIH0gfTtcblx0XHRcdGNvbnN0IHRydXRoeUVudHJ5ID0geyB0ZXh0OiBcIlllc1wiLCBrZXk6IGAke3NQcm9wZXJ0eVBhdGh9L3RydWVgLCB0ZXh0SW5mbzogeyB2YWx1ZTogdHJ1ZSB9IH07XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQoZmFsc2VFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoZmFsc2VFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQodHJ1dGh5RW50cnkpO1xuXHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KHRydXRoeUVudHJ5KTtcblx0XHR9XG5cblx0XHRpZiAob1Byb3BlcnR5SW5mby5pc1ZhbHVlSGVscEVuYWJsZWQgfHwgKG9Qcm9wZXJ0eUluZm8uaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiBiVU9NRmllbGQpKSB7XG5cdFx0XHRjb25zdCB2aGRFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMudXNlVmFsdWVIZWxwVmFsdWUsIGtleTogXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIiArIHNQcm9wZXJ0eVBhdGggfTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdCh2aGRFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQodmhkRW50cnkpO1xuXHRcdH1cblxuXHRcdGlmIChiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGlmIChiUHJvcGVydHlSZXF1aXJlZCAhPT0gXCJ0cnVlXCIgJiYgIWJVT01GaWVsZCkge1xuXHRcdFx0XHRjb25zdCBjbGVhckVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5jbGVhckZpZWxkVmFsdWUsIGtleTogXCJDbGVhckZpZWxkVmFsdWUvXCIgKyBzUHJvcGVydHlQYXRoIH07XG5cdFx0XHRcdGFWYWx1ZXMudW5zaGlmdChjbGVhckVudHJ5KTtcblx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBlbXB0eUVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIHNQcm9wZXJ0eVBhdGggfTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHR9XG5cdFx0Y29uc3Qga2VlcEVudHJ5ID0ge1xuXHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4ICsgXCIgXCIgKyBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nICsgXCIgPlwiLFxuXHRcdFx0a2V5OiBcIkRlZmF1bHQvXCIgKyBzUHJvcGVydHlQYXRoXG5cdFx0fTtcblx0XHRhVmFsdWVzLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRleHQgYXJyYW5nZW1lbnQgaW5mbyBmb3IgYSBjb250ZXh0IHByb3BlcnR5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgUGF0aFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25QYXRoIFBhdGggdG8gdGV4dCBhc3NvY2lhdGlvbiBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHtzdHJpbmd9IGRpc3BsYXlNb2RlIERpc3BsYXkgbW9kZSBvZiB0aGUgcHJvcGVydHkgYW5kIHRleHQgYXNzb2NpYXRpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSBzZWxlY3RlZENvbnRleHQgQ29udGV4dCB0byBmaW5kIHRoZSBmdWxsIHRleHRcblx0ICogQHJldHVybnMge1RleHRBcnJhbmdlbWVudEluZm99XG5cdCAqL1xuXHRnZXRUZXh0QXJyYW5nZW1lbnRJbmZvOiBmdW5jdGlvbiAoXG5cdFx0cHJvcGVydHk6IHN0cmluZyxcblx0XHRkZXNjcmlwdGlvblBhdGg6IHN0cmluZyxcblx0XHRkaXNwbGF5TW9kZTogc3RyaW5nLFxuXHRcdHNlbGVjdGVkQ29udGV4dDogQ29udGV4dFxuXHQpOiBUZXh0QXJyYW5nZW1lbnRJbmZvIHtcblx0XHRsZXQgdmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSxcblx0XHRcdGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRmdWxsVGV4dDtcblx0XHRpZiAoZGVzY3JpcHRpb25QYXRoICYmIHByb3BlcnR5KSB7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCk7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSBkZXNjcmlwdGlvblZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QocHJvcGVydHkpO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWUgKyBcIiAoXCIgKyBkZXNjcmlwdGlvblZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gZGVzY3JpcHRpb25WYWx1ZSArIFwiIChcIiArIHZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0TG9nLmluZm8oXCJEaXNwbGF5IFByb3BlcnR5IG5vdCBhcHBsaWNhYmxlOiBcIiArIHByb3BlcnR5KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XCJ0ZXh0QXJyYW5nZW1lbnRcIjogZGlzcGxheU1vZGUsXG5cdFx0XHRcInZhbHVlUGF0aFwiOiBwcm9wZXJ0eSxcblx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IGRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFwidmFsdWVcIjogdmFsdWUsXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcImZ1bGxUZXh0XCI6IGZ1bGxUZXh0XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSB2aXNpYmlsaXR5IHZhbHV1ZSBmb3IgdGhlIE1hbmFnZWRPYmplY3QgQW55LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FueVR5cGV9IGFueSBUaGUgTWFuYWdlZE9iamVjdCBBbnkgdG8gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZpc2libGUgdmFsdWUgb2YgdGhlIGJpbmRpbmcuXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIG1hc3MgZWRpdCBmaWVsZCBpcyBlZGl0YWJsZS5cblx0ICovXG5cdGlzRWRpdGFibGU6IGZ1bmN0aW9uIChhbnk6IEFueVR5cGUpOiBib29sZWFuIHtcblx0XHRjb25zdCBiaW5kaW5nID0gYW55LmdldEJpbmRpbmcoXCJhbnlcIik7XG5cdFx0Y29uc3QgdmFsdWUgPSAoYmluZGluZyBhcyBhbnkpLmdldEV4dGVybmFsVmFsdWUoKTtcblx0XHRyZXR1cm4gdmFsdWUgPT09IEVkaXRNb2RlLkVkaXRhYmxlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgdmlzaWJpbGl0eSBvZiBtYXNzIGVkaXQgZmllbGQgb24gY2hhbmdlIG9mIHRoZSBNYW5hZ2VkT2JqZWN0IEFueSBiaW5kaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICovXG5cdG9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlOiBmdW5jdGlvbiAob0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG9iamVjdHNGb3JWaXNpYmlsaXR5ID0gb0RpYWxvZ0RhdGFNb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBkYXRhUHJvcGVydHkgKyBcIi9vYmplY3RzRm9yVmlzaWJpbGl0eVwiKSB8fCBbXTtcblx0XHRjb25zdCBlZGl0YWJsZSA9IG9iamVjdHNGb3JWaXNpYmlsaXR5LnNvbWUoTWFzc0VkaXRIZWxwZXIuaXNFZGl0YWJsZSk7XG5cblx0XHRpZiAoZWRpdGFibGUpIHtcblx0XHRcdG9EaWFsb2dEYXRhTW9kZWwuc2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgZGF0YVByb3BlcnR5ICsgXCIvdmlzaWJsZVwiLCBlZGl0YWJsZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgTWFuYWdlZCBPYmplY3QgQW55IGZvciB2aXNpYmlsaXR5IG9mIHRoZSBtYXNzIGVkaXQgZmllbGRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FueVR5cGV9IG1PVG9Vc2UgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHthbnl9IHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKi9cblx0dXBkYXRlT25Db250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAobU9Ub1VzZTogQW55VHlwZSwgb0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcblx0XHRjb25zdCBiaW5kaW5nID0gbU9Ub1VzZS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXG5cdFx0dmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5ID0gdmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5IHx8IFtdO1xuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eS5wdXNoKG1PVG9Vc2UpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hDaGFuZ2UoTWFzc0VkaXRIZWxwZXIub25Db250ZXh0RWRpdGFibGVDaGFuZ2UuYmluZChudWxsLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHkpKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGJvdW5kIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIHZpc2liaWxpdHkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj59IGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7QW55VHlwZX0gVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKi9cblx0Z2V0Qm91bmRPYmplY3Q6IGZ1bmN0aW9uIChleHBCaW5kaW5nOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz4sIGNvbnRleHQ6IENvbnRleHQpOiBBbnlUeXBlIHtcblx0XHRjb25zdCBtT1RvVXNlID0gbmV3IEFueSh7IGFueTogZXhwQmluZGluZyB9KTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRtT1RvVXNlLnNldE1vZGVsKG1vZGVsKTtcblx0XHRtT1RvVXNlLnNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQpO1xuXG5cdFx0cmV0dXJuIG1PVG9Vc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj59IGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHthbnl9IHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRnZXRGaWVsZFZpc2libGl0eTogZnVuY3Rpb24gKFxuXHRcdGV4cEJpbmRpbmc6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPixcblx0XHRvRGlhbG9nRGF0YU1vZGVsOiBKU09OTW9kZWwsXG5cdFx0ZGF0YVByb3BlcnR5OiBzdHJpbmcsXG5cdFx0dmFsdWVzOiBhbnksXG5cdFx0Y29udGV4dDogQ29udGV4dFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtT1RvVXNlID0gTWFzc0VkaXRIZWxwZXIuZ2V0Qm91bmRPYmplY3QoZXhwQmluZGluZywgY29udGV4dCk7XG5cdFx0Y29uc3QgaXNDb250ZXh0RWRpdGFibGUgPSBNYXNzRWRpdEhlbHBlci5pc0VkaXRhYmxlKG1PVG9Vc2UpO1xuXG5cdFx0aWYgKCFpc0NvbnRleHRFZGl0YWJsZSkge1xuXHRcdFx0TWFzc0VkaXRIZWxwZXIudXBkYXRlT25Db250ZXh0Q2hhbmdlKG1PVG9Vc2UsIG9EaWFsb2dEYXRhTW9kZWwsIGRhdGFQcm9wZXJ0eSwgdmFsdWVzKTtcblx0XHR9XG5cdFx0cmV0dXJuIGlzQ29udGV4dEVkaXRhYmxlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIHJ1bnRpbWUgbW9kZWw6XG5cdCAqID0+IFRoZSBtb2RlbCBjb25zaXN0cyBvZiB2YWx1ZXMgc2hvd24gaW4gdGhlIGNvbWJvQm94IG9mIHRoZSBkaWFsb2cgKExlYXZlIEJsYW5rLCBLZWVwIEV4aXN0aW5nIFZhbHVlcywgb3IgYW55IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgY29udGV4dCwgZXRjLilcblx0ICogPT4gVGhlIG1vZGVsIHdpbGwgY2FwdHVyZSBydW50aW1lIGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgcHJvcGVydHkgKHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBjb21ib0JveCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcGFyYW0ge0NvbnRleHR9IGRpYWxvZ0NvbnRleHQgVHJhbnNpZW50IGNvbnRleHQgZm9yIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9XG5cdCAqL1xuXHRzZXRSdW50aW1lTW9kZWxPbkRpYWxvZzogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBkaWFsb2dDb250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhVW5pdERhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlYWRPbmx5RmllbGRJbmZvOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9EYXRhID0ge1xuXHRcdFx0XCJ2YWx1ZXNcIjogYVZhbHVlcyxcblx0XHRcdFwidW5pdERhdGFcIjogYVVuaXREYXRhLFxuXHRcdFx0XCJyZXN1bHRzXCI6IGFSZXN1bHRzLFxuXHRcdFx0XCJyZWFkYWJsZVByb3BlcnR5RGF0YVwiOiBhUmVhZE9ubHlGaWVsZEluZm8sXG5cdFx0XHRcInNlbGVjdGVkS2V5XCI6IHVuZGVmaW5lZFxuXHRcdH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0RhdGE6IGFueSkge1xuXHRcdFx0bGV0IG9UZXh0SW5mbztcblx0XHRcdGxldCBzUHJvcGVydHlLZXk7XG5cdFx0XHRsZXQgc1VuaXRQcm9wZXJ0eU5hbWU7XG5cdFx0XHRjb25zdCBvRGlzdGluY3RWYWx1ZU1hcDogYW55ID0ge307XG5cdFx0XHRjb25zdCBvRGlzdGluY3RVbml0TWFwOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMgLyosIGRpYWxvZ0NvbnRleHQgKi8pO1xuXHRcdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IG9EYXRhLmRhdGFQcm9wZXJ0eS5zcGxpdChcIi9cIik7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUGF0aFZhbHVlID0gY29udGV4dC5nZXRPYmplY3Qob0RhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIHNNdWx0aUxldmVsUGF0aFZhbHVlO1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSAmJiBhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRvRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gc011bHRpTGV2ZWxQYXRoVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdFx0Ly8gfVxuXG5cdFx0XHRcdGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dLnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogb0RhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdHZhbHVlUGF0aDogb0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBvRGF0YS5kaXNwbGF5XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gfHwgW107XG5cdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdIHx8IFtdO1xuXHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eSAmJiBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdFx0XHRpZiAob0RhdGEuaW5wdXRUeXBlICE9IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHRcdFx0XHRvVGV4dEluZm8gPSBNYXNzRWRpdEhlbHBlci5nZXRUZXh0QXJyYW5nZW1lbnRJbmZvKFxuXHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XHRvRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEuZGlzcGxheSxcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGVudHJ5ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgb0RhdGFPYmplY3Rbb0RhdGEuZGF0YVByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XHRcImtleVwiOiBzUHJvcGVydHlLZXksXG5cdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XSkge1xuXHRcdFx0XHRcdFx0c1VuaXRQcm9wZXJ0eU5hbWUgPSBvRGF0YS51bml0UHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRcdG9EYXRhLnVuaXRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bml0RW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcImtleVwiOiBzVW5pdFByb3BlcnR5TmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5wdXNoKHVuaXRFbnRyeSk7XG5cdFx0XHRcdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2godW5pdEVudHJ5KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS50ZXh0SW5mbyA9IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblBhdGg6IG9EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0RhdGEuZGlzcGxheVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFZhbHVlTWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdH1cblx0XHRcdGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RVbml0TWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS51bml0UHJvcGVydHksIHNVbml0UHJvcGVydHlOYW1lICYmIG9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24gKG9EYXRhOiBhbnkpIHtcblx0XHRcdGxldCB2YWx1ZXM6IGFueSA9IHt9O1xuXHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSA9IE1hc3NFZGl0SGVscGVyLmdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgob0RhdGEuZGF0YVByb3BlcnR5LCBhVmFsdWVzKTtcblx0XHRcdFx0aWYgKCFzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUpIHtcblx0XHRcdFx0XHRzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUucHVzaCh7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBcIkVtcHR5L1wiICsgb0RhdGEuZGF0YVByb3BlcnR5IH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUsIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZXMgPSBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSkge1xuXHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gfHwgW107XG5cdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhKTtcblx0XHRcdFx0dmFsdWVzID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gJiYgYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ubGVuZ3RoKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSwgYUNvbnRleHRzLCBvRGVmYXVsdFZhbHVlcywgb0RhdGEsIHRydWUpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS50ZXh0SW5mbyA9IHt9O1xuXHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBvRGF0YS51bml0UHJvcGVydHkpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvRGF0YS5pbnB1dFR5cGU7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHQob0RhdGEuZGF0YVByb3BlcnR5ICYmIGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSAmJiAhYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLmxlbmd0aCkgfHxcblx0XHRcdFx0KG9EYXRhLnVuaXRQcm9wZXJ0eSAmJiBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSAmJiAhYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ubGVuZ3RoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzID1cblx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0uc29tZShmdW5jdGlvbiAob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgIWJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzKSB7XG5cdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIG9EYXRhLmRhdGFQcm9wZXJ0eSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmXG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0uc29tZShmdW5jdGlvbiAob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRpZiAoIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSxcblx0XHRcdFx0XHRcdFx0a2V5OiBcIkVtcHR5L1wiICsgb0RhdGEudW5pdFByb3BlcnR5XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0udGV4dEluZm8gPSB7fTtcblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goXG5cdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRvRGF0YS51bml0UHJvcGVydHlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmlucHV0VHlwZSA9IG9EYXRhLmlucHV0VHlwZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJiB0eXBlb2Ygb0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7IFwicHJvcGVydHlcIjogb0RhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZTogb0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5LCB0eXBlOiBcIkRlZmF1bHRcIiB9KTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHMgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdICYmXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDJcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBSZWFkT25seUV4cHJlc3Npb24gY2hhbmdlXG5cdFx0XHRcdGFSZWFkT25seUZpZWxkSW5mby5wdXNoKHtcblx0XHRcdFx0XHRcInByb3BlcnR5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGg6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMS5wYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWU6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMi52YWx1ZSxcblx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0dGluZyB2aXNiaWxpdHkgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0XHRcdGlmIChvRGF0YS5lZGl0TW9kZSkge1xuXHRcdFx0XHR2YWx1ZXMudmlzaWJsZSA9XG5cdFx0XHRcdFx0b0RhdGEuZWRpdE1vZGUgPT09IEVkaXRNb2RlLkVkaXRhYmxlIHx8XG5cdFx0XHRcdFx0YUNvbnRleHRzLnNvbWUoXG5cdFx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5nZXRGaWVsZFZpc2libGl0eS5iaW5kKE1hc3NFZGl0SGVscGVyLCBvRGF0YS5lZGl0TW9kZSwgb0RpYWxvZ0RhdGFNb2RlbCwgb0RhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZXMpXG5cdFx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHZhbHVlcy5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBvRGF0YS5kYXRhUHJvcGVydHkpO1xuXHRcdFx0dmFsdWVzLmlucHV0VHlwZSA9IG9EYXRhLmlucHV0VHlwZTtcblx0XHRcdHZhbHVlcy51bml0UHJvcGVydHkgPSBvRGF0YS51bml0UHJvcGVydHk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb0RpYWxvZ0RhdGFNb2RlbDtcblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdHJhbnNpZW50IGNvbnRleHQgZm9yIGRpYWxvZy5cblx0ICpcblx0ICogQHBhcmFtIHtUYWJsZX0gdGFibGUgSW5zdGFuY2Ugb2YgVGFibGUuXG5cdCAqIEBwYXJhbSB7RGlhbG9nfSBkaWFsb2cgTWFzcyBFZGl0IERpYWxvZy5cblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Z2V0RGlhbG9nQ29udGV4dDogZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgZGlhbG9nPzogRGlhbG9nKTogQ29udGV4dCB7XG5cdFx0bGV0IHRyYW5zQ3R4OiBDb250ZXh0ID0gKGRpYWxvZyAmJiBkaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoKSkgYXMgQ29udGV4dDtcblxuXHRcdGlmICghdHJhbnNDdHgpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0KHRyYW5zaWVudExpc3RCaW5kaW5nIGFzIGFueSkucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvKiAqL1xuXHRcdFx0fTtcblx0XHRcdHRyYW5zQ3R4ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHt9LCB0cnVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJhbnNDdHg7XG5cdH0sXG5cblx0b25EaWFsb2dPcGVuOiBmdW5jdGlvbiAoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0ZmllbGRzSW5mb01vZGVsLnNldFByb3BlcnR5KFwiL2lzT3BlblwiLCB0cnVlKTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBtYXNzIGVkaXQgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1RhYmxlIEluc3RhbmNlIG9mIFRhYmxlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbGxlciBDb250cm9sbGVyIGZvciB0aGUgdmlld1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIHJldHVybmluZyBpbnN0YW5jZSBvZiBkaWFsb2cuXG5cdCAqL1xuXHRjcmVhdGVEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpIHtcblx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9tYXNzRWRpdC9NYXNzRWRpdERpYWxvZ1wiLFxuXHRcdFx0YURhdGFBcnJheTogYW55W10gPSBbXSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0XHRvRGVmYXVsdFZhbHVlcyA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRUZXh0c0ZvckRpYWxvZyhvUmVzb3VyY2VCdW5kbGUsIGFDb250ZXh0cy5sZW5ndGgsIG9UYWJsZSksXG5cdFx0XHRvRGF0YUZpZWxkTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5wcmVwYXJlRGF0YUZvckRpYWxvZyhvVGFibGUsIGFDb250ZXh0cywgYURhdGFBcnJheSksXG5cdFx0XHRkaWFsb2dDb250ZXh0ID0gTWFzc0VkaXRIZWxwZXIuZ2V0RGlhbG9nQ29udGV4dChvVGFibGUpLFxuXHRcdFx0b0RpYWxvZ0RhdGFNb2RlbCA9IE1hc3NFZGl0SGVscGVyLnNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nKGFDb250ZXh0cywgYURhdGFBcnJheSwgb0RlZmF1bHRWYWx1ZXMsIGRpYWxvZ0NvbnRleHQpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBvRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkTW9kZWw6IG9EYXRhRmllbGRNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIilcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkTW9kZWw6IG9EYXRhRmllbGRNb2RlbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7IGRlZmluaXRpb246IG9GcmFnbWVudCB9KS50aGVuKGZ1bmN0aW9uIChvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBEcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cztcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IG9EZWZhdWx0VmFsdWVzLm1hc3NFZGl0VGl0bGUsXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IFtvRGlhbG9nQ29udGVudF0sXG5cdFx0XHRcdFx0XHRcdGFmdGVyT3BlbjogTWFzc0VkaXRIZWxwZXIub25EaWFsb2dPcGVuLFxuXHRcdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJza2lwUGF0Y2hIYW5kbGVyc1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9EaWFsb2cuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3VsdHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVzdWx0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVJlYWRhYmxlSW5mbyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWFkYWJsZVByb3BlcnR5RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZVByb21pc2U6IGFueVtdID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlJlYWRPbmx5RmllbGQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBncm91cElkO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9sZXQgaW5kZXggPSAwO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGVycm9yVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSwgaWR4OiBudW1iZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbiAob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlID09PSBvUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvcGVydHlJbmZvLnZhbHVlID09PSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiUGF0aFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aCkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncm91cElkID0gXCIkYXV0by5cIiArIGlkeDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL2luZGV4ICs9IDE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9sZXQgcHJvbWlzZUNvdW50ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Jlc3VsdC5rZXlWYWx1ZSAmJiBvUmVzdWx0LnZhbHVlICE9PSBcIkRlZmF1bHRcIiAmJiAhYlJlYWRPbmx5RmllbGQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNoYW5nZVByb21pc2UucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1NlbGVjdGVkQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zZXRQcm9wZXJ0eShvUmVzdWx0LmtleVZhbHVlLCBvUmVzdWx0LnZhbHVlLCBncm91cElkKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMucHVzaChvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIk1hc3MgRWRpdDogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdXBkYXRpbmcgZW50cmllcy5cIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdChQcm9taXNlIGFzIGFueSkuYWxsU2V0dGxlZChjaGFuZ2VQcm9taXNlKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0V4dGVuc2lvbkFQSSA9IG9Db250cm9sbGVyICYmIChvQ29udHJvbGxlci5nZXRFeHRlbnNpb25BUEkoKSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0V4dGVuc2lvbkFQSS5yZWZyZXNoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBzdWJ0aXRsZUNvbHVtbiA9IENvbW1vblV0aWxzLmdldE1lc3NhZ2VDb2x1bW4ob1RhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgbWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzID0gW10gYXMgYW55O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSwgaWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VUYXJnZXRzID0gbWVzc2FnZS5nZXRUYXJnZXRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VUYXJnZXRzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VUYXJnZXRzLmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlVGFyZ2V0c1swXS5sZW5ndGggJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5wZXJzaXN0ZW50ID09PSB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dCA9IGFDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihvQ29udGV4dC5nZXRQYXRoKCkpICE9PSAtMTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMucHVzaChib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLmFkZGl0aW9uYWxUZXh0ID0gYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQuZ2V0T2JqZWN0KClbc3VidGl0bGVDb2x1bW5dXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMubGVuZ3RoID09PSAwICYmIGVycm9yVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3NUb2FzdCA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfU1VDQ0VTU19UT0FTVFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHN1Y2Nlc3NUb2FzdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMubGVuZ3RoICsgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5sZW5ndGggPFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5sZW5ndGggKyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLmxlbmd0aCA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9UYWJsZSBhcyBhbnkpLmdldFNlbGVjdGVkQ29udGV4dHMoKS5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob0NvbnRyb2xsZXIuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwic2tpcFBhdGNoSGFuZGxlcnNcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuY2FuY2VsQnV0dG9uVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9UYWJsZS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvRGlhbG9nRGF0YU1vZGVsLCBcImZpZWxkc0luZm9cIik7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG1vZGVsKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQoZGlhbG9nQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9EaWFsb2cpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIZWxwZXI7XG4iXX0=
|