@sapui5/sap.fe.core 1.101.0 → 1.103.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 +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +66 -30
- package/src/sap/fe/core/AppComponent.ts +68 -51
- package/src/sap/fe/core/AppStateHandler.js +13 -13
- package/src/sap/fe/core/AppStateHandler.ts +18 -18
- package/src/sap/fe/core/BaseController.js +11 -9
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +279 -188
- package/src/sap/fe/core/CommonUtils.ts +306 -215
- package/src/sap/fe/core/ExtensionAPI.js +25 -30
- package/src/sap/fe/core/ExtensionAPI.ts +37 -41
- package/src/sap/fe/core/PageController.js +12 -7
- package/src/sap/fe/core/PageController.ts +10 -5
- package/src/sap/fe/core/TemplateComponent.js +6 -6
- package/src/sap/fe/core/TemplateComponent.ts +11 -11
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +3 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +306 -78
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +280 -70
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
- 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 +351 -229
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +321 -246
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +59 -34
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -45
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +72 -72
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +82 -80
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +152 -131
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +171 -152
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +11 -10
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +31 -37
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +30 -15
- package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
- package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +19 -11
- package/src/sap/fe/core/controllerextensions/Paginator.ts +22 -14
- package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +39 -21
- package/src/sap/fe/core/controllerextensions/Share.ts +45 -26
- package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -62
- package/src/sap/fe/core/controllerextensions/ViewState.js +75 -62
- package/src/sap/fe/core/controllerextensions/ViewState.ts +78 -63
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +99 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +58 -112
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +7 -7
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +262 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +20 -21
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ManageDialog.fragment.xml +0 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1631 -0
- package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +270 -211
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +772 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +240 -100
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1199 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +364 -229
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +188 -0
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +185 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +626 -0
- package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +112 -69
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +937 -0
- package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +72 -73
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +21 -24
- package/src/sap/fe/core/controls/CommandExecution.ts +19 -24
- package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +48 -43
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +51 -46
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +11 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +19 -9
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +14 -8
- package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +50 -3
- package/src/sap/fe/core/controls/FileWrapper.ts +45 -12
- package/src/sap/fe/core/controls/FilterBar.js +6 -2
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +12 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +14 -3
- package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
- package/src/sap/fe/core/controls/MassEditSelect.ts +41 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +48 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +71 -76
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +36 -65
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +551 -36
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +605 -36
- package/src/sap/fe/core/converters/ConverterContext.js +26 -33
- package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +17 -14
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +56 -67
- package/src/sap/fe/core/converters/MetaModelConverter.ts +183 -193
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +73 -37
- package/src/sap/fe/core/converters/annotations/DataField.ts +121 -77
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
- package/src/sap/fe/core/converters/controls/Common/Action.js +51 -49
- package/src/sap/fe/core/converters/controls/Common/Action.ts +58 -54
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -15
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +29 -27
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
- package/src/sap/fe/core/converters/controls/Common/Form.js +30 -34
- package/src/sap/fe/core/converters/controls/Common/Form.ts +48 -58
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
- package/src/sap/fe/core/converters/controls/Common/Table.js +318 -244
- package/src/sap/fe/core/converters/controls/Common/Table.ts +368 -297
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +135 -125
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +162 -148
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +51 -45
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +79 -67
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +92 -89
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +124 -120
- package/src/sap/fe/core/converters/helpers/Aggregation.js +11 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +25 -23
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -30
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +31 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
- package/src/sap/fe/core/converters/helpers/ID.js +46 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +56 -55
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +65 -77
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +6 -6
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +10 -8
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +83 -22
- package/src/sap/fe/core/formatters/TableFormatter.ts +80 -25
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/fpm/Component.js +2 -2
- package/src/sap/fe/core/fpm/Component.ts +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
- package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +388 -285
- package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
- package/src/sap/fe/core/helpers/ClassSupport.ts +15 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +10 -9
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/MassEditHelper.js +532 -264
- package/src/sap/fe/core/helpers/MassEditHelper.ts +560 -289
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +50 -58
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +16 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +20 -16
- 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 +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
- package/src/sap/fe/core/library.js +51 -3
- package/src/sap/fe/core/library.ts +47 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +151 -197
- package/src/sap/fe/core/messagebundle_ar.properties +36 -63
- package/src/sap/fe/core/messagebundle_bg.properties +36 -63
- package/src/sap/fe/core/messagebundle_ca.properties +36 -63
- package/src/sap/fe/core/messagebundle_cs.properties +36 -63
- package/src/sap/fe/core/messagebundle_cy.properties +36 -63
- package/src/sap/fe/core/messagebundle_da.properties +37 -64
- package/src/sap/fe/core/messagebundle_de.properties +36 -63
- package/src/sap/fe/core/messagebundle_el.properties +38 -65
- package/src/sap/fe/core/messagebundle_en.properties +37 -64
- package/src/sap/fe/core/messagebundle_en_GB.properties +37 -64
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +44 -73
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +37 -64
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +52 -81
- package/src/sap/fe/core/messagebundle_es.properties +36 -63
- package/src/sap/fe/core/messagebundle_es_MX.properties +36 -63
- package/src/sap/fe/core/messagebundle_et.properties +36 -63
- package/src/sap/fe/core/messagebundle_fi.properties +36 -63
- package/src/sap/fe/core/messagebundle_fr.properties +39 -66
- package/src/sap/fe/core/messagebundle_fr_CA.properties +36 -63
- package/src/sap/fe/core/messagebundle_hi.properties +36 -63
- package/src/sap/fe/core/messagebundle_hr.properties +36 -63
- package/src/sap/fe/core/messagebundle_hu.properties +35 -62
- package/src/sap/fe/core/messagebundle_id.properties +37 -64
- package/src/sap/fe/core/messagebundle_it.properties +54 -81
- package/src/sap/fe/core/messagebundle_iw.properties +36 -63
- package/src/sap/fe/core/messagebundle_ja.properties +36 -63
- package/src/sap/fe/core/messagebundle_kk.properties +36 -63
- package/src/sap/fe/core/messagebundle_ko.properties +36 -63
- package/src/sap/fe/core/messagebundle_lt.properties +36 -63
- package/src/sap/fe/core/messagebundle_lv.properties +36 -63
- package/src/sap/fe/core/messagebundle_ms.properties +37 -64
- package/src/sap/fe/core/messagebundle_nl.properties +37 -64
- package/src/sap/fe/core/messagebundle_no.properties +36 -63
- package/src/sap/fe/core/messagebundle_pl.properties +37 -64
- package/src/sap/fe/core/messagebundle_pt.properties +37 -64
- package/src/sap/fe/core/messagebundle_pt_PT.properties +36 -63
- package/src/sap/fe/core/messagebundle_ro.properties +36 -63
- package/src/sap/fe/core/messagebundle_ru.properties +36 -63
- package/src/sap/fe/core/messagebundle_sh.properties +36 -63
- package/src/sap/fe/core/messagebundle_sk.properties +36 -63
- package/src/sap/fe/core/messagebundle_sl.properties +38 -65
- package/src/sap/fe/core/messagebundle_sv.properties +36 -63
- package/src/sap/fe/core/messagebundle_th.properties +36 -63
- package/src/sap/fe/core/messagebundle_tr.properties +36 -63
- package/src/sap/fe/core/messagebundle_uk.properties +37 -64
- package/src/sap/fe/core/messagebundle_vi.properties +37 -64
- package/src/sap/fe/core/messagebundle_zh_CN.properties +36 -63
- package/src/sap/fe/core/messagebundle_zh_TW.properties +37 -64
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +6 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +12 -10
- package/src/sap/fe/core/services/NavigationServiceFactory.js +54 -45
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +61 -49
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +63 -60
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +76 -73
- package/src/sap/fe/core/services/ShellServicesFactory.js +102 -71
- package/src/sap/fe/core/services/ShellServicesFactory.ts +109 -78
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +24 -18
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +53 -50
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +3 -4
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -15
- package/src/sap/fe/core/templating/EntitySetHelper.ts +14 -18
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +12 -11
- package/src/sap/fe/core/templating/FilterHelper.ts +17 -16
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +79 -56
- package/src/sap/fe/core/templating/PropertyHelper.ts +41 -27
- package/src/sap/fe/core/templating/UIFormatters.js +163 -97
- package/src/sap/fe/core/templating/UIFormatters.ts +210 -129
- 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 +2 -2
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/AnnotationHelper.js +0 -331
- package/src/sap/fe/core/AnnotationHelper.ts +0 -321
- package/src/sap/fe/core/RouterProxy.js +0 -938
- package/src/sap/fe/core/TransactionHelper.js +0 -1577
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -406
- package/src/sap/fe/core/actions/collaboration/Manage.js +0 -264
- package/src/sap/fe/core/actions/draft.js +0 -665
- package/src/sap/fe/core/actions/messageHandling.js +0 -579
- 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/actions/sticky.ts +0 -119
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1729
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldTemplating", "sap/m/Button", "sap/m/Dialog", "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, DataModelPathHelper, PropertyHelper, FieldTemplating, Button, Dialog, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "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, BindingToolkit, FELibrary, DataModelPathHelper, PropertyHelper, FieldTemplating, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var isCollectionField = UIFormatters.isCollectionField;
|
|
@@ -14,16 +14,33 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
14
14
|
var setEditStyleProperties = FieldTemplating.setEditStyleProperties;
|
|
15
15
|
var getTextBinding = FieldTemplating.getTextBinding;
|
|
16
16
|
var hasValueHelpWithFixedValues = PropertyHelper.hasValueHelpWithFixedValues;
|
|
17
|
+
var hasValueHelp = PropertyHelper.hasValueHelp;
|
|
18
|
+
var hasUnit = PropertyHelper.hasUnit;
|
|
19
|
+
var hasCurrency = PropertyHelper.hasCurrency;
|
|
20
|
+
var getAssociatedUnitPropertyPath = PropertyHelper.getAssociatedUnitPropertyPath;
|
|
21
|
+
var getAssociatedUnitProperty = PropertyHelper.getAssociatedUnitProperty;
|
|
17
22
|
var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
|
|
23
|
+
var pathInModel = BindingToolkit.pathInModel;
|
|
24
|
+
var or = BindingToolkit.or;
|
|
25
|
+
var not = BindingToolkit.not;
|
|
26
|
+
var ifElse = BindingToolkit.ifElse;
|
|
27
|
+
var constant = BindingToolkit.constant;
|
|
28
|
+
var compileExpression = BindingToolkit.compileExpression;
|
|
29
|
+
|
|
30
|
+
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; } } }; }
|
|
31
|
+
|
|
32
|
+
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); }
|
|
33
|
+
|
|
34
|
+
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; }
|
|
18
35
|
|
|
19
36
|
var MassEditHelper = {
|
|
20
37
|
/**
|
|
21
38
|
* Initializes the value at final or deepest level path with a blank array.
|
|
22
39
|
* Return an empty array pointing to the final or deepest level path.
|
|
23
40
|
*
|
|
24
|
-
* @param
|
|
25
|
-
* @param
|
|
26
|
-
* @returns
|
|
41
|
+
* @param sPath Property path
|
|
42
|
+
* @param aValues Array instance where the default data needs to be added
|
|
43
|
+
* @returns The final path
|
|
27
44
|
*/
|
|
28
45
|
initLastLevelOfPropertyPath: function (sPath, aValues) {
|
|
29
46
|
var aFinalPath;
|
|
@@ -37,7 +54,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
37
54
|
sFullPath = sFullPath + sPropertyPath;
|
|
38
55
|
index++;
|
|
39
56
|
} else if (!aFinalPath[sPropertyPath]) {
|
|
40
|
-
sFullPath = sFullPath
|
|
57
|
+
sFullPath = "".concat(sFullPath, "/").concat(sPropertyPath);
|
|
41
58
|
|
|
42
59
|
if (sFullPath !== sPath) {
|
|
43
60
|
aFinalPath[sPropertyPath] = {};
|
|
@@ -53,13 +70,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
53
70
|
/**
|
|
54
71
|
* Method to get unique values for given array values.
|
|
55
72
|
*
|
|
56
|
-
* @param
|
|
57
|
-
* @param
|
|
58
|
-
* @param
|
|
59
|
-
* @returns
|
|
73
|
+
* @param sValue Property value
|
|
74
|
+
* @param index Index of the property value
|
|
75
|
+
* @param self Instance of the array
|
|
76
|
+
* @returns The unique value
|
|
60
77
|
*/
|
|
61
78
|
getUniqueValues: function (sValue, index, self) {
|
|
62
|
-
if (sValue) {
|
|
79
|
+
if (sValue != undefined && sValue != null) {
|
|
63
80
|
return self.indexOf(sValue) === index;
|
|
64
81
|
}
|
|
65
82
|
},
|
|
@@ -68,9 +85,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
68
85
|
* Gets the property value for a multi-level path (for example: _Materials/Material_Details gets the value of Material_Details under _Materials Object).
|
|
69
86
|
* Returns the propertyValue, which can be of any type (string, number, etc..).
|
|
70
87
|
*
|
|
71
|
-
* @param
|
|
72
|
-
* @param
|
|
73
|
-
* @returns
|
|
88
|
+
* @param sDataPropertyPath Property path
|
|
89
|
+
* @param oValues Object of property values
|
|
90
|
+
* @returns The property value
|
|
74
91
|
*/
|
|
75
92
|
getValueForMultiLevelPath: function (sDataPropertyPath, oValues) {
|
|
76
93
|
if (sDataPropertyPath && sDataPropertyPath.indexOf("/") > 0) {
|
|
@@ -90,9 +107,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
90
107
|
* => If propertyValue for all selected contexts is empty, then < Leave Blank > is preselected.
|
|
91
108
|
*
|
|
92
109
|
*
|
|
93
|
-
* @param
|
|
94
|
-
* @param
|
|
95
|
-
* @returns
|
|
110
|
+
* @param aContexts Contexts for mass edit
|
|
111
|
+
* @param sDataPropertyPath Data property path
|
|
112
|
+
* @returns The key path
|
|
96
113
|
*/
|
|
97
114
|
getDefaultSelectionPathComboBox: function (aContexts, sDataPropertyPath) {
|
|
98
115
|
if (sDataPropertyPath && aContexts.length > 0) {
|
|
@@ -109,11 +126,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
109
126
|
var aUniquePropertyValues = aPropertyValues.filter(MassEditHelper.getUniqueValues);
|
|
110
127
|
|
|
111
128
|
if (aUniquePropertyValues.length > 1) {
|
|
112
|
-
return "Default/"
|
|
129
|
+
return "Default/".concat(sDataPropertyPath);
|
|
113
130
|
} else if (aUniquePropertyValues.length === 0) {
|
|
114
|
-
return "Empty/"
|
|
131
|
+
return "Empty/".concat(sDataPropertyPath);
|
|
115
132
|
} else if (aUniquePropertyValues.length === 1) {
|
|
116
|
-
return sDataPropertyPath;
|
|
133
|
+
return "".concat(sDataPropertyPath, "/").concat(aUniquePropertyValues[0]);
|
|
117
134
|
}
|
|
118
135
|
}
|
|
119
136
|
},
|
|
@@ -121,9 +138,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
121
138
|
/**
|
|
122
139
|
* Checks hidden annotation value [both static and path based] for table's selected context.
|
|
123
140
|
*
|
|
124
|
-
* @param
|
|
125
|
-
* @param
|
|
126
|
-
* @returns
|
|
141
|
+
* @param hiddenValue Hidden annotation value / path for field
|
|
142
|
+
* @param aContexts Contexts for mass edit
|
|
143
|
+
* @returns The hidden annotation value
|
|
127
144
|
*/
|
|
128
145
|
getHiddenValueForContexts: function (hiddenValue, aContexts) {
|
|
129
146
|
if (hiddenValue && hiddenValue.$Path) {
|
|
@@ -150,19 +167,45 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
150
167
|
return dataFieldConverted && dataFieldConverted.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataFieldConverted.Target && dataFieldConverted.Target.value && dataFieldConverted.Target.value.indexOf("FieldGroup") > -1;
|
|
151
168
|
},
|
|
152
169
|
|
|
170
|
+
/**
|
|
171
|
+
* Get text path for the mass edit field.
|
|
172
|
+
*
|
|
173
|
+
* @param property Property path
|
|
174
|
+
* @param textBinding Text Binding Info
|
|
175
|
+
* @param displayMode Display mode
|
|
176
|
+
* @returns Text Property Path if it exists
|
|
177
|
+
*/
|
|
178
|
+
getTextPath: function (property, textBinding, displayMode) {
|
|
179
|
+
var descriptionPath;
|
|
180
|
+
|
|
181
|
+
if (textBinding && (textBinding.path || textBinding.parameters && textBinding.parameters.length) && property) {
|
|
182
|
+
if (textBinding.path && displayMode === "Description") {
|
|
183
|
+
descriptionPath = textBinding.path;
|
|
184
|
+
} else if (textBinding.parameters) {
|
|
185
|
+
textBinding.parameters.forEach(function (props) {
|
|
186
|
+
if (props.path && props.path !== property) {
|
|
187
|
+
descriptionPath = props.path;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return descriptionPath;
|
|
194
|
+
},
|
|
195
|
+
|
|
153
196
|
/**
|
|
154
197
|
* Initializes a JSON Model for properties of dialog fields [label, visiblity, dataproperty, etc.].
|
|
155
198
|
*
|
|
156
|
-
* @param
|
|
157
|
-
* @param
|
|
158
|
-
* @param
|
|
159
|
-
* @returns
|
|
199
|
+
* @param oTable Instance of Table
|
|
200
|
+
* @param aContexts Contexts for mass edit
|
|
201
|
+
* @param aDataArray Array containing data related to the dialog used by both the static and the runtime model
|
|
202
|
+
* @returns The model
|
|
160
203
|
*/
|
|
161
204
|
prepareDataForDialog: function (oTable, aContexts, aDataArray) {
|
|
162
205
|
var oMetaModel = oTable && oTable.getModel().getMetaModel(),
|
|
163
206
|
sCurrentEntitySetName = oTable.data("metaPath"),
|
|
164
207
|
aTableFields = MassEditHelper.getTableFields(oTable),
|
|
165
|
-
oEntityTypeContext = oMetaModel.getContext(sCurrentEntitySetName
|
|
208
|
+
oEntityTypeContext = oMetaModel.getContext("".concat(sCurrentEntitySetName, "/@")),
|
|
166
209
|
oEntitySetContext = oMetaModel.getContext(sCurrentEntitySetName),
|
|
167
210
|
oDataModelObjectPath = getInvolvedDataModelObjects(oEntityTypeContext);
|
|
168
211
|
var oDataFieldModel = new JSONModel();
|
|
@@ -178,11 +221,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
178
221
|
if (sDataPropertyPath) {
|
|
179
222
|
var _oDataFieldConverted$, _oDataFieldConverted$2;
|
|
180
223
|
|
|
181
|
-
var oPropertyInfo = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName
|
|
182
|
-
|
|
183
|
-
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;
|
|
184
|
-
sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"];
|
|
185
|
-
bValueHelpEnabledForUnit = sUnitPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
|
|
224
|
+
var oPropertyInfo = sDataPropertyPath && oMetaModel.getObject("".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath, "@"));
|
|
225
|
+
sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"] || oColumnInfo.dataProperty;
|
|
186
226
|
|
|
187
227
|
if (oDataModelObjectPath) {
|
|
188
228
|
oDataModelObjectPath.targetObject = oDataModelObjectPath.targetEntityType.entityProperties.filter(function (oProperty) {
|
|
@@ -194,7 +234,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
194
234
|
oTextBinding = getTextBinding(oDataModelObjectPath, {}, true) || {};
|
|
195
235
|
var oFieldContext = oMetaModel.getContext(oColumnInfo.annotationPath),
|
|
196
236
|
oDataFieldConverted = convertMetaModelContext(oFieldContext),
|
|
197
|
-
oPropertyContext = oMetaModel.getContext(sCurrentEntitySetName
|
|
237
|
+
oPropertyContext = oMetaModel.getContext("".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath, "@")),
|
|
198
238
|
oInterface = oPropertyContext && oPropertyContext.getInterface();
|
|
199
239
|
var oDataModelPath = getInvolvedDataModelObjects(oFieldContext, oEntitySetContext);
|
|
200
240
|
|
|
@@ -209,10 +249,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
209
249
|
return oInterface.getModel();
|
|
210
250
|
},
|
|
211
251
|
getPath: function () {
|
|
212
|
-
return sCurrentEntitySetName
|
|
252
|
+
return "".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath);
|
|
213
253
|
}
|
|
214
254
|
};
|
|
215
|
-
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
|
|
255
|
+
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
|
|
216
256
|
|
|
217
257
|
var chartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
|
|
218
258
|
var isAction = !!oDataFieldConverted.Action;
|
|
@@ -220,11 +260,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
220
260
|
|
|
221
261
|
if (isImage || bHiddenField || chartProperty || isAction || isFieldGrp) {
|
|
222
262
|
return;
|
|
223
|
-
} //
|
|
263
|
+
} // ValueHelp properties
|
|
224
264
|
|
|
225
265
|
|
|
266
|
+
bValueHelpEnabled = hasValueHelp(oPropertyInfo);
|
|
267
|
+
sUnitPropertyPath = (hasCurrency(oPropertyInfo) || hasUnit(oPropertyInfo)) && getAssociatedUnitPropertyPath(oPropertyInfo) || "";
|
|
268
|
+
var unitPropertyInfo = sUnitPropertyPath && getAssociatedUnitProperty(oPropertyInfo);
|
|
269
|
+
bValueHelpEnabledForUnit = unitPropertyInfo && hasValueHelp(unitPropertyInfo); // EditMode and InputType
|
|
270
|
+
|
|
226
271
|
var propertyForFieldControl = oPropertyInfo && oPropertyInfo.Value ? oPropertyInfo.Value : oPropertyInfo;
|
|
227
|
-
var expBinding = getEditMode(propertyForFieldControl, oDataModelPath, false, false, oDataFieldConverted, true);
|
|
272
|
+
var expBinding = getEditMode(propertyForFieldControl, oDataModelPath, false, false, oDataFieldConverted, constant(true));
|
|
228
273
|
var editModeValues = Object.keys(EditMode);
|
|
229
274
|
var editModeIsStatic = !!expBinding && editModeValues.includes(expBinding);
|
|
230
275
|
var editable = !!expBinding && (editModeIsStatic && expBinding === EditMode.Editable || !editModeIsStatic);
|
|
@@ -237,23 +282,27 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
237
282
|
|
|
238
283
|
if (inputType) {
|
|
239
284
|
var isReadOnly = isReadOnlyExpression(oPropertyInfo);
|
|
285
|
+
var displayMode = CommonUtils.computeDisplayMode(oPropertyContext.getObject());
|
|
240
286
|
oResult = {
|
|
241
|
-
"label": sLabelText
|
|
287
|
+
"label": sLabelText,
|
|
242
288
|
"dataProperty": sDataPropertyPath,
|
|
243
289
|
"isValueHelpEnabled": bValueHelpEnabled ? bValueHelpEnabled : false,
|
|
244
|
-
"unitProperty": sUnitPropertyPath ? sUnitPropertyPath : false,
|
|
245
|
-
"isValueHelpEnabledForUnit": bValueHelpEnabledForUnit ? bValueHelpEnabledForUnit : false,
|
|
246
|
-
"propertyPathForValueHelp": sCurrentEntitySetName
|
|
247
|
-
"propertyPathForValueHelpUnit":
|
|
290
|
+
"unitProperty": sUnitPropertyPath && !sDataPropertyPath.includes("/") ? sUnitPropertyPath : false,
|
|
291
|
+
"isValueHelpEnabledForUnit": bValueHelpEnabledForUnit && !sUnitPropertyPath.includes("/") ? bValueHelpEnabledForUnit : false,
|
|
292
|
+
"propertyPathForValueHelp": "".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath),
|
|
293
|
+
"propertyPathForValueHelpUnit": sUnitPropertyPath && "".concat(sCurrentEntitySetName, "/").concat(sUnitPropertyPath),
|
|
248
294
|
"isFieldRequired": getRequiredExpression(oPropertyInfo, oDataFieldConverted, true),
|
|
249
295
|
"defaultSelectionPath": sDataPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath) : false,
|
|
250
296
|
"defaultSelectionUnitPath": sUnitPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sUnitPropertyPath) : false,
|
|
251
297
|
"entitySet": sCurrentEntitySetName,
|
|
252
|
-
"
|
|
298
|
+
"display": displayMode,
|
|
299
|
+
"descriptionPath": MassEditHelper.getTextPath(sDataPropertyPath, oTextBinding, displayMode),
|
|
253
300
|
"nullable": oPropertyInfo.nullable !== undefined ? oPropertyInfo.nullable : true,
|
|
254
301
|
"isPropertyReadOnly": isReadOnly !== undefined ? isReadOnly : false,
|
|
255
302
|
"inputType": inputType,
|
|
256
|
-
"editMode": editable ? expBinding : undefined
|
|
303
|
+
"editMode": editable ? expBinding : undefined,
|
|
304
|
+
"unitDataPath": sUnitPropertyPath && "fieldsInfo>/unitData/",
|
|
305
|
+
"valuesPath": "fieldsInfo>/values/"
|
|
257
306
|
};
|
|
258
307
|
aDataArray.push(oResult);
|
|
259
308
|
}
|
|
@@ -286,121 +335,169 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
286
335
|
"clearFieldValue": "< Clear Values >",
|
|
287
336
|
"massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
|
|
288
337
|
"applyButtonText": bDisplayMode ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT") : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
|
|
289
|
-
"
|
|
338
|
+
"useValueHelpValue": "< Use Value Help >",
|
|
339
|
+
"cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT"),
|
|
340
|
+
"noFields": oResourceBundle.getText("C_MASS_EDIT_NO_EDITABLE_FIELDS"),
|
|
341
|
+
"okButtonText": oResourceBundle.getText("C_COMMON_DIALOG_OK")
|
|
290
342
|
};
|
|
291
343
|
},
|
|
292
344
|
|
|
293
345
|
/**
|
|
294
346
|
* Adds a suffix to the 'keep existing' property of the comboBox.
|
|
295
347
|
*
|
|
296
|
-
* @param
|
|
297
|
-
* @returns
|
|
348
|
+
* @param sInputType InputType of the field
|
|
349
|
+
* @returns The modified string
|
|
298
350
|
*/
|
|
299
|
-
getSuffixForKeepExisiting: function (sInputType) {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
},
|
|
351
|
+
// getSuffixForKeepExisiting: function (sInputType: string) {
|
|
352
|
+
// let sResult = "Values";
|
|
353
|
+
// switch (sInputType) {
|
|
354
|
+
// //TODO - Add for other control types as well (Radio Button, Email, Input, MDC Fields, Image etc.)
|
|
355
|
+
// case "DatePicker":
|
|
356
|
+
// sResult = "Dates";
|
|
357
|
+
// break;
|
|
358
|
+
// case "CheckBox":
|
|
359
|
+
// sResult = "Settings";
|
|
360
|
+
// break;
|
|
361
|
+
// default:
|
|
362
|
+
// sResult = "Values";
|
|
363
|
+
// }
|
|
364
|
+
// return sResult;
|
|
365
|
+
// },
|
|
315
366
|
|
|
316
367
|
/**
|
|
317
368
|
* Adds default values to the model [Keep Existing Values, Leave Blank].
|
|
318
369
|
*
|
|
319
|
-
* @param
|
|
320
|
-
* @param
|
|
321
|
-
* @param
|
|
322
|
-
* @param
|
|
323
|
-
* @param {boolean} bUOMField
|
|
370
|
+
* @param aValues Array instance where the default data needs to be added
|
|
371
|
+
* @param oDefaultValues Default values from Application Manifest
|
|
372
|
+
* @param oPropertyInfo Property information
|
|
373
|
+
* @param bUOMField
|
|
324
374
|
*/
|
|
325
|
-
setDefaultValuesToDialog: function (aValues,
|
|
375
|
+
setDefaultValuesToDialog: function (aValues, oDefaultValues, oPropertyInfo, bUOMField) {
|
|
326
376
|
var sPropertyPath = bUOMField ? oPropertyInfo.unitProperty : oPropertyInfo.dataProperty,
|
|
327
377
|
sInputType = oPropertyInfo.inputType,
|
|
328
|
-
bPropertyRequired = oPropertyInfo.isFieldRequired;
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
var
|
|
333
|
-
|
|
334
|
-
|
|
378
|
+
bPropertyRequired = oPropertyInfo.isFieldRequired; // const sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType);
|
|
379
|
+
|
|
380
|
+
var sSuffixForKeepExisting = "Values";
|
|
381
|
+
aValues.defaultOptions = aValues.defaultOptions || [];
|
|
382
|
+
var selectOptionsExist = aValues.selectOptions && aValues.selectOptions.length > 0;
|
|
383
|
+
var keepEntry = {
|
|
384
|
+
text: "".concat(oDefaultValues.keepExistingPrefix, " ").concat(sSuffixForKeepExisting, " >"),
|
|
385
|
+
key: "Default/".concat(sPropertyPath)
|
|
386
|
+
};
|
|
335
387
|
|
|
336
|
-
if (
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
388
|
+
if (sInputType === "CheckBox") {
|
|
389
|
+
var falseEntry = {
|
|
390
|
+
text: "No",
|
|
391
|
+
key: "".concat(sPropertyPath, "/false"),
|
|
392
|
+
textInfo: {
|
|
393
|
+
value: false
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
var truthyEntry = {
|
|
397
|
+
text: "Yes",
|
|
398
|
+
key: "".concat(sPropertyPath, "/true"),
|
|
399
|
+
textInfo: {
|
|
400
|
+
value: true
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
aValues.unshift(falseEntry);
|
|
404
|
+
aValues.defaultOptions.unshift(falseEntry);
|
|
405
|
+
aValues.unshift(truthyEntry);
|
|
406
|
+
aValues.defaultOptions.unshift(truthyEntry);
|
|
407
|
+
aValues.unshift(keepEntry);
|
|
408
|
+
aValues.defaultOptions.unshift(keepEntry);
|
|
343
409
|
} else {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
410
|
+
if (oPropertyInfo.isValueHelpEnabled || oPropertyInfo.isValueHelpEnabledForUnit && bUOMField) {
|
|
411
|
+
var vhdEntry = {
|
|
412
|
+
text: oDefaultValues.useValueHelpValue,
|
|
413
|
+
key: "UseValueHelpValue/".concat(sPropertyPath)
|
|
414
|
+
};
|
|
415
|
+
aValues.unshift(vhdEntry);
|
|
416
|
+
aValues.defaultOptions.unshift(vhdEntry);
|
|
417
|
+
}
|
|
349
418
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
var sDescriptionPath, sValue, sDescriptionValue, sFullText;
|
|
359
|
-
|
|
360
|
-
if (oTextBinding && (oTextBinding.path || oTextBinding.parameters && oTextBinding.parameters.length) && sProperty) {
|
|
361
|
-
if (oTextBinding.path) {
|
|
362
|
-
if (sDisplayMode === "Description") {
|
|
363
|
-
sValue = oSelectedContext.getObject(sProperty);
|
|
364
|
-
sDescriptionValue = oSelectedContext.getObject(oTextBinding.path);
|
|
365
|
-
sFullText = sDescriptionValue;
|
|
366
|
-
} else if (sDisplayMode === "Value") {
|
|
367
|
-
sValue = oSelectedContext.getObject(sProperty);
|
|
368
|
-
sFullText = sValue;
|
|
419
|
+
if (selectOptionsExist) {
|
|
420
|
+
if (bPropertyRequired !== "true" && !bUOMField) {
|
|
421
|
+
var clearEntry = {
|
|
422
|
+
text: oDefaultValues.clearFieldValue,
|
|
423
|
+
key: "ClearFieldValue/".concat(sPropertyPath)
|
|
424
|
+
};
|
|
425
|
+
aValues.unshift(clearEntry);
|
|
426
|
+
aValues.defaultOptions.unshift(clearEntry);
|
|
369
427
|
}
|
|
370
|
-
} else if (oTextBinding.parameters) {
|
|
371
|
-
oTextBinding.parameters.forEach(function (oProps) {
|
|
372
|
-
if (oProps.path && oProps.path !== sProperty) {
|
|
373
|
-
sDescriptionPath = oProps.path;
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
sValue = oSelectedContext.getObject(sProperty);
|
|
377
|
-
sDescriptionValue = oSelectedContext.getObject(sDescriptionPath);
|
|
378
428
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
429
|
+
aValues.unshift(keepEntry);
|
|
430
|
+
aValues.defaultOptions.unshift(keepEntry);
|
|
431
|
+
} else {
|
|
432
|
+
var emptyEntry = {
|
|
433
|
+
text: oDefaultValues.leaveBlankValue,
|
|
434
|
+
key: "Default/".concat(sPropertyPath)
|
|
435
|
+
};
|
|
436
|
+
aValues.unshift(emptyEntry);
|
|
437
|
+
aValues.defaultOptions.unshift(emptyEntry);
|
|
384
438
|
}
|
|
439
|
+
}
|
|
440
|
+
},
|
|
385
441
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
442
|
+
/**
|
|
443
|
+
* Get text arrangement info for a context property.
|
|
444
|
+
*
|
|
445
|
+
* @param property Property Path
|
|
446
|
+
* @param descriptionPath Path to text association of the property
|
|
447
|
+
* @param displayMode Display mode of the property and text association
|
|
448
|
+
* @param selectedContext Context to find the full text
|
|
449
|
+
* @returns The text arrangement
|
|
450
|
+
*/
|
|
451
|
+
getTextArrangementInfo: function (property, descriptionPath, displayMode, selectedContext) {
|
|
452
|
+
var value = selectedContext.getObject(property),
|
|
453
|
+
descriptionValue,
|
|
454
|
+
fullText;
|
|
455
|
+
|
|
456
|
+
if (descriptionPath && property) {
|
|
457
|
+
switch (displayMode) {
|
|
458
|
+
case "Description":
|
|
459
|
+
descriptionValue = selectedContext.getObject(descriptionPath) || "";
|
|
460
|
+
fullText = descriptionValue;
|
|
461
|
+
break;
|
|
462
|
+
|
|
463
|
+
case "Value":
|
|
464
|
+
value = selectedContext.getObject(property) || "";
|
|
465
|
+
fullText = value;
|
|
466
|
+
break;
|
|
467
|
+
|
|
468
|
+
case "ValueDescription":
|
|
469
|
+
value = selectedContext.getObject(property) || "";
|
|
470
|
+
descriptionValue = selectedContext.getObject(descriptionPath) || "";
|
|
471
|
+
fullText = descriptionValue ? "".concat(value, " (").concat(descriptionValue, ")") : value;
|
|
472
|
+
break;
|
|
473
|
+
|
|
474
|
+
case "DescriptionValue":
|
|
475
|
+
value = selectedContext.getObject(property) || "";
|
|
476
|
+
descriptionValue = selectedContext.getObject(descriptionPath) || "";
|
|
477
|
+
fullText = descriptionValue ? "".concat(descriptionValue, " (").concat(value, ")") : value;
|
|
478
|
+
break;
|
|
479
|
+
|
|
480
|
+
default:
|
|
481
|
+
Log.info("Display Property not applicable: ".concat(property));
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
394
484
|
}
|
|
395
485
|
|
|
396
|
-
return
|
|
486
|
+
return {
|
|
487
|
+
"textArrangement": displayMode,
|
|
488
|
+
"valuePath": property,
|
|
489
|
+
"descriptionPath": descriptionPath,
|
|
490
|
+
"value": value,
|
|
491
|
+
"description": descriptionValue,
|
|
492
|
+
"fullText": fullText
|
|
493
|
+
};
|
|
397
494
|
},
|
|
398
495
|
|
|
399
496
|
/**
|
|
400
497
|
* Return the visibility valuue for the ManagedObject Any.
|
|
401
498
|
*
|
|
402
|
-
* @param
|
|
403
|
-
* @returns
|
|
499
|
+
* @param any The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
500
|
+
* @returns Returns true if the mass edit field is editable.
|
|
404
501
|
*/
|
|
405
502
|
isEditable: function (any) {
|
|
406
503
|
var binding = any.getBinding("any");
|
|
@@ -411,25 +508,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
411
508
|
/**
|
|
412
509
|
* Calculate and update the visibility of mass edit field on change of the ManagedObject Any binding.
|
|
413
510
|
*
|
|
414
|
-
* @param
|
|
415
|
-
* @param
|
|
511
|
+
* @param oDialogDataModel Model to be used runtime.
|
|
512
|
+
* @param dataProperty Field name.
|
|
416
513
|
*/
|
|
417
514
|
onContextEditableChange: function (oDialogDataModel, dataProperty) {
|
|
418
|
-
var objectsForVisibility = oDialogDataModel.getProperty("/values/"
|
|
515
|
+
var objectsForVisibility = oDialogDataModel.getProperty("/values/".concat(dataProperty, "/objectsForVisibility")) || [];
|
|
419
516
|
var editable = objectsForVisibility.some(MassEditHelper.isEditable);
|
|
420
517
|
|
|
421
518
|
if (editable) {
|
|
422
|
-
oDialogDataModel.setProperty("/values/"
|
|
519
|
+
oDialogDataModel.setProperty("/values/".concat(dataProperty, "/visible"), editable);
|
|
423
520
|
}
|
|
424
521
|
},
|
|
425
522
|
|
|
426
523
|
/**
|
|
427
524
|
* Update Managed Object Any for visibility of the mass edit fields.
|
|
428
525
|
*
|
|
429
|
-
* @param
|
|
430
|
-
* @param
|
|
431
|
-
* @param
|
|
432
|
-
* @param
|
|
526
|
+
* @param mOToUse The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
527
|
+
* @param oDialogDataModel Model to be used runtime.
|
|
528
|
+
* @param dataProperty Field name.
|
|
529
|
+
* @param values Values of the field.
|
|
433
530
|
*/
|
|
434
531
|
updateOnContextChange: function (mOToUse, oDialogDataModel, dataProperty, values) {
|
|
435
532
|
var binding = mOToUse.getBinding("any");
|
|
@@ -441,9 +538,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
441
538
|
/**
|
|
442
539
|
* Get bound object to calculate the visibility of contexts.
|
|
443
540
|
*
|
|
444
|
-
* @param
|
|
445
|
-
* @param
|
|
446
|
-
* @returns
|
|
541
|
+
* @param expBinding Binding String object.
|
|
542
|
+
* @param context Context the binding value.
|
|
543
|
+
* @returns The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
447
544
|
*/
|
|
448
545
|
getBoundObject: function (expBinding, context) {
|
|
449
546
|
var mOToUse = new Any({
|
|
@@ -458,12 +555,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
458
555
|
/**
|
|
459
556
|
* Get the visibility of the field.
|
|
460
557
|
*
|
|
461
|
-
* @param
|
|
462
|
-
* @param
|
|
463
|
-
* @param
|
|
464
|
-
* @param
|
|
465
|
-
* @param
|
|
466
|
-
* @returns
|
|
558
|
+
* @param expBinding Binding String object.
|
|
559
|
+
* @param oDialogDataModel Model to be used runtime.
|
|
560
|
+
* @param dataProperty Field name.
|
|
561
|
+
* @param values Values of the field.
|
|
562
|
+
* @param context Context the binding value.
|
|
563
|
+
* @returns Returns true if the mass edit field is editable.
|
|
467
564
|
*/
|
|
468
565
|
getFieldVisiblity: function (expBinding, oDialogDataModel, dataProperty, values, context) {
|
|
469
566
|
var mOToUse = MassEditHelper.getBoundObject(expBinding, context);
|
|
@@ -481,165 +578,273 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
481
578
|
* => The model consists of values shown in the comboBox of the dialog (Leave Blank, Keep Existing Values, or any property value for the selected context, etc.)
|
|
482
579
|
* => The model will capture runtime changes in the results property (the value entered in the comboBox).
|
|
483
580
|
*
|
|
484
|
-
* @param
|
|
485
|
-
* @param
|
|
486
|
-
* @param
|
|
487
|
-
* @
|
|
581
|
+
* @param aContexts Contexts for mass edit
|
|
582
|
+
* @param aDataArray Array containing data related to the dialog used by both the static and the runtime model
|
|
583
|
+
* @param oDefaultValues Default values from i18n
|
|
584
|
+
* @param dialogContext Transient context for mass edit dialog.
|
|
585
|
+
* @returns The runtime model
|
|
488
586
|
*/
|
|
489
|
-
setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues) {
|
|
587
|
+
setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues, dialogContext) {
|
|
490
588
|
var aValues = [];
|
|
491
589
|
var aUnitData = [];
|
|
492
590
|
var aResults = [];
|
|
493
591
|
var aReadOnlyFieldInfo = [];
|
|
494
|
-
var oDistinctValueMap = {};
|
|
495
592
|
var oData = {
|
|
496
593
|
"values": aValues,
|
|
497
594
|
"unitData": aUnitData,
|
|
498
595
|
"results": aResults,
|
|
499
|
-
"readablePropertyData": aReadOnlyFieldInfo
|
|
596
|
+
"readablePropertyData": aReadOnlyFieldInfo,
|
|
597
|
+
"selectedKey": undefined,
|
|
598
|
+
"noFields": oDefaultValues.noFields
|
|
500
599
|
};
|
|
501
600
|
var oDialogDataModel = new JSONModel(oData);
|
|
502
|
-
|
|
503
|
-
aDataArray.forEach(function (oData) {
|
|
601
|
+
aDataArray.forEach(function (oInData) {
|
|
504
602
|
var oTextInfo;
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
603
|
+
var sPropertyKey;
|
|
604
|
+
var sUnitPropertyName;
|
|
605
|
+
var oDistinctValueMap = {};
|
|
606
|
+
var oDistinctUnitMap = {};
|
|
607
|
+
|
|
608
|
+
if (oInData.dataProperty && oInData.dataProperty.indexOf("/") > -1) {
|
|
609
|
+
var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oInData.dataProperty, aValues
|
|
610
|
+
/*, dialogContext */
|
|
611
|
+
);
|
|
612
|
+
var aPropertyPaths = oInData.dataProperty.split("/");
|
|
613
|
+
|
|
614
|
+
var _iterator = _createForOfIteratorHelper(aContexts),
|
|
615
|
+
_step;
|
|
616
|
+
|
|
617
|
+
try {
|
|
618
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
619
|
+
var context = _step.value;
|
|
620
|
+
var sMultiLevelPathValue = context.getObject(oInData.dataProperty);
|
|
621
|
+
sPropertyKey = "".concat(oInData.dataProperty, "/").concat(sMultiLevelPathValue);
|
|
622
|
+
|
|
623
|
+
if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
|
|
624
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.dataProperty, oInData.descriptionPath, oInData.display, context);
|
|
625
|
+
aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
|
|
626
|
+
"text": oTextInfo && oTextInfo.fullText || sMultiLevelPathValue,
|
|
627
|
+
"key": sPropertyKey,
|
|
628
|
+
"textInfo": oTextInfo
|
|
629
|
+
});
|
|
630
|
+
oDistinctValueMap[sPropertyKey] = sMultiLevelPathValue;
|
|
631
|
+
}
|
|
632
|
+
} // if (Object.keys(oDistinctValueMap).length === 1) {
|
|
633
|
+
// dialogContext.setProperty(oData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
|
|
634
|
+
// }
|
|
635
|
+
|
|
636
|
+
} catch (err) {
|
|
637
|
+
_iterator.e(err);
|
|
638
|
+
} finally {
|
|
639
|
+
_iterator.f();
|
|
524
640
|
}
|
|
641
|
+
|
|
642
|
+
aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].textInfo = {
|
|
643
|
+
descriptionPath: oInData.descriptionPath,
|
|
644
|
+
valuePath: oInData.dataProperty,
|
|
645
|
+
displayMode: oInData.display
|
|
646
|
+
};
|
|
525
647
|
} else {
|
|
526
|
-
aValues[
|
|
648
|
+
aValues[oInData.dataProperty] = aValues[oInData.dataProperty] || [];
|
|
649
|
+
aValues[oInData.dataProperty]["selectOptions"] = aValues[oInData.dataProperty]["selectOptions"] || [];
|
|
527
650
|
|
|
528
|
-
if (
|
|
529
|
-
aUnitData[
|
|
651
|
+
if (oInData.unitProperty) {
|
|
652
|
+
aUnitData[oInData.unitProperty] = aUnitData[oInData.unitProperty] || [];
|
|
653
|
+
aUnitData[oInData.unitProperty]["selectOptions"] = aUnitData[oInData.unitProperty]["selectOptions"] || [];
|
|
530
654
|
}
|
|
531
655
|
|
|
532
|
-
|
|
533
|
-
|
|
656
|
+
var _iterator2 = _createForOfIteratorHelper(aContexts),
|
|
657
|
+
_step2;
|
|
534
658
|
|
|
535
|
-
|
|
659
|
+
try {
|
|
660
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
661
|
+
var _context = _step2.value;
|
|
536
662
|
|
|
537
|
-
|
|
538
|
-
oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.textBinding, oData.entitySet, aContexts[_i]);
|
|
539
|
-
aValues[oData.dataProperty].push({
|
|
540
|
-
"text": oTextInfo && oTextInfo.fullText || oDataObject[oData.dataProperty],
|
|
541
|
-
"key": oData.dataProperty,
|
|
542
|
-
"textInfo": oTextInfo
|
|
543
|
-
});
|
|
544
|
-
oDistinctValueMap[sPropertyName] = oDataObject[oData.dataProperty];
|
|
545
|
-
}
|
|
663
|
+
var oDataObject = _context.getObject();
|
|
546
664
|
|
|
547
|
-
|
|
548
|
-
sPropertyName = oData.unitProperty + "/" + oDataObject[oData.unitProperty];
|
|
665
|
+
sPropertyKey = "".concat(oInData.dataProperty, "/").concat(oDataObject[oInData.dataProperty]);
|
|
549
666
|
|
|
550
|
-
if (!oDistinctValueMap[
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
667
|
+
if (oInData.dataProperty && oDataObject[oInData.dataProperty] && !oDistinctValueMap[sPropertyKey]) {
|
|
668
|
+
if (oInData.inputType != "CheckBox") {
|
|
669
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.dataProperty, oInData.descriptionPath, oInData.display, _context);
|
|
670
|
+
var entry = {
|
|
671
|
+
"text": oTextInfo && oTextInfo.fullText || oDataObject[oInData.dataProperty],
|
|
672
|
+
"key": sPropertyKey,
|
|
673
|
+
"textInfo": oTextInfo
|
|
674
|
+
};
|
|
675
|
+
aValues[oInData.dataProperty].push(entry);
|
|
676
|
+
aValues[oInData.dataProperty]["selectOptions"].push(entry);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
oDistinctValueMap[sPropertyKey] = oDataObject[oInData.dataProperty];
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
if (oInData.unitProperty && oDataObject[oInData.unitProperty]) {
|
|
683
|
+
sUnitPropertyName = "".concat(oInData.unitProperty, "/").concat(oDataObject[oInData.unitProperty]);
|
|
684
|
+
|
|
685
|
+
if (!oDistinctUnitMap[sUnitPropertyName]) {
|
|
686
|
+
if (oInData.inputType != "CheckBox") {
|
|
687
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.unitProperty, oInData.descriptionPath, oInData.display, _context);
|
|
688
|
+
var unitEntry = {
|
|
689
|
+
"text": oTextInfo && oTextInfo.fullText || oDataObject[oInData.unitProperty],
|
|
690
|
+
"key": sUnitPropertyName,
|
|
691
|
+
"textInfo": oTextInfo
|
|
692
|
+
};
|
|
693
|
+
aUnitData[oInData.unitProperty].push(unitEntry);
|
|
694
|
+
aUnitData[oInData.unitProperty]["selectOptions"].push(unitEntry);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
oDistinctUnitMap[sUnitPropertyName] = oDataObject[oInData.unitProperty];
|
|
698
|
+
}
|
|
558
699
|
}
|
|
559
700
|
}
|
|
701
|
+
} catch (err) {
|
|
702
|
+
_iterator2.e(err);
|
|
703
|
+
} finally {
|
|
704
|
+
_iterator2.f();
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
aValues[oInData.dataProperty].textInfo = {
|
|
708
|
+
descriptionPath: oInData.descriptionPath,
|
|
709
|
+
valuePath: oInData.dataProperty,
|
|
710
|
+
displayMode: oInData.display
|
|
711
|
+
};
|
|
712
|
+
|
|
713
|
+
if (Object.keys(oDistinctValueMap).length === 1) {
|
|
714
|
+
dialogContext.setProperty(oInData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
if (Object.keys(oDistinctUnitMap).length === 1) {
|
|
718
|
+
dialogContext.setProperty(oInData.unitProperty, sUnitPropertyName && oDistinctUnitMap[sUnitPropertyName]);
|
|
560
719
|
}
|
|
561
720
|
}
|
|
562
721
|
});
|
|
563
|
-
aDataArray.forEach(function (
|
|
564
|
-
var values;
|
|
722
|
+
aDataArray.forEach(function (oInData) {
|
|
723
|
+
var values = {};
|
|
565
724
|
|
|
566
|
-
if (
|
|
567
|
-
var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(
|
|
725
|
+
if (oInData.dataProperty.indexOf("/") > -1) {
|
|
726
|
+
var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oInData.dataProperty, aValues);
|
|
568
727
|
|
|
569
728
|
if (!sMultiLevelPropPathValue) {
|
|
570
729
|
sMultiLevelPropPathValue.push({
|
|
571
730
|
text: oDefaultValues.leaveBlankValue,
|
|
572
|
-
key: "Empty/"
|
|
731
|
+
key: "Empty/".concat(oInData.dataProperty)
|
|
573
732
|
});
|
|
574
733
|
} else {
|
|
575
|
-
MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue,
|
|
734
|
+
MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, oDefaultValues, oInData);
|
|
576
735
|
}
|
|
577
736
|
|
|
578
737
|
values = sMultiLevelPropPathValue;
|
|
579
|
-
} else if (aValues[
|
|
580
|
-
|
|
581
|
-
|
|
738
|
+
} else if (aValues[oInData.dataProperty]) {
|
|
739
|
+
aValues[oInData.dataProperty] = aValues[oInData.dataProperty] || [];
|
|
740
|
+
MassEditHelper.setDefaultValuesToDialog(aValues[oInData.dataProperty], oDefaultValues, oInData);
|
|
741
|
+
values = aValues[oInData.dataProperty];
|
|
582
742
|
}
|
|
583
743
|
|
|
584
|
-
if (aUnitData[
|
|
585
|
-
MassEditHelper.setDefaultValuesToDialog(aUnitData[
|
|
586
|
-
|
|
587
|
-
|
|
744
|
+
if (aUnitData[oInData.unitProperty] && aUnitData[oInData.unitProperty].length) {
|
|
745
|
+
MassEditHelper.setDefaultValuesToDialog(aUnitData[oInData.unitProperty], oDefaultValues, oInData, true);
|
|
746
|
+
aUnitData[oInData.unitProperty].textInfo = {};
|
|
747
|
+
aUnitData[oInData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.unitProperty);
|
|
748
|
+
aUnitData[oInData.unitProperty].inputType = oInData.inputType;
|
|
749
|
+
} else if (oInData.dataProperty && aValues[oInData.dataProperty] && !aValues[oInData.dataProperty].length || oInData.unitProperty && aUnitData[oInData.unitProperty] && !aUnitData[oInData.unitProperty].length) {
|
|
750
|
+
var bClearFieldOrBlankValueExists = aValues[oInData.dataProperty] && aValues[oInData.dataProperty].some(function (obj) {
|
|
588
751
|
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
589
752
|
});
|
|
590
753
|
|
|
591
|
-
if (
|
|
592
|
-
aValues[
|
|
754
|
+
if (oInData.dataProperty && !bClearFieldOrBlankValueExists) {
|
|
755
|
+
aValues[oInData.dataProperty].push({
|
|
593
756
|
text: oDefaultValues.leaveBlankValue,
|
|
594
|
-
key: "Empty/"
|
|
757
|
+
key: "Empty/".concat(oInData.dataProperty)
|
|
595
758
|
});
|
|
596
759
|
}
|
|
597
760
|
|
|
598
|
-
var bClearFieldOrBlankUnitValueExists = aUnitData[
|
|
761
|
+
var bClearFieldOrBlankUnitValueExists = aUnitData[oInData.unitProperty] && aUnitData[oInData.unitProperty].some(function (obj) {
|
|
599
762
|
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
600
763
|
});
|
|
601
764
|
|
|
602
|
-
if (
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
765
|
+
if (oInData.unitProperty) {
|
|
766
|
+
if (!bClearFieldOrBlankUnitValueExists) {
|
|
767
|
+
aUnitData[oInData.unitProperty].push({
|
|
768
|
+
text: oDefaultValues.leaveBlankValue,
|
|
769
|
+
key: "Empty/".concat(oInData.unitProperty)
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
aUnitData[oInData.unitProperty].textInfo = {};
|
|
774
|
+
aUnitData[oInData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.unitProperty);
|
|
775
|
+
aUnitData[oInData.unitProperty].inputType = oInData.inputType;
|
|
607
776
|
}
|
|
608
777
|
}
|
|
609
778
|
|
|
610
|
-
if (
|
|
779
|
+
if (oInData.isPropertyReadOnly && typeof oInData.isPropertyReadOnly === "boolean") {
|
|
611
780
|
aReadOnlyFieldInfo.push({
|
|
612
|
-
"property":
|
|
613
|
-
value:
|
|
781
|
+
"property": oInData.dataProperty,
|
|
782
|
+
value: oInData.isPropertyReadOnly,
|
|
614
783
|
type: "Default"
|
|
615
784
|
});
|
|
616
|
-
} else if (
|
|
785
|
+
} else if (oInData.isPropertyReadOnly && oInData.isPropertyReadOnly.operands && oInData.isPropertyReadOnly.operands[0] && oInData.isPropertyReadOnly.operands[0].operand1 && oInData.isPropertyReadOnly.operands[0].operand2) {
|
|
617
786
|
// This needs to be refactored in accordance with the ReadOnlyExpression change
|
|
618
787
|
aReadOnlyFieldInfo.push({
|
|
619
|
-
"property":
|
|
620
|
-
propertyPath:
|
|
621
|
-
propertyValue:
|
|
788
|
+
"property": oInData.dataProperty,
|
|
789
|
+
propertyPath: oInData.isPropertyReadOnly.operands[0].operand1.path,
|
|
790
|
+
propertyValue: oInData.isPropertyReadOnly.operands[0].operand2.value,
|
|
622
791
|
type: "Path"
|
|
623
792
|
});
|
|
624
793
|
} // Setting visbility of the mass edit field.
|
|
625
794
|
|
|
626
795
|
|
|
627
|
-
if (
|
|
628
|
-
values.visible =
|
|
796
|
+
if (oInData.editMode) {
|
|
797
|
+
values.visible = oInData.editMode === EditMode.Editable || aContexts.some(MassEditHelper.getFieldVisiblity.bind(MassEditHelper, oInData.editMode, oDialogDataModel, oInData.dataProperty, values));
|
|
629
798
|
} else {
|
|
630
799
|
values.visible = true;
|
|
631
800
|
}
|
|
801
|
+
|
|
802
|
+
values.selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.dataProperty);
|
|
803
|
+
values.inputType = oInData.inputType;
|
|
804
|
+
values.unitProperty = oInData.unitProperty;
|
|
632
805
|
});
|
|
633
806
|
return oDialogDataModel;
|
|
634
807
|
},
|
|
635
808
|
|
|
809
|
+
/**
|
|
810
|
+
* Gets transient context for dialog.
|
|
811
|
+
*
|
|
812
|
+
* @param table Instance of Table.
|
|
813
|
+
* @param dialog Mass Edit Dialog.
|
|
814
|
+
* @returns Promise returning instance of dialog.
|
|
815
|
+
*/
|
|
816
|
+
getDialogContext: function (table, dialog) {
|
|
817
|
+
var transCtx = dialog && dialog.getBindingContext();
|
|
818
|
+
|
|
819
|
+
if (!transCtx) {
|
|
820
|
+
var model = table.getModel();
|
|
821
|
+
var listBinding = table.getRowBinding();
|
|
822
|
+
var transientListBinding = model.bindList(listBinding.getPath(), listBinding.getContext(), [], [], {
|
|
823
|
+
$$updateGroupId: "submitLater"
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
transientListBinding.refreshInternal = function () {
|
|
827
|
+
/* */
|
|
828
|
+
};
|
|
829
|
+
|
|
830
|
+
transCtx = transientListBinding.create({}, true);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
return transCtx;
|
|
834
|
+
},
|
|
835
|
+
onDialogOpen: function (event) {
|
|
836
|
+
var source = event.getSource();
|
|
837
|
+
var fieldsInfoModel = source.getModel("fieldsInfo");
|
|
838
|
+
fieldsInfoModel.setProperty("/isOpen", true);
|
|
839
|
+
},
|
|
840
|
+
|
|
636
841
|
/**
|
|
637
842
|
* Create the mass edit dialog.
|
|
638
843
|
*
|
|
639
|
-
* @param
|
|
640
|
-
* @param
|
|
641
|
-
* @param
|
|
642
|
-
* @returns
|
|
844
|
+
* @param oTable Instance of Table
|
|
845
|
+
* @param aContexts Contexts for mass edit
|
|
846
|
+
* @param oController Controller for the view
|
|
847
|
+
* @returns Promise returning instance of dialog.
|
|
643
848
|
*/
|
|
644
849
|
createDialog: function (oTable, aContexts, oController) {
|
|
645
850
|
var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
|
|
@@ -647,7 +852,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
647
852
|
oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
|
|
648
853
|
oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
|
|
649
854
|
oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
|
|
650
|
-
|
|
855
|
+
dialogContext = MassEditHelper.getDialogContext(oTable),
|
|
856
|
+
oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues, dialogContext);
|
|
651
857
|
return new Promise(function (resolve, reject) {
|
|
652
858
|
var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
|
|
653
859
|
return Promise.resolve(XMLPreprocessor.process(oFragment, {
|
|
@@ -659,26 +865,33 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
659
865
|
models: {
|
|
660
866
|
dataFieldModel: oDataFieldModel
|
|
661
867
|
}
|
|
662
|
-
})).then(function (
|
|
868
|
+
})).then(function (oCreatedFragment) {
|
|
663
869
|
return Fragment.load({
|
|
664
|
-
definition:
|
|
870
|
+
definition: oCreatedFragment
|
|
665
871
|
}).then(function (oDialogContent) {
|
|
872
|
+
var DraftStatus = FELibrary.DraftStatus;
|
|
666
873
|
var oDialog = new Dialog({
|
|
874
|
+
resizable: true,
|
|
667
875
|
title: oDefaultValues.massEditTitle,
|
|
668
876
|
content: [oDialogContent],
|
|
877
|
+
afterOpen: MassEditHelper.onDialogOpen,
|
|
669
878
|
beginButton: new Button({
|
|
670
|
-
text: oDefaultValues.
|
|
879
|
+
text: MassEditHelper.helpers.getExpBindingForApplyButtonTxt(oDefaultValues, oDataFieldModel.getObject("/")),
|
|
671
880
|
type: "Emphasized",
|
|
672
881
|
press: function (oEvent) {
|
|
673
|
-
var
|
|
674
|
-
|
|
882
|
+
var _oController$getView, _oController$getView$;
|
|
883
|
+
|
|
884
|
+
(_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);
|
|
885
|
+
var oInDialog = oEvent.getSource().getParent();
|
|
886
|
+
var oModel = oInDialog.getModel("fieldsInfo");
|
|
675
887
|
var aResults = oModel.getProperty("/results");
|
|
676
888
|
var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
|
|
677
889
|
var changePromise = [];
|
|
678
890
|
var bReadOnlyField = false;
|
|
679
|
-
var groupId;
|
|
680
|
-
|
|
681
|
-
|
|
891
|
+
var groupId; //let index = 0;
|
|
892
|
+
|
|
893
|
+
var errorValues = [];
|
|
894
|
+
aContexts.forEach(function (oSelectedContext, idx) {
|
|
682
895
|
aResults.forEach(function (oResult) {
|
|
683
896
|
//TODO - Add save implementation for Value Help.
|
|
684
897
|
if (aPropertyReadableInfo) {
|
|
@@ -693,46 +906,101 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/templatin
|
|
|
693
906
|
});
|
|
694
907
|
}
|
|
695
908
|
|
|
696
|
-
groupId = "$auto."
|
|
697
|
-
|
|
909
|
+
groupId = "$auto.".concat(idx); //index += 1;
|
|
910
|
+
|
|
911
|
+
oController._editFlow.setDraftStatus(DraftStatus.Saving); //let promiseCount = 0;
|
|
912
|
+
|
|
698
913
|
|
|
699
914
|
if (oResult.keyValue && oResult.value !== "Default" && !bReadOnlyField) {
|
|
700
|
-
changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value, groupId))
|
|
915
|
+
changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value, groupId).then(function () {
|
|
916
|
+
return oSelectedContext;
|
|
917
|
+
}).catch(function (oError) {
|
|
918
|
+
errorValues.push(oSelectedContext.getObject());
|
|
919
|
+
Log.error("Mass Edit: Something went wrong in updating entries.", oError);
|
|
920
|
+
}));
|
|
701
921
|
}
|
|
702
922
|
});
|
|
703
|
-
});
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
923
|
+
}); // eslint-disable-next-line promise/catch-or-return
|
|
924
|
+
|
|
925
|
+
Promise.allSettled(changePromise).then(function () {
|
|
926
|
+
var oListBinding = oTable.getRowBinding();
|
|
927
|
+
var oExtensionAPI = oController && oController.getExtensionAPI();
|
|
707
928
|
return oExtensionAPI.refresh(oListBinding.getPath()).then(function () {
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
929
|
+
var subtitleColumn = CommonUtils.getMessageColumn(oTable);
|
|
930
|
+
var messages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
|
|
931
|
+
var boundTransitionErrorContexts = [];
|
|
932
|
+
messages.forEach(function (message) {
|
|
933
|
+
var messageTargets = message.getTargets();
|
|
934
|
+
|
|
935
|
+
if (messageTargets && messageTargets.length === 1 && messageTargets[0].length && message.persistent === true) {
|
|
936
|
+
var boundTransitionErrorContext = aContexts.find(function (oContext) {
|
|
937
|
+
return message.getTarget().indexOf(oContext.getPath()) !== -1;
|
|
938
|
+
});
|
|
939
|
+
boundTransitionErrorContexts.push(boundTransitionErrorContext);
|
|
940
|
+
message.additionalText = boundTransitionErrorContext ? boundTransitionErrorContext.getObject()[subtitleColumn] : undefined;
|
|
941
|
+
}
|
|
942
|
+
});
|
|
943
|
+
|
|
944
|
+
if (aResults.length > 0 && boundTransitionErrorContexts.length === 0 && errorValues.length === 0) {
|
|
945
|
+
oController._editFlow.setDraftStatus(DraftStatus.Saved);
|
|
946
|
+
|
|
947
|
+
var successToast = oResourceBundle.getText("C_MASS_EDIT_SUCCESS_TOAST");
|
|
948
|
+
MessageToast.show(successToast);
|
|
949
|
+
} else if (errorValues.length + boundTransitionErrorContexts.length < oTable.getSelectedContexts().length) {
|
|
950
|
+
oController._editFlow.setDraftStatus(DraftStatus.Saved);
|
|
951
|
+
} else if (errorValues.length + boundTransitionErrorContexts.length === oTable.getSelectedContexts().length) {
|
|
952
|
+
oController._editFlow.setDraftStatus(DraftStatus.Clear);
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
oController._editFlow.getMessageHandler().showMessages();
|
|
956
|
+
|
|
957
|
+
if (oInDialog.isOpen()) {
|
|
958
|
+
var _oController$getView2, _oController$getView3;
|
|
959
|
+
|
|
960
|
+
oInDialog.close();
|
|
961
|
+
oInDialog.destroy();
|
|
962
|
+
(_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);
|
|
963
|
+
}
|
|
711
964
|
});
|
|
712
|
-
}).catch(function (oError) {
|
|
713
|
-
//TODO - Add error handling part for the Dialog
|
|
714
|
-
oDialog.close();
|
|
715
|
-
oDialog.destroy();
|
|
716
|
-
Log.error("Mass Edit: Something went wrong in updating entries.", oError);
|
|
717
965
|
});
|
|
718
966
|
}
|
|
719
967
|
}),
|
|
720
968
|
endButton: new Button({
|
|
721
969
|
text: oDefaultValues.cancelButtonText,
|
|
970
|
+
visible: MassEditHelper.helpers.hasEditableFieldsBinding(oDataFieldModel.getObject("/"), true),
|
|
722
971
|
press: function (oEvent) {
|
|
723
|
-
var
|
|
724
|
-
|
|
725
|
-
|
|
972
|
+
var oInDialog = oEvent.getSource().getParent();
|
|
973
|
+
oInDialog.close();
|
|
974
|
+
oInDialog.destroy();
|
|
726
975
|
}
|
|
727
976
|
})
|
|
728
977
|
});
|
|
978
|
+
var model = oTable.getModel();
|
|
729
979
|
oDialog.setModel(oDialogDataModel, "fieldsInfo");
|
|
980
|
+
oDialog.setModel(model);
|
|
981
|
+
oDialog.setBindingContext(dialogContext);
|
|
730
982
|
resolve(oDialog);
|
|
731
983
|
});
|
|
732
984
|
}).catch(reject);
|
|
733
985
|
});
|
|
986
|
+
},
|
|
987
|
+
helpers: {
|
|
988
|
+
getBindingExpForHasEditableFields: function (fields, editable) {
|
|
989
|
+
var totalExp = fields.reduce(function (expression, field) {
|
|
990
|
+
return or(expression, pathInModel("/values/" + field.dataProperty + "/visible", "fieldsInfo"));
|
|
991
|
+
}, constant(false));
|
|
992
|
+
return editable ? totalExp : not(totalExp);
|
|
993
|
+
},
|
|
994
|
+
getExpBindingForApplyButtonTxt: function (defaultValues, fields) {
|
|
995
|
+
var editableExp = MassEditHelper.helpers.getBindingExpForHasEditableFields(fields, true);
|
|
996
|
+
var totalExp = ifElse(editableExp, constant(defaultValues.applyButtonText), constant(defaultValues.okButtonText));
|
|
997
|
+
return compileExpression(totalExp);
|
|
998
|
+
},
|
|
999
|
+
hasEditableFieldsBinding: function (fields, editable) {
|
|
1000
|
+
return compileExpression(MassEditHelper.helpers.getBindingExpForHasEditableFields(fields, editable));
|
|
1001
|
+
}
|
|
734
1002
|
}
|
|
735
1003
|
};
|
|
736
1004
|
return MassEditHelper;
|
|
737
1005
|
}, false);
|
|
738
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwiZ2V0SW5wdXRUeXBlIiwicHJvcGVydHlJbmZvIiwiZGF0YUZpZWxkQ29udmVydGVkIiwib0RhdGFNb2RlbFBhdGgiLCJlZGl0U3R5bGVQcm9wZXJ0aWVzIiwiaW5wdXRUeXBlIiwic2V0RWRpdFN0eWxlUHJvcGVydGllcyIsImVkaXRTdHlsZSIsImlzVmFsaWRGb3JNYXNzRWRpdCIsImlzQ29sbGVjdGlvbkZpZWxkIiwiaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIiwiZ2V0SXNGaWVsZEdycCIsIiRUeXBlIiwiVGFyZ2V0IiwidmFsdWUiLCJwcmVwYXJlRGF0YUZvckRpYWxvZyIsIm9UYWJsZSIsImFEYXRhQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzQ3VycmVudEVudGl0eVNldE5hbWUiLCJkYXRhIiwiYVRhYmxlRmllbGRzIiwiZ2V0VGFibGVGaWVsZHMiLCJvRW50aXR5VHlwZUNvbnRleHQiLCJnZXRDb250ZXh0Iiwib0VudGl0eVNldENvbnRleHQiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm9EYXRhRmllbGRNb2RlbCIsIkpTT05Nb2RlbCIsIm9SZXN1bHQiLCJzTGFiZWxUZXh0IiwiYlZhbHVlSGVscEVuYWJsZWQiLCJzVW5pdFByb3BlcnR5UGF0aCIsImJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsIm9UZXh0QmluZGluZyIsIm9Db2x1bW5JbmZvIiwiZGF0YVByb3BlcnR5Iiwib1Byb3BlcnR5SW5mbyIsImxhYmVsIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwiZ2V0VGV4dEJpbmRpbmciLCJvRmllbGRDb250ZXh0IiwiYW5ub3RhdGlvblBhdGgiLCJvRGF0YUZpZWxkQ29udmVydGVkIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJvUHJvcGVydHlDb250ZXh0Iiwib0ludGVyZmFjZSIsImdldEludGVyZmFjZSIsIlZhbHVlIiwicGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiYkhpZGRlbkZpZWxkIiwiaXNJbWFnZSIsImNvbnRleHQiLCJnZXRQYXRoIiwiJHRhcmdldCIsImNoYXJ0UHJvcGVydHkiLCJ0ZXJtIiwiaXNBY3Rpb24iLCJBY3Rpb24iLCJpc0ZpZWxkR3JwIiwicHJvcGVydHlGb3JGaWVsZENvbnRyb2wiLCJleHBCaW5kaW5nIiwiZ2V0RWRpdE1vZGUiLCJlZGl0TW9kZVZhbHVlcyIsIk9iamVjdCIsImtleXMiLCJFZGl0TW9kZSIsImVkaXRNb2RlSXNTdGF0aWMiLCJpbmNsdWRlcyIsImVkaXRhYmxlIiwiRWRpdGFibGUiLCJpc1JlYWRPbmx5IiwiaXNSZWFkT25seUV4cHJlc3Npb24iLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInVuZGVmaW5lZCIsInNldERhdGEiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJjb2x1bW5zRGF0YSIsImdldFBhcmVudCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJtYXAiLCJvQ29sdW1uIiwic0RhdGFQcm9wZXJ0eSIsImdldERhdGFQcm9wZXJ0eSIsImFSZWFsdGVkQ29sdW1uSW5mbyIsInR5cGUiLCJnZXRIZWFkZXIiLCJnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2ciLCJvUmVzb3VyY2VCdW5kbGUiLCJpU2VsZWN0ZWRDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImdldFRleHQiLCJ0b1N0cmluZyIsImdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmciLCJzSW5wdXRUeXBlIiwic1Jlc3VsdCIsInNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyIsIm9EZWZhdWx0VmFsdWVzIiwiYlVPTUZpZWxkIiwidW5pdFByb3BlcnR5IiwiYlByb3BlcnR5UmVxdWlyZWQiLCJpc0ZpZWxkUmVxdWlyZWQiLCJzU3VmZml4Rm9yS2VlcEV4aXN0aW5nIiwiYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoIiwidW5zaGlmdCIsInRleHQiLCJjbGVhckZpZWxkVmFsdWUiLCJrZXkiLCJsZWF2ZUJsYW5rVmFsdWUiLCJrZWVwRXhpc3RpbmdQcmVmaXgiLCJnZXRUZXh0QXJyYW5nZW1lbnRJbmZvIiwic1Byb3BlcnR5Iiwic0N1cnJlbnRFbnRpdHlTZXQiLCJzRGlzcGxheU1vZGUiLCJDb21tb25VdGlscyIsImNvbXB1dGVEaXNwbGF5TW9kZSIsInNEZXNjcmlwdGlvblBhdGgiLCJzRGVzY3JpcHRpb25WYWx1ZSIsInNGdWxsVGV4dCIsInBhcmFtZXRlcnMiLCJvUHJvcHMiLCJpc0VkaXRhYmxlIiwiYW55IiwiYmluZGluZyIsImdldEJpbmRpbmciLCJnZXRFeHRlcm5hbFZhbHVlIiwib25Db250ZXh0RWRpdGFibGVDaGFuZ2UiLCJvRGlhbG9nRGF0YU1vZGVsIiwib2JqZWN0c0ZvclZpc2liaWxpdHkiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwidXBkYXRlT25Db250ZXh0Q2hhbmdlIiwibU9Ub1VzZSIsInZhbHVlcyIsImF0dGFjaENoYW5nZSIsImJpbmQiLCJnZXRCb3VuZE9iamVjdCIsIkFueSIsIm1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEZpZWxkVmlzaWJsaXR5IiwiaXNDb250ZXh0RWRpdGFibGUiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImFVbml0RGF0YSIsImFSZXN1bHRzIiwiYVJlYWRPbmx5RmllbGRJbmZvIiwib0Rpc3RpbmN0VmFsdWVNYXAiLCJvRGF0YSIsInNQcm9wZXJ0eU5hbWUiLCJvVGV4dEluZm8iLCJzUHJvcGVydHlLZXkiLCJpIiwic011bHRpTGV2ZWxQYXRoVmFsdWUiLCJ0ZXh0QmluZGluZyIsImVudGl0eVNldCIsImZ1bGxUZXh0Iiwic011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlIiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJvcGVyYW5kcyIsIm9wZXJhbmQxIiwib3BlcmFuZDIiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiZWRpdE1vZGUiLCJ2aXNpYmxlIiwiY3JlYXRlRGlhbG9nIiwib0NvbnRyb2xsZXIiLCJzRnJhZ21lbnROYW1lIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib0ZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwiYmluZGluZ0NvbnRleHRzIiwiZGF0YUZpZWxkTW9kZWwiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm1vZGVscyIsInRoZW4iLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwib0RpYWxvZ0NvbnRlbnQiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJtYXNzRWRpdFRpdGxlIiwiY29udGVudCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwiYXBwbHlCdXR0b25UZXh0IiwicHJlc3MiLCJvRXZlbnQiLCJnZXRTb3VyY2UiLCJvTW9kZWwiLCJhUHJvcGVydHlSZWFkYWJsZUluZm8iLCJjaGFuZ2VQcm9taXNlIiwiYlJlYWRPbmx5RmllbGQiLCJncm91cElkIiwia2V5VmFsdWUiLCJwcm9wZXJ0eSIsImFsbCIsIm9SZXMiLCJvTGlzdEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwib0V4dGVuc2lvbkFQSSIsImdldEV4dGVuc2lvbkFQSSIsInJlZnJlc2giLCJjbG9zZSIsImRlc3Ryb3kiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZW5kQnV0dG9uIiwiY2FuY2VsQnV0dG9uVGV4dCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLE1BQU1BLGNBQWMsR0FBRztBQUN0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLDJCQUEyQixFQUFFLFVBQVVDLEtBQVYsRUFBeUJDLE9BQXpCLEVBQXVDO0FBQ25FLFVBQUlDLFVBQUo7QUFDQSxVQUFJQyxLQUFLLEdBQUcsQ0FBWjtBQUNBLFVBQU1DLE1BQU0sR0FBR0osS0FBSyxDQUFDSyxLQUFOLENBQVksR0FBWixDQUFmO0FBQ0EsVUFBSUMsU0FBUyxHQUFHLEVBQWhCO0FBQ0FGLE1BQUFBLE1BQU0sQ0FBQ0csT0FBUCxDQUFlLFVBQVVDLGFBQVYsRUFBaUM7QUFDL0MsWUFBSSxDQUFDUCxPQUFPLENBQUNPLGFBQUQsQ0FBUixJQUEyQkwsS0FBSyxLQUFLLENBQXpDLEVBQTRDO0FBQzNDRixVQUFBQSxPQUFPLENBQUNPLGFBQUQsQ0FBUCxHQUF5QixFQUF6QjtBQUNBTixVQUFBQSxVQUFVLEdBQUdELE9BQU8sQ0FBQ08sYUFBRCxDQUFwQjtBQUNBRixVQUFBQSxTQUFTLEdBQUdBLFNBQVMsR0FBR0UsYUFBeEI7QUFDQUwsVUFBQUEsS0FBSztBQUNMLFNBTEQsTUFLTyxJQUFJLENBQUNELFVBQVUsQ0FBQ00sYUFBRCxDQUFmLEVBQWdDO0FBQ3RDRixVQUFBQSxTQUFTLEdBQUdBLFNBQVMsR0FBRyxHQUFaLEdBQWtCRSxhQUE5Qjs7QUFDQSxjQUFJRixTQUFTLEtBQUtOLEtBQWxCLEVBQXlCO0FBQ3hCRSxZQUFBQSxVQUFVLENBQUNNLGFBQUQsQ0FBVixHQUE0QixFQUE1QjtBQUNBTixZQUFBQSxVQUFVLEdBQUdBLFVBQVUsQ0FBQ00sYUFBRCxDQUF2QjtBQUNBLFdBSEQsTUFHTztBQUNOTixZQUFBQSxVQUFVLENBQUNNLGFBQUQsQ0FBVixHQUE0QixFQUE1QjtBQUNBO0FBQ0Q7QUFDRCxPQWZEO0FBZ0JBLGFBQU9OLFVBQVA7QUFDQSxLQS9CcUI7O0FBaUN0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NPLElBQUFBLGVBQWUsRUFBRSxVQUFVQyxNQUFWLEVBQTBCUCxLQUExQixFQUF5Q1EsSUFBekMsRUFBc0Q7QUFDdEUsVUFBSUQsTUFBSixFQUFZO0FBQ1gsZUFBT0MsSUFBSSxDQUFDQyxPQUFMLENBQWFGLE1BQWIsTUFBeUJQLEtBQWhDO0FBQ0E7QUFDRCxLQTdDcUI7O0FBK0N0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NVLElBQUFBLHlCQUF5QixFQUFFLFVBQVVDLGlCQUFWLEVBQXFDQyxPQUFyQyxFQUFtRDtBQUM3RSxVQUFJRCxpQkFBaUIsSUFBSUEsaUJBQWlCLENBQUNGLE9BQWxCLENBQTBCLEdBQTFCLElBQWlDLENBQTFELEVBQTZEO0FBQzVELFlBQU1JLGNBQWMsR0FBR0YsaUJBQWlCLENBQUNULEtBQWxCLENBQXdCLEdBQXhCLENBQXZCO0FBQ0EsWUFBSVksTUFBSjtBQUNBRCxRQUFBQSxjQUFjLENBQUNULE9BQWYsQ0FBdUIsVUFBVVAsS0FBVixFQUF5QjtBQUMvQ2lCLFVBQUFBLE1BQU0sR0FBR0YsT0FBTyxJQUFJQSxPQUFPLENBQUNmLEtBQUQsQ0FBbEIsR0FBNEJlLE9BQU8sQ0FBQ2YsS0FBRCxDQUFuQyxHQUE2Q2lCLE1BQU0sSUFBSUEsTUFBTSxDQUFDakIsS0FBRCxDQUF0RTtBQUNBLFNBRkQ7QUFHQSxlQUFPaUIsTUFBUDtBQUNBO0FBQ0QsS0FoRXFCOztBQWtFdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSwrQkFBK0IsRUFBRSxVQUFVQyxTQUFWLEVBQTRCTCxpQkFBNUIsRUFBdUQ7QUFDdkYsVUFBSUEsaUJBQWlCLElBQUlLLFNBQVMsQ0FBQ0MsTUFBVixHQUFtQixDQUE1QyxFQUErQztBQUM5QyxZQUFNQyxnQkFBZ0IsR0FBR0YsU0FBekI7QUFBQSxZQUNDRyxlQUFzQixHQUFHLEVBRDFCO0FBRUFELFFBQUFBLGdCQUFnQixDQUFDZCxPQUFqQixDQUF5QixVQUFVZ0IsUUFBVixFQUF5QjtBQUNqRCxjQUFNQyxXQUFXLEdBQUdELFFBQVEsQ0FBQ0UsU0FBVCxFQUFwQjtBQUNBLGNBQU1DLHdCQUF3QixHQUM3QlosaUJBQWlCLENBQUNGLE9BQWxCLENBQTBCLEdBQTFCLElBQWlDLENBQUMsQ0FBbEMsSUFBdUNZLFdBQVcsQ0FBQ0csY0FBWixDQUEyQmIsaUJBQWlCLENBQUNULEtBQWxCLENBQXdCLEdBQXhCLEVBQTZCLENBQTdCLENBQTNCLENBRHhDOztBQUVBLGNBQUlrQixRQUFRLEtBQUtDLFdBQVcsQ0FBQ0csY0FBWixDQUEyQmIsaUJBQTNCLEtBQWlEWSx3QkFBdEQsQ0FBWixFQUE2RjtBQUM1RkosWUFBQUEsZUFBZSxDQUFDTSxJQUFoQixDQUFxQkwsUUFBUSxDQUFDRSxTQUFULENBQW1CWCxpQkFBbkIsQ0FBckI7QUFDQTtBQUNELFNBUEQ7QUFRQSxZQUFNZSxxQkFBcUIsR0FBR1AsZUFBZSxDQUFDUSxNQUFoQixDQUF1QmhDLGNBQWMsQ0FBQ1csZUFBdEMsQ0FBOUI7O0FBQ0EsWUFBSW9CLHFCQUFxQixDQUFDVCxNQUF0QixHQUErQixDQUFuQyxFQUFzQztBQUNyQyxpQkFBTyxhQUFhTixpQkFBcEI7QUFDQSxTQUZELE1BRU8sSUFBSWUscUJBQXFCLENBQUNULE1BQXRCLEtBQWlDLENBQXJDLEVBQXdDO0FBQzlDLGlCQUFPLFdBQVdOLGlCQUFsQjtBQUNBLFNBRk0sTUFFQSxJQUFJZSxxQkFBcUIsQ0FBQ1QsTUFBdEIsS0FBaUMsQ0FBckMsRUFBd0M7QUFDOUMsaUJBQU9OLGlCQUFQO0FBQ0E7QUFDRDtBQUNELEtBbEdxQjs7QUFvR3RCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NpQixJQUFBQSx5QkFBeUIsRUFBRSxVQUFVQyxXQUFWLEVBQTRCYixTQUE1QixFQUE4QztBQUN4RSxVQUFJYSxXQUFXLElBQUlBLFdBQVcsQ0FBQ0MsS0FBL0IsRUFBc0M7QUFDckMsZUFBTyxDQUFDZCxTQUFTLENBQUNlLElBQVYsQ0FBZSxVQUFVYixnQkFBVixFQUFpQztBQUN2RCxpQkFBT0EsZ0JBQWdCLENBQUNJLFNBQWpCLENBQTJCTyxXQUFXLENBQUNDLEtBQXZDLE1BQWtELEtBQXpEO0FBQ0EsU0FGTyxDQUFSO0FBR0E7O0FBQ0QsYUFBT0QsV0FBUDtBQUNBLEtBbEhxQjtBQW9IdEJHLElBQUFBLFlBQVksRUFBRSxVQUFVQyxZQUFWLEVBQTZCQyxrQkFBN0IsRUFBc0RDLGNBQXRELEVBQW1HO0FBQ2hILFVBQU1DLG1CQUFtQixHQUFHLEVBQTVCO0FBQ0EsVUFBSUMsU0FBSjs7QUFDQSxVQUFJSixZQUFKLEVBQWtCO0FBQ2pCSyxRQUFBQSxzQkFBc0IsQ0FBQ0YsbUJBQUQsRUFBc0JGLGtCQUF0QixFQUEwQ0MsY0FBMUMsRUFBMEQsSUFBMUQsQ0FBdEI7QUFDQUUsUUFBQUEsU0FBUyxHQUFHLENBQUFELG1CQUFtQixTQUFuQixJQUFBQSxtQkFBbUIsV0FBbkIsWUFBQUEsbUJBQW1CLENBQUVHLFNBQXJCLEtBQWtDLEVBQTlDO0FBQ0E7O0FBQ0QsVUFBTUMsa0JBQWtCLEdBQ3ZCSCxTQUFTLElBQ1QsQ0FBQyxZQUFELEVBQWUsWUFBZixFQUE2QixnQkFBN0IsRUFBK0MsaUJBQS9DLEVBQWtFNUIsT0FBbEUsQ0FBMEU0QixTQUExRSxNQUF5RixDQUFDLENBRDFGLElBRUEsQ0FBQ0ksaUJBQWlCLENBQUNOLGNBQUQsQ0FGbEIsSUFHQSxDQUFDTywyQkFBMkIsQ0FBQ1QsWUFBRCxDQUo3QjtBQU1BLGFBQU8sQ0FBQ08sa0JBQWtCLElBQUksRUFBdkIsS0FBOEJILFNBQXJDO0FBQ0EsS0FsSXFCO0FBb0l0Qk0sSUFBQUEsYUFBYSxFQUFFLFVBQVVULGtCQUFWLEVBQTRDO0FBQzFELGFBQ0NBLGtCQUFrQixJQUNsQkEsa0JBQWtCLENBQUNVLEtBQW5CLEtBQTZCLG1EQUQ3QixJQUVBVixrQkFBa0IsQ0FBQ1csTUFGbkIsSUFHQVgsa0JBQWtCLENBQUNXLE1BQW5CLENBQTBCQyxLQUgxQixJQUlBWixrQkFBa0IsQ0FBQ1csTUFBbkIsQ0FBMEJDLEtBQTFCLENBQWdDckMsT0FBaEMsQ0FBd0MsWUFBeEMsSUFBd0QsQ0FBQyxDQUwxRDtBQU9BLEtBNUlxQjs7QUE4SXRCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ3NDLElBQUFBLG9CQUFvQixFQUFFLFVBQVVDLE1BQVYsRUFBeUJoQyxTQUF6QixFQUEyQ2lDLFVBQTNDLEVBQThEO0FBQ25GLFVBQU1DLFVBQVUsR0FBR0YsTUFBTSxJQUFLQSxNQUFNLENBQUNHLFFBQVAsR0FBa0JDLFlBQWxCLEVBQTlCO0FBQUEsVUFDQ0MscUJBQXFCLEdBQUdMLE1BQU0sQ0FBQ00sSUFBUCxDQUFZLFVBQVosQ0FEekI7QUFBQSxVQUVDQyxZQUFZLEdBQUc1RCxjQUFjLENBQUM2RCxjQUFmLENBQThCUixNQUE5QixDQUZoQjtBQUFBLFVBR0NTLGtCQUFrQixHQUFHUCxVQUFVLENBQUNRLFVBQVgsQ0FBc0JMLHFCQUFxQixHQUFHLElBQTlDLENBSHRCO0FBQUEsVUFJQ00saUJBQWlCLEdBQUdULFVBQVUsQ0FBQ1EsVUFBWCxDQUFzQkwscUJBQXRCLENBSnJCO0FBQUEsVUFLQ08sb0JBQW9CLEdBQUdDLDJCQUEyQixDQUFDSixrQkFBRCxDQUxuRDtBQU9BLFVBQU1LLGVBQWUsR0FBRyxJQUFJQyxTQUFKLEVBQXhCO0FBQ0EsVUFBSUMsT0FBSjtBQUNBLFVBQUlDLFVBQUo7QUFDQSxVQUFJQyxpQkFBSjtBQUNBLFVBQUlDLGlCQUFKO0FBQ0EsVUFBSUMsd0JBQUo7QUFDQSxVQUFJQyxZQUFKO0FBRUFkLE1BQUFBLFlBQVksQ0FBQ25ELE9BQWIsQ0FBcUIsVUFBVWtFLFdBQVYsRUFBNEI7QUFDaEQsWUFBTTNELGlCQUFpQixHQUFHMkQsV0FBVyxDQUFDQyxZQUF0Qzs7QUFDQSxZQUFJNUQsaUJBQUosRUFBdUI7QUFBQTs7QUFDdEIsY0FBSTZELGFBQWEsR0FBRzdELGlCQUFpQixJQUFJdUMsVUFBVSxDQUFDNUIsU0FBWCxDQUFxQitCLHFCQUFxQixHQUFHLEdBQXhCLEdBQThCMUMsaUJBQTlCLEdBQWtELEdBQXZFLENBQXpDO0FBQ0F1RCxVQUFBQSxpQkFBaUIsR0FDaEJ2RCxpQkFBaUIsSUFDakJ1QyxVQUFVLENBQUM1QixTQUFYLENBQXFCK0IscUJBQXFCLEdBQUcsR0FBeEIsR0FBOEIxQyxpQkFBOUIsR0FBa0QsR0FBdkUsQ0FEQSxJQUVBdUMsVUFBVSxDQUFDNUIsU0FBWCxDQUFxQitCLHFCQUFxQixHQUFHLEdBQXhCLEdBQThCMUMsaUJBQTlCLEdBQWtELEdBQXZFLEVBQ0MsMkNBREQsQ0FIRDtBQU1Bd0QsVUFBQUEsaUJBQWlCLEdBQ2ZLLGFBQWEsSUFBSUEsYUFBYSxDQUFDLDZCQUFELENBQTlCLElBQWlFQSxhQUFhLENBQUMsNkJBQUQsQ0FBYixDQUE2QzFDLEtBQS9HLElBQ0MwQyxhQUFhLElBQ2JBLGFBQWEsQ0FBQyxvQ0FBRCxDQURiLElBRUFBLGFBQWEsQ0FBQyxvQ0FBRCxDQUFiLENBQW9EMUMsS0FKdEQ7QUFLQW1DLFVBQUFBLFVBQVUsR0FBR0ssV0FBVyxDQUFDRyxLQUFaLElBQXNCRCxhQUFhLElBQUlBLGFBQWEsQ0FBQyx1Q0FBRCxDQUFqRTtBQUNBSixVQUFBQSx3QkFBd0IsR0FDdkJELGlCQUFpQixJQUNqQmpCLFVBQVUsQ0FBQzVCLFNBQVgsQ0FBcUIrQixxQkFBcUIsR0FBRyxHQUF4QixHQUE4QmMsaUJBQTlCLEdBQWtELEdBQXZFLENBREEsSUFFQWpCLFVBQVUsQ0FBQzVCLFNBQVgsQ0FBcUIrQixxQkFBcUIsR0FBRyxHQUF4QixHQUE4QmMsaUJBQTlCLEdBQWtELEdBQXZFLEVBQ0MsMkNBREQsQ0FIRDs7QUFNQSxjQUFJUCxvQkFBSixFQUEwQjtBQUN6QkEsWUFBQUEsb0JBQW9CLENBQUNjLFlBQXJCLEdBQW9DZCxvQkFBb0IsQ0FBQ2UsZ0JBQXJCLENBQXNDQyxnQkFBdEMsQ0FBdURqRCxNQUF2RCxDQUE4RCxVQUNqR2tELFNBRGlHLEVBRWhHO0FBQ0QscUJBQU9BLFNBQVMsQ0FBQ0MsSUFBVixLQUFtQm5FLGlCQUExQjtBQUNBLGFBSm1DLENBQXBDO0FBS0E7O0FBQ0RpRCxVQUFBQSxvQkFBb0IsQ0FBQ2MsWUFBckIsR0FBb0NkLG9CQUFvQixDQUFDYyxZQUFyQixDQUFrQyxDQUFsQyxLQUF3QyxFQUE1RTtBQUNBTCxVQUFBQSxZQUFZLEdBQUdVLGNBQWMsQ0FBQ25CLG9CQUFELEVBQXVCLEVBQXZCLEVBQTJCLElBQTNCLENBQWQsSUFBa0QsRUFBakU7QUFDQSxjQUFNb0IsYUFBYSxHQUFHOUIsVUFBVSxDQUFDUSxVQUFYLENBQXNCWSxXQUFXLENBQUNXLGNBQWxDLENBQXRCO0FBQUEsY0FDQ0MsbUJBQW1CLEdBQUdDLHVCQUF1QixDQUFDSCxhQUFELENBRDlDO0FBQUEsY0FFQ0ksZ0JBQWdCLEdBQUdsQyxVQUFVLENBQUNRLFVBQVgsQ0FBc0JMLHFCQUFxQixHQUFHLEdBQXhCLEdBQThCMUMsaUJBQTlCLEdBQWtELEdBQXhFLENBRnBCO0FBQUEsY0FHQzBFLFVBQVUsR0FBR0QsZ0JBQWdCLElBQUlBLGdCQUFnQixDQUFDRSxZQUFqQixFQUhsQztBQUtBLGNBQUluRCxjQUFjLEdBQUcwQiwyQkFBMkIsQ0FBQ21CLGFBQUQsRUFBZ0JyQixpQkFBaEIsQ0FBaEQ7O0FBQ0EsY0FBSSxDQUFBdUIsbUJBQW1CLFNBQW5CLElBQUFBLG1CQUFtQixXQUFuQixxQ0FBQUEsbUJBQW1CLENBQUVLLEtBQXJCLDBHQUE0QkMsSUFBNUIsa0ZBQWtDdkUsTUFBbEMsSUFBMkMsQ0FBL0MsRUFBa0Q7QUFDakRrQixZQUFBQSxjQUFjLEdBQUdzRCxvQkFBb0IsQ0FBQ3RELGNBQUQsRUFBaUJ4QixpQkFBakIsQ0FBckM7QUFDQTs7QUFDRCxjQUFNK0UsWUFBWSxHQUNqQi9GLGNBQWMsQ0FBQ2lDLHlCQUFmLENBQ0NvRCxhQUFhLElBQUlBLGFBQWEsQ0FBQzFELFNBQWQsR0FBMEIsb0NBQTFCLENBRGxCLEVBRUNOLFNBRkQsS0FHSyxLQUpOO0FBS0EsY0FBTTJFLE9BQU8sR0FBR25CLGFBQWEsSUFBSUEsYUFBYSxDQUFDLHdDQUFELENBQTlDO0FBRUFhLFVBQUFBLFVBQVUsQ0FBQ08sT0FBWCxHQUFxQjtBQUNwQnpDLFlBQUFBLFFBQVEsRUFBRSxZQUFZO0FBQ3JCLHFCQUFPa0MsVUFBVSxDQUFDbEMsUUFBWCxFQUFQO0FBQ0EsYUFIbUI7QUFJcEIwQyxZQUFBQSxPQUFPLEVBQUUsWUFBWTtBQUNwQixxQkFBT3hDLHFCQUFxQixHQUFHLEdBQXhCLEdBQThCMUMsaUJBQXJDO0FBQ0E7QUFObUIsV0FBckI7QUFRQTZELFVBQUFBLGFBQWEsR0FDWFUsbUJBQW1CLElBQUlBLG1CQUFtQixDQUFDSyxLQUEzQyxJQUFvREwsbUJBQW1CLENBQUNLLEtBQXBCLENBQTBCTyxPQUEvRSxJQUNDWixtQkFBbUIsSUFBSUEsbUJBQW1CLENBQUNyQyxNQUEzQyxJQUFxRHFDLG1CQUFtQixDQUFDckMsTUFBcEIsQ0FBMkJpRCxPQUZsRixDQXJEc0IsQ0F3RHRCOztBQUVBLGNBQU1DLGFBQWEsR0FBR3ZCLGFBQWEsSUFBSUEsYUFBYSxDQUFDd0IsSUFBL0IsSUFBdUN4QixhQUFhLENBQUN3QixJQUFkLEtBQXVCLGtDQUFwRjtBQUNBLGNBQU1DLFFBQVEsR0FBRyxDQUFDLENBQUNmLG1CQUFtQixDQUFDZ0IsTUFBdkM7QUFDQSxjQUFNQyxVQUFVLEdBQUd4RyxjQUFjLENBQUNnRCxhQUFmLENBQTZCdUMsbUJBQTdCLENBQW5COztBQUVBLGNBQUlTLE9BQU8sSUFBSUQsWUFBWCxJQUEyQkssYUFBM0IsSUFBNENFLFFBQTVDLElBQXdERSxVQUE1RCxFQUF3RTtBQUN2RTtBQUNBLFdBaEVxQixDQWtFdEI7OztBQUNBLGNBQU1DLHVCQUF1QixHQUFHNUIsYUFBYSxJQUFJQSxhQUFhLENBQUNlLEtBQS9CLEdBQXVDZixhQUFhLENBQUNlLEtBQXJELEdBQTZEZixhQUE3RjtBQUNBLGNBQU02QixVQUFVLEdBQUdDLFdBQVcsQ0FBQ0YsdUJBQUQsRUFBMEJqRSxjQUExQixFQUEwQyxLQUExQyxFQUFpRCxLQUFqRCxFQUF3RCtDLG1CQUF4RCxFQUE2RSxJQUE3RSxDQUE5QjtBQUNBLGNBQU1xQixjQUFjLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZQyxRQUFaLENBQXZCO0FBQ0EsY0FBTUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDTixVQUFGLElBQWdCRSxjQUFjLENBQUNLLFFBQWYsQ0FBd0JQLFVBQXhCLENBQXpDO0FBQ0EsY0FBTVEsUUFBUSxHQUFHLENBQUMsQ0FBQ1IsVUFBRixLQUFrQk0sZ0JBQWdCLElBQUlOLFVBQVUsS0FBS0ssUUFBUSxDQUFDSSxRQUE3QyxJQUEwRCxDQUFDSCxnQkFBNUUsQ0FBakI7O0FBRUEsY0FBSSxDQUFDRSxRQUFMLEVBQWU7QUFDZDtBQUNBOztBQUVELGNBQU14RSxTQUFTLEdBQUcxQyxjQUFjLENBQUNxQyxZQUFmLENBQTRCd0MsYUFBNUIsRUFBMkNVLG1CQUEzQyxFQUFnRS9DLGNBQWhFLENBQWxCOztBQUVBLGNBQUlFLFNBQUosRUFBZTtBQUNkLGdCQUFNMEUsVUFBVSxHQUFHQyxvQkFBb0IsQ0FBQ3hDLGFBQUQsQ0FBdkM7QUFFQVIsWUFBQUEsT0FBTyxHQUFHO0FBQ1QsdUJBQVNDLFVBQVUsR0FBRyxHQURiO0FBRVQsOEJBQWdCdEQsaUJBRlA7QUFHVCxvQ0FBc0J1RCxpQkFBaUIsR0FBR0EsaUJBQUgsR0FBdUIsS0FIckQ7QUFJVCw4QkFBZ0JDLGlCQUFpQixHQUFHQSxpQkFBSCxHQUF1QixLQUovQztBQUtULDJDQUE2QkMsd0JBQXdCLEdBQUdBLHdCQUFILEdBQThCLEtBTDFFO0FBTVQsMENBQTRCZixxQkFBcUIsR0FBRyxHQUF4QixHQUE4QjFDLGlCQU5qRDtBQU9ULDhDQUFnQzBDLHFCQUFxQixHQUFHLEdBQXhCLEdBQThCYyxpQkFQckQ7QUFRVCxpQ0FBbUI4QyxxQkFBcUIsQ0FBQ3pDLGFBQUQsRUFBZ0JVLG1CQUFoQixFQUFxQyxJQUFyQyxDQVIvQjtBQVNULHNDQUF3QnZFLGlCQUFpQixHQUN0Q2hCLGNBQWMsQ0FBQ29CLCtCQUFmLENBQStDQyxTQUEvQyxFQUEwREwsaUJBQTFELENBRHNDLEdBRXRDLEtBWE07QUFZVCwwQ0FBNEJ3RCxpQkFBaUIsR0FDMUN4RSxjQUFjLENBQUNvQiwrQkFBZixDQUErQ0MsU0FBL0MsRUFBMERtRCxpQkFBMUQsQ0FEMEMsR0FFMUMsS0FkTTtBQWVULDJCQUFhZCxxQkFmSjtBQWdCVCw2QkFBZWdCLFlBaEJOO0FBaUJULDBCQUFZRyxhQUFhLENBQUMwQyxRQUFkLEtBQTJCQyxTQUEzQixHQUF1QzNDLGFBQWEsQ0FBQzBDLFFBQXJELEdBQWdFLElBakJuRTtBQWtCVCxvQ0FBc0JILFVBQVUsS0FBS0ksU0FBZixHQUEyQkosVUFBM0IsR0FBd0MsS0FsQnJEO0FBbUJULDJCQUFhMUUsU0FuQko7QUFvQlQsMEJBQVl3RSxRQUFRLEdBQUdSLFVBQUgsR0FBZ0JjO0FBcEIzQixhQUFWO0FBc0JBbEUsWUFBQUEsVUFBVSxDQUFDeEIsSUFBWCxDQUFnQnVDLE9BQWhCO0FBQ0E7QUFDRDtBQUNELE9BN0dEO0FBOEdBRixNQUFBQSxlQUFlLENBQUNzRCxPQUFoQixDQUF3Qm5FLFVBQXhCO0FBQ0EsYUFBT2EsZUFBUDtBQUNBLEtBdFJxQjtBQXdSdEJOLElBQUFBLGNBQWMsRUFBRSxVQUFVUixNQUFWLEVBQXVCO0FBQ3RDLFVBQU1xRSxRQUFRLEdBQUlyRSxNQUFNLElBQUlBLE1BQU0sQ0FBQ3NFLFVBQVAsRUFBWCxJQUFtQyxFQUFwRDtBQUNBLFVBQU1DLFdBQVcsR0FBR3ZFLE1BQU0sSUFBSUEsTUFBTSxDQUFDd0UsU0FBUCxHQUFtQkMsa0JBQW5CLEdBQXdDQyxPQUF0RTtBQUNBLGFBQU9MLFFBQVEsQ0FBQ00sR0FBVCxDQUFhLFVBQVVDLE9BQVYsRUFBd0I7QUFDM0MsWUFBTUMsYUFBYSxHQUFHRCxPQUFPLElBQUlBLE9BQU8sQ0FBQ0UsZUFBUixFQUFqQztBQUFBLFlBQ0NDLGtCQUFrQixHQUNqQlIsV0FBVyxJQUNYQSxXQUFXLENBQUM1RixNQUFaLENBQW1CLFVBQVUyQyxXQUFWLEVBQTRCO0FBQzlDLGlCQUFPQSxXQUFXLENBQUNRLElBQVosS0FBcUIrQyxhQUFyQixJQUFzQ3ZELFdBQVcsQ0FBQzBELElBQVosS0FBcUIsWUFBbEU7QUFDQSxTQUZELENBSEY7QUFNQSxlQUFPO0FBQ04sMEJBQWdCSCxhQURWO0FBRU4sbUJBQVNELE9BQU8sQ0FBQ0ssU0FBUixFQUZIO0FBR04sNEJBQWtCRixrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUMsQ0FBRCxDQUF4QyxJQUErQ0Esa0JBQWtCLENBQUMsQ0FBRCxDQUFsQixDQUFzQjlDO0FBSGpGLFNBQVA7QUFLQSxPQVpNLENBQVA7QUFhQSxLQXhTcUI7QUEwU3RCaUQsSUFBQUEsd0JBQXdCLEVBQUUsVUFBVUMsZUFBVixFQUFnQ0MsaUJBQWhDLEVBQXdEcEYsTUFBeEQsRUFBcUU7QUFDOUY7QUFDQSxVQUFNcUYsWUFBWSxHQUFHckYsTUFBTSxDQUFDTSxJQUFQLENBQVksNEJBQVosTUFBOEMsTUFBbkU7QUFFQSxhQUFPO0FBQ04sOEJBQXNCLFFBRGhCO0FBRU4sMkJBQW1CLGlCQUZiO0FBR04sMkJBQW1CLGtCQUhiO0FBSU4seUJBQWlCNkUsZUFBZSxDQUFDRyxPQUFoQixDQUF3QiwwQkFBeEIsRUFBb0RGLGlCQUFpQixDQUFDRyxRQUFsQixFQUFwRCxDQUpYO0FBS04sMkJBQW1CRixZQUFZLEdBQzVCRixlQUFlLENBQUNHLE9BQWhCLENBQXdCLDhCQUF4QixDQUQ0QixHQUU1QkgsZUFBZSxDQUFDRyxPQUFoQixDQUF3QiwrQkFBeEIsQ0FQRztBQVFOLDRCQUFvQkgsZUFBZSxDQUFDRyxPQUFoQixDQUF3QixnQ0FBeEI7QUFSZCxPQUFQO0FBVUEsS0F4VHFCOztBQTBUdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NFLElBQUFBLHlCQUF5QixFQUFFLFVBQVVDLFVBQVYsRUFBOEI7QUFDeEQsVUFBSUMsT0FBTyxHQUFHLFFBQWQ7O0FBRUEsY0FBUUQsVUFBUjtBQUNDO0FBQ0EsYUFBSyxZQUFMO0FBQ0NDLFVBQUFBLE9BQU8sR0FBRyxPQUFWO0FBQ0E7O0FBQ0QsYUFBSyxVQUFMO0FBQ0NBLFVBQUFBLE9BQU8sR0FBRyxVQUFWO0FBQ0E7QUFQRjs7QUFTQSxhQUFPQSxPQUFQO0FBQ0EsS0E3VXFCOztBQStVdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLHdCQUF3QixFQUFFLFVBQVU3SSxPQUFWLEVBQTBCa0IsU0FBMUIsRUFBNEM0SCxjQUE1QyxFQUFpRXBFLGFBQWpFLEVBQXFGcUUsU0FBckYsRUFBMEc7QUFDbkksVUFBTXhJLGFBQWEsR0FBR3dJLFNBQVMsR0FBR3JFLGFBQWEsQ0FBQ3NFLFlBQWpCLEdBQWdDdEUsYUFBYSxDQUFDRCxZQUE3RTtBQUFBLFVBQ0NrRSxVQUFVLEdBQUdqRSxhQUFhLENBQUNuQyxTQUQ1QjtBQUFBLFVBRUMwRyxpQkFBaUIsR0FBR3ZFLGFBQWEsQ0FBQ3dFLGVBRm5DO0FBR0EsVUFBTUMsc0JBQXNCLEdBQUd0SixjQUFjLENBQUM2SSx5QkFBZixDQUF5Q0MsVUFBekMsQ0FBL0IsQ0FKbUksQ0FLbkk7QUFDQTs7QUFDQSxVQUFNUywyQkFBMkIsR0FBR2xJLFNBQVMsQ0FBQ2UsSUFBVixDQUFlLFVBQVViLGdCQUFWLEVBQWlDO0FBQ25GLGVBQU9BLGdCQUFnQixDQUFDSSxTQUFqQixDQUEyQmpCLGFBQTNCLENBQVA7QUFDQSxPQUZtQyxDQUFwQzs7QUFHQSxVQUFJNkksMkJBQUosRUFBaUM7QUFDaEMsWUFBSUgsaUJBQWlCLEtBQUssTUFBdEIsSUFBZ0MsQ0FBQ0YsU0FBckMsRUFBZ0Q7QUFDL0MvSSxVQUFBQSxPQUFPLENBQUNxSixPQUFSLENBQWdCO0FBQUVDLFlBQUFBLElBQUksRUFBRVIsY0FBYyxDQUFDUyxlQUF2QjtBQUF3Q0MsWUFBQUEsR0FBRyxFQUFFLHFCQUFxQmpKO0FBQWxFLFdBQWhCO0FBQ0E7QUFDRCxPQUpELE1BSU87QUFDTlAsUUFBQUEsT0FBTyxDQUFDcUosT0FBUixDQUFnQjtBQUFFQyxVQUFBQSxJQUFJLEVBQUVSLGNBQWMsQ0FBQ1csZUFBdkI7QUFBd0NELFVBQUFBLEdBQUcsRUFBRSxXQUFXako7QUFBeEQsU0FBaEI7QUFDQTs7QUFDRFAsTUFBQUEsT0FBTyxDQUFDcUosT0FBUixDQUFnQjtBQUNmQyxRQUFBQSxJQUFJLEVBQUVSLGNBQWMsQ0FBQ1ksa0JBQWYsR0FBb0MsR0FBcEMsR0FBMENQLHNCQUExQyxHQUFtRSxJQUQxRDtBQUVmSyxRQUFBQSxHQUFHLEVBQUUsYUFBYWpKO0FBRkgsT0FBaEI7QUFJQSxLQTdXcUI7QUErV3RCb0osSUFBQUEsc0JBQXNCLEVBQUUsVUFDdkJDLFNBRHVCLEVBRXZCckYsWUFGdUIsRUFHdkJzRixpQkFIdUIsRUFJdkJ6SSxnQkFKdUIsRUFLVztBQUNsQyxVQUFNZ0MsVUFBVSxHQUFHaEMsZ0JBQWdCLENBQUNpQyxRQUFqQixHQUE0QkMsWUFBNUIsRUFBbkI7QUFDQSxVQUFNd0csWUFBWSxHQUFHQyxXQUFXLENBQUNDLGtCQUFaLENBQStCNUcsVUFBVSxDQUFDNUIsU0FBWCxDQUFxQnFJLGlCQUFpQixHQUFHLEdBQXBCLEdBQTBCRCxTQUExQixHQUFzQyxHQUEzRCxDQUEvQixDQUFyQjtBQUNBLFVBQUlLLGdCQUFKLEVBQXNCeEosTUFBdEIsRUFBOEJ5SixpQkFBOUIsRUFBaURDLFNBQWpEOztBQUNBLFVBQUk1RixZQUFZLEtBQUtBLFlBQVksQ0FBQ21CLElBQWIsSUFBc0JuQixZQUFZLENBQUM2RixVQUFiLElBQTJCN0YsWUFBWSxDQUFDNkYsVUFBYixDQUF3QmpKLE1BQTlFLENBQVosSUFBc0d5SSxTQUExRyxFQUFxSDtBQUNwSCxZQUFJckYsWUFBWSxDQUFDbUIsSUFBakIsRUFBdUI7QUFDdEIsY0FBSW9FLFlBQVksS0FBSyxhQUFyQixFQUFvQztBQUNuQ3JKLFlBQUFBLE1BQU0sR0FBR1csZ0JBQWdCLENBQUNJLFNBQWpCLENBQTJCb0ksU0FBM0IsQ0FBVDtBQUNBTSxZQUFBQSxpQkFBaUIsR0FBRzlJLGdCQUFnQixDQUFDSSxTQUFqQixDQUEyQitDLFlBQVksQ0FBQ21CLElBQXhDLENBQXBCO0FBQ0F5RSxZQUFBQSxTQUFTLEdBQUdELGlCQUFaO0FBQ0EsV0FKRCxNQUlPLElBQUlKLFlBQVksS0FBSyxPQUFyQixFQUE4QjtBQUNwQ3JKLFlBQUFBLE1BQU0sR0FBR1csZ0JBQWdCLENBQUNJLFNBQWpCLENBQTJCb0ksU0FBM0IsQ0FBVDtBQUNBTyxZQUFBQSxTQUFTLEdBQUcxSixNQUFaO0FBQ0E7QUFDRCxTQVRELE1BU08sSUFBSThELFlBQVksQ0FBQzZGLFVBQWpCLEVBQTZCO0FBQ25DN0YsVUFBQUEsWUFBWSxDQUFDNkYsVUFBYixDQUF3QjlKLE9BQXhCLENBQWdDLFVBQVUrSixNQUFWLEVBQXVCO0FBQ3RELGdCQUFJQSxNQUFNLENBQUMzRSxJQUFQLElBQWUyRSxNQUFNLENBQUMzRSxJQUFQLEtBQWdCa0UsU0FBbkMsRUFBOEM7QUFDN0NLLGNBQUFBLGdCQUFnQixHQUFHSSxNQUFNLENBQUMzRSxJQUExQjtBQUNBO0FBQ0QsV0FKRDtBQUtBakYsVUFBQUEsTUFBTSxHQUFHVyxnQkFBZ0IsQ0FBQ0ksU0FBakIsQ0FBMkJvSSxTQUEzQixDQUFUO0FBQ0FNLFVBQUFBLGlCQUFpQixHQUFHOUksZ0JBQWdCLENBQUNJLFNBQWpCLENBQTJCeUksZ0JBQTNCLENBQXBCOztBQUNBLGNBQUlILFlBQVksS0FBSyxrQkFBakIsSUFBdUNySixNQUF2QyxJQUFpRHlKLGlCQUFyRCxFQUF3RTtBQUN2RUMsWUFBQUEsU0FBUyxHQUFHMUosTUFBTSxHQUFHLElBQVQsR0FBZ0J5SixpQkFBaEIsR0FBb0MsR0FBaEQ7QUFDQSxXQUZELE1BRU8sSUFBSUosWUFBWSxLQUFLLGtCQUFqQixJQUF1Q0ksaUJBQXZDLElBQTREekosTUFBaEUsRUFBd0U7QUFDOUUwSixZQUFBQSxTQUFTLEdBQUdELGlCQUFpQixHQUFHLElBQXBCLEdBQTJCekosTUFBM0IsR0FBb0MsR0FBaEQ7QUFDQTtBQUNEOztBQUNELGVBQU87QUFDTiw2QkFBbUJxSixZQURiO0FBRU4sdUJBQWFGLFNBRlA7QUFHTiw2QkFBbUJLLGdCQUhiO0FBSU4sbUJBQVN4SixNQUpIO0FBS04seUJBQWV5SixpQkFMVDtBQU1OLHNCQUFZQztBQU5OLFNBQVA7QUFRQTs7QUFDRCxhQUFPOUMsU0FBUDtBQUNBLEtBMVpxQjs7QUE0WnRCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDaUQsSUFBQUEsVUFBVSxFQUFFLFVBQVVDLEdBQVYsRUFBaUM7QUFDNUMsVUFBTUMsT0FBTyxHQUFHRCxHQUFHLENBQUNFLFVBQUosQ0FBZSxLQUFmLENBQWhCO0FBQ0EsVUFBTXpILEtBQUssR0FBSXdILE9BQUQsQ0FBaUJFLGdCQUFqQixFQUFkO0FBQ0EsYUFBTzFILEtBQUssS0FBSzRELFFBQVEsQ0FBQ0ksUUFBMUI7QUFDQSxLQXRhcUI7O0FBd2F0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQzJELElBQUFBLHVCQUF1QixFQUFFLFVBQVVDLGdCQUFWLEVBQXVDbkcsWUFBdkMsRUFBbUU7QUFDM0YsVUFBTW9HLG9CQUFvQixHQUFHRCxnQkFBZ0IsQ0FBQ0UsV0FBakIsQ0FBNkIsYUFBYXJHLFlBQWIsR0FBNEIsdUJBQXpELEtBQXFGLEVBQWxIO0FBQ0EsVUFBTXNDLFFBQVEsR0FBRzhELG9CQUFvQixDQUFDNUksSUFBckIsQ0FBMEJwQyxjQUFjLENBQUN5SyxVQUF6QyxDQUFqQjs7QUFFQSxVQUFJdkQsUUFBSixFQUFjO0FBQ2I2RCxRQUFBQSxnQkFBZ0IsQ0FBQ0csV0FBakIsQ0FBNkIsYUFBYXRHLFlBQWIsR0FBNEIsVUFBekQsRUFBcUVzQyxRQUFyRTtBQUNBO0FBQ0QsS0FyYnFCOztBQXVidEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDaUUsSUFBQUEscUJBQXFCLEVBQUUsVUFBVUMsT0FBVixFQUE0QkwsZ0JBQTVCLEVBQXlEbkcsWUFBekQsRUFBK0V5RyxNQUEvRSxFQUE0RjtBQUNsSCxVQUFNVixPQUFPLEdBQUdTLE9BQU8sQ0FBQ1IsVUFBUixDQUFtQixLQUFuQixDQUFoQjtBQUVBUyxNQUFBQSxNQUFNLENBQUNMLG9CQUFQLEdBQThCSyxNQUFNLENBQUNMLG9CQUFQLElBQStCLEVBQTdEO0FBQ0FLLE1BQUFBLE1BQU0sQ0FBQ0wsb0JBQVAsQ0FBNEJsSixJQUE1QixDQUFpQ3NKLE9BQWpDO0FBRUFULE1BQUFBLE9BQU8sQ0FBQ1csWUFBUixDQUFxQnRMLGNBQWMsQ0FBQzhLLHVCQUFmLENBQXVDUyxJQUF2QyxDQUE0QyxJQUE1QyxFQUFrRFIsZ0JBQWxELEVBQW9FbkcsWUFBcEUsQ0FBckI7QUFDQSxLQXRjcUI7O0FBd2N0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDNEcsSUFBQUEsY0FBYyxFQUFFLFVBQVU5RSxVQUFWLEVBQWlGVCxPQUFqRixFQUE0RztBQUMzSCxVQUFNbUYsT0FBTyxHQUFHLElBQUlLLEdBQUosQ0FBUTtBQUFFZixRQUFBQSxHQUFHLEVBQUVoRTtBQUFQLE9BQVIsQ0FBaEI7QUFDQSxVQUFNZ0YsS0FBSyxHQUFHekYsT0FBTyxDQUFDekMsUUFBUixFQUFkO0FBQ0E0SCxNQUFBQSxPQUFPLENBQUNPLFFBQVIsQ0FBaUJELEtBQWpCO0FBQ0FOLE1BQUFBLE9BQU8sQ0FBQ1EsaUJBQVIsQ0FBMEIzRixPQUExQjtBQUVBLGFBQU9tRixPQUFQO0FBQ0EsS0F0ZHFCOztBQXdkdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ1MsSUFBQUEsaUJBQWlCLEVBQUUsVUFDbEJuRixVQURrQixFQUVsQnFFLGdCQUZrQixFQUdsQm5HLFlBSGtCLEVBSWxCeUcsTUFKa0IsRUFLbEJwRixPQUxrQixFQU1SO0FBQ1YsVUFBTW1GLE9BQU8sR0FBR3BMLGNBQWMsQ0FBQ3dMLGNBQWYsQ0FBOEI5RSxVQUE5QixFQUEwQ1QsT0FBMUMsQ0FBaEI7QUFDQSxVQUFNNkYsaUJBQWlCLEdBQUc5TCxjQUFjLENBQUN5SyxVQUFmLENBQTBCVyxPQUExQixDQUExQjs7QUFFQSxVQUFJLENBQUNVLGlCQUFMLEVBQXdCO0FBQ3ZCOUwsUUFBQUEsY0FBYyxDQUFDbUwscUJBQWYsQ0FBcUNDLE9BQXJDLEVBQThDTCxnQkFBOUMsRUFBZ0VuRyxZQUFoRSxFQUE4RXlHLE1BQTlFO0FBQ0E7O0FBQ0QsYUFBT1MsaUJBQVA7QUFDQSxLQWhmcUI7O0FBa2Z0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSx1QkFBdUIsRUFBRSxVQUFVMUssU0FBVixFQUE0QmlDLFVBQTVCLEVBQStDMkYsY0FBL0MsRUFBb0U7QUFDNUYsVUFBTTlJLE9BQWMsR0FBRyxFQUF2QjtBQUNBLFVBQU02TCxTQUFnQixHQUFHLEVBQXpCO0FBQ0EsVUFBTUMsUUFBZSxHQUFHLEVBQXhCO0FBQ0EsVUFBTUMsa0JBQXlCLEdBQUcsRUFBbEM7QUFDQSxVQUFNQyxpQkFBc0IsR0FBRyxFQUEvQjtBQUNBLFVBQU1DLEtBQUssR0FBRztBQUFFLGtCQUFVak0sT0FBWjtBQUFxQixvQkFBWTZMLFNBQWpDO0FBQTRDLG1CQUFXQyxRQUF2RDtBQUFpRSxnQ0FBd0JDO0FBQXpGLE9BQWQ7QUFDQSxVQUFNbkIsZ0JBQWdCLEdBQUcsSUFBSTNHLFNBQUosQ0FBY2dJLEtBQWQsQ0FBekI7QUFDQSxVQUFJQyxhQUFKO0FBQ0EvSSxNQUFBQSxVQUFVLENBQUM3QyxPQUFYLENBQW1CLFVBQVUyTCxLQUFWLEVBQXNCO0FBQ3hDLFlBQUlFLFNBQUo7O0FBQ0EsWUFBSUYsS0FBSyxDQUFDeEgsWUFBTixJQUFzQndILEtBQUssQ0FBQ3hILFlBQU4sQ0FBbUI5RCxPQUFuQixDQUEyQixHQUEzQixJQUFrQyxDQUFDLENBQTdELEVBQWdFO0FBQy9ELGNBQU1WLFVBQVUsR0FBR0osY0FBYyxDQUFDQywyQkFBZixDQUEyQ21NLEtBQUssQ0FBQ3hILFlBQWpELEVBQStEekUsT0FBL0QsQ0FBbkI7QUFDQSxjQUFNZSxjQUFjLEdBQUdrTCxLQUFLLENBQUN4SCxZQUFOLENBQW1CckUsS0FBbkIsQ0FBeUIsR0FBekIsQ0FBdkI7QUFDQSxjQUFJZ00sWUFBSjs7QUFDQSxlQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUduTCxTQUFTLENBQUNDLE1BQTlCLEVBQXNDa0wsQ0FBQyxFQUF2QyxFQUEyQztBQUMxQyxnQkFBTUMsb0JBQW9CLEdBQUdwTCxTQUFTLENBQUNtTCxDQUFELENBQVQsQ0FBYTdLLFNBQWIsQ0FBdUJ5SyxLQUFLLENBQUN4SCxZQUE3QixDQUE3QjtBQUNBMkgsWUFBQUEsWUFBWSxHQUFHSCxLQUFLLENBQUN4SCxZQUFOLEdBQXFCLEdBQXJCLEdBQTJCNkgsb0JBQTFDOztBQUNBLGdCQUFJLENBQUNOLGlCQUFpQixDQUFDSSxZQUFELENBQWxCLElBQW9Dbk0sVUFBVSxDQUFDYyxjQUFjLENBQUNBLGNBQWMsQ0FBQ0ksTUFBZixHQUF3QixDQUF6QixDQUFmLENBQWxELEVBQStGO0FBQzlGZ0wsY0FBQUEsU0FBUyxHQUFHdE0sY0FBYyxDQUFDOEosc0JBQWYsQ0FDWHNDLEtBQUssQ0FBQ3hILFlBREssRUFFWHdILEtBQUssQ0FBQ00sV0FGSyxFQUdYTixLQUFLLENBQUNPLFNBSEssRUFJWHRMLFNBQVMsQ0FBQ21MLENBQUQsQ0FKRSxDQUFaO0FBTUFwTSxjQUFBQSxVQUFVLENBQUNjLGNBQWMsQ0FBQ0EsY0FBYyxDQUFDSSxNQUFmLEdBQXdCLENBQXpCLENBQWYsQ0FBVixDQUFzRFEsSUFBdEQsQ0FBMkQ7QUFDMUQsd0JBQVN3SyxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sUUFBeEIsSUFBcUNILG9CQURhO0FBRTFELHVCQUFPTCxLQUFLLENBQUN4SCxZQUY2QztBQUcxRCw0QkFBWTBIO0FBSDhDLGVBQTNEO0FBS0FILGNBQUFBLGlCQUFpQixDQUFDSSxZQUFELENBQWpCLEdBQWtDRSxvQkFBbEM7QUFDQTtBQUNEO0FBQ0QsU0F0QkQsTUFzQk87QUFDTnRNLFVBQUFBLE9BQU8sQ0FBQ2lNLEtBQUssQ0FBQ3hILFlBQVAsQ0FBUCxHQUE4QnpFLE9BQU8sQ0FBQ2lNLEtBQUssQ0FBQ3hILFlBQVAsQ0FBUCxJQUErQixFQUE3RDs7QUFDQSxjQUFJd0gsS0FBSyxDQUFDakQsWUFBVixFQUF3QjtBQUN2QjZDLFlBQUFBLFNBQVMsQ0FBQ0ksS0FBSyxDQUFDakQsWUFBUCxDQUFULEdBQWdDNkMsU0FBUyxDQUFDSSxLQUFLLENBQUNqRCxZQUFQLENBQVQsSUFBaUMsRUFBakU7QUFDQTs7QUFDRCxlQUFLLElBQUlxRCxFQUFDLEdBQUcsQ0FBYixFQUFnQkEsRUFBQyxHQUFHbkwsU0FBUyxDQUFDQyxNQUE5QixFQUFzQ2tMLEVBQUMsRUFBdkMsRUFBMkM7QUFDMUMsZ0JBQU05SyxXQUFXLEdBQUdMLFNBQVMsQ0FBQ21MLEVBQUQsQ0FBVCxDQUFhN0ssU0FBYixFQUFwQjs7QUFDQTBLLFlBQUFBLGFBQWEsR0FBR0QsS0FBSyxDQUFDeEgsWUFBTixHQUFxQixHQUFyQixHQUEyQmxELFdBQVcsQ0FBQzBLLEtBQUssQ0FBQ3hILFlBQVAsQ0FBdEQ7O0FBQ0EsZ0JBQUl3SCxLQUFLLENBQUN4SCxZQUFOLElBQXNCbEQsV0FBVyxDQUFDMEssS0FBSyxDQUFDeEgsWUFBUCxDQUFqQyxJQUF5RCxDQUFDdUgsaUJBQWlCLENBQUNFLGFBQUQsQ0FBL0UsRUFBZ0c7QUFDL0ZDLGNBQUFBLFNBQVMsR0FBR3RNLGNBQWMsQ0FBQzhKLHNCQUFmLENBQ1hzQyxLQUFLLENBQUN4SCxZQURLLEVBRVh3SCxLQUFLLENBQUNNLFdBRkssRUFHWE4sS0FBSyxDQUFDTyxTQUhLLEVBSVh0TCxTQUFTLENBQUNtTCxFQUFELENBSkUsQ0FBWjtBQU1Bck0sY0FBQUEsT0FBTyxDQUFDaU0sS0FBSyxDQUFDeEgsWUFBUCxDQUFQLENBQTRCOUMsSUFBNUIsQ0FBaUM7QUFDaEMsd0JBQVN3SyxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sUUFBeEIsSUFBcUNsTCxXQUFXLENBQUMwSyxLQUFLLENBQUN4SCxZQUFQLENBRHhCO0FBRWhDLHVCQUFPd0gsS0FBSyxDQUFDeEgsWUFGbUI7QUFHaEMsNEJBQVkwSDtBQUhvQixlQUFqQztBQUtBSCxjQUFBQSxpQkFBaUIsQ0FBQ0UsYUFBRCxDQUFqQixHQUFtQzNLLFdBQVcsQ0FBQzBLLEtBQUssQ0FBQ3hILFlBQVAsQ0FBOUM7QUFDQTs7QUFDRCxnQkFBSXdILEtBQUssQ0FBQ2pELFlBQU4sSUFBc0J6SCxXQUFXLENBQUMwSyxLQUFLLENBQUNqRCxZQUFQLENBQXJDLEVBQTJEO0FBQzFEa0QsY0FBQUEsYUFBYSxHQUFHRCxLQUFLLENBQUNqRCxZQUFOLEdBQXFCLEdBQXJCLEdBQTJCekgsV0FBVyxDQUFDMEssS0FBSyxDQUFDakQsWUFBUCxDQUF0RDs7QUFDQSxrQkFBSSxDQUFDZ0QsaUJBQWlCLENBQUNFLGFBQUQsQ0FBdEIsRUFBdUM7QUFDdENDLGdCQUFBQSxTQUFTLEdBQUd0TSxjQUFjLENBQUM4SixzQkFBZixDQUNYc0MsS0FBSyxDQUFDakQsWUFESyxFQUVYaUQsS0FBSyxDQUFDTSxXQUZLLEVBR1hOLEtBQUssQ0FBQ08sU0FISyxFQUlYdEwsU0FBUyxDQUFDbUwsRUFBRCxDQUpFLENBQVo7QUFNQVIsZ0JBQUFBLFNBQVMsQ0FBQ0ksS0FBSyxDQUFDakQsWUFBUCxDQUFULENBQThCckgsSUFBOUIsQ0FBbUM7QUFDbEMsMEJBQVN3SyxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sUUFBeEIsSUFBcUNsTCxXQUFXLENBQUMwSyxLQUFLLENBQUNqRCxZQUFQLENBRHRCO0FBRWxDLHlCQUFPaUQsS0FBSyxDQUFDakQsWUFGcUI7QUFHbEMsOEJBQVltRDtBQUhzQixpQkFBbkM7QUFLQUgsZ0JBQUFBLGlCQUFpQixDQUFDRSxhQUFELENBQWpCLEdBQW1DM0ssV0FBVyxDQUFDMEssS0FBSyxDQUFDakQsWUFBUCxDQUE5QztBQUNBO0FBQ0Q7QUFDRDtBQUNEO0FBQ0QsT0FqRUQ7QUFrRUE3RixNQUFBQSxVQUFVLENBQUM3QyxPQUFYLENBQW1CLFVBQVUyTCxLQUFWLEVBQXNCO0FBQ3hDLFlBQUlmLE1BQUo7O0FBQ0EsWUFBSWUsS0FBSyxDQUFDeEgsWUFBTixDQUFtQjlELE9BQW5CLENBQTJCLEdBQTNCLElBQWtDLENBQUMsQ0FBdkMsRUFBMEM7QUFDekMsY0FBTStMLHdCQUF3QixHQUFHN00sY0FBYyxDQUFDZSx5QkFBZixDQUF5Q3FMLEtBQUssQ0FBQ3hILFlBQS9DLEVBQTZEekUsT0FBN0QsQ0FBakM7O0FBQ0EsY0FBSSxDQUFDME0sd0JBQUwsRUFBK0I7QUFDOUJBLFlBQUFBLHdCQUF3QixDQUFDL0ssSUFBekIsQ0FBOEI7QUFBRTJILGNBQUFBLElBQUksRUFBRVIsY0FBYyxDQUFDVyxlQUF2QjtBQUF3Q0QsY0FBQUEsR0FBRyxFQUFFLFdBQVd5QyxLQUFLLENBQUN4SDtBQUE5RCxhQUE5QjtBQUNBLFdBRkQsTUFFTztBQUNONUUsWUFBQUEsY0FBYyxDQUFDZ0osd0JBQWYsQ0FBd0M2RCx3QkFBeEMsRUFBa0V4TCxTQUFsRSxFQUE2RTRILGNBQTdFLEVBQTZGbUQsS0FBN0Y7QUFDQTs7QUFDRGYsVUFBQUEsTUFBTSxHQUFHd0Isd0JBQVQ7QUFDQSxTQVJELE1BUU8sSUFBSTFNLE9BQU8sQ0FBQ2lNLEtBQUssQ0FBQ3hILFlBQVAsQ0FBUCxJQUErQnpFLE9BQU8sQ0FBQ2lNLEtBQUssQ0FBQ3hILFlBQVAsQ0FBUCxDQUE0QnRELE1BQS9ELEVBQXVFO0FBQzdFdEIsVUFBQUEsY0FBYyxDQUFDZ0osd0JBQWYsQ0FBd0M3SSxPQUFPLENBQUNpTSxLQUFLLENBQUN4SCxZQUFQLENBQS9DLEVBQXFFdkQsU0FBckUsRUFBZ0Y0SCxjQUFoRixFQUFnR21ELEtBQWhHO0FBQ0FmLFVBQUFBLE1BQU0sR0FBR2xMLE9BQU8sQ0FBQ2lNLEtBQUssQ0FBQ3hILFlBQVAsQ0FBaEI7QUFDQTs7QUFDRCxZQUFJb0gsU0FBUyxDQUFDSSxLQUFLLENBQUNqRCxZQUFQLENBQVQsSUFBaUM2QyxTQUFTLENBQUNJLEtBQUssQ0FBQ2pELFlBQVAsQ0FBVCxDQUE4QjdILE1BQW5FLEVBQTJFO0FBQzFFdEIsVUFBQUEsY0FBYyxDQUFDZ0osd0JBQWYsQ0FBd0NnRCxTQUFTLENBQUNJLEtBQUssQ0FBQ2pELFlBQVAsQ0FBakQsRUFBdUU5SCxTQUF2RSxFQUFrRjRILGNBQWxGLEVBQWtHbUQsS0FBbEcsRUFBeUcsSUFBekc7QUFDQSxTQUZELE1BRU8sSUFDTEEsS0FBSyxDQUFDeEgsWUFBTixJQUFzQnpFLE9BQU8sQ0FBQ2lNLEtBQUssQ0FBQ3hILFlBQVAsQ0FBN0IsSUFBcUQsQ0FBQ3pFLE9BQU8sQ0FBQ2lNLEtBQUssQ0FBQ3hILFlBQVAsQ0FBUCxDQUE0QnRELE1BQW5GLElBQ0M4SyxLQUFLLENBQUNqRCxZQUFOLElBQXNCNkMsU0FBUyxDQUFDSSxLQUFLLENBQUNqRCxZQUFQLENBQS9CLElBQXVELENBQUM2QyxTQUFTLENBQUNJLEtBQUssQ0FBQ2pELFlBQVAsQ0FBVCxDQUE4QjdILE1BRmpGLEVBR0w7QUFDRCxjQUFNd0wsNkJBQTZCLEdBQ2xDM00sT0FBTyxDQUFDaU0sS0FBSyxDQUFDeEgsWUFBUCxDQUFQLElBQ0F6RSxPQUFPLENBQUNpTSxLQUFLLENBQUN4SCxZQUFQLENBQVAsQ0FBNEJ4QyxJQUE1QixDQUFpQyxVQUFVMkssR0FBVixFQUFvQjtBQUNwRCxtQkFBT0EsR0FBRyxDQUFDdEQsSUFBSixLQUFhLGtCQUFiLElBQW1Dc0QsR0FBRyxDQUFDdEQsSUFBSixLQUFhLGlCQUF2RDtBQUNBLFdBRkQsQ0FGRDs7QUFLQSxjQUFJMkMsS0FBSyxDQUFDeEgsWUFBTixJQUFzQixDQUFDa0ksNkJBQTNCLEVBQTBEO0FBQ3pEM00sWUFBQUEsT0FBTyxDQUFDaU0sS0FBSyxDQUFDeEgsWUFBUCxDQUFQLENBQTRCOUMsSUFBNUIsQ0FBaUM7QUFBRTJILGNBQUFBLElBQUksRUFBRVIsY0FBYyxDQUFDVyxlQUF2QjtBQUF3Q0QsY0FBQUEsR0FBRyxFQUFFLFdBQVd5QyxLQUFLLENBQUN4SDtBQUE5RCxhQUFqQztBQUNBOztBQUNELGNBQU1vSSxpQ0FBaUMsR0FDdENoQixTQUFTLENBQUNJLEtBQUssQ0FBQ2pELFlBQVAsQ0FBVCxJQUNBNkMsU0FBUyxDQUFDSSxLQUFLLENBQUNqRCxZQUFQLENBQVQsQ0FBOEIvRyxJQUE5QixDQUFtQyxVQUFVMkssR0FBVixFQUFvQjtBQUN0RCxtQkFBT0EsR0FBRyxDQUFDdEQsSUFBSixLQUFhLGtCQUFiLElBQW1Dc0QsR0FBRyxDQUFDdEQsSUFBSixLQUFhLGlCQUF2RDtBQUNBLFdBRkQsQ0FGRDs7QUFLQSxjQUFJMkMsS0FBSyxDQUFDakQsWUFBTixJQUFzQixDQUFDNkQsaUNBQTNCLEVBQThEO0FBQzdEaEIsWUFBQUEsU0FBUyxDQUFDSSxLQUFLLENBQUNqRCxZQUFQLENBQVQsQ0FBOEJySCxJQUE5QixDQUFtQztBQUNsQzJILGNBQUFBLElBQUksRUFBRVIsY0FBYyxDQUFDVyxlQURhO0FBRWxDRCxjQUFBQSxHQUFHLEVBQUUsV0FBV3lDLEtBQUssQ0FBQ2pEO0FBRlksYUFBbkM7QUFJQTtBQUNEOztBQUNELFlBQUlpRCxLQUFLLENBQUNhLGtCQUFOLElBQTRCLE9BQU9iLEtBQUssQ0FBQ2Esa0JBQWIsS0FBb0MsU0FBcEUsRUFBK0U7QUFDOUVmLFVBQUFBLGtCQUFrQixDQUFDcEssSUFBbkIsQ0FBd0I7QUFBRSx3QkFBWXNLLEtBQUssQ0FBQ3hILFlBQXBCO0FBQWtDekIsWUFBQUEsS0FBSyxFQUFFaUosS0FBSyxDQUFDYSxrQkFBL0M7QUFBbUU1RSxZQUFBQSxJQUFJLEVBQUU7QUFBekUsV0FBeEI7QUFDQSxTQUZELE1BRU8sSUFDTitELEtBQUssQ0FBQ2Esa0JBQU4sSUFDQWIsS0FBSyxDQUFDYSxrQkFBTixDQUF5QkMsUUFEekIsSUFFQWQsS0FBSyxDQUFDYSxrQkFBTixDQUF5QkMsUUFBekIsQ0FBa0MsQ0FBbEMsQ0FGQSxJQUdBZCxLQUFLLENBQUNhLGtCQUFOLENBQXlCQyxRQUF6QixDQUFrQyxDQUFsQyxFQUFxQ0MsUUFIckMsSUFJQWYsS0FBSyxDQUFDYSxrQkFBTixDQUF5QkMsUUFBekIsQ0FBa0MsQ0FBbEMsRUFBcUNFLFFBTC9CLEVBTUw7QUFDRDtBQUNBbEIsVUFBQUEsa0JBQWtCLENBQUNwSyxJQUFuQixDQUF3QjtBQUN2Qix3QkFBWXNLLEtBQUssQ0FBQ3hILFlBREs7QUFFdkJ5SSxZQUFBQSxZQUFZLEVBQUVqQixLQUFLLENBQUNhLGtCQUFOLENBQXlCQyxRQUF6QixDQUFrQyxDQUFsQyxFQUFxQ0MsUUFBckMsQ0FBOEN0SCxJQUZyQztBQUd2QnlILFlBQUFBLGFBQWEsRUFBRWxCLEtBQUssQ0FBQ2Esa0JBQU4sQ0FBeUJDLFFBQXpCLENBQWtDLENBQWxDLEVBQXFDRSxRQUFyQyxDQUE4Q2pLLEtBSHRDO0FBSXZCa0YsWUFBQUEsSUFBSSxFQUFFO0FBSmlCLFdBQXhCO0FBTUEsU0F4RHVDLENBMER4Qzs7O0FBQ0EsWUFBSStELEtBQUssQ0FBQ21CLFFBQVYsRUFBb0I7QUFDbkJsQyxVQUFBQSxNQUFNLENBQUNtQyxPQUFQLEdBQ0NwQixLQUFLLENBQUNtQixRQUFOLEtBQW1CeEcsUUFBUSxDQUFDSSxRQUE1QixJQUNBOUYsU0FBUyxDQUFDZSxJQUFWLENBQ0NwQyxjQUFjLENBQUM2TCxpQkFBZixDQUFpQ04sSUFBakMsQ0FBc0N2TCxjQUF0QyxFQUFzRG9NLEtBQUssQ0FBQ21CLFFBQTVELEVBQXNFeEMsZ0JBQXRFLEVBQXdGcUIsS0FBSyxDQUFDeEgsWUFBOUYsRUFBNEd5RyxNQUE1RyxDQURELENBRkQ7QUFLQSxTQU5ELE1BTU87QUFDTkEsVUFBQUEsTUFBTSxDQUFDbUMsT0FBUCxHQUFpQixJQUFqQjtBQUNBO0FBQ0QsT0FwRUQ7QUFxRUEsYUFBT3pDLGdCQUFQO0FBQ0EsS0E3b0JxQjs7QUErb0J0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0MwQyxJQUFBQSxZQUFZLEVBQUUsVUFBVXBLLE1BQVYsRUFBeUJoQyxTQUF6QixFQUEyQ3FNLFdBQTNDLEVBQXdFO0FBQ3JGLFVBQU1DLGFBQWEsR0FBRyw4Q0FBdEI7QUFBQSxVQUNDckssVUFBaUIsR0FBRyxFQURyQjtBQUFBLFVBRUNrRixlQUFlLEdBQUlvRixJQUFELENBQWlCQyx3QkFBakIsQ0FBMEMsYUFBMUMsQ0FGbkI7QUFBQSxVQUdDNUUsY0FBYyxHQUFHakosY0FBYyxDQUFDdUksd0JBQWYsQ0FBd0NDLGVBQXhDLEVBQXlEbkgsU0FBUyxDQUFDQyxNQUFuRSxFQUEyRStCLE1BQTNFLENBSGxCO0FBQUEsVUFJQ2MsZUFBZSxHQUFHbkUsY0FBYyxDQUFDb0Qsb0JBQWYsQ0FBb0NDLE1BQXBDLEVBQTRDaEMsU0FBNUMsRUFBdURpQyxVQUF2RCxDQUpuQjtBQUFBLFVBS0N5SCxnQkFBZ0IsR0FBRy9LLGNBQWMsQ0FBQytMLHVCQUFmLENBQXVDMUssU0FBdkMsRUFBa0RpQyxVQUFsRCxFQUE4RDJGLGNBQTlELENBTHBCO0FBT0EsYUFBTyxJQUFJNkUsT0FBSixDQUFZLFVBQVVDLE9BQVYsRUFBeUNDLE1BQXpDLEVBQXlFO0FBQzNGLFlBQU1DLFNBQVMsR0FBR0Msb0JBQW9CLENBQUNDLFlBQXJCLENBQWtDUixhQUFsQyxFQUFpRCxVQUFqRCxDQUFsQjtBQUNBLGVBQU9HLE9BQU8sQ0FBQ0MsT0FBUixDQUNOSyxlQUFlLENBQUNDLE9BQWhCLENBQ0NKLFNBREQsRUFFQztBQUFFOUksVUFBQUEsSUFBSSxFQUFFd0k7QUFBUixTQUZELEVBR0M7QUFDQ1csVUFBQUEsZUFBZSxFQUFFO0FBQ2hCQyxZQUFBQSxjQUFjLEVBQUVwSyxlQUFlLENBQUNxSyxvQkFBaEIsQ0FBcUMsR0FBckM7QUFEQSxXQURsQjtBQUlDQyxVQUFBQSxNQUFNLEVBQUU7QUFDUEYsWUFBQUEsY0FBYyxFQUFFcEs7QUFEVDtBQUpULFNBSEQsQ0FETSxFQWNMdUssSUFkSyxDQWNBLFVBQVVULFNBQVYsRUFBMEI7QUFDL0IsaUJBQU9VLFFBQVEsQ0FBQ0MsSUFBVCxDQUFjO0FBQUVDLFlBQUFBLFVBQVUsRUFBRVo7QUFBZCxXQUFkLEVBQXlDUyxJQUF6QyxDQUE4QyxVQUFVSSxjQUFWLEVBQStCO0FBQ25GLGdCQUFNQyxPQUFPLEdBQUcsSUFBSUMsTUFBSixDQUFXO0FBQzFCQyxjQUFBQSxLQUFLLEVBQUVoRyxjQUFjLENBQUNpRyxhQURJO0FBRTFCQyxjQUFBQSxPQUFPLEVBQUUsQ0FBQ0wsY0FBRCxDQUZpQjtBQUcxQk0sY0FBQUEsV0FBVyxFQUFFLElBQUlDLE1BQUosQ0FBVztBQUN2QjVGLGdCQUFBQSxJQUFJLEVBQUVSLGNBQWMsQ0FBQ3FHLGVBREU7QUFFdkJqSCxnQkFBQUEsSUFBSSxFQUFFLFlBRmlCO0FBR3ZCa0gsZ0JBQUFBLEtBQUssRUFBRSxVQUFVQyxNQUFWLEVBQXVCO0FBQzdCLHNCQUFNVCxPQUFPLEdBQUdTLE1BQU0sQ0FBQ0MsU0FBUCxHQUFtQjVILFNBQW5CLEVBQWhCO0FBQ0Esc0JBQU02SCxNQUFNLEdBQUdYLE9BQU8sQ0FBQ3ZMLFFBQVIsQ0FBaUIsWUFBakIsQ0FBZjtBQUNBLHNCQUFNeUksUUFBUSxHQUFHeUQsTUFBTSxDQUFDekUsV0FBUCxDQUFtQixVQUFuQixDQUFqQjtBQUNBLHNCQUFNMEUscUJBQXFCLEdBQUdELE1BQU0sQ0FBQ3pFLFdBQVAsQ0FBbUIsdUJBQW5CLENBQTlCO0FBQ0Esc0JBQU0yRSxhQUFvQixHQUFHLEVBQTdCO0FBQ0Esc0JBQUlDLGNBQWMsR0FBRyxLQUFyQjtBQUNBLHNCQUFJQyxPQUFKO0FBQ0Esc0JBQUl6UCxLQUFLLEdBQUcsQ0FBWjtBQUNBZ0Isa0JBQUFBLFNBQVMsQ0FBQ1osT0FBVixDQUFrQixVQUFVYyxnQkFBVixFQUFpQztBQUNsRDBLLG9CQUFBQSxRQUFRLENBQUN4TCxPQUFULENBQWlCLFVBQVU0RCxPQUFWLEVBQXdCO0FBQ3hDO0FBQ0EsMEJBQUlzTCxxQkFBSixFQUEyQjtBQUMxQkUsd0JBQUFBLGNBQWMsR0FBR0YscUJBQXFCLENBQUN2TixJQUF0QixDQUEyQixVQUFVeUMsYUFBVixFQUE4QjtBQUN6RSw4QkFBSVIsT0FBTyxDQUFDMEwsUUFBUixLQUFxQmxMLGFBQWEsQ0FBQ21MLFFBQXZDLEVBQWlEO0FBQ2hELGdDQUFJbkwsYUFBYSxDQUFDd0QsSUFBZCxLQUF1QixTQUEzQixFQUFzQztBQUNyQyxxQ0FBT3hELGFBQWEsQ0FBQzFCLEtBQWQsS0FBd0IsSUFBL0I7QUFDQSw2QkFGRCxNQUVPLElBQ04wQixhQUFhLENBQUN3RCxJQUFkLEtBQXVCLE1BQXZCLElBQ0F4RCxhQUFhLENBQUN5SSxhQURkLElBRUF6SSxhQUFhLENBQUN3SSxZQUhSLEVBSUw7QUFDRCxxQ0FDQzlMLGdCQUFnQixDQUFDSSxTQUFqQixDQUEyQmtELGFBQWEsQ0FBQ3dJLFlBQXpDLE1BQ0F4SSxhQUFhLENBQUN5SSxhQUZmO0FBSUE7QUFDRDtBQUNELHlCQWZnQixDQUFqQjtBQWdCQTs7QUFDRHdDLHNCQUFBQSxPQUFPLEdBQUcsV0FBV3pQLEtBQXJCO0FBQ0FBLHNCQUFBQSxLQUFLLElBQUksQ0FBVDs7QUFDQSwwQkFBSWdFLE9BQU8sQ0FBQzBMLFFBQVIsSUFBb0IxTCxPQUFPLENBQUNsQixLQUFSLEtBQWtCLFNBQXRDLElBQW1ELENBQUMwTSxjQUF4RCxFQUF3RTtBQUN2RUQsd0JBQUFBLGFBQWEsQ0FBQzlOLElBQWQsQ0FBbUJQLGdCQUFnQixDQUFDMkosV0FBakIsQ0FBNkI3RyxPQUFPLENBQUMwTCxRQUFyQyxFQUErQzFMLE9BQU8sQ0FBQ2xCLEtBQXZELEVBQThEMk0sT0FBOUQsQ0FBbkI7QUFDQTtBQUNELHFCQXpCRDtBQTBCQSxtQkEzQkQ7QUE0QkEseUJBQU9oQyxPQUFPLENBQUNtQyxHQUFSLENBQVlMLGFBQVosRUFDTGxCLElBREssQ0FDQSxVQUFVd0IsSUFBVixFQUF1QjtBQUM1Qix3QkFBTUMsWUFBWSxHQUFHOU0sTUFBTSxDQUFDK00sYUFBUCxFQUFyQjtBQUFBLHdCQUNDQyxhQUFhLEdBQUczQyxXQUFXLElBQUtBLFdBQVcsQ0FBQzRDLGVBQVosRUFEakM7QUFFQSwyQkFBT0QsYUFBYSxDQUFDRSxPQUFkLENBQXNCSixZQUFZLENBQUNqSyxPQUFiLEVBQXRCLEVBQThDd0ksSUFBOUMsQ0FBbUQsWUFBWTtBQUNyRUssc0JBQUFBLE9BQU8sQ0FBQ3lCLEtBQVI7QUFDQXpCLHNCQUFBQSxPQUFPLENBQUMwQixPQUFSO0FBQ0EsNkJBQU9QLElBQVA7QUFDQSxxQkFKTSxDQUFQO0FBS0EsbUJBVEssRUFVTFEsS0FWSyxDQVVDLFVBQVVDLE1BQVYsRUFBdUI7QUFDN0I7QUFDQTVCLG9CQUFBQSxPQUFPLENBQUN5QixLQUFSO0FBQ0F6QixvQkFBQUEsT0FBTyxDQUFDMEIsT0FBUjtBQUNBRyxvQkFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsc0RBQVYsRUFBa0VGLE1BQWxFO0FBQ0EsbUJBZkssQ0FBUDtBQWdCQTtBQXhEc0IsZUFBWCxDQUhhO0FBNkQxQkcsY0FBQUEsU0FBUyxFQUFFLElBQUl6QixNQUFKLENBQVc7QUFDckI1RixnQkFBQUEsSUFBSSxFQUFFUixjQUFjLENBQUM4SCxnQkFEQTtBQUVyQnhCLGdCQUFBQSxLQUFLLEVBQUUsVUFBVUMsTUFBVixFQUF1QjtBQUM3QixzQkFBTVQsT0FBTyxHQUFHUyxNQUFNLENBQUNDLFNBQVAsR0FBbUI1SCxTQUFuQixFQUFoQjtBQUNBa0gsa0JBQUFBLE9BQU8sQ0FBQ3lCLEtBQVI7QUFDQXpCLGtCQUFBQSxPQUFPLENBQUMwQixPQUFSO0FBQ0E7QUFOb0IsZUFBWDtBQTdEZSxhQUFYLENBQWhCO0FBc0VBMUIsWUFBQUEsT0FBTyxDQUFDcEQsUUFBUixDQUFpQlosZ0JBQWpCLEVBQW1DLFlBQW5DO0FBQ0FnRCxZQUFBQSxPQUFPLENBQUNnQixPQUFELENBQVA7QUFDQSxXQXpFTSxDQUFQO0FBMEVBLFNBekZLLEVBMEZMMkIsS0ExRkssQ0EwRkMxQyxNQTFGRCxDQUFQO0FBMkZBLE9BN0ZNLENBQVA7QUE4RkE7QUE3dkJxQixHQUF2QjtTQWd3QmVoTyxjIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IEJpbmRpbmdFeHByZXNzaW9uLCBFeHByZXNzaW9uT3JQcmltaXRpdmUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZW5oYW5jZURhdGFNb2RlbFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBnZXRUZXh0QmluZGluZywgc2V0RWRpdFN0eWxlUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEVkaXRNb2RlIGZyb20gXCJzYXAvdWkvbWRjL2VudW0vRWRpdE1vZGVcIjtcbmltcG9ydCBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCBBbnksIHsgQW55VHlwZSB9IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRFZGl0TW9kZSwgZ2V0UmVxdWlyZWRFeHByZXNzaW9uLCBpc0NvbGxlY3Rpb25GaWVsZCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuXG4vKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBmb3IgbWFzcyBlZGl0IGZ1bmN0aW9uYWxpdHkgKi9cbnR5cGUgVGV4dEFycmFuZ2VtZW50SW5mbyA9IHtcblx0dGV4dEFycmFuZ2VtZW50OiBzdHJpbmc7XG5cdHZhbHVlUGF0aDogc3RyaW5nO1xuXHRkZXNjcmlwdGlvblBhdGg/OiBzdHJpbmc7XG5cdHZhbHVlOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdGZ1bGxUZXh0OiBzdHJpbmc7XG59O1xuXG5jb25zdCBNYXNzRWRpdEhlbHBlciA9IHtcblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBhdCBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGggd2l0aCBhIGJsYW5rIGFycmF5LlxuXHQgKiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkgcG9pbnRpbmcgdG8gdGhlIGZpbmFsIG9yIGRlZXBlc3QgbGV2ZWwgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEByZXR1cm5zIHtBcnJheX1cblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIGFWYWx1ZXM6IGFueSkge1xuXHRcdGxldCBhRmluYWxQYXRoOiBhbnk7XG5cdFx0bGV0IGluZGV4ID0gMDtcblx0XHRjb25zdCBhUGF0aHMgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHNGdWxsUGF0aCA9IFwiXCI7XG5cdFx0YVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0aWYgKCFhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdICYmIGluZGV4ID09PSAwKSB7XG5cdFx0XHRcdGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZpbmFsUGF0aCA9IGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdHNGdWxsUGF0aCA9IHNGdWxsUGF0aCArIHNQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9IGVsc2UgaWYgKCFhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdHNGdWxsUGF0aCA9IHNGdWxsUGF0aCArIFwiL1wiICsgc1Byb3BlcnR5UGF0aDtcblx0XHRcdFx0aWYgKHNGdWxsUGF0aCAhPT0gc1BhdGgpIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdFx0YUZpbmFsUGF0aCA9IGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFGaW5hbFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdW5pcXVlIHZhbHVlcyBmb3IgZ2l2ZW4gYXJyYXkgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlIFByb3BlcnR5IHZhbHVlXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBvZiB0aGUgcHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIHtBcnJheX0gc2VsZiBJbnN0YW5jZSBvZiB0aGUgYXJyYXlcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRnZXRVbmlxdWVWYWx1ZXM6IGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgc2VsZjogYW55W10pIHtcblx0XHRpZiAoc1ZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gc2VsZi5pbmRleE9mKHNWYWx1ZSkgPT09IGluZGV4O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGEgbXVsdGktbGV2ZWwgcGF0aCAoZm9yIGV4YW1wbGU6IF9NYXRlcmlhbHMvTWF0ZXJpYWxfRGV0YWlscyBnZXRzIHRoZSB2YWx1ZSBvZiBNYXRlcmlhbF9EZXRhaWxzIHVuZGVyIF9NYXRlcmlhbHMgT2JqZWN0KS5cblx0ICogUmV0dXJucyB0aGUgcHJvcGVydHlWYWx1ZSwgd2hpY2ggY2FuIGJlIG9mIGFueSB0eXBlIChzdHJpbmcsIG51bWJlciwgZXRjLi4pLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0RhdGFQcm9wZXJ0eVBhdGggUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZhbHVlcyBPYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Z2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aDogZnVuY3Rpb24gKHNEYXRhUHJvcGVydHlQYXRoOiBzdHJpbmcsIG9WYWx1ZXM6IGFueSkge1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBzRGF0YVByb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiKSA+IDApIHtcblx0XHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzID0gc0RhdGFQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0bGV0IFJlc3VsdDogYW55O1xuXHRcdFx0YVByb3BlcnR5UGF0aHMuZm9yRWFjaChmdW5jdGlvbiAoc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRSZXN1bHQgPSBvVmFsdWVzICYmIG9WYWx1ZXNbc1BhdGhdID8gb1ZhbHVlc1tzUGF0aF0gOiBSZXN1bHQgJiYgUmVzdWx0W3NQYXRoXTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIFJlc3VsdDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGtleSBwYXRoIGZvciB0aGUga2V5IG9mIGEgY29tYm8gYm94IHRoYXQgbXVzdCBiZSBzZWxlY3RlZCBpbml0aWFsbHkgd2hlbiB0aGUgZGlhbG9nIG9wZW5zOlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgZGlmZmVyZW50LCB0aGVuIDwgS2VlcCBFeGlzdGluZyBWYWx1ZXMgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIHRoZSBzYW1lLCB0aGVuIHRoZSBwcm9wZXJ0eVZhbHVlIGlzIHByZXNlbGVjdGVkLlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgZW1wdHksIHRoZW4gPCBMZWF2ZSBCbGFuayA+IGlzIHByZXNlbGVjdGVkLlxuXHQgKlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0RhdGFQcm9wZXJ0eVBhdGggRGF0YSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRnZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94OiBmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnlbXSwgc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGFDb250ZXh0cyxcblx0XHRcdFx0YVByb3BlcnR5VmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0b1NlbGVjdGVkQ29udGV4dC5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUGF0aENvbmRpdGlvbiA9XG5cdFx0XHRcdFx0c0RhdGFQcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIikgPiAtMSAmJiBvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIilbMF0pO1xuXHRcdFx0XHRpZiAob0NvbnRleHQgJiYgKG9EYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KHNEYXRhUHJvcGVydHlQYXRoKSB8fCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24pKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5VmFsdWVzLnB1c2gob0NvbnRleHQuZ2V0T2JqZWN0KHNEYXRhUHJvcGVydHlQYXRoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYVVuaXF1ZVByb3BlcnR5VmFsdWVzID0gYVByb3BlcnR5VmFsdWVzLmZpbHRlcihNYXNzRWRpdEhlbHBlci5nZXRVbmlxdWVWYWx1ZXMpO1xuXHRcdFx0aWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdHJldHVybiBcIkRlZmF1bHQvXCIgKyBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdH0gZWxzZSBpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gXCJFbXB0eS9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBoaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSBbYm90aCBzdGF0aWMgYW5kIHBhdGggYmFzZWRdIGZvciB0YWJsZSdzIHNlbGVjdGVkIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gaGlkZGVuVmFsdWUgSGlkZGVuIGFubm90YXRpb24gdmFsdWUgLyBwYXRoIGZvciBmaWVsZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGdldEhpZGRlblZhbHVlRm9yQ29udGV4dHM6IGZ1bmN0aW9uIChoaWRkZW5WYWx1ZTogYW55LCBhQ29udGV4dHM6IGFueVtdKSB7XG5cdFx0aWYgKGhpZGRlblZhbHVlICYmIGhpZGRlblZhbHVlLiRQYXRoKSB7XG5cdFx0XHRyZXR1cm4gIWFDb250ZXh0cy5zb21lKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZTogZnVuY3Rpb24gKHByb3BlcnR5SW5mbzogYW55LCBkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSwgb0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZFByb3BlcnRpZXM7XG5cdFx0bGV0IGlucHV0VHlwZSE6IHN0cmluZztcblx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgsIHRydWUpO1xuXHRcdFx0aW5wdXRUeXBlID0gZWRpdFN0eWxlUHJvcGVydGllcz8uZWRpdFN0eWxlIHx8IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IGlzVmFsaWRGb3JNYXNzRWRpdCA9XG5cdFx0XHRpbnB1dFR5cGUgJiZcblx0XHRcdFtcIkRhdGVQaWNrZXJcIiwgXCJUaW1lUGlja2VyXCIsIFwiRGF0ZVRpbWVQaWNrZXJcIiwgXCJSYXRpbmdJbmRpY2F0b3JcIl0uaW5kZXhPZihpbnB1dFR5cGUpID09PSAtMSAmJlxuXHRcdFx0IWlzQ29sbGVjdGlvbkZpZWxkKG9EYXRhTW9kZWxQYXRoKSAmJlxuXHRcdFx0IWhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyhwcm9wZXJ0eUluZm8pO1xuXG5cdFx0cmV0dXJuIChpc1ZhbGlkRm9yTWFzc0VkaXQgfHwgXCJcIikgJiYgaW5wdXRUeXBlO1xuXHR9LFxuXG5cdGdldElzRmllbGRHcnA6IGZ1bmN0aW9uIChkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUuaW5kZXhPZihcIkZpZWxkR3JvdXBcIikgPiAtMVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIGEgSlNPTiBNb2RlbCBmb3IgcHJvcGVydGllcyBvZiBkaWFsb2cgZmllbGRzIFtsYWJlbCwgdmlzaWJsaXR5LCBkYXRhcHJvcGVydHksIGV0Yy5dLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1RhYmxlIEluc3RhbmNlIG9mIFRhYmxlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHJldHVybnMge29iamVjdH1cblx0ICovXG5cdHByZXBhcmVEYXRhRm9yRGlhbG9nOiBmdW5jdGlvbiAob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1RhYmxlICYmIChvVGFibGUuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLFxuXHRcdFx0c0N1cnJlbnRFbnRpdHlTZXROYW1lID0gb1RhYmxlLmRhdGEoXCJtZXRhUGF0aFwiKSxcblx0XHRcdGFUYWJsZUZpZWxkcyA9IE1hc3NFZGl0SGVscGVyLmdldFRhYmxlRmllbGRzKG9UYWJsZSksXG5cdFx0XHRvRW50aXR5VHlwZUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvQFwiKSxcblx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KHNDdXJyZW50RW50aXR5U2V0TmFtZSksXG5cdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRW50aXR5VHlwZUNvbnRleHQpO1xuXG5cdFx0Y29uc3Qgb0RhdGFGaWVsZE1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdGxldCBvUmVzdWx0O1xuXHRcdGxldCBzTGFiZWxUZXh0O1xuXHRcdGxldCBiVmFsdWVIZWxwRW5hYmxlZDtcblx0XHRsZXQgc1VuaXRQcm9wZXJ0eVBhdGg7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdDtcblx0XHRsZXQgb1RleHRCaW5kaW5nO1xuXG5cdFx0YVRhYmxlRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHlQYXRoID0gb0NvbHVtbkluZm8uZGF0YVByb3BlcnR5O1xuXHRcdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdGxldCBvUHJvcGVydHlJbmZvID0gc0RhdGFQcm9wZXJ0eVBhdGggJiYgb01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKTtcblx0XHRcdFx0YlZhbHVlSGVscEVuYWJsZWQgPVxuXHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGggKyBcIkBcIilbXG5cdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0XCJcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHRzVW5pdFByb3BlcnR5UGF0aCA9XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuVW5pdFwiXSAmJiBvUHJvcGVydHlJbmZvW1wiQE9yZy5PRGF0YS5NZWFzdXJlcy5WMS5Vbml0XCJdLiRQYXRoKSB8fFxuXHRcdFx0XHRcdChvUHJvcGVydHlJbmZvICYmXG5cdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvW1wiQE9yZy5PRGF0YS5NZWFzdXJlcy5WMS5JU09DdXJyZW5jeVwiXSAmJlxuXHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuSVNPQ3VycmVuY3lcIl0uJFBhdGgpO1xuXHRcdFx0XHRzTGFiZWxUZXh0ID0gb0NvbHVtbkluZm8ubGFiZWwgfHwgKG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxcIl0pO1xuXHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPVxuXHRcdFx0XHRcdHNVbml0UHJvcGVydHlQYXRoICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzVW5pdFByb3BlcnR5UGF0aCArIFwiQFwiKSAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc1VuaXRQcm9wZXJ0eVBhdGggKyBcIkBcIilbXG5cdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0XCJcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHRpZiAob0RhdGFNb2RlbE9iamVjdFBhdGgpIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXG5cdFx0XHRcdGxldCBvRGF0YU1vZGVsUGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRmllbGRDb250ZXh0LCBvRW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdGlmIChvRGF0YUZpZWxkQ29udmVydGVkPy5WYWx1ZT8ucGF0aD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgob0RhdGFNb2RlbFBhdGgsIHNEYXRhUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiSGlkZGVuRmllbGQgPVxuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLmdldEhpZGRlblZhbHVlRm9yQ29udGV4dHMoXG5cdFx0XHRcdFx0XHRvRmllbGRDb250ZXh0ICYmIG9GaWVsZENvbnRleHQuZ2V0T2JqZWN0KClbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzXG5cdFx0XHRcdFx0KSB8fCBmYWxzZTtcblx0XHRcdFx0Y29uc3QgaXNJbWFnZSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMXCJdO1xuXG5cdFx0XHRcdG9JbnRlcmZhY2UuY29udGV4dCA9IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0b1Byb3BlcnR5SW5mbyA9XG5cdFx0XHRcdFx0KG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5WYWx1ZSAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlLiR0YXJnZXQpIHx8XG5cdFx0XHRcdFx0KG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQuJHRhcmdldCk7XG5cdFx0XHRcdC8vIERhdGFmaWVsZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEZpZWxkQ29udHJvbCBjYWxjdWxhdGlvbiwgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWRcblxuXHRcdFx0XHRjb25zdCBjaGFydFByb3BlcnR5ID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLnRlcm0gJiYgb1Byb3BlcnR5SW5mby50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aW9uID0gISFvRGF0YUZpZWxkQ29udmVydGVkLkFjdGlvbjtcblx0XHRcdFx0Y29uc3QgaXNGaWVsZEdycCA9IE1hc3NFZGl0SGVscGVyLmdldElzRmllbGRHcnAob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cblx0XHRcdFx0aWYgKGlzSW1hZ2UgfHwgYkhpZGRlbkZpZWxkIHx8IGNoYXJ0UHJvcGVydHkgfHwgaXNBY3Rpb24gfHwgaXNGaWVsZEdycCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEVkaXRNb2RlIGFuZCBJbnB1dFR5cGVcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlGb3JGaWVsZENvbnRyb2wgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm8uVmFsdWUgPyBvUHJvcGVydHlJbmZvLlZhbHVlIDogb1Byb3BlcnR5SW5mbztcblx0XHRcdFx0Y29uc3QgZXhwQmluZGluZyA9IGdldEVkaXRNb2RlKHByb3BlcnR5Rm9yRmllbGRDb250cm9sLCBvRGF0YU1vZGVsUGF0aCwgZmFsc2UsIGZhbHNlLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgZWRpdE1vZGVWYWx1ZXMgPSBPYmplY3Qua2V5cyhFZGl0TW9kZSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlSXNTdGF0aWMgPSAhIWV4cEJpbmRpbmcgJiYgZWRpdE1vZGVWYWx1ZXMuaW5jbHVkZXMoZXhwQmluZGluZyBhcyBFZGl0TW9kZSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRhYmxlID0gISFleHBCaW5kaW5nICYmICgoZWRpdE1vZGVJc1N0YXRpYyAmJiBleHBCaW5kaW5nID09PSBFZGl0TW9kZS5FZGl0YWJsZSkgfHwgIWVkaXRNb2RlSXNTdGF0aWMpO1xuXG5cdFx0XHRcdGlmICghZWRpdGFibGUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbnB1dFR5cGUgPSBNYXNzRWRpdEhlbHBlci5nZXRJbnB1dFR5cGUob1Byb3BlcnR5SW5mbywgb0RhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgpO1xuXG5cdFx0XHRcdGlmIChpbnB1dFR5cGUpIHtcblx0XHRcdFx0XHRjb25zdCBpc1JlYWRPbmx5ID0gaXNSZWFkT25seUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbyk7XG5cblx0XHRcdFx0XHRvUmVzdWx0ID0ge1xuXHRcdFx0XHRcdFx0XCJsYWJlbFwiOiBzTGFiZWxUZXh0ICsgXCI6XCIsXG5cdFx0XHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkXCI6IGJWYWx1ZUhlbHBFbmFibGVkID8gYlZhbHVlSGVscEVuYWJsZWQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwidW5pdFByb3BlcnR5XCI6IHNVbml0UHJvcGVydHlQYXRoID8gc1VuaXRQcm9wZXJ0eVBhdGggOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdFwiOiBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPyBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwXCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcInByb3BlcnR5UGF0aEZvclZhbHVlSGVscFVuaXRcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzVW5pdFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNGaWVsZFJlcXVpcmVkXCI6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHlJbmZvLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblBhdGhcIjogc0RhdGFQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc0RhdGFQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImRlZmF1bHRTZWxlY3Rpb25Vbml0UGF0aFwiOiBzVW5pdFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzVW5pdFByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZW50aXR5U2V0XCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdFwidGV4dEJpbmRpbmdcIjogb1RleHRCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XCJudWxsYWJsZVwiOiBvUHJvcGVydHlJbmZvLm51bGxhYmxlICE9PSB1bmRlZmluZWQgPyBvUHJvcGVydHlJbmZvLm51bGxhYmxlIDogdHJ1ZSxcblx0XHRcdFx0XHRcdFwiaXNQcm9wZXJ0eVJlYWRPbmx5XCI6IGlzUmVhZE9ubHkgIT09IHVuZGVmaW5lZCA/IGlzUmVhZE9ubHkgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiaW5wdXRUeXBlXCI6IGlucHV0VHlwZSxcblx0XHRcdFx0XHRcdFwiZWRpdE1vZGVcIjogZWRpdGFibGUgPyBleHBCaW5kaW5nIDogdW5kZWZpbmVkXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhRGF0YUFycmF5LnB1c2gob1Jlc3VsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGF0YUZpZWxkTW9kZWwuc2V0RGF0YShhRGF0YUFycmF5KTtcblx0XHRyZXR1cm4gb0RhdGFGaWVsZE1vZGVsO1xuXHR9LFxuXG5cdGdldFRhYmxlRmllbGRzOiBmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRjb25zdCBhQ29sdW1ucyA9IChvVGFibGUgJiYgb1RhYmxlLmdldENvbHVtbnMoKSkgfHwgW107XG5cdFx0Y29uc3QgY29sdW1uc0RhdGEgPSBvVGFibGUgJiYgb1RhYmxlLmdldFBhcmVudCgpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbHVtbnM7XG5cdFx0cmV0dXJuIGFDb2x1bW5zLm1hcChmdW5jdGlvbiAob0NvbHVtbjogYW55KSB7XG5cdFx0XHRjb25zdCBzRGF0YVByb3BlcnR5ID0gb0NvbHVtbiAmJiBvQ29sdW1uLmdldERhdGFQcm9wZXJ0eSgpLFxuXHRcdFx0XHRhUmVhbHRlZENvbHVtbkluZm8gPVxuXHRcdFx0XHRcdGNvbHVtbnNEYXRhICYmXG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEuZmlsdGVyKGZ1bmN0aW9uIChvQ29sdW1uSW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbHVtbkluZm8ubmFtZSA9PT0gc0RhdGFQcm9wZXJ0eSAmJiBvQ29sdW1uSW5mby50eXBlID09PSBcIkFubm90YXRpb25cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwiZGF0YVByb3BlcnR5XCI6IHNEYXRhUHJvcGVydHksXG5cdFx0XHRcdFwibGFiZWxcIjogb0NvbHVtbi5nZXRIZWFkZXIoKSxcblx0XHRcdFx0XCJhbm5vdGF0aW9uUGF0aFwiOiBhUmVhbHRlZENvbHVtbkluZm8gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdICYmIGFSZWFsdGVkQ29sdW1uSW5mb1swXS5hbm5vdGF0aW9uUGF0aFxuXHRcdFx0fTtcblx0XHR9KTtcblx0fSxcblxuXHRnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2c6IGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IGFueSwgaVNlbGVjdGVkQ29udGV4dHM6IGFueSwgb1RhYmxlOiBhbnkpIHtcblx0XHQvLyBUaGUgY29uZmlybSBidXR0b24gdGV4dCBpcyBcIlNhdmVcIiBmb3IgdGFibGUgaW4gRGlzcGxheSBtb2RlIGFuZCBcIkFwcGx5XCIgZm9yIHRhYmxlIGluIGVkaXQgbW9kZS4gVGhpcyBjYW4gYmUgbGF0ZXIgZXhwb3NlZCBpZiBuZWVkZWQuXG5cdFx0Y29uc3QgYkRpc3BsYXlNb2RlID0gb1RhYmxlLmRhdGEoXCJkaXNwbGF5TW9kZVByb3BlcnR5QmluZGluZ1wiKSA9PT0gXCJ0cnVlXCI7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XCJrZWVwRXhpc3RpbmdQcmVmaXhcIjogXCI8IEtlZXBcIixcblx0XHRcdFwibGVhdmVCbGFua1ZhbHVlXCI6IFwiPCBMZWF2ZSBCbGFuayA+XCIsXG5cdFx0XHRcImNsZWFyRmllbGRWYWx1ZVwiOiBcIjwgQ2xlYXIgVmFsdWVzID5cIixcblx0XHRcdFwibWFzc0VkaXRUaXRsZVwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0RJQUxPR19USVRMRVwiLCBpU2VsZWN0ZWRDb250ZXh0cy50b1N0cmluZygpKSxcblx0XHRcdFwiYXBwbHlCdXR0b25UZXh0XCI6IGJEaXNwbGF5TW9kZVxuXHRcdFx0XHQ/IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfU0FWRV9CVVRUT05fVEVYVFwiKVxuXHRcdFx0XHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfQVBQTFlfQlVUVE9OX1RFWFRcIiksXG5cdFx0XHRcImNhbmNlbEJ1dHRvblRleHRcIjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9DQU5DRUxfQlVUVE9OX1RFWFRcIilcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgc3VmZml4IHRvIHRoZSAna2VlcCBleGlzdGluZycgcHJvcGVydHkgb2YgdGhlIGNvbWJvQm94LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0lucHV0VHlwZSBJbnB1dFR5cGUgb2YgdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRnZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nOiBmdW5jdGlvbiAoc0lucHV0VHlwZTogc3RyaW5nKSB7XG5cdFx0bGV0IHNSZXN1bHQgPSBcIlZhbHVlc1wiO1xuXG5cdFx0c3dpdGNoIChzSW5wdXRUeXBlKSB7XG5cdFx0XHQvL1RPRE8gLSBBZGQgZm9yIG90aGVyIGNvbnRyb2wgdHlwZXMgYXMgd2VsbCAoUmFkaW8gQnV0dG9uLCBFbWFpbCwgSW5wdXQsIE1EQyBGaWVsZHMsIEltYWdlIGV0Yy4pXG5cdFx0XHRjYXNlIFwiRGF0ZVBpY2tlclwiOlxuXHRcdFx0XHRzUmVzdWx0ID0gXCJEYXRlc1wiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJDaGVja0JveFwiOlxuXHRcdFx0XHRzUmVzdWx0ID0gXCJTZXR0aW5nc1wiO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuIHNSZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIG1vZGVsIFtLZWVwIEV4aXN0aW5nIFZhbHVlcywgTGVhdmUgQmxhbmtdLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gQXBwbGljYXRpb24gTWFuaWZlc3Rcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Qcm9wZXJ0eUluZm8gUHJvcGVydHkgaW5mb3JtYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBiVU9NRmllbGRcblx0ICovXG5cdHNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZzogZnVuY3Rpb24gKGFWYWx1ZXM6IGFueVtdLCBhQ29udGV4dHM6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBvUHJvcGVydHlJbmZvOiBhbnksIGJVT01GaWVsZD86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gYlVPTUZpZWxkID8gb1Byb3BlcnR5SW5mby51bml0UHJvcGVydHkgOiBvUHJvcGVydHlJbmZvLmRhdGFQcm9wZXJ0eSxcblx0XHRcdHNJbnB1dFR5cGUgPSBvUHJvcGVydHlJbmZvLmlucHV0VHlwZSxcblx0XHRcdGJQcm9wZXJ0eVJlcXVpcmVkID0gb1Byb3BlcnR5SW5mby5pc0ZpZWxkUmVxdWlyZWQ7XG5cdFx0Y29uc3Qgc1N1ZmZpeEZvcktlZXBFeGlzdGluZyA9IE1hc3NFZGl0SGVscGVyLmdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmcoc0lucHV0VHlwZSk7XG5cdFx0Ly9UT0RPIC0gQWRkIDw8VXNlIFZhbHVlIEhlbHAgb3IgY29udHJvbCBpbXBsbWVudGF0aW9uPj4gYW5kIHJlbGF0ZWQga2V5IGJ5IGNoZWNraW5nIGlmIHZhbHVlIGhlbHAgaXMgZW5hYmxlZCBmb3IgcHJvcGVydHkgb3IgVW5pdC5cblx0XHQvL1RPRE8gLSBBZGQgb3B0aW9uIEFwcGx5IHRvIEVtcHR5IEZpZWxkcyBvbmx5IGZvciBCb3RoIFZhbHVlIEhlbHAgYW5kIGNvbnRyb2xzLlxuXHRcdGNvbnN0IGJWYWx1ZUV4aXN0c0ZvclByb3BlcnR5UGF0aCA9IGFDb250ZXh0cy5zb21lKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHlQYXRoKTtcblx0XHR9KTtcblx0XHRpZiAoYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRpZiAoYlByb3BlcnR5UmVxdWlyZWQgIT09IFwidHJ1ZVwiICYmICFiVU9NRmllbGQpIHtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IFwiQ2xlYXJGaWVsZFZhbHVlL1wiICsgc1Byb3BlcnR5UGF0aCB9KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBzUHJvcGVydHlQYXRoIH0pO1xuXHRcdH1cblx0XHRhVmFsdWVzLnVuc2hpZnQoe1xuXHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4ICsgXCIgXCIgKyBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nICsgXCIgPlwiLFxuXHRcdFx0a2V5OiBcIkRlZmF1bHQvXCIgKyBzUHJvcGVydHlQYXRoXG5cdFx0fSk7XG5cdH0sXG5cblx0Z2V0VGV4dEFycmFuZ2VtZW50SW5mbzogZnVuY3Rpb24gKFxuXHRcdHNQcm9wZXJ0eTogYW55LFxuXHRcdG9UZXh0QmluZGluZzogYW55LFxuXHRcdHNDdXJyZW50RW50aXR5U2V0OiBhbnksXG5cdFx0b1NlbGVjdGVkQ29udGV4dDogYW55XG5cdCk6IFRleHRBcnJhbmdlbWVudEluZm8gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvU2VsZWN0ZWRDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgc0Rpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0ICsgXCIvXCIgKyBzUHJvcGVydHkgKyBcIkBcIikpO1xuXHRcdGxldCBzRGVzY3JpcHRpb25QYXRoLCBzVmFsdWUsIHNEZXNjcmlwdGlvblZhbHVlLCBzRnVsbFRleHQ7XG5cdFx0aWYgKG9UZXh0QmluZGluZyAmJiAob1RleHRCaW5kaW5nLnBhdGggfHwgKG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzICYmIG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCkpICYmIHNQcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG9UZXh0QmluZGluZy5wYXRoKSB7XG5cdFx0XHRcdGlmIChzRGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRcdHNWYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c0Rlc2NyaXB0aW9uVmFsdWUgPSBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChvVGV4dEJpbmRpbmcucGF0aCk7XG5cdFx0XHRcdFx0c0Z1bGxUZXh0ID0gc0Rlc2NyaXB0aW9uVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Rpc3BsYXlNb2RlID09PSBcIlZhbHVlXCIpIHtcblx0XHRcdFx0XHRzVmFsdWUgPSBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHkpO1xuXHRcdFx0XHRcdHNGdWxsVGV4dCA9IHNWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvVGV4dEJpbmRpbmcucGFyYW1ldGVycykge1xuXHRcdFx0XHRvVGV4dEJpbmRpbmcucGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcHM6IGFueSkge1xuXHRcdFx0XHRcdGlmIChvUHJvcHMucGF0aCAmJiBvUHJvcHMucGF0aCAhPT0gc1Byb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRzRGVzY3JpcHRpb25QYXRoID0gb1Byb3BzLnBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c1ZhbHVlID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc1Byb3BlcnR5KTtcblx0XHRcdFx0c0Rlc2NyaXB0aW9uVmFsdWUgPSBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzRGVzY3JpcHRpb25QYXRoKTtcblx0XHRcdFx0aWYgKHNEaXNwbGF5TW9kZSA9PT0gXCJWYWx1ZURlc2NyaXB0aW9uXCIgJiYgc1ZhbHVlICYmIHNEZXNjcmlwdGlvblZhbHVlKSB7XG5cdFx0XHRcdFx0c0Z1bGxUZXh0ID0gc1ZhbHVlICsgXCIgKFwiICsgc0Rlc2NyaXB0aW9uVmFsdWUgKyBcIilcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChzRGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25WYWx1ZVwiICYmIHNEZXNjcmlwdGlvblZhbHVlICYmIHNWYWx1ZSkge1xuXHRcdFx0XHRcdHNGdWxsVGV4dCA9IHNEZXNjcmlwdGlvblZhbHVlICsgXCIgKFwiICsgc1ZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwidGV4dEFycmFuZ2VtZW50XCI6IHNEaXNwbGF5TW9kZSxcblx0XHRcdFx0XCJ2YWx1ZVBhdGhcIjogc1Byb3BlcnR5LFxuXHRcdFx0XHRcImRlc2NyaXB0aW9uUGF0aFwiOiBzRGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcInZhbHVlXCI6IHNWYWx1ZSxcblx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBzRGVzY3JpcHRpb25WYWx1ZSxcblx0XHRcdFx0XCJmdWxsVGV4dFwiOiBzRnVsbFRleHRcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybiB0aGUgdmlzaWJpbGl0eSB2YWx1dWUgZm9yIHRoZSBNYW5hZ2VkT2JqZWN0IEFueS5cblx0ICpcblx0ICogQHBhcmFtIHtBbnlUeXBlfSBhbnkgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRpc0VkaXRhYmxlOiBmdW5jdGlvbiAoYW55OiBBbnlUeXBlKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYmluZGluZyA9IGFueS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXHRcdGNvbnN0IHZhbHVlID0gKGJpbmRpbmcgYXMgYW55KS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0cmV0dXJuIHZhbHVlID09PSBFZGl0TW9kZS5FZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHZpc2liaWxpdHkgb2YgbWFzcyBlZGl0IGZpZWxkIG9uIGNoYW5nZSBvZiB0aGUgTWFuYWdlZE9iamVjdCBBbnkgYmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqL1xuXHRvbkNvbnRleHRFZGl0YWJsZUNoYW5nZTogZnVuY3Rpb24gKG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvYmplY3RzRm9yVmlzaWJpbGl0eSA9IG9EaWFsb2dEYXRhTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgZGF0YVByb3BlcnR5ICsgXCIvb2JqZWN0c0ZvclZpc2liaWxpdHlcIikgfHwgW107XG5cdFx0Y29uc3QgZWRpdGFibGUgPSBvYmplY3RzRm9yVmlzaWJpbGl0eS5zb21lKE1hc3NFZGl0SGVscGVyLmlzRWRpdGFibGUpO1xuXG5cdFx0aWYgKGVkaXRhYmxlKSB7XG5cdFx0XHRvRGlhbG9nRGF0YU1vZGVsLnNldFByb3BlcnR5KFwiL3ZhbHVlcy9cIiArIGRhdGFQcm9wZXJ0eSArIFwiL3Zpc2libGVcIiwgZWRpdGFibGUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIE1hbmFnZWQgT2JqZWN0IEFueSBmb3IgdmlzaWJpbGl0eSBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkcy5cblx0ICpcblx0ICogQHBhcmFtIHtBbnlUeXBlfSBtT1RvVXNlIFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZXMgVmFsdWVzIG9mIHRoZSBmaWVsZC5cblx0ICovXG5cdHVwZGF0ZU9uQ29udGV4dENoYW5nZTogZnVuY3Rpb24gKG1PVG9Vc2U6IEFueVR5cGUsIG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcsIHZhbHVlczogYW55KSB7XG5cdFx0Y29uc3QgYmluZGluZyA9IG1PVG9Vc2UuZ2V0QmluZGluZyhcImFueVwiKTtcblxuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eSA9IHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eSB8fCBbXTtcblx0XHR2YWx1ZXMub2JqZWN0c0ZvclZpc2liaWxpdHkucHVzaChtT1RvVXNlKTtcblxuXHRcdGJpbmRpbmcuYXR0YWNoQ2hhbmdlKE1hc3NFZGl0SGVscGVyLm9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlLmJpbmQobnVsbCwgb0RpYWxvZ0RhdGFNb2RlbCwgZGF0YVByb3BlcnR5KSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBib3VuZCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmlsaXR5IG9mIGNvbnRleHRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0JpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+fSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMge0FueVR5cGV9IFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICovXG5cdGdldEJvdW5kT2JqZWN0OiBmdW5jdGlvbiAoZXhwQmluZGluZzogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+LCBjb250ZXh0OiBDb250ZXh0KTogQW55VHlwZSB7XG5cdFx0Y29uc3QgbU9Ub1VzZSA9IG5ldyBBbnkoeyBhbnk6IGV4cEJpbmRpbmcgfSk7XG5cdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0bU9Ub1VzZS5zZXRNb2RlbChtb2RlbCk7XG5cdFx0bU9Ub1VzZS5zZXRCaW5kaW5nQ29udGV4dChjb250ZXh0KTtcblxuXHRcdHJldHVybiBtT1RvVXNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZpZWxkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0JpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+fSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZXMgVmFsdWVzIG9mIHRoZSBmaWVsZC5cblx0ICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFzcyBlZGl0IGZpZWxkIGlzIGVkaXRhYmxlLlxuXHQgKi9cblx0Z2V0RmllbGRWaXNpYmxpdHk6IGZ1bmN0aW9uIChcblx0XHRleHBCaW5kaW5nOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz4sXG5cdFx0b0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLFxuXHRcdGRhdGFQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdHZhbHVlczogYW55LFxuXHRcdGNvbnRleHQ6IENvbnRleHRcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbU9Ub1VzZSA9IE1hc3NFZGl0SGVscGVyLmdldEJvdW5kT2JqZWN0KGV4cEJpbmRpbmcsIGNvbnRleHQpO1xuXHRcdGNvbnN0IGlzQ29udGV4dEVkaXRhYmxlID0gTWFzc0VkaXRIZWxwZXIuaXNFZGl0YWJsZShtT1RvVXNlKTtcblxuXHRcdGlmICghaXNDb250ZXh0RWRpdGFibGUpIHtcblx0XHRcdE1hc3NFZGl0SGVscGVyLnVwZGF0ZU9uQ29udGV4dENoYW5nZShtT1RvVXNlLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHksIHZhbHVlcyk7XG5cdFx0fVxuXHRcdHJldHVybiBpc0NvbnRleHRFZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBydW50aW1lIG1vZGVsOlxuXHQgKiA9PiBUaGUgbW9kZWwgY29uc2lzdHMgb2YgdmFsdWVzIHNob3duIGluIHRoZSBjb21ib0JveCBvZiB0aGUgZGlhbG9nIChMZWF2ZSBCbGFuaywgS2VlcCBFeGlzdGluZyBWYWx1ZXMsIG9yIGFueSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRleHQsIGV0Yy4pXG5cdCAqID0+IFRoZSBtb2RlbCB3aWxsIGNhcHR1cmUgcnVudGltZSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIHByb3BlcnR5ICh0aGUgdmFsdWUgZW50ZXJlZCBpbiB0aGUgY29tYm9Cb3gpLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIGkxOG5cblx0ICogQHJldHVybnMge29iamVjdH1cblx0ICovXG5cdHNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nOiBmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10sIG9EZWZhdWx0VmFsdWVzOiBhbnkpIHtcblx0XHRjb25zdCBhVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFVbml0RGF0YTogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUmVzdWx0czogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUmVhZE9ubHlGaWVsZEluZm86IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb0Rpc3RpbmN0VmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdGNvbnN0IG9EYXRhID0geyBcInZhbHVlc1wiOiBhVmFsdWVzLCBcInVuaXREYXRhXCI6IGFVbml0RGF0YSwgXCJyZXN1bHRzXCI6IGFSZXN1bHRzLCBcInJlYWRhYmxlUHJvcGVydHlEYXRhXCI6IGFSZWFkT25seUZpZWxkSW5mbyB9O1xuXHRcdGNvbnN0IG9EaWFsb2dEYXRhTW9kZWwgPSBuZXcgSlNPTk1vZGVsKG9EYXRhKTtcblx0XHRsZXQgc1Byb3BlcnR5TmFtZTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24gKG9EYXRhOiBhbnkpIHtcblx0XHRcdGxldCBvVGV4dEluZm87XG5cdFx0XHRpZiAob0RhdGEuZGF0YVByb3BlcnR5ICYmIG9EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IGFGaW5hbFBhdGggPSBNYXNzRWRpdEhlbHBlci5pbml0TGFzdExldmVsT2ZQcm9wZXJ0eVBhdGgob0RhdGEuZGF0YVByb3BlcnR5LCBhVmFsdWVzKTtcblx0XHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBvRGF0YS5kYXRhUHJvcGVydHkuc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRsZXQgc1Byb3BlcnR5S2V5O1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUGF0aFZhbHVlID0gYUNvbnRleHRzW2ldLmdldE9iamVjdChvRGF0YS5kYXRhUHJvcGVydHkpO1xuXHRcdFx0XHRcdHNQcm9wZXJ0eUtleSA9IG9EYXRhLmRhdGFQcm9wZXJ0eSArIFwiL1wiICsgc011bHRpTGV2ZWxQYXRoVmFsdWU7XG5cdFx0XHRcdFx0aWYgKCFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldICYmIGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dKSB7XG5cdFx0XHRcdFx0XHRvVGV4dEluZm8gPSBNYXNzRWRpdEhlbHBlci5nZXRUZXh0QXJyYW5nZW1lbnRJbmZvKFxuXHRcdFx0XHRcdFx0XHRvRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9EYXRhLnRleHRCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRvRGF0YS5lbnRpdHlTZXQsXG5cdFx0XHRcdFx0XHRcdGFDb250ZXh0c1tpXVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IHNNdWx0aUxldmVsUGF0aFZhbHVlLFxuXHRcdFx0XHRcdFx0XHRcImtleVwiOiBvRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eUtleV0gPSBzTXVsdGlMZXZlbFBhdGhWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSA9IGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0aWYgKG9EYXRhLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldID0gYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gfHwgW107XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhQ29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IGFDb250ZXh0c1tpXS5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRzUHJvcGVydHlOYW1lID0gb0RhdGEuZGF0YVByb3BlcnR5ICsgXCIvXCIgKyBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0RhdGEuZGF0YVByb3BlcnR5XSAmJiAhb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5TmFtZV0pIHtcblx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0b0RhdGEudGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmVudGl0eVNldCxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzW2ldXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFwia2V5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5TmFtZV0gPSBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5ICYmIG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV0pIHtcblx0XHRcdFx0XHRcdHNQcm9wZXJ0eU5hbWUgPSBvRGF0YS51bml0UHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eU5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdG9EYXRhLnRleHRCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRcdG9EYXRhLmVudGl0eVNldCxcblx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHNbaV1cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBvRGF0YU9iamVjdFtvRGF0YS51bml0UHJvcGVydHldLFxuXHRcdFx0XHRcdFx0XHRcdFwia2V5XCI6IG9EYXRhLnVuaXRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5TmFtZV0gPSBvRGF0YU9iamVjdFtvRGF0YS51bml0UHJvcGVydHldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0RhdGE6IGFueSkge1xuXHRcdFx0bGV0IHZhbHVlczogYW55O1xuXHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSA9IE1hc3NFZGl0SGVscGVyLmdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgob0RhdGEuZGF0YVByb3BlcnR5LCBhVmFsdWVzKTtcblx0XHRcdFx0aWYgKCFzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUpIHtcblx0XHRcdFx0XHRzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUucHVzaCh7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBcIkVtcHR5L1wiICsgb0RhdGEuZGF0YVByb3BlcnR5IH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUsIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZXMgPSBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSAmJiBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ubGVuZ3RoKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhKTtcblx0XHRcdFx0dmFsdWVzID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhLCB0cnVlKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChvRGF0YS5kYXRhUHJvcGVydHkgJiYgYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ubGVuZ3RoKSB8fFxuXHRcdFx0XHQob0RhdGEudW5pdFByb3BlcnR5ICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5sZW5ndGgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uIChvYmo6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50ZXh0ID09PSBcIjwgQ2xlYXIgVmFsdWVzID5cIiB8fCBvYmoudGV4dCA9PT0gXCI8IExlYXZlIEJsYW5rID5cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eSAmJiAhYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMpIHtcblx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ucHVzaCh7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBcIkVtcHR5L1wiICsgb0RhdGEuZGF0YVByb3BlcnR5IH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cyA9XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5zb21lKGZ1bmN0aW9uIChvYmo6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50ZXh0ID09PSBcIjwgQ2xlYXIgVmFsdWVzID5cIiB8fCBvYmoudGV4dCA9PT0gXCI8IExlYXZlIEJsYW5rID5cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9EYXRhLnVuaXRQcm9wZXJ0eSAmJiAhYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzKSB7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHR0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsXG5cdFx0XHRcdFx0XHRrZXk6IFwiRW1wdHkvXCIgKyBvRGF0YS51bml0UHJvcGVydHlcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJiB0eXBlb2Ygb0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7IFwicHJvcGVydHlcIjogb0RhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZTogb0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5LCB0eXBlOiBcIkRlZmF1bHRcIiB9KTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHMgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdICYmXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDJcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBSZWFkT25seUV4cHJlc3Npb24gY2hhbmdlXG5cdFx0XHRcdGFSZWFkT25seUZpZWxkSW5mby5wdXNoKHtcblx0XHRcdFx0XHRcInByb3BlcnR5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGg6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMS5wYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWU6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMi52YWx1ZSxcblx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0dGluZyB2aXNiaWxpdHkgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0XHRcdGlmIChvRGF0YS5lZGl0TW9kZSkge1xuXHRcdFx0XHR2YWx1ZXMudmlzaWJsZSA9XG5cdFx0XHRcdFx0b0RhdGEuZWRpdE1vZGUgPT09IEVkaXRNb2RlLkVkaXRhYmxlIHx8XG5cdFx0XHRcdFx0YUNvbnRleHRzLnNvbWUoXG5cdFx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5nZXRGaWVsZFZpc2libGl0eS5iaW5kKE1hc3NFZGl0SGVscGVyLCBvRGF0YS5lZGl0TW9kZSwgb0RpYWxvZ0RhdGFNb2RlbCwgb0RhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZXMpXG5cdFx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gb0RpYWxvZ0RhdGFNb2RlbDtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBtYXNzIGVkaXQgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1RhYmxlIEluc3RhbmNlIG9mIFRhYmxlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbGxlciBDb250cm9sbGVyIGZvciB0aGUgdmlld1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIHJldHVybmluZyBpbnN0YW5jZSBvZiBkaWFsb2cuXG5cdCAqL1xuXHRjcmVhdGVEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpIHtcblx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9tYXNzRWRpdC9NYXNzRWRpdERpYWxvZ1wiLFxuXHRcdFx0YURhdGFBcnJheTogYW55W10gPSBbXSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0XHRvRGVmYXVsdFZhbHVlcyA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRUZXh0c0ZvckRpYWxvZyhvUmVzb3VyY2VCdW5kbGUsIGFDb250ZXh0cy5sZW5ndGgsIG9UYWJsZSksXG5cdFx0XHRvRGF0YUZpZWxkTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5wcmVwYXJlRGF0YUZvckRpYWxvZyhvVGFibGUsIGFDb250ZXh0cywgYURhdGFBcnJheSksXG5cdFx0XHRvRGlhbG9nRGF0YU1vZGVsID0gTWFzc0VkaXRIZWxwZXIuc2V0UnVudGltZU1vZGVsT25EaWFsb2coYUNvbnRleHRzLCBhRGF0YUFycmF5LCBvRGVmYXVsdFZhbHVlcyk7XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0ZyYWdtZW50IH0pLnRoZW4oZnVuY3Rpb24gKG9EaWFsb2dDb250ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IG9EZWZhdWx0VmFsdWVzLm1hc3NFZGl0VGl0bGUsXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IFtvRGlhbG9nQ29udGVudF0sXG5cdFx0XHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvRGVmYXVsdFZhbHVlcy5hcHBseUJ1dHRvblRleHQsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9EaWFsb2cuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3VsdHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVzdWx0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVJlYWRhYmxlSW5mbyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWFkYWJsZVByb3BlcnR5RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZVByb21pc2U6IGFueVtdID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlJlYWRPbmx5RmllbGQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBncm91cElkO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbiAob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlID09PSBvUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvcGVydHlJbmZvLnZhbHVlID09PSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiUGF0aFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aCkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncm91cElkID0gXCIkYXV0by5cIiArIGluZGV4O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluZGV4ICs9IDE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgJiYgb1Jlc3VsdC52YWx1ZSAhPT0gXCJEZWZhdWx0XCIgJiYgIWJSZWFkT25seUZpZWxkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VQcm9taXNlLnB1c2gob1NlbGVjdGVkQ29udGV4dC5zZXRQcm9wZXJ0eShvUmVzdWx0LmtleVZhbHVlLCBvUmVzdWx0LnZhbHVlLCBncm91cElkKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGNoYW5nZVByb21pc2UpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXh0ZW5zaW9uQVBJID0gb0NvbnRyb2xsZXIgJiYgKG9Db250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9FeHRlbnNpb25BUEkucmVmcmVzaChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9SZXM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL1RPRE8gLSBBZGQgZXJyb3IgaGFuZGxpbmcgcGFydCBmb3IgdGhlIERpYWxvZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHVwZGF0aW5nIGVudHJpZXMuXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuY2FuY2VsQnV0dG9uVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9EaWFsb2dEYXRhTW9kZWwsIFwiZmllbGRzSW5mb1wiKTtcblx0XHRcdFx0XHRcdHJlc29sdmUob0RpYWxvZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdH0pO1xuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXNzRWRpdEhlbHBlcjtcbiJdfQ==
|
|
1006
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwiZ2V0SW5wdXRUeXBlIiwicHJvcGVydHlJbmZvIiwiZGF0YUZpZWxkQ29udmVydGVkIiwib0RhdGFNb2RlbFBhdGgiLCJlZGl0U3R5bGVQcm9wZXJ0aWVzIiwiaW5wdXRUeXBlIiwic2V0RWRpdFN0eWxlUHJvcGVydGllcyIsImVkaXRTdHlsZSIsImlzVmFsaWRGb3JNYXNzRWRpdCIsImlzQ29sbGVjdGlvbkZpZWxkIiwiaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIiwiZ2V0SXNGaWVsZEdycCIsIiRUeXBlIiwiVGFyZ2V0IiwidmFsdWUiLCJnZXRUZXh0UGF0aCIsInByb3BlcnR5IiwidGV4dEJpbmRpbmciLCJkaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJwYXJhbWV0ZXJzIiwicHJvcHMiLCJwcmVwYXJlRGF0YUZvckRpYWxvZyIsIm9UYWJsZSIsImFEYXRhQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzQ3VycmVudEVudGl0eVNldE5hbWUiLCJkYXRhIiwiYVRhYmxlRmllbGRzIiwiZ2V0VGFibGVGaWVsZHMiLCJvRW50aXR5VHlwZUNvbnRleHQiLCJnZXRDb250ZXh0Iiwib0VudGl0eVNldENvbnRleHQiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm9EYXRhRmllbGRNb2RlbCIsIkpTT05Nb2RlbCIsIm9SZXN1bHQiLCJzTGFiZWxUZXh0IiwiYlZhbHVlSGVscEVuYWJsZWQiLCJzVW5pdFByb3BlcnR5UGF0aCIsImJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsIm9UZXh0QmluZGluZyIsIm9Db2x1bW5JbmZvIiwiZGF0YVByb3BlcnR5Iiwib1Byb3BlcnR5SW5mbyIsImxhYmVsIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwiZ2V0VGV4dEJpbmRpbmciLCJvRmllbGRDb250ZXh0IiwiYW5ub3RhdGlvblBhdGgiLCJvRGF0YUZpZWxkQ29udmVydGVkIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJvUHJvcGVydHlDb250ZXh0Iiwib0ludGVyZmFjZSIsImdldEludGVyZmFjZSIsIlZhbHVlIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJiSGlkZGVuRmllbGQiLCJpc0ltYWdlIiwiY29udGV4dCIsImdldFBhdGgiLCJfdHlwZSIsIiR0YXJnZXQiLCJjaGFydFByb3BlcnR5IiwidGVybSIsImlzQWN0aW9uIiwiQWN0aW9uIiwiaXNGaWVsZEdycCIsImhhc1ZhbHVlSGVscCIsImhhc0N1cnJlbmN5IiwiaGFzVW5pdCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwidW5pdFByb3BlcnR5SW5mbyIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCIsImV4cEJpbmRpbmciLCJnZXRFZGl0TW9kZSIsImNvbnN0YW50IiwiZWRpdE1vZGVWYWx1ZXMiLCJPYmplY3QiLCJrZXlzIiwiRWRpdE1vZGUiLCJlZGl0TW9kZUlzU3RhdGljIiwiaW5jbHVkZXMiLCJlZGl0YWJsZSIsIkVkaXRhYmxlIiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiQ29tbW9uVXRpbHMiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInNldERhdGEiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJjb2x1bW5zRGF0YSIsImdldFBhcmVudCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJtYXAiLCJvQ29sdW1uIiwic0RhdGFQcm9wZXJ0eSIsImdldERhdGFQcm9wZXJ0eSIsImFSZWFsdGVkQ29sdW1uSW5mbyIsInR5cGUiLCJnZXRIZWFkZXIiLCJnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2ciLCJvUmVzb3VyY2VCdW5kbGUiLCJpU2VsZWN0ZWRDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImdldFRleHQiLCJ0b1N0cmluZyIsInNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyIsIm9EZWZhdWx0VmFsdWVzIiwiYlVPTUZpZWxkIiwidW5pdFByb3BlcnR5Iiwic0lucHV0VHlwZSIsImJQcm9wZXJ0eVJlcXVpcmVkIiwiaXNGaWVsZFJlcXVpcmVkIiwic1N1ZmZpeEZvcktlZXBFeGlzdGluZyIsImRlZmF1bHRPcHRpb25zIiwic2VsZWN0T3B0aW9uc0V4aXN0Iiwic2VsZWN0T3B0aW9ucyIsImtlZXBFbnRyeSIsInRleHQiLCJrZWVwRXhpc3RpbmdQcmVmaXgiLCJrZXkiLCJmYWxzZUVudHJ5IiwidGV4dEluZm8iLCJ0cnV0aHlFbnRyeSIsInVuc2hpZnQiLCJpc1ZhbHVlSGVscEVuYWJsZWQiLCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0IiwidmhkRW50cnkiLCJ1c2VWYWx1ZUhlbHBWYWx1ZSIsImNsZWFyRW50cnkiLCJjbGVhckZpZWxkVmFsdWUiLCJlbXB0eUVudHJ5IiwibGVhdmVCbGFua1ZhbHVlIiwiZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyIsInNlbGVjdGVkQ29udGV4dCIsImRlc2NyaXB0aW9uVmFsdWUiLCJmdWxsVGV4dCIsIkxvZyIsImluZm8iLCJpc0VkaXRhYmxlIiwiYW55IiwiYmluZGluZyIsImdldEJpbmRpbmciLCJnZXRFeHRlcm5hbFZhbHVlIiwib25Db250ZXh0RWRpdGFibGVDaGFuZ2UiLCJvRGlhbG9nRGF0YU1vZGVsIiwib2JqZWN0c0ZvclZpc2liaWxpdHkiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwidXBkYXRlT25Db250ZXh0Q2hhbmdlIiwibU9Ub1VzZSIsInZhbHVlcyIsImF0dGFjaENoYW5nZSIsImJpbmQiLCJnZXRCb3VuZE9iamVjdCIsIkFueSIsIm1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEZpZWxkVmlzaWJsaXR5IiwiaXNDb250ZXh0RWRpdGFibGUiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImRpYWxvZ0NvbnRleHQiLCJhVW5pdERhdGEiLCJhUmVzdWx0cyIsImFSZWFkT25seUZpZWxkSW5mbyIsIm9EYXRhIiwibm9GaWVsZHMiLCJvSW5EYXRhIiwib1RleHRJbmZvIiwic1Byb3BlcnR5S2V5Iiwic1VuaXRQcm9wZXJ0eU5hbWUiLCJvRGlzdGluY3RWYWx1ZU1hcCIsIm9EaXN0aW5jdFVuaXRNYXAiLCJzTXVsdGlMZXZlbFBhdGhWYWx1ZSIsImRpc3BsYXkiLCJ2YWx1ZVBhdGgiLCJlbnRyeSIsInVuaXRFbnRyeSIsInNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSIsInNlbGVjdGVkS2V5IiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJvcGVyYW5kcyIsIm9wZXJhbmQxIiwib3BlcmFuZDIiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiZWRpdE1vZGUiLCJ2aXNpYmxlIiwiZ2V0RGlhbG9nQ29udGV4dCIsInRhYmxlIiwiZGlhbG9nIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImxpc3RCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJHVwZGF0ZUdyb3VwSWQiLCJyZWZyZXNoSW50ZXJuYWwiLCJjcmVhdGUiLCJvbkRpYWxvZ09wZW4iLCJldmVudCIsInNvdXJjZSIsImdldFNvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsImNyZWF0ZURpYWxvZyIsIm9Db250cm9sbGVyIiwic0ZyYWdtZW50TmFtZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImJpbmRpbmdDb250ZXh0cyIsImRhdGFGaWVsZE1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJtb2RlbHMiLCJ0aGVuIiwib0NyZWF0ZWRGcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIkRyYWZ0U3RhdHVzIiwiRkVMaWJyYXJ5Iiwib0RpYWxvZyIsIkRpYWxvZyIsInJlc2l6YWJsZSIsInRpdGxlIiwibWFzc0VkaXRUaXRsZSIsImNvbnRlbnQiLCJhZnRlck9wZW4iLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsImhlbHBlcnMiLCJnZXRFeHBCaW5kaW5nRm9yQXBwbHlCdXR0b25UeHQiLCJwcmVzcyIsIm9FdmVudCIsImdldFZpZXciLCJvSW5EaWFsb2ciLCJvTW9kZWwiLCJhUHJvcGVydHlSZWFkYWJsZUluZm8iLCJjaGFuZ2VQcm9taXNlIiwiYlJlYWRPbmx5RmllbGQiLCJncm91cElkIiwiZXJyb3JWYWx1ZXMiLCJpZHgiLCJrZXlWYWx1ZSIsIl9lZGl0RmxvdyIsInNldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwiY2F0Y2giLCJvRXJyb3IiLCJlcnJvciIsImFsbFNldHRsZWQiLCJvTGlzdEJpbmRpbmciLCJvRXh0ZW5zaW9uQVBJIiwiZ2V0RXh0ZW5zaW9uQVBJIiwicmVmcmVzaCIsInN1YnRpdGxlQ29sdW1uIiwiZ2V0TWVzc2FnZUNvbHVtbiIsIm1lc3NhZ2VzIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cyIsIm1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0cyIsImdldFRhcmdldHMiLCJwZXJzaXN0ZW50IiwiYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0IiwiZmluZCIsImdldFRhcmdldCIsImFkZGl0aW9uYWxUZXh0IiwiU2F2ZWQiLCJzdWNjZXNzVG9hc3QiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIkNsZWFyIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJzaG93TWVzc2FnZXMiLCJpc09wZW4iLCJjbG9zZSIsImRlc3Ryb3kiLCJlbmRCdXR0b24iLCJjYW5jZWxCdXR0b25UZXh0IiwiaGFzRWRpdGFibGVGaWVsZHNCaW5kaW5nIiwiZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzIiwiZmllbGRzIiwidG90YWxFeHAiLCJyZWR1Y2UiLCJleHByZXNzaW9uIiwiZmllbGQiLCJvciIsInBhdGhJbk1vZGVsIiwibm90IiwiZGVmYXVsdFZhbHVlcyIsImVkaXRhYmxlRXhwIiwiaWZFbHNlIiwiYXBwbHlCdXR0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QUFFLFVBQUNFLE1BQUQsRUFBYy9OLFFBQWQsRUFBb0M7QUFDN0QsZUFBTzRPLGlCQUFpQixDQUFDOVcsY0FBYyxDQUFDdVMsT0FBZixDQUF1QnlELGlDQUF2QixDQUF5REMsTUFBekQsRUFBaUUvTixRQUFqRSxDQUFELENBQXhCO0FBQ0E7QUFyQk87QUExOUJhLEdBQXZCO1NBbS9CZWxJLGMiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHtcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRpZkVsc2UsXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGhhc0N1cnJlbmN5LFxuXHRoYXNVbml0LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvRmllbGQubWV0YWRhdGFcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEVkaXRNb2RlIGZyb20gXCJzYXAvdWkvbWRjL2VudW0vRWRpdE1vZGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBDb3JlRXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vY29udHJvbHMvQW55XCI7XG5pbXBvcnQgQW55IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRFZGl0TW9kZSwgZ2V0UmVxdWlyZWRFeHByZXNzaW9uLCBpc0NvbGxlY3Rpb25GaWVsZCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCIuL01vZGVsSGVscGVyXCI7XG5cbi8qIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVycyB0byBiZSB1c2VkIGZvciBtYXNzIGVkaXQgZnVuY3Rpb25hbGl0eSAqL1xudHlwZSBUZXh0QXJyYW5nZW1lbnRJbmZvID0ge1xuXHR0ZXh0QXJyYW5nZW1lbnQ6IHN0cmluZztcblx0dmFsdWVQYXRoOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uUGF0aD86IHN0cmluZztcblx0dmFsdWU6IHN0cmluZztcblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0ZnVsbFRleHQ6IHN0cmluZztcbn07XG5cbnR5cGUgQmluZGluZ0luZm8gPSB7XG5cdHBhdGg/OiBzdHJpbmc7XG5cdG1vZGVsPzogc3RyaW5nIHwgb2JqZWN0O1xuXHRwYXJhbWV0ZXJzPzogQXJyYXk8QmluZGluZ0luZm8+O1xufTtcblxuY29uc3QgTWFzc0VkaXRIZWxwZXIgPSB7XG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgdmFsdWUgYXQgZmluYWwgb3IgZGVlcGVzdCBsZXZlbCBwYXRoIHdpdGggYSBibGFuayBhcnJheS5cblx0ICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IHBvaW50aW5nIHRvIHRoZSBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIHBhdGhcblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIGFWYWx1ZXM6IGFueSAvKiwgdHJhbnNDdHg6IENvbnRleHQgKi8pIHtcblx0XHRsZXQgYUZpbmFsUGF0aDogYW55O1xuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgYVBhdGhzID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBzRnVsbFBhdGggPSBcIlwiO1xuXHRcdGFQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGlmICghYVZhbHVlc1tzUHJvcGVydHlQYXRoXSAmJiBpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdGFGaW5hbFBhdGggPSBhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fSBlbHNlIGlmICghYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRzRnVsbFBhdGggPSBgJHtzRnVsbFBhdGh9LyR7c1Byb3BlcnR5UGF0aH1gO1xuXHRcdFx0XHRpZiAoc0Z1bGxQYXRoICE9PSBzUGF0aCkge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0XHRhRmluYWxQYXRoID0gYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gYUZpbmFsUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB1bmlxdWUgdmFsdWVzIGZvciBnaXZlbiBhcnJheSB2YWx1ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVmFsdWUgUHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0gc2VsZiBJbnN0YW5jZSBvZiB0aGUgYXJyYXlcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSB2YWx1ZVxuXHQgKi9cblx0Z2V0VW5pcXVlVmFsdWVzOiBmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHNlbGY6IGFueVtdKSB7XG5cdFx0aWYgKHNWYWx1ZSAhPSB1bmRlZmluZWQgJiYgc1ZhbHVlICE9IG51bGwpIHtcblx0XHRcdHJldHVybiBzZWxmLmluZGV4T2Yoc1ZhbHVlKSA9PT0gaW5kZXg7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgYSBtdWx0aS1sZXZlbCBwYXRoIChmb3IgZXhhbXBsZTogX01hdGVyaWFscy9NYXRlcmlhbF9EZXRhaWxzIGdldHMgdGhlIHZhbHVlIG9mIE1hdGVyaWFsX0RldGFpbHMgdW5kZXIgX01hdGVyaWFscyBPYmplY3QpLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eVZhbHVlLCB3aGljaCBjYW4gYmUgb2YgYW55IHR5cGUgKHN0cmluZywgbnVtYmVyLCBldGMuLikuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRGF0YVByb3BlcnR5UGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBvVmFsdWVzIE9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXNcblx0ICogQHJldHVybnMgVGhlIHByb3BlcnR5IHZhbHVlXG5cdCAqL1xuXHRnZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoOiBmdW5jdGlvbiAoc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZywgb1ZhbHVlczogYW55KSB7XG5cdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoICYmIHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRsZXQgUmVzdWx0OiBhbnk7XG5cdFx0XHRhUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFJlc3VsdCA9IG9WYWx1ZXMgJiYgb1ZhbHVlc1tzUGF0aF0gPyBvVmFsdWVzW3NQYXRoXSA6IFJlc3VsdCAmJiBSZXN1bHRbc1BhdGhdO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gUmVzdWx0O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUga2V5IHBhdGggZm9yIHRoZSBrZXkgb2YgYSBjb21ibyBib3ggdGhhdCBtdXN0IGJlIHNlbGVjdGVkIGluaXRpYWxseSB3aGVuIHRoZSBkaWFsb2cgb3BlbnM6XG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyBkaWZmZXJlbnQsIHRoZW4gPCBLZWVwIEV4aXN0aW5nIFZhbHVlcyA+IGlzIHByZXNlbGVjdGVkLlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgdGhlIHNhbWUsIHRoZW4gdGhlIHByb3BlcnR5VmFsdWUgaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyBlbXB0eSwgdGhlbiA8IExlYXZlIEJsYW5rID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqXG5cdCAqXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gc0RhdGFQcm9wZXJ0eVBhdGggRGF0YSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBrZXkgcGF0aFxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIHNEYXRhUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9TZWxlY3RlZENvbnRleHQgPSBhQ29udGV4dHMsXG5cdFx0XHRcdGFQcm9wZXJ0eVZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdG9TZWxlY3RlZENvbnRleHQuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24gPVxuXHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gLTEgJiYgb0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzBdKTtcblx0XHRcdFx0aWYgKG9Db250ZXh0ICYmIChvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aCkgfHwgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVZhbHVlcy5wdXNoKG9Db250ZXh0LmdldE9iamVjdChzRGF0YVByb3BlcnR5UGF0aCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFVbmlxdWVQcm9wZXJ0eVZhbHVlcyA9IGFQcm9wZXJ0eVZhbHVlcy5maWx0ZXIoTWFzc0VkaXRIZWxwZXIuZ2V0VW5pcXVlVmFsdWVzKTtcblx0XHRcdGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRyZXR1cm4gYERlZmF1bHQvJHtzRGF0YVByb3BlcnR5UGF0aH1gO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiBgRW1wdHkvJHtzRGF0YVByb3BlcnR5UGF0aH1gO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBgJHtzRGF0YVByb3BlcnR5UGF0aH0vJHthVW5pcXVlUHJvcGVydHlWYWx1ZXNbMF19YDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBoaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSBbYm90aCBzdGF0aWMgYW5kIHBhdGggYmFzZWRdIGZvciB0YWJsZSdzIHNlbGVjdGVkIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBoaWRkZW5WYWx1ZSBIaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSAvIHBhdGggZm9yIGZpZWxkXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcmV0dXJucyBUaGUgaGlkZGVuIGFubm90YXRpb24gdmFsdWVcblx0ICovXG5cdGdldEhpZGRlblZhbHVlRm9yQ29udGV4dHM6IGZ1bmN0aW9uIChoaWRkZW5WYWx1ZTogYW55LCBhQ29udGV4dHM6IGFueVtdKSB7XG5cdFx0aWYgKGhpZGRlblZhbHVlICYmIGhpZGRlblZhbHVlLiRQYXRoKSB7XG5cdFx0XHRyZXR1cm4gIWFDb250ZXh0cy5zb21lKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZTogZnVuY3Rpb24gKHByb3BlcnR5SW5mbzogYW55LCBkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSwgb0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZFByb3BlcnRpZXM7XG5cdFx0bGV0IGlucHV0VHlwZSE6IHN0cmluZztcblx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgsIHRydWUpO1xuXHRcdFx0aW5wdXRUeXBlID0gZWRpdFN0eWxlUHJvcGVydGllcz8uZWRpdFN0eWxlIHx8IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IGlzVmFsaWRGb3JNYXNzRWRpdCA9XG5cdFx0XHRpbnB1dFR5cGUgJiZcblx0XHRcdFtcIkRhdGVQaWNrZXJcIiwgXCJUaW1lUGlja2VyXCIsIFwiRGF0ZVRpbWVQaWNrZXJcIiwgXCJSYXRpbmdJbmRpY2F0b3JcIl0uaW5kZXhPZihpbnB1dFR5cGUpID09PSAtMSAmJlxuXHRcdFx0IWlzQ29sbGVjdGlvbkZpZWxkKG9EYXRhTW9kZWxQYXRoKSAmJlxuXHRcdFx0IWhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyhwcm9wZXJ0eUluZm8pO1xuXG5cdFx0cmV0dXJuIChpc1ZhbGlkRm9yTWFzc0VkaXQgfHwgXCJcIikgJiYgaW5wdXRUeXBlO1xuXHR9LFxuXG5cdGdldElzRmllbGRHcnA6IGZ1bmN0aW9uIChkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUuaW5kZXhPZihcIkZpZWxkR3JvdXBcIikgPiAtMVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IHBhdGggZm9yIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB0ZXh0QmluZGluZyBUZXh0IEJpbmRpbmcgSW5mb1xuXHQgKiBAcGFyYW0gZGlzcGxheU1vZGUgRGlzcGxheSBtb2RlXG5cdCAqIEByZXR1cm5zIFRleHQgUHJvcGVydHkgUGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldFRleHRQYXRoOiBmdW5jdGlvbiAocHJvcGVydHk6IHN0cmluZywgdGV4dEJpbmRpbmc6IGFueSwgZGlzcGxheU1vZGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGRlc2NyaXB0aW9uUGF0aDtcblx0XHRpZiAodGV4dEJpbmRpbmcgJiYgKHRleHRCaW5kaW5nLnBhdGggfHwgKHRleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgdGV4dEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGgpKSAmJiBwcm9wZXJ0eSkge1xuXHRcdFx0aWYgKHRleHRCaW5kaW5nLnBhdGggJiYgZGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRkZXNjcmlwdGlvblBhdGggPSB0ZXh0QmluZGluZy5wYXRoO1xuXHRcdFx0fSBlbHNlIGlmICh0ZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdHRleHRCaW5kaW5nLnBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvcHM6IEJpbmRpbmdJbmZvKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BzLnBhdGggJiYgcHJvcHMucGF0aCAhPT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aCA9IHByb3BzLnBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlc2NyaXB0aW9uUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBKU09OIE1vZGVsIGZvciBwcm9wZXJ0aWVzIG9mIGRpYWxvZyBmaWVsZHMgW2xhYmVsLCB2aXNpYmxpdHksIGRhdGFwcm9wZXJ0eSwgZXRjLl0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBtb2RlbFxuXHQgKi9cblx0cHJlcGFyZURhdGFGb3JEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBhRGF0YUFycmF5OiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSksXG5cdFx0XHRzQ3VycmVudEVudGl0eVNldE5hbWUgPSBvVGFibGUuZGF0YShcIm1ldGFQYXRoXCIpLFxuXHRcdFx0YVRhYmxlRmllbGRzID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGFibGVGaWVsZHMob1RhYmxlKSxcblx0XHRcdG9FbnRpdHlUeXBlQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9L0BgKSxcblx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KHNDdXJyZW50RW50aXR5U2V0TmFtZSksXG5cdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRW50aXR5VHlwZUNvbnRleHQpO1xuXG5cdFx0Y29uc3Qgb0RhdGFGaWVsZE1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdGxldCBvUmVzdWx0O1xuXHRcdGxldCBzTGFiZWxUZXh0O1xuXHRcdGxldCBiVmFsdWVIZWxwRW5hYmxlZDtcblx0XHRsZXQgc1VuaXRQcm9wZXJ0eVBhdGg7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdDtcblx0XHRsZXQgb1RleHRCaW5kaW5nO1xuXG5cdFx0YVRhYmxlRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHlQYXRoID0gb0NvbHVtbkluZm8uZGF0YVByb3BlcnR5O1xuXHRcdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdGxldCBvUHJvcGVydHlJbmZvID0gc0RhdGFQcm9wZXJ0eVBhdGggJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofUBgKTtcblx0XHRcdFx0c0xhYmVsVGV4dCA9XG5cdFx0XHRcdFx0b0NvbHVtbkluZm8ubGFiZWwgfHxcblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbFwiXSkgfHxcblx0XHRcdFx0XHRvQ29sdW1uSW5mby5kYXRhUHJvcGVydHk7XG5cblx0XHRcdFx0aWYgKG9EYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0XHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAoXG5cdFx0XHRcdFx0XHRvUHJvcGVydHk6IGFueVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eS5uYW1lID09PSBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3RbMF0gfHwge307XG5cdFx0XHRcdG9UZXh0QmluZGluZyA9IGdldFRleHRCaW5kaW5nKG9EYXRhTW9kZWxPYmplY3RQYXRoLCB7fSwgdHJ1ZSkgfHwge307XG5cdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQob0NvbHVtbkluZm8uYW5ub3RhdGlvblBhdGgpLFxuXHRcdFx0XHRcdG9EYXRhRmllbGRDb252ZXJ0ZWQgPSBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvRmllbGRDb250ZXh0KSxcblx0XHRcdFx0XHRvUHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vJHtzRGF0YVByb3BlcnR5UGF0aH1AYCksXG5cdFx0XHRcdFx0b0ludGVyZmFjZSA9IG9Qcm9wZXJ0eUNvbnRleHQgJiYgb1Byb3BlcnR5Q29udGV4dC5nZXRJbnRlcmZhY2UoKTtcblxuXHRcdFx0XHRsZXQgb0RhdGFNb2RlbFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0ZpZWxkQ29udGV4dCwgb0VudGl0eVNldENvbnRleHQpO1xuXHRcdFx0XHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZD8uVmFsdWU/LnBhdGg/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKG9EYXRhTW9kZWxQYXRoLCBzRGF0YVByb3BlcnR5UGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkhpZGRlbkZpZWxkID1cblx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5nZXRIaWRkZW5WYWx1ZUZvckNvbnRleHRzKFxuXHRcdFx0XHRcdFx0b0ZpZWxkQ29udGV4dCAmJiBvRmllbGRDb250ZXh0LmdldE9iamVjdCgpW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiXSxcblx0XHRcdFx0XHRcdGFDb250ZXh0c1xuXHRcdFx0XHRcdCkgfHwgZmFsc2U7XG5cdFx0XHRcdGNvbnN0IGlzSW1hZ2UgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSXNJbWFnZVVSTFwiXTtcblxuXHRcdFx0XHRvSW50ZXJmYWNlLmNvbnRleHQgPSB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvSW50ZXJmYWNlLmdldE1vZGVsKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXRQYXRoOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvUHJvcGVydHlJbmZvID1cblx0XHRcdFx0XHRvRGF0YUZpZWxkQ29udmVydGVkLl90eXBlID09PSBcIlByb3BlcnR5XCJcblx0XHRcdFx0XHRcdD8gb0RhdGFGaWVsZENvbnZlcnRlZFxuXHRcdFx0XHRcdFx0OiAob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUuJHRhcmdldCkgfHxcblx0XHRcdFx0XHRcdCAgKG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQuJHRhcmdldCk7XG5cdFx0XHRcdC8vIERhdGFmaWVsZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEZpZWxkQ29udHJvbCBjYWxjdWxhdGlvbiwgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWRcblxuXHRcdFx0XHRjb25zdCBjaGFydFByb3BlcnR5ID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLnRlcm0gJiYgb1Byb3BlcnR5SW5mby50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aW9uID0gISFvRGF0YUZpZWxkQ29udmVydGVkLkFjdGlvbjtcblx0XHRcdFx0Y29uc3QgaXNGaWVsZEdycCA9IE1hc3NFZGl0SGVscGVyLmdldElzRmllbGRHcnAob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cblx0XHRcdFx0aWYgKGlzSW1hZ2UgfHwgYkhpZGRlbkZpZWxkIHx8IGNoYXJ0UHJvcGVydHkgfHwgaXNBY3Rpb24gfHwgaXNGaWVsZEdycCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFZhbHVlSGVscCBwcm9wZXJ0aWVzXG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkID0gaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRzVW5pdFByb3BlcnR5UGF0aCA9XG5cdFx0XHRcdFx0KChoYXNDdXJyZW5jeShvUHJvcGVydHlJbmZvKSB8fCBoYXNVbml0KG9Qcm9wZXJ0eUluZm8pKSAmJiBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChvUHJvcGVydHlJbmZvKSkgfHwgXCJcIjtcblx0XHRcdFx0Y29uc3QgdW5pdFByb3BlcnR5SW5mbyA9IHNVbml0UHJvcGVydHlQYXRoICYmIGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA9IHVuaXRQcm9wZXJ0eUluZm8gJiYgaGFzVmFsdWVIZWxwKHVuaXRQcm9wZXJ0eUluZm8pO1xuXG5cdFx0XHRcdC8vIEVkaXRNb2RlIGFuZCBJbnB1dFR5cGVcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlGb3JGaWVsZENvbnRyb2wgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm8uVmFsdWUgPyBvUHJvcGVydHlJbmZvLlZhbHVlIDogb1Byb3BlcnR5SW5mbztcblx0XHRcdFx0Y29uc3QgZXhwQmluZGluZyA9IGdldEVkaXRNb2RlKHByb3BlcnR5Rm9yRmllbGRDb250cm9sLCBvRGF0YU1vZGVsUGF0aCwgZmFsc2UsIGZhbHNlLCBvRGF0YUZpZWxkQ29udmVydGVkLCBjb25zdGFudCh0cnVlKSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlVmFsdWVzID0gT2JqZWN0LmtleXMoRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0TW9kZUlzU3RhdGljID0gISFleHBCaW5kaW5nICYmIGVkaXRNb2RlVmFsdWVzLmluY2x1ZGVzKGV4cEJpbmRpbmcgYXMgRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0YWJsZSA9ICEhZXhwQmluZGluZyAmJiAoKGVkaXRNb2RlSXNTdGF0aWMgJiYgZXhwQmluZGluZyA9PT0gRWRpdE1vZGUuRWRpdGFibGUpIHx8ICFlZGl0TW9kZUlzU3RhdGljKTtcblxuXHRcdFx0XHRpZiAoIWVkaXRhYmxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5wdXRUeXBlID0gTWFzc0VkaXRIZWxwZXIuZ2V0SW5wdXRUeXBlKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxQYXRoKTtcblxuXHRcdFx0XHRpZiAoaW5wdXRUeXBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRcdG9SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcImxhYmVsXCI6IHNMYWJlbFRleHQsXG5cdFx0XHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkXCI6IGJWYWx1ZUhlbHBFbmFibGVkID8gYlZhbHVlSGVscEVuYWJsZWQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwidW5pdFByb3BlcnR5XCI6IHNVbml0UHJvcGVydHlQYXRoICYmICFzRGF0YVByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgPyBzVW5pdFByb3BlcnR5UGF0aCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0XCI6XG5cdFx0XHRcdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiAhc1VuaXRQcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpID8gYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcInByb3BlcnR5UGF0aEZvclZhbHVlSGVscFwiOiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c0RhdGFQcm9wZXJ0eVBhdGh9YCxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwVW5pdFwiOiBzVW5pdFByb3BlcnR5UGF0aCAmJiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c1VuaXRQcm9wZXJ0eVBhdGh9YCxcblx0XHRcdFx0XHRcdFwiaXNGaWVsZFJlcXVpcmVkXCI6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHlJbmZvLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblBhdGhcIjogc0RhdGFQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc0RhdGFQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImRlZmF1bHRTZWxlY3Rpb25Vbml0UGF0aFwiOiBzVW5pdFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzVW5pdFByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZW50aXR5U2V0XCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdFwiZGlzcGxheVwiOiBkaXNwbGF5TW9kZSxcblx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IE1hc3NFZGl0SGVscGVyLmdldFRleHRQYXRoKHNEYXRhUHJvcGVydHlQYXRoLCBvVGV4dEJpbmRpbmcsIGRpc3BsYXlNb2RlKSxcblx0XHRcdFx0XHRcdFwibnVsbGFibGVcIjogb1Byb3BlcnR5SW5mby5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gb1Byb3BlcnR5SW5mby5udWxsYWJsZSA6IHRydWUsXG5cdFx0XHRcdFx0XHRcImlzUHJvcGVydHlSZWFkT25seVwiOiBpc1JlYWRPbmx5ICE9PSB1bmRlZmluZWQgPyBpc1JlYWRPbmx5IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImlucHV0VHlwZVwiOiBpbnB1dFR5cGUsXG5cdFx0XHRcdFx0XHRcImVkaXRNb2RlXCI6IGVkaXRhYmxlID8gZXhwQmluZGluZyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFwidW5pdERhdGFQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoICYmIFwiZmllbGRzSW5mbz4vdW5pdERhdGEvXCIsXG5cdFx0XHRcdFx0XHRcInZhbHVlc1BhdGhcIjogXCJmaWVsZHNJbmZvPi92YWx1ZXMvXCJcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGFEYXRhQXJyYXkucHVzaChvUmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9EYXRhRmllbGRNb2RlbC5zZXREYXRhKGFEYXRhQXJyYXkpO1xuXHRcdHJldHVybiBvRGF0YUZpZWxkTW9kZWw7XG5cdH0sXG5cblx0Z2V0VGFibGVGaWVsZHM6IGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRjb25zdCBjb2x1bW5zRGF0YSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0UGFyZW50KCkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29sdW1ucztcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHkgPSBvQ29sdW1uICYmIG9Db2x1bW4uZ2V0RGF0YVByb3BlcnR5KCksXG5cdFx0XHRcdGFSZWFsdGVkQ29sdW1uSW5mbyA9XG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEgJiZcblx0XHRcdFx0XHRjb2x1bW5zRGF0YS5maWx0ZXIoZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29sdW1uSW5mby5uYW1lID09PSBzRGF0YVByb3BlcnR5ICYmIG9Db2x1bW5JbmZvLnR5cGUgPT09IFwiQW5ub3RhdGlvblwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJkYXRhUHJvcGVydHlcIjogc0RhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XCJsYWJlbFwiOiBvQ29sdW1uLmdldEhlYWRlcigpLFxuXHRcdFx0XHRcImFubm90YXRpb25QYXRoXCI6IGFSZWFsdGVkQ29sdW1uSW5mbyAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdLmFubm90YXRpb25QYXRoXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdldERlZmF1bHRUZXh0c0ZvckRpYWxvZzogZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwidXNlVmFsdWVIZWxwVmFsdWVcIjogXCI8IFVzZSBWYWx1ZSBIZWxwID5cIixcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwibm9GaWVsZHNcIjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9OT19FRElUQUJMRV9GSUVMRFNcIiksXG5cdFx0XHRcIm9rQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19PS1wiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHN0cmluZ1xuXHQgKi9cblx0Ly8gZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZzogZnVuY3Rpb24gKHNJbnB1dFR5cGU6IHN0cmluZykge1xuXHQvLyBcdGxldCBzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblxuXHQvLyBcdHN3aXRjaCAoc0lucHV0VHlwZSkge1xuXHQvLyBcdFx0Ly9UT0RPIC0gQWRkIGZvciBvdGhlciBjb250cm9sIHR5cGVzIGFzIHdlbGwgKFJhZGlvIEJ1dHRvbiwgRW1haWwsIElucHV0LCBNREMgRmllbGRzLCBJbWFnZSBldGMuKVxuXHQvLyBcdFx0Y2FzZSBcIkRhdGVQaWNrZXJcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiRGF0ZXNcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRjYXNlIFwiQ2hlY2tCb3hcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiU2V0dGluZ3NcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRkZWZhdWx0OlxuXHQvLyBcdFx0XHRzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblx0Ly8gXHR9XG5cdC8vIFx0cmV0dXJuIHNSZXN1bHQ7XG5cdC8vIH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIG1vZGVsIFtLZWVwIEV4aXN0aW5nIFZhbHVlcywgTGVhdmUgQmxhbmtdLlxuXHQgKlxuXHQgKiBAcGFyYW0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSBiVU9NRmllbGRcblx0ICovXG5cdHNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZzogZnVuY3Rpb24gKGFWYWx1ZXM6IGFueSwgb0RlZmF1bHRWYWx1ZXM6IGFueSwgb1Byb3BlcnR5SW5mbzogYW55LCBiVU9NRmllbGQ/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGJVT01GaWVsZCA/IG9Qcm9wZXJ0eUluZm8udW5pdFByb3BlcnR5IDogb1Byb3BlcnR5SW5mby5kYXRhUHJvcGVydHksXG5cdFx0XHRzSW5wdXRUeXBlID0gb1Byb3BlcnR5SW5mby5pbnB1dFR5cGUsXG5cdFx0XHRiUHJvcGVydHlSZXF1aXJlZCA9IG9Qcm9wZXJ0eUluZm8uaXNGaWVsZFJlcXVpcmVkO1xuXHRcdC8vIGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBNYXNzRWRpdEhlbHBlci5nZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nKHNJbnB1dFR5cGUpO1xuXHRcdGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBcIlZhbHVlc1wiO1xuXHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMgPSBhVmFsdWVzLmRlZmF1bHRPcHRpb25zIHx8IFtdO1xuXHRcdGNvbnN0IHNlbGVjdE9wdGlvbnNFeGlzdCA9IGFWYWx1ZXMuc2VsZWN0T3B0aW9ucyAmJiBhVmFsdWVzLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMDtcblx0XHRjb25zdCBrZWVwRW50cnkgPSB7XG5cdFx0XHR0ZXh0OiBgJHtvRGVmYXVsdFZhbHVlcy5rZWVwRXhpc3RpbmdQcmVmaXh9ICR7c1N1ZmZpeEZvcktlZXBFeGlzdGluZ30gPmAsXG5cdFx0XHRrZXk6IGBEZWZhdWx0LyR7c1Byb3BlcnR5UGF0aH1gXG5cdFx0fTtcblxuXHRcdGlmIChzSW5wdXRUeXBlID09PSBcIkNoZWNrQm94XCIpIHtcblx0XHRcdGNvbnN0IGZhbHNlRW50cnkgPSB7IHRleHQ6IFwiTm9cIiwga2V5OiBgJHtzUHJvcGVydHlQYXRofS9mYWxzZWAsIHRleHRJbmZvOiB7IHZhbHVlOiBmYWxzZSB9IH07XG5cdFx0XHRjb25zdCB0cnV0aHlFbnRyeSA9IHsgdGV4dDogXCJZZXNcIiwga2V5OiBgJHtzUHJvcGVydHlQYXRofS90cnVlYCwgdGV4dEluZm86IHsgdmFsdWU6IHRydWUgfSB9O1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KGZhbHNlRW50cnkpO1xuXHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGZhbHNlRW50cnkpO1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHRydXRoeUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdCh0cnV0aHlFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChrZWVwRW50cnkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5SW5mby5pc1ZhbHVlSGVscEVuYWJsZWQgfHwgKG9Qcm9wZXJ0eUluZm8uaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiBiVU9NRmllbGQpKSB7XG5cdFx0XHRcdGNvbnN0IHZoZEVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy51c2VWYWx1ZUhlbHBWYWx1ZSwga2V5OiBgVXNlVmFsdWVIZWxwVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdH1cblx0XHRcdGlmIChzZWxlY3RPcHRpb25zRXhpc3QpIHtcblx0XHRcdFx0aWYgKGJQcm9wZXJ0eVJlcXVpcmVkICE9PSBcInRydWVcIiAmJiAhYlVPTUZpZWxkKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2xlYXJFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IGBDbGVhckZpZWxkVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoY2xlYXJFbnRyeSk7XG5cdFx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFWYWx1ZXMudW5zaGlmdChrZWVwRW50cnkpO1xuXHRcdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGVtcHR5RW50cnkgPSB7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBgRGVmYXVsdC8ke3NQcm9wZXJ0eVBhdGh9YCB9O1xuXHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoZW1wdHlFbnRyeSk7XG5cdFx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IGFycmFuZ2VtZW50IGluZm8gZm9yIGEgY29udGV4dCBwcm9wZXJ0eS5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IFBhdGhcblx0ICogQHBhcmFtIGRlc2NyaXB0aW9uUGF0aCBQYXRoIHRvIHRleHQgYXNzb2NpYXRpb24gb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBkaXNwbGF5TW9kZSBEaXNwbGF5IG1vZGUgb2YgdGhlIHByb3BlcnR5IGFuZCB0ZXh0IGFzc29jaWF0aW9uXG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHQgQ29udGV4dCB0byBmaW5kIHRoZSBmdWxsIHRleHRcblx0ICogQHJldHVybnMgVGhlIHRleHQgYXJyYW5nZW1lbnRcblx0ICovXG5cdGdldFRleHRBcnJhbmdlbWVudEluZm86IGZ1bmN0aW9uIChcblx0XHRwcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGRlc2NyaXB0aW9uUGF0aDogc3RyaW5nLFxuXHRcdGRpc3BsYXlNb2RlOiBzdHJpbmcsXG5cdFx0c2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0XG5cdCk6IFRleHRBcnJhbmdlbWVudEluZm8ge1xuXHRcdGxldCB2YWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QocHJvcGVydHkpLFxuXHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSxcblx0XHRcdGZ1bGxUZXh0O1xuXHRcdGlmIChkZXNjcmlwdGlvblBhdGggJiYgcHJvcGVydHkpIHtcblx0XHRcdHN3aXRjaCAoZGlzcGxheU1vZGUpIHtcblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoZGVzY3JpcHRpb25QYXRoKSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gZGVzY3JpcHRpb25WYWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIlZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IGRlc2NyaXB0aW9uVmFsdWUgPyBgJHt2YWx1ZX0gKCR7ZGVzY3JpcHRpb25WYWx1ZX0pYCA6IHZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25WYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eSkgfHwgXCJcIjtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpIHx8IFwiXCI7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSBkZXNjcmlwdGlvblZhbHVlID8gYCR7ZGVzY3JpcHRpb25WYWx1ZX0gKCR7dmFsdWV9KWAgOiB2YWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRMb2cuaW5mbyhgRGlzcGxheSBQcm9wZXJ0eSBub3QgYXBwbGljYWJsZTogJHtwcm9wZXJ0eX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XCJ0ZXh0QXJyYW5nZW1lbnRcIjogZGlzcGxheU1vZGUsXG5cdFx0XHRcInZhbHVlUGF0aFwiOiBwcm9wZXJ0eSxcblx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IGRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFwidmFsdWVcIjogdmFsdWUsXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcImZ1bGxUZXh0XCI6IGZ1bGxUZXh0XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSB2aXNpYmlsaXR5IHZhbHV1ZSBmb3IgdGhlIE1hbmFnZWRPYmplY3QgQW55LlxuXHQgKlxuXHQgKiBAcGFyYW0gYW55IFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRpc0VkaXRhYmxlOiBmdW5jdGlvbiAoYW55OiBBbnlUeXBlKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYmluZGluZyA9IGFueS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXHRcdGNvbnN0IHZhbHVlID0gKGJpbmRpbmcgYXMgYW55KS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0cmV0dXJuIHZhbHVlID09PSBFZGl0TW9kZS5FZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHZpc2liaWxpdHkgb2YgbWFzcyBlZGl0IGZpZWxkIG9uIGNoYW5nZSBvZiB0aGUgTWFuYWdlZE9iamVjdCBBbnkgYmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqL1xuXHRvbkNvbnRleHRFZGl0YWJsZUNoYW5nZTogZnVuY3Rpb24gKG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvYmplY3RzRm9yVmlzaWJpbGl0eSA9IG9EaWFsb2dEYXRhTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtkYXRhUHJvcGVydHl9L29iamVjdHNGb3JWaXNpYmlsaXR5YCkgfHwgW107XG5cdFx0Y29uc3QgZWRpdGFibGUgPSBvYmplY3RzRm9yVmlzaWJpbGl0eS5zb21lKE1hc3NFZGl0SGVscGVyLmlzRWRpdGFibGUpO1xuXG5cdFx0aWYgKGVkaXRhYmxlKSB7XG5cdFx0XHRvRGlhbG9nRGF0YU1vZGVsLnNldFByb3BlcnR5KGAvdmFsdWVzLyR7ZGF0YVByb3BlcnR5fS92aXNpYmxlYCwgZWRpdGFibGUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIE1hbmFnZWQgT2JqZWN0IEFueSBmb3IgdmlzaWJpbGl0eSBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkcy5cblx0ICpcblx0ICogQHBhcmFtIG1PVG9Vc2UgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKi9cblx0dXBkYXRlT25Db250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAobU9Ub1VzZTogQW55VHlwZSwgb0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcblx0XHRjb25zdCBiaW5kaW5nID0gbU9Ub1VzZS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXG5cdFx0dmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5ID0gdmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5IHx8IFtdO1xuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eS5wdXNoKG1PVG9Vc2UpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hDaGFuZ2UoTWFzc0VkaXRIZWxwZXIub25Db250ZXh0RWRpdGFibGVDaGFuZ2UuYmluZChudWxsLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHkpKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGJvdW5kIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIHZpc2liaWxpdHkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKi9cblx0Z2V0Qm91bmRPYmplY3Q6IGZ1bmN0aW9uIChleHBCaW5kaW5nOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgY29udGV4dDogQ29udGV4dCk6IEFueVR5cGUge1xuXHRcdGNvbnN0IG1PVG9Vc2UgPSBuZXcgQW55KHsgYW55OiBleHBCaW5kaW5nIH0pO1xuXHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdG1PVG9Vc2Uuc2V0TW9kZWwobW9kZWwpO1xuXHRcdG1PVG9Vc2Uuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cblx0XHRyZXR1cm4gbU9Ub1VzZTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hc3MgZWRpdCBmaWVsZCBpcyBlZGl0YWJsZS5cblx0ICovXG5cdGdldEZpZWxkVmlzaWJsaXR5OiBmdW5jdGlvbiAoXG5cdFx0ZXhwQmluZGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdFx0b0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLFxuXHRcdGRhdGFQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdHZhbHVlczogYW55LFxuXHRcdGNvbnRleHQ6IENvbnRleHRcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbU9Ub1VzZSA9IE1hc3NFZGl0SGVscGVyLmdldEJvdW5kT2JqZWN0KGV4cEJpbmRpbmcsIGNvbnRleHQpO1xuXHRcdGNvbnN0IGlzQ29udGV4dEVkaXRhYmxlID0gTWFzc0VkaXRIZWxwZXIuaXNFZGl0YWJsZShtT1RvVXNlKTtcblxuXHRcdGlmICghaXNDb250ZXh0RWRpdGFibGUpIHtcblx0XHRcdE1hc3NFZGl0SGVscGVyLnVwZGF0ZU9uQ29udGV4dENoYW5nZShtT1RvVXNlLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHksIHZhbHVlcyk7XG5cdFx0fVxuXHRcdHJldHVybiBpc0NvbnRleHRFZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBydW50aW1lIG1vZGVsOlxuXHQgKiA9PiBUaGUgbW9kZWwgY29uc2lzdHMgb2YgdmFsdWVzIHNob3duIGluIHRoZSBjb21ib0JveCBvZiB0aGUgZGlhbG9nIChMZWF2ZSBCbGFuaywgS2VlcCBFeGlzdGluZyBWYWx1ZXMsIG9yIGFueSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRleHQsIGV0Yy4pXG5cdCAqID0+IFRoZSBtb2RlbCB3aWxsIGNhcHR1cmUgcnVudGltZSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIHByb3BlcnR5ICh0aGUgdmFsdWUgZW50ZXJlZCBpbiB0aGUgY29tYm9Cb3gpLlxuXHQgKlxuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcGFyYW0gZGlhbG9nQ29udGV4dCBUcmFuc2llbnQgY29udGV4dCBmb3IgbWFzcyBlZGl0IGRpYWxvZy5cblx0ICogQHJldHVybnMgVGhlIHJ1bnRpbWUgbW9kZWxcblx0ICovXG5cdHNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nOiBmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10sIG9EZWZhdWx0VmFsdWVzOiBhbnksIGRpYWxvZ0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBhVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFVbml0RGF0YTogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUmVzdWx0czogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUmVhZE9ubHlGaWVsZEluZm86IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb0RhdGEgPSB7XG5cdFx0XHRcInZhbHVlc1wiOiBhVmFsdWVzLFxuXHRcdFx0XCJ1bml0RGF0YVwiOiBhVW5pdERhdGEsXG5cdFx0XHRcInJlc3VsdHNcIjogYVJlc3VsdHMsXG5cdFx0XHRcInJlYWRhYmxlUHJvcGVydHlEYXRhXCI6IGFSZWFkT25seUZpZWxkSW5mbyxcblx0XHRcdFwic2VsZWN0ZWRLZXlcIjogdW5kZWZpbmVkLFxuXHRcdFx0XCJub0ZpZWxkc1wiOiBvRGVmYXVsdFZhbHVlcy5ub0ZpZWxkc1xuXHRcdH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgb1RleHRJbmZvO1xuXHRcdFx0bGV0IHNQcm9wZXJ0eUtleTtcblx0XHRcdGxldCBzVW5pdFByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFVuaXRNYXA6IGFueSA9IHt9O1xuXHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIG9JbkRhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvSW5EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyAvKiwgZGlhbG9nQ29udGV4dCAqLyk7XG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzID0gb0luRGF0YS5kYXRhUHJvcGVydHkuc3BsaXQoXCIvXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KG9JbkRhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtzTXVsdGlMZXZlbFBhdGhWYWx1ZX1gO1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSAmJiBhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gc011bHRpTGV2ZWxQYXRoVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdFx0Ly8gfVxuXG5cdFx0XHRcdGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dLnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogb0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0luRGF0YS5kaXNwbGF5XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdGlmIChvSW5EYXRhLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdID0gYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtvRGF0YU9iamVjdFtvSW5EYXRhLmRhdGFQcm9wZXJ0eV19YDtcblx0XHRcdFx0XHRpZiAob0luRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kaXNwbGF5LFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBvRGF0YU9iamVjdFtvSW5EYXRhLmRhdGFQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0ucHVzaChlbnRyeSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS51bml0UHJvcGVydHldKSB7XG5cdFx0XHRcdFx0XHRzVW5pdFByb3BlcnR5TmFtZSA9IGAke29JbkRhdGEudW5pdFByb3BlcnR5fS8ke29EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XX1gO1xuXHRcdFx0XHRcdFx0aWYgKCFvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRcdG9JbkRhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bml0RW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XHRcdFwia2V5XCI6IHNVbml0UHJvcGVydHlOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh1bml0RW50cnkpO1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2godW5pdEVudHJ5KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0udGV4dEluZm8gPSB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiBvSW5EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBvSW5EYXRhLmRpc3BsYXlcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFZhbHVlTWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRkaWFsb2dDb250ZXh0LnNldFByb3BlcnR5KG9JbkRhdGEuZGF0YVByb3BlcnR5LCBzUHJvcGVydHlLZXkgJiYgb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFVuaXRNYXApLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdGRpYWxvZ0NvbnRleHQuc2V0UHJvcGVydHkob0luRGF0YS51bml0UHJvcGVydHksIHNVbml0UHJvcGVydHlOYW1lICYmIG9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgdmFsdWVzOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvSW5EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSA9IE1hc3NFZGl0SGVscGVyLmdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgob0luRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMpO1xuXHRcdFx0XHRpZiAoIXNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSkge1xuXHRcdFx0XHRcdHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IGBFbXB0eS8ke29JbkRhdGEuZGF0YVByb3BlcnR5fWAgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlcyA9IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoYVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0pIHtcblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLCBvRGVmYXVsdFZhbHVlcywgb0luRGF0YSk7XG5cdFx0XHRcdHZhbHVlcyA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEsIHRydWUpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0uc2VsZWN0ZWRLZXkgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KFxuXHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmlucHV0VHlwZSA9IG9JbkRhdGEuaW5wdXRUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHx8XG5cdFx0XHRcdChvSW5EYXRhLnVuaXRQcm9wZXJ0eSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cyA9XG5cdFx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uIChvYmo6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50ZXh0ID09PSBcIjwgQ2xlYXIgVmFsdWVzID5cIiB8fCBvYmoudGV4dCA9PT0gXCI8IExlYXZlIEJsYW5rID5cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogYEVtcHR5LyR7b0luRGF0YS5kYXRhUHJvcGVydHl9YCB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24gKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRpZiAoIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGBFbXB0eS8ke29JbkRhdGEudW5pdFByb3BlcnR5fWBcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goXG5cdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ICYmIHR5cGVvZiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBcInByb3BlcnR5XCI6IG9JbkRhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZTogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHksIHR5cGU6IFwiRGVmYXVsdFwiIH0pO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHMgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0gJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDJcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBSZWFkT25seUV4cHJlc3Npb24gY2hhbmdlXG5cdFx0XHRcdGFSZWFkT25seUZpZWxkSW5mby5wdXNoKHtcblx0XHRcdFx0XHRcInByb3BlcnR5XCI6IG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aDogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlOiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMi52YWx1ZSxcblx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0dGluZyB2aXNiaWxpdHkgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0XHRcdGlmIChvSW5EYXRhLmVkaXRNb2RlKSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID1cblx0XHRcdFx0XHRvSW5EYXRhLmVkaXRNb2RlID09PSBFZGl0TW9kZS5FZGl0YWJsZSB8fFxuXHRcdFx0XHRcdGFDb250ZXh0cy5zb21lKFxuXHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuZ2V0RmllbGRWaXNpYmxpdHkuYmluZChcblx0XHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIsXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZWRpdE1vZGUsXG5cdFx0XHRcdFx0XHRcdG9EaWFsb2dEYXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHR2YWx1ZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsdWVzLnZpc2libGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0dmFsdWVzLnNlbGVjdGVkS2V5ID0gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIG9JbkRhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdHZhbHVlcy5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdHZhbHVlcy51bml0UHJvcGVydHkgPSBvSW5EYXRhLnVuaXRQcm9wZXJ0eTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBvRGlhbG9nRGF0YU1vZGVsO1xuXHR9LFxuXHQvKipcblx0ICogR2V0cyB0cmFuc2llbnQgY29udGV4dCBmb3IgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFibGUgSW5zdGFuY2Ugb2YgVGFibGUuXG5cdCAqIEBwYXJhbSBkaWFsb2cgTWFzcyBFZGl0IERpYWxvZy5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Z2V0RGlhbG9nQ29udGV4dDogZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgZGlhbG9nPzogRGlhbG9nKTogQ29udGV4dCB7XG5cdFx0bGV0IHRyYW5zQ3R4OiBDb250ZXh0ID0gKGRpYWxvZyAmJiBkaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoKSkgYXMgQ29udGV4dDtcblxuXHRcdGlmICghdHJhbnNDdHgpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0KHRyYW5zaWVudExpc3RCaW5kaW5nIGFzIGFueSkucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvKiAqL1xuXHRcdFx0fTtcblx0XHRcdHRyYW5zQ3R4ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHt9LCB0cnVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJhbnNDdHg7XG5cdH0sXG5cblx0b25EaWFsb2dPcGVuOiBmdW5jdGlvbiAoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0ZmllbGRzSW5mb01vZGVsLnNldFByb3BlcnR5KFwiL2lzT3BlblwiLCB0cnVlKTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBtYXNzIGVkaXQgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1RhYmxlIEluc3RhbmNlIG9mIFRhYmxlXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgQ29udHJvbGxlciBmb3IgdGhlIHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Y3JlYXRlRGlhbG9nOiBmdW5jdGlvbiAob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgb0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0ZGlhbG9nQ29udGV4dCA9IE1hc3NFZGl0SGVscGVyLmdldERpYWxvZ0NvbnRleHQob1RhYmxlKSxcblx0XHRcdG9EaWFsb2dEYXRhTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5zZXRSdW50aW1lTW9kZWxPbkRpYWxvZyhhQ29udGV4dHMsIGFEYXRhQXJyYXksIG9EZWZhdWx0VmFsdWVzLCBkaWFsb2dDb250ZXh0KTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGRhdGFGaWVsZE1vZGVsOiBvRGF0YUZpZWxkTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdGRhdGFGaWVsZE1vZGVsOiBvRGF0YUZpZWxkTW9kZWxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9DcmVhdGVkRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0NyZWF0ZWRGcmFnbWVudCB9KS50aGVuKGZ1bmN0aW9uIChvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBEcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cztcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHR0aXRsZTogb0RlZmF1bHRWYWx1ZXMubWFzc0VkaXRUaXRsZSxcblx0XHRcdFx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0XHRcdFx0YWZ0ZXJPcGVuOiBNYXNzRWRpdEhlbHBlci5vbkRpYWxvZ09wZW4sXG5cdFx0XHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBNYXNzRWRpdEhlbHBlci5oZWxwZXJzLmdldEV4cEJpbmRpbmdGb3JBcHBseUJ1dHRvblR4dChvRGVmYXVsdFZhbHVlcywgb0RhdGFGaWVsZE1vZGVsLmdldE9iamVjdChcIi9cIikpLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJza2lwUGF0Y2hIYW5kbGVyc1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0luRGlhbG9nID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0luRGlhbG9nLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFSZXN1bHRzID0gb01vZGVsLmdldFByb3BlcnR5KFwiL3Jlc3VsdHNcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUHJvcGVydHlSZWFkYWJsZUluZm8gPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVhZGFibGVQcm9wZXJ0eURhdGFcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGFuZ2VQcm9taXNlOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGJSZWFkT25seUZpZWxkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgZ3JvdXBJZDtcblx0XHRcdFx0XHRcdFx0XHRcdC8vbGV0IGluZGV4ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGVycm9yVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSwgaWR4OiBudW1iZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbiAob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlID09PSBvUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvcGVydHlJbmZvLnZhbHVlID09PSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiUGF0aFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aCkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncm91cElkID0gYCRhdXRvLiR7aWR4fWA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9pbmRleCArPSAxO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vbGV0IHByb21pc2VDb3VudCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgJiYgb1Jlc3VsdC52YWx1ZSAhPT0gXCJEZWZhdWx0XCIgJiYgIWJSZWFkT25seUZpZWxkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VQcm9taXNlLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc2V0UHJvcGVydHkob1Jlc3VsdC5rZXlWYWx1ZSwgb1Jlc3VsdC52YWx1ZSwgZ3JvdXBJZClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1NlbGVjdGVkQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVmFsdWVzLnB1c2gob1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHVwZGF0aW5nIGVudHJpZXMuXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRcdFx0XHRcdFx0XHRcdChQcm9taXNlIGFzIGFueSkuYWxsU2V0dGxlZChjaGFuZ2VQcm9taXNlKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0V4dGVuc2lvbkFQSSA9IG9Db250cm9sbGVyICYmIChvQ29udHJvbGxlci5nZXRFeHRlbnNpb25BUEkoKSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0V4dGVuc2lvbkFQSS5yZWZyZXNoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHN1YnRpdGxlQ29sdW1uID0gQ29tbW9uVXRpbHMuZ2V0TWVzc2FnZUNvbHVtbihvVGFibGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VzID0gc2FwLnVpLmdldENvcmUoKS5nZXRNZXNzYWdlTWFuYWdlcigpLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzID0gW10gYXMgYW55O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZVRhcmdldHMgPSBtZXNzYWdlLmdldFRhcmdldHMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZVRhcmdldHMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZVRhcmdldHMubGVuZ3RoID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VUYXJnZXRzWzBdLmxlbmd0aCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLnBlcnNpc3RlbnQgPT09IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQgPSBhQ29udGV4dHMuZmluZChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldCgpLmluZGV4T2Yob0NvbnRleHQuZ2V0UGF0aCgpKSAhPT0gLTE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLnB1c2goYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5hZGRpdGlvbmFsVGV4dCA9IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0LmdldE9iamVjdCgpW3N1YnRpdGxlQ29sdW1uXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXN1bHRzLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMubGVuZ3RoID09PSAwICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5sZW5ndGggPT09IDBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzdWNjZXNzVG9hc3QgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX1NVQ0NFU1NfVE9BU1RcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhzdWNjZXNzVG9hc3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5sZW5ndGggKyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLmxlbmd0aCA8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMubGVuZ3RoICsgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5sZW5ndGggPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9JbkRpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0luRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvSW5EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9Db250cm9sbGVyLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInNraXBQYXRjaEhhbmRsZXJzXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmNhbmNlbEJ1dHRvblRleHQsXG5cdFx0XHRcdFx0XHRcdFx0dmlzaWJsZTogTWFzc0VkaXRIZWxwZXIuaGVscGVycy5oYXNFZGl0YWJsZUZpZWxkc0JpbmRpbmcob0RhdGFGaWVsZE1vZGVsLmdldE9iamVjdChcIi9cIiksIHRydWUpIGFzIGFueSxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvSW5EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvSW5EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdG9JbkRpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9UYWJsZS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvRGlhbG9nRGF0YU1vZGVsLCBcImZpZWxkc0luZm9cIik7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG1vZGVsKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQoZGlhbG9nQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9EaWFsb2cpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fSxcblxuXHRoZWxwZXJzOiB7XG5cdFx0Z2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzOiAoZmllbGRzOiBhbnksIGVkaXRhYmxlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRjb25zdCB0b3RhbEV4cCA9IGZpZWxkcy5yZWR1Y2UoXG5cdFx0XHRcdChleHByZXNzaW9uOiBhbnksIGZpZWxkOiBhbnkpID0+XG5cdFx0XHRcdFx0b3IoXG5cdFx0XHRcdFx0XHRleHByZXNzaW9uLFxuXHRcdFx0XHRcdFx0cGF0aEluTW9kZWwoXCIvdmFsdWVzL1wiICsgZmllbGQuZGF0YVByb3BlcnR5ICsgXCIvdmlzaWJsZVwiLCBcImZpZWxkc0luZm9cIikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+XG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0Y29uc3RhbnQoZmFsc2UpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGVkaXRhYmxlID8gdG90YWxFeHAgOiBub3QodG90YWxFeHApO1xuXHRcdH0sXG5cblx0XHRnZXRFeHBCaW5kaW5nRm9yQXBwbHlCdXR0b25UeHQ6IChkZWZhdWx0VmFsdWVzOiBhbnksIGZpZWxkczogYm9vbGVhbikgPT4ge1xuXHRcdFx0Y29uc3QgZWRpdGFibGVFeHAgPSBNYXNzRWRpdEhlbHBlci5oZWxwZXJzLmdldEJpbmRpbmdFeHBGb3JIYXNFZGl0YWJsZUZpZWxkcyhmaWVsZHMsIHRydWUpO1xuXHRcdFx0Y29uc3QgdG90YWxFeHAgPSBpZkVsc2UoZWRpdGFibGVFeHAsIGNvbnN0YW50KGRlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0KSwgY29uc3RhbnQoZGVmYXVsdFZhbHVlcy5va0J1dHRvblRleHQpKTtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbih0b3RhbEV4cCk7XG5cdFx0fSxcblxuXHRcdGhhc0VkaXRhYmxlRmllbGRzQmluZGluZzogKGZpZWxkczogYW55LCBlZGl0YWJsZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKE1hc3NFZGl0SGVscGVyLmhlbHBlcnMuZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzKGZpZWxkcywgZWRpdGFibGUpKTtcblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGVscGVyO1xuIl19
|