@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
|
@@ -2,142 +2,323 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/helpers/BindingToolkit", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, uid, AttributeModel, BindingToolkit, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
function _forOf(target, body, check) {
|
|
9
|
+
if (typeof target[_iteratorSymbol] === "function") {
|
|
10
|
+
var iterator = target[_iteratorSymbol](),
|
|
11
|
+
step,
|
|
12
|
+
pact,
|
|
13
|
+
reject;
|
|
14
|
+
|
|
15
|
+
function _cycle(result) {
|
|
16
|
+
try {
|
|
17
|
+
while (!(step = iterator.next()).done && (!check || !check())) {
|
|
18
|
+
result = body(step.value);
|
|
5
19
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
20
|
+
if (result && result.then) {
|
|
21
|
+
if (_isSettledPact(result)) {
|
|
22
|
+
result = result.v;
|
|
23
|
+
} else {
|
|
24
|
+
result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (pact) {
|
|
31
|
+
_settle(pact, 1, result);
|
|
32
|
+
} else {
|
|
33
|
+
pact = result;
|
|
34
|
+
}
|
|
35
|
+
} catch (e) {
|
|
36
|
+
_settle(pact || (pact = new _Pact()), 2, e);
|
|
12
37
|
}
|
|
38
|
+
}
|
|
13
39
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
40
|
+
_cycle();
|
|
41
|
+
|
|
42
|
+
if (iterator.return) {
|
|
43
|
+
var _fixup = function (value) {
|
|
44
|
+
try {
|
|
45
|
+
if (!step.done) {
|
|
46
|
+
iterator.return();
|
|
47
|
+
}
|
|
48
|
+
} catch (e) {}
|
|
49
|
+
|
|
50
|
+
return value;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
if (pact && pact.then) {
|
|
54
|
+
return pact.then(_fixup, function (e) {
|
|
55
|
+
throw _fixup(e);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
_fixup();
|
|
18
60
|
}
|
|
19
|
-
}
|
|
20
61
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
62
|
+
return pact;
|
|
63
|
+
} // No support for Symbol.iterator
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
// No support for Symbol.iterator
|
|
67
|
+
if (!("length" in target)) {
|
|
68
|
+
throw new TypeError("Object is not iterable");
|
|
69
|
+
} // Handle live collections properly
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
// Handle live collections properly
|
|
73
|
+
var values = [];
|
|
74
|
+
|
|
75
|
+
for (var i = 0; i < target.length; i++) {
|
|
76
|
+
values.push(target[i]);
|
|
24
77
|
}
|
|
25
78
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
79
|
+
return _forTo(values, function (i) {
|
|
80
|
+
return body(values[i]);
|
|
81
|
+
}, check);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function _forTo(array, body, check) {
|
|
85
|
+
var i = -1,
|
|
86
|
+
pact,
|
|
87
|
+
reject;
|
|
88
|
+
|
|
89
|
+
function _cycle(result) {
|
|
90
|
+
try {
|
|
91
|
+
while (++i < array.length && (!check || !check())) {
|
|
92
|
+
result = body(i);
|
|
29
93
|
|
|
30
|
-
|
|
31
|
-
|
|
94
|
+
if (result && result.then) {
|
|
95
|
+
if (_isSettledPact(result)) {
|
|
96
|
+
result = result.v;
|
|
97
|
+
} else {
|
|
98
|
+
result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (pact) {
|
|
105
|
+
_settle(pact, 1, result);
|
|
106
|
+
} else {
|
|
107
|
+
pact = result;
|
|
108
|
+
}
|
|
109
|
+
} catch (e) {
|
|
110
|
+
_settle(pact || (pact = new _Pact()), 2, e);
|
|
111
|
+
}
|
|
32
112
|
}
|
|
113
|
+
|
|
114
|
+
_cycle();
|
|
115
|
+
|
|
116
|
+
return pact;
|
|
33
117
|
}
|
|
34
|
-
}
|
|
35
118
|
|
|
36
|
-
var
|
|
37
|
-
function _Pact() {}
|
|
119
|
+
var _iteratorSymbol = /*#__PURE__*/typeof Symbol !== "undefined" ? Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator")) : "@@iterator";
|
|
38
120
|
|
|
39
|
-
|
|
40
|
-
var result = new _Pact();
|
|
41
|
-
var state = this.s;
|
|
121
|
+
var _templateObject, _templateObject2, _templateObject3;
|
|
42
122
|
|
|
43
|
-
|
|
44
|
-
|
|
123
|
+
var _exports = {};
|
|
124
|
+
var compileExpression = BindingToolkit.compileExpression;
|
|
45
125
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
126
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
127
|
+
|
|
128
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
129
|
+
|
|
130
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
131
|
+
|
|
132
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
133
|
+
|
|
134
|
+
function _settle(pact, state, value) {
|
|
135
|
+
if (!pact.s) {
|
|
136
|
+
if (value instanceof _Pact) {
|
|
137
|
+
if (value.s) {
|
|
138
|
+
if (state & 1) {
|
|
139
|
+
state = value.s;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
value = value.v;
|
|
143
|
+
} else {
|
|
144
|
+
value.o = _settle.bind(null, pact, state);
|
|
145
|
+
return;
|
|
51
146
|
}
|
|
147
|
+
}
|
|
52
148
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return
|
|
149
|
+
if (value && value.then) {
|
|
150
|
+
value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
pact.s = state;
|
|
155
|
+
pact.v = value;
|
|
156
|
+
var observer = pact.o;
|
|
157
|
+
|
|
158
|
+
if (observer) {
|
|
159
|
+
observer(pact);
|
|
56
160
|
}
|
|
57
161
|
}
|
|
162
|
+
}
|
|
58
163
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
var value = _this.v;
|
|
164
|
+
var _Pact = /*#__PURE__*/function () {
|
|
165
|
+
function _Pact() {}
|
|
62
166
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
167
|
+
_Pact.prototype.then = function (onFulfilled, onRejected) {
|
|
168
|
+
var result = new _Pact();
|
|
169
|
+
var state = this.s;
|
|
170
|
+
|
|
171
|
+
if (state) {
|
|
172
|
+
var callback = state & 1 ? onFulfilled : onRejected;
|
|
173
|
+
|
|
174
|
+
if (callback) {
|
|
175
|
+
try {
|
|
176
|
+
_settle(result, 1, callback(this.v));
|
|
177
|
+
} catch (e) {
|
|
178
|
+
_settle(result, 2, e);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return result;
|
|
67
182
|
} else {
|
|
68
|
-
|
|
183
|
+
return this;
|
|
69
184
|
}
|
|
70
|
-
} catch (e) {
|
|
71
|
-
_settle(result, 2, e);
|
|
72
185
|
}
|
|
186
|
+
|
|
187
|
+
this.o = function (_this) {
|
|
188
|
+
try {
|
|
189
|
+
var value = _this.v;
|
|
190
|
+
|
|
191
|
+
if (_this.s & 1) {
|
|
192
|
+
_settle(result, 1, onFulfilled ? onFulfilled(value) : value);
|
|
193
|
+
} else if (onRejected) {
|
|
194
|
+
_settle(result, 1, onRejected(value));
|
|
195
|
+
} else {
|
|
196
|
+
_settle(result, 2, value);
|
|
197
|
+
}
|
|
198
|
+
} catch (e) {
|
|
199
|
+
_settle(result, 2, e);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
return result;
|
|
73
204
|
};
|
|
74
205
|
|
|
75
|
-
return
|
|
76
|
-
};
|
|
206
|
+
return _Pact;
|
|
207
|
+
}();
|
|
77
208
|
|
|
78
|
-
|
|
79
|
-
|
|
209
|
+
function _isSettledPact(thenable) {
|
|
210
|
+
return thenable instanceof _Pact && thenable.s & 1;
|
|
211
|
+
}
|
|
80
212
|
|
|
81
|
-
function
|
|
82
|
-
|
|
83
|
-
}
|
|
213
|
+
function _for(test, update, body) {
|
|
214
|
+
var stage;
|
|
84
215
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
pact,
|
|
88
|
-
reject;
|
|
216
|
+
for (;;) {
|
|
217
|
+
var shouldContinue = test();
|
|
89
218
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
result = body(i);
|
|
219
|
+
if (_isSettledPact(shouldContinue)) {
|
|
220
|
+
shouldContinue = shouldContinue.v;
|
|
221
|
+
}
|
|
94
222
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
223
|
+
if (!shouldContinue) {
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (shouldContinue.then) {
|
|
228
|
+
stage = 0;
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
var result = body();
|
|
233
|
+
|
|
234
|
+
if (result && result.then) {
|
|
235
|
+
if (_isSettledPact(result)) {
|
|
236
|
+
result = result.s;
|
|
237
|
+
} else {
|
|
238
|
+
stage = 1;
|
|
239
|
+
break;
|
|
102
240
|
}
|
|
103
241
|
}
|
|
104
242
|
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
243
|
+
if (update) {
|
|
244
|
+
var updateValue = update();
|
|
245
|
+
|
|
246
|
+
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
|
|
247
|
+
stage = 2;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
109
250
|
}
|
|
110
|
-
} catch (e) {
|
|
111
|
-
_settle(pact || (pact = new _Pact()), 2, e);
|
|
112
251
|
}
|
|
113
|
-
}
|
|
114
252
|
|
|
115
|
-
|
|
253
|
+
var pact = new _Pact();
|
|
116
254
|
|
|
117
|
-
|
|
118
|
-
}
|
|
255
|
+
var reject = _settle.bind(null, pact, 2);
|
|
119
256
|
|
|
120
|
-
|
|
121
|
-
|
|
257
|
+
(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);
|
|
258
|
+
return pact;
|
|
122
259
|
|
|
123
|
-
|
|
260
|
+
function _resumeAfterBody(value) {
|
|
261
|
+
result = value;
|
|
124
262
|
|
|
125
|
-
|
|
126
|
-
|
|
263
|
+
do {
|
|
264
|
+
if (update) {
|
|
265
|
+
updateValue = update();
|
|
127
266
|
|
|
128
|
-
|
|
267
|
+
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
|
|
268
|
+
updateValue.then(_resumeAfterUpdate).then(void 0, reject);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
129
272
|
|
|
130
|
-
|
|
273
|
+
shouldContinue = test();
|
|
131
274
|
|
|
132
|
-
|
|
275
|
+
if (!shouldContinue || _isSettledPact(shouldContinue) && !shouldContinue.v) {
|
|
276
|
+
_settle(pact, 1, result);
|
|
133
277
|
|
|
134
|
-
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
135
280
|
|
|
136
|
-
|
|
281
|
+
if (shouldContinue.then) {
|
|
282
|
+
shouldContinue.then(_resumeAfterTest).then(void 0, reject);
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
137
285
|
|
|
138
|
-
|
|
286
|
+
result = body();
|
|
139
287
|
|
|
140
|
-
|
|
288
|
+
if (_isSettledPact(result)) {
|
|
289
|
+
result = result.v;
|
|
290
|
+
}
|
|
291
|
+
} while (!result || !result.then);
|
|
292
|
+
|
|
293
|
+
result.then(_resumeAfterBody).then(void 0, reject);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function _resumeAfterTest(shouldContinue) {
|
|
297
|
+
if (shouldContinue) {
|
|
298
|
+
result = body();
|
|
299
|
+
|
|
300
|
+
if (result && result.then) {
|
|
301
|
+
result.then(_resumeAfterBody).then(void 0, reject);
|
|
302
|
+
} else {
|
|
303
|
+
_resumeAfterBody(result);
|
|
304
|
+
}
|
|
305
|
+
} else {
|
|
306
|
+
_settle(pact, 1, result);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function _resumeAfterUpdate() {
|
|
311
|
+
if (shouldContinue = test()) {
|
|
312
|
+
if (shouldContinue.then) {
|
|
313
|
+
shouldContinue.then(_resumeAfterTest).then(void 0, reject);
|
|
314
|
+
} else {
|
|
315
|
+
_resumeAfterTest(shouldContinue);
|
|
316
|
+
}
|
|
317
|
+
} else {
|
|
318
|
+
_settle(pact, 1, result);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
141
322
|
|
|
142
323
|
function _catch(body, recover) {
|
|
143
324
|
try {
|
|
@@ -155,11 +336,23 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
155
336
|
|
|
156
337
|
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
157
338
|
|
|
158
|
-
|
|
339
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
340
|
+
|
|
341
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
342
|
+
|
|
343
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
344
|
+
|
|
345
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
346
|
+
|
|
347
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
348
|
+
|
|
349
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
350
|
+
|
|
351
|
+
var processBuildingBlock = function (buildingBlockDefinition, oNode, oVisitor) {
|
|
159
352
|
var isPublic = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
160
353
|
|
|
161
354
|
try {
|
|
162
|
-
var sFragmentName =
|
|
355
|
+
var sFragmentName = buildingBlockDefinition.fragment || "".concat(buildingBlockDefinition.namespace, ".").concat(buildingBlockDefinition.name);
|
|
163
356
|
var sName = "this";
|
|
164
357
|
var mContexts = {};
|
|
165
358
|
var oMetadataContexts = {};
|
|
@@ -173,22 +366,22 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
173
366
|
});
|
|
174
367
|
}
|
|
175
368
|
|
|
176
|
-
var oMetadata = prepareMetadata(
|
|
369
|
+
var oMetadata = prepareMetadata(buildingBlockDefinition.metadata, buildingBlockDefinition.isOpen); //Inject storage for macros
|
|
177
370
|
|
|
178
371
|
if (!oSettings[sFragmentName]) {
|
|
179
372
|
oSettings[sFragmentName] = {};
|
|
180
373
|
} // First of all we need to visit the attributes
|
|
181
374
|
|
|
182
375
|
|
|
183
|
-
return Promise.resolve(processProperties(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts)).then(function (_ref) {
|
|
376
|
+
return Promise.resolve(processProperties(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts, buildingBlockDefinition.apiVersion)).then(function (_ref) {
|
|
184
377
|
var mMissingContext = _ref.mMissingContext,
|
|
185
378
|
propertyValues = _ref.propertyValues;
|
|
186
379
|
var initialKeys = Object.keys(propertyValues);
|
|
187
380
|
|
|
188
|
-
var
|
|
381
|
+
var _temp18 = _catch(function () {
|
|
189
382
|
// Aggregation and complex type support
|
|
190
|
-
return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues)).then(function (oAggregations) {
|
|
191
|
-
function
|
|
383
|
+
return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues, buildingBlockDefinition.apiVersion)).then(function (oAggregations) {
|
|
384
|
+
function _temp17() {
|
|
192
385
|
if (oPreviousMacroInfo) {
|
|
193
386
|
//restore macro info if available
|
|
194
387
|
oSettings["_macroInfo"] = oPreviousMacroInfo;
|
|
@@ -207,8 +400,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
207
400
|
|
|
208
401
|
var processedPropertyValues = propertyValues;
|
|
209
402
|
|
|
210
|
-
if (isV1MacroDef(
|
|
211
|
-
processedPropertyValues =
|
|
403
|
+
if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.create) {
|
|
404
|
+
processedPropertyValues = buildingBlockDefinition.create.call(buildingBlockDefinition, propertyValues, oControlConfig, oSettings, oAggregations, isPublic);
|
|
212
405
|
Object.keys(oMetadata.metadataContexts).forEach(function (sMetadataName) {
|
|
213
406
|
if (oMetadata.metadataContexts[sMetadataName].computed) {
|
|
214
407
|
mContexts[sMetadataName] = processedPropertyValues[sMetadataName];
|
|
@@ -219,21 +412,39 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
219
412
|
mContexts[sContextName] = processedPropertyValues[sContextName];
|
|
220
413
|
}
|
|
221
414
|
});
|
|
222
|
-
} else if (
|
|
415
|
+
} else if (buildingBlockDefinition.apiVersion === 2) {
|
|
223
416
|
Object.keys(propertyValues).forEach(function (propName) {
|
|
224
417
|
var oData = propertyValues[propName];
|
|
225
418
|
|
|
226
|
-
if (oData && oData.isA && oData.isA(
|
|
419
|
+
if (oData && oData.isA && oData.isA(SAP_UI_MODEL_CONTEXT) && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
|
|
227
420
|
propertyValues[propName] = oData.getObject();
|
|
228
421
|
}
|
|
229
422
|
});
|
|
230
|
-
var BuildingBlockClass =
|
|
231
|
-
|
|
423
|
+
var BuildingBlockClass = buildingBlockDefinition;
|
|
424
|
+
propertyValues.isPublic = isPublic;
|
|
425
|
+
oInstance = new BuildingBlockClass(_objectSpread(_objectSpread({}, propertyValues), oAggregations), oControlConfig, oSettings
|
|
232
426
|
/*, oControlConfig, oSettings, oAggregations, isPublic*/
|
|
233
427
|
);
|
|
428
|
+
processedPropertyValues = oInstance.getProperties();
|
|
429
|
+
Object.keys(oMetadata.metadataContexts).forEach(function (sContextName) {
|
|
430
|
+
if (processedPropertyValues.hasOwnProperty(sContextName)) {
|
|
431
|
+
var targetObject = processedPropertyValues[sContextName];
|
|
432
|
+
|
|
433
|
+
if (typeof targetObject === "object" && !targetObject.getObject) {
|
|
434
|
+
var sAttributeValue = storeValue(targetObject);
|
|
435
|
+
var sContextPath = "".concat(sAttributeValue);
|
|
436
|
+
oSettings.models.converterContext.setProperty(sContextPath, targetObject);
|
|
437
|
+
targetObject = oSettings.models.converterContext.createBindingContext(sContextPath);
|
|
438
|
+
delete myStore[sAttributeValue];
|
|
439
|
+
mContexts[sContextName] = targetObject;
|
|
440
|
+
} else if (!mContexts.hasOwnProperty(sContextName) && targetObject !== undefined) {
|
|
441
|
+
mContexts[sContextName] = targetObject;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
});
|
|
234
445
|
}
|
|
235
446
|
|
|
236
|
-
var oAttributesModel = new AttributeModel(oNode, processedPropertyValues,
|
|
447
|
+
var oAttributesModel = new AttributeModel(oNode, processedPropertyValues, buildingBlockDefinition);
|
|
237
448
|
mContexts[sName] = oAttributesModel.createBindingContext("/");
|
|
238
449
|
var oPreviousMacroInfo; // Keep track
|
|
239
450
|
|
|
@@ -247,24 +458,35 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
247
458
|
}
|
|
248
459
|
|
|
249
460
|
validateMacroSignature(sFragmentName, oMetadata, mContexts, oNode);
|
|
250
|
-
var oContextVisitor = oVisitor.with(mContexts,
|
|
461
|
+
var oContextVisitor = oVisitor.with(mContexts, buildingBlockDefinition.isOpen !== undefined ? !buildingBlockDefinition.isOpen : true);
|
|
251
462
|
var oParent = oNode.parentNode;
|
|
252
463
|
var iChildIndex;
|
|
253
464
|
var oPromise;
|
|
465
|
+
var processCustomData = true;
|
|
254
466
|
|
|
255
|
-
var
|
|
467
|
+
var _temp16 = function () {
|
|
256
468
|
if (oParent) {
|
|
257
469
|
iChildIndex = Array.from(oParent.children).indexOf(oNode);
|
|
258
470
|
|
|
259
|
-
if (isV1MacroDef(
|
|
471
|
+
if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.getTemplate || buildingBlockDefinition.apiVersion === 2 && !buildingBlockDefinition.fragment) {
|
|
260
472
|
var oTemplate;
|
|
261
473
|
var addDefaultNamespace = false;
|
|
262
474
|
|
|
263
|
-
if (
|
|
475
|
+
if (buildingBlockDefinition.apiVersion === 2) {
|
|
264
476
|
oTemplate = oInstance.getTemplate();
|
|
477
|
+
|
|
478
|
+
if (buildingBlockDefinition.isRuntime) {
|
|
479
|
+
for (var myStoreKey in myStore) {
|
|
480
|
+
var oData = myStore[myStoreKey];
|
|
481
|
+
var sContextPath = "".concat(myStoreKey);
|
|
482
|
+
oSettings.models.converterContext.setProperty(sContextPath, oData);
|
|
483
|
+
delete myStore[myStoreKey];
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
265
487
|
addDefaultNamespace = true;
|
|
266
|
-
} else if (
|
|
267
|
-
oTemplate =
|
|
488
|
+
} else if (buildingBlockDefinition.getTemplate) {
|
|
489
|
+
oTemplate = buildingBlockDefinition.getTemplate(processedPropertyValues);
|
|
268
490
|
}
|
|
269
491
|
|
|
270
492
|
var hasError = "";
|
|
@@ -287,27 +509,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
287
509
|
|
|
288
510
|
if (oTemplate.localName === "parsererror") {
|
|
289
511
|
// If there is a parseerror while processing the XML it means the XML itself is malformed, as such we rerun the template process
|
|
290
|
-
// Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
|
|
291
|
-
|
|
512
|
+
// Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
|
|
513
|
+
// If an error is found it's returned instead of the normal fragment
|
|
514
|
+
Log.error("Error while processing building block ".concat(buildingBlockDefinition.name));
|
|
292
515
|
|
|
293
516
|
try {
|
|
294
517
|
var _oInstance;
|
|
295
518
|
|
|
296
519
|
isTraceMode = true;
|
|
297
|
-
oTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate() :
|
|
520
|
+
oTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate() : buildingBlockDefinition.getTemplate(processedPropertyValues);
|
|
298
521
|
oTemplate = parseXMLString(oTemplate, true);
|
|
299
522
|
} finally {
|
|
300
523
|
isTraceMode = false;
|
|
301
524
|
}
|
|
302
525
|
} else if (hasError.length > 0) {
|
|
303
526
|
// If there is trailing text we create a standard error and display it.
|
|
304
|
-
Log.error("Error while processing building block ".concat(
|
|
305
|
-
var oErrorText = createErrorXML(["Error while processing building block ".concat(
|
|
527
|
+
Log.error("Error while processing building block ".concat(buildingBlockDefinition.name));
|
|
528
|
+
var oErrorText = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name), "Trailing text was found in the XML: ".concat(hasError)], oTemplate.outerHTML);
|
|
306
529
|
oTemplate = parseXMLString(oErrorText, true);
|
|
307
530
|
}
|
|
308
531
|
|
|
309
532
|
oNode.replaceWith(oTemplate);
|
|
310
533
|
oNode = oParent.children[iChildIndex];
|
|
534
|
+
processSlots(oAggregations, oMetadata.aggregations, oNode, processCustomData);
|
|
535
|
+
processCustomData = false;
|
|
311
536
|
oPromise = oContextVisitor.visitNode(oNode);
|
|
312
537
|
} else {
|
|
313
538
|
oNode.remove();
|
|
@@ -319,34 +544,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
319
544
|
|
|
320
545
|
return Promise.resolve(oPromise).then(function () {
|
|
321
546
|
var oMacroElement = oParent.children[iChildIndex];
|
|
322
|
-
|
|
323
|
-
if (Object.keys(oAggregations).length > 0) {
|
|
324
|
-
Object.keys(oAggregations).forEach(function (sAggregationName) {
|
|
325
|
-
var oAggregationElement = oAggregations[sAggregationName];
|
|
326
|
-
|
|
327
|
-
if (oMacroElement !== null && oMacroElement !== undefined) {
|
|
328
|
-
var oNewChild = document.createElementNS(oMacroElement.namespaceURI, sAggregationName);
|
|
329
|
-
var oElementChild = oAggregationElement.firstElementChild;
|
|
330
|
-
|
|
331
|
-
while (oElementChild) {
|
|
332
|
-
var oNextChild = oElementChild.nextElementSibling;
|
|
333
|
-
oNewChild.appendChild(oElementChild);
|
|
334
|
-
oElementChild = oNextChild;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
|
|
338
|
-
var sSlotName = oMetadata.aggregations[sAggregationName] && oMetadata.aggregations[sAggregationName].slot || sAggregationName;
|
|
339
|
-
var oTargetElement = oMacroElement.querySelector("slot[name='" + sSlotName + "']");
|
|
340
|
-
|
|
341
|
-
if (oTargetElement) {
|
|
342
|
-
oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children));
|
|
343
|
-
}
|
|
344
|
-
} else {
|
|
345
|
-
oMacroElement.appendChild(oNewChild);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
}
|
|
547
|
+
processSlots(oAggregations, oMetadata.aggregations, oMacroElement, processCustomData);
|
|
350
548
|
|
|
351
549
|
if (oMacroElement) {
|
|
352
550
|
var oRemainingSlots = oMacroElement.querySelectorAll("slot");
|
|
@@ -358,7 +556,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
358
556
|
}
|
|
359
557
|
}();
|
|
360
558
|
|
|
361
|
-
return
|
|
559
|
+
return _temp16 && _temp16.then ? _temp16.then(_temp17) : _temp17(_temp16);
|
|
362
560
|
});
|
|
363
561
|
}, function (e) {
|
|
364
562
|
// In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
|
|
@@ -376,7 +574,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
376
574
|
var _propertyName = _step.value;
|
|
377
575
|
var _propertyValue = propertyValues[_propertyName];
|
|
378
576
|
|
|
379
|
-
if (_propertyValue && _propertyValue.isA && _propertyValue.isA(
|
|
577
|
+
if (_propertyValue && _propertyValue.isA && _propertyValue.isA(SAP_UI_MODEL_CONTEXT)) {
|
|
380
578
|
traceDetails.initialProperties[_propertyName] = {
|
|
381
579
|
path: _propertyValue.getPath(),
|
|
382
580
|
value: _propertyValue.getObject()
|
|
@@ -395,7 +593,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
395
593
|
var propertyValue = propertyValues[propertyName];
|
|
396
594
|
|
|
397
595
|
if (!initialKeys.includes(propertyName)) {
|
|
398
|
-
if (propertyValue && propertyValue.isA && propertyValue.isA(
|
|
596
|
+
if (propertyValue && propertyValue.isA && propertyValue.isA(SAP_UI_MODEL_CONTEXT)) {
|
|
399
597
|
traceDetails.resolvedProperties[propertyName] = {
|
|
400
598
|
path: propertyValue.getPath(),
|
|
401
599
|
value: propertyValue.getObject()
|
|
@@ -408,50 +606,150 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
408
606
|
|
|
409
607
|
var errorAny = e;
|
|
410
608
|
Log.error(errorAny, errorAny);
|
|
411
|
-
var oError = createErrorXML(["Error while processing building block ".concat(
|
|
609
|
+
var oError = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name), errorAny.stack], oNode.outerHTML, traceDetails);
|
|
412
610
|
var oTemplate = parseXMLString(oError, true);
|
|
413
611
|
oNode.replaceWith(oTemplate);
|
|
414
612
|
});
|
|
415
613
|
|
|
416
|
-
if (
|
|
614
|
+
if (_temp18 && _temp18.then) return _temp18.then(function () {});
|
|
417
615
|
});
|
|
418
616
|
} catch (e) {
|
|
419
617
|
return Promise.reject(e);
|
|
420
618
|
}
|
|
421
619
|
};
|
|
422
620
|
|
|
423
|
-
var processChildren = function (oNode, oVisitor, oMetadata, isPublic, propertyValues) {
|
|
621
|
+
var processChildren = function (oNode, oVisitor, oMetadata, isPublic, propertyValues, apiVersion) {
|
|
424
622
|
try {
|
|
425
623
|
var oAggregations = {};
|
|
426
624
|
|
|
427
|
-
var
|
|
625
|
+
var _temp10 = function () {
|
|
428
626
|
if (oNode.firstElementChild !== null) {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
627
|
+
function _temp11() {
|
|
628
|
+
_oFirstElementChild = oNode.firstElementChild;
|
|
629
|
+
|
|
630
|
+
var _temp6 = _for(function () {
|
|
631
|
+
return _oFirstElementChild !== null;
|
|
632
|
+
}, void 0, function () {
|
|
633
|
+
function _temp5() {
|
|
634
|
+
_oFirstElementChild = oNextChild;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
var oNextChild = _oFirstElementChild.nextElementSibling;
|
|
638
|
+
var sChildName = _oFirstElementChild.localName;
|
|
639
|
+
var sAggregationName = sChildName;
|
|
640
|
+
|
|
641
|
+
if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
|
|
642
|
+
// not a sub aggregation, go back to default Aggregation
|
|
643
|
+
sAggregationName = oMetadata.defaultAggregation || "";
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
var _temp4 = function () {
|
|
647
|
+
if (Object.keys(oMetadata.aggregations).indexOf(sAggregationName) !== -1 && (!isPublic || oMetadata.aggregations[sAggregationName].isPublic)) {
|
|
648
|
+
var _temp13 = function () {
|
|
649
|
+
if (apiVersion === 2) {
|
|
650
|
+
var aggregationDefinition = oMetadata.aggregations[sAggregationName];
|
|
651
|
+
|
|
652
|
+
var _temp14 = function () {
|
|
653
|
+
if (!aggregationDefinition.slot && _oFirstElementChild && _oFirstElementChild.children.length > 0) {
|
|
654
|
+
return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
|
|
655
|
+
var childDefinition = _oFirstElementChild.firstElementChild;
|
|
656
|
+
|
|
657
|
+
while (childDefinition) {
|
|
658
|
+
var oNewChild = document.createElementNS(oNode.namespaceURI, childDefinition.getAttribute("key"));
|
|
659
|
+
var nextChild = childDefinition.nextElementSibling;
|
|
660
|
+
oNewChild.appendChild(childDefinition);
|
|
661
|
+
oAggregations[childDefinition.getAttribute("key")] = oNewChild;
|
|
662
|
+
childDefinition.removeAttribute("key");
|
|
663
|
+
childDefinition = nextChild;
|
|
664
|
+
}
|
|
665
|
+
});
|
|
666
|
+
} else if (aggregationDefinition.slot) {
|
|
667
|
+
if (sAggregationName !== sChildName) {
|
|
668
|
+
if (!oAggregations[sAggregationName]) {
|
|
669
|
+
var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
|
|
670
|
+
oAggregations[sAggregationName] = oNewChild;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
oAggregations[sAggregationName].appendChild(_oFirstElementChild);
|
|
674
|
+
} else {
|
|
675
|
+
oAggregations[sAggregationName] = _oFirstElementChild;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
}();
|
|
679
|
+
|
|
680
|
+
if (_temp14 && _temp14.then) return _temp14.then(function () {});
|
|
681
|
+
} else {
|
|
682
|
+
return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
|
|
683
|
+
oAggregations[_oFirstElementChild.localName] = _oFirstElementChild;
|
|
684
|
+
});
|
|
685
|
+
}
|
|
686
|
+
}();
|
|
687
|
+
|
|
688
|
+
if (_temp13 && _temp13.then) return _temp13.then(function () {});
|
|
689
|
+
} else {
|
|
690
|
+
var _temp15 = function () {
|
|
691
|
+
if (Object.keys(oMetadata.properties).indexOf(sAggregationName) !== -1) {
|
|
692
|
+
return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
|
|
693
|
+
// Object Type properties
|
|
694
|
+
propertyValues[sAggregationName] = {};
|
|
695
|
+
|
|
696
|
+
for (var _i = 0, _Object$keys = Object.keys(_oFirstElementChild.attributes); _i < _Object$keys.length; _i++) {
|
|
697
|
+
var attributeIndex = _Object$keys[_i];
|
|
698
|
+
propertyValues[sAggregationName][_oFirstElementChild.attributes[attributeIndex].localName] = _oFirstElementChild.attributes[attributeIndex].value;
|
|
699
|
+
}
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
}();
|
|
703
|
+
|
|
704
|
+
if (_temp15 && _temp15.then) return _temp15.then(function () {});
|
|
705
|
+
}
|
|
706
|
+
}();
|
|
707
|
+
|
|
708
|
+
return _temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4);
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
if (_temp6 && _temp6.then) return _temp6.then(function () {});
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
var _oFirstElementChild = oNode.firstElementChild;
|
|
715
|
+
|
|
716
|
+
if (apiVersion === 2) {
|
|
717
|
+
while (_oFirstElementChild !== null) {
|
|
718
|
+
var sChildName = _oFirstElementChild.localName;
|
|
719
|
+
var sAggregationName = sChildName;
|
|
720
|
+
|
|
721
|
+
if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
|
|
722
|
+
// not a sub aggregation, go back to default Aggregation
|
|
723
|
+
sAggregationName = oMetadata.defaultAggregation || "";
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
var aggregationDefinition = oMetadata.aggregations[sAggregationName];
|
|
727
|
+
|
|
728
|
+
if (aggregationDefinition && !aggregationDefinition.slot) {
|
|
729
|
+
var parsedAggregation = parseAggregation(_oFirstElementChild);
|
|
730
|
+
oAggregations[sAggregationName] = parsedAggregation;
|
|
731
|
+
|
|
732
|
+
for (var parsedAggregationKey in parsedAggregation) {
|
|
733
|
+
oMetadata.aggregations[parsedAggregationKey] = parsedAggregation[parsedAggregationKey];
|
|
445
734
|
}
|
|
446
735
|
}
|
|
447
736
|
|
|
448
|
-
|
|
737
|
+
_oFirstElementChild = _oFirstElementChild.nextElementSibling;
|
|
449
738
|
}
|
|
450
|
-
}
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
var _temp12 = function () {
|
|
742
|
+
if (apiVersion !== 2) {
|
|
743
|
+
// If there are aggregation we need to visit the childNodes to resolve templating instructions
|
|
744
|
+
return Promise.resolve(oVisitor.visitChildNodes(oNode)).then(function () {});
|
|
745
|
+
}
|
|
746
|
+
}();
|
|
747
|
+
|
|
748
|
+
return _temp12 && _temp12.then ? _temp12.then(_temp11) : _temp11(_temp12);
|
|
451
749
|
}
|
|
452
750
|
}();
|
|
453
751
|
|
|
454
|
-
return Promise.resolve(
|
|
752
|
+
return Promise.resolve(_temp10 && _temp10.then ? _temp10.then(function () {
|
|
455
753
|
return oAggregations;
|
|
456
754
|
}) : oAggregations);
|
|
457
755
|
} catch (e) {
|
|
@@ -459,9 +757,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
459
757
|
}
|
|
460
758
|
};
|
|
461
759
|
|
|
462
|
-
var processProperties = function (oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts) {
|
|
760
|
+
var processProperties = function (oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts, apiVersion) {
|
|
463
761
|
try {
|
|
464
|
-
function
|
|
762
|
+
function _temp23() {
|
|
465
763
|
// Sort keys to be sure contextPath is before metaPath ( yes I'm desperate )
|
|
466
764
|
aDefinitionContextsKeys = aDefinitionContextsKeys.sort(function (a, b) {
|
|
467
765
|
return a > b ? 1 : -1;
|
|
@@ -515,39 +813,41 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
515
813
|
var aDefinitionContextsKeys = Object.keys(oDefinitionContexts);
|
|
516
814
|
var propertyValues = {};
|
|
517
815
|
|
|
518
|
-
var
|
|
519
|
-
var sKeyValue = aDefinitionPropertiesKeys[j];
|
|
520
|
-
|
|
816
|
+
var _temp24 = _forOf(aDefinitionPropertiesKeys, function (sKeyValue) {
|
|
521
817
|
if (oDefinitionProperties[sKeyValue].type === "object") {
|
|
522
|
-
propertyValues[sKeyValue] = {}; // To avoid
|
|
818
|
+
propertyValues[sKeyValue] = {}; // To avoid values being reused accross macros
|
|
523
819
|
} else {
|
|
524
820
|
propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue;
|
|
525
821
|
}
|
|
526
822
|
|
|
527
|
-
var
|
|
823
|
+
var _temp20 = function () {
|
|
528
824
|
if (oNode.hasAttribute(sKeyValue) && isPublic && !oDefinitionProperties[sKeyValue].isPublic) {
|
|
529
825
|
Log.error("Property ".concat(sKeyValue, " was ignored as it is not intended for public usage"));
|
|
530
826
|
} else {
|
|
531
|
-
var
|
|
827
|
+
var _temp25 = function () {
|
|
532
828
|
if (oNode.hasAttribute(sKeyValue)) {
|
|
533
829
|
return Promise.resolve(oVisitor.visitAttribute(oNode, oNode.attributes.getNamedItem(sKeyValue))).then(function () {
|
|
534
830
|
var vValue = oNode.getAttribute(sKeyValue);
|
|
535
831
|
|
|
536
832
|
if (vValue !== undefined) {
|
|
833
|
+
if (apiVersion === 2 && typeof vValue === "string" && oDefinitionProperties[sKeyValue].type === "boolean") {
|
|
834
|
+
vValue = vValue === "true";
|
|
835
|
+
}
|
|
836
|
+
|
|
537
837
|
propertyValues[sKeyValue] = vValue;
|
|
538
838
|
}
|
|
539
839
|
});
|
|
540
840
|
}
|
|
541
841
|
}();
|
|
542
842
|
|
|
543
|
-
if (
|
|
843
|
+
if (_temp25 && _temp25.then) return _temp25.then(function () {});
|
|
544
844
|
}
|
|
545
845
|
}();
|
|
546
846
|
|
|
547
|
-
if (
|
|
847
|
+
if (_temp20 && _temp20.then) return _temp20.then(function () {});
|
|
548
848
|
});
|
|
549
849
|
|
|
550
|
-
return Promise.resolve(
|
|
850
|
+
return Promise.resolve(_temp24 && _temp24.then ? _temp24.then(_temp23) : _temp23(_temp24));
|
|
551
851
|
} catch (e) {
|
|
552
852
|
return Promise.reject(e);
|
|
553
853
|
}
|
|
@@ -611,7 +911,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
611
911
|
|
|
612
912
|
if (!oNode.hasAttribute(sKey)) {
|
|
613
913
|
if (oPropertySettings.required && !oPropertySettings.hasOwnProperty("defaultValue")) {
|
|
614
|
-
throw new Error(sName
|
|
914
|
+
throw new Error("".concat(sName, ": ") + "Required property '".concat(sKey, "' is missing"));
|
|
615
915
|
}
|
|
616
916
|
} else {
|
|
617
917
|
delete oAttributeNames[sKey];
|
|
@@ -625,6 +925,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
625
925
|
}
|
|
626
926
|
});
|
|
627
927
|
}
|
|
928
|
+
|
|
929
|
+
_exports.validateMacroSignature = validateMacroSignature;
|
|
930
|
+
var SAP_UI_CORE_ELEMENT = "sap.ui.core.Element";
|
|
931
|
+
var SAP_UI_MODEL_CONTEXT = "sap.ui.model.Context";
|
|
628
932
|
/**
|
|
629
933
|
* Ensures that the metadata for the building block are properly defined.
|
|
630
934
|
*
|
|
@@ -633,9 +937,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
633
937
|
* @returns A set of completed metadata for further processing
|
|
634
938
|
*/
|
|
635
939
|
|
|
636
|
-
|
|
637
|
-
_exports.validateMacroSignature = validateMacroSignature;
|
|
638
|
-
|
|
639
940
|
function prepareMetadata(buildingBlockMetadata) {
|
|
640
941
|
var isOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
641
942
|
|
|
@@ -643,15 +944,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
643
944
|
var oProperties = {};
|
|
644
945
|
var oAggregations = {
|
|
645
946
|
"dependents": {
|
|
646
|
-
type:
|
|
947
|
+
type: SAP_UI_CORE_ELEMENT
|
|
647
948
|
},
|
|
648
949
|
"customData": {
|
|
649
|
-
type:
|
|
950
|
+
type: SAP_UI_CORE_ELEMENT
|
|
650
951
|
}
|
|
651
952
|
};
|
|
652
953
|
var oMetadataContexts = {};
|
|
954
|
+
var foundDefaultAggregation;
|
|
653
955
|
Object.keys(buildingBlockMetadata.properties).forEach(function (sPropertyName) {
|
|
654
|
-
if (buildingBlockMetadata.properties[sPropertyName].type !==
|
|
956
|
+
if (buildingBlockMetadata.properties[sPropertyName].type !== SAP_UI_MODEL_CONTEXT) {
|
|
655
957
|
oProperties[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
|
|
656
958
|
} else {
|
|
657
959
|
oMetadataContexts[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
|
|
@@ -667,12 +969,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
667
969
|
if (buildingBlockMetadata.aggregations) {
|
|
668
970
|
Object.keys(buildingBlockMetadata.aggregations).forEach(function (sPropertyName) {
|
|
669
971
|
oAggregations[sPropertyName] = buildingBlockMetadata.aggregations[sPropertyName];
|
|
972
|
+
|
|
973
|
+
if (oAggregations[sPropertyName].isDefault) {
|
|
974
|
+
foundDefaultAggregation = sPropertyName;
|
|
975
|
+
}
|
|
670
976
|
});
|
|
671
977
|
}
|
|
672
978
|
|
|
673
979
|
return {
|
|
674
980
|
properties: oProperties,
|
|
675
981
|
aggregations: oAggregations,
|
|
982
|
+
defaultAggregation: foundDefaultAggregation,
|
|
676
983
|
metadataContexts: oMetadataContexts,
|
|
677
984
|
isOpen: isOpen
|
|
678
985
|
};
|
|
@@ -681,10 +988,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
681
988
|
metadataContexts: {},
|
|
682
989
|
aggregations: {
|
|
683
990
|
"dependents": {
|
|
684
|
-
type:
|
|
991
|
+
type: SAP_UI_CORE_ELEMENT
|
|
685
992
|
},
|
|
686
993
|
"customData": {
|
|
687
|
-
type:
|
|
994
|
+
type: SAP_UI_CORE_ELEMENT
|
|
688
995
|
}
|
|
689
996
|
},
|
|
690
997
|
properties: {},
|
|
@@ -698,31 +1005,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
698
1005
|
|
|
699
1006
|
if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
|
|
700
1007
|
var sAttributeValue = oNode.getAttribute(sAttributeName);
|
|
701
|
-
var sMetaPath;
|
|
702
|
-
|
|
1008
|
+
var sMetaPath;
|
|
703
1009
|
oMetadataContext = BindingParser.complexParser(sAttributeValue);
|
|
704
1010
|
|
|
705
1011
|
if (!oMetadataContext) {
|
|
706
|
-
if (sAttributeValue.startsWith("uid--")) {
|
|
1012
|
+
if (sAttributeValue.startsWith("/uid--")) {
|
|
707
1013
|
var oData = myStore[sAttributeValue];
|
|
708
|
-
|
|
709
|
-
oSettings.models.converterContext.setProperty(sContextPath, oData);
|
|
1014
|
+
oSettings.models.converterContext.setProperty(sAttributeValue, oData);
|
|
710
1015
|
oMetadataContext = {
|
|
711
1016
|
model: "converterContext",
|
|
712
|
-
path:
|
|
1017
|
+
path: sAttributeValue
|
|
713
1018
|
};
|
|
714
1019
|
} else if (sAttributeName === "metaPath" && oSettings.currentContextPath || sAttributeName === "contextPath") {
|
|
715
1020
|
if (sAttributeValue && sAttributeValue.startsWith("/")) {
|
|
716
1021
|
// absolute path - we just use this one
|
|
717
1022
|
sMetaPath = sAttributeValue;
|
|
718
1023
|
} else {
|
|
719
|
-
var
|
|
1024
|
+
var sContextPath = oSettings.currentContextPath.getPath();
|
|
720
1025
|
|
|
721
|
-
if (!
|
|
722
|
-
|
|
1026
|
+
if (!sContextPath.endsWith("/")) {
|
|
1027
|
+
sContextPath += "/";
|
|
723
1028
|
}
|
|
724
1029
|
|
|
725
|
-
sMetaPath =
|
|
1030
|
+
sMetaPath = sContextPath + sAttributeValue;
|
|
726
1031
|
}
|
|
727
1032
|
|
|
728
1033
|
oMetadataContext = {
|
|
@@ -757,6 +1062,66 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
757
1062
|
return oMetadataContext;
|
|
758
1063
|
}
|
|
759
1064
|
|
|
1065
|
+
function parseAggregation(oAggregation) {
|
|
1066
|
+
var oOutObjects = {};
|
|
1067
|
+
|
|
1068
|
+
if (oAggregation && oAggregation.children.length > 0) {
|
|
1069
|
+
var children = oAggregation.children;
|
|
1070
|
+
|
|
1071
|
+
for (var childIdx = 0; childIdx < children.length; childIdx++) {
|
|
1072
|
+
var childDefinition = children[childIdx];
|
|
1073
|
+
var childKey = childDefinition.getAttribute("key") || childDefinition.getAttribute("id");
|
|
1074
|
+
|
|
1075
|
+
if (childKey) {
|
|
1076
|
+
childKey = "InlineXML_".concat(childKey);
|
|
1077
|
+
childDefinition.setAttribute("key", childKey);
|
|
1078
|
+
oOutObjects[childKey] = {
|
|
1079
|
+
key: childKey,
|
|
1080
|
+
position: {
|
|
1081
|
+
placement: childDefinition.getAttribute("placement"),
|
|
1082
|
+
anchor: childDefinition.getAttribute("anchor")
|
|
1083
|
+
},
|
|
1084
|
+
type: "Slot"
|
|
1085
|
+
};
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
return oOutObjects;
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
function processSlots(oAggregations, oMetadataAggregations, oNode) {
|
|
1094
|
+
var processCustomData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1095
|
+
|
|
1096
|
+
if (Object.keys(oAggregations).length > 0) {
|
|
1097
|
+
Object.keys(oAggregations).forEach(function (sAggregationName) {
|
|
1098
|
+
var oAggregationElement = oAggregations[sAggregationName];
|
|
1099
|
+
|
|
1100
|
+
if (oNode !== null && oNode !== undefined && oAggregationElement) {
|
|
1101
|
+
var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
|
|
1102
|
+
var oElementChild = oAggregationElement.firstElementChild;
|
|
1103
|
+
|
|
1104
|
+
while (oElementChild) {
|
|
1105
|
+
var oNextChild = oElementChild.nextElementSibling;
|
|
1106
|
+
oNewChild.appendChild(oElementChild);
|
|
1107
|
+
oElementChild = oNextChild;
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
|
|
1111
|
+
var sSlotName = oMetadataAggregations[sAggregationName] && oMetadataAggregations[sAggregationName].slot || sAggregationName;
|
|
1112
|
+
var oTargetElement = oNode.querySelector("slot[name='".concat(sSlotName, "']"));
|
|
1113
|
+
|
|
1114
|
+
if (oTargetElement) {
|
|
1115
|
+
oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children));
|
|
1116
|
+
}
|
|
1117
|
+
} else if (processCustomData && oNewChild.children.length > 0) {
|
|
1118
|
+
oNode.appendChild(oNewChild);
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
});
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
|
|
760
1125
|
function addSingleContext(mContexts, oVisitor, oCtx, oMetadataContexts) {
|
|
761
1126
|
var sKey = oCtx.name || oCtx.model || undefined;
|
|
762
1127
|
|
|
@@ -768,12 +1133,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
768
1133
|
var sContextPath = oCtx.path;
|
|
769
1134
|
|
|
770
1135
|
if (oCtx.model != null) {
|
|
771
|
-
sContextPath = oCtx.model
|
|
1136
|
+
sContextPath = "".concat(oCtx.model, ">").concat(sContextPath);
|
|
772
1137
|
}
|
|
773
1138
|
|
|
774
1139
|
var mSetting = oVisitor.getSettings();
|
|
775
1140
|
|
|
776
|
-
if (
|
|
1141
|
+
if (oCtx.model === "converterContext" && oCtx.path.length > 0) {
|
|
1142
|
+
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path, mSetting.bindingContexts[oCtx.model]); // add the context to the visitor
|
|
1143
|
+
} else if (!mSetting.bindingContexts[oCtx.model] && mSetting.models[oCtx.model]) {
|
|
777
1144
|
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path); // add the context to the visitor
|
|
778
1145
|
} else {
|
|
779
1146
|
mContexts[sKey] = oVisitor.getContext(sContextPath); // add the context to the visitor
|
|
@@ -810,7 +1177,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
810
1177
|
|
|
811
1178
|
function createErrorXML(errorMessages, xmlFragment, additionalData) {
|
|
812
1179
|
var errorLabels = errorMessages.map(function (errorMessage) {
|
|
813
|
-
return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["<m:Label text=\"", "\"/>"])),
|
|
1180
|
+
return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["<m:Label text=\"", "\"/>"])), escapeXMLAttributeValue(errorMessage));
|
|
814
1181
|
});
|
|
815
1182
|
var additionalText = "";
|
|
816
1183
|
|
|
@@ -824,7 +1191,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
824
1191
|
var myStore = {};
|
|
825
1192
|
|
|
826
1193
|
function storeValue(values) {
|
|
827
|
-
var propertyUID = "uid--".concat(uid());
|
|
1194
|
+
var propertyUID = "/uid--".concat(uid());
|
|
828
1195
|
myStore[propertyUID] = values;
|
|
829
1196
|
return propertyUID;
|
|
830
1197
|
}
|
|
@@ -841,7 +1208,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
841
1208
|
var addDefaultNamespaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
842
1209
|
|
|
843
1210
|
if (addDefaultNamespaces) {
|
|
844
|
-
xmlString = "<template\n\t\t\t\t\t\txmlns:template=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1\"\n\t\t\t\t\t\txmlns:m=\"sap.m\"\n\t\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\t\txmlns:customData=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1\">".concat(xmlString, "</template>");
|
|
1211
|
+
xmlString = "<template\n\t\t\t\t\t\txmlns:template=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1\"\n\t\t\t\t\t\txmlns:m=\"sap.m\"\n\t\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\t\txmlns:mdc=\"sap.ui.mdc\"\n\t\t\t\t\t\txmlns:customData=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1\">".concat(xmlString, "</template>");
|
|
845
1212
|
}
|
|
846
1213
|
|
|
847
1214
|
var xmlDocument = DOMParserInstance.parseFromString(xmlString, "text/xml");
|
|
@@ -875,7 +1242,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
875
1242
|
|
|
876
1243
|
|
|
877
1244
|
function escapeXMLAttributeValue(val) {
|
|
878
|
-
return val.replace(/&/g, "&").replace(/</g, "<");
|
|
1245
|
+
return val && val.replace(/&/g, "&").replace(/</g, "<");
|
|
879
1246
|
}
|
|
880
1247
|
/**
|
|
881
1248
|
* Create a string representation of the template literal while handling special object case.
|
|
@@ -899,16 +1266,24 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
899
1266
|
|
|
900
1267
|
outStr += strings[i]; // Handle the different case of object, if it's an array we join them, if it's a binding expression (determined by _type) then we compile it.
|
|
901
1268
|
|
|
902
|
-
if (Array.isArray(values[i])) {
|
|
903
|
-
outStr += values[i].flat(5).join("").trim();
|
|
1269
|
+
if (Array.isArray(values[i]) && values[i].length > 0 && typeof values[i][0] === "string") {
|
|
1270
|
+
outStr += values[i].flat(5).join("\n").trim();
|
|
904
1271
|
} else if ((_values$i = values[i]) !== null && _values$i !== void 0 && _values$i._type) {
|
|
905
|
-
var compiledExpression =
|
|
1272
|
+
var compiledExpression = compileExpression(values[i]);
|
|
906
1273
|
outStr += compiledExpression !== undefined ? escapeXMLAttributeValue(compiledExpression) : undefined;
|
|
907
1274
|
} else if ((_values$i2 = values[i]) !== null && _values$i2 !== void 0 && _values$i2.getTemplate) {
|
|
908
1275
|
outStr += values[i].getTemplate();
|
|
909
1276
|
} else if (typeof values[i] === "object") {
|
|
910
|
-
var
|
|
911
|
-
|
|
1277
|
+
var _values$i$isA, _values$i3;
|
|
1278
|
+
|
|
1279
|
+
if ((_values$i$isA = (_values$i3 = values[i]).isA) !== null && _values$i$isA !== void 0 && _values$i$isA.call(_values$i3, "sap.ui.model.Context")) {
|
|
1280
|
+
outStr += values[i].getPath();
|
|
1281
|
+
} else {
|
|
1282
|
+
var propertyUId = storeValue(values[i]);
|
|
1283
|
+
outStr += "".concat(propertyUId);
|
|
1284
|
+
}
|
|
1285
|
+
} else if (values[i] && typeof values[i] === "string" && !values[i].startsWith("<") && !values[i].startsWith("<")) {
|
|
1286
|
+
outStr += escapeXMLAttributeValue(values[i]);
|
|
912
1287
|
} else {
|
|
913
1288
|
outStr += values[i];
|
|
914
1289
|
}
|
|
@@ -932,4 +1307,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
932
1307
|
_exports.xml = xml;
|
|
933
1308
|
return _exports;
|
|
934
1309
|
}, false);
|
|
935
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sIm5hbWVzIjpbInBhY3QiLCJzdGF0ZSIsInZhbHVlIiwicyIsInYiLCJvIiwiYmluZCIsInRoZW4iLCJvYnNlcnZlciIsInByb3RvdHlwZSIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsInJlc3VsdCIsImNhbGxiYWNrIiwiZSIsIl90aGlzIiwidGhlbmFibGUiLCJhcnJheSIsImJvZHkiLCJjaGVjayIsImkiLCJyZWplY3QiLCJfY3ljbGUiLCJsZW5ndGgiLCJyZWNvdmVyIiwicHJvY2Vzc0J1aWxkaW5nQmxvY2siLCJidWlsZGluZ0JMb2NrRGVmaW5pdGlvbiIsIm9Ob2RlIiwib1Zpc2l0b3IiLCJpc1B1YmxpYyIsInNGcmFnbWVudE5hbWUiLCJmcmFnbWVudCIsIm5hbWVzcGFjZSIsIm5hbWUiLCJzTmFtZSIsIm1Db250ZXh0cyIsIm9NZXRhZGF0YUNvbnRleHRzIiwib1NldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJtb2RlbHMiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIm9SZXNvdXJjZUJ1bmRsZSIsIlJlc291cmNlTW9kZWwiLCJzZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUiLCJjYXRjaCIsImVycm9yIiwiTG9nIiwib01ldGFkYXRhIiwicHJlcGFyZU1ldGFkYXRhIiwibWV0YWRhdGEiLCJpc09wZW4iLCJwcm9jZXNzUHJvcGVydGllcyIsIm1NaXNzaW5nQ29udGV4dCIsInByb3BlcnR5VmFsdWVzIiwiaW5pdGlhbEtleXMiLCJPYmplY3QiLCJrZXlzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9QcmV2aW91c01hY3JvSW5mbyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwiaXNWMU1hY3JvRGVmIiwiY3JlYXRlIiwiY2FsbCIsIm1ldGFkYXRhQ29udGV4dHMiLCJmb3JFYWNoIiwic01ldGFkYXRhTmFtZSIsImNvbXB1dGVkIiwic0NvbnRleHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJhcGlWZXJzaW9uIiwicHJvcE5hbWUiLCJvRGF0YSIsImlzQSIsImdldE1vZGVsIiwiZ2V0T2JqZWN0IiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJUcmFjZUluZm8iLCJpc1RyYWNlSW5mb0FjdGl2ZSIsIm9UcmFjZUluZm8iLCJ0cmFjZU1hY3JvQ2FsbHMiLCJtYWNyb0luZm8iLCJ2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsInVuZGVmaW5lZCIsIm9QYXJlbnQiLCJwYXJlbnROb2RlIiwiaUNoaWxkSW5kZXgiLCJvUHJvbWlzZSIsIkFycmF5IiwiZnJvbSIsImNoaWxkcmVuIiwiaW5kZXhPZiIsImdldFRlbXBsYXRlIiwib1RlbXBsYXRlIiwiYWRkRGVmYXVsdE5hbWVzcGFjZSIsImhhc0Vycm9yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJwYXJzZVhNTFN0cmluZyIsIml0ZXIiLCJkb2N1bWVudCIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwibG9jYWxOYW1lIiwiaXNUcmFjZU1vZGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJvdXRlckhUTUwiLCJyZXBsYWNlV2l0aCIsInZpc2l0Tm9kZSIsInJlbW92ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvTWFjcm9FbGVtZW50Iiwic0FnZ3JlZ2F0aW9uTmFtZSIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvTmV3Q2hpbGQiLCJjcmVhdGVFbGVtZW50TlMiLCJuYW1lc3BhY2VVUkkiLCJvRWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsImFwcGVuZENoaWxkIiwic1Nsb3ROYW1lIiwiYWdncmVnYXRpb25zIiwic2xvdCIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJ0cmFjZURldGFpbHMiLCJpbml0aWFsUHJvcGVydGllcyIsInJlc29sdmVkUHJvcGVydGllcyIsIm1pc3NpbmdDb250ZXh0cyIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5VmFsdWUiLCJwYXRoIiwiZ2V0UGF0aCIsImluY2x1ZGVzIiwiZXJyb3JBbnkiLCJvRXJyb3IiLCJzdGFjayIsInZpc2l0Q2hpbGROb2RlcyIsIm9GaXJzdEVsZW1lbnRDaGlsZCIsInNDaGlsZE5hbWUiLCJwcm9wZXJ0aWVzIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUluZGV4IiwiYURlZmluaXRpb25Db250ZXh0c0tleXMiLCJzb3J0IiwiYSIsImIiLCJzQXR0cmlidXRlTmFtZSIsImJEb05vdFJlc29sdmUiLCJvRGVmaW5pdGlvbkNvbnRleHRzIiwiaGFzQXR0cmlidXRlIiwib01ldGFkYXRhQ29udGV4dCIsIl9nZXRNZXRhZGF0YUNvbnRleHQiLCJhZGRTaW5nbGVDb250ZXh0IiwiYmluZGluZ0NvbnRleHRzIiwiY3VycmVudENvbnRleHRQYXRoIiwib0RlZmluaXRpb25Qcm9wZXJ0aWVzIiwiY29udGV4dFBhdGgiLCJhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzIiwiaiIsInNLZXlWYWx1ZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJ2aXNpdEF0dHJpYnV0ZSIsImdldE5hbWVkSXRlbSIsInZWYWx1ZSIsImdldEF0dHJpYnV0ZSIsIkxPR0dFUl9TQ09QRSIsIkRPTVBhcnNlckluc3RhbmNlIiwiRE9NUGFyc2VyIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwib0NvbnRleHRTZXR0aW5ncyIsInNLZXkiLCJvQ29udGV4dCIsIm9Db250ZXh0T2JqZWN0IiwicmVxdWlyZWQiLCJFcnJvciIsIiRraW5kIiwiJFR5cGUiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsImFQcm9wZXJ0aWVzIiwib0F0dHJpYnV0ZU5hbWVzIiwiaUtleSIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwic3RhcnRzV2l0aCIsIndhcm5pbmciLCJidWlsZGluZ0Jsb2NrTWV0YWRhdGEiLCJvUHJvcGVydGllcyIsInNQcm9wZXJ0eU5hbWUiLCJldmVudHMiLCJzRXZlbnROYW1lIiwic0F0dHJpYnV0ZVZhbHVlIiwic01ldGFQYXRoIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJteVN0b3JlIiwic0NvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsInNldFByb3BlcnR5IiwibW9kZWwiLCJlbmRzV2l0aCIsImVudGl0eVNldCIsImdldENvbnRleHQiLCJvQ3R4IiwibVNldHRpbmciLCJleCIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsInhtbFRhZyIsInB1YmxpY05hbWVzcGFjZSIsImVycm9yTWVzc2FnZXMiLCJ4bWxGcmFnbWVudCIsImFkZGl0aW9uYWxEYXRhIiwiZXJyb3JMYWJlbHMiLCJtYXAiLCJlcnJvck1lc3NhZ2UiLCJ4bWwiLCJlc2NhcGVYTUwiLCJhZGRpdGlvbmFsVGV4dCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdG9yZVZhbHVlIiwidmFsdWVzIiwicHJvcGVydHlVSUQiLCJ1aWQiLCJ4bWxTdHJpbmciLCJhZGREZWZhdWx0TmFtZXNwYWNlcyIsInhtbERvY3VtZW50IiwicGFyc2VGcm9tU3RyaW5nIiwib3V0cHV0Iiwic3RyIiwicmVwbGFjZSIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwidmFsIiwic3RyaW5ncyIsIm91dFN0ciIsImlzQXJyYXkiLCJmbGF0Iiwiam9pbiIsIl90eXBlIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUJpbmRp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QUNBLE9BRk0sTUFFQSxJQUFJLE9BQU8rSSxNQUFNLENBQUNoTyxDQUFELENBQWIsS0FBcUIsUUFBekIsRUFBbUM7QUFDekMsWUFBTW9QLFdBQVcsR0FBR3JCLFVBQVUsQ0FBQ0MsTUFBTSxDQUFDaE8sQ0FBRCxDQUFQLENBQTlCO0FBQ0E2TyxRQUFBQSxNQUFNLGNBQU9PLFdBQVAsQ0FBTjtBQUNBLE9BSE0sTUFHQTtBQUNOUCxRQUFBQSxNQUFNLElBQUliLE1BQU0sQ0FBQ2hPLENBQUQsQ0FBaEI7QUFDQTtBQUNEOztBQUNENk8sSUFBQUEsTUFBTSxJQUFJRCxPQUFPLENBQUM1TyxDQUFELENBQWpCO0FBQ0E2TyxJQUFBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQzlJLElBQVAsRUFBVDs7QUFDQSxRQUFJRSxXQUFKLEVBQWlCO0FBQ2hCLFVBQU1vSixTQUFTLEdBQUcvSixjQUFjLENBQUN1SixNQUFELEVBQVMsSUFBVCxDQUFoQzs7QUFDQSxVQUFJUSxTQUFTLElBQUksQ0FBQUEsU0FBUyxTQUFULElBQUFBLFNBQVMsV0FBVCxZQUFBQSxTQUFTLENBQUVySixTQUFYLE1BQXlCLGFBQTFDLEVBQXlEO0FBQ3hELFlBQU15SCxZQUFZLEdBQUk0QixTQUFELENBQW1CQyxTQUFuQixJQUFpQ0QsU0FBRCxDQUFtQkUsU0FBeEU7QUFDQSxlQUFPcEosY0FBYyxDQUFDLENBQUNzSCxZQUFZLENBQUMrQixLQUFiLENBQW1CLElBQW5CLEVBQXlCLENBQXpCLENBQUQsQ0FBRCxFQUFnQ1gsTUFBaEMsQ0FBckI7QUFDQTtBQUNEOztBQUNELFdBQU9BLE1BQVA7QUFDQSxHQTlCTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHtcblx0QnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja0Jhc2UsXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxLFxuXHRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgeyBjb21waWxlQmluZGluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgVHJhY2VJbmZvIGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuXG5jb25zdCBMT0dHRVJfU0NPUEUgPSBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLkJ1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcbmxldCBpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXG50eXBlIFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPjtcblx0bWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24+O1xuXHRpc09wZW46IGJvb2xlYW47XG59O1xuXG50eXBlIElDYWxsYmFjayA9IHtcblx0Z2V0U2V0dGluZ3MoKTogYW55O1xuXHQvKipcblx0ICogVmlzaXRzIHRoZSBnaXZlbiBub2RlIGFuZCBlaXRoZXIgcHJvY2Vzc2VzIGEgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24sIGNhbGxzXG5cdCAqIGEgdmlzaXRvciwgb3Igc2ltcGx5IGNhbGxzIGJvdGgge0BsaW5rXG5cdCAqIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdEF0dHJpYnV0ZXMgdmlzaXRBdHRyaWJ1dGVzfVxuXHQgKiBhbmQge0BsaW5rIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdENoaWxkTm9kZXNcblx0ICogdmlzaXRDaGlsZE5vZGVzfS5cblx0ICpcblx0ICogQHBhcmFtIHtOb2RlfSBvTm9kZVxuXHQgKiAgIFRoZSBYTUwgRE9NIG5vZGVcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdmlzaXRpbmdcblx0ICogICBpcyBkb25lLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiB2aXNpdGluZyBmYWlsc1xuXHQgKiovXG5cdHZpc2l0Tm9kZShvTm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEluc2VydHMgdGhlIGZyYWdtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gcGxhY2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQuIExvYWRzIHRoZVxuXHQgKiBmcmFnbWVudCwgdGFrZXMgY2FyZSBvZiBjYWNoaW5nIChmb3IgdGhlIGN1cnJlbnQgcHJlLXByb2Nlc3NvciBydW4pIGFuZCB2aXNpdHMgdGhlXG5cdCAqIGZyYWdtZW50J3MgY29udGVudCBvbmNlIGl0IGhhcyBiZWVuIGltcG9ydGVkIGludG8gdGhlIGVsZW1lbnQncyBvd25lciBkb2N1bWVudCBhbmRcblx0ICogcHV0IGludG8gcGxhY2UuIExvYWRpbmcgb2YgZnJhZ21lbnRzIGlzIGFzeW5jaHJvbm91cyBpZiB0aGUgdGVtcGxhdGUgdmlldyBpc1xuXHQgKiBhc3luY2hyb25vdXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRnJhZ21lbnROYW1lXG5cdCAqICAgdGhlIGZyYWdtZW50J3MgcmVzb2x2ZWQgbmFtZVxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IG9FbGVtZW50XG5cdCAqICAgdGhlIFhNTCBET00gZWxlbWVudCwgZS5nLiA8c2FwLnVpLmNvcmU6RnJhZ21lbnQ+IG9yIDxjb3JlOkV4dGVuc2lvblBvaW50PlxuXHQgKiBAcGFyYW0ge3NhcC51aS5jb3JlLnV0aWwuX3dpdGh9IG9XaXRoQ29udHJvbFxuXHQgKiAgIHRoZSBwYXJlbnQncyBcIndpdGhcIiBjb250cm9sXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZX1cblx0ICogQSBzeW5jIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdGhlIGZyYWdtZW50XG5cdCAqICAgaGFzIGJlZW4gaW5zZXJ0ZWQsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIGxvYWRpbmcgb3IgdmlzaXRpbmdcblx0ICogICBmYWlscy5cblx0ICovXG5cdGluc2VydEZyYWdtZW50KHNGcmFnbWVudDogc3RyaW5nLCBvRWxlbWVudDogRWxlbWVudCwgb1dpdGg/OiBhbnkpOiBQcm9taXNlPHZvaWQ+O1xuXHR2aXNpdEF0dHJpYnV0ZShvTm9kZTogRWxlbWVudCwgb0F0dHJpYnV0ZTogQXR0cik6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0Q2hpbGROb2RlcyhvTm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBJbnRlcnByZXRzIHRoZSBnaXZlbiBYTUwgRE9NIGF0dHJpYnV0ZSB2YWx1ZSBhcyBhIGJpbmRpbmcgYW5kIHJldHVybnMgdGhlXG5cdCAqIHJlc3VsdGluZyB2YWx1ZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNWYWx1ZVxuXHQgKiAgIEFuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gW29FbGVtZW50XVxuXHQgKiAgIFRoZSBYTUwgRE9NIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiZWxvbmdzIHRvIChuZWVkZWQgb25seSBmb3Jcblx0ICogICB3YXJuaW5ncyB3aGljaCBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlKVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V8bnVsbH1cblx0ICogICBBIHRoZW5hYmxlIHdoaWNoIHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdGluZyB2YWx1ZSwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhXG5cdCAqICAgY29ycmVzcG9uZGluZyBlcnJvciAoZm9yIGV4YW1wbGUsIGFuIGVycm9yIHRocm93biBieSBhIGZvcm1hdHRlcikgb3Jcblx0ICogICA8Y29kZT5udWxsPC9jb2RlPiBpbiBjYXNlIHRoZSBiaW5kaW5nIGlzIG5vdCByZWFkeSAoYmVjYXVzZSBpdCByZWZlcnMgdG8gYVxuXHQgKiAgIG1vZGVsIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUpIChzaW5jZSAxLjU3LjApXG5cdCAqL1xuXHRnZXRSZXN1bHQoc1ZhbHVlOiBzdHJpbmcsIGVsZW1lbnQ/OiBFbGVtZW50KTogUHJvbWlzZTxhbnk+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aDogc3RyaW5nKTogQ29udGV4dDtcblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBtYXAgb2YgdmFyaWFibGVzIHdoaWNoXG5cdCAqIG92ZXJyaWRlIGN1cnJlbnRseSBrbm93biB2YXJpYWJsZXMgb2YgdGhlIHNhbWUgbmFtZSBpbiA8Y29kZT50aGlzPC9jb2RlPlxuXHQgKiBwYXJlbnQgaW50ZXJmYWNlIG9yIHJlcGxhY2UgdGhlbSBhbHRvZ2V0aGVyLiBFYWNoIHZhcmlhYmxlIG5hbWUgYmVjb21lcyBhXG5cdCAqIG5hbWVkIG1vZGVsIHdpdGggYSBjb3JyZXNwb25kaW5nIG9iamVjdCBiaW5kaW5nIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlXG5cdCAqIFhNTCB0ZW1wbGF0ZSBpbiB0aGUgdXN1YWwgd2F5LCB0aGF0IGlzLCB3aXRoIGEgYmluZGluZyBleHByZXNzaW9uIGxpa2Vcblx0ICogPGNvZGU+XCJ7dmFyPnNvbWUvcmVsYXRpdmUvcGF0aH1cIjwvY29kZT4gKHNlZSBleGFtcGxlKS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IFttVmFyaWFibGVzPXt9XVxuXHQgKiAgIE1hcCBmcm9tIHZhcmlhYmxlIG5hbWUgKHN0cmluZykgdG8gdmFsdWUgKHtAbGluayBzYXAudWkubW9kZWwuQ29udGV4dH0pXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JSZXBsYWNlXVxuXHQgKiAgIFdoZXRoZXIgb25seSB0aGUgZ2l2ZW4gdmFyaWFibGVzIGFyZSBrbm93biBpbiB0aGUgbmV3IGNhbGxiYWNrIGludGVyZmFjZVxuXHQgKiAgIGluc3RhbmNlLCBubyBpbmhlcml0ZWQgb25lc1xuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrfVxuXHQgKiAgIEEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBtVmFyaWFibGVzXG5cdCAqIEBwYXJhbSBiUmVwbGFjZVxuXHQgKi9cblx0XCJ3aXRoXCIobVZhcmlhYmxlcz86IGFueSwgYlJlcGxhY2U/OiBib29sZWFuKTogSUNhbGxiYWNrO1xufTtcblxuLyoqXG4gKiBUeXBlZ3VhcmQgZm9yIGNoZWNraW5nIGlmIGEgYnVpbGRpbmcgYmxvY2sgdXNlIEFQSSAxLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvblxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2luZyBBUEkgMS5cbiAqL1xuZnVuY3Rpb24gaXNWMU1hY3JvRGVmKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uIGlzIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjEge1xuXHRyZXR1cm4gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KFxuXHRzTmFtZTogc3RyaW5nLFxuXHRtQ29udGV4dHM6IGFueSxcblx0b0NvbnRleHRTZXR0aW5nczogQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdHNLZXk6IHN0cmluZ1xuKSB7XG5cdGNvbnN0IG9Db250ZXh0ID0gbUNvbnRleHRzW3NLZXldO1xuXHRjb25zdCBvQ29udGV4dE9iamVjdCA9IG9Db250ZXh0Py5nZXRPYmplY3QoKTtcblxuXHRpZiAob0NvbnRleHRTZXR0aW5ncy5yZXF1aXJlZCAmJiAoIW9Db250ZXh0IHx8IG9Db250ZXh0T2JqZWN0ID09PSBudWxsKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IFJlcXVpcmVkIG1ldGFkYXRhQ29udGV4dCAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0Ly8gSWYgY29udGV4dCBvYmplY3QgaGFzICRraW5kIHByb3BlcnR5LCAkVHlwZSBzaG91bGQgbm90IGJlIGNoZWNrZWRcblx0XHQvLyBUaGVyZWZvcmUgcmVtb3ZlIGZyb20gY29udGV4dCBzZXR0aW5nc1xuXHRcdGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRraW5kXCIpICYmIG9Db250ZXh0U2V0dGluZ3MuJGtpbmQpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSAka2luZCBpcyBwYXJ0IG9mIHRoZSBhbGxvd2VkIG9uZXNcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRraW5kLmluZGV4T2Yob0NvbnRleHRPYmplY3RbXCIka2luZFwiXSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICcka2luZCcgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRraW5kXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJGtpbmRcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSAmJiBvQ29udGV4dFNldHRpbmdzLiRUeXBlKSB7XG5cdFx0XHQvLyBDaGVjayBvbmx5ICRUeXBlXG5cdFx0XHRpZiAob0NvbnRleHRTZXR0aW5ncy4kVHlwZS5pbmRleE9mKG9Db250ZXh0T2JqZWN0W1wiJFR5cGVcIl0pID09PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJFR5cGUnICcke29Db250ZXh0U2V0dGluZ3NbXCIkVHlwZVwiXX0nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRUeXBlXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNOYW1lOiBhbnksIG9NZXRhZGF0YTogYW55LCBtQ29udGV4dHM6IGFueSwgb05vZGU6IGFueSkge1xuXHRjb25zdCBhTWV0YWRhdGFDb250ZXh0S2V5cyA9IChvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykpIHx8IFtdLFxuXHRcdGFQcm9wZXJ0aWVzID0gKG9NZXRhZGF0YS5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKSkgfHwgW10sXG5cdFx0b0F0dHJpYnV0ZU5hbWVzOiBhbnkgPSB7fTtcblxuXHQvLyBjb2xsZWN0IGFsbCBhdHRyaWJ1dGVzIHRvIGZpbmQgdW5jaGVja2VkIHByb3BlcnRpZXNcblx0T2JqZWN0LmtleXMob05vZGUuYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoaUtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc0tleSA9IG9Ob2RlLmF0dHJpYnV0ZXNbaUtleV0ubmFtZTtcblx0XHRvQXR0cmlidXRlTmFtZXNbc0tleV0gPSB0cnVlO1xuXHR9KTtcblxuXHQvL0NoZWNrIG1ldGFkYXRhQ29udGV4dHNcblx0YU1ldGFkYXRhQ29udGV4dEtleXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRleHRTZXR0aW5ncyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NLZXldO1xuXG5cdFx0dmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChzTmFtZSwgbUNvbnRleHRzLCBvQ29udGV4dFNldHRpbmdzLCBzS2V5KTtcblx0XHRkZWxldGUgb0F0dHJpYnV0ZU5hbWVzW3NLZXldO1xuXHR9KTtcblx0Ly9DaGVjayBwcm9wZXJ0aWVzXG5cdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdGNvbnN0IG9Qcm9wZXJ0eVNldHRpbmdzID0gb01ldGFkYXRhLnByb3BlcnRpZXNbc0tleV07XG5cdFx0aWYgKCFvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleSkpIHtcblx0XHRcdGlmIChvUHJvcGVydHlTZXR0aW5ncy5yZXF1aXJlZCAmJiAhb1Byb3BlcnR5U2V0dGluZ3MuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHNOYW1lICsgXCI6IFwiICsgXCJSZXF1aXJlZCBwcm9wZXJ0eSAnXCIgKyBzS2V5ICsgXCInIGlzIG1pc3NpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIHN0YXJ0IHdpdGggdW5kZXJzY29yZSBcIl9cIiBvciBjb250YWluIGEgY29sb24gXCI6XCIgKGRpZmZlcmVudCBuYW1lc3BhY2UpLCBlLmcuIHhtbG5zOnRyYWNlLCB0cmFjZTptYWNyb0lELCB1bml0dGVzdDppZFxuXHRcdGlmIChzS2V5LmluZGV4T2YoXCI6XCIpIDwgMCAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9jayBhcmUgcHJvcGVybHkgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHBhcmFtIGlzT3BlbiBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyBvcGVuIG9yIG5vdFxuICogQHJldHVybnMgQSBzZXQgb2YgY29tcGxldGVkIG1ldGFkYXRhIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSwgaXNPcGVuID0gZmFsc2UpOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEpIHtcblx0XHRjb25zdCBvUHJvcGVydGllczogYW55ID0ge307XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge1xuXHRcdFx0XCJkZXBlbmRlbnRzXCI6IHtcblx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdH0sXG5cdFx0XHRcImN1c3RvbURhdGFcIjoge1xuXHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge307XG5cblx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0udHlwZSAhPT0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0c1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIE1lcmdlIGV2ZW50cyBpbnRvIHByb3BlcnRpZXMgYXMgdGhleSBhcmUgaGFuZGxlZCBpZGVudGljYWxseVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzRXZlbnROYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b1Byb3BlcnRpZXNbc0V2ZW50TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzW3NFdmVudE5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHByb3BlcnRpZXM6IG9Qcm9wZXJ0aWVzLFxuXHRcdFx0YWdncmVnYXRpb25zOiBvQWdncmVnYXRpb25zLFxuXHRcdFx0bWV0YWRhdGFDb250ZXh0czogb01ldGFkYXRhQ29udGV4dHMsXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7XG5cdFx0XHRcdFwiZGVwZW5kZW50c1wiOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBhbnksXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRiRG9Ob3RSZXNvbHZlOiBib29sZWFuLFxuXHRpc09wZW46IGJvb2xlYW5cbikge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDtcblx0aWYgKCFiRG9Ob3RSZXNvbHZlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRjb25zdCBzQXR0cmlidXRlVmFsdWUgPSBvTm9kZS5nZXRBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpIGFzIHN0cmluZztcblx0XHRsZXQgc01ldGFQYXRoO1xuXHRcdC8vIG9WaXNpdG9yLmdldFJlc3VsdChzQXR0cmlidXRlVmFsdWUsIG9Ob2RlKTtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0aWYgKCFvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRpZiAoc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCJ1aWQtLVwiKSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IG15U3RvcmVbc0F0dHJpYnV0ZVZhbHVlXTtcblx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gXCIvXCIgKyBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQ29udGV4dFBhdGgsIG9EYXRhKTtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJjb252ZXJ0ZXJDb250ZXh0XCIsXG5cdFx0XHRcdFx0cGF0aDogc0NvbnRleHRQYXRoXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2UgaWYgKChzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGgpIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdFx0XHRwYXRoOiBzTWV0YVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXRcblx0XHRcdFx0XHRcdD8gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQuZ2V0UGF0aChzQXR0cmlidXRlVmFsdWUpXG5cdFx0XHRcdFx0XHQ6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9TZXR0aW5nczogYW55LFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogYW55LFxuXHRvTWV0YWRhdGFDb250ZXh0czogYW55XG4pIHtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0OiBhbnkgPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uUHJvcGVydGllcyk7XG5cdGxldCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRmb3IgKGxldCBqID0gMDsgaiA8IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMubGVuZ3RoOyBqKyspIHtcblx0XHRjb25zdCBzS2V5VmFsdWUgPSBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzW2pdO1xuXHRcdGlmIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0ge307IC8vIFRvIGF2b2lkIHZhbGVzIGJlaW5nIHJldXNlZCBhY2Nyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgIW9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0Y29uc3QgdlZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IHZWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gU29ydCBrZXlzIHRvIGJlIHN1cmUgY29udGV4dFBhdGggaXMgYmVmb3JlIG1ldGFQYXRoICggeWVzIEknbSBkZXNwZXJhdGUgKVxuXHRhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNvcnQoZnVuY3Rpb24gKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuXHR9KTtcblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdGNvbnN0IGJEb05vdFJlc29sdmUgPSBpc1B1YmxpYyAmJiAhb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKTtcblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0ID0gX2dldE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIG9Ob2RlLCBzQXR0cmlidXRlTmFtZSwgb1Zpc2l0b3IsIGJEb05vdFJlc29sdmUsIG9NZXRhZGF0YS5pc09wZW4pO1xuXHRcdGlmIChvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0Lm5hbWUgPSBzQXR0cmlidXRlTmFtZTtcblx0XHRcdGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzLCBvVmlzaXRvciwgb01ldGFkYXRhQ29udGV4dCwgb01ldGFkYXRhQ29udGV4dHMpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgJiYgIW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpKSB8fFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIiAmJiAhb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgbU1pc3NpbmdDb250ZXh0LCBwcm9wZXJ0eVZhbHVlczogcHJvcGVydHlWYWx1ZXMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0b01ldGFkYXRhOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge307XG5cdGlmIChvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdC8vIElmIHRoZXJlIGFyZSBhZ2dyZWdhdGlvbiB3ZSBuZWVkIHRvIHZpc2l0IHRoZSBjaGlsZE5vZGVzIGZpcnN0IGFuZCBmb3JlbW9zdFxuXHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Q2hpbGROb2RlcyhvTm9kZSk7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5kZXhPZihzQ2hpbGROYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NDaGlsZE5hbWVdLmlzUHVibGljKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnNbb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZV0gPSBvRmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHR9IGVsc2UgaWYgKE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKS5pbmRleE9mKHNDaGlsZE5hbWUpICE9PSAtMSkge1xuXHRcdFx0XHQvLyBPYmplY3QgVHlwZSBwcm9wZXJ0aWVzXG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NDaGlsZE5hbWVdID0ge307XG5cdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlSW5kZXggb2YgT2JqZWN0LmtleXMob0ZpcnN0RWxlbWVudENoaWxkLmF0dHJpYnV0ZXMpKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0NoaWxkTmFtZV1bb0ZpcnN0RWxlbWVudENoaWxkLmF0dHJpYnV0ZXNbYXR0cmlidXRlSW5kZXggYXMgYW55XS5sb2NhbE5hbWVdID1cblx0XHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0udmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9BZ2dyZWdhdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCdWlsZGluZ0Jsb2NrKFxuXHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRpc1B1YmxpYyA9IGZhbHNlXG4pIHtcblx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmZyYWdtZW50IHx8IGAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5uYW1lfWA7XG5cblx0Y29uc3Qgc05hbWUgPSBcInRoaXNcIjtcblxuXHRjb25zdCBtQ29udGV4dHM6IGFueSA9IHt9O1xuXHRjb25zdCBvTWV0YWRhdGFDb250ZXh0czogYW55ID0ge307XG5cdGNvbnN0IG9TZXR0aW5ncyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cdC8vIFRPRE8gMDAwMSBNb3ZlIHRoaXMgZWxzZXdoZXJlIHRoaXMgaXMgd2VpcmQgOilcblx0aWYgKG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXSkge1xuXHRcdG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXVxuXHRcdFx0LmdldFJlc291cmNlQnVuZGxlKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRSZXNvdXJjZU1vZGVsLnNldEFwcGxpY2F0aW9uSTE4bkJ1bmRsZShvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01ldGFkYXRhID0gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm1ldGFkYXRhLCBidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5pc09wZW4pO1xuXG5cdC8vSW5qZWN0IHN0b3JhZ2UgZm9yIG1hY3Jvc1xuXHRpZiAoIW9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSkge1xuXHRcdG9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSA9IHt9O1xuXHR9XG5cblx0Ly8gRmlyc3Qgb2YgYWxsIHdlIG5lZWQgdG8gdmlzaXQgdGhlIGF0dHJpYnV0ZXNcblx0Y29uc3QgeyBtTWlzc2luZ0NvbnRleHQsIHByb3BlcnR5VmFsdWVzIH0gPSBhd2FpdCBwcm9jZXNzUHJvcGVydGllcyhcblx0XHRvTWV0YWRhdGEsXG5cdFx0b1NldHRpbmdzLFxuXHRcdG9Ob2RlLFxuXHRcdGlzUHVibGljLFxuXHRcdG9WaXNpdG9yLFxuXHRcdG1Db250ZXh0cyxcblx0XHRvTWV0YWRhdGFDb250ZXh0c1xuXHQpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKG9Ob2RlLCBvVmlzaXRvciwgb01ldGFkYXRhLCBpc1B1YmxpYywgcHJvcGVydHlWYWx1ZXMpO1xuXHRcdGxldCBvSW5zdGFuY2U6IGFueTtcblx0XHRsZXQgb0NvbnRyb2xDb25maWcgPSB7fTtcblxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhKSB7XG5cdFx0XHQvLyBPbmx5IHVzZWQgaW4gdGhlIEZpZWxkIG1hY3JvIGFuZCBldmVuIHRoZW4gbWF5YmUgbm90IHJlYWxseSB1c2VmdWxcblx0XHRcdG9Db250cm9sQ29uZmlnID0gb1NldHRpbmdzLm1vZGVscy52aWV3RGF0YS5nZXRQcm9wZXJ0eShcIi9jb250cm9sQ29uZmlndXJhdGlvblwiKTtcblx0XHR9XG5cdFx0bGV0IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7XG5cdFx0aWYgKGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uY3JlYXRlKSB7XG5cdFx0XHRwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmNyZWF0ZS5jYWxsKFxuXHRcdFx0XHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbixcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRcdG9Db250cm9sQ29uZmlnLFxuXHRcdFx0XHRvU2V0dGluZ3MsXG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRcdGlzUHVibGljXG5cdFx0XHQpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNNZXRhZGF0YU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc01ldGFkYXRhTmFtZV0uY29tcHV0ZWQpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc01ldGFkYXRhTmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzTWV0YWRhdGFOYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRPYmplY3Qua2V5cyhtTWlzc2luZ0NvbnRleHQpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzQ29udGV4dE5hbWVdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9EYXRhICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBKFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhwcm9wZXJ0eVZhbHVlcyAvKiwgb0NvbnRyb2xDb25maWcsIG9TZXR0aW5ncywgb0FnZ3JlZ2F0aW9ucywgaXNQdWJsaWMqLyk7XG5cdFx0fVxuXHRcdGNvbnN0IG9BdHRyaWJ1dGVzTW9kZWw6IEpTT05Nb2RlbCA9IG5ldyBBdHRyaWJ1dGVNb2RlbChvTm9kZSwgcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMsIGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uKTtcblx0XHRtQ29udGV4dHNbc05hbWVdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cblx0XHRsZXQgb1ByZXZpb3VzTWFjcm9JbmZvOiBhbnk7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvKSB7XG5cdFx0XHRcdG9QcmV2aW91c01hY3JvSW5mbyA9IG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvVHJhY2VJbmZvLm1hY3JvSW5mbztcblx0XHRcdH1cblx0XHR9XG5cdFx0dmFsaWRhdGVNYWNyb1NpZ25hdHVyZShzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHRWaXNpdG9yID0gb1Zpc2l0b3Iud2l0aChcblx0XHRcdG1Db250ZXh0cyxcblx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIWJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiA6IHRydWVcblx0XHQpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvTm9kZSk7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0KGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUpIHx8XG5cdFx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDJcblx0XHRcdCkge1xuXHRcdFx0XHRsZXQgb1RlbXBsYXRlO1xuXHRcdFx0XHRsZXQgYWRkRGVmYXVsdE5hbWVzcGFjZSA9IGZhbHNlO1xuXHRcdFx0XHRpZiAoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpO1xuXHRcdFx0XHRcdGFkZERlZmF1bHROYW1lc3BhY2UgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKG9UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGlmICghb1RlbXBsYXRlLmZpcnN0RWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvVGVtcGxhdGUsIGFkZERlZmF1bHROYW1lc3BhY2UpO1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG9UZW1wbGF0ZSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9UZW1wbGF0ZS5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZSBhbmQgaWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZT8uZ2V0VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ/IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdFx0XHRcdFx0OiAoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24gYXMgYW55KS5nZXRUZW1wbGF0ZShwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyk7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9UZW1wbGF0ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZS5vdXRlckhUTUxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlKTtcblx0XHRcdFx0XHRvTm9kZSA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLnZpc2l0Tm9kZShvTm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b05vZGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IuaW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50TmFtZSwgb05vZGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG9NYWNyb0VsZW1lbnQgPSBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XTtcblxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0T2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uRWxlbWVudCA9IG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQgIT09IG51bGwgJiYgb01hY3JvRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob01hY3JvRWxlbWVudC5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0bGV0IG9FbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb05leHRDaGlsZCA9IG9FbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0XHRvTmV3Q2hpbGQuYXBwZW5kQ2hpbGQob0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiY3VzdG9tRGF0YVwiICYmIHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiZGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHRcdFx0KG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gJiYgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5zbG90KSB8fFxuXHRcdFx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb01hY3JvRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwic2xvdFtuYW1lPSdcIiArIHNTbG90TmFtZSArIFwiJ11cIikgYXMgRWxlbWVudDtcblx0XHRcdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyBhbnkpKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b01hY3JvRWxlbWVudC5hcHBlbmRDaGlsZChvTmV3Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01hY3JvRWxlbWVudCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRvU2xvdEVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob1ByZXZpb3VzTWFjcm9JbmZvKSB7XG5cdFx0XHQvL3Jlc3RvcmUgbWFjcm8gaW5mbyBpZiBhdmFpbGFibGVcblx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvUHJldmlvdXNNYWNyb0luZm87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdO1xuXHRcdH1cblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgYSBnZW5lcmljIGVycm9yICh1c3VhbGx5IGNvZGUgZXJyb3IpLCB3ZSByZXRyaWV2ZSB0aGUgY3VycmVudCBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYSBkZWRpY2F0ZWQgZXJyb3IgbWVzc2FnZVxuXHRcdGNvbnN0IHRyYWNlRGV0YWlscyA9IHtcblx0XHRcdGluaXRpYWxQcm9wZXJ0aWVzOiB7fSBhcyBhbnksXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIGFueSxcblx0XHRcdG1pc3NpbmdDb250ZXh0czogbU1pc3NpbmdDb250ZXh0XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBpbml0aWFsS2V5cykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlLmlzQSAmJiBwcm9wZXJ0eVZhbHVlLmlzQShcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5VmFsdWUuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmICghaW5pdGlhbEtleXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlLmlzQSAmJiBwcm9wZXJ0eVZhbHVlLmlzQShcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBlcnJvckFueSA9IGUgYXMgYW55O1xuXHRcdExvZy5lcnJvcihlcnJvckFueSwgZXJyb3JBbnkpO1xuXHRcdGNvbnN0IG9FcnJvciA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0W2BFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7YnVpbGRpbmdCTG9ja0RlZmluaXRpb24ubmFtZX1gLCBlcnJvckFueS5zdGFja10sXG5cdFx0XHRvTm9kZS5vdXRlckhUTUwsXG5cdFx0XHR0cmFjZURldGFpbHNcblx0XHQpO1xuXHRcdGNvbnN0IG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9FcnJvciwgdHJ1ZSk7XG5cdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlIGFzIGFueSk7XG5cdH1cbn1cbmZ1bmN0aW9uIGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzOiBhbnksIG9WaXNpdG9yOiBhbnksIG9DdHg6IGFueSwgb01ldGFkYXRhQ29udGV4dHM6IGFueSkge1xuXHRjb25zdCBzS2V5ID0gb0N0eC5uYW1lIHx8IG9DdHgubW9kZWwgfHwgdW5kZWZpbmVkO1xuXG5cdGlmIChvTWV0YWRhdGFDb250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPSBudWxsKSB7XG5cdFx0XHRzQ29udGV4dFBhdGggPSBvQ3R4Lm1vZGVsICsgXCI+XCIgKyBzQ29udGV4dFBhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IG1TZXR0aW5nID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblx0XHRpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsXSAmJiBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0pIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblxuXHRcdG9NZXRhZGF0YUNvbnRleHRzW3NLZXldID0gbUNvbnRleHRzW3NLZXldOyAvLyBtYWtlIGl0IGF2YWlsYWJsZSBpbnNpZGUgbWV0YWRhdGFDb250ZXh0cyBKU09OIG9iamVjdFxuXHR9IGNhdGNoIChleCkge1xuXHRcdC8vY29uc29sZS5lcnJvcihleCk7XG5cdFx0Ly8gaWdub3JlIHRoZSBjb250ZXh0IGFzIHRoaXMgY2FuIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhlIG1vZGVsIGlzIG5vdCByZWFkeSwgaS5lLiBub3QgYSBwcmVwcm9jZXNzaW5nIG1vZGVsIGJ1dCBtYXliZSBhIG1vZGVsIGZvclxuXHRcdC8vIHByb3ZpZGluZyBhZnRlcndhcmRzXG5cdFx0Ly8gVE9ETyAwMDAyIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblx0XHQvL21Db250ZXh0c1tcIl8kZXJyb3JcIl0ub01vZGVsLnNldFByb3BlcnR5KFwiL1wiICsgc0tleSwgZXgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IHZvaWQge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdCk7XG5cdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0KG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSUNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiwgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFcnJvclhNTChlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSwgeG1sRnJhZ21lbnQ6IHN0cmluZywgYWRkaXRpb25hbERhdGE/OiBvYmplY3QpOiBzdHJpbmcge1xuXHRjb25zdCBlcnJvckxhYmVscyA9IGVycm9yTWVzc2FnZXMubWFwKChlcnJvck1lc3NhZ2UpID0+IHhtbGA8bTpMYWJlbCB0ZXh0PVwiJHtlc2NhcGVYTUwoZXJyb3JNZXNzYWdlKX1cIi8+YCk7XG5cdGxldCBhZGRpdGlvbmFsVGV4dCA9IFwiXCI7XG5cdGlmIChhZGRpdGlvbmFsRGF0YSkge1xuXHRcdGFkZGl0aW9uYWxUZXh0ID0geG1sYDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiVHJhY2UgSW5mb1wiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cImpzb25cIiB2YWx1ZT1cIiR7ZXNjYXBlWE1MKEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxEYXRhLCBudWxsLCA0KSl9XCIgaGVpZ2h0PVwiMzAwcHhcIiB3aWR0aD1cIjEwMHZoXCIvPlxuXHRcdFx0XHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiPlxuXHRcdFx0XHQke2Vycm9yTGFiZWxzfVxuXHRcdFx0XHQ8bTpIQm94PlxuXHRcdFx0XHRcdDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiSG93IHRoZSBidWlsZGluZyBibG9jayB3YXMgY2FsbGVkXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2VzY2FwZVhNTCh4bWxGcmFnbWVudCl9XCIgaGVpZ2h0PVwiMzAwcHhcIiB3aWR0aD1cIjEwMHZoXCIvPlxuXHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdCR7YWRkaXRpb25hbFRleHR9XG5cdFx0XHRcdDwvbTpIQm94PlxuXHRcdFx0PC9tOlZCb3g+YDtcbn1cblxuY29uc3QgbXlTdG9yZTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuZnVuY3Rpb24gc3RvcmVWYWx1ZSh2YWx1ZXM6IGFueSkge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGB1aWQtLSR7dWlkKCl9YDtcblx0bXlTdG9yZVtwcm9wZXJ0eVVJRF0gPSB2YWx1ZXM7XG5cdHJldHVybiBwcm9wZXJ0eVVJRDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBYTUwgc3RyaW5nIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHhtbFN0cmluZyBUaGUgeG1sIHN0cmluZ1xuICogQHBhcmFtIGFkZERlZmF1bHROYW1lc3BhY2VzIFdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBhZGQgZGVmYXVsdCBuYW1lc3BhY2VcbiAqIEByZXR1cm5zIFRoZSBYTUwgZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlWE1MU3RyaW5nKHhtbFN0cmluZzogc3RyaW5nLCBhZGREZWZhdWx0TmFtZXNwYWNlcyA9IGZhbHNlKTogRWxlbWVudCB7XG5cdGlmIChhZGREZWZhdWx0TmFtZXNwYWNlcykge1xuXHRcdHhtbFN0cmluZyA9IGA8dGVtcGxhdGVcblx0XHRcdFx0XHRcdHhtbG5zOnRlbXBsYXRlPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLnRlbXBsYXRlLzFcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bT1cInNhcC5tXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczpjdXN0b21EYXRhPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiPiR7eG1sU3RyaW5nfTwvdGVtcGxhdGU+YDtcblx0fVxuXHRjb25zdCB4bWxEb2N1bWVudCA9IERPTVBhcnNlckluc3RhbmNlLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG5cdGxldCBvdXRwdXQgPSB4bWxEb2N1bWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0d2hpbGUgKG91dHB1dD8ubG9jYWxOYW1lID09PSBcInRlbXBsYXRlXCIpIHtcblx0XHRvdXRwdXQgPSBvdXRwdXQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdH1cblx0cmV0dXJuIG91dHB1dCBhcyBFbGVtZW50O1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgc3RyaW5nIHRvIGluY2x1ZGUgaXQgaW4gYW4gWE1MIGZyYWdtZW50LlxuICpcbiAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBlc2NhcGVcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlWE1MKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHN0clxuXHRcdC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcblx0XHQucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcblx0XHQucmVwbGFjZSgvXFxuL2csIFwiJiMxMDtcIilcblx0XHQucmVwbGFjZSgvXFx7L2csIFwiXFxcXHtcIilcblx0XHQucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcblx0XHQucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcblx0XHQucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiB2YWwucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbCB3aGlsZSBoYW5kbGluZyBzcGVjaWFsIG9iamVjdCBjYXNlLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIFRoZSBzdHJpbmcgcGFydHMgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJucyBUaGUgWE1MIHN0cmluZyBkb2N1bWVudCByZXByZXNlbnRpbmcgdGhlIHN0cmluZyB0aGF0IHdhcyB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgeG1sID0gKHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi52YWx1ZXM6IGFueVtdKSA9PiB7XG5cdGxldCBvdXRTdHIgPSBcIlwiO1xuXHRsZXQgaTtcblx0Zm9yIChpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiAoZGV0ZXJtaW5lZCBieSBfdHlwZSkgdGhlbiB3ZSBjb21waWxlIGl0LlxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlc1tpXSkpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZXNbaV0uZmxhdCg1KS5qb2luKFwiXCIpLnRyaW0oKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlc1tpXT8uX3R5cGUpIHtcblx0XHRcdGNvbnN0IGNvbXBpbGVkRXhwcmVzc2lvbiA9IGNvbXBpbGVCaW5kaW5nKHZhbHVlc1tpXSk7XG5cdFx0XHRvdXRTdHIgKz0gY29tcGlsZWRFeHByZXNzaW9uICE9PSB1bmRlZmluZWQgPyBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShjb21waWxlZEV4cHJlc3Npb24pIDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAodmFsdWVzW2ldPy5nZXRUZW1wbGF0ZSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXS5nZXRUZW1wbGF0ZSgpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlc1tpXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlVSWQgPSBzdG9yZVZhbHVlKHZhbHVlc1tpXSk7XG5cdFx0XHRvdXRTdHIgKz0gYCR7cHJvcGVydHlVSWR9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChpc1RyYWNlTW9kZSkge1xuXHRcdGNvbnN0IHhtbFJlc3VsdCA9IHBhcnNlWE1MU3RyaW5nKG91dFN0ciwgdHJ1ZSk7XG5cdFx0aWYgKHhtbFJlc3VsdCAmJiB4bWxSZXN1bHQ/LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0IGFzIGFueSkuaW5uZXJUZXh0IHx8ICh4bWxSZXN1bHQgYXMgYW55KS5pbm5lckhUTUw7XG5cdFx0XHRyZXR1cm4gY3JlYXRlRXJyb3JYTUwoW2Vycm9yTWVzc2FnZS5zcGxpdChcIlxcblwiKVswXV0sIG91dFN0cik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRTdHI7XG59O1xuIl19
|
|
1310
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sIm5hbWVzIjpbInRhcmdldCIsImJvZHkiLCJjaGVjayIsIml0ZXJhdG9yIiwic3RlcCIsInBhY3QiLCJyZWplY3QiLCJfY3ljbGUiLCJyZXN1bHQiLCJuZXh0IiwiZG9uZSIsInZhbHVlIiwidGhlbiIsInYiLCJiaW5kIiwiZSIsInJldHVybiIsIl9maXh1cCIsIlR5cGVFcnJvciIsInZhbHVlcyIsImkiLCJsZW5ndGgiLCJwdXNoIiwiYXJyYXkiLCJTeW1ib2wiLCJzdGF0ZSIsInMiLCJvIiwib2JzZXJ2ZXIiLCJwcm90b3R5cGUiLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJjYWxsYmFjayIsIl90aGlzIiwidGhlbmFibGUiLCJ0ZXN0IiwidXBkYXRlIiwic3RhZ2UiLCJzaG91bGRDb250aW51ZSIsInVwZGF0ZVZhbHVlIiwiX3Jlc3VtZUFmdGVyVGVzdCIsIl9yZXN1bWVBZnRlckJvZHkiLCJfcmVzdW1lQWZ0ZXJVcGRhdGUiLCJyZWNvdmVyIiwicHJvY2Vzc0J1aWxkaW5nQmxvY2siLCJidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiIsIm9Ob2RlIiwib1Zpc2l0b3IiLCJpc1B1YmxpYyIsInNGcmFnbWVudE5hbWUiLCJmcmFnbWVudCIsIm5hbWVzcGFjZSIsIm5hbWUiLCJzTmFtZSIsIm1Db250ZXh0cyIsIm9NZXRhZGF0YUNvbnRleHRzIiwib1NldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJtb2RlbHMiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIm9SZXNvdXJjZUJ1bmRsZSIsIlJlc291cmNlTW9kZWwiLCJzZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUiLCJjYXRjaCIsImVycm9yIiwiTG9nIiwib01ldGFkYXRhIiwicHJlcGFyZU1ldGFkYXRhIiwibWV0YWRhdGEiLCJpc09wZW4iLCJwcm9jZXNzUHJvcGVydGllcyIsImFwaVZlcnNpb24iLCJtTWlzc2luZ0NvbnRleHQiLCJwcm9wZXJ0eVZhbHVlcyIsImluaXRpYWxLZXlzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NDaGlsZHJlbiIsIm9BZ2dyZWdhdGlvbnMiLCJvUHJldmlvdXNNYWNyb0luZm8iLCJvSW5zdGFuY2UiLCJvQ29udHJvbENvbmZpZyIsInZpZXdEYXRhIiwiZ2V0UHJvcGVydHkiLCJwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyIsImlzVjFNYWNyb0RlZiIsImNyZWF0ZSIsImNhbGwiLCJtZXRhZGF0YUNvbnRleHRzIiwiZm9yRWFjaCIsInNNZXRhZGF0YU5hbWUiLCJjb21wdXRlZCIsInNDb250ZXh0TmFtZSIsImhhc093blByb3BlcnR5IiwicHJvcE5hbWUiLCJvRGF0YSIsImlzQSIsIlNBUF9VSV9NT0RFTF9DT05URVhUIiwiZ2V0TW9kZWwiLCJnZXRPYmplY3QiLCJCdWlsZGluZ0Jsb2NrQ2xhc3MiLCJnZXRQcm9wZXJ0aWVzIiwidGFyZ2V0T2JqZWN0Iiwic0F0dHJpYnV0ZVZhbHVlIiwic3RvcmVWYWx1ZSIsInNDb250ZXh0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJzZXRQcm9wZXJ0eSIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibXlTdG9yZSIsInVuZGVmaW5lZCIsIm9BdHRyaWJ1dGVzTW9kZWwiLCJBdHRyaWJ1dGVNb2RlbCIsIlRyYWNlSW5mbyIsImlzVHJhY2VJbmZvQWN0aXZlIiwib1RyYWNlSW5mbyIsInRyYWNlTWFjcm9DYWxscyIsIm1hY3JvSW5mbyIsInZhbGlkYXRlTWFjcm9TaWduYXR1cmUiLCJvQ29udGV4dFZpc2l0b3IiLCJ3aXRoIiwib1BhcmVudCIsInBhcmVudE5vZGUiLCJpQ2hpbGRJbmRleCIsIm9Qcm9taXNlIiwicHJvY2Vzc0N1c3RvbURhdGEiLCJBcnJheSIsImZyb20iLCJjaGlsZHJlbiIsImluZGV4T2YiLCJnZXRUZW1wbGF0ZSIsIm9UZW1wbGF0ZSIsImFkZERlZmF1bHROYW1lc3BhY2UiLCJpc1J1bnRpbWUiLCJteVN0b3JlS2V5IiwiaGFzRXJyb3IiLCJmaXJzdEVsZW1lbnRDaGlsZCIsInBhcnNlWE1MU3RyaW5nIiwiaXRlciIsImRvY3VtZW50IiwiY3JlYXRlTm9kZUl0ZXJhdG9yIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsInRleHRub2RlIiwibmV4dE5vZGUiLCJ0ZXh0Q29udGVudCIsInRyaW0iLCJsb2NhbE5hbWUiLCJpc1RyYWNlTW9kZSIsIm9FcnJvclRleHQiLCJjcmVhdGVFcnJvclhNTCIsIm91dGVySFRNTCIsInJlcGxhY2VXaXRoIiwicHJvY2Vzc1Nsb3RzIiwiYWdncmVnYXRpb25zIiwidmlzaXROb2RlIiwicmVtb3ZlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpbnNlcnRGcmFnbWVudCIsIm9NYWNyb0VsZW1lbnQiLCJvUmVtYWluaW5nU2xvdHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwib1Nsb3RFbGVtZW50IiwidHJhY2VEZXRhaWxzIiwiaW5pdGlhbFByb3BlcnRpZXMiLCJyZXNvbHZlZFByb3BlcnRpZXMiLCJtaXNzaW5nQ29udGV4dHMiLCJwcm9wZXJ0eU5hbWUiLCJwcm9wZXJ0eVZhbHVlIiwicGF0aCIsImdldFBhdGgiLCJpbmNsdWRlcyIsImVycm9yQW55Iiwib0Vycm9yIiwic3RhY2siLCJvRmlyc3RFbGVtZW50Q2hpbGQiLCJvTmV4dENoaWxkIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwic0NoaWxkTmFtZSIsInNBZ2dyZWdhdGlvbk5hbWUiLCJ0b1VwcGVyQ2FzZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiIsInNsb3QiLCJjaGlsZERlZmluaXRpb24iLCJvTmV3Q2hpbGQiLCJjcmVhdGVFbGVtZW50TlMiLCJuYW1lc3BhY2VVUkkiLCJnZXRBdHRyaWJ1dGUiLCJuZXh0Q2hpbGQiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUF0dHJpYnV0ZSIsInByb3BlcnRpZXMiLCJhdHRyaWJ1dGVzIiwiYXR0cmlidXRlSW5kZXgiLCJwYXJzZWRBZ2dyZWdhdGlvbiIsInBhcnNlQWdncmVnYXRpb24iLCJwYXJzZWRBZ2dyZWdhdGlvbktleSIsInZpc2l0Q2hpbGROb2RlcyIsImFEZWZpbml0aW9uQ29udGV4dHNLZXlzIiwic29ydCIsImEiLCJiIiwic0F0dHJpYnV0ZU5hbWUiLCJiRG9Ob3RSZXNvbHZlIiwib0RlZmluaXRpb25Db250ZXh0cyIsImhhc0F0dHJpYnV0ZSIsIm9NZXRhZGF0YUNvbnRleHQiLCJfZ2V0TWV0YWRhdGFDb250ZXh0IiwiYWRkU2luZ2xlQ29udGV4dCIsImJpbmRpbmdDb250ZXh0cyIsImN1cnJlbnRDb250ZXh0UGF0aCIsIm9EZWZpbml0aW9uUHJvcGVydGllcyIsImNvbnRleHRQYXRoIiwiYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyIsInNLZXlWYWx1ZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJ2aXNpdEF0dHJpYnV0ZSIsImdldE5hbWVkSXRlbSIsInZWYWx1ZSIsIkxPR0dFUl9TQ09QRSIsIkRPTVBhcnNlckluc3RhbmNlIiwiRE9NUGFyc2VyIiwidmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dCIsIm9Db250ZXh0U2V0dGluZ3MiLCJzS2V5Iiwib0NvbnRleHQiLCJvQ29udGV4dE9iamVjdCIsInJlcXVpcmVkIiwiRXJyb3IiLCIka2luZCIsIiRUeXBlIiwiYU1ldGFkYXRhQ29udGV4dEtleXMiLCJhUHJvcGVydGllcyIsIm9BdHRyaWJ1dGVOYW1lcyIsImlLZXkiLCJvUHJvcGVydHlTZXR0aW5ncyIsInN0YXJ0c1dpdGgiLCJ3YXJuaW5nIiwiU0FQX1VJX0NPUkVfRUxFTUVOVCIsImJ1aWxkaW5nQmxvY2tNZXRhZGF0YSIsIm9Qcm9wZXJ0aWVzIiwiZm91bmREZWZhdWx0QWdncmVnYXRpb24iLCJzUHJvcGVydHlOYW1lIiwiZXZlbnRzIiwic0V2ZW50TmFtZSIsImlzRGVmYXVsdCIsInNNZXRhUGF0aCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwibW9kZWwiLCJlbmRzV2l0aCIsImVudGl0eVNldCIsImdldENvbnRleHQiLCJvQWdncmVnYXRpb24iLCJvT3V0T2JqZWN0cyIsImNoaWxkSWR4IiwiY2hpbGRLZXkiLCJzZXRBdHRyaWJ1dGUiLCJrZXkiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsImFuY2hvciIsIm9NZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvRWxlbWVudENoaWxkIiwic1Nsb3ROYW1lIiwib1RhcmdldEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwib0N0eCIsIm1TZXR0aW5nIiwiZXgiLCJyZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJYTUxQcmVwcm9jZXNzb3IiLCJwbHVnSW4iLCJ4bWxUYWciLCJwdWJsaWNOYW1lc3BhY2UiLCJlcnJvck1lc3NhZ2VzIiwieG1sRnJhZ21lbnQiLCJhZGRpdGlvbmFsRGF0YSIsImVycm9yTGFiZWxzIiwibWFwIiwiZXJyb3JNZXNzYWdlIiwieG1sIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJhZGRpdGlvbmFsVGV4dCIsImVzY2FwZVhNTCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwcm9wZXJ0eVVJRCIsInVpZCIsInhtbFN0cmluZyIsImFkZERlZmF1bHROYW1lc3BhY2VzIiwieG1sRG9jdW1lbnQiLCJwYXJzZUZyb21TdHJpbmciLCJvdXRwdXQiLCJzdHIiLCJyZXBsYWNlIiwidmFsIiwic3RyaW5ncyIsIm91dFN0ciIsImlzQXJyYXkiLCJmbGF0Iiwiam9pbiIsIl90eXBlIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCIsInhtbFJlc3VsdCIsImlubmVyVGV4dCIsImlubmVySFRNTCIsInNwbGl0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBc0tPLGtCQUFnQkEsTUFBaEIsRUFBd0JDLElBQXhCLEVBQThCQyxLQUE5QixFQUFxQztBQUMzQyxRQUFJLE9BQU9GLE1BQU0saUJBQWIsS0FBbUMsVUFBdkMsRUFBbUQ7QUFDbEQsVUFBSUcsUUFBUSxHQUFHSCxNQUFNLGlCQUFOLEVBQWY7QUFBQSxVQUEwQ0ksSUFBMUM7QUFBQSxVQUFnREMsSUFBaEQ7QUFBQSxVQUFzREMsTUFBdEQ7O0FBQ0EsZUFBU0MsTUFBVCxDQUFnQkMsTUFBaEIsRUFBd0I7QUFDdkIsWUFBSTtBQUNILGlCQUFPLENBQUMsQ0FBQ0osSUFBSSxHQUFHRCxRQUFRLENBQUNNLElBQVQsRUFBUixFQUF5QkMsSUFBMUIsS0FBbUMsQ0FBQ1IsS0FBRCxJQUFVLENBQUNBLEtBQUssRUFBbkQsQ0FBUCxFQUErRDtBQUM5RE0sWUFBQUEsTUFBTSxHQUFHUCxJQUFJLENBQUNHLElBQUksQ0FBQ08sS0FBTixDQUFiOztBQUNBLGdCQUFJSCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0ksSUFBckIsRUFBMkI7QUFDMUIsa0JBQUksZUFBZUosTUFBZixDQUFKLEVBQTRCO0FBQzNCQSxnQkFBQUEsTUFBTSxHQUFHQSxNQUFNLENBQUNLLENBQWhCO0FBQ0EsZUFGRCxNQUVPO0FBQ05MLGdCQUFBQSxNQUFNLENBQUNJLElBQVAsQ0FBWUwsTUFBWixFQUFvQkQsTUFBTSxLQUFLQSxNQUFNLEdBQUcsUUFBUVEsSUFBUixDQUFhLElBQWIsRUFBbUJULElBQUksR0FBRyxXQUExQixFQUF1QyxDQUF2QyxDQUFkLENBQTFCO0FBQ0E7QUFDQTtBQUNEO0FBQ0Q7O0FBQ0QsY0FBSUEsSUFBSixFQUFVO0FBQ1Qsb0JBQVFBLElBQVIsRUFBYyxDQUFkLEVBQWlCRyxNQUFqQjtBQUNBLFdBRkQsTUFFTztBQUNOSCxZQUFBQSxJQUFJLEdBQUdHLE1BQVA7QUFDQTtBQUNELFNBakJELENBaUJFLE9BQU9PLENBQVAsRUFBVTtBQUNYLGtCQUFRVixJQUFJLEtBQUtBLElBQUksR0FBRyxXQUFaLENBQVosRUFBc0MsQ0FBdEMsRUFBeUNVLENBQXpDO0FBQ0E7QUFDRDs7QUFDRFIsTUFBQUEsTUFBTTs7QUFDTixVQUFJSixRQUFRLENBQUNhLE1BQWIsRUFBcUI7QUFDcEIsWUFBSUMsTUFBTSxHQUFHLFVBQVNOLEtBQVQsRUFBZ0I7QUFDNUIsY0FBSTtBQUNILGdCQUFJLENBQUNQLElBQUksQ0FBQ00sSUFBVixFQUFnQjtBQUNmUCxjQUFBQSxRQUFRLENBQUNhLE1BQVQ7QUFDQTtBQUNELFdBSkQsQ0FJRSxPQUFNRCxDQUFOLEVBQVMsQ0FDVjs7QUFDRCxpQkFBT0osS0FBUDtBQUNBLFNBUkQ7O0FBU0EsWUFBSU4sSUFBSSxJQUFJQSxJQUFJLENBQUNPLElBQWpCLEVBQXVCO0FBQ3RCLGlCQUFPUCxJQUFJLENBQUNPLElBQUwsQ0FBVUssTUFBVixFQUFrQixVQUFTRixDQUFULEVBQVk7QUFDcEMsa0JBQU1FLE1BQU0sQ0FBQ0YsQ0FBRCxDQUFaO0FBQ0EsV0FGTSxDQUFQO0FBR0E7O0FBQ0RFLFFBQUFBLE1BQU07QUFDTjs7QUFDRCxhQUFPWixJQUFQO0FBQ0EsS0E1QzBDLENBNkMzQzs7O0FBQUE7QUFDQSxRQUFJLEVBQUUsWUFBWUwsTUFBZCxDQUFKLEVBQTJCO0FBQzFCLFlBQU0sSUFBSWtCLFNBQUosQ0FBYyx3QkFBZCxDQUFOO0FBQ0EsS0FoRDBDLENBaUQzQzs7O0FBQUE7QUFDQSxRQUFJQyxNQUFNLEdBQUcsRUFBYjs7QUFDQSxTQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdwQixNQUFNLENBQUNxQixNQUEzQixFQUFtQ0QsQ0FBQyxFQUFwQyxFQUF3QztBQUN2Q0QsTUFBQUEsTUFBTSxDQUFDRyxJQUFQLENBQVl0QixNQUFNLENBQUNvQixDQUFELENBQWxCO0FBQ0E7O0FBQ0QsV0FBTyxPQUFPRCxNQUFQLEVBQWUsVUFBU0MsQ0FBVCxFQUFZO0FBQUUsYUFBT25CLElBQUksQ0FBQ2tCLE1BQU0sQ0FBQ0MsQ0FBRCxDQUFQLENBQVg7QUFBeUIsS0FBdEQsRUFBd0RsQixLQUF4RCxDQUFQO0FBQ0E7O0FBN0dNLGtCQUFnQnFCLEtBQWhCLEVBQXVCdEIsSUFBdkIsRUFBNkJDLEtBQTdCLEVBQW9DO0FBQzFDLFFBQUlrQixDQUFDLEdBQUcsQ0FBQyxDQUFUO0FBQUEsUUFBWWYsSUFBWjtBQUFBLFFBQWtCQyxNQUFsQjs7QUFDQSxhQUFTQyxNQUFULENBQWdCQyxNQUFoQixFQUF3QjtBQUN2QixVQUFJO0FBQ0gsZUFBTyxFQUFFWSxDQUFGLEdBQU1HLEtBQUssQ0FBQ0YsTUFBWixLQUF1QixDQUFDbkIsS0FBRCxJQUFVLENBQUNBLEtBQUssRUFBdkMsQ0FBUCxFQUFtRDtBQUNsRE0sVUFBQUEsTUFBTSxHQUFHUCxJQUFJLENBQUNtQixDQUFELENBQWI7O0FBQ0EsY0FBSVosTUFBTSxJQUFJQSxNQUFNLENBQUNJLElBQXJCLEVBQTJCO0FBQzFCLGdCQUFJLGVBQWVKLE1BQWYsQ0FBSixFQUE0QjtBQUMzQkEsY0FBQUEsTUFBTSxHQUFHQSxNQUFNLENBQUNLLENBQWhCO0FBQ0EsYUFGRCxNQUVPO0FBQ05MLGNBQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFZTCxNQUFaLEVBQW9CRCxNQUFNLEtBQUtBLE1BQU0sR0FBRyxRQUFRUSxJQUFSLENBQWEsSUFBYixFQUFtQlQsSUFBSSxHQUFHLFdBQTFCLEVBQXVDLENBQXZDLENBQWQsQ0FBMUI7QUFDQTtBQUNBO0FBQ0Q7QUFDRDs7QUFDRCxZQUFJQSxJQUFKLEVBQVU7QUFDVCxrQkFBUUEsSUFBUixFQUFjLENBQWQsRUFBaUJHLE1BQWpCO0FBQ0EsU0FGRCxNQUVPO0FBQ05ILFVBQUFBLElBQUksR0FBR0csTUFBUDtBQUNBO0FBQ0QsT0FqQkQsQ0FpQkUsT0FBT08sQ0FBUCxFQUFVO0FBQ1gsZ0JBQVFWLElBQUksS0FBS0EsSUFBSSxHQUFHLFdBQVosQ0FBWixFQUFzQyxDQUF0QyxFQUF5Q1UsQ0FBekM7QUFDQTtBQUNEOztBQUNEUixJQUFBQSxNQUFNOztBQUNOLFdBQU9GLElBQVA7QUFDQTs7QUF3Qk0sTUFBTSxrQkFBa0IsYUFBYyxPQUFPbUIsTUFBUCxLQUFrQixXQUFsQixHQUFpQ0EsTUFBTSxDQUFDckIsUUFBUCxLQUFvQnFCLE1BQU0sQ0FBQ3JCLFFBQVAsR0FBa0JxQixNQUFNLENBQUMsaUJBQUQsQ0FBNUMsQ0FBakMsR0FBcUcsWUFBM0k7Ozs7Ozs7Ozs7Ozs7OztBQTdIQSxtQkFBaUJuQixJQUFqQixFQUF1Qm9CLEtBQXZCLEVBQThCZCxLQUE5QixFQUFxQztBQUMzQyxRQUFJLENBQUNOLElBQUksQ0FBQ3FCLENBQVYsRUFBYTtBQUNaLFVBQUlmLEtBQUssaUJBQVQsRUFBNEI7QUFDM0IsWUFBSUEsS0FBSyxDQUFDZSxDQUFWLEVBQWE7QUFDWixjQUFJRCxLQUFLLEdBQUcsQ0FBWixFQUFlO0FBQ2RBLFlBQUFBLEtBQUssR0FBR2QsS0FBSyxDQUFDZSxDQUFkO0FBQ0E7O0FBQ0RmLFVBQUFBLEtBQUssR0FBR0EsS0FBSyxDQUFDRSxDQUFkO0FBQ0EsU0FMRCxNQUtPO0FBQ05GLFVBQUFBLEtBQUssQ0FBQ2dCLENBQU4sR0FBVSxRQUFRYixJQUFSLENBQWEsSUFBYixFQUFtQlQsSUFBbkIsRUFBeUJvQixLQUF6QixDQUFWO0FBQ0E7QUFDQTtBQUNEOztBQUNELFVBQUlkLEtBQUssSUFBSUEsS0FBSyxDQUFDQyxJQUFuQixFQUF5QjtBQUN4QkQsUUFBQUEsS0FBSyxDQUFDQyxJQUFOLENBQVcsUUFBUUUsSUFBUixDQUFhLElBQWIsRUFBbUJULElBQW5CLEVBQXlCb0IsS0FBekIsQ0FBWCxFQUE0QyxRQUFRWCxJQUFSLENBQWEsSUFBYixFQUFtQlQsSUFBbkIsRUFBeUIsQ0FBekIsQ0FBNUM7QUFDQTtBQUNBOztBQUNEQSxNQUFBQSxJQUFJLENBQUNxQixDQUFMLEdBQVNELEtBQVQ7QUFDQXBCLE1BQUFBLElBQUksQ0FBQ1EsQ0FBTCxHQUFTRixLQUFUO0FBQ0EsVUFBTWlCLFFBQVEsR0FBR3ZCLElBQUksQ0FBQ3NCLENBQXRCOztBQUNBLFVBQUlDLFFBQUosRUFBYztBQUNiQSxRQUFBQSxRQUFRLENBQUN2QixJQUFELENBQVI7QUFDQTtBQUNEO0FBQ0Q7O0FBOURNLE1BQU0sUUFBUSxhQUFjLFlBQVc7QUFDN0MscUJBQWlCLENBQUU7O0FBQ25CLFVBQU13QixTQUFOLENBQWdCakIsSUFBaEIsR0FBdUIsVUFBU2tCLFdBQVQsRUFBc0JDLFVBQXRCLEVBQWtDO0FBQ3hELFVBQU12QixNQUFNLEdBQUcsV0FBZjtBQUNBLFVBQU1pQixLQUFLLEdBQUcsS0FBS0MsQ0FBbkI7O0FBQ0EsVUFBSUQsS0FBSixFQUFXO0FBQ1YsWUFBTU8sUUFBUSxHQUFHUCxLQUFLLEdBQUcsQ0FBUixHQUFZSyxXQUFaLEdBQTBCQyxVQUEzQzs7QUFDQSxZQUFJQyxRQUFKLEVBQWM7QUFDYixjQUFJO0FBQ0gsb0JBQVF4QixNQUFSLEVBQWdCLENBQWhCLEVBQW1Cd0IsUUFBUSxDQUFDLEtBQUtuQixDQUFOLENBQTNCO0FBQ0EsV0FGRCxDQUVFLE9BQU9FLENBQVAsRUFBVTtBQUNYLG9CQUFRUCxNQUFSLEVBQWdCLENBQWhCLEVBQW1CTyxDQUFuQjtBQUNBOztBQUNELGlCQUFPUCxNQUFQO0FBQ0EsU0FQRCxNQU9PO0FBQ04saUJBQU8sSUFBUDtBQUNBO0FBQ0Q7O0FBQ0QsV0FBS21CLENBQUwsR0FBUyxVQUFTTSxLQUFULEVBQWdCO0FBQ3hCLFlBQUk7QUFDSCxjQUFNdEIsS0FBSyxHQUFHc0IsS0FBSyxDQUFDcEIsQ0FBcEI7O0FBQ0EsY0FBSW9CLEtBQUssQ0FBQ1AsQ0FBTixHQUFVLENBQWQsRUFBaUI7QUFDaEIsb0JBQVFsQixNQUFSLEVBQWdCLENBQWhCLEVBQW1Cc0IsV0FBVyxHQUFHQSxXQUFXLENBQUNuQixLQUFELENBQWQsR0FBd0JBLEtBQXREO0FBQ0EsV0FGRCxNQUVPLElBQUlvQixVQUFKLEVBQWdCO0FBQ3RCLG9CQUFRdkIsTUFBUixFQUFnQixDQUFoQixFQUFtQnVCLFVBQVUsQ0FBQ3BCLEtBQUQsQ0FBN0I7QUFDQSxXQUZNLE1BRUE7QUFDTixvQkFBUUgsTUFBUixFQUFnQixDQUFoQixFQUFtQkcsS0FBbkI7QUFDQTtBQUNELFNBVEQsQ0FTRSxPQUFPSSxDQUFQLEVBQVU7QUFDWCxrQkFBUVAsTUFBUixFQUFnQixDQUFoQixFQUFtQk8sQ0FBbkI7QUFDQTtBQUNELE9BYkQ7O0FBY0EsYUFBT1AsTUFBUDtBQUNBLEtBL0JEOztBQWdDQTtBQUNBLEdBbkNpQyxFQUEzQjs7QUFnRUEsMEJBQXdCMEIsUUFBeEIsRUFBa0M7QUFDeEMsV0FBT0EsUUFBUSxpQkFBUixJQUE2QkEsUUFBUSxDQUFDUixDQUFULEdBQWEsQ0FBakQ7QUFDQTs7QUE0TE0sZ0JBQWNTLElBQWQsRUFBb0JDLE1BQXBCLEVBQTRCbkMsSUFBNUIsRUFBa0M7QUFDeEMsUUFBSW9DLEtBQUo7O0FBQ0EsYUFBUztBQUNSLFVBQUlDLGNBQWMsR0FBR0gsSUFBSSxFQUF6Qjs7QUFDQSxVQUFJLGVBQWVHLGNBQWYsQ0FBSixFQUFvQztBQUNuQ0EsUUFBQUEsY0FBYyxHQUFHQSxjQUFjLENBQUN6QixDQUFoQztBQUNBOztBQUNELFVBQUksQ0FBQ3lCLGNBQUwsRUFBcUI7QUFDcEIsZUFBTzlCLE1BQVA7QUFDQTs7QUFDRCxVQUFJOEIsY0FBYyxDQUFDMUIsSUFBbkIsRUFBeUI7QUFDeEJ5QixRQUFBQSxLQUFLLEdBQUcsQ0FBUjtBQUNBO0FBQ0E7O0FBQ0QsVUFBSTdCLE1BQU0sR0FBR1AsSUFBSSxFQUFqQjs7QUFDQSxVQUFJTyxNQUFNLElBQUlBLE1BQU0sQ0FBQ0ksSUFBckIsRUFBMkI7QUFDMUIsWUFBSSxlQUFlSixNQUFmLENBQUosRUFBNEI7QUFDM0JBLFVBQUFBLE1BQU0sR0FBR0EsTUFBTSxDQUFDa0IsQ0FBaEI7QUFDQSxTQUZELE1BRU87QUFDTlcsVUFBQUEsS0FBSyxHQUFHLENBQVI7QUFDQTtBQUNBO0FBQ0Q7O0FBQ0QsVUFBSUQsTUFBSixFQUFZO0FBQ1gsWUFBSUcsV0FBVyxHQUFHSCxNQUFNLEVBQXhCOztBQUNBLFlBQUlHLFdBQVcsSUFBSUEsV0FBVyxDQUFDM0IsSUFBM0IsSUFBbUMsQ0FBQyxlQUFlMkIsV0FBZixDQUF4QyxFQUFxRTtBQUNwRUYsVUFBQUEsS0FBSyxHQUFHLENBQVI7QUFDQTtBQUNBO0FBQ0Q7QUFDRDs7QUFDRCxRQUFJaEMsSUFBSSxHQUFHLFdBQVg7O0FBQ0EsUUFBSUMsTUFBTSxHQUFHLFFBQVFRLElBQVIsQ0FBYSxJQUFiLEVBQW1CVCxJQUFuQixFQUF5QixDQUF6QixDQUFiOztBQUNBLEtBQUNnQyxLQUFLLEtBQUssQ0FBVixHQUFjQyxjQUFjLENBQUMxQixJQUFmLENBQW9CNEIsZ0JBQXBCLENBQWQsR0FBc0RILEtBQUssS0FBSyxDQUFWLEdBQWM3QixNQUFNLENBQUNJLElBQVAsQ0FBWTZCLGdCQUFaLENBQWQsR0FBOENGLFdBQVcsQ0FBQzNCLElBQVosQ0FBaUI4QixrQkFBakIsQ0FBckcsRUFBMkk5QixJQUEzSSxDQUFnSixLQUFLLENBQXJKLEVBQXdKTixNQUF4SjtBQUNBLFdBQU9ELElBQVA7O0FBQ0EsYUFBU29DLGdCQUFULENBQTBCOUIsS0FBMUIsRUFBaUM7QUFDaENILE1BQUFBLE1BQU0sR0FBR0csS0FBVDs7QUFDQSxTQUFHO0FBQ0YsWUFBSXlCLE1BQUosRUFBWTtBQUNYRyxVQUFBQSxXQUFXLEdBQUdILE1BQU0sRUFBcEI7O0FBQ0EsY0FBSUcsV0FBVyxJQUFJQSxXQUFXLENBQUMzQixJQUEzQixJQUFtQyxDQUFDLGVBQWUyQixXQUFmLENBQXhDLEVBQXFFO0FBQ3BFQSxZQUFBQSxXQUFXLENBQUMzQixJQUFaLENBQWlCOEIsa0JBQWpCLEVBQXFDOUIsSUFBckMsQ0FBMEMsS0FBSyxDQUEvQyxFQUFrRE4sTUFBbEQ7QUFDQTtBQUNBO0FBQ0Q7O0FBQ0RnQyxRQUFBQSxjQUFjLEdBQUdILElBQUksRUFBckI7O0FBQ0EsWUFBSSxDQUFDRyxjQUFELElBQW9CLGVBQWVBLGNBQWYsS0FBa0MsQ0FBQ0EsY0FBYyxDQUFDekIsQ0FBMUUsRUFBOEU7QUFDN0Usa0JBQVFSLElBQVIsRUFBYyxDQUFkLEVBQWlCRyxNQUFqQjs7QUFDQTtBQUNBOztBQUNELFlBQUk4QixjQUFjLENBQUMxQixJQUFuQixFQUF5QjtBQUN4QjBCLFVBQUFBLGNBQWMsQ0FBQzFCLElBQWYsQ0FBb0I0QixnQkFBcEIsRUFBc0M1QixJQUF0QyxDQUEyQyxLQUFLLENBQWhELEVBQW1ETixNQUFuRDtBQUNBO0FBQ0E7O0FBQ0RFLFFBQUFBLE1BQU0sR0FBR1AsSUFBSSxFQUFiOztBQUNBLFlBQUksZUFBZU8sTUFBZixDQUFKLEVBQTRCO0FBQzNCQSxVQUFBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0ssQ0FBaEI7QUFDQTtBQUNELE9BckJELFFBcUJTLENBQUNMLE1BQUQsSUFBVyxDQUFDQSxNQUFNLENBQUNJLElBckI1Qjs7QUFzQkFKLE1BQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFZNkIsZ0JBQVosRUFBOEI3QixJQUE5QixDQUFtQyxLQUFLLENBQXhDLEVBQTJDTixNQUEzQztBQUNBOztBQUNELGFBQVNrQyxnQkFBVCxDQUEwQkYsY0FBMUIsRUFBMEM7QUFDekMsVUFBSUEsY0FBSixFQUFvQjtBQUNuQjlCLFFBQUFBLE1BQU0sR0FBR1AsSUFBSSxFQUFiOztBQUNBLFlBQUlPLE1BQU0sSUFBSUEsTUFBTSxDQUFDSSxJQUFyQixFQUEyQjtBQUMxQkosVUFBQUEsTUFBTSxDQUFDSSxJQUFQLENBQVk2QixnQkFBWixFQUE4QjdCLElBQTlCLENBQW1DLEtBQUssQ0FBeEMsRUFBMkNOLE1BQTNDO0FBQ0EsU0FGRCxNQUVPO0FBQ05tQyxVQUFBQSxnQkFBZ0IsQ0FBQ2pDLE1BQUQsQ0FBaEI7QUFDQTtBQUNELE9BUEQsTUFPTztBQUNOLGdCQUFRSCxJQUFSLEVBQWMsQ0FBZCxFQUFpQkcsTUFBakI7QUFDQTtBQUNEOztBQUNELGFBQVNrQyxrQkFBVCxHQUE4QjtBQUM3QixVQUFJSixjQUFjLEdBQUdILElBQUksRUFBekIsRUFBNkI7QUFDNUIsWUFBSUcsY0FBYyxDQUFDMUIsSUFBbkIsRUFBeUI7QUFDeEIwQixVQUFBQSxjQUFjLENBQUMxQixJQUFmLENBQW9CNEIsZ0JBQXBCLEVBQXNDNUIsSUFBdEMsQ0FBMkMsS0FBSyxDQUFoRCxFQUFtRE4sTUFBbkQ7QUFDQSxTQUZELE1BRU87QUFDTmtDLFVBQUFBLGdCQUFnQixDQUFDRixjQUFELENBQWhCO0FBQ0E7QUFDRCxPQU5ELE1BTU87QUFDTixnQkFBUWpDLElBQVIsRUFBYyxDQUFkLEVBQWlCRyxNQUFqQjtBQUNBO0FBQ0Q7QUFDRDs7QUErTk0sa0JBQWdCUCxJQUFoQixFQUFzQjBDLE9BQXRCLEVBQStCO0FBQ3JDLFFBQUk7QUFDSCxVQUFJbkMsTUFBTSxHQUFHUCxJQUFJLEVBQWpCO0FBQ0EsS0FGRCxDQUVFLE9BQU1jLENBQU4sRUFBUztBQUNWLGFBQU80QixPQUFPLENBQUM1QixDQUFELENBQWQ7QUFDQTs7QUFDRCxRQUFJUCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0ksSUFBckIsRUFBMkI7QUFDMUIsYUFBT0osTUFBTSxDQUFDSSxJQUFQLENBQVksS0FBSyxDQUFqQixFQUFvQitCLE9BQXBCLENBQVA7QUFDQTs7QUFDRCxXQUFPbkMsTUFBUDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O01BbkNjb0Msb0IsYUFDZEMsdUIsRUFDQUMsSyxFQUNBQyxRO1FBQ0FDLFEsdUVBQVcsSzs7UUFDVjtBQUNELFVBQU1DLGFBQWEsR0FBR0osdUJBQXVCLENBQUNLLFFBQXhCLGNBQXVDTCx1QkFBdUIsQ0FBQ00sU0FBL0QsY0FBNEVOLHVCQUF1QixDQUFDTyxJQUFwRyxDQUF0QjtBQUVBLFVBQU1DLEtBQUssR0FBRyxNQUFkO0FBRUEsVUFBTUMsU0FBYyxHQUFHLEVBQXZCO0FBQ0EsVUFBTUMsaUJBQXNCLEdBQUcsRUFBL0I7QUFDQSxVQUFNQyxTQUFTLEdBQUdULFFBQVEsQ0FBQ1UsV0FBVCxFQUFsQixDQVBDLENBUUQ7O0FBQ0EsVUFBSUQsU0FBUyxDQUFDRSxNQUFWLENBQWlCLGFBQWpCLENBQUosRUFBcUM7QUFDcENGLFFBQUFBLFNBQVMsQ0FBQ0UsTUFBVixDQUFpQixhQUFqQixFQUNFQyxpQkFERixHQUVFL0MsSUFGRixDQUVPLFVBQVVnRCxlQUFWLEVBQWdDO0FBQ3JDQyxVQUFBQSxhQUFhLENBQUNDLHdCQUFkLENBQXVDRixlQUF2QztBQUNBLFNBSkYsRUFLRUcsS0FMRixDQUtRLFVBQVVDLEtBQVYsRUFBc0I7QUFDNUJDLFVBQUFBLEdBQUcsQ0FBQ0QsS0FBSixDQUFVQSxLQUFWO0FBQ0EsU0FQRjtBQVFBOztBQUNELFVBQU1FLFNBQVMsR0FBR0MsZUFBZSxDQUFDdEIsdUJBQXVCLENBQUN1QixRQUF6QixFQUFtQ3ZCLHVCQUF1QixDQUFDd0IsTUFBM0QsQ0FBakMsQ0FuQkMsQ0FxQkQ7O0FBQ0EsVUFBSSxDQUFDYixTQUFTLENBQUNQLGFBQUQsQ0FBZCxFQUErQjtBQUM5Qk8sUUFBQUEsU0FBUyxDQUFDUCxhQUFELENBQVQsR0FBMkIsRUFBM0I7QUFDQSxPQXhCQSxDQTBCRDs7O0FBMUJDLDZCQTJCaURxQixpQkFBaUIsQ0FDbEVKLFNBRGtFLEVBRWxFVixTQUZrRSxFQUdsRVYsS0FIa0UsRUFJbEVFLFFBSmtFLEVBS2xFRCxRQUxrRSxFQU1sRU8sU0FOa0UsRUFPbEVDLGlCQVBrRSxFQVFsRVYsdUJBQXVCLENBQUMwQixVQVIwQyxDQTNCbEU7QUFBQSxZQTJCT0MsZUEzQlAsUUEyQk9BLGVBM0JQO0FBQUEsWUEyQndCQyxjQTNCeEIsUUEyQndCQSxjQTNCeEI7QUFxQ0QsWUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWUgsY0FBWixDQUFwQjs7QUFyQ0MseUNBc0NHO0FBQ0g7QUFERyxpQ0FFeUJJLGVBQWUsQ0FDMUMvQixLQUQwQyxFQUUxQ0MsUUFGMEMsRUFHMUNtQixTQUgwQyxFQUkxQ2xCLFFBSjBDLEVBSzFDeUIsY0FMMEMsRUFNMUM1Qix1QkFBdUIsQ0FBQzBCLFVBTmtCLENBRnhDLGlCQUVHTyxhQUZIO0FBQUE7QUFBQSxrQkEwTENDLGtCQTFMRDtBQTJMRjtBQUNBdkIsZ0JBQUFBLFNBQVMsQ0FBQyxZQUFELENBQVQsR0FBMEJ1QixrQkFBMUI7QUE1TEU7QUE4TEYsdUJBQU92QixTQUFTLENBQUMsWUFBRCxDQUFoQjtBQTlMRTtBQUFBOztBQVVILGdCQUFJd0IsU0FBSjtBQUNBLGdCQUFJQyxjQUFjLEdBQUcsRUFBckI7O0FBRUEsZ0JBQUl6QixTQUFTLENBQUNFLE1BQVYsQ0FBaUJ3QixRQUFyQixFQUErQjtBQUM5QjtBQUNBRCxjQUFBQSxjQUFjLEdBQUd6QixTQUFTLENBQUNFLE1BQVYsQ0FBaUJ3QixRQUFqQixDQUEwQkMsV0FBMUIsQ0FBc0MsdUJBQXRDLENBQWpCO0FBQ0E7O0FBQ0QsZ0JBQUlDLHVCQUF1QixHQUFHWCxjQUE5Qjs7QUFDQSxnQkFBSVksWUFBWSxDQUFDeEMsdUJBQUQsQ0FBWixJQUF5Q0EsdUJBQXVCLENBQUN5QyxNQUFyRSxFQUE2RTtBQUM1RUYsY0FBQUEsdUJBQXVCLEdBQUd2Qyx1QkFBdUIsQ0FBQ3lDLE1BQXhCLENBQStCQyxJQUEvQixDQUN6QjFDLHVCQUR5QixFQUV6QjRCLGNBRnlCLEVBR3pCUSxjQUh5QixFQUl6QnpCLFNBSnlCLEVBS3pCc0IsYUFMeUIsRUFNekI5QixRQU55QixDQUExQjtBQVFBMkIsY0FBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlWLFNBQVMsQ0FBQ3NCLGdCQUF0QixFQUF3Q0MsT0FBeEMsQ0FBZ0QsVUFBVUMsYUFBVixFQUFpQztBQUNoRixvQkFBSXhCLFNBQVMsQ0FBQ3NCLGdCQUFWLENBQTJCRSxhQUEzQixFQUEwQ0MsUUFBOUMsRUFBd0Q7QUFDdkRyQyxrQkFBQUEsU0FBUyxDQUFDb0MsYUFBRCxDQUFULEdBQTJCTix1QkFBdUIsQ0FBQ00sYUFBRCxDQUFsRDtBQUNBO0FBQ0QsZUFKRDtBQUtBZixjQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWUosZUFBWixFQUE2QmlCLE9BQTdCLENBQXFDLFVBQVVHLFlBQVYsRUFBZ0M7QUFDcEUsb0JBQUlSLHVCQUF1QixDQUFDUyxjQUF4QixDQUF1Q0QsWUFBdkMsQ0FBSixFQUEwRDtBQUN6RHRDLGtCQUFBQSxTQUFTLENBQUNzQyxZQUFELENBQVQsR0FBMEJSLHVCQUF1QixDQUFDUSxZQUFELENBQWpEO0FBQ0E7QUFDRCxlQUpEO0FBS0EsYUFuQkQsTUFtQk8sSUFBSS9DLHVCQUF1QixDQUFDMEIsVUFBeEIsS0FBdUMsQ0FBM0MsRUFBOEM7QUFDcERJLGNBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSCxjQUFaLEVBQTRCZ0IsT0FBNUIsQ0FBb0MsVUFBQ0ssUUFBRCxFQUFjO0FBQ2pELG9CQUFNQyxLQUFLLEdBQUd0QixjQUFjLENBQUNxQixRQUFELENBQTVCOztBQUNBLG9CQUNDQyxLQUFLLElBQ0xBLEtBQUssQ0FBQ0MsR0FETixJQUVBRCxLQUFLLENBQUNDLEdBQU4sQ0FBVUMsb0JBQVYsQ0FGQSxJQUdBLENBQUNGLEtBQUssQ0FBQ0csUUFBTixHQUFpQkYsR0FBakIsQ0FBcUIsc0NBQXJCLENBSkYsRUFLRTtBQUNEdkIsa0JBQUFBLGNBQWMsQ0FBQ3FCLFFBQUQsQ0FBZCxHQUEyQkMsS0FBSyxDQUFDSSxTQUFOLEVBQTNCO0FBQ0E7QUFDRCxlQVZEO0FBV0Esa0JBQU1DLGtCQUFrQixHQUFHdkQsdUJBQTNCO0FBQ0E0QixjQUFBQSxjQUFjLENBQUN6QixRQUFmLEdBQTBCQSxRQUExQjtBQUVBZ0MsY0FBQUEsU0FBUyxHQUFHLElBQUlvQixrQkFBSixpQ0FDTjNCLGNBRE0sR0FDYUssYUFEYixHQUVYRyxjQUZXLEVBR1h6QjtBQUNBO0FBSlcsZUFBWjtBQU1BNEIsY0FBQUEsdUJBQXVCLEdBQUdKLFNBQVMsQ0FBQ3FCLGFBQVYsRUFBMUI7QUFDQTFCLGNBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZVixTQUFTLENBQUNzQixnQkFBdEIsRUFBd0NDLE9BQXhDLENBQWdELFVBQVVHLFlBQVYsRUFBZ0M7QUFDL0Usb0JBQUlSLHVCQUF1QixDQUFDUyxjQUF4QixDQUF1Q0QsWUFBdkMsQ0FBSixFQUEwRDtBQUN6RCxzQkFBSVUsWUFBWSxHQUFHbEIsdUJBQXVCLENBQUNRLFlBQUQsQ0FBMUM7O0FBQ0Esc0JBQUksT0FBT1UsWUFBUCxLQUF3QixRQUF4QixJQUFvQyxDQUFDQSxZQUFZLENBQUNILFNBQXRELEVBQWlFO0FBQ2hFLHdCQUFNSSxlQUFlLEdBQUdDLFVBQVUsQ0FBQ0YsWUFBRCxDQUFsQztBQUNBLHdCQUFNRyxZQUFZLGFBQU1GLGVBQU4sQ0FBbEI7QUFDQS9DLG9CQUFBQSxTQUFTLENBQUNFLE1BQVYsQ0FBaUJnRCxnQkFBakIsQ0FBa0NDLFdBQWxDLENBQThDRixZQUE5QyxFQUE0REgsWUFBNUQ7QUFDQUEsb0JBQUFBLFlBQVksR0FBRzlDLFNBQVMsQ0FBQ0UsTUFBVixDQUFpQmdELGdCQUFqQixDQUFrQ0Usb0JBQWxDLENBQXVESCxZQUF2RCxDQUFmO0FBQ0EsMkJBQU9JLE9BQU8sQ0FBQ04sZUFBRCxDQUFkO0FBQ0FqRCxvQkFBQUEsU0FBUyxDQUFDc0MsWUFBRCxDQUFULEdBQTBCVSxZQUExQjtBQUNBLG1CQVBELE1BT08sSUFBSSxDQUFDaEQsU0FBUyxDQUFDdUMsY0FBVixDQUF5QkQsWUFBekIsQ0FBRCxJQUEyQ1UsWUFBWSxLQUFLUSxTQUFoRSxFQUEyRTtBQUNqRnhELG9CQUFBQSxTQUFTLENBQUNzQyxZQUFELENBQVQsR0FBMEJVLFlBQTFCO0FBQ0E7QUFDRDtBQUNELGVBZEQ7QUFlQTs7QUFDRCxnQkFBTVMsZ0JBQTJCLEdBQUcsSUFBSUMsY0FBSixDQUFtQmxFLEtBQW5CLEVBQTBCc0MsdUJBQTFCLEVBQW1EdkMsdUJBQW5ELENBQXBDO0FBQ0FTLFlBQUFBLFNBQVMsQ0FBQ0QsS0FBRCxDQUFULEdBQW1CMEQsZ0JBQWdCLENBQUNILG9CQUFqQixDQUFzQyxHQUF0QyxDQUFuQjtBQUVBLGdCQUFJN0Isa0JBQUosQ0E5RUcsQ0FnRkg7O0FBQ0EsZ0JBQUlrQyxTQUFTLENBQUNDLGlCQUFWLEVBQUosRUFBbUM7QUFDbEMsa0JBQU1DLFVBQVUsR0FBR0YsU0FBUyxDQUFDRyxlQUFWLENBQTBCbkUsYUFBMUIsRUFBeUNpQixTQUF6QyxFQUFvRFosU0FBcEQsRUFBK0RSLEtBQS9ELEVBQXNFQyxRQUF0RSxDQUFuQjs7QUFDQSxrQkFBSW9FLFVBQUosRUFBZ0I7QUFDZnBDLGdCQUFBQSxrQkFBa0IsR0FBR3ZCLFNBQVMsQ0FBQyxZQUFELENBQTlCO0FBQ0FBLGdCQUFBQSxTQUFTLENBQUMsWUFBRCxDQUFULEdBQTBCMkQsVUFBVSxDQUFDRSxTQUFyQztBQUNBO0FBQ0Q7O0FBQ0RDLFlBQUFBLHNCQUFzQixDQUFDckUsYUFBRCxFQUFnQmlCLFNBQWhCLEVBQTJCWixTQUEzQixFQUFzQ1IsS0FBdEMsQ0FBdEI7QUFFQSxnQkFBTXlFLGVBQWUsR0FBR3hFLFFBQVEsQ0FBQ3lFLElBQVQsQ0FDdkJsRSxTQUR1QixFQUV2QlQsdUJBQXVCLENBQUN3QixNQUF4QixLQUFtQ3lDLFNBQW5DLEdBQStDLENBQUNqRSx1QkFBdUIsQ0FBQ3dCLE1BQXhFLEdBQWlGLElBRjFELENBQXhCO0FBSUEsZ0JBQU1vRCxPQUFPLEdBQUczRSxLQUFLLENBQUM0RSxVQUF0QjtBQUVBLGdCQUFJQyxXQUFKO0FBQ0EsZ0JBQUlDLFFBQUo7QUFDQSxnQkFBSUMsaUJBQWlCLEdBQUcsSUFBeEI7O0FBbEdHO0FBQUEsa0JBbUdDSixPQW5HRDtBQW9HRkUsZ0JBQUFBLFdBQVcsR0FBR0csS0FBSyxDQUFDQyxJQUFOLENBQVdOLE9BQU8sQ0FBQ08sUUFBbkIsRUFBNkJDLE9BQTdCLENBQXFDbkYsS0FBckMsQ0FBZDs7QUFDQSxvQkFDRXVDLFlBQVksQ0FBQ3hDLHVCQUFELENBQVosSUFBeUNBLHVCQUF1QixDQUFDcUYsV0FBbEUsSUFDQ3JGLHVCQUF1QixDQUFDMEIsVUFBeEIsS0FBdUMsQ0FBdkMsSUFBNEMsQ0FBQzFCLHVCQUF1QixDQUFDSyxRQUZ2RSxFQUdFO0FBQ0Qsc0JBQUlpRixTQUFKO0FBQ0Esc0JBQUlDLG1CQUFtQixHQUFHLEtBQTFCOztBQUNBLHNCQUFJdkYsdUJBQXVCLENBQUMwQixVQUF4QixLQUF1QyxDQUEzQyxFQUE4QztBQUM3QzRELG9CQUFBQSxTQUFTLEdBQUduRCxTQUFTLENBQUNrRCxXQUFWLEVBQVo7O0FBQ0Esd0JBQUlyRix1QkFBdUIsQ0FBQ3dGLFNBQTVCLEVBQXVDO0FBQ3RDLDJCQUFLLElBQU1DLFVBQVgsSUFBeUJ6QixPQUF6QixFQUFrQztBQUNqQyw0QkFBTWQsS0FBSyxHQUFHYyxPQUFPLENBQUN5QixVQUFELENBQXJCO0FBQ0EsNEJBQU03QixZQUFZLGFBQU02QixVQUFOLENBQWxCO0FBQ0E5RSx3QkFBQUEsU0FBUyxDQUFDRSxNQUFWLENBQWlCZ0QsZ0JBQWpCLENBQWtDQyxXQUFsQyxDQUE4Q0YsWUFBOUMsRUFBNERWLEtBQTVEO0FBQ0EsK0JBQU9jLE9BQU8sQ0FBQ3lCLFVBQUQsQ0FBZDtBQUNBO0FBQ0Q7O0FBQ0RGLG9CQUFBQSxtQkFBbUIsR0FBRyxJQUF0QjtBQUNBLG1CQVhELE1BV08sSUFBSXZGLHVCQUF1QixDQUFDcUYsV0FBNUIsRUFBeUM7QUFDL0NDLG9CQUFBQSxTQUFTLEdBQUd0Rix1QkFBdUIsQ0FBQ3FGLFdBQXhCLENBQW9DOUMsdUJBQXBDLENBQVo7QUFDQTs7QUFFRCxzQkFBSW1ELFFBQVEsR0FBRyxFQUFmOztBQUNBLHNCQUFJSixTQUFKLEVBQWU7QUFDZCx3QkFBSSxDQUFDQSxTQUFTLENBQUNLLGlCQUFmLEVBQWtDO0FBQ2pDTCxzQkFBQUEsU0FBUyxHQUFHTSxjQUFjLENBQUNOLFNBQUQsRUFBWUMsbUJBQVosQ0FBMUIsQ0FEaUMsQ0FFakM7O0FBQ0EsMEJBQU1NLElBQUksR0FBR0MsUUFBUSxDQUFDQyxrQkFBVCxDQUE0QlQsU0FBNUIsRUFBdUNVLFVBQVUsQ0FBQ0MsU0FBbEQsQ0FBYjtBQUNBLDBCQUFJQyxRQUFRLEdBQUdMLElBQUksQ0FBQ00sUUFBTCxFQUFmOztBQUNBLDZCQUFPRCxRQUFQLEVBQWlCO0FBQ2hCLDRCQUFJQSxRQUFRLENBQUNFLFdBQVQsSUFBd0JGLFFBQVEsQ0FBQ0UsV0FBVCxDQUFxQkMsSUFBckIsR0FBNEI3SCxNQUE1QixHQUFxQyxDQUFqRSxFQUFvRTtBQUNuRWtILDBCQUFBQSxRQUFRLEdBQUdRLFFBQVEsQ0FBQ0UsV0FBcEI7QUFDQTs7QUFDREYsd0JBQUFBLFFBQVEsR0FBR0wsSUFBSSxDQUFDTSxRQUFMLEVBQVg7QUFDQTtBQUNEOztBQUVELHdCQUFJYixTQUFTLENBQUNnQixTQUFWLEtBQXdCLGFBQTVCLEVBQTJDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBbEYsc0JBQUFBLEdBQUcsQ0FBQ0QsS0FBSixpREFBbURuQix1QkFBdUIsQ0FBQ08sSUFBM0U7O0FBQ0EsMEJBQUk7QUFBQTs7QUFDSGdHLHdCQUFBQSxXQUFXLEdBQUcsSUFBZDtBQUNBakIsd0JBQUFBLFNBQVMsR0FBRyxjQUFBbkQsU0FBUyxVQUFULHdDQUFXa0QsV0FBWCxHQUNUbEQsU0FBUyxDQUFDa0QsV0FBVixFQURTLEdBRVJyRix1QkFBRCxDQUFpQ3FGLFdBQWpDLENBQTZDOUMsdUJBQTdDLENBRkg7QUFHQStDLHdCQUFBQSxTQUFTLEdBQUdNLGNBQWMsQ0FBQ04sU0FBRCxFQUFZLElBQVosQ0FBMUI7QUFDQSx1QkFORCxTQU1VO0FBQ1RpQix3QkFBQUEsV0FBVyxHQUFHLEtBQWQ7QUFDQTtBQUNELHFCQWRELE1BY08sSUFBSWIsUUFBUSxDQUFDbEgsTUFBVCxHQUFrQixDQUF0QixFQUF5QjtBQUMvQjtBQUNBNEMsc0JBQUFBLEdBQUcsQ0FBQ0QsS0FBSixpREFBbURuQix1QkFBdUIsQ0FBQ08sSUFBM0U7QUFDQSwwQkFBTWlHLFVBQVUsR0FBR0MsY0FBYyxDQUNoQyxpREFDMEN6Ryx1QkFBdUIsQ0FBQ08sSUFEbEUsaURBRXdDbUYsUUFGeEMsRUFEZ0MsRUFLaENKLFNBQVMsQ0FBQ29CLFNBTHNCLENBQWpDO0FBT0FwQixzQkFBQUEsU0FBUyxHQUFHTSxjQUFjLENBQUNZLFVBQUQsRUFBYSxJQUFiLENBQTFCO0FBQ0E7O0FBQ0R2RyxvQkFBQUEsS0FBSyxDQUFDMEcsV0FBTixDQUFrQnJCLFNBQWxCO0FBQ0FyRixvQkFBQUEsS0FBSyxHQUFHMkUsT0FBTyxDQUFDTyxRQUFSLENBQWlCTCxXQUFqQixDQUFSO0FBQ0E4QixvQkFBQUEsWUFBWSxDQUFDM0UsYUFBRCxFQUFnQlosU0FBUyxDQUFDd0YsWUFBMUIsRUFBd0M1RyxLQUF4QyxFQUErQytFLGlCQUEvQyxDQUFaO0FBQ0FBLG9CQUFBQSxpQkFBaUIsR0FBRyxLQUFwQjtBQUNBRCxvQkFBQUEsUUFBUSxHQUFHTCxlQUFlLENBQUNvQyxTQUFoQixDQUEwQjdHLEtBQTFCLENBQVg7QUFDQSxtQkE3Q0QsTUE2Q087QUFDTkEsb0JBQUFBLEtBQUssQ0FBQzhHLE1BQU47QUFDQWhDLG9CQUFBQSxRQUFRLEdBQUdpQyxPQUFPLENBQUNDLE9BQVIsRUFBWDtBQUNBO0FBQ0QsaUJBdkVELE1BdUVPO0FBQ05sQyxrQkFBQUEsUUFBUSxHQUFHTCxlQUFlLENBQUN3QyxjQUFoQixDQUErQjlHLGFBQS9CLEVBQThDSCxLQUE5QyxDQUFYO0FBQ0E7O0FBOUtDLHVDQWdMSThFLFFBaExKO0FBaUxGLHNCQUFNb0MsYUFBYSxHQUFHdkMsT0FBTyxDQUFDTyxRQUFSLENBQWlCTCxXQUFqQixDQUF0QjtBQUNBOEIsa0JBQUFBLFlBQVksQ0FBQzNFLGFBQUQsRUFBZ0JaLFNBQVMsQ0FBQ3dGLFlBQTFCLEVBQXdDTSxhQUF4QyxFQUF1RG5DLGlCQUF2RCxDQUFaOztBQWxMRSxzQkFtTEVtQyxhQW5MRjtBQW9MRCx3QkFBTUMsZUFBZSxHQUFHRCxhQUFhLENBQUNFLGdCQUFkLENBQStCLE1BQS9CLENBQXhCO0FBQ0FELG9CQUFBQSxlQUFlLENBQUN4RSxPQUFoQixDQUF3QixVQUFVMEUsWUFBVixFQUE2QjtBQUNwREEsc0JBQUFBLFlBQVksQ0FBQ1AsTUFBYjtBQUNBLHFCQUZEO0FBckxDO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFnTUgsU0F0T0EsWUFzT1E3SSxDQXRPUixFQXNPVztBQUNYO0FBQ0EsY0FBTXFKLFlBQVksR0FBRztBQUNwQkMsWUFBQUEsaUJBQWlCLEVBQUUsRUFEQztBQUVwQkMsWUFBQUEsa0JBQWtCLEVBQUUsRUFGQTtBQUdwQkMsWUFBQUEsZUFBZSxFQUFFL0Y7QUFIRyxXQUFyQjs7QUFGVyxxREFPZ0JFLFdBUGhCO0FBQUE7O0FBQUE7QUFPWCxnRUFBd0M7QUFBQSxrQkFBN0I4RixhQUE2QjtBQUN2QyxrQkFBTUMsY0FBYSxHQUFHaEcsY0FBYyxDQUFDK0YsYUFBRCxDQUFwQzs7QUFDQSxrQkFBSUMsY0FBYSxJQUFJQSxjQUFhLENBQUN6RSxHQUEvQixJQUFzQ3lFLGNBQWEsQ0FBQ3pFLEdBQWQsQ0FBa0JDLG9CQUFsQixDQUExQyxFQUFtRjtBQUNsRm1FLGdCQUFBQSxZQUFZLENBQUNDLGlCQUFiLENBQStCRyxhQUEvQixJQUErQztBQUM5Q0Usa0JBQUFBLElBQUksRUFBRUQsY0FBYSxDQUFDRSxPQUFkLEVBRHdDO0FBRTlDaEssa0JBQUFBLEtBQUssRUFBRThKLGNBQWEsQ0FBQ3RFLFNBQWQ7QUFGdUMsaUJBQS9DO0FBSUEsZUFMRCxNQUtPO0FBQ05pRSxnQkFBQUEsWUFBWSxDQUFDQyxpQkFBYixDQUErQkcsYUFBL0IsSUFBK0NDLGNBQS9DO0FBQ0E7QUFDRDtBQWpCVTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQWtCWCxlQUFLLElBQU1ELFlBQVgsSUFBMkIvRixjQUEzQixFQUEyQztBQUMxQyxnQkFBTWdHLGFBQWEsR0FBR2hHLGNBQWMsQ0FBQytGLFlBQUQsQ0FBcEM7O0FBQ0EsZ0JBQUksQ0FBQzlGLFdBQVcsQ0FBQ2tHLFFBQVosQ0FBcUJKLFlBQXJCLENBQUwsRUFBeUM7QUFDeEMsa0JBQUlDLGFBQWEsSUFBSUEsYUFBYSxDQUFDekUsR0FBL0IsSUFBc0N5RSxhQUFhLENBQUN6RSxHQUFkLENBQWtCQyxvQkFBbEIsQ0FBMUMsRUFBbUY7QUFDbEZtRSxnQkFBQUEsWUFBWSxDQUFDRSxrQkFBYixDQUFnQ0UsWUFBaEMsSUFBZ0Q7QUFDL0NFLGtCQUFBQSxJQUFJLEVBQUVELGFBQWEsQ0FBQ0UsT0FBZCxFQUR5QztBQUUvQ2hLLGtCQUFBQSxLQUFLLEVBQUU4SixhQUFhLENBQUN0RSxTQUFkO0FBRndDLGlCQUFoRDtBQUlBLGVBTEQsTUFLTztBQUNOaUUsZ0JBQUFBLFlBQVksQ0FBQ0Usa0JBQWIsQ0FBZ0NFLFlBQWhDLElBQWdEQyxhQUFoRDtBQUNBO0FBQ0Q7QUFDRDs7QUFDRCxjQUFNSSxRQUFRLEdBQUc5SixDQUFqQjtBQUNBa0QsVUFBQUEsR0FBRyxDQUFDRCxLQUFKLENBQVU2RyxRQUFWLEVBQW9CQSxRQUFwQjtBQUNBLGNBQU1DLE1BQU0sR0FBR3hCLGNBQWMsQ0FDNUIsaURBQTBDekcsdUJBQXVCLENBQUNPLElBQWxFLEdBQTBFeUgsUUFBUSxDQUFDRSxLQUFuRixDQUQ0QixFQUU1QmpJLEtBQUssQ0FBQ3lHLFNBRnNCLEVBRzVCYSxZQUg0QixDQUE3QjtBQUtBLGNBQU1qQyxTQUFTLEdBQUdNLGNBQWMsQ0FBQ3FDLE1BQUQsRUFBUyxJQUFULENBQWhDO0FBQ0FoSSxVQUFBQSxLQUFLLENBQUMwRyxXQUFOLENBQWtCckIsU0FBbEI7QUFDQSxTQTlRQTs7QUFBQTtBQUFBO0FBK1FELEs7Ozs7O01BaFpjdEQsZSxhQUNkL0IsSyxFQUNBQyxRLEVBQ0FtQixTLEVBQ0FsQixRLEVBQ0F5QixjLEVBQ0FGLFU7UUFDQztBQUNELFVBQU1PLGFBQWtCLEdBQUcsRUFBM0I7O0FBREM7QUFBQSxZQUVHaEMsS0FBSyxDQUFDMEYsaUJBQU4sS0FBNEIsSUFGL0I7QUFBQTtBQTRCQXdDLFlBQUFBLG1CQUFrQixHQUFHbEksS0FBSyxDQUFDMEYsaUJBQTNCOztBQTVCQTtBQUFBLHFCQTZCT3dDLG1CQUFrQixLQUFLLElBN0I5QjtBQUFBLG1DQTZCb0M7QUFBQTtBQWtEbkNBLGdCQUFBQSxtQkFBa0IsR0FBR0MsVUFBckI7QUFsRG1DOztBQUNuQyxrQkFBTUEsVUFBMEIsR0FBR0QsbUJBQWtCLENBQUNFLGtCQUF0RDtBQUNBLGtCQUFNQyxVQUFVLEdBQUdILG1CQUFrQixDQUFDN0IsU0FBdEM7QUFDQSxrQkFBSWlDLGdCQUFnQixHQUFHRCxVQUF2Qjs7QUFDQSxrQkFBSUMsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQkMsV0FBcEIsT0FBc0NELGdCQUFnQixDQUFDLENBQUQsQ0FBMUQsRUFBK0Q7QUFDOUQ7QUFDQUEsZ0JBQUFBLGdCQUFnQixHQUFHbEgsU0FBUyxDQUFDb0gsa0JBQVYsSUFBZ0MsRUFBbkQ7QUFDQTs7QUFQa0M7QUFBQSxvQkFTbEMzRyxNQUFNLENBQUNDLElBQVAsQ0FBWVYsU0FBUyxDQUFDd0YsWUFBdEIsRUFBb0N6QixPQUFwQyxDQUE0Q21ELGdCQUE1QyxNQUFrRSxDQUFDLENBQW5FLEtBQ0MsQ0FBQ3BJLFFBQUQsSUFBYWtCLFNBQVMsQ0FBQ3dGLFlBQVYsQ0FBdUIwQixnQkFBdkIsRUFBeUNwSSxRQUR2RCxDQVRrQztBQUFBO0FBQUEsd0JBWTlCdUIsVUFBVSxLQUFLLENBWmU7QUFhakMsMEJBQU1nSCxxQkFBcUIsR0FBR3JILFNBQVMsQ0FBQ3dGLFlBQVYsQ0FBdUIwQixnQkFBdkIsQ0FBOUI7O0FBYmlDO0FBQUEsNEJBYzdCLENBQUNHLHFCQUFxQixDQUFDQyxJQUF2QixJQUErQlIsbUJBQS9CLElBQXFEQSxtQkFBa0IsQ0FBQ2hELFFBQW5CLENBQTRCM0csTUFBNUIsR0FBcUMsQ0FkN0Q7QUFBQSxpREFlMUIwQixRQUFRLENBQUM0RyxTQUFULENBQW1CcUIsbUJBQW5CLENBZjBCO0FBZ0JoQyxnQ0FBSVMsZUFBZSxHQUFHVCxtQkFBa0IsQ0FBQ3hDLGlCQUF6Qzs7QUFDQSxtQ0FBT2lELGVBQVAsRUFBd0I7QUFDdkIsa0NBQU1DLFNBQVMsR0FBRy9DLFFBQVEsQ0FBQ2dELGVBQVQsQ0FBeUI3SSxLQUFLLENBQUM4SSxZQUEvQixFQUE2Q0gsZUFBZSxDQUFDSSxZQUFoQixDQUE2QixLQUE3QixDQUE3QyxDQUFsQjtBQUNBLGtDQUFNQyxTQUFTLEdBQUdMLGVBQWUsQ0FBQ1Asa0JBQWxDO0FBQ0FRLDhCQUFBQSxTQUFTLENBQUNLLFdBQVYsQ0FBc0JOLGVBQXRCO0FBQ0EzRyw4QkFBQUEsYUFBYSxDQUFDMkcsZUFBZSxDQUFDSSxZQUFoQixDQUE2QixLQUE3QixDQUFELENBQWIsR0FBc0RILFNBQXREO0FBQ0FELDhCQUFBQSxlQUFlLENBQUNPLGVBQWhCLENBQWdDLEtBQWhDO0FBQ0FQLDhCQUFBQSxlQUFlLEdBQUdLLFNBQWxCO0FBQ0E7QUF4QitCO0FBQUEsK0JBeUIxQixJQUFJUCxxQkFBcUIsQ0FBQ0MsSUFBMUIsRUFBZ0M7QUFDdEMsOEJBQUlKLGdCQUFnQixLQUFLRCxVQUF6QixFQUFxQztBQUNwQyxnQ0FBSSxDQUFDckcsYUFBYSxDQUFDc0csZ0JBQUQsQ0FBbEIsRUFBc0M7QUFDckMsa0NBQU1NLFNBQVMsR0FBRy9DLFFBQVEsQ0FBQ2dELGVBQVQsQ0FBeUI3SSxLQUFLLENBQUM4SSxZQUEvQixFQUE2Q1IsZ0JBQTdDLENBQWxCO0FBQ0F0Ryw4QkFBQUEsYUFBYSxDQUFDc0csZ0JBQUQsQ0FBYixHQUFrQ00sU0FBbEM7QUFDQTs7QUFDRDVHLDRCQUFBQSxhQUFhLENBQUNzRyxnQkFBRCxDQUFiLENBQWdDVyxXQUFoQyxDQUE0Q2YsbUJBQTVDO0FBQ0EsMkJBTkQsTUFNTztBQUNObEcsNEJBQUFBLGFBQWEsQ0FBQ3NHLGdCQUFELENBQWIsR0FBa0NKLG1CQUFsQztBQUNBO0FBQ0Q7QUFuQ2dDOztBQUFBO0FBQUE7QUFBQSw2Q0FxQzNCakksUUFBUSxDQUFDNEcsU0FBVCxDQUFtQnFCLG1CQUFuQixDQXJDMkI7QUFzQ2pDbEcsd0JBQUFBLGFBQWEsQ0FBQ2tHLG1CQUFrQixDQUFDN0IsU0FBcEIsQ0FBYixHQUE4QzZCLG1CQUE5QztBQXRDaUM7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBLHdCQXdDeEJyRyxNQUFNLENBQUNDLElBQVAsQ0FBWVYsU0FBUyxDQUFDK0gsVUFBdEIsRUFBa0NoRSxPQUFsQyxDQUEwQ21ELGdCQUExQyxNQUFnRSxDQUFDLENBeEN6QztBQUFBLDZDQXlDNUJySSxRQUFRLENBQUM0RyxTQUFULENBQW1CcUIsbUJBQW5CLENBekM0QjtBQTBDbEM7QUFDQXZHLHdCQUFBQSxjQUFjLENBQUMyRyxnQkFBRCxDQUFkLEdBQW1DLEVBQW5DOztBQUNBLHdEQUE2QnpHLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZb0csbUJBQWtCLENBQUNrQixVQUEvQixDQUE3QixrQ0FBeUU7QUFBcEUsOEJBQU1DLGNBQWMsbUJBQXBCO0FBQ0oxSCwwQkFBQUEsY0FBYyxDQUFDMkcsZ0JBQUQsQ0FBZCxDQUFpQ0osbUJBQWtCLENBQUNrQixVQUFuQixDQUE4QkMsY0FBOUIsRUFBcURoRCxTQUF0RixJQUNDNkIsbUJBQWtCLENBQUNrQixVQUFuQixDQUE4QkMsY0FBOUIsRUFBcUR4TCxLQUR0RDtBQUVBO0FBL0NpQztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBbURuQyxhQWhGRDs7QUFBQTtBQUFBOztBQUdBLGNBQUlxSyxtQkFBa0MsR0FBR2xJLEtBQUssQ0FBQzBGLGlCQUEvQzs7QUFDQSxjQUFJakUsVUFBVSxLQUFLLENBQW5CLEVBQXNCO0FBQ3JCLG1CQUFPeUcsbUJBQWtCLEtBQUssSUFBOUIsRUFBb0M7QUFDbkMsa0JBQU1HLFVBQVUsR0FBR0gsbUJBQWtCLENBQUM3QixTQUF0QztBQUNBLGtCQUFJaUMsZ0JBQWdCLEdBQUdELFVBQXZCOztBQUNBLGtCQUFJQyxnQkFBZ0IsQ0FBQyxDQUFELENBQWhCLENBQW9CQyxXQUFwQixPQUFzQ0QsZ0JBQWdCLENBQUMsQ0FBRCxDQUExRCxFQUErRDtBQUM5RDtBQUNBQSxnQkFBQUEsZ0JBQWdCLEdBQUdsSCxTQUFTLENBQUNvSCxrQkFBVixJQUFnQyxFQUFuRDtBQUNBOztBQUNELGtCQUFNQyxxQkFBcUIsR0FBR3JILFNBQVMsQ0FBQ3dGLFlBQVYsQ0FBdUIwQixnQkFBdkIsQ0FBOUI7O0FBQ0Esa0JBQUlHLHFCQUFxQixJQUFJLENBQUNBLHFCQUFxQixDQUFDQyxJQUFwRCxFQUEwRDtBQUN6RCxvQkFBTVksaUJBQWlCLEdBQUdDLGdCQUFnQixDQUFDckIsbUJBQUQsQ0FBMUM7QUFDQWxHLGdCQUFBQSxhQUFhLENBQUNzRyxnQkFBRCxDQUFiLEdBQWtDZ0IsaUJBQWxDOztBQUNBLHFCQUFLLElBQU1FLG9CQUFYLElBQW1DRixpQkFBbkMsRUFBc0Q7QUFDckRsSSxrQkFBQUEsU0FBUyxDQUFDd0YsWUFBVixDQUF1QjRDLG9CQUF2QixJQUErQ0YsaUJBQWlCLENBQUNFLG9CQUFELENBQWhFO0FBQ0E7QUFDRDs7QUFDRHRCLGNBQUFBLG1CQUFrQixHQUFHQSxtQkFBa0IsQ0FBQ0Usa0JBQXhDO0FBQ0E7QUFDRDs7QUF0QkQ7QUFBQSxnQkF3QkkzRyxVQUFVLEtBQUssQ0F4Qm5CO0FBeUJDO0FBekJELHFDQTBCT3hCLFFBQVEsQ0FBQ3dKLGVBQVQsQ0FBeUJ6SixLQUF6QixDQTFCUDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBa0ZELGVBQU9nQyxhQUFQO0FBbEZDLFdBa0ZNQSxhQWxGTjtBQW1GRCxLOzs7OztNQWxMY1IsaUIsYUFDZEosUyxFQUNBVixTLEVBQ0FWLEssRUFDQUUsUSxFQUNBRCxRLEVBQ0FPLFMsRUFDQUMsaUIsRUFDQWdCLFU7UUFDQztBQUFBO0FBNkJEO0FBQ0FpSSxRQUFBQSx1QkFBdUIsR0FBR0EsdUJBQXVCLENBQUNDLElBQXhCLENBQTZCLFVBQVVDLENBQVYsRUFBcUJDLENBQXJCLEVBQWdDO0FBQ3RGLGlCQUFPRCxDQUFDLEdBQUdDLENBQUosR0FBUSxDQUFSLEdBQVksQ0FBQyxDQUFwQjtBQUNBLFNBRnlCLENBQTFCOztBQTlCQyxvREFpQzRCSCx1QkFqQzVCO0FBQUE7O0FBQUE7QUFpQ0QsaUVBQXNEO0FBQUEsZ0JBQTNDSSxjQUEyQztBQUNyRCxnQkFBTUMsYUFBYSxHQUFHN0osUUFBUSxJQUFJLENBQUM4SixtQkFBbUIsQ0FBQ0YsY0FBRCxDQUFuQixDQUFvQzVKLFFBQWpELElBQTZERixLQUFLLENBQUNpSyxZQUFOLENBQW1CSCxjQUFuQixDQUFuRjs7QUFDQSxnQkFBTUksZ0JBQWdCLEdBQUdDLG1CQUFtQixDQUFDekosU0FBRCxFQUFZVixLQUFaLEVBQW1COEosY0FBbkIsRUFBbUM3SixRQUFuQyxFQUE2QzhKLGFBQTdDLEVBQTREM0ksU0FBUyxDQUFDRyxNQUF0RSxDQUE1Qzs7QUFDQSxnQkFBSTJJLGdCQUFKLEVBQXNCO0FBQ3JCQSxjQUFBQSxnQkFBZ0IsQ0FBQzVKLElBQWpCLEdBQXdCd0osY0FBeEI7QUFDQU0sY0FBQUEsZ0JBQWdCLENBQUM1SixTQUFELEVBQVlQLFFBQVosRUFBc0JpSyxnQkFBdEIsRUFBd0N6SixpQkFBeEMsQ0FBaEI7O0FBQ0Esa0JBQ0VxSixjQUFjLEtBQUssV0FBbkIsSUFBa0MsQ0FBQ3BKLFNBQVMsQ0FBQzJKLGVBQVYsQ0FBMEJ0SCxjQUExQixDQUF5QytHLGNBQXpDLENBQXBDLElBQ0NBLGNBQWMsS0FBSyxhQUFuQixJQUFvQyxDQUFDcEosU0FBUyxDQUFDMkosZUFBVixDQUEwQnRILGNBQTFCLENBQXlDK0csY0FBekMsQ0FGdkMsRUFHRTtBQUNEcEosZ0JBQUFBLFNBQVMsQ0FBQzJKLGVBQVYsQ0FBMEJQLGNBQTFCLElBQTRDdEosU0FBUyxDQUFDc0osY0FBRCxDQUFyRDtBQUNBOztBQUNELGtCQUFJQSxjQUFjLEtBQUssYUFBdkIsRUFBc0M7QUFDckNwSixnQkFBQUEsU0FBUyxDQUFDNEosa0JBQVYsR0FBK0I5SixTQUFTLENBQUNzSixjQUFELENBQXhDO0FBQ0E7O0FBQ0RuSSxjQUFBQSxjQUFjLENBQUNtSSxjQUFELENBQWQsR0FBaUN0SixTQUFTLENBQUNzSixjQUFELENBQTFDO0FBQ0EsYUFiRCxNQWFPO0FBQ05wSSxjQUFBQSxlQUFlLENBQUNvSSxjQUFELENBQWYsR0FBa0MsSUFBbEM7QUFDQTtBQUNEO0FBcERBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBcURELGVBQU87QUFBRXBJLFVBQUFBLGVBQWUsRUFBZkEsZUFBRjtBQUFtQkMsVUFBQUEsY0FBYyxFQUFFQTtBQUFuQyxTQUFQO0FBckRDOztBQUNELFVBQU1ELGVBQW9CLEdBQUcsRUFBN0I7QUFDQSxVQUFNNkkscUJBQXFCLEdBQUduSixTQUFTLENBQUMrSCxVQUF4QztBQUNBLFVBQU1hLG1CQUFtQixHQUFHNUksU0FBUyxDQUFDc0IsZ0JBQXRDO0FBQ0FoQyxNQUFBQSxTQUFTLENBQUM0SixrQkFBVixHQUErQjVKLFNBQVMsQ0FBQzJKLGVBQVYsQ0FBMEJHLFdBQXpELENBSkMsQ0FNRDs7QUFDQSxVQUFNQyx5QkFBeUIsR0FBRzVJLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZeUkscUJBQVosQ0FBbEM7QUFDQSxVQUFJYix1QkFBdUIsR0FBRzdILE1BQU0sQ0FBQ0MsSUFBUCxDQUFZa0ksbUJBQVosQ0FBOUI7QUFDQSxVQUFNckksY0FBbUMsR0FBRyxFQUE1Qzs7QUFUQywyQkFVdUI4SSx5QkFWdkIsWUFVVUMsU0FWVixFQVVrRDtBQUNsRCxZQUFJSCxxQkFBcUIsQ0FBQ0csU0FBRCxDQUFyQixDQUFpQ0MsSUFBakMsS0FBMEMsUUFBOUMsRUFBd0Q7QUFDdkRoSixVQUFBQSxjQUFjLENBQUMrSSxTQUFELENBQWQsR0FBNEIsRUFBNUIsQ0FEdUQsQ0FDdkI7QUFDaEMsU0FGRCxNQUVPO0FBQ04vSSxVQUFBQSxjQUFjLENBQUMrSSxTQUFELENBQWQsR0FBNEJILHFCQUFxQixDQUFDRyxTQUFELENBQXJCLENBQWlDRSxZQUE3RDtBQUNBOztBQUxpRDtBQUFBLGNBTTlDNUssS0FBSyxDQUFDaUssWUFBTixDQUFtQlMsU0FBbkIsS0FBaUN4SyxRQUFqQyxJQUE2QyxDQUFDcUsscUJBQXFCLENBQUNHLFNBQUQsQ0FBckIsQ0FBaUN4SyxRQU5qQztBQU9qRGlCLFlBQUFBLEdBQUcsQ0FBQ0QsS0FBSixvQkFBc0J3SixTQUF0QjtBQVBpRDtBQUFBO0FBQUEsa0JBUXZDMUssS0FBSyxDQUFDaUssWUFBTixDQUFtQlMsU0FBbkIsQ0FSdUM7QUFBQSx1Q0FTM0N6SyxRQUFRLENBQUM0SyxjQUFULENBQXdCN0ssS0FBeEIsRUFBK0JBLEtBQUssQ0FBQ29KLFVBQU4sQ0FBaUIwQixZQUFqQixDQUE4QkosU0FBOUIsQ0FBL0IsQ0FUMkM7QUFVakQsc0JBQUlLLE1BQVcsR0FBRy9LLEtBQUssQ0FBQytJLFlBQU4sQ0FBbUIyQixTQUFuQixDQUFsQjs7QUFWaUQsc0JBVzdDSyxNQUFNLEtBQUsvRyxTQVhrQztBQVloRCx3QkFBSXZDLFVBQVUsS0FBSyxDQUFmLElBQW9CLE9BQU9zSixNQUFQLEtBQWtCLFFBQXRDLElBQWtEUixxQkFBcUIsQ0FBQ0csU0FBRCxDQUFyQixDQUFpQ0MsSUFBakMsS0FBMEMsU0FBaEcsRUFBMkc7QUFDMUdJLHNCQUFBQSxNQUFNLEdBQUdBLE1BQU0sS0FBSyxNQUFwQjtBQUNBOztBQUNEcEosb0JBQUFBLGNBQWMsQ0FBQytJLFNBQUQsQ0FBZCxHQUE0QkssTUFBNUI7QUFmZ0Q7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBa0JsRCxPQTVCQTs7QUFBQTtBQXNERCxLOzs7OztBQWhYRCxNQUFNQyxZQUFZLEdBQUcsaURBQXJCO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsSUFBSUMsU0FBSixFQUExQjtBQUNBLE1BQUk1RSxXQUFXLEdBQUcsS0FBbEI7O0FBc0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVMvRCxZQUFULENBQXNCeEMsdUJBQXRCLEVBQThIO0FBQzdILFdBQU9BLHVCQUF1QixDQUFDMEIsVUFBeEIsS0FBdUN1QyxTQUF2QyxJQUFvRGpFLHVCQUF1QixDQUFDMEIsVUFBeEIsS0FBdUMsQ0FBbEc7QUFDQTs7QUFDRCxXQUFTMEosNEJBQVQsQ0FDQzVLLEtBREQsRUFFQ0MsU0FGRCxFQUdDNEssZ0JBSEQsRUFJQ0MsSUFKRCxFQUtFO0FBQ0QsUUFBTUMsUUFBUSxHQUFHOUssU0FBUyxDQUFDNkssSUFBRCxDQUExQjtBQUNBLFFBQU1FLGNBQWMsR0FBR0QsUUFBSCxhQUFHQSxRQUFILHVCQUFHQSxRQUFRLENBQUVqSSxTQUFWLEVBQXZCOztBQUVBLFFBQUkrSCxnQkFBZ0IsQ0FBQ0ksUUFBakIsS0FBOEIsQ0FBQ0YsUUFBRCxJQUFhQyxjQUFjLEtBQUssSUFBOUQsQ0FBSixFQUF5RTtBQUN4RSxZQUFNLElBQUlFLEtBQUosV0FBYWxMLEtBQWIseUNBQWlEOEssSUFBakQsa0JBQU47QUFDQSxLQUZELE1BRU8sSUFBSUUsY0FBSixFQUFvQjtBQUMxQjtBQUNBO0FBQ0EsVUFBSUEsY0FBYyxDQUFDeEksY0FBZixDQUE4QixPQUE5QixLQUEwQ3FJLGdCQUFnQixDQUFDTSxLQUEvRCxFQUFzRTtBQUNyRTtBQUNBLFlBQUlOLGdCQUFnQixDQUFDTSxLQUFqQixDQUF1QnZHLE9BQXZCLENBQStCb0csY0FBYyxDQUFDLE9BQUQsQ0FBN0MsTUFBNEQsQ0FBQyxDQUFqRSxFQUFvRTtBQUNuRSxnQkFBTSxJQUFJRSxLQUFKLFdBQ0ZsTCxLQURFLGdCQUNTOEssSUFEVCxnQ0FDbUNELGdCQUFnQixDQUFDLE9BQUQsQ0FEbkQsdUJBRUpHLGNBQWMsQ0FBQ0csS0FGWCxnQkFHQ0osUUFBUSxDQUFDekQsT0FBVCxFQUhELEVBQU47QUFLQTtBQUNELE9BVEQsTUFTTyxJQUFJMEQsY0FBYyxDQUFDeEksY0FBZixDQUE4QixPQUE5QixLQUEwQ3FJLGdCQUFnQixDQUFDTyxLQUEvRCxFQUFzRTtBQUM1RTtBQUNBLFlBQUlQLGdCQUFnQixDQUFDTyxLQUFqQixDQUF1QnhHLE9BQXZCLENBQStCb0csY0FBYyxDQUFDLE9BQUQsQ0FBN0MsTUFBNEQsQ0FBQyxDQUFqRSxFQUFvRTtBQUNuRSxnQkFBTSxJQUFJRSxLQUFKLFdBQ0ZsTCxLQURFLGdCQUNTOEssSUFEVCxnQ0FDbUNELGdCQUFnQixDQUFDLE9BQUQsQ0FEbkQsdUJBRUpHLGNBQWMsQ0FBQ0ksS0FGWCxnQkFHQ0wsUUFBUSxDQUFDekQsT0FBVCxFQUhELEVBQU47QUFLQTtBQUNEO0FBQ0Q7QUFDRDs7QUFDTSxXQUFTckQsc0JBQVQsQ0FBZ0NqRSxLQUFoQyxFQUE0Q2EsU0FBNUMsRUFBNERaLFNBQTVELEVBQTRFUixLQUE1RSxFQUF3RjtBQUM5RixRQUFNNEwsb0JBQW9CLEdBQUl4SyxTQUFTLENBQUNzQixnQkFBVixJQUE4QmIsTUFBTSxDQUFDQyxJQUFQLENBQVlWLFNBQVMsQ0FBQ3NCLGdCQUF0QixDQUEvQixJQUEyRSxFQUF4RztBQUFBLFFBQ0NtSixXQUFXLEdBQUl6SyxTQUFTLENBQUMrSCxVQUFWLElBQXdCdEgsTUFBTSxDQUFDQyxJQUFQLENBQVlWLFNBQVMsQ0FBQytILFVBQXRCLENBQXpCLElBQStELEVBRDlFO0FBQUEsUUFFQzJDLGVBQW9CLEdBQUcsRUFGeEIsQ0FEOEYsQ0FLOUY7O0FBQ0FqSyxJQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWTlCLEtBQUssQ0FBQ29KLFVBQWxCLEVBQThCekcsT0FBOUIsQ0FBc0MsVUFBVW9KLElBQVYsRUFBd0I7QUFDN0QsVUFBTVYsSUFBSSxHQUFHckwsS0FBSyxDQUFDb0osVUFBTixDQUFpQjJDLElBQWpCLEVBQXVCekwsSUFBcEM7QUFDQXdMLE1BQUFBLGVBQWUsQ0FBQ1QsSUFBRCxDQUFmLEdBQXdCLElBQXhCO0FBQ0EsS0FIRCxFQU44RixDQVc5Rjs7QUFDQU8sSUFBQUEsb0JBQW9CLENBQUNqSixPQUFyQixDQUE2QixVQUFVMEksSUFBVixFQUFxQjtBQUNqRCxVQUFNRCxnQkFBZ0IsR0FBR2hLLFNBQVMsQ0FBQ3NCLGdCQUFWLENBQTJCMkksSUFBM0IsQ0FBekI7QUFFQUYsTUFBQUEsNEJBQTRCLENBQUM1SyxLQUFELEVBQVFDLFNBQVIsRUFBbUI0SyxnQkFBbkIsRUFBcUNDLElBQXJDLENBQTVCO0FBQ0EsYUFBT1MsZUFBZSxDQUFDVCxJQUFELENBQXRCO0FBQ0EsS0FMRCxFQVo4RixDQWtCOUY7O0FBQ0FRLElBQUFBLFdBQVcsQ0FBQ2xKLE9BQVosQ0FBb0IsVUFBVTBJLElBQVYsRUFBcUI7QUFDeEMsVUFBTVcsaUJBQWlCLEdBQUc1SyxTQUFTLENBQUMrSCxVQUFWLENBQXFCa0MsSUFBckIsQ0FBMUI7O0FBQ0EsVUFBSSxDQUFDckwsS0FBSyxDQUFDaUssWUFBTixDQUFtQm9CLElBQW5CLENBQUwsRUFBK0I7QUFDOUIsWUFBSVcsaUJBQWlCLENBQUNSLFFBQWxCLElBQThCLENBQUNRLGlCQUFpQixDQUFDakosY0FBbEIsQ0FBaUMsY0FBakMsQ0FBbkMsRUFBcUY7QUFDcEYsZ0JBQU0sSUFBSTBJLEtBQUosQ0FBVSxVQUFHbEwsS0FBSCx1Q0FBcUM4SyxJQUFyQyxpQkFBVixDQUFOO0FBQ0E7QUFDRCxPQUpELE1BSU87QUFDTixlQUFPUyxlQUFlLENBQUNULElBQUQsQ0FBdEI7QUFDQTtBQUNELEtBVEQsRUFuQjhGLENBOEI5Rjs7QUFDQXhKLElBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZZ0ssZUFBWixFQUE2Qm5KLE9BQTdCLENBQXFDLFVBQVUwSSxJQUFWLEVBQXdCO0FBQzVEO0FBQ0EsVUFBSUEsSUFBSSxDQUFDbEcsT0FBTCxDQUFhLEdBQWIsSUFBb0IsQ0FBcEIsSUFBeUIsQ0FBQ2tHLElBQUksQ0FBQ1ksVUFBTCxDQUFnQixPQUFoQixDQUE5QixFQUF3RDtBQUN2RDlLLFFBQUFBLEdBQUcsQ0FBQytLLE9BQUosZ0NBQW9DM0wsS0FBcEMsZUFBOEM4SyxJQUE5QyxHQUFzRHJILFNBQXRELEVBQWlFZ0gsWUFBakU7QUFDQTtBQUNELEtBTEQ7QUFNQTs7O0FBRUQsTUFBTW1CLG1CQUFtQixHQUFHLHFCQUE1QjtBQUVBLE1BQU1oSixvQkFBb0IsR0FBRyxzQkFBN0I7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxXQUFTOUIsZUFBVCxDQUF5QitLLHFCQUF6QixFQUF1SDtBQUFBLFFBQS9DN0ssTUFBK0MsdUVBQXRDLEtBQXNDOztBQUN0SCxRQUFJNksscUJBQUosRUFBMkI7QUFDMUIsVUFBTUMsV0FBZ0IsR0FBRyxFQUF6QjtBQUNBLFVBQU1ySyxhQUFrQixHQUFHO0FBQzFCLHNCQUFjO0FBQ2IySSxVQUFBQSxJQUFJLEVBQUV3QjtBQURPLFNBRFk7QUFJMUIsc0JBQWM7QUFDYnhCLFVBQUFBLElBQUksRUFBRXdCO0FBRE87QUFKWSxPQUEzQjtBQVFBLFVBQU0xTCxpQkFBa0UsR0FBRyxFQUEzRTtBQUNBLFVBQUk2TCx1QkFBSjtBQUNBekssTUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlzSyxxQkFBcUIsQ0FBQ2pELFVBQWxDLEVBQThDeEcsT0FBOUMsQ0FBc0QsVUFBVTRKLGFBQVYsRUFBaUM7QUFDdEYsWUFBSUgscUJBQXFCLENBQUNqRCxVQUF0QixDQUFpQ29ELGFBQWpDLEVBQWdENUIsSUFBaEQsS0FBeUR4SCxvQkFBN0QsRUFBbUY7QUFDbEZrSixVQUFBQSxXQUFXLENBQUNFLGFBQUQsQ0FBWCxHQUE2QkgscUJBQXFCLENBQUNqRCxVQUF0QixDQUFpQ29ELGFBQWpDLENBQTdCO0FBQ0EsU0FGRCxNQUVPO0FBQ045TCxVQUFBQSxpQkFBaUIsQ0FBQzhMLGFBQUQsQ0FBakIsR0FBbUNILHFCQUFxQixDQUFDakQsVUFBdEIsQ0FBaUNvRCxhQUFqQyxDQUFuQztBQUNBO0FBQ0QsT0FORCxFQVowQixDQW1CMUI7O0FBQ0EsVUFBSUgscUJBQXFCLENBQUNJLE1BQTFCLEVBQWtDO0FBQ2pDM0ssUUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlzSyxxQkFBcUIsQ0FBQ0ksTUFBbEMsRUFBMEM3SixPQUExQyxDQUFrRCxVQUFVOEosVUFBVixFQUE4QjtBQUMvRUosVUFBQUEsV0FBVyxDQUFDSSxVQUFELENBQVgsR0FBMEJMLHFCQUFxQixDQUFDSSxNQUF0QixDQUE2QkMsVUFBN0IsQ0FBMUI7QUFDQSxTQUZEO0FBR0E7O0FBQ0QsVUFBSUwscUJBQXFCLENBQUN4RixZQUExQixFQUF3QztBQUN2Qy9FLFFBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZc0sscUJBQXFCLENBQUN4RixZQUFsQyxFQUFnRGpFLE9BQWhELENBQXdELFVBQVU0SixhQUFWLEVBQWlDO0FBQ3hGdkssVUFBQUEsYUFBYSxDQUFDdUssYUFBRCxDQUFiLEdBQStCSCxxQkFBcUIsQ0FBQ3hGLFlBQXRCLENBQW1DMkYsYUFBbkMsQ0FBL0I7O0FBQ0EsY0FBSXZLLGFBQWEsQ0FBQ3VLLGFBQUQsQ0FBYixDQUE2QkcsU0FBakMsRUFBNEM7QUFDM0NKLFlBQUFBLHVCQUF1QixHQUFHQyxhQUExQjtBQUNBO0FBQ0QsU0FMRDtBQU1BOztBQUNELGFBQU87QUFDTnBELFFBQUFBLFVBQVUsRUFBRWtELFdBRE47QUFFTnpGLFFBQUFBLFlBQVksRUFBRTVFLGFBRlI7QUFHTndHLFFBQUFBLGtCQUFrQixFQUFFOEQsdUJBSGQ7QUFJTjVKLFFBQUFBLGdCQUFnQixFQUFFakMsaUJBSlo7QUFLTmMsUUFBQUEsTUFBTSxFQUFFQTtBQUxGLE9BQVA7QUFPQSxLQXhDRCxNQXdDTztBQUNOLGFBQU87QUFDTm1CLFFBQUFBLGdCQUFnQixFQUFFLEVBRFo7QUFFTmtFLFFBQUFBLFlBQVksRUFBRTtBQUNiLHdCQUFjO0FBQ2IrRCxZQUFBQSxJQUFJLEVBQUV3QjtBQURPLFdBREQ7QUFJYix3QkFBYztBQUNieEIsWUFBQUEsSUFBSSxFQUFFd0I7QUFETztBQUpELFNBRlI7QUFVTmhELFFBQUFBLFVBQVUsRUFBRSxFQVZOO0FBV041SCxRQUFBQSxNQUFNLEVBQUVBO0FBWEYsT0FBUDtBQWFBO0FBQ0Q7O0FBRUQsV0FBUzRJLG1CQUFULENBQ0N6SixTQURELEVBRUNWLEtBRkQsRUFHQzhKLGNBSEQsRUFJQzdKLFFBSkQsRUFLQzhKLGFBTEQsRUFNQ3hJLE1BTkQsRUFPRTtBQUNELFFBQUkySSxnQkFBSjs7QUFDQSxRQUFJLENBQUNILGFBQUQsSUFBa0IvSixLQUFLLENBQUNpSyxZQUFOLENBQW1CSCxjQUFuQixDQUF0QixFQUEwRDtBQUN6RCxVQUFNckcsZUFBZSxHQUFHekQsS0FBSyxDQUFDK0ksWUFBTixDQUFtQmUsY0FBbkIsQ0FBeEI7QUFDQSxVQUFJNkMsU0FBSjtBQUNBekMsTUFBQUEsZ0JBQWdCLEdBQUcwQyxhQUFhLENBQUNDLGFBQWQsQ0FBNEJwSixlQUE1QixDQUFuQjs7QUFDQSxVQUFJLENBQUN5RyxnQkFBTCxFQUF1QjtBQUN0QixZQUFJekcsZUFBZSxDQUFDd0ksVUFBaEIsQ0FBMkIsUUFBM0IsQ0FBSixFQUEwQztBQUN6QyxjQUFNaEosS0FBSyxHQUFHYyxPQUFPLENBQUNOLGVBQUQsQ0FBckI7QUFDQS9DLFVBQUFBLFNBQVMsQ0FBQ0UsTUFBVixDQUFpQmdELGdCQUFqQixDQUFrQ0MsV0FBbEMsQ0FBOENKLGVBQTlDLEVBQStEUixLQUEvRDtBQUNBaUgsVUFBQUEsZ0JBQWdCLEdBQUc7QUFDbEI0QyxZQUFBQSxLQUFLLEVBQUUsa0JBRFc7QUFFbEJsRixZQUFBQSxJQUFJLEVBQUVuRTtBQUZZLFdBQW5CO0FBSUEsU0FQRCxNQU9PLElBQUtxRyxjQUFjLEtBQUssVUFBbkIsSUFBaUNwSixTQUFTLENBQUM0SixrQkFBNUMsSUFBbUVSLGNBQWMsS0FBSyxhQUExRixFQUF5RztBQUMvRyxjQUFJckcsZUFBZSxJQUFJQSxlQUFlLENBQUN3SSxVQUFoQixDQUEyQixHQUEzQixDQUF2QixFQUF3RDtBQUN2RDtBQUNBVSxZQUFBQSxTQUFTLEdBQUdsSixlQUFaO0FBQ0EsV0FIRCxNQUdPO0FBQ04sZ0JBQUlFLFlBQVksR0FBR2pELFNBQVMsQ0FBQzRKLGtCQUFWLENBQTZCekMsT0FBN0IsRUFBbkI7O0FBQ0EsZ0JBQUksQ0FBQ2xFLFlBQVksQ0FBQ29KLFFBQWIsQ0FBc0IsR0FBdEIsQ0FBTCxFQUFpQztBQUNoQ3BKLGNBQUFBLFlBQVksSUFBSSxHQUFoQjtBQUNBOztBQUNEZ0osWUFBQUEsU0FBUyxHQUFHaEosWUFBWSxHQUFHRixlQUEzQjtBQUNBOztBQUNEeUcsVUFBQUEsZ0JBQWdCLEdBQUc7QUFDbEI0QyxZQUFBQSxLQUFLLEVBQUUsV0FEVztBQUVsQmxGLFlBQUFBLElBQUksRUFBRStFO0FBRlksV0FBbkI7QUFJQSxTQWZNLE1BZUE7QUFDTnpDLFVBQUFBLGdCQUFnQixHQUFHO0FBQ2xCNEMsWUFBQUEsS0FBSyxFQUFFLFdBRFc7QUFFbEJsRixZQUFBQSxJQUFJLEVBQUVsSCxTQUFTLENBQUMySixlQUFWLENBQTBCMkMsU0FBMUIsR0FDSHRNLFNBQVMsQ0FBQzJKLGVBQVYsQ0FBMEIyQyxTQUExQixDQUFvQ25GLE9BQXBDLENBQTRDcEUsZUFBNUMsQ0FERyxHQUVIQTtBQUplLFdBQW5CO0FBTUE7QUFDRDtBQUNELEtBcENELE1Bb0NPLElBQUkvQyxTQUFTLENBQUMySixlQUFWLENBQTBCdEgsY0FBMUIsQ0FBeUMrRyxjQUF6QyxDQUFKLEVBQThEO0FBQ3BFSSxNQUFBQSxnQkFBZ0IsR0FBRztBQUNsQjRDLFFBQUFBLEtBQUssRUFBRWhELGNBRFc7QUFFbEJsQyxRQUFBQSxJQUFJLEVBQUU7QUFGWSxPQUFuQjtBQUlBLEtBTE0sTUFLQSxJQUFJckcsTUFBSixFQUFZO0FBQ2xCLFVBQUk7QUFDSCxZQUFJdEIsUUFBUSxDQUFDZ04sVUFBVCxXQUF1Qm5ELGNBQXZCLE9BQUosRUFBK0M7QUFDOUNJLFVBQUFBLGdCQUFnQixHQUFHO0FBQ2xCNEMsWUFBQUEsS0FBSyxFQUFFaEQsY0FEVztBQUVsQmxDLFlBQUFBLElBQUksRUFBRTtBQUZZLFdBQW5CO0FBSUE7QUFDRCxPQVBELENBT0UsT0FBTzNKLENBQVAsRUFBVTtBQUNYaU0sUUFBQUEsZ0JBQWdCLEdBQUdsRyxTQUFuQjtBQUNBO0FBQ0Q7O0FBQ0QsV0FBT2tHLGdCQUFQO0FBQ0E7O0FBa0VELFdBQVNYLGdCQUFULENBQTBCMkQsWUFBMUIsRUFBaUQ7QUFDaEQsUUFBTUMsV0FBZ0IsR0FBRyxFQUF6Qjs7QUFDQSxRQUFJRCxZQUFZLElBQUlBLFlBQVksQ0FBQ2hJLFFBQWIsQ0FBc0IzRyxNQUF0QixHQUErQixDQUFuRCxFQUFzRDtBQUNyRCxVQUFNMkcsUUFBUSxHQUFHZ0ksWUFBWSxDQUFDaEksUUFBOUI7O0FBQ0EsV0FBSyxJQUFJa0ksUUFBUSxHQUFHLENBQXBCLEVBQXVCQSxRQUFRLEdBQUdsSSxRQUFRLENBQUMzRyxNQUEzQyxFQUFtRDZPLFFBQVEsRUFBM0QsRUFBK0Q7QUFDOUQsWUFBTXpFLGVBQWUsR0FBR3pELFFBQVEsQ0FBQ2tJLFFBQUQsQ0FBaEM7QUFDQSxZQUFJQyxRQUFRLEdBQUcxRSxlQUFlLENBQUNJLFlBQWhCLENBQTZCLEtBQTdCLEtBQXVDSixlQUFlLENBQUNJLFlBQWhCLENBQTZCLElBQTdCLENBQXREOztBQUNBLFlBQUlzRSxRQUFKLEVBQWM7QUFDYkEsVUFBQUEsUUFBUSx1QkFBZ0JBLFFBQWhCLENBQVI7QUFDQTFFLFVBQUFBLGVBQWUsQ0FBQzJFLFlBQWhCLENBQTZCLEtBQTdCLEVBQW9DRCxRQUFwQztBQUNBRixVQUFBQSxXQUFXLENBQUNFLFFBQUQsQ0FBWCxHQUF3QjtBQUN2QkUsWUFBQUEsR0FBRyxFQUFFRixRQURrQjtBQUV2QkcsWUFBQUEsUUFBUSxFQUFFO0FBQ1RDLGNBQUFBLFNBQVMsRUFBRTlFLGVBQWUsQ0FBQ0ksWUFBaEIsQ0FBNkIsV0FBN0IsQ0FERjtBQUVUMkUsY0FBQUEsTUFBTSxFQUFFL0UsZUFBZSxDQUFDSSxZQUFoQixDQUE2QixRQUE3QjtBQUZDLGFBRmE7QUFNdkI0QixZQUFBQSxJQUFJLEVBQUU7QUFOaUIsV0FBeEI7QUFRQTtBQUNEO0FBQ0Q7O0FBQ0QsV0FBT3dDLFdBQVA7QUFDQTs7QUE4RkQsV0FBU3hHLFlBQVQsQ0FDQzNFLGFBREQsRUFFQzJMLHFCQUZELEVBR0MzTixLQUhELEVBS0U7QUFBQSxRQUREK0UsaUJBQ0MsdUVBRDRCLEtBQzVCOztBQUNELFFBQUlsRCxNQUFNLENBQUNDLElBQVAsQ0FBWUUsYUFBWixFQUEyQnpELE1BQTNCLEdBQW9DLENBQXhDLEVBQTJDO0FBQzFDc0QsTUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlFLGFBQVosRUFBMkJXLE9BQTNCLENBQW1DLFVBQVUyRixnQkFBVixFQUFvQztBQUN0RSxZQUFNc0YsbUJBQW1CLEdBQUc1TCxhQUFhLENBQUNzRyxnQkFBRCxDQUF6Qzs7QUFDQSxZQUFJdEksS0FBSyxLQUFLLElBQVYsSUFBa0JBLEtBQUssS0FBS2dFLFNBQTVCLElBQXlDNEosbUJBQTdDLEVBQWtFO0FBQ2pFLGNBQU1oRixTQUFTLEdBQUcvQyxRQUFRLENBQUNnRCxlQUFULENBQXlCN0ksS0FBSyxDQUFDOEksWUFBL0IsRUFBNkNSLGdCQUE3QyxDQUFsQjtBQUNBLGNBQUl1RixhQUFhLEdBQUdELG1CQUFtQixDQUFDbEksaUJBQXhDOztBQUNBLGlCQUFPbUksYUFBUCxFQUFzQjtBQUNyQixnQkFBTTFGLFVBQVUsR0FBRzBGLGFBQWEsQ0FBQ3pGLGtCQUFqQztBQUNBUSxZQUFBQSxTQUFTLENBQUNLLFdBQVYsQ0FBc0I0RSxhQUF0QjtBQUNBQSxZQUFBQSxhQUFhLEdBQUcxRixVQUFoQjtBQUNBOztBQUNELGNBQUlHLGdCQUFnQixLQUFLLFlBQXJCLElBQXFDQSxnQkFBZ0IsS0FBSyxZQUE5RCxFQUE0RTtBQUMzRSxnQkFBTXdGLFNBQVMsR0FDYkgscUJBQXFCLENBQUNyRixnQkFBRCxDQUFyQixJQUEyQ3FGLHFCQUFxQixDQUFDckYsZ0JBQUQsQ0FBckIsQ0FBd0NJLElBQXBGLElBQTZGSixnQkFEOUY7QUFFQSxnQkFBTXlGLGNBQWMsR0FBRy9OLEtBQUssQ0FBQ2dPLGFBQU4sc0JBQWtDRixTQUFsQyxRQUF2Qjs7QUFDQSxnQkFBSUMsY0FBSixFQUFvQjtBQUNuQkEsY0FBQUEsY0FBYyxDQUFDckgsV0FBZixPQUFBcUgsY0FBYyxxQkFBaUJuRixTQUFTLENBQUMxRCxRQUEzQixFQUFkO0FBQ0E7QUFDRCxXQVBELE1BT08sSUFBSUgsaUJBQWlCLElBQUk2RCxTQUFTLENBQUMxRCxRQUFWLENBQW1CM0csTUFBbkIsR0FBNEIsQ0FBckQsRUFBd0Q7QUFDOUR5QixZQUFBQSxLQUFLLENBQUNpSixXQUFOLENBQWtCTCxTQUFsQjtBQUNBO0FBQ0Q7QUFDRCxPQXJCRDtBQXNCQTtBQUNEOztBQXVSRCxXQUFTd0IsZ0JBQVQsQ0FBMEI1SixTQUExQixFQUEwQ1AsUUFBMUMsRUFBeURnTyxJQUF6RCxFQUFvRXhOLGlCQUFwRSxFQUE0RjtBQUMzRixRQUFNNEssSUFBSSxHQUFHNEMsSUFBSSxDQUFDM04sSUFBTCxJQUFhMk4sSUFBSSxDQUFDbkIsS0FBbEIsSUFBMkI5SSxTQUF4Qzs7QUFFQSxRQUFJdkQsaUJBQWlCLENBQUM0SyxJQUFELENBQXJCLEVBQTZCO0FBQzVCLGFBRDRCLENBQ3BCO0FBQ1I7O0FBQ0QsUUFBSTtBQUNILFVBQUkxSCxZQUFZLEdBQUdzSyxJQUFJLENBQUNyRyxJQUF4Qjs7QUFDQSxVQUFJcUcsSUFBSSxDQUFDbkIsS0FBTCxJQUFjLElBQWxCLEVBQXdCO0FBQ3ZCbkosUUFBQUEsWUFBWSxhQUFNc0ssSUFBSSxDQUFDbkIsS0FBWCxjQUFvQm5KLFlBQXBCLENBQVo7QUFDQTs7QUFDRCxVQUFNdUssUUFBUSxHQUFHak8sUUFBUSxDQUFDVSxXQUFULEVBQWpCOztBQUNBLFVBQUlzTixJQUFJLENBQUNuQixLQUFMLEtBQWUsa0JBQWYsSUFBcUNtQixJQUFJLENBQUNyRyxJQUFMLENBQVVySixNQUFWLEdBQW1CLENBQTVELEVBQStEO0FBQzlEaUMsUUFBQUEsU0FBUyxDQUFDNkssSUFBRCxDQUFULEdBQWtCNkMsUUFBUSxDQUFDdE4sTUFBVCxDQUFnQnFOLElBQUksQ0FBQ25CLEtBQXJCLEVBQTRCRyxVQUE1QixDQUF1Q2dCLElBQUksQ0FBQ3JHLElBQTVDLEVBQWtEc0csUUFBUSxDQUFDN0QsZUFBVCxDQUF5QjRELElBQUksQ0FBQ25CLEtBQTlCLENBQWxELENBQWxCLENBRDhELENBQzZDO0FBQzNHLE9BRkQsTUFFTyxJQUFJLENBQUNvQixRQUFRLENBQUM3RCxlQUFULENBQXlCNEQsSUFBSSxDQUFDbkIsS0FBOUIsQ0FBRCxJQUF5Q29CLFFBQVEsQ0FBQ3ROLE1BQVQsQ0FBZ0JxTixJQUFJLENBQUNuQixLQUFyQixDQUE3QyxFQUEwRTtBQUNoRnRNLFFBQUFBLFNBQVMsQ0FBQzZLLElBQUQsQ0FBVCxHQUFrQjZDLFFBQVEsQ0FBQ3ROLE1BQVQsQ0FBZ0JxTixJQUFJLENBQUNuQixLQUFyQixFQUE0QkcsVUFBNUIsQ0FBdUNnQixJQUFJLENBQUNyRyxJQUE1QyxDQUFsQixDQURnRixDQUNYO0FBQ3JFLE9BRk0sTUFFQTtBQUNOcEgsUUFBQUEsU0FBUyxDQUFDNkssSUFBRCxDQUFULEdBQWtCcEwsUUFBUSxDQUFDZ04sVUFBVCxDQUFvQnRKLFlBQXBCLENBQWxCLENBRE0sQ0FDK0M7QUFDckQ7O0FBRURsRCxNQUFBQSxpQkFBaUIsQ0FBQzRLLElBQUQsQ0FBakIsR0FBMEI3SyxTQUFTLENBQUM2SyxJQUFELENBQW5DLENBZEcsQ0Fjd0M7QUFDM0MsS0FmRCxDQWVFLE9BQU84QyxFQUFQLEVBQVcsQ0FDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFdBQVNDLHFCQUFULENBQStCck8sdUJBQS9CLEVBQXVGO0FBQzdGc08sSUFBQUEsZUFBZSxDQUFDQyxNQUFoQixDQUNDLFVBQUN0TyxLQUFELEVBQWlCQyxRQUFqQjtBQUFBLGFBQXlDSCxvQkFBb0IsQ0FBQ0MsdUJBQUQsRUFBMEJDLEtBQTFCLEVBQWlDQyxRQUFqQyxDQUE3RDtBQUFBLEtBREQsRUFFQ0YsdUJBQXVCLENBQUNNLFNBRnpCLEVBR0NOLHVCQUF1QixDQUFDd08sTUFBeEIsSUFBa0N4Tyx1QkFBdUIsQ0FBQ08sSUFIM0Q7O0FBS0EsUUFBSVAsdUJBQXVCLENBQUN5TyxlQUE1QixFQUE2QztBQUM1Q0gsTUFBQUEsZUFBZSxDQUFDQyxNQUFoQixDQUNDLFVBQUN0TyxLQUFELEVBQWlCQyxRQUFqQjtBQUFBLGVBQXlDSCxvQkFBb0IsQ0FBQ0MsdUJBQUQsRUFBMEJDLEtBQTFCLEVBQWlDQyxRQUFqQyxFQUEyQyxJQUEzQyxDQUE3RDtBQUFBLE9BREQsRUFFQ0YsdUJBQXVCLENBQUN5TyxlQUZ6QixFQUdDek8sdUJBQXVCLENBQUN3TyxNQUF4QixJQUFrQ3hPLHVCQUF1QixDQUFDTyxJQUgzRDtBQUtBO0FBQ0Q7Ozs7QUFFRCxXQUFTa0csY0FBVCxDQUF3QmlJLGFBQXhCLEVBQWlEQyxXQUFqRCxFQUFzRUMsY0FBdEUsRUFBdUc7QUFDdEcsUUFBTUMsV0FBVyxHQUFHSCxhQUFhLENBQUNJLEdBQWQsQ0FBa0IsVUFBQ0MsWUFBRDtBQUFBLGFBQWtCQyxHQUFsQiw4RkFBdUNDLHVCQUF1QixDQUFDRixZQUFELENBQTlEO0FBQUEsS0FBbEIsQ0FBcEI7QUFDQSxRQUFJRyxjQUFjLEdBQUcsRUFBckI7O0FBQ0EsUUFBSU4sY0FBSixFQUFvQjtBQUNuQk0sTUFBQUEsY0FBYyxHQUFHRixHQUFILCtPQUU0QkcsU0FBUyxDQUFDQyxJQUFJLENBQUNDLFNBQUwsQ0FBZVQsY0FBZixFQUErQixJQUEvQixFQUFxQyxDQUFyQyxDQUFELENBRnJDLENBQWQ7QUFJQTs7QUFDRCxXQUFPSSxHQUFQLGdhQUNLSCxXQURMLEVBSzBDTSxTQUFTLENBQUNSLFdBQUQsQ0FMbkQsRUFPTU8sY0FQTjtBQVVBOztBQUVELE1BQU1sTCxPQUE0QixHQUFHLEVBQXJDOztBQUNBLFdBQVNMLFVBQVQsQ0FBb0JyRixNQUFwQixFQUFpQztBQUNoQyxRQUFNZ1IsV0FBVyxtQkFBWUMsR0FBRyxFQUFmLENBQWpCO0FBQ0F2TCxJQUFBQSxPQUFPLENBQUNzTCxXQUFELENBQVAsR0FBdUJoUixNQUF2QjtBQUNBLFdBQU9nUixXQUFQO0FBQ0E7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBUzFKLGNBQVQsQ0FBd0I0SixTQUF4QixFQUFrRjtBQUFBLFFBQXZDQyxvQkFBdUMsdUVBQWhCLEtBQWdCOztBQUNqRixRQUFJQSxvQkFBSixFQUEwQjtBQUN6QkQsTUFBQUEsU0FBUyxzVUFLaUZBLFNBTGpGLGdCQUFUO0FBTUE7O0FBQ0QsUUFBTUUsV0FBVyxHQUFHeEUsaUJBQWlCLENBQUN5RSxlQUFsQixDQUFrQ0gsU0FBbEMsRUFBNkMsVUFBN0MsQ0FBcEI7QUFDQSxRQUFJSSxNQUFNLEdBQUdGLFdBQVcsQ0FBQy9KLGlCQUF6Qjs7QUFDQSxXQUFPLFlBQUFpSyxNQUFNLFVBQU4sMENBQVF0SixTQUFSLE1BQXNCLFVBQTdCLEVBQXlDO0FBQUE7O0FBQ3hDc0osTUFBQUEsTUFBTSxHQUFHQSxNQUFNLENBQUNqSyxpQkFBaEI7QUFDQTs7QUFDRCxXQUFPaUssTUFBUDtBQUNBO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTVCxTQUFULENBQW1CVSxHQUFuQixFQUF3QztBQUN2QyxXQUFPQSxHQUFHLENBQ1JDLE9BREssQ0FDRyxJQURILEVBQ1MsT0FEVCxFQUVMQSxPQUZLLENBRUcsSUFGSCxFQUVTLE1BRlQsRUFHTEEsT0FISyxDQUdHLEtBSEgsRUFHVSxPQUhWLEVBSUxBLE9BSkssQ0FJRyxLQUpILEVBSVUsS0FKVixFQUtMQSxPQUxLLENBS0csSUFMSCxFQUtTLE1BTFQsRUFNTEEsT0FOSyxDQU1HLElBTkgsRUFNUyxRQU5ULEVBT0xBLE9BUEssQ0FPRyxJQVBILEVBT1MsUUFQVCxDQUFQO0FBUUE7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFdBQVNiLHVCQUFULENBQWlDYyxHQUFqQyxFQUFzRDtBQUNyRCxXQUFPQSxHQUFHLElBQUlBLEdBQUcsQ0FBQ0QsT0FBSixDQUFZLElBQVosRUFBa0IsT0FBbEIsRUFBMkJBLE9BQTNCLENBQW1DLElBQW5DLEVBQXlDLE1BQXpDLENBQWQ7QUFDQTtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxNQUFNZCxHQUFHLEdBQUcsVUFBQ2dCLE9BQUQsRUFBcUQ7QUFDdkUsUUFBSUMsTUFBTSxHQUFHLEVBQWI7QUFDQSxRQUFJMVIsQ0FBSjs7QUFGdUUsc0NBQWxCRCxNQUFrQjtBQUFsQkEsTUFBQUEsTUFBa0I7QUFBQTs7QUFHdkUsU0FBS0MsQ0FBQyxHQUFHLENBQVQsRUFBWUEsQ0FBQyxHQUFHRCxNQUFNLENBQUNFLE1BQXZCLEVBQStCRCxDQUFDLEVBQWhDLEVBQW9DO0FBQUE7O0FBQ25DMFIsTUFBQUEsTUFBTSxJQUFJRCxPQUFPLENBQUN6UixDQUFELENBQWpCLENBRG1DLENBRW5DOztBQUNBLFVBQUkwRyxLQUFLLENBQUNpTCxPQUFOLENBQWM1UixNQUFNLENBQUNDLENBQUQsQ0FBcEIsS0FBNEJELE1BQU0sQ0FBQ0MsQ0FBRCxDQUFOLENBQVVDLE1BQVYsR0FBbUIsQ0FBL0MsSUFBb0QsT0FBT0YsTUFBTSxDQUFDQyxDQUFELENBQU4sQ0FBVSxDQUFWLENBQVAsS0FBd0IsUUFBaEYsRUFBMEY7QUFDekYwUixRQUFBQSxNQUFNLElBQUkzUixNQUFNLENBQUNDLENBQUQsQ0FBTixDQUFVNFIsSUFBVixDQUFlLENBQWYsRUFBa0JDLElBQWxCLENBQXVCLElBQXZCLEVBQTZCL0osSUFBN0IsRUFBVjtBQUNBLE9BRkQsTUFFTyxpQkFBSS9ILE1BQU0sQ0FBQ0MsQ0FBRCxDQUFWLHNDQUFJLFVBQVc4UixLQUFmLEVBQXNCO0FBQzVCLFlBQU1DLGtCQUFrQixHQUFHQyxpQkFBaUIsQ0FBQ2pTLE1BQU0sQ0FBQ0MsQ0FBRCxDQUFQLENBQTVDO0FBQ0EwUixRQUFBQSxNQUFNLElBQUlLLGtCQUFrQixLQUFLck0sU0FBdkIsR0FBbUNnTCx1QkFBdUIsQ0FBQ3FCLGtCQUFELENBQTFELEdBQWlGck0sU0FBM0Y7QUFDQSxPQUhNLE1BR0Esa0JBQUkzRixNQUFNLENBQUNDLENBQUQsQ0FBVix1Q0FBSSxXQUFXOEcsV0FBZixFQUE0QjtBQUNsQzRLLFFBQUFBLE1BQU0sSUFBSTNSLE1BQU0sQ0FBQ0MsQ0FBRCxDQUFOLENBQVU4RyxXQUFWLEVBQVY7QUFDQSxPQUZNLE1BRUEsSUFBSSxPQUFPL0csTUFBTSxDQUFDQyxDQUFELENBQWIsS0FBcUIsUUFBekIsRUFBbUM7QUFBQTs7QUFDekMsNkJBQUksY0FBQUQsTUFBTSxDQUFDQyxDQUFELENBQU4sRUFBVTRFLEdBQWQsMENBQUksK0JBQWdCLHNCQUFoQixDQUFKLEVBQTZDO0FBQzVDOE0sVUFBQUEsTUFBTSxJQUFJM1IsTUFBTSxDQUFDQyxDQUFELENBQU4sQ0FBVXVKLE9BQVYsRUFBVjtBQUNBLFNBRkQsTUFFTztBQUNOLGNBQU0wSSxXQUFXLEdBQUc3TSxVQUFVLENBQUNyRixNQUFNLENBQUNDLENBQUQsQ0FBUCxDQUE5QjtBQUNBMFIsVUFBQUEsTUFBTSxjQUFPTyxXQUFQLENBQU47QUFDQTtBQUNELE9BUE0sTUFPQSxJQUFJbFMsTUFBTSxDQUFDQyxDQUFELENBQU4sSUFBYSxPQUFPRCxNQUFNLENBQUNDLENBQUQsQ0FBYixLQUFxQixRQUFsQyxJQUE4QyxDQUFDRCxNQUFNLENBQUNDLENBQUQsQ0FBTixDQUFVMk4sVUFBVixDQUFxQixHQUFyQixDQUEvQyxJQUE0RSxDQUFDNU4sTUFBTSxDQUFDQyxDQUFELENBQU4sQ0FBVTJOLFVBQVYsQ0FBcUIsTUFBckIsQ0FBakYsRUFBK0c7QUFDckgrRCxRQUFBQSxNQUFNLElBQUloQix1QkFBdUIsQ0FBQzNRLE1BQU0sQ0FBQ0MsQ0FBRCxDQUFQLENBQWpDO0FBQ0EsT0FGTSxNQUVBO0FBQ04wUixRQUFBQSxNQUFNLElBQUkzUixNQUFNLENBQUNDLENBQUQsQ0FBaEI7QUFDQTtBQUNEOztBQUNEMFIsSUFBQUEsTUFBTSxJQUFJRCxPQUFPLENBQUN6UixDQUFELENBQWpCO0FBQ0EwUixJQUFBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQzVKLElBQVAsRUFBVDs7QUFDQSxRQUFJRSxXQUFKLEVBQWlCO0FBQ2hCLFVBQU1rSyxTQUFTLEdBQUc3SyxjQUFjLENBQUNxSyxNQUFELEVBQVMsSUFBVCxDQUFoQzs7QUFDQSxVQUFJUSxTQUFTLElBQUksQ0FBQUEsU0FBUyxTQUFULElBQUFBLFNBQVMsV0FBVCxZQUFBQSxTQUFTLENBQUVuSyxTQUFYLE1BQXlCLGFBQTFDLEVBQXlEO0FBQ3hELFlBQU15SSxZQUFZLEdBQUkwQixTQUFELENBQW1CQyxTQUFuQixJQUFpQ0QsU0FBRCxDQUFtQkUsU0FBeEU7QUFDQSxlQUFPbEssY0FBYyxDQUFDLENBQUNzSSxZQUFZLENBQUM2QixLQUFiLENBQW1CLElBQW5CLEVBQXlCLENBQXpCLENBQUQsQ0FBRCxFQUFnQ1gsTUFBaEMsQ0FBckI7QUFDQTtBQUNEOztBQUNELFdBQU9BLE1BQVA7QUFDQSxHQXBDTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuXHRCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrQmFzZSxcblx0QnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvbWFjcm9zL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgVHJhY2VJbmZvIGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuXG5jb25zdCBMT0dHRVJfU0NPUEUgPSBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLkJ1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcbmxldCBpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXG50eXBlIFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPjtcblx0bWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24+O1xuXHRpc09wZW46IGJvb2xlYW47XG5cdGRlZmF1bHRBZ2dyZWdhdGlvbj86IHN0cmluZztcbn07XG5cbnR5cGUgSUNhbGxiYWNrID0ge1xuXHRnZXRTZXR0aW5ncygpOiBhbnk7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge05vZGV9IG9Ob2RlXG5cdCAqICAgVGhlIFhNTCBET00gbm9kZVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0ZyYWdtZW50TmFtZVxuXHQgKiAgIHRoZSBmcmFnbWVudCdzIHJlc29sdmVkIG5hbWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBvRWxlbWVudFxuXHQgKiAgIHRoZSBYTUwgRE9NIGVsZW1lbnQsIGUuZy4gPHNhcC51aS5jb3JlOkZyYWdtZW50PiBvciA8Y29yZTpFeHRlbnNpb25Qb2ludD5cblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS51dGlsLl93aXRofSBvV2l0aENvbnRyb2xcblx0ICogICB0aGUgcGFyZW50J3MgXCJ3aXRoXCIgY29udHJvbFxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogYW55KTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGUob05vZGU6IEVsZW1lbnQsIG9BdHRyaWJ1dGU6IEF0dHIpOiBQcm9taXNlPHZvaWQ+O1xuXHR2aXNpdENoaWxkTm9kZXMob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogSW50ZXJwcmV0cyB0aGUgZ2l2ZW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWUgYXMgYSBiaW5kaW5nIGFuZCByZXR1cm5zIHRoZVxuXHQgKiByZXN1bHRpbmcgdmFsdWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVmFsdWVcblx0ICogICBBbiBYTUwgRE9NIGF0dHJpYnV0ZSB2YWx1ZVxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IFtvRWxlbWVudF1cblx0ICogICBUaGUgWE1MIERPTSBlbGVtZW50IHRoZSBhdHRyaWJ1dGUgdmFsdWUgYmVsb25ncyB0byAobmVlZGVkIG9ubHkgZm9yXG5cdCAqICAgd2FybmluZ3Mgd2hpY2ggYXJlIGxvZ2dlZCB0byB0aGUgY29uc29sZSlcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfG51bGx9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHRpbmcgdmFsdWUsIG9yIGlzIHJlamVjdGVkIHdpdGggYVxuXHQgKiAgIGNvcnJlc3BvbmRpbmcgZXJyb3IgKGZvciBleGFtcGxlLCBhbiBlcnJvciB0aHJvd24gYnkgYSBmb3JtYXR0ZXIpIG9yXG5cdCAqICAgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSB0aGUgYmluZGluZyBpcyBub3QgcmVhZHkgKGJlY2F1c2UgaXQgcmVmZXJzIHRvIGFcblx0ICogICBtb2RlbCB3aGljaCBpcyBub3QgYXZhaWxhYmxlKSAoc2luY2UgMS41Ny4wKVxuXHQgKi9cblx0Z2V0UmVzdWx0KHNWYWx1ZTogc3RyaW5nLCBlbGVtZW50PzogRWxlbWVudCk6IFByb21pc2U8YW55PiB8IG51bGw7XG5cdGdldENvbnRleHQoc1BhdGg6IHN0cmluZyk6IENvbnRleHQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlICh7QGxpbmsgc2FwLnVpLm1vZGVsLkNvbnRleHR9KVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtiUmVwbGFjZV1cblx0ICogICBXaGV0aGVyIG9ubHkgdGhlIGdpdmVuIHZhcmlhYmxlcyBhcmUga25vd24gaW4gdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2Vcblx0ICogICBpbnN0YW5jZSwgbm8gaW5oZXJpdGVkIG9uZXNcblx0ICogQHJldHVybnMge3NhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFja31cblx0ICogICBBIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbVZhcmlhYmxlc1xuXHQgKiBAcGFyYW0gYlJlcGxhY2Vcblx0ICovXG5cdFwid2l0aFwiKG1WYXJpYWJsZXM/OiBhbnksIGJSZXBsYWNlPzogYm9vbGVhbik6IElDYWxsYmFjaztcbn07XG5cbi8qKlxuICogVHlwZWd1YXJkIGZvciBjaGVja2luZyBpZiBhIGJ1aWxkaW5nIGJsb2NrIHVzZSBBUEkgMS5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb25cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNpbmcgQVBJIDEuXG4gKi9cbmZ1bmN0aW9uIGlzVjFNYWNyb0RlZihidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24pOiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBpcyBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxIHtcblx0cmV0dXJuIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAxO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChcblx0c05hbWU6IHN0cmluZyxcblx0bUNvbnRleHRzOiBhbnksXG5cdG9Db250ZXh0U2V0dGluZ3M6IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRzS2V5OiBzdHJpbmdcbikge1xuXHRjb25zdCBvQ29udGV4dCA9IG1Db250ZXh0c1tzS2V5XTtcblx0Y29uc3Qgb0NvbnRleHRPYmplY3QgPSBvQ29udGV4dD8uZ2V0T2JqZWN0KCk7XG5cblx0aWYgKG9Db250ZXh0U2V0dGluZ3MucmVxdWlyZWQgJiYgKCFvQ29udGV4dCB8fCBvQ29udGV4dE9iamVjdCA9PT0gbnVsbCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBSZXF1aXJlZCBtZXRhZGF0YUNvbnRleHQgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdCkge1xuXHRcdC8vIElmIGNvbnRleHQgb2JqZWN0IGhhcyAka2luZCBwcm9wZXJ0eSwgJFR5cGUgc2hvdWxkIG5vdCBiZSBjaGVja2VkXG5cdFx0Ly8gVGhlcmVmb3JlIHJlbW92ZSBmcm9tIGNvbnRleHQgc2V0dGluZ3Ncblx0XHRpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIka2luZFwiKSAmJiBvQ29udGV4dFNldHRpbmdzLiRraW5kKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgJGtpbmQgaXMgcGFydCBvZiB0aGUgYWxsb3dlZCBvbmVzXG5cdFx0XHRpZiAob0NvbnRleHRTZXR0aW5ncy4ka2luZC5pbmRleE9mKG9Db250ZXh0T2JqZWN0W1wiJGtpbmRcIl0pID09PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJGtpbmQnICcke29Db250ZXh0U2V0dGluZ3NbXCIka2luZFwiXX0nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRraW5kXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJFR5cGVcIikgJiYgb0NvbnRleHRTZXR0aW5ncy4kVHlwZSkge1xuXHRcdFx0Ly8gQ2hlY2sgb25seSAkVHlwZVxuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJFR5cGUuaW5kZXhPZihvQ29udGV4dE9iamVjdFtcIiRUeXBlXCJdKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRUeXBlJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJFR5cGVcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4kVHlwZVxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYWNyb1NpZ25hdHVyZShzTmFtZTogYW55LCBvTWV0YWRhdGE6IGFueSwgbUNvbnRleHRzOiBhbnksIG9Ob2RlOiBhbnkpIHtcblx0Y29uc3QgYU1ldGFkYXRhQ29udGV4dEtleXMgPSAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpKSB8fCBbXSxcblx0XHRhUHJvcGVydGllcyA9IChvTWV0YWRhdGEucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykpIHx8IFtdLFxuXHRcdG9BdHRyaWJ1dGVOYW1lczogYW55ID0ge307XG5cblx0Ly8gY29sbGVjdCBhbGwgYXR0cmlidXRlcyB0byBmaW5kIHVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9Ob2RlLmF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGlLZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IHNLZXkgPSBvTm9kZS5hdHRyaWJ1dGVzW2lLZXldLm5hbWU7XG5cdFx0b0F0dHJpYnV0ZU5hbWVzW3NLZXldID0gdHJ1ZTtcblx0fSk7XG5cblx0Ly9DaGVjayBtZXRhZGF0YUNvbnRleHRzXG5cdGFNZXRhZGF0YUNvbnRleHRLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdGNvbnN0IG9Db250ZXh0U2V0dGluZ3MgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzS2V5XTtcblxuXHRcdHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoc05hbWUsIG1Db250ZXh0cywgb0NvbnRleHRTZXR0aW5ncywgc0tleSk7XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0fSk7XG5cdC8vQ2hlY2sgcHJvcGVydGllc1xuXHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRjb25zdCBvUHJvcGVydHlTZXR0aW5ncyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NLZXldO1xuXHRcdGlmICghb05vZGUuaGFzQXR0cmlidXRlKHNLZXkpKSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5U2V0dGluZ3MucmVxdWlyZWQgJiYgIW9Qcm9wZXJ0eVNldHRpbmdzLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IGAgKyBgUmVxdWlyZWQgcHJvcGVydHkgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVOYW1lcykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0Ly8gbm8gY2hlY2sgZm9yIHByb3BlcnRpZXMgd2hpY2ggc3RhcnQgd2l0aCB1bmRlcnNjb3JlIFwiX1wiIG9yIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKHNLZXkuaW5kZXhPZihcIjpcIikgPCAwICYmICFzS2V5LnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0TG9nLndhcm5pbmcoYFVuY2hlY2tlZCBwYXJhbWV0ZXI6ICR7c05hbWV9OiAke3NLZXl9YCwgdW5kZWZpbmVkLCBMT0dHRVJfU0NPUEUpO1xuXHRcdH1cblx0fSk7XG59XG5cbmNvbnN0IFNBUF9VSV9DT1JFX0VMRU1FTlQgPSBcInNhcC51aS5jb3JlLkVsZW1lbnRcIjtcblxuY29uc3QgU0FQX1VJX01PREVMX0NPTlRFWFQgPSBcInNhcC51aS5tb2RlbC5Db250ZXh0XCI7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrIGFyZSBwcm9wZXJseSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcGFyYW0gaXNPcGVuIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIG9wZW4gb3Igbm90XG4gKiBAcmV0dXJucyBBIHNldCBvZiBjb21wbGV0ZWQgbWV0YWRhdGEgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICovXG5mdW5jdGlvbiBwcmVwYXJlTWV0YWRhdGEoYnVpbGRpbmdCbG9ja01ldGFkYXRhPzogQnVpbGRpbmdCbG9ja01ldGFkYXRhLCBpc09wZW4gPSBmYWxzZSk6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhIHtcblx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YSkge1xuXHRcdGNvbnN0IG9Qcm9wZXJ0aWVzOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvQWdncmVnYXRpb25zOiBhbnkgPSB7XG5cdFx0XHRcImRlcGVuZGVudHNcIjoge1xuXHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHR9LFxuXHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge307XG5cdFx0bGV0IGZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uO1xuXHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXS50eXBlICE9PSBTQVBfVUlfTU9ERUxfQ09OVEVYVCkge1xuXHRcdFx0XHRvUHJvcGVydGllc1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dHNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBNZXJnZSBldmVudHMgaW50byBwcm9wZXJ0aWVzIGFzIHRoZXkgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHlcblx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50cykge1xuXHRcdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAoc0V2ZW50TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0aWVzW3NFdmVudE5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50c1tzRXZlbnROYW1lXTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykge1xuXHRcdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHRpZiAob0FnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXS5pc0RlZmF1bHQpIHtcblx0XHRcdFx0XHRmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbiA9IHNQcm9wZXJ0eU5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvcGVydGllczogb1Byb3BlcnRpZXMsXG5cdFx0XHRhZ2dyZWdhdGlvbnM6IG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRkZWZhdWx0QWdncmVnYXRpb246IGZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uLFxuXHRcdFx0bWV0YWRhdGFDb250ZXh0czogb01ldGFkYXRhQ29udGV4dHMsXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7XG5cdFx0XHRcdFwiZGVwZW5kZW50c1wiOiB7XG5cdFx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImN1c3RvbURhdGFcIjoge1xuXHRcdFx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlRcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdFx0aXNPcGVuOiBpc09wZW5cblx0XHR9O1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRNZXRhZGF0YUNvbnRleHQoXG5cdG9TZXR0aW5nczogYW55LFxuXHRvTm9kZTogRWxlbWVudCxcblx0c0F0dHJpYnV0ZU5hbWU6IHN0cmluZyxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0YkRvTm90UmVzb2x2ZTogYm9vbGVhbixcblx0aXNPcGVuOiBib29sZWFuXG4pIHtcblx0bGV0IG9NZXRhZGF0YUNvbnRleHQ7XG5cdGlmICghYkRvTm90UmVzb2x2ZSAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpKSB7XG5cdFx0Y29uc3Qgc0F0dHJpYnV0ZVZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSBhcyBzdHJpbmc7XG5cdFx0bGV0IHNNZXRhUGF0aDtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0aWYgKCFvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRpZiAoc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvdWlkLS1cIikpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBteVN0b3JlW3NBdHRyaWJ1dGVWYWx1ZV07XG5cdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQXR0cmlidXRlVmFsdWUsIG9EYXRhKTtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJjb252ZXJ0ZXJDb250ZXh0XCIsXG5cdFx0XHRcdFx0cGF0aDogc0F0dHJpYnV0ZVZhbHVlXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2UgaWYgKChzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGgpIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdFx0XHRwYXRoOiBzTWV0YVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXRcblx0XHRcdFx0XHRcdD8gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQuZ2V0UGF0aChzQXR0cmlidXRlVmFsdWUpXG5cdFx0XHRcdFx0XHQ6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9TZXR0aW5nczogYW55LFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogYW55LFxuXHRvTWV0YWRhdGFDb250ZXh0czogYW55LFxuXHRhcGlWZXJzaW9uPzogbnVtYmVyXG4pIHtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0OiBhbnkgPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uUHJvcGVydGllcyk7XG5cdGxldCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRmb3IgKGNvbnN0IHNLZXlWYWx1ZSBvZiBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzKSB7XG5cdFx0aWYgKG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLnR5cGUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSB7fTsgLy8gVG8gYXZvaWQgdmFsdWVzIGJlaW5nIHJldXNlZCBhY2Nyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgIW9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0bGV0IHZWYWx1ZTogYW55ID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKGFwaVZlcnNpb24gPT09IDIgJiYgdHlwZW9mIHZWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0XHRcdHZWYWx1ZSA9IHZWYWx1ZSA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IHZWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gU29ydCBrZXlzIHRvIGJlIHN1cmUgY29udGV4dFBhdGggaXMgYmVmb3JlIG1ldGFQYXRoICggeWVzIEknbSBkZXNwZXJhdGUgKVxuXHRhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNvcnQoZnVuY3Rpb24gKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuXHR9KTtcblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdGNvbnN0IGJEb05vdFJlc29sdmUgPSBpc1B1YmxpYyAmJiAhb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKTtcblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0ID0gX2dldE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIG9Ob2RlLCBzQXR0cmlidXRlTmFtZSwgb1Zpc2l0b3IsIGJEb05vdFJlc29sdmUsIG9NZXRhZGF0YS5pc09wZW4pO1xuXHRcdGlmIChvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0Lm5hbWUgPSBzQXR0cmlidXRlTmFtZTtcblx0XHRcdGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzLCBvVmlzaXRvciwgb01ldGFkYXRhQ29udGV4dCwgb01ldGFkYXRhQ29udGV4dHMpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgJiYgIW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpKSB8fFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIiAmJiAhb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgbU1pc3NpbmdDb250ZXh0LCBwcm9wZXJ0eVZhbHVlczogcHJvcGVydHlWYWx1ZXMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlQWdncmVnYXRpb24ob0FnZ3JlZ2F0aW9uOiBFbGVtZW50KSB7XG5cdGNvbnN0IG9PdXRPYmplY3RzOiBhbnkgPSB7fTtcblx0aWYgKG9BZ2dyZWdhdGlvbiAmJiBvQWdncmVnYXRpb24uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGNoaWxkcmVuID0gb0FnZ3JlZ2F0aW9uLmNoaWxkcmVuO1xuXHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdGxldCBjaGlsZEtleSA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikgfHwgY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXHRcdFx0aWYgKGNoaWxkS2V5KSB7XG5cdFx0XHRcdGNoaWxkS2V5ID0gYElubGluZVhNTF8ke2NoaWxkS2V5fWA7XG5cdFx0XHRcdGNoaWxkRGVmaW5pdGlvbi5zZXRBdHRyaWJ1dGUoXCJrZXlcIiwgY2hpbGRLZXkpO1xuXHRcdFx0XHRvT3V0T2JqZWN0c1tjaGlsZEtleV0gPSB7XG5cdFx0XHRcdFx0a2V5OiBjaGlsZEtleSxcblx0XHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdFx0cGxhY2VtZW50OiBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwicGxhY2VtZW50XCIpLFxuXHRcdFx0XHRcdFx0YW5jaG9yOiBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiYW5jaG9yXCIpXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0eXBlOiBcIlNsb3RcIlxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gb091dE9iamVjdHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDaGlsZHJlbihcblx0b05vZGU6IEVsZW1lbnQsXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55Pixcblx0YXBpVmVyc2lvbj86IG51bWJlclxuKSB7XG5cdGNvbnN0IG9BZ2dyZWdhdGlvbnM6IGFueSA9IHt9O1xuXHRpZiAob05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRsZXQgb0ZpcnN0RWxlbWVudENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdGlmIChhcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRcdGNvbnN0IHNDaGlsZE5hbWUgPSBvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lO1xuXHRcdFx0XHRsZXQgc0FnZ3JlZ2F0aW9uTmFtZSA9IHNDaGlsZE5hbWU7XG5cdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0XHQvLyBub3QgYSBzdWIgYWdncmVnYXRpb24sIGdvIGJhY2sgdG8gZGVmYXVsdCBBZ2dyZWdhdGlvblxuXHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWUgPSBvTWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uIHx8IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWZpbml0aW9uID0gb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiAmJiAhYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJzZWRBZ2dyZWdhdGlvbiA9IHBhcnNlQWdncmVnYXRpb24ob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gcGFyc2VkQWdncmVnYXRpb247XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBwYXJzZWRBZ2dyZWdhdGlvbktleSBpbiBwYXJzZWRBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRcdFx0b01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1twYXJzZWRBZ2dyZWdhdGlvbktleV0gPSBwYXJzZWRBZ2dyZWdhdGlvbltwYXJzZWRBZ2dyZWdhdGlvbktleV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGFwaVZlcnNpb24gIT09IDIpIHtcblx0XHRcdC8vIElmIHRoZXJlIGFyZSBhZ2dyZWdhdGlvbiB3ZSBuZWVkIHRvIHZpc2l0IHRoZSBjaGlsZE5vZGVzIHRvIHJlc29sdmUgdGVtcGxhdGluZyBpbnN0cnVjdGlvbnNcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Q2hpbGROb2RlcyhvTm9kZSk7XG5cdFx0fVxuXHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdHdoaWxlIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IG9OZXh0Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdGNvbnN0IHNDaGlsZE5hbWUgPSBvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lO1xuXHRcdFx0bGV0IHNBZ2dyZWdhdGlvbk5hbWUgPSBzQ2hpbGROYW1lO1xuXHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gc0FnZ3JlZ2F0aW9uTmFtZVswXSkge1xuXHRcdFx0XHQvLyBub3QgYSBzdWIgYWdncmVnYXRpb24sIGdvIGJhY2sgdG8gZGVmYXVsdCBBZ2dyZWdhdGlvblxuXHRcdFx0XHRzQWdncmVnYXRpb25OYW1lID0gb01ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiB8fCBcIlwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRPYmplY3Qua2V5cyhvTWV0YWRhdGEuYWdncmVnYXRpb25zKS5pbmRleE9mKHNBZ2dyZWdhdGlvbk5hbWUpICE9PSAtMSAmJlxuXHRcdFx0XHQoIWlzUHVibGljIHx8IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uaXNQdWJsaWMpXG5cdFx0XHQpIHtcblx0XHRcdFx0aWYgKGFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZmluaXRpb24gPSBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRcdGlmICghYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QgJiYgb0ZpcnN0RWxlbWVudENoaWxkICYmIG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRcdGxldCBjaGlsZERlZmluaXRpb24gPSBvRmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdFx0XHR3aGlsZSAoY2hpbGREZWZpbml0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV4dENoaWxkID0gY2hpbGREZWZpbml0aW9uLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0XHRcdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKGNoaWxkRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSFdID0gb05ld0NoaWxkO1xuXHRcdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24ucmVtb3ZlQXR0cmlidXRlKFwia2V5XCIpO1xuXHRcdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24gPSBuZXh0Q2hpbGQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCkge1xuXHRcdFx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IHNDaGlsZE5hbWUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKCFvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9OZXdDaGlsZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmFwcGVuZENoaWxkKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRvQWdncmVnYXRpb25zW29GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKS5pbmRleE9mKHNBZ2dyZWdhdGlvbk5hbWUpICE9PSAtMSkge1xuXHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0Ly8gT2JqZWN0IFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IHt9O1xuXHRcdFx0XHRmb3IgKGNvbnN0IGF0dHJpYnV0ZUluZGV4IG9mIE9iamVjdC5rZXlzKG9GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzKSkge1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdW29GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0ubG9jYWxOYW1lXSA9XG5cdFx0XHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlc1thdHRyaWJ1dGVJbmRleCBhcyBhbnldLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9OZXh0Q2hpbGQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvQWdncmVnYXRpb25zO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzU2xvdHMoXG5cdG9BZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG5cdG9NZXRhZGF0YUFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj4sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRwcm9jZXNzQ3VzdG9tRGF0YTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcblx0aWYgKE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGNvbnN0IG9BZ2dyZWdhdGlvbkVsZW1lbnQgPSBvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0aWYgKG9Ob2RlICE9PSBudWxsICYmIG9Ob2RlICE9PSB1bmRlZmluZWQgJiYgb0FnZ3JlZ2F0aW9uRWxlbWVudCkge1xuXHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lKTtcblx0XHRcdFx0bGV0IG9FbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR3aGlsZSAob0VsZW1lbnRDaGlsZCkge1xuXHRcdFx0XHRcdGNvbnN0IG9OZXh0Q2hpbGQgPSBvRWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0XHRvTmV3Q2hpbGQuYXBwZW5kQ2hpbGQob0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0VsZW1lbnRDaGlsZCA9IG9OZXh0Q2hpbGQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiY3VzdG9tRGF0YVwiICYmIHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiZGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1Nsb3ROYW1lID1cblx0XHRcdFx0XHRcdChvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8IHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEVsZW1lbnQgPSBvTm9kZS5xdWVyeVNlbGVjdG9yKGBzbG90W25hbWU9JyR7c1Nsb3ROYW1lfSddYCkgYXMgRWxlbWVudDtcblx0XHRcdFx0XHRpZiAob1RhcmdldEVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdG9UYXJnZXRFbGVtZW50LnJlcGxhY2VXaXRoKC4uLihvTmV3Q2hpbGQuY2hpbGRyZW4gYXMgYW55KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHByb2Nlc3NDdXN0b21EYXRhICYmIG9OZXdDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b05vZGUuYXBwZW5kQ2hpbGQob05ld0NoaWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCdWlsZGluZ0Jsb2NrKFxuXHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRpc1B1YmxpYyA9IGZhbHNlXG4pIHtcblx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50IHx8IGAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lfWA7XG5cblx0Y29uc3Qgc05hbWUgPSBcInRoaXNcIjtcblxuXHRjb25zdCBtQ29udGV4dHM6IGFueSA9IHt9O1xuXHRjb25zdCBvTWV0YWRhdGFDb250ZXh0czogYW55ID0ge307XG5cdGNvbnN0IG9TZXR0aW5ncyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cdC8vIFRPRE8gMDAwMSBNb3ZlIHRoaXMgZWxzZXdoZXJlIHRoaXMgaXMgd2VpcmQgOilcblx0aWYgKG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXSkge1xuXHRcdG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXVxuXHRcdFx0LmdldFJlc291cmNlQnVuZGxlKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRSZXNvdXJjZU1vZGVsLnNldEFwcGxpY2F0aW9uSTE4bkJ1bmRsZShvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01ldGFkYXRhID0gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm1ldGFkYXRhLCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5pc09wZW4pO1xuXG5cdC8vSW5qZWN0IHN0b3JhZ2UgZm9yIG1hY3Jvc1xuXHRpZiAoIW9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSkge1xuXHRcdG9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSA9IHt9O1xuXHR9XG5cblx0Ly8gRmlyc3Qgb2YgYWxsIHdlIG5lZWQgdG8gdmlzaXQgdGhlIGF0dHJpYnV0ZXNcblx0Y29uc3QgeyBtTWlzc2luZ0NvbnRleHQsIHByb3BlcnR5VmFsdWVzIH0gPSBhd2FpdCBwcm9jZXNzUHJvcGVydGllcyhcblx0XHRvTWV0YWRhdGEsXG5cdFx0b1NldHRpbmdzLFxuXHRcdG9Ob2RlLFxuXHRcdGlzUHVibGljLFxuXHRcdG9WaXNpdG9yLFxuXHRcdG1Db250ZXh0cyxcblx0XHRvTWV0YWRhdGFDb250ZXh0cyxcblx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uXG5cdCk7XG5cdGNvbnN0IGluaXRpYWxLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZXMpO1xuXHR0cnkge1xuXHRcdC8vIEFnZ3JlZ2F0aW9uIGFuZCBjb21wbGV4IHR5cGUgc3VwcG9ydFxuXHRcdGNvbnN0IG9BZ2dyZWdhdGlvbnMgPSBhd2FpdCBwcm9jZXNzQ2hpbGRyZW4oXG5cdFx0XHRvTm9kZSxcblx0XHRcdG9WaXNpdG9yLFxuXHRcdFx0b01ldGFkYXRhLFxuXHRcdFx0aXNQdWJsaWMsXG5cdFx0XHRwcm9wZXJ0eVZhbHVlcyxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb25cblx0XHQpO1xuXHRcdGxldCBvSW5zdGFuY2U6IGFueTtcblx0XHRsZXQgb0NvbnRyb2xDb25maWcgPSB7fTtcblxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhKSB7XG5cdFx0XHQvLyBPbmx5IHVzZWQgaW4gdGhlIEZpZWxkIG1hY3JvIGFuZCBldmVuIHRoZW4gbWF5YmUgbm90IHJlYWxseSB1c2VmdWxcblx0XHRcdG9Db250cm9sQ29uZmlnID0gb1NldHRpbmdzLm1vZGVscy52aWV3RGF0YS5nZXRQcm9wZXJ0eShcIi9jb250cm9sQ29uZmlndXJhdGlvblwiKTtcblx0XHR9XG5cdFx0bGV0IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7XG5cdFx0aWYgKGlzVjFNYWNyb0RlZihidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uY3JlYXRlKSB7XG5cdFx0XHRwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmNyZWF0ZS5jYWxsKFxuXHRcdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbixcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRcdG9Db250cm9sQ29uZmlnLFxuXHRcdFx0XHRvU2V0dGluZ3MsXG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRcdGlzUHVibGljXG5cdFx0XHQpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNNZXRhZGF0YU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc01ldGFkYXRhTmFtZV0uY29tcHV0ZWQpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc01ldGFkYXRhTmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzTWV0YWRhdGFOYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRPYmplY3Qua2V5cyhtTWlzc2luZ0NvbnRleHQpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzQ29udGV4dE5hbWVdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9EYXRhICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBKFNBUF9VSV9NT0RFTF9DT05URVhUKSAmJlxuXHRcdFx0XHRcdCFvRGF0YS5nZXRNb2RlbCgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFwiKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV0gPSBvRGF0YS5nZXRPYmplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBCdWlsZGluZ0Jsb2NrQ2xhc3MgPSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBhcyB0eXBlb2YgQnVpbGRpbmdCbG9ja0Jhc2U7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlcy5pc1B1YmxpYyA9IGlzUHVibGljO1xuXG5cdFx0XHRvSW5zdGFuY2UgPSBuZXcgQnVpbGRpbmdCbG9ja0NsYXNzKFxuXHRcdFx0XHR7IC4uLnByb3BlcnR5VmFsdWVzLCAuLi5vQWdncmVnYXRpb25zIH0sXG5cdFx0XHRcdG9Db250cm9sQ29uZmlnLFxuXHRcdFx0XHRvU2V0dGluZ3Ncblx0XHRcdFx0LyosIG9Db250cm9sQ29uZmlnLCBvU2V0dGluZ3MsIG9BZ2dyZWdhdGlvbnMsIGlzUHVibGljKi9cblx0XHRcdCk7XG5cdFx0XHRwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IG9JbnN0YW5jZS5nZXRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbiAoc0NvbnRleHROYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLmhhc093blByb3BlcnR5KHNDb250ZXh0TmFtZSkpIHtcblx0XHRcdFx0XHRsZXQgdGFyZ2V0T2JqZWN0ID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0XHRpZiAodHlwZW9mIHRhcmdldE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiAhdGFyZ2V0T2JqZWN0LmdldE9iamVjdCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0F0dHJpYnV0ZVZhbHVlID0gc3RvcmVWYWx1ZSh0YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gYCR7c0F0dHJpYnV0ZVZhbHVlfWA7XG5cdFx0XHRcdFx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoc0NvbnRleHRQYXRoLCB0YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gb1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNDb250ZXh0UGF0aCk7XG5cdFx0XHRcdFx0XHRkZWxldGUgbXlTdG9yZVtzQXR0cmlidXRlVmFsdWVdO1xuXHRcdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSB0YXJnZXRPYmplY3Q7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICghbUNvbnRleHRzLmhhc093blByb3BlcnR5KHNDb250ZXh0TmFtZSkgJiYgdGFyZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gdGFyZ2V0T2JqZWN0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGNvbnN0IG9BdHRyaWJ1dGVzTW9kZWw6IEpTT05Nb2RlbCA9IG5ldyBBdHRyaWJ1dGVNb2RlbChvTm9kZSwgcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMsIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTtcblx0XHRtQ29udGV4dHNbc05hbWVdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cblx0XHRsZXQgb1ByZXZpb3VzTWFjcm9JbmZvOiBhbnk7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvKSB7XG5cdFx0XHRcdG9QcmV2aW91c01hY3JvSW5mbyA9IG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvVHJhY2VJbmZvLm1hY3JvSW5mbztcblx0XHRcdH1cblx0XHR9XG5cdFx0dmFsaWRhdGVNYWNyb1NpZ25hdHVyZShzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHRWaXNpdG9yID0gb1Zpc2l0b3Iud2l0aChcblx0XHRcdG1Db250ZXh0cyxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIWJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzT3BlbiA6IHRydWVcblx0XHQpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGxldCBwcm9jZXNzQ3VzdG9tRGF0YSA9IHRydWU7XG5cdFx0aWYgKG9QYXJlbnQpIHtcblx0XHRcdGlDaGlsZEluZGV4ID0gQXJyYXkuZnJvbShvUGFyZW50LmNoaWxkcmVuKS5pbmRleE9mKG9Ob2RlKTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGlzVjFNYWNyb0RlZihidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUpIHx8XG5cdFx0XHRcdChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyICYmICFidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5mcmFnbWVudClcblx0XHRcdCkge1xuXHRcdFx0XHRsZXQgb1RlbXBsYXRlO1xuXHRcdFx0XHRsZXQgYWRkRGVmYXVsdE5hbWVzcGFjZSA9IGZhbHNlO1xuXHRcdFx0XHRpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpO1xuXHRcdFx0XHRcdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5pc1J1bnRpbWUpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgbXlTdG9yZUtleSBpbiBteVN0b3JlKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9EYXRhID0gbXlTdG9yZVtteVN0b3JlS2V5XTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gYCR7bXlTdG9yZUtleX1gO1xuXHRcdFx0XHRcdFx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoc0NvbnRleHRQYXRoLCBvRGF0YSk7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBteVN0b3JlW215U3RvcmVLZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhZGREZWZhdWx0TmFtZXNwYWNlID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSkge1xuXHRcdFx0XHRcdG9UZW1wbGF0ZSA9IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBoYXNFcnJvciA9IFwiXCI7XG5cdFx0XHRcdGlmIChvVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRpZiAoIW9UZW1wbGF0ZS5maXJzdEVsZW1lbnRDaGlsZCkge1xuXHRcdFx0XHRcdFx0b1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob1RlbXBsYXRlLCBhZGREZWZhdWx0TmFtZXNwYWNlKTtcblx0XHRcdFx0XHRcdC8vIEZvciBzYWZldHkgcHVycG9zZSB3ZSB0cnkgdG8gZGV0ZWN0IHRyYWlsaW5nIHRleHQgaW4gYmV0d2VlbiBYTUwgVGFnc1xuXHRcdFx0XHRcdFx0Y29uc3QgaXRlciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihvVGVtcGxhdGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcblx0XHRcdFx0XHRcdGxldCB0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdHdoaWxlICh0ZXh0bm9kZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAodGV4dG5vZGUudGV4dENvbnRlbnQgJiYgdGV4dG5vZGUudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRoYXNFcnJvciA9IHRleHRub2RlLnRleHRDb250ZW50O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvVGVtcGxhdGUubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgcGFyc2VlcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRoZSBYTUwgaXQgbWVhbnMgdGhlIFhNTCBpdHNlbGYgaXMgbWFsZm9ybWVkLCBhcyBzdWNoIHdlIHJlcnVuIHRoZSB0ZW1wbGF0ZSBwcm9jZXNzXG5cdFx0XHRcdFx0XHQvLyBTZXR0aW5nIGlzVHJhY2VNb2RlIHRydWUgd2lsbCBtYWtlIGl0IHNvIHRoYXQgZWFjaCB4bWxgIGV4cHJlc3Npb24gaXMgY2hlY2tlZCBmb3IgdmFsaWRpdHkgZnJvbSBYTUwgcGVyc3BlY3RpdmVcblx0XHRcdFx0XHRcdC8vIElmIGFuIGVycm9yIGlzIGZvdW5kIGl0J3MgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGZyYWdtZW50XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lfWApO1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0aXNUcmFjZU1vZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBvSW5zdGFuY2U/LmdldFRlbXBsYXRlXG5cdFx0XHRcdFx0XHRcdFx0PyBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUoKVxuXHRcdFx0XHRcdFx0XHRcdDogKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uIGFzIGFueSkuZ2V0VGVtcGxhdGUocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvVGVtcGxhdGUsIHRydWUpO1xuXHRcdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdFx0aXNUcmFjZU1vZGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGhhc0Vycm9yLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIHRyYWlsaW5nIHRleHQgd2UgY3JlYXRlIGEgc3RhbmRhcmQgZXJyb3IgYW5kIGRpc3BsYXkgaXQuXG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lfWApO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yVGV4dCA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0YEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lfWAsXG5cdFx0XHRcdFx0XHRcdFx0YFRyYWlsaW5nIHRleHQgd2FzIGZvdW5kIGluIHRoZSBYTUw6ICR7aGFzRXJyb3J9YFxuXHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRvVGVtcGxhdGUub3V0ZXJIVE1MXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0b1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yVGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Ob2RlLnJlcGxhY2VXaXRoKG9UZW1wbGF0ZSk7XG5cdFx0XHRcdFx0b05vZGUgPSBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XTtcblx0XHRcdFx0XHRwcm9jZXNzU2xvdHMob0FnZ3JlZ2F0aW9ucywgb01ldGFkYXRhLmFnZ3JlZ2F0aW9ucywgb05vZGUsIHByb2Nlc3NDdXN0b21EYXRhKTtcblx0XHRcdFx0XHRwcm9jZXNzQ3VzdG9tRGF0YSA9IGZhbHNlO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLnZpc2l0Tm9kZShvTm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b05vZGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IuaW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50TmFtZSwgb05vZGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG9NYWNyb0VsZW1lbnQgPSBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XTtcblx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBvTWFjcm9FbGVtZW50LCBwcm9jZXNzQ3VzdG9tRGF0YSk7XG5cdFx0XHRpZiAob01hY3JvRWxlbWVudCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRvU2xvdEVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob1ByZXZpb3VzTWFjcm9JbmZvKSB7XG5cdFx0XHQvL3Jlc3RvcmUgbWFjcm8gaW5mbyBpZiBhdmFpbGFibGVcblx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvUHJldmlvdXNNYWNyb0luZm87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdO1xuXHRcdH1cblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgYSBnZW5lcmljIGVycm9yICh1c3VhbGx5IGNvZGUgZXJyb3IpLCB3ZSByZXRyaWV2ZSB0aGUgY3VycmVudCBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYSBkZWRpY2F0ZWQgZXJyb3IgbWVzc2FnZVxuXHRcdGNvbnN0IHRyYWNlRGV0YWlscyA9IHtcblx0XHRcdGluaXRpYWxQcm9wZXJ0aWVzOiB7fSBhcyBhbnksXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIGFueSxcblx0XHRcdG1pc3NpbmdDb250ZXh0czogbU1pc3NpbmdDb250ZXh0XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBpbml0aWFsS2V5cykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlLmlzQSAmJiBwcm9wZXJ0eVZhbHVlLmlzQShTQVBfVUlfTU9ERUxfQ09OVEVYVCkpIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKCFpbml0aWFsS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlICYmIHByb3BlcnR5VmFsdWUuaXNBICYmIHByb3BlcnR5VmFsdWUuaXNBKFNBUF9VSV9NT0RFTF9DT05URVhUKSkge1xuXHRcdFx0XHRcdHRyYWNlRGV0YWlscy5yZXNvbHZlZFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHtcblx0XHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5VmFsdWUuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRyYWNlRGV0YWlscy5yZXNvbHZlZFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgZXJyb3JBbnkgPSBlIGFzIGFueTtcblx0XHRMb2cuZXJyb3IoZXJyb3JBbnksIGVycm9yQW55KTtcblx0XHRjb25zdCBvRXJyb3IgPSBjcmVhdGVFcnJvclhNTChcblx0XHRcdFtgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCwgZXJyb3JBbnkuc3RhY2tdLFxuXHRcdFx0b05vZGUub3V0ZXJIVE1MLFxuXHRcdFx0dHJhY2VEZXRhaWxzXG5cdFx0KTtcblx0XHRjb25zdCBvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3IsIHRydWUpO1xuXHRcdG9Ob2RlLnJlcGxhY2VXaXRoKG9UZW1wbGF0ZSBhcyBhbnkpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0czogYW55LCBvVmlzaXRvcjogYW55LCBvQ3R4OiBhbnksIG9NZXRhZGF0YUNvbnRleHRzOiBhbnkpIHtcblx0Y29uc3Qgc0tleSA9IG9DdHgubmFtZSB8fCBvQ3R4Lm1vZGVsIHx8IHVuZGVmaW5lZDtcblxuXHRpZiAob01ldGFkYXRhQ29udGV4dHNbc0tleV0pIHtcblx0XHRyZXR1cm47IC8vIGRvIG5vdCBhZGQgdHdpY2Vcblx0fVxuXHR0cnkge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvQ3R4LnBhdGg7XG5cdFx0aWYgKG9DdHgubW9kZWwgIT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0pOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2UgaWYgKCFtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdKSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0uZ2V0Q29udGV4dChvQ3R4LnBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2Uge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gb1Zpc2l0b3IuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9XG5cblx0XHRvTWV0YWRhdGFDb250ZXh0c1tzS2V5XSA9IG1Db250ZXh0c1tzS2V5XTsgLy8gbWFrZSBpdCBhdmFpbGFibGUgaW5zaWRlIG1ldGFkYXRhQ29udGV4dHMgSlNPTiBvYmplY3Rcblx0fSBjYXRjaCAoZXgpIHtcblx0XHQvL2NvbnNvbGUuZXJyb3IoZXgpO1xuXHRcdC8vIGlnbm9yZSB0aGUgY29udGV4dCBhcyB0aGlzIGNhbiBvbmx5IGJlIHRoZSBjYXNlIGlmIHRoZSBtb2RlbCBpcyBub3QgcmVhZHksIGkuZS4gbm90IGEgcHJlcHJvY2Vzc2luZyBtb2RlbCBidXQgbWF5YmUgYSBtb2RlbCBmb3Jcblx0XHQvLyBwcm92aWRpbmcgYWZ0ZXJ3YXJkc1xuXHRcdC8vIFRPRE8gMDAwMiBub3QgeWV0IGltcGxlbWVudGVkXG5cdFx0Ly9tQ29udGV4dHNbXCJfJGVycm9yXCJdLm9Nb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIHNLZXksIGV4KTtcblx0fVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24pOiB2b2lkIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHQob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLCBvTm9kZSwgb1Zpc2l0b3IpLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZSxcblx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZVxuXHQpO1xuXHRpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciwgdHJ1ZSksXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UsXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JYTUwoZXJyb3JNZXNzYWdlczogc3RyaW5nW10sIHhtbEZyYWdtZW50OiBzdHJpbmcsIGFkZGl0aW9uYWxEYXRhPzogb2JqZWN0KTogc3RyaW5nIHtcblx0Y29uc3QgZXJyb3JMYWJlbHMgPSBlcnJvck1lc3NhZ2VzLm1hcCgoZXJyb3JNZXNzYWdlKSA9PiB4bWxgPG06TGFiZWwgdGV4dD1cIiR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoZXJyb3JNZXNzYWdlKX1cIi8+YCk7XG5cdGxldCBhZGRpdGlvbmFsVGV4dCA9IFwiXCI7XG5cdGlmIChhZGRpdGlvbmFsRGF0YSkge1xuXHRcdGFkZGl0aW9uYWxUZXh0ID0geG1sYDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiVHJhY2UgSW5mb1wiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cImpzb25cIiB2YWx1ZT1cIiR7ZXNjYXBlWE1MKEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxEYXRhLCBudWxsLCA0KSl9XCIgaGVpZ2h0PVwiMzAwcHhcIiB3aWR0aD1cIjEwMHZoXCIvPlxuXHRcdFx0XHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiPlxuXHRcdFx0XHQke2Vycm9yTGFiZWxzfVxuXHRcdFx0XHQ8bTpIQm94PlxuXHRcdFx0XHRcdDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiSG93IHRoZSBidWlsZGluZyBibG9jayB3YXMgY2FsbGVkXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2VzY2FwZVhNTCh4bWxGcmFnbWVudCl9XCIgaGVpZ2h0PVwiMzAwcHhcIiB3aWR0aD1cIjEwMHZoXCIvPlxuXHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdCR7YWRkaXRpb25hbFRleHR9XG5cdFx0XHRcdDwvbTpIQm94PlxuXHRcdFx0PC9tOlZCb3g+YDtcbn1cblxuY29uc3QgbXlTdG9yZTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuZnVuY3Rpb24gc3RvcmVWYWx1ZSh2YWx1ZXM6IGFueSkge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGAvdWlkLS0ke3VpZCgpfWA7XG5cdG15U3RvcmVbcHJvcGVydHlVSURdID0gdmFsdWVzO1xuXHRyZXR1cm4gcHJvcGVydHlVSUQ7XG59XG5cbi8qKlxuICogUGFyc2UgYW4gWE1MIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgVGhlIHhtbCBzdHJpbmdcbiAqIEBwYXJhbSBhZGREZWZhdWx0TmFtZXNwYWNlcyBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgYWRkIGRlZmF1bHQgbmFtZXNwYWNlXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50LlxuICovXG5mdW5jdGlvbiBwYXJzZVhNTFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZywgYWRkRGVmYXVsdE5hbWVzcGFjZXMgPSBmYWxzZSk6IEVsZW1lbnQge1xuXHRpZiAoYWRkRGVmYXVsdE5hbWVzcGFjZXMpIHtcblx0XHR4bWxTdHJpbmcgPSBgPHRlbXBsYXRlXG5cdFx0XHRcdFx0XHR4bWxuczp0ZW1wbGF0ZT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCJcblx0XHRcdFx0XHRcdHhtbG5zOm09XCJzYXAubVwiXG5cdFx0XHRcdFx0XHR4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bWRjPVwic2FwLnVpLm1kY1wiXG5cdFx0XHRcdFx0XHR4bWxuczpjdXN0b21EYXRhPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiPiR7eG1sU3RyaW5nfTwvdGVtcGxhdGU+YDtcblx0fVxuXHRjb25zdCB4bWxEb2N1bWVudCA9IERPTVBhcnNlckluc3RhbmNlLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG5cdGxldCBvdXRwdXQgPSB4bWxEb2N1bWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0d2hpbGUgKG91dHB1dD8ubG9jYWxOYW1lID09PSBcInRlbXBsYXRlXCIpIHtcblx0XHRvdXRwdXQgPSBvdXRwdXQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdH1cblx0cmV0dXJuIG91dHB1dCBhcyBFbGVtZW50O1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgc3RyaW5nIHRvIGluY2x1ZGUgaXQgaW4gYW4gWE1MIGZyYWdtZW50LlxuICpcbiAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBlc2NhcGVcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlWE1MKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHN0clxuXHRcdC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcblx0XHQucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcblx0XHQucmVwbGFjZSgvXFxuL2csIFwiJiMxMDtcIilcblx0XHQucmVwbGFjZSgvXFx7L2csIFwiXFxcXHtcIilcblx0XHQucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcblx0XHQucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcblx0XHQucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiB2YWwgJiYgdmFsLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWwgd2hpbGUgaGFuZGxpbmcgc3BlY2lhbCBvYmplY3QgY2FzZS5cbiAqXG4gKiBAcGFyYW0gc3RyaW5ncyBUaGUgc3RyaW5nIHBhcnRzIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgcGFydCBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBzdHJpbmcgdGhhdCB3YXMgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHhtbCA9IChzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4udmFsdWVzOiBhbnlbXSkgPT4ge1xuXHRsZXQgb3V0U3RyID0gXCJcIjtcblx0bGV0IGk7XG5cdGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblx0XHQvLyBIYW5kbGUgdGhlIGRpZmZlcmVudCBjYXNlIG9mIG9iamVjdCwgaWYgaXQncyBhbiBhcnJheSB3ZSBqb2luIHRoZW0sIGlmIGl0J3MgYSBiaW5kaW5nIGV4cHJlc3Npb24gKGRldGVybWluZWQgYnkgX3R5cGUpIHRoZW4gd2UgY29tcGlsZSBpdC5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXNbaV0pICYmIHZhbHVlc1tpXS5sZW5ndGggPiAwICYmIHR5cGVvZiB2YWx1ZXNbaV1bMF0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZXNbaV0uZmxhdCg1KS5qb2luKFwiXFxuXCIpLnRyaW0oKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlc1tpXT8uX3R5cGUpIHtcblx0XHRcdGNvbnN0IGNvbXBpbGVkRXhwcmVzc2lvbiA9IGNvbXBpbGVFeHByZXNzaW9uKHZhbHVlc1tpXSk7XG5cdFx0XHRvdXRTdHIgKz0gY29tcGlsZWRFeHByZXNzaW9uICE9PSB1bmRlZmluZWQgPyBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShjb21waWxlZEV4cHJlc3Npb24pIDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAodmFsdWVzW2ldPy5nZXRUZW1wbGF0ZSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXS5nZXRUZW1wbGF0ZSgpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlc1tpXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0aWYgKHZhbHVlc1tpXS5pc0E/LihcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdG91dFN0ciArPSB2YWx1ZXNbaV0uZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlVSWQgPSBzdG9yZVZhbHVlKHZhbHVlc1tpXSk7XG5cdFx0XHRcdG91dFN0ciArPSBgJHtwcm9wZXJ0eVVJZH1gO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWVzW2ldICYmIHR5cGVvZiB2YWx1ZXNbaV0gPT09IFwic3RyaW5nXCIgJiYgIXZhbHVlc1tpXS5zdGFydHNXaXRoKFwiPFwiKSAmJiAhdmFsdWVzW2ldLnN0YXJ0c1dpdGgoXCImbHQ7XCIpKSB7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWVzW2ldKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChpc1RyYWNlTW9kZSkge1xuXHRcdGNvbnN0IHhtbFJlc3VsdCA9IHBhcnNlWE1MU3RyaW5nKG91dFN0ciwgdHJ1ZSk7XG5cdFx0aWYgKHhtbFJlc3VsdCAmJiB4bWxSZXN1bHQ/LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0IGFzIGFueSkuaW5uZXJUZXh0IHx8ICh4bWxSZXN1bHQgYXMgYW55KS5pbm5lckhUTUw7XG5cdFx0XHRyZXR1cm4gY3JlYXRlRXJyb3JYTUwoW2Vycm9yTWVzc2FnZS5zcGxpdChcIlxcblwiKVswXV0sIG91dFN0cik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRTdHI7XG59O1xuIl19
|