@sapui5/sap.fe.core 1.102.2 → 1.104.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +73 -30
- package/src/sap/fe/core/AppComponent.ts +65 -43
- package/src/sap/fe/core/AppStateHandler.js +82 -70
- package/src/sap/fe/core/AppStateHandler.ts +32 -37
- 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 +227 -126
- package/src/sap/fe/core/CommonUtils.ts +240 -163
- package/src/sap/fe/core/ExtensionAPI.js +24 -27
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +4 -4
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +6 -6
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- 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/BuildingBlock.js +181 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +150 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +585 -210
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +246 -96
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
- package/src/sap/fe/core/controllerextensions/EditFlow.js +379 -330
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -245
- 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 +101 -74
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +69 -79
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +67 -67
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +85 -77
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +103 -99
- 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 +9 -9
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
- package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
- package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
- 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 +170 -139
- package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
- package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +200 -131
- package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +11 -10
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +190 -141
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +258 -210
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +183 -125
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +213 -156
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +164 -140
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +180 -150
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +71 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +102 -82
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +61 -71
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +56 -64
- 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 +11 -25
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- 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 +22 -22
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
- 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 +7 -2
- package/src/sap/fe/core/controls/FileWrapper.ts +15 -11
- 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 +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
- 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 +49 -49
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
- package/src/sap/fe/core/converters/ConverterContext.js +26 -33
- package/src/sap/fe/core/converters/ConverterContext.ts +52 -61
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +17 -15
- 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 +64 -35
- package/src/sap/fe/core/converters/MetaModelConverter.ts +154 -129
- 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 +58 -35
- package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
- package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
- package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
- package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -33
- 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 +30 -28
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -61
- package/src/sap/fe/core/converters/controls/Common/Form.js +27 -28
- package/src/sap/fe/core/converters/controls/Common/Form.ts +44 -57
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
- package/src/sap/fe/core/converters/controls/Common/Table.js +181 -197
- package/src/sap/fe/core/converters/controls/Common/Table.ts +251 -280
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +65 -59
- 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 +77 -73
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +101 -97
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -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 +48 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +26 -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 -5
- 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 +55 -42
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +81 -66
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
- 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 +96 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
- package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
- 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/helpers/AppStartupHelper.js +15 -15
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
- package/src/sap/fe/core/helpers/BindingToolkit.js +1832 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +396 -269
- package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
- package/src/sap/fe/core/helpers/ClassSupport.ts +37 -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 +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
- 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 +306 -280
- package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
- package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
- package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
- 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 +12 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
- package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
- package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +99 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +82 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
- package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
- package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.ts +38 -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 +39 -63
- package/src/sap/fe/core/messagebundle_ar.properties +25 -39
- package/src/sap/fe/core/messagebundle_bg.properties +25 -39
- package/src/sap/fe/core/messagebundle_ca.properties +25 -39
- package/src/sap/fe/core/messagebundle_cs.properties +25 -39
- package/src/sap/fe/core/messagebundle_cy.properties +25 -39
- package/src/sap/fe/core/messagebundle_da.properties +25 -39
- package/src/sap/fe/core/messagebundle_de.properties +25 -39
- package/src/sap/fe/core/messagebundle_el.properties +26 -40
- package/src/sap/fe/core/messagebundle_en.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_GB.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +26 -18
- package/src/sap/fe/core/messagebundle_es.properties +27 -41
- package/src/sap/fe/core/messagebundle_es_MX.properties +25 -39
- package/src/sap/fe/core/messagebundle_et.properties +25 -39
- package/src/sap/fe/core/messagebundle_fi.properties +25 -39
- package/src/sap/fe/core/messagebundle_fr.properties +26 -40
- package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -39
- package/src/sap/fe/core/messagebundle_hi.properties +25 -39
- package/src/sap/fe/core/messagebundle_hr.properties +25 -39
- package/src/sap/fe/core/messagebundle_hu.properties +25 -39
- package/src/sap/fe/core/messagebundle_id.properties +25 -39
- package/src/sap/fe/core/messagebundle_it.properties +41 -55
- package/src/sap/fe/core/messagebundle_iw.properties +25 -39
- package/src/sap/fe/core/messagebundle_ja.properties +25 -39
- package/src/sap/fe/core/messagebundle_kk.properties +25 -39
- package/src/sap/fe/core/messagebundle_ko.properties +30 -44
- package/src/sap/fe/core/messagebundle_lt.properties +25 -39
- package/src/sap/fe/core/messagebundle_lv.properties +25 -39
- package/src/sap/fe/core/messagebundle_ms.properties +25 -39
- package/src/sap/fe/core/messagebundle_nl.properties +27 -41
- package/src/sap/fe/core/messagebundle_no.properties +25 -39
- package/src/sap/fe/core/messagebundle_pl.properties +26 -40
- package/src/sap/fe/core/messagebundle_pt.properties +26 -40
- package/src/sap/fe/core/messagebundle_pt_PT.properties +25 -39
- package/src/sap/fe/core/messagebundle_ro.properties +25 -39
- package/src/sap/fe/core/messagebundle_ru.properties +25 -39
- package/src/sap/fe/core/messagebundle_sh.properties +25 -39
- package/src/sap/fe/core/messagebundle_sk.properties +25 -39
- package/src/sap/fe/core/messagebundle_sl.properties +25 -39
- package/src/sap/fe/core/messagebundle_sv.properties +25 -39
- package/src/sap/fe/core/messagebundle_th.properties +25 -39
- package/src/sap/fe/core/messagebundle_tr.properties +25 -39
- package/src/sap/fe/core/messagebundle_uk.properties +25 -39
- package/src/sap/fe/core/messagebundle_vi.properties +25 -39
- package/src/sap/fe/core/messagebundle_zh_CN.properties +25 -39
- package/src/sap/fe/core/messagebundle_zh_TW.properties +25 -39
- 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 +97 -69
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +68 -69
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +61 -49
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
- 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 +55 -55
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +92 -76
- package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
- 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 +224 -198
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +138 -139
- 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 +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
- 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 +16 -15
- package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
- 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 +25 -25
- package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
- package/src/sap/fe/core/templating/UIFormatters.js +152 -95
- package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
- 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/helpers/BindingExpression.js +0 -1732
|
@@ -28,15 +28,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
28
28
|
* @name sap.fe.core.actions.draft#createDraftFromActiveDocument
|
|
29
29
|
* @memberof sap.fe.core.actions.draft
|
|
30
30
|
* @static
|
|
31
|
-
* @param
|
|
32
|
-
* @param
|
|
33
|
-
* @param
|
|
34
|
-
* @param
|
|
35
|
-
* @param
|
|
36
|
-
* @param
|
|
37
|
-
* @param
|
|
38
|
-
* @param
|
|
39
|
-
* @returns
|
|
31
|
+
* @param oContext Context of the active document for the new draft
|
|
32
|
+
* @param oAppComponent The AppComponent
|
|
33
|
+
* @param mParameters The parameters
|
|
34
|
+
* @param [mParameters.oView] The view
|
|
35
|
+
* @param [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
|
|
36
|
+
* @param [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
|
|
37
|
+
* @param [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
|
|
38
|
+
* @param [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
|
|
39
|
+
* @returns Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
40
40
|
* @private
|
|
41
41
|
* @ui5-restricted
|
|
42
42
|
*/
|
|
@@ -49,14 +49,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
49
49
|
/**
|
|
50
50
|
* Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
|
|
51
51
|
*
|
|
52
|
-
* @param
|
|
53
|
-
* @returns
|
|
52
|
+
* @param bOverwrite Overwrite the change or not
|
|
53
|
+
* @returns Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
|
|
54
54
|
*/
|
|
55
55
|
function overwriteOnDemand(bOverwrite) {
|
|
56
56
|
if (bOverwrite) {
|
|
57
57
|
//Overwrite existing changes
|
|
58
58
|
var oModel = oContext.getModel();
|
|
59
|
-
var draftDataContext = oModel.bindContext(oContext.getPath()
|
|
59
|
+
var draftDataContext = oModel.bindContext("".concat(oContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
|
|
60
60
|
var oResourceBundle;
|
|
61
61
|
return mParameters.oView.getModel("sap.fe.i18n").getResourceBundle().then(function (_oResourceBundle) {
|
|
62
62
|
oResourceBundle = _oResourceBundle;
|
|
@@ -83,13 +83,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
return Promise.reject(new Error("Draft creation aborted for document: "
|
|
86
|
+
return Promise.reject(new Error("Draft creation aborted for document: ".concat(oContext.getPath())));
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
function showMessageBox(sUnsavedChangesMsg) {
|
|
90
90
|
return new Promise(function (resolve, reject) {
|
|
91
91
|
var oDialog = new Dialog({
|
|
92
|
-
title: localI18nRef.getText("
|
|
92
|
+
title: localI18nRef.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING"),
|
|
93
93
|
state: "Warning",
|
|
94
94
|
content: new Text({
|
|
95
95
|
text: sUnsavedChangesMsg
|
|
@@ -106,7 +106,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
106
106
|
text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
|
|
107
107
|
press: function () {
|
|
108
108
|
oDialog.close();
|
|
109
|
-
reject("Draft creation aborted for document: "
|
|
109
|
+
reject("Draft creation aborted for document: ".concat(oContext.getPath()));
|
|
110
110
|
}
|
|
111
111
|
}),
|
|
112
112
|
afterClose: function () {
|
|
@@ -129,7 +129,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
129
129
|
var bExecute = mParam.fnBeforeCreateDraftFromActiveDocument ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow) : true;
|
|
130
130
|
|
|
131
131
|
if (!bExecute) {
|
|
132
|
-
throw new Error("Draft creation was aborted by extension for document: "
|
|
132
|
+
throw new Error("Draft creation was aborted by extension for document: ".concat(oContext.getPath()));
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
var openingSiblingContext = false;
|
|
@@ -160,7 +160,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
160
160
|
}();
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
var oDraftContext
|
|
163
|
+
var oDraftContext;
|
|
164
164
|
|
|
165
165
|
var _temp = _catch(function () {
|
|
166
166
|
return Promise.resolve(draft.executeDraftEditAction(oContext, bRunPreserveChangesFlow)).then(function (_draft$executeDraftEd) {
|
|
@@ -186,10 +186,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
186
186
|
});
|
|
187
187
|
}
|
|
188
188
|
}();
|
|
189
|
-
} else {
|
|
190
|
-
|
|
191
|
-
throw new Error(oResponse);
|
|
192
|
-
}
|
|
189
|
+
} else if (!(oResponse && oResponse.canceled)) {
|
|
190
|
+
throw new Error(oResponse);
|
|
193
191
|
}
|
|
194
192
|
}();
|
|
195
193
|
});
|
|
@@ -211,12 +209,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
211
209
|
* @name sap.fe.core.actions.draft#activateDocument
|
|
212
210
|
* @memberof sap.fe.core.actions.draft
|
|
213
211
|
* @static
|
|
214
|
-
* @param
|
|
215
|
-
* @param
|
|
216
|
-
* @param
|
|
217
|
-
* @param
|
|
218
|
-
* @param
|
|
219
|
-
* @returns
|
|
212
|
+
* @param oContext Context of the active document for the new draft
|
|
213
|
+
* @param oAppComponent The AppComponent
|
|
214
|
+
* @param mParameters The parameters
|
|
215
|
+
* @param [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
|
|
216
|
+
* @param [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
|
|
217
|
+
* @returns Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
220
218
|
* @private
|
|
221
219
|
* @ui5-restricted
|
|
222
220
|
*/
|
|
@@ -226,9 +224,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
226
224
|
* This method creates a sibling context for a subobject page and calculates a sibling path for all intermediate paths
|
|
227
225
|
* between the object page and the subobject page.
|
|
228
226
|
*
|
|
229
|
-
* @param
|
|
230
|
-
* @param
|
|
231
|
-
* @returns
|
|
227
|
+
* @param rootCurrentContext The context for the root of the draft
|
|
228
|
+
* @param rightmostCurrentContext The context of the subobject page
|
|
229
|
+
* @returns The siblingInformation object
|
|
232
230
|
*/
|
|
233
231
|
var computeSiblingInformation = function (rootCurrentContext, rightmostCurrentContext) {
|
|
234
232
|
try {
|
|
@@ -259,7 +257,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
259
257
|
var canonicalPathPromises = segments.map(function (segment) {
|
|
260
258
|
currentPath += "/".concat(segment);
|
|
261
259
|
oldPaths.unshift(currentPath);
|
|
262
|
-
var siblingContext = model.bindContext(currentPath
|
|
260
|
+
var siblingContext = model.bindContext("".concat(currentPath, "/SiblingEntity")).getBoundContext();
|
|
263
261
|
return siblingContext.requestCanonicalPath();
|
|
264
262
|
}); // //////////////////////////////////////////////////////////////////
|
|
265
263
|
// 3. Reconstruct the full paths from canonical paths (for path mapping)
|
|
@@ -315,18 +313,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
315
313
|
|
|
316
314
|
/**
|
|
317
315
|
* Callback to approve or reject the creation of a draft
|
|
316
|
+
*
|
|
318
317
|
* @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
|
|
319
318
|
* @function
|
|
320
319
|
* @static
|
|
321
320
|
* @abstract
|
|
322
321
|
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
323
322
|
* @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
|
|
324
|
-
*
|
|
325
323
|
* @private
|
|
326
324
|
*/
|
|
327
325
|
|
|
328
326
|
/**
|
|
329
327
|
* Callback after a draft was successully created
|
|
328
|
+
*
|
|
330
329
|
* @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
|
|
331
330
|
* @function
|
|
332
331
|
* @static
|
|
@@ -334,21 +333,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
334
333
|
* @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
|
|
335
334
|
* @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
|
|
336
335
|
* @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
|
|
337
|
-
*
|
|
338
336
|
* @private
|
|
339
337
|
*/
|
|
340
338
|
|
|
341
339
|
/**
|
|
342
340
|
* Callback to approve or reject overwriting an unsaved draft of another user
|
|
341
|
+
*
|
|
343
342
|
* @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
|
|
344
343
|
* @function
|
|
345
344
|
* @public
|
|
346
345
|
* @static
|
|
347
346
|
* @abstract
|
|
348
|
-
*
|
|
349
347
|
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
350
348
|
* @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
|
|
351
|
-
*
|
|
352
349
|
* @ui5-restricted
|
|
353
350
|
*/
|
|
354
351
|
|
|
@@ -375,9 +372,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
375
372
|
/**
|
|
376
373
|
* Determines action name for a draft operation.
|
|
377
374
|
*
|
|
378
|
-
* @param
|
|
379
|
-
* @param
|
|
380
|
-
* @returns
|
|
375
|
+
* @param oContext The context that should be bound to the operation
|
|
376
|
+
* @param sOperation The operation name
|
|
377
|
+
* @returns The name of the draft operation
|
|
381
378
|
*/
|
|
382
379
|
|
|
383
380
|
(function (NavigationType) {
|
|
@@ -389,27 +386,42 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
389
386
|
var oModel = oContext.getModel(),
|
|
390
387
|
oMetaModel = oModel.getMetaModel(),
|
|
391
388
|
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
392
|
-
return oMetaModel.getObject(sEntitySetPath
|
|
389
|
+
return oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot/").concat(sOperation));
|
|
393
390
|
}
|
|
394
391
|
/**
|
|
395
392
|
* Creates an operation context binding for the given context and operation.
|
|
396
393
|
*
|
|
397
|
-
* @param
|
|
398
|
-
* @param
|
|
394
|
+
* @param oContext The context that should be bound to the operation
|
|
395
|
+
* @param sOperation The operation (action or function import)
|
|
399
396
|
* @param oOptions Options to create the operation context
|
|
400
|
-
* @returns
|
|
397
|
+
* @returns The context binding of the bound operation
|
|
401
398
|
*/
|
|
402
399
|
|
|
403
400
|
|
|
404
401
|
function createOperation(oContext, sOperation, oOptions) {
|
|
405
402
|
var sOperationName = getActionName(oContext, sOperation);
|
|
406
|
-
return oContext.getModel().bindContext(sOperationName
|
|
403
|
+
return oContext.getModel().bindContext("".concat(sOperationName, "(...)"), oContext, oOptions);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Determines the return type for a draft operation.
|
|
407
|
+
*
|
|
408
|
+
* @param oContext The context that should be bound to the operation
|
|
409
|
+
* @param sOperation The operation name
|
|
410
|
+
* @returns The return type of the draft operation
|
|
411
|
+
*/
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
function getReturnType(oContext, sOperation) {
|
|
415
|
+
var oModel = oContext.getModel(),
|
|
416
|
+
oMetaModel = oModel.getMetaModel(),
|
|
417
|
+
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
418
|
+
return oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot/").concat(sOperation, "/$ReturnType"));
|
|
407
419
|
}
|
|
408
420
|
/**
|
|
409
421
|
* Check if optional draft prepare action exists.
|
|
410
422
|
*
|
|
411
|
-
* @param
|
|
412
|
-
* @returns
|
|
423
|
+
* @param oContext The context that should be bound to the operation
|
|
424
|
+
* @returns True if a a prepare action exists
|
|
413
425
|
*/
|
|
414
426
|
|
|
415
427
|
|
|
@@ -420,9 +432,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
420
432
|
* Creates a new draft from an active document.
|
|
421
433
|
*
|
|
422
434
|
* @function
|
|
423
|
-
* @param
|
|
424
|
-
* @param
|
|
425
|
-
* @returns
|
|
435
|
+
* @param oContext Context for which the action should be performed
|
|
436
|
+
* @param bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
|
|
437
|
+
* @returns Resolve function returns the context of the operation
|
|
426
438
|
* @private
|
|
427
439
|
* @ui5-restricted
|
|
428
440
|
*/
|
|
@@ -452,10 +464,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
452
464
|
* Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
|
|
453
465
|
*
|
|
454
466
|
* @function
|
|
455
|
-
* @param
|
|
456
|
-
* @param
|
|
457
|
-
* @param
|
|
458
|
-
* @returns
|
|
467
|
+
* @param oContext Context for which the action should be performed
|
|
468
|
+
* @param oAppComponent The AppComponent
|
|
469
|
+
* @param [sGroupId] The optional batch group in which the operation is to be executed
|
|
470
|
+
* @returns Resolve function returns the context of the operation
|
|
459
471
|
* @private
|
|
460
472
|
* @ui5-restricted
|
|
461
473
|
*/
|
|
@@ -479,9 +491,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
479
491
|
}).catch( //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
|
|
480
492
|
function () {
|
|
481
493
|
if (bHasPrepareAction) {
|
|
482
|
-
var
|
|
494
|
+
var actionName = getActionName(oContext, draftOperations.PREPARE),
|
|
483
495
|
oSideEffectsService = oAppComponent.getSideEffectsService(),
|
|
484
|
-
oBindingParameters = oSideEffectsService.getODataActionSideEffects(
|
|
496
|
+
oBindingParameters = oSideEffectsService.getODataActionSideEffects(actionName, oContext),
|
|
485
497
|
aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
|
|
486
498
|
|
|
487
499
|
if (aTargetPaths && aTargetPaths.length > 0) {
|
|
@@ -505,9 +517,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
505
517
|
* Execute a preparation action.
|
|
506
518
|
*
|
|
507
519
|
* @function
|
|
508
|
-
* @param
|
|
509
|
-
* @param
|
|
510
|
-
* @returns
|
|
520
|
+
* @param oContext Context for which the action should be performed
|
|
521
|
+
* @param groupId The optional batch group in which we want to execute the operation
|
|
522
|
+
* @returns Resolve function returns the context of the operation
|
|
511
523
|
* @private
|
|
512
524
|
* @ui5-restricted
|
|
513
525
|
*/
|
|
@@ -515,7 +527,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
515
527
|
|
|
516
528
|
function executeDraftPreparationAction(oContext, groupId) {
|
|
517
529
|
if (!oContext.getProperty("IsActiveEntity")) {
|
|
518
|
-
var
|
|
530
|
+
var oMetaModel = oContext.getModel().getMetaModel();
|
|
531
|
+
var sContextPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
532
|
+
var oReturnType = getReturnType(oContext, draftOperations.PREPARE);
|
|
533
|
+
var sMessagesPath; // If there is no return parameter, it is not possible to request Messages.
|
|
534
|
+
// RAP draft prepare has no return parameter
|
|
535
|
+
|
|
536
|
+
if (!!oReturnType) {
|
|
537
|
+
sMessagesPath = oMetaModel.getObject("".concat(sContextPath, "/@").concat("com.sap.vocabularies.Common.v1.Messages", "/$Path"));
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
var oOperation = createOperation(oContext, draftOperations.PREPARE, sMessagesPath ? {
|
|
541
|
+
$select: sMessagesPath
|
|
542
|
+
} : null); // TODO: side effects qualifier shall be even deprecated to be checked
|
|
519
543
|
|
|
520
544
|
oOperation.setParameter("SideEffectsQualifier", "");
|
|
521
545
|
var sGroupId = groupId || oOperation.getGroupId();
|
|
@@ -532,8 +556,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
532
556
|
* Determines the message path for a context.
|
|
533
557
|
*
|
|
534
558
|
* @function
|
|
535
|
-
* @param
|
|
536
|
-
* @returns
|
|
559
|
+
* @param oContext Context for which the path shall be determined
|
|
560
|
+
* @returns Message path, empty if not annotated
|
|
537
561
|
* @private
|
|
538
562
|
* @ui5-restricted
|
|
539
563
|
*/
|
|
@@ -543,15 +567,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
543
567
|
var oModel = oContext.getModel(),
|
|
544
568
|
oMetaModel = oModel.getMetaModel(),
|
|
545
569
|
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
546
|
-
return oMetaModel.getObject(sEntitySetPath
|
|
570
|
+
return oMetaModel.getObject("".concat(sEntitySetPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
|
|
547
571
|
}
|
|
548
572
|
/**
|
|
549
573
|
* Requests the messages if annotated for a given context.
|
|
550
574
|
*
|
|
551
575
|
* @function
|
|
552
|
-
* @param
|
|
553
|
-
* @param
|
|
554
|
-
* @returns
|
|
576
|
+
* @param oContext Context for which the messages shall be requested
|
|
577
|
+
* @param oSideEffectsService Service for the SideEffects on SAP Fiori elements
|
|
578
|
+
* @returns Promise which is resolved once messages were requested
|
|
555
579
|
* @private
|
|
556
580
|
* @ui5-restricted
|
|
557
581
|
*/
|
|
@@ -569,12 +593,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
569
593
|
return Promise.resolve();
|
|
570
594
|
}
|
|
571
595
|
/**
|
|
572
|
-
* Executes
|
|
596
|
+
* Executes discard of a draft function using HTTP Post.
|
|
573
597
|
*
|
|
574
598
|
* @function
|
|
575
|
-
* @param
|
|
576
|
-
* @param
|
|
577
|
-
* @returns
|
|
599
|
+
* @param oContext Context for which the action should be performed
|
|
600
|
+
* @param bEnableStrictHandling
|
|
601
|
+
* @returns Resolve function returns the context of the operation
|
|
578
602
|
* @private
|
|
579
603
|
* @ui5-restricted
|
|
580
604
|
*/
|
|
@@ -604,7 +628,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
604
628
|
|
|
605
629
|
return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true).then(function (bExecute) {
|
|
606
630
|
if (!bExecute) {
|
|
607
|
-
return Promise.reject(new Error("Activation of the document was aborted by extension for document: "
|
|
631
|
+
return Promise.reject(new Error("Activation of the document was aborted by extension for document: ".concat(oContext.getPath())));
|
|
608
632
|
}
|
|
609
633
|
|
|
610
634
|
if (!hasPrepareAction(oContext)) {
|
|
@@ -637,10 +661,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
637
661
|
* @name sap.fe.core.actions.draft#deleteDraft
|
|
638
662
|
* @memberof sap.fe.core.actions.draft
|
|
639
663
|
* @static
|
|
640
|
-
* @param
|
|
641
|
-
* @param
|
|
664
|
+
* @param oContext Context of the document to be discarded
|
|
665
|
+
* @param bEnableStrictHandling
|
|
642
666
|
* @private
|
|
643
|
-
* @returns
|
|
667
|
+
* @returns A Promise resolved when the context is deleted
|
|
644
668
|
* @ui5-restricted
|
|
645
669
|
*/
|
|
646
670
|
|
|
@@ -665,6 +689,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
665
689
|
return executeDraftDiscardAction(oContext, bEnableStrictHandling);
|
|
666
690
|
}
|
|
667
691
|
}
|
|
692
|
+
/**
|
|
693
|
+
* The method checks whether an optional parameter in the manifest is set to silently keep the draft in case a forward navigation is triggered
|
|
694
|
+
*
|
|
695
|
+
* @param pageController the reference to the current PageController instance.
|
|
696
|
+
* @returns Boolean value with true or false to silently keep the draft
|
|
697
|
+
*/
|
|
698
|
+
|
|
699
|
+
|
|
700
|
+
function silentlyKeepDraftOnForwardNavigation(pageController) {
|
|
701
|
+
var _oManifest$sapFe, _oManifest$sapFe$app;
|
|
702
|
+
|
|
703
|
+
var rbSilentlyKeep = false;
|
|
704
|
+
var oManifest = pageController.getAppComponent().getManifest();
|
|
705
|
+
rbSilentlyKeep = (oManifest === null || oManifest === void 0 ? void 0 : (_oManifest$sapFe = oManifest["sap.fe"]) === null || _oManifest$sapFe === void 0 ? void 0 : (_oManifest$sapFe$app = _oManifest$sapFe.app) === null || _oManifest$sapFe$app === void 0 ? void 0 : _oManifest$sapFe$app.silentlyKeepDraftOnForwardNavigation) || false;
|
|
706
|
+
return rbSilentlyKeep;
|
|
707
|
+
}
|
|
668
708
|
/**
|
|
669
709
|
* @param fnProcessFunction
|
|
670
710
|
* @param fnCancelFunction
|
|
@@ -678,7 +718,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
678
718
|
function processDataLossOrDraftDiscardConfirmation(fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView) {
|
|
679
719
|
var navigationType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : NavigationType.BackNavigation;
|
|
680
720
|
var oModel = oContext.getModel();
|
|
681
|
-
var draftDataContext = oModel.bindContext(oContext.getPath()
|
|
721
|
+
var draftDataContext = oModel.bindContext("".concat(oContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
|
|
682
722
|
var collaborationConnected = ActivitySync.isConnected(oController.getView());
|
|
683
723
|
var processFunctionForDrafts = !collaborationConnected ? fnProcessFunction : function () {
|
|
684
724
|
ActivitySync.disconnect(oController.getView());
|
|
@@ -689,6 +729,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
689
729
|
|
|
690
730
|
fnProcessFunction.apply.apply(fnProcessFunction, [null].concat(args));
|
|
691
731
|
};
|
|
732
|
+
var bSilentlyKeepDraftOnForwardNavigation = silentlyKeepDraftOnForwardNavigation(oController);
|
|
692
733
|
|
|
693
734
|
if (oContext && oContext.getObject() && (!oContext.getObject().DraftAdministrativeData || oContext.getObject().IsActiveEntity === true)) {
|
|
694
735
|
fnProcessFunction();
|
|
@@ -704,61 +745,76 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
704
745
|
} else {
|
|
705
746
|
processFunctionForDrafts();
|
|
706
747
|
}
|
|
707
|
-
} else {
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
if (
|
|
714
|
-
//
|
|
715
|
-
//
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
// We are editing a draft which has been created earlier but never saved to active
|
|
719
|
-
// version and since the edit state is not dirty, there have been no user changes
|
|
720
|
-
// so in this case we want to silently navigate and do nothing
|
|
721
|
-
processFunctionForDrafts();
|
|
722
|
-
}
|
|
723
|
-
} else {
|
|
724
|
-
// We are editing a draft for an existing active entity
|
|
725
|
-
if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
|
|
726
|
-
// The CreationDateTime and LastChangeDateTime are equal, so this draft was
|
|
727
|
-
// never saved before, hence we're currently editing a newly created draft for
|
|
728
|
-
// an existing active entity for the first time.
|
|
729
|
-
// Also there have so far been no changes made to the draft and in this
|
|
730
|
-
// case we want to silently navigate and delete the draft in case of a back
|
|
731
|
-
// navigation but in case of a forward navigation we want to silently keep it!
|
|
732
|
-
if (navigationType === NavigationType.BackNavigation) {
|
|
733
|
-
var mParameters = {
|
|
734
|
-
skipDiscardPopover: true
|
|
735
|
-
};
|
|
736
|
-
oController.editFlow.cancelDocument(oContext, mParameters).then(function () {
|
|
737
|
-
processFunctionForDrafts();
|
|
738
|
-
}).catch(function (error) {
|
|
739
|
-
Log.error("Error while canceling the document", error);
|
|
740
|
-
});
|
|
741
|
-
} else {
|
|
742
|
-
// In case of a forward navigation we silently keep the draft and only
|
|
743
|
-
// execute the followup function.
|
|
748
|
+
} else if (!oContext.getObject().HasActiveEntity) {
|
|
749
|
+
// There is no active entity so we are editing either newly created data or
|
|
750
|
+
// a draft which has never been saved to active version
|
|
751
|
+
// Since we want to react differently in the two situations, we have to check the
|
|
752
|
+
// dirty state
|
|
753
|
+
if (EditState.isEditStateDirty()) {
|
|
754
|
+
if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime && navigationType === NavigationType.BackNavigation) {
|
|
755
|
+
// in case we have untouched changes for the draft and a "back"
|
|
756
|
+
// navigation we can silently discard the draft again
|
|
757
|
+
// eslint-disable-next-line promise/no-nesting
|
|
758
|
+
DataLossOrDraftDiscardHandler.discardDraft(oController, bSkipBindingToView).then(function () {
|
|
744
759
|
processFunctionForDrafts();
|
|
745
|
-
}
|
|
760
|
+
}).catch(function (error) {
|
|
761
|
+
Log.error("Error while canceling the document", error);
|
|
762
|
+
});
|
|
763
|
+
} else if (navigationType === NavigationType.ForwardNavigation && bSilentlyKeepDraftOnForwardNavigation) {
|
|
764
|
+
// In case we have a "forward navigation" and an additional parameter set in the manifest
|
|
765
|
+
// we "silently" keep the draft
|
|
766
|
+
processFunctionForDrafts();
|
|
746
767
|
} else {
|
|
747
|
-
//
|
|
748
|
-
//
|
|
749
|
-
|
|
750
|
-
if (EditState.isEditStateDirty()) {
|
|
751
|
-
// Changes have been made in the current editing session so we want
|
|
752
|
-
// to show the dataloss dialog and let the user decide
|
|
753
|
-
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
754
|
-
} else {
|
|
755
|
-
// The user started editing the existing draft but did not make any changes
|
|
756
|
-
// in the current editing session, so in this case we do not want
|
|
757
|
-
// to show the dataloss dialog but just keep the draft
|
|
758
|
-
processFunctionForDrafts();
|
|
759
|
-
}
|
|
768
|
+
// In this case data is being changed or a forward navigation is triggered
|
|
769
|
+
// and we always want to show the dataloss dialog on navigation
|
|
770
|
+
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
760
771
|
}
|
|
772
|
+
} else {
|
|
773
|
+
// We are editing a draft which has been created earlier but never saved to active
|
|
774
|
+
// version and since the edit state is not dirty, there have been no user changes
|
|
775
|
+
// so in this case we want to silently navigate and do nothing
|
|
776
|
+
processFunctionForDrafts();
|
|
777
|
+
}
|
|
778
|
+
} else if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
|
|
779
|
+
// We are editing a draft for an existing active entity
|
|
780
|
+
// The CreationDateTime and LastChangeDateTime are equal, so this draft was
|
|
781
|
+
// never saved before, hence we're currently editing a newly created draft for
|
|
782
|
+
// an existing active entity for the first time.
|
|
783
|
+
// Also there have so far been no changes made to the draft and in this
|
|
784
|
+
// case we want to silently navigate and delete the draftin case of a back
|
|
785
|
+
// navigation but in case of a forward navigation we want to silently keep it!
|
|
786
|
+
if (navigationType === NavigationType.BackNavigation) {
|
|
787
|
+
var mParameters = {
|
|
788
|
+
skipDiscardPopover: true
|
|
789
|
+
};
|
|
790
|
+
oController.editFlow.cancelDocument(oContext, mParameters).then(function () {
|
|
791
|
+
processFunctionForDrafts();
|
|
792
|
+
}).catch(function (error) {
|
|
793
|
+
Log.error("Error while canceling the document", error);
|
|
794
|
+
});
|
|
795
|
+
} else {
|
|
796
|
+
// In case of a forward navigation we silently keep the draft and only
|
|
797
|
+
// execute the followup function.
|
|
798
|
+
processFunctionForDrafts();
|
|
761
799
|
}
|
|
800
|
+
} else if (EditState.isEditStateDirty()) {
|
|
801
|
+
if (navigationType === NavigationType.ForwardNavigation && bSilentlyKeepDraftOnForwardNavigation) {
|
|
802
|
+
// In case we have a "forward navigation" and an additional parameter set in the manifest
|
|
803
|
+
// we "silently" keep the draft
|
|
804
|
+
processFunctionForDrafts();
|
|
805
|
+
} else {
|
|
806
|
+
// The CreationDateTime and LastChangeDateTime are NOT equal, so we are currently editing
|
|
807
|
+
// an existing draft and need to distinguish depending on if any changes
|
|
808
|
+
// have been made in the current editing session or not
|
|
809
|
+
// Changes have been made in the current editing session so we want
|
|
810
|
+
// to show the dataloss dialog and let the user decide
|
|
811
|
+
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
812
|
+
}
|
|
813
|
+
} else {
|
|
814
|
+
// The user started editing the existing draft but did not make any changes
|
|
815
|
+
// in the current editing session, so in this case we do not want
|
|
816
|
+
// to show the dataloss dialog but just keep the draft
|
|
817
|
+
processFunctionForDrafts();
|
|
762
818
|
}
|
|
763
819
|
} else {
|
|
764
820
|
fnProcessFunction();
|
|
@@ -774,12 +830,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
774
830
|
activateDocument: activateDocument,
|
|
775
831
|
deleteDraft: deleteDraft,
|
|
776
832
|
executeDraftEditAction: executeDraftEditAction,
|
|
833
|
+
executeDraftPreparationAction: executeDraftPreparationAction,
|
|
777
834
|
computeSiblingInformation: computeSiblingInformation,
|
|
778
835
|
processDataLossOrDraftDiscardConfirmation: processDataLossOrDraftDiscardConfirmation,
|
|
836
|
+
silentlyKeepDraftOnForwardNavigation: silentlyKeepDraftOnForwardNavigation,
|
|
779
837
|
createOperation: createOperation,
|
|
780
838
|
executeDraftDiscardAction: executeDraftDiscardAction,
|
|
781
839
|
NavigationType: NavigationType
|
|
782
840
|
};
|
|
783
841
|
return draft;
|
|
784
842
|
}, false);
|
|
785
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwib3ZlcndyaXRlT25EZW1hbmQiLCJiT3ZlcndyaXRlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0Iiwib1Jlc291cmNlQnVuZGxlIiwib1ZpZXciLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIl9vUmVzb3VyY2VCdW5kbGUiLCJyZXF1ZXN0T2JqZWN0IiwiZHJhZnRBZG1pbkRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwiRXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc29sdmUiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJsb2NhbEkxOG5SZWYiLCJnZXRUZXh0Iiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIm1QYXJhbSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImRyYWZ0Iiwib1Jlc3BvbnNlIiwic3RhdHVzIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJBY3Rpdml0eVN5bmMiLCJpc0NvbGxhYm9yYXRpb25FbmFibGVkIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInNpYmxpbmdJbmZvIiwic2libGluZ0NvbnRleHQiLCJnZXRDb250cm9sbGVyIiwiX3JvdXRpbmciLCJfY3JlYXRlQmluZGluZ0NvbnRleHQiLCJ0YXJnZXRDb250ZXh0IiwiZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCIsImNhbmNlbGVkIiwiZXhjIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJzdGFydHNXaXRoIiwiTG9nIiwibW9kZWwiLCJhZGRpdGlvbmFsUGF0aCIsInJlcGxhY2UiLCJzZWdtZW50cyIsInN1YnN0cmluZyIsInNwbGl0IiwidW5zaGlmdCIsIm9sZFBhdGhzIiwibmV3UGF0aHMiLCJjdXJyZW50UGF0aCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImFsbCIsImNhbm9uaWNhbFBhdGhzIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwidW5kZWZpbmVkIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiTmF2aWdhdGlvblR5cGUiLCJzT3BlcmF0aW9uIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRPYmplY3QiLCJjcmVhdGVPcGVyYXRpb24iLCJvT3B0aW9ucyIsInNPcGVyYXRpb25OYW1lIiwiaGFzUHJlcGFyZUFjdGlvbiIsImdldFByb3BlcnR5IiwiJCRpbmhlcml0RXhwYW5kU2VsZWN0Iiwib09wZXJhdGlvbiIsInNldFBhcmFtZXRlciIsInNHcm91cElkIiwic0FjdGlvbk5hbWUiLCJvRWRpdFByb21pc2UiLCJleGVjdXRlIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwiYmluZCIsImdldEJpbmRpbmciLCJpc0EiLCJvRHJhZnREb2N1bWVudENvbnRleHQiLCJzdWJtaXRCYXRjaCIsImV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24iLCJiSGFzUHJlcGFyZUFjdGlvbiIsImJJZ25vcmVFdGFnIiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsImNhdGNoIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImFUYXJnZXRQYXRocyIsInBhdGhFeHByZXNzaW9ucyIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIm9FcnJvciIsInJlcXVlc3RNZXNzYWdlcyIsImV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIiwiZ3JvdXBJZCIsImdldEdyb3VwSWQiLCJnZXRNZXNzYWdlc1BhdGgiLCJzTWVzc2FnZXNQYXRoIiwiJFByb3BlcnR5UGF0aCIsImV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24iLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJvRGlzY2FyZE9wZXJhdGlvbiIsIm9EaXNjYXJkUHJvbWlzZSIsImFjdGl2YXRlRG9jdW1lbnQiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJzQmF0Y2hHcm91cCIsIm9QcmVwYXJlUHJvbWlzZSIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsImRlbGV0ZURyYWZ0Iiwic0Rpc2NhcmRBY3Rpb24iLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiZGVsZXRlIiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJmblByb2Nlc3NGdW5jdGlvbiIsImZuQ2FuY2VsRnVuY3Rpb24iLCJvQ29udHJvbGxlciIsImJTa2lwQmluZGluZ1RvVmlldyIsIm5hdmlnYXRpb25UeXBlIiwiQmFja05hdmlnYXRpb24iLCJjb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwiaXNDb25uZWN0ZWQiLCJnZXRWaWV3IiwicHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIiwiZGlzY29ubmVjdCIsImFyZ3MiLCJhcHBseSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiaXNGY2xFbmFibGVkIiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsIkRhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyIiwicGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0IiwiSGFzQWN0aXZlRW50aXR5IiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsInNraXBEaXNjYXJkUG9wb3ZlciIsImVkaXRGbG93IiwiY2FuY2VsRG9jdW1lbnQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFnakJPLGtCQUFnQkEsSUFBaEIsRUFBc0JDLE9BQXRCLEVBQStCO0FBQ3JDLFFBQUk7QUFDSCxVQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBakI7QUFDQSxLQUZELENBRUUsT0FBTUcsQ0FBTixFQUFTO0FBQ1YsYUFBT0YsT0FBTyxDQUFDRSxDQUFELENBQWQ7QUFDQTs7QUFDRCxRQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7QUFDMUIsYUFBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVksS0FBSyxDQUFqQixFQUFvQkgsT0FBcEIsQ0FBUDtBQUNBOztBQUNELFdBQU9DLE1BQVA7QUFDQTs7QUFoTEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ2VHLDZCLGFBQ2RDLFEsRUFDQUMsYSxFQUNBQyxXO1FBT0M7QUFBQTs7QUFJOEg7O0FBRS9IO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDLGVBQVNDLGlCQUFULENBQTJCQyxVQUEzQixFQUE0QztBQUMzQyxZQUFJQSxVQUFKLEVBQWdCO0FBQ2Y7QUFDQSxjQUFNQyxNQUFNLEdBQUdMLFFBQVEsQ0FBQ00sUUFBVCxFQUFmO0FBQ0EsY0FBTUMsZ0JBQWdCLEdBQUdGLE1BQU0sQ0FBQ0csV0FBUCxDQUFtQlIsUUFBUSxDQUFDUyxPQUFULEtBQXFCLDBCQUF4QyxFQUFvRUMsZUFBcEUsRUFBekI7QUFDQSxjQUFJQyxlQUFKO0FBRUEsaUJBQVNULFdBQVcsQ0FBQ1UsS0FBWixDQUFrQk4sUUFBbEIsQ0FBMkIsYUFBM0IsQ0FBRCxDQUE2RE8saUJBQTdELEVBQUQsQ0FDTGYsSUFESyxDQUNBLFVBQVVnQixnQkFBVixFQUFpQztBQUN0Q0gsWUFBQUEsZUFBZSxHQUFHRyxnQkFBbEI7QUFDQSxtQkFBT1AsZ0JBQWdCLENBQUNRLGFBQWpCLEVBQVA7QUFDQSxXQUpLLEVBS0xqQixJQUxLLENBS0EsVUFBVWtCLGNBQVYsRUFBK0I7QUFDcEMsZ0JBQUlBLGNBQUosRUFBb0I7QUFDbkI7QUFDQUMsY0FBQUEsZUFBZSxDQUFDQywrQkFBaEI7QUFDQSxrQkFBSUMsS0FBSyxHQUFHSCxjQUFjLENBQUNJLDBCQUFmLElBQTZDSixjQUFjLENBQUNLLGVBQXhFO0FBQ0Esa0JBQU1DLFVBQVUsR0FBSXBCLFdBQVcsQ0FBQ1UsS0FBWixDQUFrQlcsV0FBbEIsRUFBRCxDQUF5Q0MsU0FBNUQ7O0FBQ0Esa0JBQUlMLEtBQUosRUFBVztBQUNWLG9CQUFNTSxnQkFBZ0IsR0FBR0MsV0FBVyxDQUFDQyxpQkFBWixDQUN4QiwwQ0FEd0IsRUFFeEJoQixlQUZ3QixFQUd4QlEsS0FId0IsRUFJeEJHLFVBSndCLENBQXpCO0FBTUFNLGdCQUFBQSxVQUFVLENBQUNDLEtBQVgsQ0FBaUJKLGdCQUFqQjtBQUNBLHNCQUFNLElBQUlLLEtBQUosQ0FBVUwsZ0JBQVYsQ0FBTjtBQUNBLGVBVEQsTUFTTztBQUNOTixnQkFBQUEsS0FBSyxHQUFHSCxjQUFjLENBQUNlLHdCQUFmLElBQTJDZixjQUFjLENBQUNnQixhQUFsRTtBQUNBLG9CQUFNQyxrQkFBa0IsR0FBR1AsV0FBVyxDQUFDQyxpQkFBWixDQUMxQiwyQ0FEMEIsRUFFMUJoQixlQUYwQixFQUcxQlEsS0FIMEIsRUFJMUJHLFVBSjBCLENBQTNCO0FBTUEsdUJBQU9ZLGNBQWMsQ0FBQ0Qsa0JBQUQsQ0FBZCxDQUFtQ25DLElBQW5DLENBQXdDLFlBQVk7QUFDMUQseUJBQU9xQyxzQkFBc0IsQ0FBQ25DLFFBQUQsRUFBVyxLQUFYLENBQTdCO0FBQ0EsaUJBRk0sQ0FBUDtBQUdBO0FBQ0Q7QUFDRCxXQWpDSyxDQUFQO0FBa0NBOztBQUNELGVBQU9vQyxPQUFPLENBQUNDLE1BQVIsQ0FBZSxJQUFJUCxLQUFKLENBQVUsMENBQTBDOUIsUUFBUSxDQUFDUyxPQUFULEVBQXBELENBQWYsQ0FBUDtBQUNBOztBQUVELGVBQVN5QixjQUFULENBQXdCRCxrQkFBeEIsRUFBaUQ7QUFDaEQsZUFBTyxJQUFJRyxPQUFKLENBQVksVUFBVUUsT0FBVixFQUF5Q0QsTUFBekMsRUFBeUU7QUFDM0YsY0FBTUUsT0FBTyxHQUFHLElBQUlDLE1BQUosQ0FBVztBQUMxQkMsWUFBQUEsS0FBSyxFQUFFQyxZQUFZLENBQUNDLE9BQWIsQ0FBcUIsNkJBQXJCLENBRG1CO0FBRTFCQyxZQUFBQSxLQUFLLEVBQUUsU0FGbUI7QUFHMUJDLFlBQUFBLE9BQU8sRUFBRSxJQUFJQyxJQUFKLENBQVM7QUFDakJDLGNBQUFBLElBQUksRUFBRWQ7QUFEVyxhQUFULENBSGlCO0FBTTFCZSxZQUFBQSxXQUFXLEVBQUUsSUFBSUMsTUFBSixDQUFXO0FBQ3ZCRixjQUFBQSxJQUFJLEVBQUVMLFlBQVksQ0FBQ0MsT0FBYixDQUFxQiwyQkFBckIsQ0FEaUI7QUFFdkJPLGNBQUFBLElBQUksRUFBRSxZQUZpQjtBQUd2QkMsY0FBQUEsS0FBSyxFQUFFLFlBQVk7QUFDbEJaLGdCQUFBQSxPQUFPLENBQUNhLEtBQVI7QUFDQWQsZ0JBQUFBLE9BQU8sQ0FBQyxJQUFELENBQVA7QUFDQTtBQU5zQixhQUFYLENBTmE7QUFjMUJlLFlBQUFBLFNBQVMsRUFBRSxJQUFJSixNQUFKLENBQVc7QUFDckJGLGNBQUFBLElBQUksRUFBRUwsWUFBWSxDQUFDQyxPQUFiLENBQXFCLDZCQUFyQixDQURlO0FBRXJCUSxjQUFBQSxLQUFLLEVBQUUsWUFBWTtBQUNsQlosZ0JBQUFBLE9BQU8sQ0FBQ2EsS0FBUjtBQUNBZixnQkFBQUEsTUFBTSxDQUFDLDBDQUEwQ3JDLFFBQVEsQ0FBQ1MsT0FBVCxFQUEzQyxDQUFOO0FBQ0E7QUFMb0IsYUFBWCxDQWRlO0FBcUIxQjZDLFlBQUFBLFVBQVUsRUFBRSxZQUFZO0FBQ3ZCZixjQUFBQSxPQUFPLENBQUNnQixPQUFSO0FBQ0E7QUF2QnlCLFdBQVgsQ0FBaEI7QUF5QkFoQixVQUFBQSxPQUFPLENBQUNpQixhQUFSLENBQXNCLHFCQUF0QjtBQUNBakIsVUFBQUEsT0FBTyxDQUFDa0IsSUFBUjtBQUNBLFNBNUJNLENBQVA7QUE2QkE7O0FBdEZELFVBQU1DLE1BQU0sR0FBR3hELFdBQVcsSUFBSSxFQUE5QjtBQUFBLFVBQ0N3QyxZQUFZLEdBQUlpQixJQUFELENBQWlCQyx3QkFBakIsQ0FBMEMsYUFBMUMsQ0FEaEI7QUFBQSxVQUVDQyx1QkFBdUIsR0FDdEIsT0FBT0gsTUFBTSxDQUFDSSxnQkFBZCxLQUFtQyxXQUFuQyxJQUFtRCxPQUFPSixNQUFNLENBQUNJLGdCQUFkLEtBQW1DLFNBQW5DLElBQWdESixNQUFNLENBQUNJLGdCQUg1Rzs7QUF3RkEsVUFBSSxDQUFDOUQsUUFBTCxFQUFlO0FBQ2QsZUFBT29DLE9BQU8sQ0FBQ0MsTUFBUixDQUFlLElBQUlQLEtBQUosQ0FBVSxnREFBVixDQUFmLENBQVA7QUFDQTs7QUFFRCxVQUFNaUMsUUFBUSxHQUFHTCxNQUFNLENBQUNNLHFDQUFQLEdBQ2ROLE1BQU0sQ0FBQ00scUNBQVAsQ0FBNkNoRSxRQUE3QyxFQUF1RDZELHVCQUF2RCxDQURjLEdBRWQsSUFGSDs7QUFJQSxVQUFJLENBQUNFLFFBQUwsRUFBZTtBQUNkLGNBQU0sSUFBSWpDLEtBQUosQ0FBVSwyREFBMkQ5QixRQUFRLENBQUNTLE9BQVQsRUFBckUsQ0FBTjtBQUNBOztBQUNELFVBQUl3RCxxQkFBcUIsR0FBRyxLQUE1QjtBQXBHQyxnREFxR0c7QUFBQTtBQUFBOztBQTRCSCxjQUFJQSxxQkFBSixFQUEyQjtBQUMxQixtQkFBT0MsYUFBUDtBQUNBOztBQUVEQSxVQUFBQSxhQUFhLEdBQ1pBLGFBQWEsSUFBSVIsTUFBTSxDQUFDUyxvQ0FBeEIsR0FDR1QsTUFBTSxDQUFDUyxvQ0FBUCxDQUE0Q25FLFFBQTVDLEVBQXNEa0UsYUFBdEQsQ0FESCxHQUVHQSxhQUhKO0FBaENHO0FBQUEsZ0JBcUNDQSxhQXJDRDtBQUFBOztBQXNDRixrQkFBTUUsZUFBZSxHQUFHQyxhQUFhLENBQUNILGFBQUQsRUFBZ0JJLGVBQWUsQ0FBQ0MsSUFBaEMsQ0FBckM7QUFDQSxrQkFBTUMsWUFBWSxHQUFHdkUsYUFBYSxDQUFDd0UscUJBQWQsR0FBc0NDLHlCQUF0QyxDQUFnRU4sZUFBaEUsRUFBaUZGLGFBQWpGLENBQXJCOztBQXZDRSxrQkF3Q0VNLFlBeENGLGFBd0NFQSxZQXhDRix3Q0F3Q0VBLFlBQVksQ0FBRUcsY0F4Q2hCLGtEQXdDRSxzQkFBOEJDLE1BeENoQztBQUFBLHVDQXlDSzNFLGFBQWEsQ0FBQ3dFLHFCQUFkLEdBQXNDSSxnQ0FBdEMsQ0FBdUVMLFlBQXZFLEVBQXFGTixhQUFyRixDQXpDTDtBQTJDRCx5QkFBT0EsYUFBUDtBQTNDQztBQUFBO0FBNkNELHVCQUFPQSxhQUFQO0FBN0NDO0FBQUE7QUFBQTtBQUFBOztBQUNILFlBQUlBLGFBQTZCLEdBQUcsSUFBcEM7O0FBREcsdUNBRUM7QUFBQSxpQ0FDbUJZLEtBQUssQ0FBQzNDLHNCQUFOLENBQTZCbkMsUUFBN0IsRUFBdUM2RCx1QkFBdkMsQ0FEbkI7QUFDSEssWUFBQUEsYUFBYSx3QkFBYjtBQURHO0FBRUgsU0FKRSxZQUlNYSxTQUpOLEVBSXNCO0FBQUE7QUFBQSxnQkFFcEJsQix1QkFBdUIsSUFBSWtCLFNBQVMsQ0FBQ0MsTUFBVixLQUFxQixHQUY1QjtBQUd2Qi9ELGNBQUFBLGVBQWUsQ0FBQ2dFLDZCQUFoQjtBQUNBaEUsY0FBQUEsZUFBZSxDQUFDQywrQkFBaEI7QUFKdUI7QUFBQSxvQkFLbkJnRSxZQUFZLENBQUNDLHNCQUFiLENBQW9DakYsV0FBVyxDQUFDVSxLQUFoRCxDQUxtQjtBQUFBLHlDQU1Ja0UsS0FBSyxDQUFDTSx5QkFBTixDQUFnQ3BGLFFBQWhDLEVBQTBDQSxRQUExQyxDQU5KLGlCQU1oQnFGLFdBTmdCO0FBT3RCLHdCQUFNQyxjQUFjLEdBQUlwRixXQUFXLENBQUNVLEtBQVosQ0FBa0IyRSxhQUFsQixFQUFELENBQTJDQyxRQUEzQyxDQUFvREMscUJBQXBELENBQ3RCSixXQURzQixhQUN0QkEsV0FEc0IsdUJBQ3RCQSxXQUFXLENBQUVLLGFBQWIsQ0FBMkJqRixPQUEzQixFQURzQixFQUV0QlQsUUFBUSxDQUFDTSxRQUFULEVBRnNCLENBQXZCOztBQUlBMkQsb0JBQUFBLHFCQUFxQixHQUFHLElBQXhCO0FBWHNCO0FBQUEsMkJBWWZxQixjQVplO0FBQUE7QUFBQTtBQUFBLHlDQWNBbkYsaUJBQWlCLENBQ3RDdUQsTUFBTSxDQUFDaUMsMkNBQVAsR0FBcURqQyxNQUFNLENBQUNpQywyQ0FBUCxFQUFyRCxHQUE0RyxJQUR0RSxDQWRqQjtBQWN0QnpCLG9CQUFBQSxhQUFhLHFCQUFiO0FBZHNCO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0JBbUJuQixFQUFFYSxTQUFTLElBQUlBLFNBQVMsQ0FBQ2EsUUFBekIsQ0FuQm1CO0FBb0J0QixzQkFBTSxJQUFJOUQsS0FBSixDQUFVaUQsU0FBVixDQUFOO0FBcEJzQjtBQUFBO0FBQUE7QUF1QnhCLFNBM0JFOztBQUFBO0FBZ0RILE9BckpBLFlBcUpRYyxHQXJKUixFQXFKa0I7QUFDbEIsZUFBT3pELE9BQU8sQ0FBQ0MsTUFBUixDQUFld0QsR0FBZixDQUFQO0FBQ0EsT0F2SkE7QUF3SkQsSzs7OztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBdFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDZVQseUIsYUFDZFUsa0IsRUFDQUMsdUI7UUFDMEM7QUFDMUMsVUFBSSxDQUFDQSx1QkFBdUIsQ0FBQ3RGLE9BQXhCLEdBQWtDdUYsVUFBbEMsQ0FBNkNGLGtCQUFrQixDQUFDckYsT0FBbkIsRUFBN0MsQ0FBTCxFQUFpRjtBQUNoRjtBQUNBd0YsUUFBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLDBDQUFWO0FBQ0EsY0FBTSxJQUFJQyxLQUFKLENBQVUsMENBQVYsQ0FBTjtBQUNBOztBQUVELFVBQU1vRSxLQUFLLEdBQUdKLGtCQUFrQixDQUFDeEYsUUFBbkIsRUFBZDtBQVAwQyxnREFRdEM7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EsWUFBTTZGLGNBQWMsR0FBR0osdUJBQXVCLENBQUN0RixPQUF4QixHQUFrQzJGLE9BQWxDLENBQTBDTixrQkFBa0IsQ0FBQ3JGLE9BQW5CLEVBQTFDLEVBQXdFLEVBQXhFLENBQXZCO0FBQ0EsWUFBTTRGLFFBQVEsR0FBR0YsY0FBYyxHQUFHQSxjQUFjLENBQUNHLFNBQWYsQ0FBeUIsQ0FBekIsRUFBNEJDLEtBQTVCLENBQWtDLEdBQWxDLENBQUgsR0FBNEMsRUFBM0UsQ0FSRyxDQVNIOztBQUNBRixRQUFBQSxRQUFRLENBQUNHLE9BQVQsQ0FBaUJWLGtCQUFrQixDQUFDckYsT0FBbkIsR0FBNkI2RixTQUE3QixDQUF1QyxDQUF2QyxDQUFqQixFQVZHLENBWUg7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsWUFBTUcsUUFBa0IsR0FBRyxFQUEzQjtBQUNBLFlBQU1DLFFBQWtCLEdBQUcsRUFBM0I7QUFDQSxZQUFJQyxXQUFXLEdBQUcsRUFBbEI7QUFDQSxZQUFNQyxxQkFBcUIsR0FBR1AsUUFBUSxDQUFDUSxHQUFULENBQWEsVUFBQ0MsT0FBRCxFQUFhO0FBQ3ZESCxVQUFBQSxXQUFXLGVBQVFHLE9BQVIsQ0FBWDtBQUNBTCxVQUFBQSxRQUFRLENBQUNELE9BQVQsQ0FBaUJHLFdBQWpCO0FBQ0EsY0FBTXJCLGNBQWMsR0FBR1ksS0FBSyxDQUFDMUYsV0FBTixDQUFrQm1HLFdBQVcsR0FBRyxnQkFBaEMsRUFBa0RqRyxlQUFsRCxFQUF2QjtBQUNBLGlCQUFPNEUsY0FBYyxDQUFDeUIsb0JBQWYsRUFBUDtBQUNBLFNBTDZCLENBQTlCLENBbkJHLENBMEJIO0FBQ0E7QUFDQTtBQUNBOztBQTdCRywrQkE4QjJCM0UsT0FBTyxDQUFDNEUsR0FBUixDQUFZSixxQkFBWixDQTlCM0I7QUE4QkgsY0FBTUssY0FBYyxlQUFwQjtBQUNBLGNBQUlDLFdBQVcsR0FBRyxFQUFsQjtBQUNBRCxVQUFBQSxjQUFjLENBQUNFLE9BQWYsQ0FBdUIsVUFBQ0MsYUFBRCxFQUFnQkMsS0FBaEIsRUFBMEI7QUFDaEQsZ0JBQUlBLEtBQUssS0FBSyxDQUFkLEVBQWlCO0FBQ2hCLGtCQUFNQyxVQUFVLEdBQUdqQixRQUFRLENBQUNnQixLQUFELENBQVIsQ0FBZ0JqQixPQUFoQixDQUF3QixPQUF4QixFQUFpQyxFQUFqQyxDQUFuQixDQURnQixDQUN5Qzs7QUFDekQsa0JBQU1tQixJQUFJLEdBQUdILGFBQWEsQ0FBQ2hCLE9BQWQsQ0FBc0IsTUFBdEIsRUFBOEIsR0FBOUIsQ0FBYixDQUZnQixDQUVpQzs7QUFDakRjLGNBQUFBLFdBQVcsZUFBUUksVUFBUixTQUFxQkMsSUFBckIsQ0FBWDtBQUNBLGFBSkQsTUFJTztBQUNOTCxjQUFBQSxXQUFXLEdBQUdFLGFBQWQsQ0FETSxDQUN1QjtBQUM3Qjs7QUFDRFYsWUFBQUEsUUFBUSxDQUFDRixPQUFULENBQWlCVSxXQUFqQjtBQUNBLFdBVEQ7QUFXQSxpQkFBTztBQUNOeEIsWUFBQUEsYUFBYSxFQUFFUSxLQUFLLENBQUMxRixXQUFOLENBQWtCMEcsV0FBbEIsRUFBK0J4RyxlQUEvQixFQURUO0FBQ3NFO0FBQzVFOEcsWUFBQUEsV0FBVyxFQUFFZixRQUFRLENBQUNJLEdBQVQsQ0FBYSxVQUFDWSxPQUFELEVBQVVKLEtBQVYsRUFBb0I7QUFDN0MscUJBQU87QUFDTkksZ0JBQUFBLE9BQU8sRUFBUEEsT0FETTtBQUVOQyxnQkFBQUEsT0FBTyxFQUFFaEIsUUFBUSxDQUFDVyxLQUFEO0FBRlgsZUFBUDtBQUlBLGFBTFk7QUFGUCxXQUFQO0FBM0NHO0FBb0RILE9BNUR5QyxjQTREMUI7QUFDZjtBQUNBLGVBQU9NLFNBQVA7QUFDQSxPQS9EeUM7QUFnRTFDLEs7Ozs7O0FBalhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0EsTUFBTXJELGVBQWUsR0FBRztBQUN2QkMsSUFBQUEsSUFBSSxFQUFFLFlBRGlCO0FBRXZCcUQsSUFBQUEsVUFBVSxFQUFFLGtCQUZXO0FBR3ZCQyxJQUFBQSxPQUFPLEVBQUUsZUFIYztBQUl2QkMsSUFBQUEsT0FBTyxFQUFFO0FBSmMsR0FBeEI7QUFNQTs7TUFDS0MsYztBQUlMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7YUFwQktBLGM7QUFBQUEsSUFBQUEsYztBQUFBQSxJQUFBQSxjO0tBQUFBLGMsS0FBQUEsYzs7QUFxQkwsV0FBUzFELGFBQVQsQ0FBdUJyRSxRQUF2QixFQUFzQ2dJLFVBQXRDLEVBQTBEO0FBQ3pELFFBQU0zSCxNQUFNLEdBQUdMLFFBQVEsQ0FBQ00sUUFBVCxFQUFmO0FBQUEsUUFDQzJILFVBQVUsR0FBRzVILE1BQU0sQ0FBQzZILFlBQVAsRUFEZDtBQUFBLFFBRUNDLGNBQWMsR0FBR0YsVUFBVSxDQUFDRyxXQUFYLENBQXVCcEksUUFBUSxDQUFDUyxPQUFULEVBQXZCLENBRmxCO0FBSUEsV0FBT3dILFVBQVUsQ0FBQ0ksU0FBWCxDQUFxQkYsY0FBYyxHQUFHLDRDQUFqQixHQUFnRUgsVUFBckYsQ0FBUDtBQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBU00sZUFBVCxDQUF5QnRJLFFBQXpCLEVBQXdDZ0ksVUFBeEMsRUFBNERPLFFBQTVELEVBQTRFO0FBQzNFLFFBQU1DLGNBQWMsR0FBR25FLGFBQWEsQ0FBQ3JFLFFBQUQsRUFBV2dJLFVBQVgsQ0FBcEM7QUFFQSxXQUFPaEksUUFBUSxDQUFDTSxRQUFULEdBQW9CRSxXQUFwQixDQUFnQ2dJLGNBQWMsR0FBRyxPQUFqRCxFQUEwRHhJLFFBQTFELEVBQW9FdUksUUFBcEUsQ0FBUDtBQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTRSxnQkFBVCxDQUEwQnpJLFFBQTFCLEVBQXlDO0FBQ3hDLFdBQU8sQ0FBQyxDQUFDcUUsYUFBYSxDQUFDckUsUUFBRCxFQUFXc0UsZUFBZSxDQUFDd0QsT0FBM0IsQ0FBdEI7QUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTM0Ysc0JBQVQsQ0FBZ0NuQyxRQUFoQyxFQUErQzhELGdCQUEvQyxFQUEwRTtBQUN6RSxRQUFJOUQsUUFBUSxDQUFDMEksV0FBVCxDQUFxQixnQkFBckIsQ0FBSixFQUE0QztBQUMzQyxVQUFNSCxRQUFRLEdBQUc7QUFBRUksUUFBQUEscUJBQXFCLEVBQUU7QUFBekIsT0FBakI7QUFDQSxVQUFNQyxVQUFVLEdBQUdOLGVBQWUsQ0FBQ3RJLFFBQUQsRUFBV3NFLGVBQWUsQ0FBQ0MsSUFBM0IsRUFBaUNnRSxRQUFqQyxDQUFsQztBQUNBSyxNQUFBQSxVQUFVLENBQUNDLFlBQVgsQ0FBd0IsaUJBQXhCLEVBQTJDL0UsZ0JBQTNDO0FBQ0EsVUFBTWdGLFFBQVEsR0FBRyxRQUFqQjtBQUNBLFVBQU1wRyxZQUFZLEdBQUlpQixJQUFELENBQWlCQyx3QkFBakIsQ0FBMEMsYUFBMUMsQ0FBckI7QUFDQSxVQUFNbUYsV0FBVyxHQUFHckcsWUFBWSxDQUFDQyxPQUFiLENBQXFCLDJCQUFyQixDQUFwQixDQU4yQyxDQU8zQzs7QUFDQSxVQUFNcUcsWUFBWSxHQUFHSixVQUFVLENBQzdCSyxPQURtQixDQUVuQkgsUUFGbUIsRUFHbkJuQixTQUhtQixFQUluQmpHLFdBQVcsQ0FBQ3dILHdCQUFaLENBQXFDQyxJQUFyQyxDQUEwQ3JFLEtBQTFDLEVBQWlEZ0UsUUFBakQsRUFBMkRDLFdBQTNELEVBQXdFL0ksUUFBUSxDQUFDTSxRQUFULEVBQXhFLENBSm1CLEVBS25CTixRQUFRLENBQUNvSixVQUFULEdBQXNCQyxHQUF0QixDQUEwQix3Q0FBMUIsQ0FMbUIsRUFPbkJ2SixJQVBtQixDQU9kLFVBQVV3SixxQkFBVixFQUFzQztBQUMzQyxlQUFPQSxxQkFBUDtBQUNBLE9BVG1CLENBQXJCO0FBVUFWLE1BQUFBLFVBQVUsQ0FBQ3RJLFFBQVgsR0FBc0JpSixXQUF0QixDQUFrQ1QsUUFBbEM7QUFDQSxhQUFPRSxZQUFQO0FBQ0EsS0FwQkQsTUFvQk87QUFDTixZQUFNLElBQUlsSCxLQUFKLENBQVUscUNBQVYsQ0FBTjtBQUNBO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTMEgsNEJBQVQsQ0FBc0N4SixRQUF0QyxFQUFxREMsYUFBckQsRUFBa0Y2SSxRQUFsRixFQUFxRztBQUNwRyxRQUFNVyxpQkFBaUIsR0FBR2hCLGdCQUFnQixDQUFDekksUUFBRCxDQUExQyxDQURvRyxDQUdwRztBQUNBOztBQUNBLFFBQU0wSixXQUFXLEdBQUdELGlCQUFwQjs7QUFFQSxRQUFJLENBQUN6SixRQUFRLENBQUMwSSxXQUFULENBQXFCLGdCQUFyQixDQUFMLEVBQTZDO0FBQzVDLFVBQU1FLFVBQVUsR0FBR04sZUFBZSxDQUFDdEksUUFBRCxFQUFXc0UsZUFBZSxDQUFDc0QsVUFBM0IsRUFBdUM7QUFBRWUsUUFBQUEscUJBQXFCLEVBQUU7QUFBekIsT0FBdkMsQ0FBbEM7QUFDQSxVQUFNakcsWUFBWSxHQUFJaUIsSUFBRCxDQUFpQkMsd0JBQWpCLENBQTBDLGFBQTFDLENBQXJCO0FBQ0EsVUFBTW1GLFdBQVcsR0FBR3JHLFlBQVksQ0FBQ0MsT0FBYixDQUFxQix1QkFBckIsQ0FBcEI7QUFDQSxhQUFPaUcsVUFBVSxDQUNmSyxPQURLLENBRUxILFFBRkssRUFHTFksV0FISyxFQUlMWixRQUFRLEdBQUdwSCxXQUFXLENBQUN3SCx3QkFBWixDQUFxQ0MsSUFBckMsQ0FBMENyRSxLQUExQyxFQUFpRGdFLFFBQWpELEVBQTJEQyxXQUEzRCxFQUF3RS9JLFFBQVEsQ0FBQ00sUUFBVCxFQUF4RSxDQUFILEdBQWtHcUgsU0FKckcsRUFLTDNILFFBQVEsQ0FBQ29KLFVBQVQsR0FBc0JDLEdBQXRCLENBQTBCLHdDQUExQixDQUxLLEVBTUo7QUFOSSxPQU9MdkosSUFQSyxDQU9BLFVBQVU2SixzQkFBVixFQUF1QztBQUM1QyxlQUFPQSxzQkFBUDtBQUNBLE9BVEssRUFVTEMsS0FWSyxFQVdMO0FBQ0Esa0JBQVk7QUFDWCxZQUFJSCxpQkFBSixFQUF1QjtBQUN0QixjQUFNVixZQUFXLEdBQUcxRSxhQUFhLENBQUNyRSxRQUFELEVBQVdzRSxlQUFlLENBQUN3RCxPQUEzQixDQUFqQztBQUFBLGNBQ0MrQixtQkFBbUIsR0FBRzVKLGFBQWEsQ0FBQ3dFLHFCQUFkLEVBRHZCO0FBQUEsY0FFQ3FGLGtCQUFrQixHQUFHRCxtQkFBbUIsQ0FBQ25GLHlCQUFwQixDQUE4Q3FFLFlBQTlDLEVBQTJEL0ksUUFBM0QsQ0FGdEI7QUFBQSxjQUdDK0osWUFBWSxHQUFHRCxrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUNFLGVBSHpEOztBQUlBLGNBQUlELFlBQVksSUFBSUEsWUFBWSxDQUFDbkYsTUFBYixHQUFzQixDQUExQyxFQUE2QztBQUM1Q2lGLFlBQUFBLG1CQUFtQixDQUFDSSxrQkFBcEIsQ0FBdUNGLFlBQXZDLEVBQXFEL0osUUFBckQsRUFBK0Q0SixLQUEvRCxDQUFxRSxVQUFVTSxNQUFWLEVBQXVCO0FBQzNGakUsY0FBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLHFDQUFWLEVBQWlEcUksTUFBakQ7QUFDQSxhQUZEO0FBR0EsV0FKRCxNQUlPO0FBQ05DLFlBQUFBLGVBQWUsQ0FBQ25LLFFBQUQsRUFBVzZKLG1CQUFYLENBQWYsQ0FBK0NELEtBQS9DLENBQXFELFVBQVVNLE1BQVYsRUFBdUI7QUFDM0VqRSxjQUFBQSxHQUFHLENBQUNwRSxLQUFKLENBQVUsaUNBQVYsRUFBNkNxSSxNQUE3QztBQUNBLGFBRkQ7QUFHQTtBQUNEOztBQUNELGVBQU85SCxPQUFPLENBQUNDLE1BQVIsRUFBUDtBQUNBLE9BN0JJLENBQVA7QUErQkEsS0FuQ0QsTUFtQ087QUFDTixZQUFNLElBQUlQLEtBQUosQ0FBVSxnRUFBVixDQUFOO0FBQ0E7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTc0ksNkJBQVQsQ0FBdUNwSyxRQUF2QyxFQUEwRHFLLE9BQTFELEVBQTRFO0FBQzNFLFFBQUksQ0FBQ3JLLFFBQVEsQ0FBQzBJLFdBQVQsQ0FBcUIsZ0JBQXJCLENBQUwsRUFBNkM7QUFDNUMsVUFBTUUsVUFBVSxHQUFHTixlQUFlLENBQUN0SSxRQUFELEVBQVdzRSxlQUFlLENBQUN3RCxPQUEzQixDQUFsQyxDQUQ0QyxDQUc1Qzs7QUFDQWMsTUFBQUEsVUFBVSxDQUFDQyxZQUFYLENBQXdCLHNCQUF4QixFQUFnRCxFQUFoRDtBQUVBLFVBQU1DLFFBQVEsR0FBR3VCLE9BQU8sSUFBSXpCLFVBQVUsQ0FBQzBCLFVBQVgsRUFBNUI7QUFDQSxhQUFPMUIsVUFBVSxDQUNmSyxPQURLLENBQ0dILFFBREgsRUFFTGhKLElBRkssQ0FFQSxZQUFZO0FBQ2pCLGVBQU84SSxVQUFQO0FBQ0EsT0FKSyxFQUtMZ0IsS0FMSyxDQUtDLFVBQVVNLE1BQVYsRUFBdUI7QUFDN0JqRSxRQUFBQSxHQUFHLENBQUNwRSxLQUFKLENBQVUscUNBQVYsRUFBaURxSSxNQUFqRDtBQUNBLE9BUEssQ0FBUDtBQVFBLEtBZkQsTUFlTztBQUNOLFlBQU0sSUFBSXBJLEtBQUosQ0FBVSxpRUFBVixDQUFOO0FBQ0E7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBU3lJLGVBQVQsQ0FBeUJ2SyxRQUF6QixFQUFvRDtBQUNuRCxRQUFNSyxNQUFNLEdBQUdMLFFBQVEsQ0FBQ00sUUFBVCxFQUFmO0FBQUEsUUFDQzJILFVBQVUsR0FBRzVILE1BQU0sQ0FBQzZILFlBQVAsRUFEZDtBQUFBLFFBRUNDLGNBQWMsR0FBR0YsVUFBVSxDQUFDRyxXQUFYLENBQXVCcEksUUFBUSxDQUFDUyxPQUFULEVBQXZCLENBRmxCO0FBR0EsV0FBT3dILFVBQVUsQ0FBQ0ksU0FBWCxDQUFxQkYsY0FBYyxHQUFHLGlEQUF0QyxDQUFQO0FBQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBU2dDLGVBQVQsQ0FBeUJuSyxRQUF6QixFQUF3QzZKLG1CQUF4QyxFQUFpRjtBQUNoRixRQUFNVyxhQUFhLEdBQUdELGVBQWUsQ0FBQ3ZLLFFBQUQsQ0FBckM7O0FBQ0EsUUFBSXdLLGFBQUosRUFBbUI7QUFDbEIsYUFBT1gsbUJBQW1CLENBQUNJLGtCQUFwQixDQUF1QyxDQUFDO0FBQUVRLFFBQUFBLGFBQWEsRUFBRUQ7QUFBakIsT0FBRCxDQUF2QyxFQUFrRnhLLFFBQWxGLENBQVA7QUFDQTs7QUFDRCxXQUFPb0MsT0FBTyxDQUFDRSxPQUFSLEVBQVA7QUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTb0kseUJBQVQsQ0FBbUMxSyxRQUFuQyxFQUFrRDJLLHFCQUFsRCxFQUFxRztBQUNwRyxRQUFJLENBQUMzSyxRQUFRLENBQUMwSSxXQUFULENBQXFCLGdCQUFyQixDQUFMLEVBQTZDO0FBQzVDLFVBQU1rQyxpQkFBaUIsR0FBRzlGLEtBQUssQ0FBQ3dELGVBQU4sQ0FBc0J0SSxRQUF0QixFQUFnQ3NFLGVBQWUsQ0FBQ3VELE9BQWhELENBQTFCO0FBQ0EsVUFBTW5GLFlBQVksR0FBSWlCLElBQUQsQ0FBaUJDLHdCQUFqQixDQUEwQyxhQUExQyxDQUFyQjtBQUNBLFVBQU1rRixRQUFRLEdBQUcsUUFBakI7QUFDQSxVQUFNQyxXQUFXLEdBQUdyRyxZQUFZLENBQUNDLE9BQWIsQ0FBcUIsMkNBQXJCLENBQXBCLENBSjRDLENBSzVDOztBQUNBLFVBQU1rSSxlQUFlLEdBQUcsQ0FBQ0YscUJBQUQsR0FDckJDLGlCQUFpQixDQUFDM0IsT0FBbEIsQ0FBMEJILFFBQTFCLENBRHFCLEdBRXJCOEIsaUJBQWlCLENBQUMzQixPQUFsQixDQUNBSCxRQURBLEVBRUFuQixTQUZBLEVBR0FqRyxXQUFXLENBQUN3SCx3QkFBWixDQUFxQ0MsSUFBckMsQ0FBMENyRSxLQUExQyxFQUFpRGdFLFFBQWpELEVBQTJEQyxXQUEzRCxFQUF3RS9JLFFBQVEsQ0FBQ00sUUFBVCxFQUF4RSxDQUhBLEVBSUEsS0FKQSxDQUZIO0FBUUFOLE1BQUFBLFFBQVEsQ0FBQ00sUUFBVCxHQUFvQmlKLFdBQXBCLENBQWdDVCxRQUFoQztBQUNBLGFBQU8rQixlQUFQO0FBQ0EsS0FoQkQsTUFnQk87QUFDTixZQUFNLElBQUkvSSxLQUFKLENBQVUsNkRBQVYsQ0FBTjtBQUNBO0FBQ0Q7O0FBeVJELFdBQVNnSixnQkFBVCxDQUNDOUssUUFERCxFQUVDQyxhQUZELEVBR0NDLFdBSEQsRUFJRTtBQUNELFFBQU13RCxNQUFNLEdBQUd4RCxXQUFXLElBQUksRUFBOUI7O0FBRUEsUUFBSSxDQUFDRixRQUFMLEVBQWU7QUFDZCxhQUFPb0MsT0FBTyxDQUFDQyxNQUFSLENBQWUsSUFBSVAsS0FBSixDQUFVLCtDQUFWLENBQWYsQ0FBUDtBQUNBOztBQUNELFdBQU9NLE9BQU8sQ0FBQ0UsT0FBUixDQUFnQm9CLE1BQU0sQ0FBQ3FILHdCQUFQLEdBQWtDckgsTUFBTSxDQUFDcUgsd0JBQVAsQ0FBZ0MvSyxRQUFoQyxDQUFsQyxHQUE4RSxJQUE5RixFQUNMRixJQURLLENBQ0EsVUFBVWlFLFFBQVYsRUFBeUI7QUFDOUIsVUFBSSxDQUFDQSxRQUFMLEVBQWU7QUFDZCxlQUFPM0IsT0FBTyxDQUFDQyxNQUFSLENBQWUsSUFBSVAsS0FBSixDQUFVLHVFQUF1RTlCLFFBQVEsQ0FBQ1MsT0FBVCxFQUFqRixDQUFmLENBQVA7QUFDQTs7QUFFRCxVQUFJLENBQUNnSSxnQkFBZ0IsQ0FBQ3pJLFFBQUQsQ0FBckIsRUFBaUM7QUFDaEMsZUFBT3dKLDRCQUE0QixDQUFDeEosUUFBRCxFQUFXQyxhQUFYLENBQW5DO0FBQ0E7QUFFRDs7O0FBQ0EsVUFBTStLLFdBQVcsR0FBRyxPQUFwQixDQVY4QixDQVc5Qjs7QUFDQSxVQUFNQyxlQUFlLEdBQUdiLDZCQUE2QixDQUFDcEssUUFBRCxFQUFXZ0wsV0FBWCxDQUFyRDtBQUNBaEwsTUFBQUEsUUFBUSxDQUFDTSxRQUFULEdBQW9CaUosV0FBcEIsQ0FBZ0N5QixXQUFoQztBQUVBLFVBQU1FLGdCQUFnQixHQUFHMUIsNEJBQTRCLENBQUN4SixRQUFELEVBQVdDLGFBQVgsRUFBMEIrSyxXQUExQixDQUFyRDtBQUVBLGFBQU81SSxPQUFPLENBQUM0RSxHQUFSLENBQVksQ0FBQ2lFLGVBQUQsRUFBa0JDLGdCQUFsQixDQUFaLEVBQ0xwTCxJQURLLENBQ0EsVUFBVXFMLE1BQVYsRUFBOEI7QUFDbkMsZUFBT0EsTUFBTSxDQUFDLENBQUQsQ0FBYjtBQUNBLE9BSEssRUFJTHZCLEtBSkssQ0FJQyxVQUFVL0QsR0FBVixFQUFvQjtBQUMxQixlQUFPekQsT0FBTyxDQUFDQyxNQUFSLENBQWV3RCxHQUFmLENBQVA7QUFDQSxPQU5LLENBQVA7QUFPQSxLQXpCSyxFQTBCTC9GLElBMUJLLENBMEJBLFVBQVU2SixzQkFBVixFQUF1QztBQUM1QyxhQUFPdkgsT0FBTyxDQUFDRSxPQUFSLENBQ05vQixNQUFNLENBQUMwSCx1QkFBUCxHQUFpQzFILE1BQU0sQ0FBQzBILHVCQUFQLENBQStCcEwsUUFBL0IsRUFBeUMySixzQkFBekMsQ0FBakMsR0FBb0dBLHNCQUQ5RixDQUFQO0FBR0EsS0E5QkssRUErQkxDLEtBL0JLLENBK0JDLFVBQVUvRCxHQUFWLEVBQW9CO0FBQzFCLGFBQU96RCxPQUFPLENBQUNDLE1BQVIsQ0FBZXdELEdBQWYsQ0FBUDtBQUNBLEtBakNLLENBQVA7QUFrQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTd0YsV0FBVCxDQUFxQnJMLFFBQXJCLEVBQW9DMksscUJBQXBDLEVBQXVGO0FBQ3RGLFFBQU1XLGNBQWMsR0FBR2pILGFBQWEsQ0FBQ3JFLFFBQUQsRUFBV3NFLGVBQWUsQ0FBQ3VELE9BQTNCLENBQXBDO0FBQUEsUUFDQzBELGVBQWUsR0FBR3ZMLFFBQVEsQ0FBQ3FJLFNBQVQsR0FBcUJtRCxjQUR4Qzs7QUFHQSxRQUFJRCxlQUFlLElBQUssQ0FBQ0EsZUFBRCxJQUFvQixDQUFDRCxjQUE3QyxFQUE4RDtBQUM3RDtBQUNBLFVBQUl0TCxRQUFRLENBQUN5TCxpQkFBVCxFQUFKLEVBQWtDO0FBQ2pDLGVBQU96TCxRQUFRLENBQ2JvSixVQURLLEdBRUxzQyxZQUZLLEdBR0w1TCxJQUhLLENBR0EsWUFBWTtBQUNqQixpQkFBT0UsUUFBUSxDQUFDMkwsTUFBVCxFQUFQO0FBQ0EsU0FMSyxFQU1ML0IsS0FOSyxDQU1DLFVBQVUvSCxLQUFWLEVBQXNCO0FBQzVCLGlCQUFPTyxPQUFPLENBQUNDLE1BQVIsQ0FBZVIsS0FBZixDQUFQO0FBQ0EsU0FSSyxDQUFQO0FBU0EsT0FWRCxNQVVPO0FBQ04sZUFBTzdCLFFBQVEsQ0FBQzJMLE1BQVQsRUFBUDtBQUNBO0FBQ0QsS0FmRCxNQWVPO0FBQ047QUFDQSxhQUFPakIseUJBQXlCLENBQUMxSyxRQUFELEVBQVcySyxxQkFBWCxDQUFoQztBQUNBO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTaUIseUNBQVQsQ0FDQ0MsaUJBREQsRUFFQ0MsZ0JBRkQsRUFHQzlMLFFBSEQsRUFJQytMLFdBSkQsRUFLQ0Msa0JBTEQsRUFPRTtBQUFBLFFBRERDLGNBQ0MsdUVBRGdDbEUsY0FBYyxDQUFDbUUsY0FDL0M7QUFDRCxRQUFNN0wsTUFBTSxHQUFHTCxRQUFRLENBQUNNLFFBQVQsRUFBZjtBQUNBLFFBQU1DLGdCQUFnQixHQUFHRixNQUFNLENBQUNHLFdBQVAsQ0FBbUJSLFFBQVEsQ0FBQ1MsT0FBVCxLQUFxQiwwQkFBeEMsRUFBb0VDLGVBQXBFLEVBQXpCO0FBRUEsUUFBTXlMLHNCQUFzQixHQUFHakgsWUFBWSxDQUFDa0gsV0FBYixDQUF5QkwsV0FBVyxDQUFDTSxPQUFaLEVBQXpCLENBQS9CO0FBQ0EsUUFBTUMsd0JBQXdCLEdBQUcsQ0FBQ0gsc0JBQUQsR0FDOUJOLGlCQUQ4QixHQUU5QixZQUEwQjtBQUMxQjNHLE1BQUFBLFlBQVksQ0FBQ3FILFVBQWIsQ0FBd0JSLFdBQVcsQ0FBQ00sT0FBWixFQUF4Qjs7QUFEMEIsd0NBQWJHLElBQWE7QUFBYkEsUUFBQUEsSUFBYTtBQUFBOztBQUUxQlgsTUFBQUEsaUJBQWlCLENBQUNZLEtBQWxCLE9BQUFaLGlCQUFpQixHQUFPLElBQVAsU0FBZ0JXLElBQWhCLEVBQWpCO0FBQ0MsS0FMSjs7QUFPQSxRQUNDeE0sUUFBUSxJQUNSQSxRQUFRLENBQUNxSSxTQUFULEVBREEsS0FFQyxDQUFDckksUUFBUSxDQUFDcUksU0FBVCxHQUFxQnFFLHVCQUF0QixJQUFpRDFNLFFBQVEsQ0FBQ3FJLFNBQVQsR0FBcUJtRCxjQUFyQixLQUF3QyxJQUYxRixDQURELEVBSUU7QUFDREssTUFBQUEsaUJBQWlCO0FBQ2pCLEtBTkQsTUFNTztBQUNOdEwsTUFBQUEsZ0JBQWdCLENBQ2RRLGFBREYsR0FFRWpCLElBRkYsQ0FFTyxVQUFVa0IsY0FBVixFQUErQjtBQUNwQyxZQUFJQSxjQUFKLEVBQW9CO0FBQ25CLGNBQUkrSyxXQUFXLENBQUNZLGVBQVosR0FBOEJDLHFCQUE5QixHQUFzREMsWUFBdEQsRUFBSixFQUEwRTtBQUN6RTtBQUNBO0FBQ0E7QUFDQSxnQkFBSSxFQUFFN0wsY0FBYyxDQUFDOEwsZ0JBQWYsS0FBb0M5TCxjQUFjLENBQUMrTCxrQkFBckQsQ0FBSixFQUE4RTtBQUM3RUMsY0FBQUEsNkJBQTZCLENBQUNDLDhCQUE5QixDQUNDWCx3QkFERCxFQUVDUixnQkFGRCxFQUdDQyxXQUhELEVBSUNDLGtCQUpEO0FBTUEsYUFQRCxNQU9PO0FBQ05NLGNBQUFBLHdCQUF3QjtBQUN4QjtBQUNELFdBZEQsTUFjTztBQUNOLGdCQUFJLENBQUN0TSxRQUFRLENBQUNxSSxTQUFULEdBQXFCNkUsZUFBMUIsRUFBMkM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBSUMsU0FBUyxDQUFDQyxnQkFBVixFQUFKLEVBQWtDO0FBQ2pDO0FBQ0E7QUFDQUosZ0JBQUFBLDZCQUE2QixDQUFDQyw4QkFBOUIsQ0FDQ1gsd0JBREQsRUFFQ1IsZ0JBRkQsRUFHQ0MsV0FIRCxFQUlDQyxrQkFKRDtBQU1BLGVBVEQsTUFTTztBQUNOO0FBQ0E7QUFDQTtBQUNBTSxnQkFBQUEsd0JBQXdCO0FBQ3hCO0FBQ0QsYUFwQkQsTUFvQk87QUFDTjtBQUNBLGtCQUFJdEwsY0FBYyxDQUFDOEwsZ0JBQWYsS0FBb0M5TCxjQUFjLENBQUMrTCxrQkFBdkQsRUFBMkU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQUlkLGNBQWMsS0FBS2xFLGNBQWMsQ0FBQ21FLGNBQXRDLEVBQXNEO0FBQ3JELHNCQUFNaE0sV0FBVyxHQUFHO0FBQ25CbU4sb0JBQUFBLGtCQUFrQixFQUFFO0FBREQsbUJBQXBCO0FBR0F0QixrQkFBQUEsV0FBVyxDQUFDdUIsUUFBWixDQUNFQyxjQURGLENBQ2lCdk4sUUFEakIsRUFDMkJFLFdBRDNCLEVBRUVKLElBRkYsQ0FFTyxZQUFNO0FBQ1h3TSxvQkFBQUEsd0JBQXdCO0FBQ3hCLG1CQUpGLEVBS0UxQyxLQUxGLENBS1EsVUFBQy9ILEtBQUQsRUFBZ0I7QUFDdEJvRSxvQkFBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLG9DQUFWLEVBQWdEQSxLQUFoRDtBQUNBLG1CQVBGO0FBUUEsaUJBWkQsTUFZTztBQUNOO0FBQ0E7QUFDQXlLLGtCQUFBQSx3QkFBd0I7QUFDeEI7QUFDRCxlQXhCRCxNQXdCTztBQUNOO0FBQ0E7QUFDQTtBQUNBLG9CQUFJYSxTQUFTLENBQUNDLGdCQUFWLEVBQUosRUFBa0M7QUFDakM7QUFDQTtBQUNBSixrQkFBQUEsNkJBQTZCLENBQUNDLDhCQUE5QixDQUNDWCx3QkFERCxFQUVDUixnQkFGRCxFQUdDQyxXQUhELEVBSUNDLGtCQUpEO0FBTUEsaUJBVEQsTUFTTztBQUNOO0FBQ0E7QUFDQTtBQUNBTSxrQkFBQUEsd0JBQXdCO0FBQ3hCO0FBQ0Q7QUFDRDtBQUNEO0FBQ0QsU0FwRkQsTUFvRk87QUFDTlQsVUFBQUEsaUJBQWlCO0FBQ2pCO0FBQ0QsT0ExRkYsRUEyRkVqQyxLQTNGRixDQTJGUSxVQUFVTSxNQUFWLEVBQXVCO0FBQzdCakUsUUFBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLDhDQUFWLEVBQTBEcUksTUFBMUQ7QUFDQSxPQTdGRjtBQThGQTtBQUNEOztBQUVELE1BQU1wRixLQUFLLEdBQUc7QUFDYi9FLElBQUFBLDZCQUE2QixFQUFFQSw2QkFEbEI7QUFFYitLLElBQUFBLGdCQUFnQixFQUFFQSxnQkFGTDtBQUdiTyxJQUFBQSxXQUFXLEVBQUVBLFdBSEE7QUFJYmxKLElBQUFBLHNCQUFzQixFQUFFQSxzQkFKWDtBQUtiaUQsSUFBQUEseUJBQXlCLEVBQUVBLHlCQUxkO0FBTWJ3RyxJQUFBQSx5Q0FBeUMsRUFBRUEseUNBTjlCO0FBT2J0RCxJQUFBQSxlQUFlLEVBQUVBLGVBUEo7QUFRYm9DLElBQUFBLHlCQUF5QixFQUFFQSx5QkFSZDtBQVNiM0MsSUFBQUEsY0FBYyxFQUFFQTtBQVRILEdBQWQ7U0FZZWpELEsiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBBY3Rpdml0eVN5bmMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBEYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvRGF0YUxvc3NPckRyYWZ0RGlzY2FyZC9EYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgU2libGluZ0luZm9ybWF0aW9uID0ge1xuXHR0YXJnZXRDb250ZXh0OiBDb250ZXh0O1xuXHRwYXRoTWFwcGluZzogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W107XG59O1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY2FsbGJhY2tzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uc1xuICpcbiAqXG4gKiBAYXV0aG9yIFNBUCBTRVxuICogQHNpbmNlIDEuNTQuMFxuICogQGludGVyZmFjZVxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayB0byBhcHByb3ZlIG9yIHJlamVjdCB0aGUgY3JlYXRpb24gb2YgYSBkcmFmdFxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgb2YgZHJhZnQgY3JlYXRpb24gW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGFmdGVyIGEgZHJhZnQgd2FzIHN1Y2Nlc3N1bGx5IGNyZWF0ZWRcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3Qgb3ZlcndyaXRpbmcgYW4gdW5zYXZlZCBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLndoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkXG4gKiBAZnVuY3Rpb25cbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCB0byBvdmVyd3JpdGUgdW5zYXZlZCBkcmFmdCBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcbi8qIEVudW0gZm9yIG5hdmlnYXRpb24gdHlwZXMgKi9cbmVudW0gTmF2aWdhdGlvblR5cGUge1xuXHRCYWNrTmF2aWdhdGlvbiA9IFwiQmFja05hdmlnYXRpb25cIixcblx0Rm9yd2FyZE5hdmlnYXRpb24gPSBcIkZvcndhcmROYXZpZ2F0aW9uXCJcbn1cbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTQuMFxuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcyBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IGFueSwgc09wZXJhdGlvbjogc3RyaW5nKSB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1wiICsgc09wZXJhdGlvbik7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nfSBUaGUgY29udGV4dCBiaW5kaW5nIG9mIHRoZSBib3VuZCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0OiBhbnksIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBhbnkpIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzT3BlcmF0aW9uTmFtZSArIFwiKC4uLilcIiwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogYW55KSB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtib29sZWFufSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSAoaHR0cCBzdGF0dXMgNDA5KSBpcyBzZW5kIGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dDogYW55LCBiUHJlc2VydmVDaGFuZ2VzOiBib29sZWFuKSB7XG5cdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wdGlvbnMgPSB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9O1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElULCBvT3B0aW9ucyk7XG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJQcmVzZXJ2ZUNoYW5nZXNcIiwgYlByZXNlcnZlQ2hhbmdlcyk7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIik7XG5cdFx0Ly9JZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKFxuXHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChkcmFmdCwgc0dyb3VwSWQsIHNBY3Rpb25OYW1lLCBvQ29udGV4dC5nZXRNb2RlbCgpKSxcblx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0RyYWZ0RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9EcmFmdERvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXHRcdG9PcGVyYXRpb24uZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGVkaXQgdGhpcyBkcmFmdCBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQ6IGFueSwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzR3JvdXBJZD86IHN0cmluZykge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblxuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTiwgeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRzR3JvdXBJZCA/IENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHRcdCkgLy8zcmQgcGFyYW1ldGVyPC0tLS0tLVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdC8vaWYgQUNUSVZBVEUgYWN0aW9uIGZhaWxzIHRoZW4gd2UgcmVxdWVzdCBlaXRoZXIgdGhlIHNpZGVFZmZlY3RzIGFnYWluc3QgUFJFUEFSRSBhY3Rpb24gKGlmIGFubm90YXRlZCkgb3IgdGhlIG1lc3NhZ2VzIGFzIGZhbGxiYWNrOlxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKGJIYXNQcmVwYXJlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nUGFyYW1ldGVycyA9IG9TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdFx0XHRhVGFyZ2V0UGF0aHMgPSBvQmluZGluZ1BhcmFtZXRlcnMgJiYgb0JpbmRpbmdQYXJhbWV0ZXJzLnBhdGhFeHByZXNzaW9ucztcblx0XHRcdFx0XHRcdGlmIChhVGFyZ2V0UGF0aHMgJiYgYVRhcmdldFBhdGhzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldFBhdGhzLCBvQ29udGV4dCkuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQsIG9TaWRlRWZmZWN0c1NlcnZpY2UpLmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIEV4ZWN1dGUgYSBwcmVwYXJhdGlvbiBhY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBncm91cElkIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpIHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpO1xuXG5cdFx0Ly8gVE9ETzogc2lkZSBlZmZlY3RzIHF1YWxpZmllciBzaGFsbCBiZSBldmVuIGRlcHJlY2F0ZWQgdG8gYmUgY2hlY2tlZFxuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiU2lkZUVmZmVjdHNRdWFsaWZpZXJcIiwgXCJcIik7XG5cblx0XHRjb25zdCBzR3JvdXBJZCA9IGdyb3VwSWQgfHwgb09wZXJhdGlvbi5nZXRHcm91cElkKCk7XG5cdFx0cmV0dXJuIG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gb09wZXJhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJlcGFyYXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgbWVzc2FnZSBwYXRoIGZvciBhIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgcGF0aCBzaGFsbCBiZSBkZXRlcm1pbmVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBNZXNzYWdlIHBhdGgsIGVtcHR5IGlmIG5vdCBhbm5vdGF0ZWRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoXCIpO1xufVxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgbWVzc2FnZXMgc2hhbGwgYmUgcmVxdWVzdGVkXG4gKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzU2VydmljZSBTZXJ2aWNlIGZvciB0aGUgU2lkZUVmZmVjdHMgb24gU0FQIEZpb3JpIGVsZW1lbnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dDogYW55LCBvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UpIHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dCk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICRQcm9wZXJ0eVBhdGg6IHNNZXNzYWdlc1BhdGggfV0gYXMgYW55LCBvQ29udGV4dCk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZGlzY2FyZCBvZiBhIGRyYWZ0IGZ1bmN0aW9uIHVzaW5nIEhUVFAgUE9TVC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtib29sZWFufSBiRW5hYmxlU3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24ob0NvbnRleHQ6IGFueSwgYkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvRGlzY2FyZE9wZXJhdGlvbiA9IGRyYWZ0LmNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKTtcblx0XHQvLyBhcyB0aGUgZGlzY2FyZCBhY3Rpb24gZG9lc250JyBzZW5kIHRoZSBhY3RpdmUgdmVyc2lvbiBpbiB0aGUgcmVzcG9uc2Ugd2UgZG8gbm90IHVzZSB0aGUgcmVwbGFjZSBpbiBjYWNoZVxuXHRcdGNvbnN0IG9EaXNjYXJkUHJvbWlzZSA9ICFiRW5hYmxlU3RyaWN0SGFuZGxpbmdcblx0XHRcdD8gb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdDogb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSksXG5cdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdCAgKTtcblx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRyZXR1cm4gb0Rpc2NhcmRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRoc1xuICogYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSB7b2JqZWN0fSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIHtQcm9taXNlfSByZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHRcbik6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkPiB7XG5cdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdExvZy5lcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0fVxuXG5cdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdHRyeSB7XG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMS4gRmluZCBhbGwgc2VnbWVudHMgYmV0d2VlbiB0aGUgcm9vdCBvYmplY3QgYW5kIHRoZSBzdWItb2JqZWN0XG5cdFx0Ly8gRXhhbXBsZTogZm9yIHJvb3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikgYW5kIHJpZ2h0TW9zdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKVxuXHRcdC8vIC0tLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cblx0XHQvLyBGaW5kIGFsbCBzZWdtZW50cyBpbiB0aGUgcmlnaHRtb3N0IHBhdGhcblx0XHRjb25zdCBhZGRpdGlvbmFsUGF0aCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5yZXBsYWNlKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCksIFwiXCIpO1xuXHRcdGNvbnN0IHNlZ21lbnRzID0gYWRkaXRpb25hbFBhdGggPyBhZGRpdGlvbmFsUGF0aC5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpIDogW107XG5cdFx0Ly8gRmlyc3Qgc2VnbWVudCBpcyBhbHdheXMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcm9vdCBvYmplY3QsIHdoaWNoIGNhbiBjb250YWluICcvJyBpbiBjYXNlIG9mIGEgcGFyYW1ldHJpemVkIGVudGl0eVxuXHRcdHNlZ21lbnRzLnVuc2hpZnQocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMi4gUmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgb2YgdGhlIHNpYmxpbmcgZW50aXR5IGZvciBlYWggc2VnbWVudFxuXHRcdC8vIEV4YW1wbGU6IGZvciBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblx0XHQvLyAtLT4gcmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgZm9yIFwiUGFyYW0oYWEpL0VudGl0eShiYikvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKS9TaWJsaW5nRW50aXR5XCJcblx0XHRjb25zdCBvbGRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBuZXdQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgY3VycmVudFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhQcm9taXNlcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuXHRcdFx0Y3VycmVudFBhdGggKz0gYC8ke3NlZ21lbnR9YDtcblx0XHRcdG9sZFBhdGhzLnVuc2hpZnQoY3VycmVudFBhdGgpO1xuXHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChjdXJyZW50UGF0aCArIFwiL1NpYmxpbmdFbnRpdHlcIikuZ2V0Qm91bmRDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdHJldHVybiBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMy4gUmVjb25zdHJ1Y3QgdGhlIGZ1bGwgcGF0aHMgZnJvbSBjYW5vbmljYWwgcGF0aHMgKGZvciBwYXRoIG1hcHBpbmcpXG5cdFx0Ly8gRXhhbXBsZTogZm9yIGNhbm9uaWNhbCBwYXRocyBcIi9QYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiL0VudGl0eTIoY2Mtc2libGluZylcIiwgXCIvRW50aXR5MyhkZC1zaWJsaW5nKVwiXG5cdFx0Ly8gLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZykvX1N1Yk5hdihkZC1zaWJsaW5nKVwiXVxuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhzID0gKGF3YWl0IFByb21pc2UuYWxsKGNhbm9uaWNhbFBhdGhQcm9taXNlcykpIGFzIHN0cmluZ1tdO1xuXHRcdGxldCBzaWJsaW5nUGF0aCA9IFwiXCI7XG5cdFx0Y2Fub25pY2FsUGF0aHMuZm9yRWFjaCgoY2Fub25pY2FsUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uID0gc2VnbWVudHNbaW5kZXhdLnJlcGxhY2UoL1xcKC4qJC8sIFwiXCIpOyAvLyBLZWVwIG9ubHkgbmF2aWdhdGlvbiBuYW1lIGZyb20gdGhlIHNlZ21lbnQsIGkuZS4gYWFhKHh4eCkgLS0+IGFhYVxuXHRcdFx0XHRjb25zdCBrZXlzID0gY2Fub25pY2FsUGF0aC5yZXBsYWNlKC8uKlxcKC8sIFwiKFwiKTsgLy8gS2VlcCBvbmx5IHRoZSBrZXlzIGZtcm8gdGhlIGNhbm9uaWNhbCBwYXRoLCBpLmUuIGFhYSh4eHgpIC0tPiAoeHh4KVxuXHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7bmF2aWdhdGlvbn0ke2tleXN9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNpYmxpbmdQYXRoID0gY2Fub25pY2FsUGF0aDsgLy8gVG8gbWFuYWdlIHBhcmFtZXRyaXplZCBlbnRpdGllc1xuXHRcdFx0fVxuXHRcdFx0bmV3UGF0aHMudW5zaGlmdChzaWJsaW5nUGF0aCk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWwuYmluZENvbnRleHQoc2libGluZ1BhdGgpLmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQsIC8vIENyZWF0ZSB0aGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dCBmcm9tIGl0cyBwYXRoXG5cdFx0XHRwYXRoTWFwcGluZzogb2xkUGF0aHMubWFwKChvbGRQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZFBhdGgsXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3UGF0aHNbaW5kZXhdXG5cdFx0XHRcdH07XG5cdFx0XHR9KVxuXHRcdH07XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gQSBjYW5vbmljYWwgcGF0aCBjb3VsZG4ndCBiZSByZXNvbHZlZCAoYmVjYXVzZSBhIHNpYmxpbmcgZG9lc24ndCBleGlzdClcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZyb20gYW4gZXhpc3RpbmcgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0I2NyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge0FwcENvbXBvbmVudH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLm9WaWV3XSBUaGUgdmlld1xuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlByZXNlcnZlQ2hhbmdlc10gUHJlc2VydmUgY2hhbmdlcyBvZiBhbiBleGlzdGluZyBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnR9IFttUGFyYW1ldGVycy5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5hZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRyYWZ0IGRvY3VtZW50IHdhcyBjcmVhdGVkXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLndoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkfSBbbVBhcmFtZXRlcnMuZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZF0gQ2FsbGJhY2sgZm9yIGRlY2lkaW5nIG9uIG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgY2hhbmdlIGJ5IGFub3RoZXIgdXNlclxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBhbnksXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHtcblx0XHRvVmlldzogVmlldztcblx0XHRiUHJlc2VydmVDaGFuZ2VzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHRmbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50PzogYW55O1xuXHRcdGZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkPzogYW55O1xuXHR9XG4pIHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge30sXG5cdFx0bG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSxcblx0XHRiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyA9XG5cdFx0XHR0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwidW5kZWZpbmVkXCIgfHwgKHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJib29sZWFuXCIgJiYgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMpOyAvL2RlZmF1bHQgdHJ1ZVxuXG5cdC8qKlxuXHQgKiBPdmVyd3JpdGUgb3IgcmVqZWN0IGJhc2VkIG9uIGZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYk92ZXJ3cml0ZSBPdmVyd3JpdGUgdGhlIGNoYW5nZSBvciBub3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRmdW5jdGlvbiBvdmVyd3JpdGVPbkRlbWFuZChiT3ZlcndyaXRlOiBhbnkpIHtcblx0XHRpZiAoYk92ZXJ3cml0ZSkge1xuXHRcdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpICsgXCIvRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIikuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRsZXQgb1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZTtcblxuXHRcdFx0cmV0dXJuICgobVBhcmFtZXRlcnMub1ZpZXcuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoX29SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gX29SZXNvdXJjZUJ1bmRsZTtcblx0XHRcdFx0XHRyZXR1cm4gZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChkcmFmdEFkbWluRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9MT0NLRURfQllfVVNFUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRzSW5mbyxcblx0XHRcdFx0XHRcdFx0XHRzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNVbnNhdmVkQ2hhbmdlc01zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdH1cblxuXHRmdW5jdGlvbiBzaG93TWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2c6IGFueSkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHR0aXRsZTogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX1dBUk5JTkdcIiksXG5cdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoXCJEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSksXG5cdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHR9XG5cblx0Y29uc3QgYkV4ZWN1dGUgPSBtUGFyYW0uZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuXHRcdD8gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KVxuXHRcdDogdHJ1ZTtcblxuXHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiRHJhZnQgY3JlYXRpb24gd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHR9XG5cdGxldCBvcGVuaW5nU2libGluZ0NvbnRleHQgPSBmYWxzZTtcblx0dHJ5IHtcblx0XHRsZXQgb0RyYWZ0Q29udGV4dDogQ29udGV4dCB8IG51bGwgPSBudWxsO1xuXHRcdHRyeSB7XG5cdFx0XHRvRHJhZnRDb250ZXh0ID0gYXdhaXQgZHJhZnQuZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cpO1xuXHRcdH0gY2F0Y2ggKG9SZXNwb25zZTogYW55KSB7XG5cdFx0XHQvL09ubHkgY2FsbCBiYWNrIGlmIGVycm9yIDQwOVxuXHRcdFx0aWYgKGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ICYmIG9SZXNwb25zZS5zdGF0dXMgPT09IDQwOSkge1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0aWYgKEFjdGl2aXR5U3luYy5pc0NvbGxhYm9yYXRpb25FbmFibGVkKG1QYXJhbWV0ZXJzLm9WaWV3KSkge1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9yb3V0aW5nLl9jcmVhdGVCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVPbkRlbWFuZChcblx0XHRcdFx0XHRcdG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkID8gbVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQoKSA6IHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoIShvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvcGVuaW5nU2libGluZ0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdH1cblxuXHRcdG9EcmFmdENvbnRleHQgPVxuXHRcdFx0b0RyYWZ0Q29udGV4dCAmJiBtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG5cdFx0XHRcdD8gbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgb0RyYWZ0Q29udGV4dClcblx0XHRcdFx0OiBvRHJhZnRDb250ZXh0O1xuXG5cdFx0aWYgKG9EcmFmdENvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCk7XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0KTtcblxuXHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAoZXhjOiBhbnkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNhY3RpdmF0ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IGFueTsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBhbnkgfVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWUpXG5cdFx0LnRoZW4oZnVuY3Rpb24gKGJFeGVjdXRlOiBhbnkpIHtcblx0XHRcdGlmICghYkV4ZWN1dGUpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBhY3RpdmF0aW9uIHJlcXVpcmVzIHByZXBhcmF0aW9uICovXG5cdFx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiZHJhZnRcIjtcblx0XHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0XHRjb25zdCBvUHJlcGFyZVByb21pc2UgPSBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXApO1xuXHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cblx0XHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlczogW2FueSwgYW55XSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZXNbMV07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHRcdFx0fSk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbiAob0FjdGl2ZURvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdH0pO1xufVxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgZm9yIERyYWZ0KHdoZW4gbm8gRHJhZnRBY3Rpb24pXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIHVzZXMgREVMRVRFIGFsd2F5cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjZGVsZXRlRHJhZnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge1Byb21pc2V9XG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZGVsZXRlRHJhZnQob0NvbnRleHQ6IGFueSwgYkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBzRGlzY2FyZEFjdGlvbiA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKSxcblx0XHRiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblxuXHRpZiAoYklzQWN0aXZlRW50aXR5IHx8ICghYklzQWN0aXZlRW50aXR5ICYmICFzRGlzY2FyZEFjdGlvbikpIHtcblx0XHQvL1VzZSBEZWxldGUgaW4gY2FzZSBvZiBhY3RpdmUgZW50aXR5IGFuZCBubyBkaXNjYXJkIGFjdGlvbiBhdmFpbGFibGUgZm9yIGRyYWZ0XG5cdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdHJldHVybiBvQ29udGV4dFxuXHRcdFx0XHQuZ2V0QmluZGluZygpXG5cdFx0XHRcdC5yZXNldENoYW5nZXMoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dCwgYkVuYWJsZVN0cmljdEhhbmRsaW5nKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGVcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBhbnksXG5cdGZuQ2FuY2VsRnVuY3Rpb246IGFueSxcblx0b0NvbnRleHQ6IGFueSxcblx0b0NvbnRyb2xsZXI6IGFueSxcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cbikge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3Qob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0XHRcdFx0Zm5Qcm9jZXNzRnVuY3Rpb24uYXBwbHkobnVsbCwgLi4uYXJncyk7XG5cdFx0ICB9O1xuXG5cdGlmIChcblx0XHRvQ29udGV4dCAmJlxuXHRcdG9Db250ZXh0LmdldE9iamVjdCgpICYmXG5cdFx0KCFvQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB8fCBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSlcblx0KSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHRkcmFmdERhdGFDb250ZXh0XG5cdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0XHRcdFx0XHRcdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdFx0XHRcdFx0XHQvLyBmb3IgRkNMLlxuXHRcdFx0XHRcdFx0aWYgKCEoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSkge1xuXHRcdFx0XHRcdFx0XHREYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlci5wZXJmb3JtQWZ0ZXJEaXNjYXJkb3JLZWVwRHJhZnQoXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhlcmUgaXMgbm8gYWN0aXZlIGVudGl0eSBzbyB3ZSBhcmUgZWRpdGluZyBlaXRoZXIgbmV3bHkgY3JlYXRlZCBkYXRhIG9yXG5cdFx0XHRcdFx0XHRcdC8vIGEgZHJhZnQgd2hpY2ggaGFzIG5ldmVyIGJlZW4gc2F2ZWQgdG8gYWN0aXZlIHZlcnNpb25cblx0XHRcdFx0XHRcdFx0Ly8gU2luY2Ugd2Ugd2FudCB0byByZWFjdCBkaWZmZXJlbnRseSBpbiB0aGUgdHdvIHNpdHVhdGlvbnMsIHdlIGhhdmUgdG8gY2hlY2sgdGhlXG5cdFx0XHRcdFx0XHRcdC8vIGRpcnR5IHN0YXRlXG5cdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlIGRhdGEgaXMgYmVpbmcgbmV3bHkgY3JlYXRlZCBhbmQgdGhlbiB3ZSBhbHdheXMgd2FudCB0b1xuXHRcdFx0XHRcdFx0XHRcdC8vIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBvbiBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0XHRcdFx0RGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIucGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0KFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgYXJlIGVkaXRpbmcgYSBkcmFmdCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eVxuXHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgZXF1YWwsIHNvIHRoaXMgZHJhZnQgd2FzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gbmV2ZXIgc2F2ZWQgYmVmb3JlLCBoZW5jZSB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZyBhIG5ld2x5IGNyZWF0ZWQgZHJhZnQgZm9yXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQWxzbyB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0XHRcdFx0XHRcdFx0XHQvLyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRlbGV0ZSB0aGUgZHJhZnQgaW4gY2FzZSBvZiBhIGJhY2tcblx0XHRcdFx0XHRcdFx0XHQvLyBuYXZpZ2F0aW9uIGJ1dCBpbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gc2lsZW50bHkga2VlcCBpdCFcblx0XHRcdFx0XHRcdFx0XHRpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgYW5kIG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIG9yIG5vdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBzbyB3ZSB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYW5kIGxldCB0aGUgdXNlciBkZWNpZGVcblx0XHRcdFx0XHRcdFx0XHRcdERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdChcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgdXNlciBzdGFydGVkIGVkaXRpbmcgdGhlIGV4aXN0aW5nIGRyYWZ0IGJ1dCBkaWQgbm90IG1ha2UgYW55IGNoYW5nZXNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiwgc28gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgZHJhZnREYXRhQ29udGV4dCBpbmZvcm1hdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnQgPSB7XG5cdGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50OiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCxcblx0YWN0aXZhdGVEb2N1bWVudDogYWN0aXZhdGVEb2N1bWVudCxcblx0ZGVsZXRlRHJhZnQ6IGRlbGV0ZURyYWZ0LFxuXHRleGVjdXRlRHJhZnRFZGl0QWN0aW9uOiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uLFxuXHRjb21wdXRlU2libGluZ0luZm9ybWF0aW9uOiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uLFxuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdGNyZWF0ZU9wZXJhdGlvbjogY3JlYXRlT3BlcmF0aW9uLFxuXHRleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uOiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl19
|
|
843
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwib3ZlcndyaXRlT25EZW1hbmQiLCJiT3ZlcndyaXRlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0Iiwib1Jlc291cmNlQnVuZGxlIiwib1ZpZXciLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIl9vUmVzb3VyY2VCdW5kbGUiLCJyZXF1ZXN0T2JqZWN0IiwiZHJhZnRBZG1pbkRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwiRXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc29sdmUiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJsb2NhbEkxOG5SZWYiLCJnZXRUZXh0Iiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIm1QYXJhbSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImRyYWZ0Iiwib1Jlc3BvbnNlIiwic3RhdHVzIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJBY3Rpdml0eVN5bmMiLCJpc0NvbGxhYm9yYXRpb25FbmFibGVkIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInNpYmxpbmdJbmZvIiwic2libGluZ0NvbnRleHQiLCJnZXRDb250cm9sbGVyIiwiX3JvdXRpbmciLCJfY3JlYXRlQmluZGluZ0NvbnRleHQiLCJ0YXJnZXRDb250ZXh0IiwiZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCIsImNhbmNlbGVkIiwiZXhjIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJzdGFydHNXaXRoIiwiTG9nIiwibW9kZWwiLCJhZGRpdGlvbmFsUGF0aCIsInJlcGxhY2UiLCJzZWdtZW50cyIsInN1YnN0cmluZyIsInNwbGl0IiwidW5zaGlmdCIsIm9sZFBhdGhzIiwibmV3UGF0aHMiLCJjdXJyZW50UGF0aCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImFsbCIsImNhbm9uaWNhbFBhdGhzIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwidW5kZWZpbmVkIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiTmF2aWdhdGlvblR5cGUiLCJzT3BlcmF0aW9uIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRPYmplY3QiLCJjcmVhdGVPcGVyYXRpb24iLCJvT3B0aW9ucyIsInNPcGVyYXRpb25OYW1lIiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJnZXRQcm9wZXJ0eSIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIm9PcGVyYXRpb24iLCJzZXRQYXJhbWV0ZXIiLCJzR3JvdXBJZCIsInNBY3Rpb25OYW1lIiwib0VkaXRQcm9taXNlIiwiZXhlY3V0ZSIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsImJpbmQiLCJnZXRCaW5kaW5nIiwiaXNBIiwib0RyYWZ0RG9jdW1lbnRDb250ZXh0Iiwic3VibWl0QmF0Y2giLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwiYkhhc1ByZXBhcmVBY3Rpb24iLCJiSWdub3JlRXRhZyIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJjYXRjaCIsImFjdGlvbk5hbWUiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwib0JpbmRpbmdQYXJhbWV0ZXJzIiwiYVRhcmdldFBhdGhzIiwicGF0aEV4cHJlc3Npb25zIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwib0Vycm9yIiwicmVxdWVzdE1lc3NhZ2VzIiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJncm91cElkIiwic0NvbnRleHRQYXRoIiwib1JldHVyblR5cGUiLCJzTWVzc2FnZXNQYXRoIiwiJHNlbGVjdCIsImdldEdyb3VwSWQiLCJnZXRNZXNzYWdlc1BhdGgiLCIkUHJvcGVydHlQYXRoIiwiZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbiIsImJFbmFibGVTdHJpY3RIYW5kbGluZyIsIm9EaXNjYXJkT3BlcmF0aW9uIiwib0Rpc2NhcmRQcm9taXNlIiwiYWN0aXZhdGVEb2N1bWVudCIsImZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudCIsInNCYXRjaEdyb3VwIiwib1ByZXBhcmVQcm9taXNlIiwib0FjdGl2YXRlUHJvbWlzZSIsInZhbHVlcyIsImZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50IiwiZGVsZXRlRHJhZnQiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZXNldENoYW5nZXMiLCJkZWxldGUiLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJwYWdlQ29udHJvbGxlciIsInJiU2lsZW50bHlLZWVwIiwib01hbmlmZXN0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0TWFuaWZlc3QiLCJhcHAiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsImZuUHJvY2Vzc0Z1bmN0aW9uIiwiZm5DYW5jZWxGdW5jdGlvbiIsIm9Db250cm9sbGVyIiwiYlNraXBCaW5kaW5nVG9WaWV3IiwibmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsImNvbGxhYm9yYXRpb25Db25uZWN0ZWQiLCJpc0Nvbm5lY3RlZCIsImdldFZpZXciLCJwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMiLCJkaXNjb25uZWN0IiwiYXJncyIsImFwcGx5IiwiYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiaXNGY2xFbmFibGVkIiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsIkRhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyIiwicGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0IiwiSGFzQWN0aXZlRW50aXR5IiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsImRpc2NhcmREcmFmdCIsIkZvcndhcmROYXZpZ2F0aW9uIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiZWRpdEZsb3ciLCJjYW5jZWxEb2N1bWVudCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQWdqQk8sa0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7QUFDckMsUUFBSTtBQUNILFVBQUlDLE1BQU0sR0FBR0YsSUFBSSxFQUFqQjtBQUNBLEtBRkQsQ0FFRSxPQUFNRyxDQUFOLEVBQVM7QUFDVixhQUFPRixPQUFPLENBQUNFLENBQUQsQ0FBZDtBQUNBOztBQUNELFFBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFyQixFQUEyQjtBQUMxQixhQUFPRixNQUFNLENBQUNFLElBQVAsQ0FBWSxLQUFLLENBQWpCLEVBQW9CSCxPQUFwQixDQUFQO0FBQ0E7O0FBQ0QsV0FBT0MsTUFBUDtBQUNBOztBQTFKRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDZUcsNkIsYUFDZEMsUSxFQUNBQyxhLEVBQ0FDLFc7UUFPQztBQUFBOztBQUk4SDs7QUFFL0g7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0MsZUFBU0MsaUJBQVQsQ0FBMkJDLFVBQTNCLEVBQWdEO0FBQy9DLFlBQUlBLFVBQUosRUFBZ0I7QUFDZjtBQUNBLGNBQU1DLE1BQU0sR0FBR0wsUUFBUSxDQUFDTSxRQUFULEVBQWY7QUFDQSxjQUFNQyxnQkFBZ0IsR0FBR0YsTUFBTSxDQUFDRyxXQUFQ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QkE7QUFDTjtBQUNBO0FBQ0E7QUFDQU0sWUFBQUEsd0JBQXdCO0FBQ3hCO0FBQ0QsU0F4R0QsTUF3R087QUFDTlQsVUFBQUEsaUJBQWlCO0FBQ2pCO0FBQ0QsT0E5R0YsRUErR0U1QyxLQS9HRixDQStHUSxVQUFVTyxNQUFWLEVBQXVCO0FBQzdCbkUsUUFBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLDhDQUFWLEVBQTBEdUksTUFBMUQ7QUFDQSxPQWpIRjtBQWtIQTtBQUNEOztBQUVELE1BQU10RixLQUFLLEdBQUc7QUFDYi9FLElBQUFBLDZCQUE2QixFQUFFQSw2QkFEbEI7QUFFYm9MLElBQUFBLGdCQUFnQixFQUFFQSxnQkFGTDtBQUdiTyxJQUFBQSxXQUFXLEVBQUVBLFdBSEE7QUFJYnZKLElBQUFBLHNCQUFzQixFQUFFQSxzQkFKWDtBQUtibUksSUFBQUEsNkJBQTZCLEVBQUVBLDZCQUxsQjtBQU1ibEYsSUFBQUEseUJBQXlCLEVBQUVBLHlCQU5kO0FBT2JvSCxJQUFBQSx5Q0FBeUMsRUFBRUEseUNBUDlCO0FBUWJQLElBQUFBLG9DQUFvQyxFQUFFQSxvQ0FSekI7QUFTYjNELElBQUFBLGVBQWUsRUFBRUEsZUFUSjtBQVVieUMsSUFBQUEseUJBQXlCLEVBQUVBLHlCQVZkO0FBV2JoRCxJQUFBQSxjQUFjLEVBQUVBO0FBWEgsR0FBZDtTQWNlakQsSyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0RhdGFMb3NzT3JEcmFmdERpc2NhcmQvRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCwgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCIuLi8uLi9QYWdlQ29udHJvbGxlclwiO1xuXG5leHBvcnQgdHlwZSBTaWJsaW5nSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldENvbnRleHQ6IFY0Q29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNhbGxiYWNrcyB1c2VkIGluIHRoZSBmdW5jdGlvbnNcbiAqXG4gKlxuICogQGF1dGhvciBTQVAgU0VcbiAqIEBzaW5jZSAxLjU0LjBcbiAqIEBpbnRlcmZhY2VcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3QgdGhlIGNyZWF0aW9uIG9mIGEgZHJhZnRcbiAqXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5iZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCBvZiBkcmFmdCBjcmVhdGlvbiBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayBhZnRlciBhIGRyYWZ0IHdhcyBzdWNjZXNzdWxseSBjcmVhdGVkXG4gKlxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGFwcHJvdmUgb3IgcmVqZWN0IG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKlxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2sud2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRcbiAqIEBmdW5jdGlvblxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgdG8gb3ZlcndyaXRlIHVuc2F2ZWQgZHJhZnQgW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcbi8qIEVudW0gZm9yIG5hdmlnYXRpb24gdHlwZXMgKi9cbmVudW0gTmF2aWdhdGlvblR5cGUge1xuXHRCYWNrTmF2aWdhdGlvbiA9IFwiQmFja05hdmlnYXRpb25cIixcblx0Rm9yd2FyZE5hdmlnYXRpb24gPSBcIkZvcndhcmROYXZpZ2F0aW9uXCJcbn1cbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTQuMFxuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcyBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRBY3Rpb25OYW1lKG9Db250ZXh0OiBWNENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZykge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn1gKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBvcGVyYXRpb24gY29udGV4dCBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogVjRDb250ZXh0LCBzT3BlcmF0aW9uOiBzdHJpbmcsIG9PcHRpb25zPzogYW55KSB7XG5cdGNvbnN0IHNPcGVyYXRpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgc09wZXJhdGlvbik7XG5cblx0cmV0dXJuIG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoYCR7c09wZXJhdGlvbk5hbWV9KC4uLilgLCBvQ29udGV4dCwgb09wdGlvbnMpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIHJldHVybiB0eXBlIG9mIHRoZSBkcmFmdCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0UmV0dXJuVHlwZShvQ29udGV4dDogVjRDb250ZXh0LCBzT3BlcmF0aW9uOiBzdHJpbmcpIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC8ke3NPcGVyYXRpb259LyRSZXR1cm5UeXBlYCk7XG59XG4vKipcbiAqIENoZWNrIGlmIG9wdGlvbmFsIGRyYWZ0IHByZXBhcmUgYWN0aW9uIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMgVHJ1ZSBpZiBhIGEgcHJlcGFyZSBhY3Rpb24gZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQ6IFY0Q29udGV4dCkge1xuXHRyZXR1cm4gISFnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHJhZnQgZnJvbSBhbiBhY3RpdmUgZG9jdW1lbnQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gYlByZXNlcnZlQ2hhbmdlcyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBwcmVzZXJ2ZWQgYW5kIGFuIGVycm9yIG1lc3NhZ2UgKGh0dHAgc3RhdHVzIDQwOSkgaXMgc2VuZCBmcm9tIHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgZmFsc2UgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIG92ZXJ3cml0dGVuPC9saT5cbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQ6IFY0Q29udGV4dCwgYlByZXNlcnZlQ2hhbmdlczogYm9vbGVhbik6IFByb21pc2U8VjRDb250ZXh0PiB7XG5cdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wdGlvbnMgPSB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9O1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElULCBvT3B0aW9ucyk7XG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJQcmVzZXJ2ZUNoYW5nZXNcIiwgYlByZXNlcnZlQ2hhbmdlcyk7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIik7XG5cdFx0Ly9JZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKFxuXHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChkcmFmdCwgc0dyb3VwSWQsIHNBY3Rpb25OYW1lLCBvQ29udGV4dC5nZXRNb2RlbCgpKSxcblx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0RyYWZ0RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9EcmFmdERvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXHRcdG9PcGVyYXRpb24uZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGVkaXQgdGhpcyBkcmFmdCBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBbc0dyb3VwSWRdIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIHRvIGJlIGV4ZWN1dGVkXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0OiBWNENvbnRleHQsIG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFY0Q29udGV4dD4ge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblxuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTiwgeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRzR3JvdXBJZCA/IENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHRcdCkgLy8zcmQgcGFyYW1ldGVyPC0tLS0tLVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdC8vaWYgQUNUSVZBVEUgYWN0aW9uIGZhaWxzIHRoZW4gd2UgcmVxdWVzdCBlaXRoZXIgdGhlIHNpZGVFZmZlY3RzIGFnYWluc3QgUFJFUEFSRSBhY3Rpb24gKGlmIGFubm90YXRlZCkgb3IgdGhlIG1lc3NhZ2VzIGFzIGZhbGxiYWNrOlxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKGJIYXNQcmVwYXJlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhY3Rpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpLFxuXHRcdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSxcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmdQYXJhbWV0ZXJzID0gb1NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKGFjdGlvbk5hbWUsIG9Db250ZXh0KSxcblx0XHRcdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpLmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKS5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYWN0aXZhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGdyb3VwSWQgVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dDogVjRDb250ZXh0LCBncm91cElkPzogc3RyaW5nKSB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRjb25zdCBvUmV0dXJuVHlwZSA9IGdldFJldHVyblR5cGUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDtcblx0XHQvLyBJZiB0aGVyZSBpcyBubyByZXR1cm4gcGFyYW1ldGVyLCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVxdWVzdCBNZXNzYWdlcy5cblx0XHQvLyBSQVAgZHJhZnQgcHJlcGFyZSBoYXMgbm8gcmV0dXJuIHBhcmFtZXRlclxuXHRcdGlmICghIW9SZXR1cm5UeXBlKSB7XG5cdFx0XHRzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS9AJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuTWVzc2FnZXN9LyRQYXRoYCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFLCBzTWVzc2FnZXNQYXRoID8geyAkc2VsZWN0OiBzTWVzc2FnZXNQYXRoIH0gOiBudWxsKTtcblxuXHRcdC8vIFRPRE86IHNpZGUgZWZmZWN0cyBxdWFsaWZpZXIgc2hhbGwgYmUgZXZlbiBkZXByZWNhdGVkIHRvIGJlIGNoZWNrZWRcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlNpZGVFZmZlY3RzUXVhbGlmaWVyXCIsIFwiXCIpO1xuXG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBncm91cElkIHx8IG9PcGVyYXRpb24uZ2V0R3JvdXBJZCgpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHByZXBhcmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIG1lc3NhZ2UgcGF0aCBmb3IgYSBjb250ZXh0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBwYXRoIHNoYWxsIGJlIGRldGVybWluZWRcbiAqIEByZXR1cm5zIE1lc3NhZ2UgcGF0aCwgZW1wdHkgaWYgbm90IGFubm90YXRlZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlc1BhdGgob0NvbnRleHQ6IFY0Q29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG59XG4vKipcbiAqIFJlcXVlc3RzIHRoZSBtZXNzYWdlcyBpZiBhbm5vdGF0ZWQgZm9yIGEgZ2l2ZW4gY29udGV4dC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgbWVzc2FnZXMgc2hhbGwgYmUgcmVxdWVzdGVkXG4gKiBAcGFyYW0gb1NpZGVFZmZlY3RzU2VydmljZSBTZXJ2aWNlIGZvciB0aGUgU2lkZUVmZmVjdHMgb24gU0FQIEZpb3JpIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgbWVzc2FnZXMgd2VyZSByZXF1ZXN0ZWRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gcmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0OiBWNENvbnRleHQsIG9TaWRlRWZmZWN0c1NlcnZpY2U6IFNpZGVFZmZlY3RzU2VydmljZSkge1xuXHRjb25zdCBzTWVzc2FnZXNQYXRoID0gZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0KTtcblx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJFByb3BlcnR5UGF0aDogc01lc3NhZ2VzUGF0aCB9XSBhcyBhbnksIG9Db250ZXh0KTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG4vKipcbiAqIEV4ZWN1dGVzIGRpc2NhcmQgb2YgYSBkcmFmdCBmdW5jdGlvbiB1c2luZyBIVFRQIFBvc3QuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0OiBWNENvbnRleHQsIGJFbmFibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb0Rpc2NhcmRPcGVyYXRpb24gPSBkcmFmdC5jcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKTtcblx0XHRjb25zdCBsb2NhbEkxOG5SZWYgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIik7XG5cdFx0Ly8gYXMgdGhlIGRpc2NhcmQgYWN0aW9uIGRvZXNudCcgc2VuZCB0aGUgYWN0aXZlIHZlcnNpb24gaW4gdGhlIHJlc3BvbnNlIHdlIGRvIG5vdCB1c2UgdGhlIHJlcGxhY2UgaW4gY2FjaGVcblx0XHRjb25zdCBvRGlzY2FyZFByb21pc2UgPSAhYkVuYWJsZVN0cmljdEhhbmRsaW5nXG5cdFx0XHQ/IG9EaXNjYXJkT3BlcmF0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpXG5cdFx0XHQ6IG9EaXNjYXJkT3BlcmF0aW9uLmV4ZWN1dGUoXG5cdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHQgICk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9EaXNjYXJkUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBUaGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRyb290Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dFxuKTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHR9XG5cblx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0dHJ5IHtcblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAxLiBGaW5kIGFsbCBzZWdtZW50cyBiZXR3ZWVuIHRoZSByb290IG9iamVjdCBhbmQgdGhlIHN1Yi1vYmplY3Rcblx0XHQvLyBFeGFtcGxlOiBmb3Igcm9vdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKSBhbmQgcmlnaHRNb3N0ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpXG5cdFx0Ly8gLS0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblxuXHRcdC8vIEZpbmQgYWxsIHNlZ21lbnRzIGluIHRoZSByaWdodG1vc3QgcGF0aFxuXHRcdGNvbnN0IGFkZGl0aW9uYWxQYXRoID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2Uocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSwgXCJcIik7XG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBhZGRpdGlvbmFsUGF0aCA/IGFkZGl0aW9uYWxQYXRoLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIikgOiBbXTtcblx0XHQvLyBGaXJzdCBzZWdtZW50IGlzIGFsd2F5cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSByb290IG9iamVjdCwgd2hpY2ggY2FuIGNvbnRhaW4gJy8nIGluIGNhc2Ugb2YgYSBwYXJhbWV0cml6ZWQgZW50aXR5XG5cdFx0c2VnbWVudHMudW5zaGlmdChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAyLiBSZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBvZiB0aGUgc2libGluZyBlbnRpdHkgZm9yIGVhaCBzZWdtZW50XG5cdFx0Ly8gRXhhbXBsZTogZm9yIFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXHRcdC8vIC0tPiByZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBmb3IgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpL1NpYmxpbmdFbnRpdHlcIlxuXHRcdGNvbnN0IG9sZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG5ld1BhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBjdXJyZW50UGF0aCA9IFwiXCI7XG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aFByb21pc2VzID0gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiB7XG5cdFx0XHRjdXJyZW50UGF0aCArPSBgLyR7c2VnbWVudH1gO1xuXHRcdFx0b2xkUGF0aHMudW5zaGlmdChjdXJyZW50UGF0aCk7XG5cdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGAke2N1cnJlbnRQYXRofS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHR9KTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDMuIFJlY29uc3RydWN0IHRoZSBmdWxsIHBhdGhzIGZyb20gY2Fub25pY2FsIHBhdGhzIChmb3IgcGF0aCBtYXBwaW5nKVxuXHRcdC8vIEV4YW1wbGU6IGZvciBjYW5vbmljYWwgcGF0aHMgXCIvUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIi9FbnRpdHkyKGNjLXNpYmxpbmcpXCIsIFwiL0VudGl0eTMoZGQtc2libGluZylcIlxuXHRcdC8vIC0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpL19TdWJOYXYoZGQtc2libGluZylcIl1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRocyA9IChhd2FpdCBQcm9taXNlLmFsbChjYW5vbmljYWxQYXRoUHJvbWlzZXMpKSBhcyBzdHJpbmdbXTtcblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvbiA9IHNlZ21lbnRzW2luZGV4XS5yZXBsYWNlKC9cXCguKiQvLCBcIlwiKTsgLy8gS2VlcCBvbmx5IG5hdmlnYXRpb24gbmFtZSBmcm9tIHRoZSBzZWdtZW50LCBpLmUuIGFhYSh4eHgpIC0tPiBhYWFcblx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmbXJvIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHNpYmxpbmdQYXRoKS5nZXRCb3VuZENvbnRleHQoKSwgLy8gQ3JlYXRlIHRoZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0IGZyb20gaXRzIHBhdGhcblx0XHRcdHBhdGhNYXBwaW5nOiBvbGRQYXRocy5tYXAoKG9sZFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0b2xkUGF0aCxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdQYXRoc1tpbmRleF1cblx0XHRcdFx0fTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBBIGNhbm9uaWNhbCBwYXRoIGNvdWxkbid0IGJlIHJlc29sdmVkIChiZWNhdXNlIGEgc2libGluZyBkb2Vzbid0IGV4aXN0KVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZnJvbSBhbiBleGlzdGluZyBkb2N1bWVudC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gc3VwcG9ydHMgc2V2ZXJhbCBob29rcyBhcyB0aGVyZSBpcyBhIGNlcnRhaW4gY29yZW9ncmFwaHkgZGVmaW5lZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMub1ZpZXddIFRoZSB2aWV3XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIHZldG8gYmVmb3JlIGNyZWF0ZSByZXF1ZXN0IGlzIGV4ZWN1dGVkXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkcmFmdCBkb2N1bWVudCB3YXMgY3JlYXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkXSBDYWxsYmFjayBmb3IgZGVjaWRpbmcgb24gb3ZlcndyaXRpbmcgYW4gdW5zYXZlZCBjaGFuZ2UgYnkgYW5vdGhlciB1c2VyXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IFZpZXc7XG5cdFx0YlByZXNlcnZlQ2hhbmdlcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0Zm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ/OiBhbnk7XG5cdFx0Zm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZD86IGFueTtcblx0fVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0YlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cgPVxuXHRcdFx0dHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcInVuZGVmaW5lZFwiIHx8ICh0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwiYm9vbGVhblwiICYmIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzKTsgLy9kZWZhdWx0IHRydWVcblxuXHQvKipcblx0ICogT3ZlcndyaXRlIG9yIHJlamVjdCBiYXNlZCBvbiBmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gYk92ZXJ3cml0ZSBPdmVyd3JpdGUgdGhlIGNoYW5nZSBvciBub3Rcblx0ICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCByZXN1bHQgb2Yge0BsaW5rIHNhcC5mZS5jb3JlLmFjdGlvbnMjZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbn1cblx0ICovXG5cdGZ1bmN0aW9uIG92ZXJ3cml0ZU9uRGVtYW5kKGJPdmVyd3JpdGU6IGJvb2xlYW4pIHtcblx0XHRpZiAoYk92ZXJ3cml0ZSkge1xuXHRcdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0bGV0IG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRcdHJldHVybiAoKG1QYXJhbWV0ZXJzLm9WaWV3LmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKF9vUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IF9vUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0cmV0dXJuIGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0bGV0IHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IChtUGFyYW1ldGVycy5vVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0O1xuXHRcdFx0XHRcdFx0aWYgKHNJbmZvKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNMb2NrZWRCeVVzZXJNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0XHRcdHNFbnRpdHlTZXRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZykudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZzogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdHRpdGxlOiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1dBUk5JTkdcIiksXG5cdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXG5cdGNvbnN0IGJFeGVjdXRlID0gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcblx0XHQ/IG1QYXJhbS5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdylcblx0XHQ6IHRydWU7XG5cblx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdH1cblx0bGV0IG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IGZhbHNlO1xuXHR0cnkge1xuXHRcdGxldCBvRHJhZnRDb250ZXh0OiBWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0dHJ5IHtcblx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyk7XG5cdFx0fSBjYXRjaCAob1Jlc3BvbnNlOiBhbnkpIHtcblx0XHRcdC8vT25seSBjYWxsIGJhY2sgaWYgZXJyb3IgNDA5XG5cdFx0XHRpZiAoYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cgJiYgb1Jlc3BvbnNlLnN0YXR1cyA9PT0gNDA5KSB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRpZiAoQWN0aXZpdHlTeW5jLmlzQ29sbGFib3JhdGlvbkVuYWJsZWQobVBhcmFtZXRlcnMub1ZpZXcpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2libGluZ0luZm8gPSBhd2FpdCBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSAobVBhcmFtZXRlcnMub1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkuX3JvdXRpbmcuX2NyZWF0ZUJpbmRpbmdDb250ZXh0KFxuXHRcdFx0XHRcdFx0c2libGluZ0luZm8/LnRhcmdldENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0b3BlbmluZ1NpYmxpbmdDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IG92ZXJ3cml0ZU9uRGVtYW5kKFxuXHRcdFx0XHRcdFx0bVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQgPyBtUGFyYW0uZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCgpIDogdHJ1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoIShvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmNhbmNlbGVkKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Iob1Jlc3BvbnNlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9wZW5pbmdTaWJsaW5nQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQ7XG5cdFx0fVxuXG5cdFx0b0RyYWZ0Q29udGV4dCA9XG5cdFx0XHRvRHJhZnRDb250ZXh0ICYmIG1QYXJhbS5mbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcblx0XHRcdFx0PyBtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCBvRHJhZnRDb250ZXh0KVxuXHRcdFx0XHQ6IG9EcmFmdENvbnRleHQ7XG5cblx0XHRpZiAob0RyYWZ0Q29udGV4dCkge1xuXHRcdFx0Y29uc3Qgc0VkaXRBY3Rpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvRHJhZnRDb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCk7XG5cdFx0XHRjb25zdCBvU2lkZUVmZmVjdHMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0VkaXRBY3Rpb25OYW1lLCBvRHJhZnRDb250ZXh0KTtcblx0XHRcdGlmIChvU2lkZUVmZmVjdHM/LnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdFx0YXdhaXQgb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbihvU2lkZUVmZmVjdHMsIG9EcmFmdENvbnRleHQpO1xuXG5cdFx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIChleGM6IGFueSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHR9XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gYWN0aXZlIGRvY3VtZW50IGZyb20gYSBkcmFmdCBkb2N1bWVudC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gc3VwcG9ydHMgc2V2ZXJhbCBob29rcyBhcyB0aGVyZSBpcyBhIGNlcnRhaW4gY2hvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0I2FjdGl2YXRlRG9jdW1lbnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogVjRDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IGFueTsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBhbnkgfVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWUpXG5cdFx0LnRoZW4oZnVuY3Rpb24gKGJFeGVjdXRlOiBhbnkpIHtcblx0XHRcdGlmICghYkV4ZWN1dGUpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgQWN0aXZhdGlvbiBvZiB0aGUgZG9jdW1lbnQgd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpKSB7XG5cdFx0XHRcdHJldHVybiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50KTtcblx0XHRcdH1cblxuXHRcdFx0LyogYWN0aXZhdGlvbiByZXF1aXJlcyBwcmVwYXJhdGlvbiAqL1xuXHRcdFx0Y29uc3Qgc0JhdGNoR3JvdXAgPSBcImRyYWZ0XCI7XG5cdFx0XHQvLyB3ZSB1c2UgdGhlIHNhbWUgYmF0Y2hHcm91cCB0byBmb3JjZSBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBpbiBhIHNhbWUgYmF0Y2ggYnV0IHdpdGggZGlmZmVyZW50IGNoYW5nZXNldFxuXHRcdFx0Y29uc3Qgb1ByZXBhcmVQcm9taXNlID0gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQsIHNCYXRjaEdyb3VwKTtcblx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0JhdGNoR3JvdXApO1xuXG5cdFx0XHRjb25zdCBvQWN0aXZhdGVQcm9taXNlID0gZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCwgc0JhdGNoR3JvdXApO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW29QcmVwYXJlUHJvbWlzZSwgb0FjdGl2YXRlUHJvbWlzZV0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICh2YWx1ZXM6IFthbnksIGFueV0pIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWVzWzFdO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGV4YzogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGV4Yyk7XG5cdFx0XHRcdH0pO1xuXHRcdH0pXG5cdFx0LnRoZW4oZnVuY3Rpb24gKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0bVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50ID8gbVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KSA6IG9BY3RpdmVEb2N1bWVudENvbnRleHRcblx0XHRcdCk7XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24gKGV4YzogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHR9KTtcbn1cbi8qKlxuICogSFRUUCBQT1NUIGNhbGwgd2hlbiBEcmFmdEFjdGlvbiBpcyBwcmVzZW50IGZvciBEcmFmdCBEZWxldGU7IEhUVFAgREVMRVRFIGZvciBEcmFmdCh3aGVuIG5vIERyYWZ0QWN0aW9uKVxuICogYW5kIEFjdGl2ZSBJbnN0YW5jZSB1c2VzIERFTEVURSBhbHdheXMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0I2RlbGV0ZURyYWZ0XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGRpc2NhcmRlZFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGRlbGV0ZWRcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBkZWxldGVEcmFmdChvQ29udGV4dDogVjRDb250ZXh0LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IHNEaXNjYXJkQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpLFxuXHRcdGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5O1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHkgfHwgKCFiSXNBY3RpdmVFbnRpdHkgJiYgIXNEaXNjYXJkQWN0aW9uKSkge1xuXHRcdC8vVXNlIERlbGV0ZSBpbiBjYXNlIG9mIGFjdGl2ZSBlbnRpdHkgYW5kIG5vIGRpc2NhcmQgYWN0aW9uIGF2YWlsYWJsZSBmb3IgZHJhZnRcblx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vVXNlIERpc2NhcmQgUG9zdCBBY3Rpb24gaWYgaXQgaXMgYSBkcmFmdCBlbnRpdHkgYW5kIGRpc2NhcmQgYWN0aW9uIGV4aXN0c1xuXHRcdHJldHVybiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gdGhlIG1hbmlmZXN0IGlzIHNldCB0byBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdCBpbiBjYXNlIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuICpcbiAqIEBwYXJhbSBwYWdlQ29udHJvbGxlciB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFBhZ2VDb250cm9sbGVyIGluc3RhbmNlLlxuICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSB3aXRoIHRydWUgb3IgZmFsc2UgdG8gc2lsZW50bHkga2VlcCB0aGUgZHJhZnRcbiAqL1xuXG5mdW5jdGlvbiBzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24ocGFnZUNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKSB7XG5cdGxldCByYlNpbGVudGx5S2VlcCA9IGZhbHNlO1xuXHRjb25zdCBvTWFuaWZlc3QgPSBwYWdlQ29udHJvbGxlci5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdCgpIGFzIGFueTtcblx0cmJTaWxlbnRseUtlZXAgPSBvTWFuaWZlc3Q/LltcInNhcC5mZVwiXT8uYXBwPy5zaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24gfHwgZmFsc2U7XG5cdHJldHVybiByYlNpbGVudGx5S2VlcDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZm5Qcm9jZXNzRnVuY3Rpb25cbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHRcbiAqIEBwYXJhbSBvQ29udHJvbGxlclxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlld1xuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRmblByb2Nlc3NGdW5jdGlvbjogYW55LFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBhbnksXG5cdG9Db250ZXh0OiBhbnksXG5cdG9Db250cm9sbGVyOiBhbnksXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZSA9IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG4pIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cblx0Y29uc3QgY29sbGFib3JhdGlvbkNvbm5lY3RlZCA9IEFjdGl2aXR5U3luYy5pc0Nvbm5lY3RlZChvQ29udHJvbGxlci5nZXRWaWV3KCkpO1xuXHRjb25zdCBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgPSAhY29sbGFib3JhdGlvbkNvbm5lY3RlZFxuXHRcdD8gZm5Qcm9jZXNzRnVuY3Rpb25cblx0XHQ6IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuXHRcdFx0XHRBY3Rpdml0eVN5bmMuZGlzY29ubmVjdChvQ29udHJvbGxlci5nZXRWaWV3KCkpO1xuXHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbi5hcHBseShudWxsLCAuLi5hcmdzKTtcblx0XHQgIH07XG5cblx0Y29uc3QgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiA9IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbihvQ29udHJvbGxlcik7XG5cdGlmIChcblx0XHRvQ29udGV4dCAmJlxuXHRcdG9Db250ZXh0LmdldE9iamVjdCgpICYmXG5cdFx0KCFvQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB8fCBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSlcblx0KSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHRkcmFmdERhdGFDb250ZXh0XG5cdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0XHRcdFx0XHRcdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdFx0XHRcdFx0XHQvLyBmb3IgRkNMLlxuXHRcdFx0XHRcdFx0aWYgKCEoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSkge1xuXHRcdFx0XHRcdFx0XHREYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlci5wZXJmb3JtQWZ0ZXJEaXNjYXJkb3JLZWVwRHJhZnQoXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZXJlIGlzIG5vIGFjdGl2ZSBlbnRpdHkgc28gd2UgYXJlIGVkaXRpbmcgZWl0aGVyIG5ld2x5IGNyZWF0ZWQgZGF0YSBvclxuXHRcdFx0XHRcdFx0Ly8gYSBkcmFmdCB3aGljaCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBhY3RpdmUgdmVyc2lvblxuXHRcdFx0XHRcdFx0Ly8gU2luY2Ugd2Ugd2FudCB0byByZWFjdCBkaWZmZXJlbnRseSBpbiB0aGUgdHdvIHNpdHVhdGlvbnMsIHdlIGhhdmUgdG8gY2hlY2sgdGhlXG5cdFx0XHRcdFx0XHQvLyBkaXJ0eSBzdGF0ZVxuXHRcdFx0XHRcdFx0aWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgPT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSAmJlxuXHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbiBjYXNlIHdlIGhhdmUgdW50b3VjaGVkIGNoYW5nZXMgZm9yIHRoZSBkcmFmdCBhbmQgYSBcImJhY2tcIlxuXHRcdFx0XHRcdFx0XHRcdC8vIG5hdmlnYXRpb24gd2UgY2FuIHNpbGVudGx5IGRpc2NhcmQgdGhlIGRyYWZ0IGFnYWluXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2Uvbm8tbmVzdGluZ1xuXHRcdFx0XHRcdFx0XHRcdERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLmRpc2NhcmREcmFmdChvQ29udHJvbGxlciwgYlNraXBCaW5kaW5nVG9WaWV3KVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY2FuY2VsaW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuRm9yd2FyZE5hdmlnYXRpb24gJiYgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugd2UgaGF2ZSBhIFwiZm9yd2FyZCBuYXZpZ2F0aW9uXCIgYW5kIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNldCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBJbiB0aGlzIGNhc2UgZGF0YSBpcyBiZWluZyBjaGFuZ2VkIG9yIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHRcdFx0XHRcdFx0XHRcdC8vIGFuZCB3ZSBhbHdheXMgd2FudCB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgb24gbmF2aWdhdGlvblxuXHRcdFx0XHRcdFx0XHRcdERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdChcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlld1xuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdlIGFyZSBlZGl0aW5nIGEgZHJhZnQgd2hpY2ggaGFzIGJlZW4gY3JlYXRlZCBlYXJsaWVyIGJ1dCBuZXZlciBzYXZlZCB0byBhY3RpdmVcblx0XHRcdFx0XHRcdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdC8vIHNvIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHNpbGVudGx5IG5hdmlnYXRlIGFuZCBkbyBub3RoaW5nXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSB7XG5cdFx0XHRcdFx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IGZvciBhbiBleGlzdGluZyBhY3RpdmUgZW50aXR5XG5cdFx0XHRcdFx0XHQvLyBUaGUgQ3JlYXRpb25EYXRlVGltZSBhbmQgTGFzdENoYW5nZURhdGVUaW1lIGFyZSBlcXVhbCwgc28gdGhpcyBkcmFmdCB3YXNcblx0XHRcdFx0XHRcdC8vIG5ldmVyIHNhdmVkIGJlZm9yZSwgaGVuY2Ugd2UncmUgY3VycmVudGx5IGVkaXRpbmcgYSBuZXdseSBjcmVhdGVkIGRyYWZ0IGZvclxuXHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdFx0XHRcdFx0XHQvLyBBbHNvIHRoZXJlIGhhdmUgc28gZmFyIGJlZW4gbm8gY2hhbmdlcyBtYWRlIHRvIHRoZSBkcmFmdCBhbmQgaW4gdGhpc1xuXHRcdFx0XHRcdFx0Ly8gY2FzZSB3ZSB3YW50IHRvIHNpbGVudGx5IG5hdmlnYXRlIGFuZCBkZWxldGUgdGhlIGRyYWZ0aW4gY2FzZSBvZiBhIGJhY2tcblx0XHRcdFx0XHRcdC8vIG5hdmlnYXRpb24gYnV0IGluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugd2FudCB0byBzaWxlbnRseSBrZWVwIGl0IVxuXHRcdFx0XHRcdFx0aWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IHRydWVcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0XHQuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKChlcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgYW5kIG9ubHlcblx0XHRcdFx0XHRcdFx0Ly8gZXhlY3V0ZSB0aGUgZm9sbG93dXAgZnVuY3Rpb24uXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0XHRcdFx0aWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugd2UgaGF2ZSBhIFwiZm9yd2FyZCBuYXZpZ2F0aW9uXCIgYW5kIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNldCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0XHRcdFx0Ly8gd2UgXCJzaWxlbnRseVwiIGtlZXAgdGhlIGRyYWZ0XG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgTk9UIGVxdWFsLCBzbyB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmdcblx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdC8vIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBvciBub3Rcblx0XHRcdFx0XHRcdFx0Ly8gQ2hhbmdlcyBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgY3VycmVudCBlZGl0aW5nIHNlc3Npb24gc28gd2Ugd2FudFxuXHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYW5kIGxldCB0aGUgdXNlciBkZWNpZGVcblx0XHRcdFx0XHRcdFx0RGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIucGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0KFxuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlld1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgdXNlciBzdGFydGVkIGVkaXRpbmcgdGhlIGV4aXN0aW5nIGRyYWZ0IGJ1dCBkaWQgbm90IG1ha2UgYW55IGNoYW5nZXNcblx0XHRcdFx0XHRcdC8vIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiwgc28gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50XG5cdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgZHJhZnREYXRhQ29udGV4dCBpbmZvcm1hdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnQgPSB7XG5cdGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50OiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCxcblx0YWN0aXZhdGVEb2N1bWVudDogYWN0aXZhdGVEb2N1bWVudCxcblx0ZGVsZXRlRHJhZnQ6IGRlbGV0ZURyYWZ0LFxuXHRleGVjdXRlRHJhZnRFZGl0QWN0aW9uOiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uLFxuXHRleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbjogZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24sXG5cdGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb246IGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24sXG5cdHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uOiBwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbixcblx0c2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdGNyZWF0ZU9wZXJhdGlvbjogY3JlYXRlT3BlcmF0aW9uLFxuXHRleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uOiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl19
|