@sapui5/sap.fe.core 1.97.0 → 1.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -4
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +309 -405
- package/src/sap/fe/core/AnnotationHelper.ts +315 -0
- package/src/sap/fe/core/AppComponent.js +389 -397
- package/src/sap/fe/core/AppComponent.ts +403 -0
- package/src/sap/fe/core/AppStateHandler.js +198 -181
- package/src/sap/fe/core/AppStateHandler.ts +171 -0
- package/src/sap/fe/core/BaseController.js +83 -58
- package/src/sap/fe/core/BaseController.ts +68 -0
- package/src/sap/fe/core/BusyLocker.js +105 -121
- package/src/sap/fe/core/BusyLocker.ts +98 -0
- package/src/sap/fe/core/CommonUtils.js +2164 -2379
- package/src/sap/fe/core/CommonUtils.ts +2177 -0
- package/src/sap/fe/core/ExtensionAPI.js +279 -266
- package/src/sap/fe/core/ExtensionAPI.ts +250 -0
- package/src/sap/fe/core/PageController.js +218 -125
- package/src/sap/fe/core/PageController.ts +129 -0
- package/src/sap/fe/core/RouterProxy.js +924 -807
- package/src/sap/fe/core/RouterProxy.ts +840 -0
- package/src/sap/fe/core/Synchronization.js +41 -35
- package/src/sap/fe/core/Synchronization.ts +29 -0
- package/src/sap/fe/core/TemplateComponent.js +173 -155
- package/src/sap/fe/core/TemplateComponent.ts +173 -0
- package/src/sap/fe/core/TemplateModel.js +79 -54
- package/src/sap/fe/core/TemplateModel.ts +63 -0
- package/src/sap/fe/core/TransactionHelper.js +1560 -1579
- package/src/sap/fe/core/TransactionHelper.ts +1717 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
- package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
- package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
- package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
- package/src/sap/fe/core/actions/draft.js +521 -581
- package/src/sap/fe/core/actions/draft.ts +566 -0
- package/src/sap/fe/core/actions/messageHandling.js +564 -511
- package/src/sap/fe/core/actions/messageHandling.ts +552 -0
- package/src/sap/fe/core/actions/nonDraft.js +17 -19
- package/src/sap/fe/core/actions/nonDraft.ts +12 -0
- package/src/sap/fe/core/actions/operations.js +1093 -1211
- package/src/sap/fe/core/actions/operations.ts +1192 -0
- package/src/sap/fe/core/actions/sticky.js +114 -104
- package/src/sap/fe/core/actions/sticky.ts +119 -0
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
- package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
- package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
- package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
- package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
- package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
- package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Share.js +220 -244
- package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
- package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
- package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
- package/src/sap/fe/core/controls/CommandExecution.js +68 -66
- package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
- package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
- package/src/sap/fe/core/controls/FilterBar.js +163 -159
- package/src/sap/fe/core/controls/FilterBar.ts +143 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
- package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
- package/src/sap/fe/core/converters/ConverterContext.js +348 -367
- package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
- package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
- package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
- package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
- package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
- package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
- package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
- package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
- package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
- package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
- package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
- package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
- package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
- package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
- package/src/sap/fe/core/converters/helpers/Key.js +42 -57
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
- package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
- package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
- package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
- package/src/sap/fe/core/fpm/Component.js +51 -54
- package/src/sap/fe/core/fpm/Component.ts +48 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
- package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
- package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
- package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
- package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
- package/src/sap/fe/core/helpers/EditState.js +81 -84
- package/src/sap/fe/core/helpers/EditState.ts +81 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
- package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
- package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
- package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
- package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
- package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
- package/src/sap/fe/core/library.js +427 -425
- package/src/sap/fe/core/library.support.js +23 -27
- package/src/sap/fe/core/library.support.ts +23 -0
- package/src/sap/fe/core/library.ts +420 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
- package/src/sap/fe/core/messagebundle.properties +78 -13
- package/src/sap/fe/core/messagebundle_ar.properties +58 -7
- package/src/sap/fe/core/messagebundle_bg.properties +58 -7
- package/src/sap/fe/core/messagebundle_ca.properties +58 -7
- package/src/sap/fe/core/messagebundle_cs.properties +59 -8
- package/src/sap/fe/core/messagebundle_cy.properties +58 -7
- package/src/sap/fe/core/messagebundle_da.properties +58 -7
- package/src/sap/fe/core/messagebundle_de.properties +58 -7
- package/src/sap/fe/core/messagebundle_el.properties +58 -7
- package/src/sap/fe/core/messagebundle_en.properties +57 -6
- package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
- package/src/sap/fe/core/messagebundle_es.properties +58 -7
- package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
- package/src/sap/fe/core/messagebundle_et.properties +58 -7
- package/src/sap/fe/core/messagebundle_fi.properties +60 -9
- package/src/sap/fe/core/messagebundle_fr.properties +64 -13
- package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
- package/src/sap/fe/core/messagebundle_hi.properties +58 -7
- package/src/sap/fe/core/messagebundle_hr.properties +58 -7
- package/src/sap/fe/core/messagebundle_hu.properties +59 -8
- package/src/sap/fe/core/messagebundle_id.properties +61 -10
- package/src/sap/fe/core/messagebundle_it.properties +58 -7
- package/src/sap/fe/core/messagebundle_iw.properties +58 -7
- package/src/sap/fe/core/messagebundle_ja.properties +58 -7
- package/src/sap/fe/core/messagebundle_kk.properties +58 -7
- package/src/sap/fe/core/messagebundle_ko.properties +58 -7
- package/src/sap/fe/core/messagebundle_lt.properties +58 -7
- package/src/sap/fe/core/messagebundle_lv.properties +59 -8
- package/src/sap/fe/core/messagebundle_ms.properties +58 -7
- package/src/sap/fe/core/messagebundle_nl.properties +58 -7
- package/src/sap/fe/core/messagebundle_no.properties +58 -7
- package/src/sap/fe/core/messagebundle_pl.properties +58 -7
- package/src/sap/fe/core/messagebundle_pt.properties +59 -8
- package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
- package/src/sap/fe/core/messagebundle_ro.properties +58 -7
- package/src/sap/fe/core/messagebundle_ru.properties +58 -7
- package/src/sap/fe/core/messagebundle_sh.properties +58 -7
- package/src/sap/fe/core/messagebundle_sk.properties +58 -7
- package/src/sap/fe/core/messagebundle_sl.properties +58 -7
- package/src/sap/fe/core/messagebundle_sv.properties +59 -8
- package/src/sap/fe/core/messagebundle_th.properties +58 -7
- package/src/sap/fe/core/messagebundle_tr.properties +60 -9
- package/src/sap/fe/core/messagebundle_uk.properties +58 -7
- package/src/sap/fe/core/messagebundle_vi.properties +58 -7
- package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
- package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
- package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
- package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +1 -1
- package/src/sap/fe/core/support/Diagnostics.js +36 -48
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
- package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +140 -78
- package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
- package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
- package/src/sap/fe/core/templating/UIFormatters.js +76 -135
- package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +4 -6
- package/ui5.yaml +0 -3
- package/src/sap/fe/core/controls/filterbar.d.js +0 -8
- package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/m/Button", "../converters/MetaModelConverter", "sap/fe/macros/field/FieldTemplating", "../templating/UIFormatters", "../templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper"], function (Dialog, XMLTemplateProcessor, JSONModel, Fragment, XMLPreprocessor, Log, CommonUtils, Button, MetaModelConverter, FieldTemplating, UIFormatters, FieldControlHelper, PropertyHelper) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var hasValueHelpWithFixedValues = PropertyHelper.hasValueHelpWithFixedValues;
|
|
9
|
+
var isReadOnlyExpression = FieldControlHelper.isReadOnlyExpression;
|
|
10
|
+
var getRequiredExpression = UIFormatters.getRequiredExpression;
|
|
11
|
+
var getEditableExpression = UIFormatters.getEditableExpression;
|
|
12
|
+
var getTextBinding = FieldTemplating.getTextBinding;
|
|
13
|
+
var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
|
|
14
|
+
var convertMetaModelContext = MetaModelConverter.convertMetaModelContext;
|
|
15
|
+
|
|
16
|
+
var aValidDataTypes = ["Edm.Boolean", "Edm.Byte", "Edm.Decimal", "Edm.Double", "Edm.Float", "Edm.Guid", "Edm.Int16", "Edm.Int32", "Edm.Int64", "Edm.SByte", "Edm.Single", "Edm.String"];
|
|
17
|
+
var MassEditHelper = {
|
|
18
|
+
/**
|
|
19
|
+
* Initializes the value at final or deepest level path with a blank array.
|
|
20
|
+
* Return an empty array pointing to the final or deepest level path.
|
|
21
|
+
*
|
|
22
|
+
* @param {string} sPath Property path
|
|
23
|
+
* @param {Array} aValues Array instance where the default data needs to be added
|
|
24
|
+
* @returns {Array}
|
|
25
|
+
*/
|
|
26
|
+
initLastLevelOfPropertyPath: function (sPath, aValues) {
|
|
27
|
+
var aFinalPath;
|
|
28
|
+
var index = 0;
|
|
29
|
+
var aPaths = sPath.split("/");
|
|
30
|
+
var sFullPath = "";
|
|
31
|
+
aPaths.forEach(function (sPropertyPath) {
|
|
32
|
+
if (!aValues[sPropertyPath] && index === 0) {
|
|
33
|
+
aValues[sPropertyPath] = {};
|
|
34
|
+
aFinalPath = aValues[sPropertyPath];
|
|
35
|
+
sFullPath = sFullPath + sPropertyPath;
|
|
36
|
+
index++;
|
|
37
|
+
} else if (!aFinalPath[sPropertyPath]) {
|
|
38
|
+
sFullPath = sFullPath + "/" + sPropertyPath;
|
|
39
|
+
|
|
40
|
+
if (sFullPath !== sPath) {
|
|
41
|
+
aFinalPath[sPropertyPath] = {};
|
|
42
|
+
aFinalPath = aFinalPath[sPropertyPath];
|
|
43
|
+
} else {
|
|
44
|
+
aFinalPath[sPropertyPath] = [];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return aFinalPath;
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Method to get unique values for given array values.
|
|
53
|
+
*
|
|
54
|
+
* @param {string} sValue Property value
|
|
55
|
+
* @param {number} index Index of the property value
|
|
56
|
+
* @param {Array} self Instance of the array
|
|
57
|
+
* @returns {boolean}
|
|
58
|
+
*/
|
|
59
|
+
getUniqueValues: function (sValue, index, self) {
|
|
60
|
+
if (sValue) {
|
|
61
|
+
return self.indexOf(sValue) === index;
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Gets the property value for a multi-level path (for example: _Materials/Material_Details gets the value of Material_Details under _Materials Object).
|
|
67
|
+
* Returns the propertyValue, which can be of any type (string, number, etc..).
|
|
68
|
+
*
|
|
69
|
+
* @param {string} sDataPropertyPath Property path
|
|
70
|
+
* @param {object} oValues Object of property values
|
|
71
|
+
* @returns {*}
|
|
72
|
+
*/
|
|
73
|
+
getValueForMultiLevelPath: function (sDataPropertyPath, oValues) {
|
|
74
|
+
if (sDataPropertyPath && sDataPropertyPath.indexOf("/") > 0) {
|
|
75
|
+
var aPropertyPaths = sDataPropertyPath.split("/");
|
|
76
|
+
var Result;
|
|
77
|
+
aPropertyPaths.forEach(function (sPath) {
|
|
78
|
+
Result = oValues && oValues[sPath] ? oValues[sPath] : Result && Result[sPath];
|
|
79
|
+
});
|
|
80
|
+
return Result;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Gets the key path for the key of a combo box that must be selected initially when the dialog opens:
|
|
86
|
+
* => If propertyValue for all selected contexts is different, then < Keep Existing Values > is preselected.
|
|
87
|
+
* => If propertyValue for all selected contexts is the same, then the propertyValue is preselected.
|
|
88
|
+
* => If propertyValue for all selected contexts is empty, then < Leave Blank > is preselected.
|
|
89
|
+
*
|
|
90
|
+
*
|
|
91
|
+
* @param {Array} aContexts Contexts for mass edit
|
|
92
|
+
* @param {string} sDataPropertyPath Data property path
|
|
93
|
+
* @returns {string}
|
|
94
|
+
*/
|
|
95
|
+
getDefaultSelectionPathComboBox: function (aContexts, sDataPropertyPath) {
|
|
96
|
+
if (sDataPropertyPath && aContexts.length > 0) {
|
|
97
|
+
var oSelectedContext = aContexts,
|
|
98
|
+
aPropertyValues = [];
|
|
99
|
+
oSelectedContext.forEach(function (oContext) {
|
|
100
|
+
var oDataObject = oContext.getObject();
|
|
101
|
+
var sMultiLevelPathCondition = sDataPropertyPath.indexOf("/") > -1 && oDataObject.hasOwnProperty(sDataPropertyPath.split("/")[0]);
|
|
102
|
+
|
|
103
|
+
if (oContext && (oDataObject.hasOwnProperty(sDataPropertyPath) || sMultiLevelPathCondition)) {
|
|
104
|
+
aPropertyValues.push(oContext.getObject(sDataPropertyPath));
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
var aUniquePropertyValues = aPropertyValues.filter(MassEditHelper.getUniqueValues);
|
|
108
|
+
|
|
109
|
+
if (aUniquePropertyValues.length > 1) {
|
|
110
|
+
return "Default/" + sDataPropertyPath;
|
|
111
|
+
} else if (aUniquePropertyValues.length === 0) {
|
|
112
|
+
return "Empty/" + sDataPropertyPath;
|
|
113
|
+
} else if (aUniquePropertyValues.length === 1) {
|
|
114
|
+
return sDataPropertyPath;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Checks hidden annotation value [both static and path based] for table's selected context.
|
|
121
|
+
*
|
|
122
|
+
* @param {*} hiddenValue Hidden annotation value / path for field
|
|
123
|
+
* @param {Array} aContexts Contexts for mass edit
|
|
124
|
+
* @returns {boolean}
|
|
125
|
+
*/
|
|
126
|
+
getHiddenValueForContexts: function (hiddenValue, aContexts) {
|
|
127
|
+
if (hiddenValue && hiddenValue.$Path) {
|
|
128
|
+
return !aContexts.some(function (oSelectedContext) {
|
|
129
|
+
return oSelectedContext.getObject(hiddenValue.$Path) === false;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return hiddenValue;
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Initializes a JSON Model for properties of dialog fields [label, visiblity, dataproperty, etc.].
|
|
138
|
+
*
|
|
139
|
+
* @param {object} oTable Instance of Table
|
|
140
|
+
* @param {Array} aContexts Contexts for mass edit
|
|
141
|
+
* @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
|
|
142
|
+
* @returns {object}
|
|
143
|
+
*/
|
|
144
|
+
prepareDataForDialog: function (oTable, aContexts, aDataArray) {
|
|
145
|
+
var oMetaModel = oTable && oTable.getModel().getMetaModel(),
|
|
146
|
+
sCurrentEntitySetName = oTable.data("metaPath"),
|
|
147
|
+
aTableFields = MassEditHelper.getTableFields(oTable),
|
|
148
|
+
oEntityTypeContext = oMetaModel.getContext(sCurrentEntitySetName + "/@"),
|
|
149
|
+
oDataModelObjectPath = getInvolvedDataModelObjects(oEntityTypeContext);
|
|
150
|
+
var oDataFieldModel = new JSONModel();
|
|
151
|
+
var oResult;
|
|
152
|
+
var sLabelText;
|
|
153
|
+
var bValueHelpEnabled;
|
|
154
|
+
var sUnitPropertyPath;
|
|
155
|
+
var bValueHelpEnabledForUnit;
|
|
156
|
+
var bIsImmutable;
|
|
157
|
+
var bIsComputed;
|
|
158
|
+
var bChartProperty;
|
|
159
|
+
var oTextBinding;
|
|
160
|
+
var bValidDataType;
|
|
161
|
+
var bInValidInputType;
|
|
162
|
+
aTableFields.forEach(function (oColumnInfo) {
|
|
163
|
+
var sDataPropertyPath = oColumnInfo.dataProperty;
|
|
164
|
+
|
|
165
|
+
if (sDataPropertyPath) {
|
|
166
|
+
var oPropertyInfo = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@");
|
|
167
|
+
bValueHelpEnabled = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
|
|
168
|
+
sUnitPropertyPath = oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.Unit"] && oPropertyInfo["@Org.OData.Measures.V1.Unit"].$Path || oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"] && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"].$Path;
|
|
169
|
+
sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"];
|
|
170
|
+
bValueHelpEnabledForUnit = sUnitPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
|
|
171
|
+
|
|
172
|
+
if (oDataModelObjectPath) {
|
|
173
|
+
oDataModelObjectPath.targetObject = oDataModelObjectPath.targetEntityType.entityProperties.filter(function (oProperty) {
|
|
174
|
+
return oProperty.name === sDataPropertyPath;
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
oDataModelObjectPath.targetObject = oDataModelObjectPath.targetObject[0] || {};
|
|
179
|
+
oTextBinding = getTextBinding(oDataModelObjectPath, {}, true) || {};
|
|
180
|
+
var oFieldContext = oMetaModel.getContext(oColumnInfo.annotationPath),
|
|
181
|
+
oDataFieldConverted = convertMetaModelContext(oFieldContext),
|
|
182
|
+
oPropertyContext = oMetaModel.getContext(sCurrentEntitySetName + "/" + sDataPropertyPath + "@"),
|
|
183
|
+
oInterface = oPropertyContext && oPropertyContext.getInterface();
|
|
184
|
+
bIsImmutable = oPropertyContext && oPropertyContext.getProperty() && oPropertyContext.getProperty()["@Org.OData.Core.V1.Immutable"];
|
|
185
|
+
bIsComputed = oPropertyContext && oPropertyContext.getProperty() && oPropertyContext.getProperty()["@Org.OData.Core.V1.Computed"];
|
|
186
|
+
var bHiddenField = MassEditHelper.getHiddenValueForContexts(oFieldContext && oFieldContext.getObject()["@com.sap.vocabularies.UI.v1.Hidden"], aContexts) || false;
|
|
187
|
+
oInterface.context = {
|
|
188
|
+
getModel: function () {
|
|
189
|
+
return oInterface.getModel();
|
|
190
|
+
},
|
|
191
|
+
getPath: function () {
|
|
192
|
+
return sCurrentEntitySetName + "/" + sDataPropertyPath;
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
oPropertyInfo = oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target || oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target; // Datafield is not included in the FieldControl calculation, needs to be implemented
|
|
196
|
+
|
|
197
|
+
var isReadOnly = isReadOnlyExpression(oPropertyInfo);
|
|
198
|
+
bChartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
|
|
199
|
+
bValidDataType = oPropertyInfo && aValidDataTypes.indexOf(oPropertyInfo.type) !== -1;
|
|
200
|
+
bInValidInputType = oColumnInfo && oColumnInfo.inputType && (oColumnInfo.inputType === "sap.m.RatingIndicator" || oColumnInfo.inputType === "sap.ui.mdc.MultiValueField") || hasValueHelpWithFixedValues(oPropertyInfo);
|
|
201
|
+
|
|
202
|
+
if (sDataPropertyPath && !bHiddenField && !bIsImmutable && !bIsComputed && !bChartProperty && bValidDataType && !bInValidInputType && oColumnInfo.inputType && getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath) !== "false") {
|
|
203
|
+
oResult = {
|
|
204
|
+
"label": sLabelText + ":",
|
|
205
|
+
"visible": sDataPropertyPath && !bHiddenField && !bIsImmutable && !bIsComputed && getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath),
|
|
206
|
+
"dataProperty": sDataPropertyPath,
|
|
207
|
+
"isValueHelpEnabled": bValueHelpEnabled ? bValueHelpEnabled : false,
|
|
208
|
+
"unitProperty": sUnitPropertyPath ? sUnitPropertyPath : false,
|
|
209
|
+
"isValueHelpEnabledForUnit": bValueHelpEnabledForUnit ? bValueHelpEnabledForUnit : false,
|
|
210
|
+
"propertyPathForValueHelp": sCurrentEntitySetName + "/" + sDataPropertyPath,
|
|
211
|
+
"propertyPathForValueHelpUnit": sCurrentEntitySetName + "/" + sUnitPropertyPath,
|
|
212
|
+
"isFieldRequired": getRequiredExpression(oPropertyInfo, oDataFieldConverted, true),
|
|
213
|
+
"defaultSelectionPath": sDataPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath) : false,
|
|
214
|
+
"defaultSelectionUnitPath": sUnitPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sUnitPropertyPath) : false,
|
|
215
|
+
"entitySet": sCurrentEntitySetName,
|
|
216
|
+
"textBinding": oTextBinding,
|
|
217
|
+
"nullable": oPropertyInfo.nullable !== undefined ? oPropertyInfo.nullable : true,
|
|
218
|
+
"isPropertyReadOnly": isReadOnly !== undefined ? isReadOnly : false
|
|
219
|
+
};
|
|
220
|
+
aDataArray.push(oResult);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
oDataFieldModel.setData(aDataArray);
|
|
225
|
+
return oDataFieldModel;
|
|
226
|
+
},
|
|
227
|
+
getInputTypeForColumn: function (oColumn) {
|
|
228
|
+
return oColumn.getTemplate().getContent && oColumn.getTemplate().getContent() && oColumn.getTemplate().getContent().getContentEdit && oColumn.getTemplate().getContent().getContentEdit() && oColumn.getTemplate().getContent().getContentEdit()[0] && oColumn.getTemplate().getContent().getContentEdit()[0].getMetadata().getName();
|
|
229
|
+
},
|
|
230
|
+
getTableFields: function (oTable) {
|
|
231
|
+
var aColumns = oTable && oTable.getColumns() || [];
|
|
232
|
+
return aColumns.map(function (oColumn) {
|
|
233
|
+
var sDataProperty = oColumn && oColumn.getDataProperty(),
|
|
234
|
+
aRealtedColumnInfo = oTable.data("columns") && oTable.data("columns").customData.filter(function (oColumnInfo) {
|
|
235
|
+
return oColumnInfo.name === sDataProperty && oColumnInfo.type === "Annotation";
|
|
236
|
+
});
|
|
237
|
+
return {
|
|
238
|
+
"dataProperty": sDataProperty,
|
|
239
|
+
"label": oColumn.getHeader(),
|
|
240
|
+
"annotationPath": aRealtedColumnInfo && aRealtedColumnInfo[0] && aRealtedColumnInfo[0].annotationPath,
|
|
241
|
+
"inputType": MassEditHelper.getInputTypeForColumn(oColumn)
|
|
242
|
+
};
|
|
243
|
+
});
|
|
244
|
+
},
|
|
245
|
+
getDefaultTextsForDialog: function (oResourceBundle, iSelectedContexts, oTable) {
|
|
246
|
+
// The confirm button text is "Save" for table in Display mode and "Apply" for table in edit mode. This can be later exposed if needed.
|
|
247
|
+
var bDisplayMode = oTable.data("displayModePropertyBinding") === "true";
|
|
248
|
+
return {
|
|
249
|
+
"keepExistingPrefix": "< Keep",
|
|
250
|
+
"leaveBlankValue": "< Leave Blank >",
|
|
251
|
+
"clearFieldValue": "< Clear Values >",
|
|
252
|
+
"massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
|
|
253
|
+
"applyButtonText": bDisplayMode ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT") : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
|
|
254
|
+
"cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT")
|
|
255
|
+
};
|
|
256
|
+
},
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Adds a suffix to the 'keep existing' property of the comboBox.
|
|
260
|
+
*
|
|
261
|
+
* @param {string} sInputType InputType of the field
|
|
262
|
+
* @returns {string}
|
|
263
|
+
*/
|
|
264
|
+
getSuffixForKeepExisiting: function (sInputType) {
|
|
265
|
+
var sResult = "Values";
|
|
266
|
+
|
|
267
|
+
switch (sInputType) {
|
|
268
|
+
//TODO - Add for other control types as well (Radio Button, Email, Input, MDC Fields, Image etc.)
|
|
269
|
+
case "sap.m.DatePicker":
|
|
270
|
+
sResult = "Dates";
|
|
271
|
+
break;
|
|
272
|
+
|
|
273
|
+
case "sap.m.CheckBox":
|
|
274
|
+
sResult = "Settings";
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return sResult;
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Adds default values to the model [Keep Existing Values, Leave Blank].
|
|
283
|
+
*
|
|
284
|
+
* @param {Array} aValues Array instance where the default data needs to be added
|
|
285
|
+
* @param {Array} aContexts Contexts for mass edit
|
|
286
|
+
* @param {object} oDefaultValues Default values from Application Manifest
|
|
287
|
+
* @param {object} oPropertyInfo Property information
|
|
288
|
+
* @param {boolean} bUOMField
|
|
289
|
+
*/
|
|
290
|
+
setDefaultValuesToDialog: function (aValues, aContexts, oDefaultValues, oPropertyInfo, bUOMField) {
|
|
291
|
+
var sPropertyPath = oPropertyInfo.dataProperty,
|
|
292
|
+
sInputType = oPropertyInfo.inputType,
|
|
293
|
+
bPropertyRequired = oPropertyInfo.isFieldRequired;
|
|
294
|
+
var sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType); //TODO - Add <<Use Value Help or control implmentation>> and related key by checking if value help is enabled for property or Unit.
|
|
295
|
+
//TODO - Add option Apply to Empty Fields only for Both Value Help and controls.
|
|
296
|
+
|
|
297
|
+
var bValueExistsForPropertyPath = aContexts.some(function (oSelectedContext) {
|
|
298
|
+
return oSelectedContext.getObject(sPropertyPath);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
if (bValueExistsForPropertyPath) {
|
|
302
|
+
if (bPropertyRequired !== "true" && !bUOMField) {
|
|
303
|
+
aValues.unshift({
|
|
304
|
+
text: oDefaultValues.clearFieldValue,
|
|
305
|
+
key: "ClearFieldValue/" + sPropertyPath
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
} else {
|
|
309
|
+
aValues.unshift({
|
|
310
|
+
text: oDefaultValues.leaveBlankValue,
|
|
311
|
+
key: "Empty/" + sPropertyPath
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
aValues.unshift({
|
|
316
|
+
text: oDefaultValues.keepExistingPrefix + " " + sSuffixForKeepExisting + " >",
|
|
317
|
+
key: "Default/" + sPropertyPath
|
|
318
|
+
});
|
|
319
|
+
},
|
|
320
|
+
getTextArrangementInfo: function (sProperty, oTextBinding, sCurrentEntitySet, oSelectedContext) {
|
|
321
|
+
var oMetaModel = oSelectedContext.getModel().getMetaModel();
|
|
322
|
+
var sDisplayMode = CommonUtils.computeDisplayMode(oMetaModel.getObject(sCurrentEntitySet + "/" + sProperty + "@"));
|
|
323
|
+
var sDescriptionPath, sValue, sDescriptionValue, sFullText;
|
|
324
|
+
|
|
325
|
+
if (oTextBinding && (oTextBinding.path || oTextBinding.parameters && oTextBinding.parameters.length) && sProperty) {
|
|
326
|
+
if (oTextBinding.path) {
|
|
327
|
+
if (sDisplayMode === "Description") {
|
|
328
|
+
sValue = oSelectedContext.getObject(sProperty);
|
|
329
|
+
sDescriptionValue = oSelectedContext.getObject(oTextBinding.path);
|
|
330
|
+
sFullText = sDescriptionValue;
|
|
331
|
+
} else if (sDisplayMode === "Value") {
|
|
332
|
+
sValue = oSelectedContext.getObject(sProperty);
|
|
333
|
+
sFullText = sValue;
|
|
334
|
+
}
|
|
335
|
+
} else if (oTextBinding.parameters) {
|
|
336
|
+
oTextBinding.parameters.forEach(function (oProps) {
|
|
337
|
+
if (oProps.path && oProps.path !== sProperty) {
|
|
338
|
+
sDescriptionPath = oProps.path;
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
sValue = oSelectedContext.getObject(sProperty);
|
|
342
|
+
sDescriptionValue = oSelectedContext.getObject(sDescriptionPath);
|
|
343
|
+
|
|
344
|
+
if (sDisplayMode === "ValueDescription" && sValue && sDescriptionValue) {
|
|
345
|
+
sFullText = sValue + " (" + sDescriptionValue + ")";
|
|
346
|
+
} else if (sDisplayMode === "DescriptionValue" && sDescriptionValue && sValue) {
|
|
347
|
+
sFullText = sDescriptionValue + " (" + sValue + ")";
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
return {
|
|
352
|
+
"textArrangement": sDisplayMode,
|
|
353
|
+
"valuePath": sProperty,
|
|
354
|
+
"descriptionPath": sDescriptionPath,
|
|
355
|
+
"value": sValue,
|
|
356
|
+
"description": sDescriptionValue,
|
|
357
|
+
"fullText": sFullText
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
return undefined;
|
|
362
|
+
},
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Initializes a runtime model:
|
|
366
|
+
* => The model consists of values shown in the comboBox of the dialog (Leave Blank, Keep Existing Values, or any property value for the selected context, etc.)
|
|
367
|
+
* => The model will capture runtime changes in the results property (the value entered in the comboBox).
|
|
368
|
+
*
|
|
369
|
+
* @param {Array} aContexts Contexts for mass edit
|
|
370
|
+
* @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
|
|
371
|
+
* @param {object} oDefaultValues Default values from i18n
|
|
372
|
+
* @returns {object}
|
|
373
|
+
*/
|
|
374
|
+
setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues) {
|
|
375
|
+
var aValues = [];
|
|
376
|
+
var aUnitData = [];
|
|
377
|
+
var aResults = [];
|
|
378
|
+
var aReadOnlyFieldInfo = [];
|
|
379
|
+
var oDistinctValueMap = {};
|
|
380
|
+
var sPropertyName;
|
|
381
|
+
aDataArray.forEach(function (oData) {
|
|
382
|
+
var oTextInfo;
|
|
383
|
+
|
|
384
|
+
if (oData.dataProperty && oData.dataProperty.indexOf("/") > -1) {
|
|
385
|
+
var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oData.dataProperty, aValues);
|
|
386
|
+
var aPropertyPaths = oData.dataProperty.split("/");
|
|
387
|
+
var sPropertyKey;
|
|
388
|
+
|
|
389
|
+
for (var i = 0; i < aContexts.length; i++) {
|
|
390
|
+
var sMultiLevelPathValue = aContexts[i].getObject(oData.dataProperty);
|
|
391
|
+
sPropertyKey = oData.dataProperty + "/" + sMultiLevelPathValue;
|
|
392
|
+
|
|
393
|
+
if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
|
|
394
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.textBinding, oData.entitySet, aContexts[i]);
|
|
395
|
+
aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
|
|
396
|
+
"text": oTextInfo && oTextInfo.fullText || sMultiLevelPathValue,
|
|
397
|
+
"key": oData.dataProperty,
|
|
398
|
+
"textInfo": oTextInfo
|
|
399
|
+
});
|
|
400
|
+
oDistinctValueMap[sPropertyKey] = sMultiLevelPathValue;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
} else {
|
|
404
|
+
aValues[oData.dataProperty] = aValues[oData.dataProperty] || [];
|
|
405
|
+
|
|
406
|
+
if (oData.unitProperty) {
|
|
407
|
+
aUnitData[oData.unitProperty] = aUnitData[oData.unitProperty] || [];
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
for (var _i = 0; _i < aContexts.length; _i++) {
|
|
411
|
+
var oDataObject = aContexts[_i].getObject();
|
|
412
|
+
|
|
413
|
+
sPropertyName = oData.dataProperty + "/" + oDataObject[oData.dataProperty];
|
|
414
|
+
|
|
415
|
+
if (oData.dataProperty && oDataObject[oData.dataProperty] && !oDistinctValueMap[sPropertyName]) {
|
|
416
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.textBinding, oData.entitySet, aContexts[_i]);
|
|
417
|
+
aValues[oData.dataProperty].push({
|
|
418
|
+
"text": oTextInfo && oTextInfo.fullText || oDataObject[oData.dataProperty],
|
|
419
|
+
"key": oData.dataProperty,
|
|
420
|
+
"textInfo": oTextInfo
|
|
421
|
+
});
|
|
422
|
+
oDistinctValueMap[sPropertyName] = oDataObject[oData.dataProperty];
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
if (oData.unitProperty && oDataObject[oData.unitProperty]) {
|
|
426
|
+
sPropertyName = oData.unitProperty + "/" + oDataObject[oData.unitProperty];
|
|
427
|
+
|
|
428
|
+
if (!oDistinctValueMap[sPropertyName]) {
|
|
429
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oData.unitProperty, oData.textBinding, oData.entitySet, aContexts[_i]);
|
|
430
|
+
aUnitData[oData.unitProperty].push({
|
|
431
|
+
"text": oTextInfo && oTextInfo.fullText || oDataObject[oData.unitProperty],
|
|
432
|
+
"key": oData.unitProperty,
|
|
433
|
+
"textInfo": oTextInfo
|
|
434
|
+
});
|
|
435
|
+
oDistinctValueMap[sPropertyName] = oDataObject[oData.unitProperty];
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
aDataArray.forEach(function (oData) {
|
|
442
|
+
if (oData.dataProperty.indexOf("/") > -1) {
|
|
443
|
+
var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oData.dataProperty, aValues);
|
|
444
|
+
|
|
445
|
+
if (!sMultiLevelPropPathValue) {
|
|
446
|
+
sMultiLevelPropPathValue.push({
|
|
447
|
+
text: oDefaultValues.leaveBlankValue,
|
|
448
|
+
key: "Empty/" + oData.dataProperty
|
|
449
|
+
});
|
|
450
|
+
} else {
|
|
451
|
+
MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, aContexts, oDefaultValues, oData);
|
|
452
|
+
}
|
|
453
|
+
} else if (aValues[oData.dataProperty] && aValues[oData.dataProperty].length) {
|
|
454
|
+
MassEditHelper.setDefaultValuesToDialog(aValues[oData.dataProperty], aContexts, oDefaultValues, oData);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
if (aUnitData[oData.unitProperty] && aUnitData[oData.unitProperty].length) {
|
|
458
|
+
MassEditHelper.setDefaultValuesToDialog(aUnitData[oData.unitProperty], aContexts, oDefaultValues, oData, true);
|
|
459
|
+
} else if (oData.dataProperty && aValues[oData.dataProperty] && !aValues[oData.dataProperty].length || oData.unitProperty && aUnitData[oData.unitProperty] && !aUnitData[oData.unitProperty].length) {
|
|
460
|
+
var bClearFieldOrBlankValueExists = aValues[oData.dataProperty] && aValues[oData.dataProperty].some(function (obj) {
|
|
461
|
+
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
if (oData.dataProperty && !bClearFieldOrBlankValueExists) {
|
|
465
|
+
aValues[oData.dataProperty].push({
|
|
466
|
+
text: oDefaultValues.leaveBlankValue,
|
|
467
|
+
key: "Empty/" + oData.dataProperty
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
var bClearFieldOrBlankUnitValueExists = aUnitData[oData.unitProperty] && aUnitData[oData.unitProperty].some(function (obj) {
|
|
472
|
+
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
if (oData.unitProperty && !bClearFieldOrBlankUnitValueExists) {
|
|
476
|
+
aUnitData[oData.unitProperty].push({
|
|
477
|
+
text: oDefaultValues.leaveBlankValue,
|
|
478
|
+
key: "Empty/" + oData.unitProperty
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if (oData.isPropertyReadOnly && typeof oData.isPropertyReadOnly === "boolean") {
|
|
484
|
+
aReadOnlyFieldInfo.push({
|
|
485
|
+
"property": oData.dataProperty,
|
|
486
|
+
value: oData.isPropertyReadOnly,
|
|
487
|
+
type: "Default"
|
|
488
|
+
});
|
|
489
|
+
} else if (oData.isPropertyReadOnly && oData.isPropertyReadOnly.operands && oData.isPropertyReadOnly.operands[0] && oData.isPropertyReadOnly.operands[0].operand1 && oData.isPropertyReadOnly.operands[0].operand2) {
|
|
490
|
+
// This needs to be refactored in accordance with the ReadOnlyExpression change
|
|
491
|
+
aReadOnlyFieldInfo.push({
|
|
492
|
+
"property": oData.dataProperty,
|
|
493
|
+
propertyPath: oData.isPropertyReadOnly.operands[0].operand1.path,
|
|
494
|
+
propertyValue: oData.isPropertyReadOnly.operands[0].operand2.value,
|
|
495
|
+
type: "Path"
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
var oData = {
|
|
500
|
+
"values": aValues,
|
|
501
|
+
"unitData": aUnitData,
|
|
502
|
+
"results": aResults,
|
|
503
|
+
"readablePropertyData": aReadOnlyFieldInfo
|
|
504
|
+
};
|
|
505
|
+
var oDialogDataModel = new JSONModel(oData);
|
|
506
|
+
return oDialogDataModel;
|
|
507
|
+
},
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Create the mass edit dialog.
|
|
511
|
+
*
|
|
512
|
+
* @param {object} oTable Instance of Table
|
|
513
|
+
* @param {Array} aContexts Contexts for mass edit
|
|
514
|
+
* @param {object} oController Controller for the view
|
|
515
|
+
* @returns {object} Promise returning instance of dialog.
|
|
516
|
+
*/
|
|
517
|
+
createDialog: function (oTable, aContexts, oController) {
|
|
518
|
+
var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
|
|
519
|
+
aDataArray = [],
|
|
520
|
+
oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
|
|
521
|
+
oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
|
|
522
|
+
oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
|
|
523
|
+
oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues);
|
|
524
|
+
return new Promise(function (resolve, reject) {
|
|
525
|
+
var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
|
|
526
|
+
return Promise.resolve(XMLPreprocessor.process(oFragment, {
|
|
527
|
+
name: sFragmentName
|
|
528
|
+
}, {
|
|
529
|
+
bindingContexts: {
|
|
530
|
+
dataFieldModel: oDataFieldModel.createBindingContext("/")
|
|
531
|
+
},
|
|
532
|
+
models: {
|
|
533
|
+
dataFieldModel: oDataFieldModel
|
|
534
|
+
}
|
|
535
|
+
})).then(function (oFragment) {
|
|
536
|
+
return Fragment.load({
|
|
537
|
+
definition: oFragment
|
|
538
|
+
}).then(function (oDialogContent) {
|
|
539
|
+
var oDialog = new Dialog({
|
|
540
|
+
title: oDefaultValues.massEditTitle,
|
|
541
|
+
content: [oDialogContent],
|
|
542
|
+
beginButton: new Button({
|
|
543
|
+
text: oDefaultValues.applyButtonText,
|
|
544
|
+
type: "Emphasized",
|
|
545
|
+
press: function (oEvent) {
|
|
546
|
+
var oDialog = oEvent.getSource().getParent();
|
|
547
|
+
var oModel = oDialog.getModel("fieldsInfo");
|
|
548
|
+
var aResults = oModel.getProperty("/results");
|
|
549
|
+
var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
|
|
550
|
+
var changePromise = [];
|
|
551
|
+
var bReadOnlyField = false;
|
|
552
|
+
aContexts.forEach(function (oSelectedContext) {
|
|
553
|
+
aResults.forEach(function (oResult) {
|
|
554
|
+
//TODO - Add save implementation for Value Help.
|
|
555
|
+
if (aPropertyReadableInfo) {
|
|
556
|
+
bReadOnlyField = aPropertyReadableInfo.some(function (oPropertyInfo) {
|
|
557
|
+
if (oResult.keyValue === oPropertyInfo.property) {
|
|
558
|
+
if (oPropertyInfo.type === "Default") {
|
|
559
|
+
return oPropertyInfo.value === true;
|
|
560
|
+
} else if (oPropertyInfo.type === "Path" && oPropertyInfo.propertyValue && oPropertyInfo.propertyPath) {
|
|
561
|
+
return oSelectedContext.getObject(oPropertyInfo.propertyPath) === oPropertyInfo.propertyValue;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
if (oResult.keyValue && oResult.value !== "Default" && !bReadOnlyField) {
|
|
568
|
+
changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value));
|
|
569
|
+
}
|
|
570
|
+
});
|
|
571
|
+
});
|
|
572
|
+
return Promise.all(changePromise).then(function (oRes) {
|
|
573
|
+
var oListBinding = oTable.getRowBinding(),
|
|
574
|
+
oExtensionAPI = oController && oController.getExtensionAPI();
|
|
575
|
+
return oExtensionAPI.refresh(oListBinding.getPath()).then(function () {
|
|
576
|
+
oDialog.close();
|
|
577
|
+
oDialog.destroy();
|
|
578
|
+
return oRes;
|
|
579
|
+
});
|
|
580
|
+
}).catch(function (oError) {
|
|
581
|
+
//TODO - Add error handling part for the Dialog
|
|
582
|
+
Log.error("Mass Edit: Something went wrong in updating entries.", oError);
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
}),
|
|
586
|
+
endButton: new Button({
|
|
587
|
+
text: oDefaultValues.cancelButtonText,
|
|
588
|
+
press: function (oEvent) {
|
|
589
|
+
var oDialog = oEvent.getSource().getParent();
|
|
590
|
+
oDialog.close();
|
|
591
|
+
oDialog.destroy();
|
|
592
|
+
}
|
|
593
|
+
})
|
|
594
|
+
});
|
|
595
|
+
oDialog.setModel(oDialogDataModel, "fieldsInfo");
|
|
596
|
+
resolve(oDialog);
|
|
597
|
+
});
|
|
598
|
+
}).catch(reject);
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
};
|
|
602
|
+
return MassEditHelper;
|
|
603
|
+
}, false);
|
|
604
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbImFWYWxpZERhdGFUeXBlcyIsIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwicHJlcGFyZURhdGFGb3JEaWFsb2ciLCJvVGFibGUiLCJhRGF0YUFycmF5Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0N1cnJlbnRFbnRpdHlTZXROYW1lIiwiZGF0YSIsImFUYWJsZUZpZWxkcyIsImdldFRhYmxlRmllbGRzIiwib0VudGl0eVR5cGVDb250ZXh0IiwiZ2V0Q29udGV4dCIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwib0RhdGFGaWVsZE1vZGVsIiwiSlNPTk1vZGVsIiwib1Jlc3VsdCIsInNMYWJlbFRleHQiLCJiVmFsdWVIZWxwRW5hYmxlZCIsInNVbml0UHJvcGVydHlQYXRoIiwiYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0IiwiYklzSW1tdXRhYmxlIiwiYklzQ29tcHV0ZWQiLCJiQ2hhcnRQcm9wZXJ0eSIsIm9UZXh0QmluZGluZyIsImJWYWxpZERhdGFUeXBlIiwiYkluVmFsaWRJbnB1dFR5cGUiLCJvQ29sdW1uSW5mbyIsImRhdGFQcm9wZXJ0eSIsIm9Qcm9wZXJ0eUluZm8iLCJsYWJlbCIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwib1Byb3BlcnR5IiwibmFtZSIsImdldFRleHRCaW5kaW5nIiwib0ZpZWxkQ29udGV4dCIsImFubm90YXRpb25QYXRoIiwib0RhdGFGaWVsZENvbnZlcnRlZCIsImNvbnZlcnRNZXRhTW9kZWxDb250ZXh0Iiwib1Byb3BlcnR5Q29udGV4dCIsIm9JbnRlcmZhY2UiLCJnZXRJbnRlcmZhY2UiLCJnZXRQcm9wZXJ0eSIsImJIaWRkZW5GaWVsZCIsImNvbnRleHQiLCJnZXRQYXRoIiwiVmFsdWUiLCIkdGFyZ2V0IiwiVGFyZ2V0IiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwidGVybSIsInR5cGUiLCJpbnB1dFR5cGUiLCJoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInVuZGVmaW5lZCIsInNldERhdGEiLCJnZXRJbnB1dFR5cGVGb3JDb2x1bW4iLCJvQ29sdW1uIiwiZ2V0VGVtcGxhdGUiLCJnZXRDb250ZW50IiwiZ2V0Q29udGVudEVkaXQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJtYXAiLCJzRGF0YVByb3BlcnR5IiwiZ2V0RGF0YVByb3BlcnR5IiwiYVJlYWx0ZWRDb2x1bW5JbmZvIiwiY3VzdG9tRGF0YSIsImdldEhlYWRlciIsImdldERlZmF1bHRUZXh0c0ZvckRpYWxvZyIsIm9SZXNvdXJjZUJ1bmRsZSIsImlTZWxlY3RlZENvbnRleHRzIiwiYkRpc3BsYXlNb2RlIiwiZ2V0VGV4dCIsInRvU3RyaW5nIiwiZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZyIsInNJbnB1dFR5cGUiLCJzUmVzdWx0Iiwic2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nIiwib0RlZmF1bHRWYWx1ZXMiLCJiVU9NRmllbGQiLCJiUHJvcGVydHlSZXF1aXJlZCIsImlzRmllbGRSZXF1aXJlZCIsInNTdWZmaXhGb3JLZWVwRXhpc3RpbmciLCJiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgiLCJ1bnNoaWZ0IiwidGV4dCIsImNsZWFyRmllbGRWYWx1ZSIsImtleSIsImxlYXZlQmxhbmtWYWx1ZSIsImtlZXBFeGlzdGluZ1ByZWZpeCIsImdldFRleHRBcnJhbmdlbWVudEluZm8iLCJzUHJvcGVydHkiLCJzQ3VycmVudEVudGl0eVNldCIsInNEaXNwbGF5TW9kZSIsIkNvbW1vblV0aWxzIiwiY29tcHV0ZURpc3BsYXlNb2RlIiwic0Rlc2NyaXB0aW9uUGF0aCIsInNEZXNjcmlwdGlvblZhbHVlIiwic0Z1bGxUZXh0IiwicGF0aCIsInBhcmFtZXRlcnMiLCJvUHJvcHMiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImFVbml0RGF0YSIsImFSZXN1bHRzIiwiYVJlYWRPbmx5RmllbGRJbmZvIiwib0Rpc3RpbmN0VmFsdWVNYXAiLCJzUHJvcGVydHlOYW1lIiwib0RhdGEiLCJvVGV4dEluZm8iLCJzUHJvcGVydHlLZXkiLCJpIiwic011bHRpTGV2ZWxQYXRoVmFsdWUiLCJ0ZXh0QmluZGluZyIsImVudGl0eVNldCIsImZ1bGxUZXh0IiwidW5pdFByb3BlcnR5Iiwic011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlIiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJ2YWx1ZSIsIm9wZXJhbmRzIiwib3BlcmFuZDEiLCJvcGVyYW5kMiIsInByb3BlcnR5UGF0aCIsInByb3BlcnR5VmFsdWUiLCJvRGlhbG9nRGF0YU1vZGVsIiwiY3JlYXRlRGlhbG9nIiwib0NvbnRyb2xsZXIiLCJzRnJhZ21lbnROYW1lIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJiaW5kaW5nQ29udGV4dHMiLCJkYXRhRmllbGRNb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwidGhlbiIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsIm1hc3NFZGl0VGl0bGUiLCJjb250ZW50IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJhcHBseUJ1dHRvblRleHQiLCJwcmVzcyIsIm9FdmVudCIsImdldFNvdXJjZSIsImdldFBhcmVudCIsIm9Nb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImNoYW5nZVByb21pc2UiLCJiUmVhZE9ubHlGaWVsZCIsImtleVZhbHVlIiwicHJvcGVydHkiLCJzZXRQcm9wZXJ0eSIsImFsbCIsIm9SZXMiLCJvTGlzdEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwib0V4dGVuc2lvbkFQSSIsImdldEV4dGVuc2lvbkFQSSIsInJlZnJlc2giLCJjbG9zZSIsImRlc3Ryb3kiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZW5kQnV0dG9uIiwiY2FuY2VsQnV0dG9uVGV4dCIsInNldE1vZGVsIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUF3QkEsTUFBTUEsZUFBZSxHQUFHLENBQ3ZCLGFBRHVCLEVBRXZCLFVBRnVCLEVBR3ZCLGFBSHVCLEVBSXZCLFlBSnVCLEVBS3ZCLFdBTHVCLEVBTXZCLFVBTnVCLEVBT3ZCLFdBUHVCLEVBUXZCLFdBUnVCLEVBU3ZCLFdBVHVCLEVBVXZCLFdBVnVCLEVBV3ZCLFlBWHVCLEVBWXZCLFlBWnVCLENBQXhCO0FBY0EsTUFBTUMsY0FBYyxHQUFHO0FBQ3RCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEsMkJBQTJCLEVBQUUsVUFBU0MsS0FBVCxFQUF3QkMsT0FBeEIsRUFBc0M7QUFDbEUsVUFBSUMsVUFBSjtBQUNBLFVBQUlDLEtBQUssR0FBRyxDQUFaO0FBQ0EsVUFBTUMsTUFBTSxHQUFHSixLQUFLLENBQUNLLEtBQU4sQ0FBWSxHQUFaLENBQWY7QUFDQSxVQUFJQyxTQUFTLEdBQUcsRUFBaEI7QUFDQUYsTUFBQUEsTUFBTSxDQUFDRyxPQUFQLENBQWUsVUFBU0MsYUFBVCxFQUFnQztBQUM5QyxZQUFJLENBQUNQLE9BQU8sQ0FBQ08sYUFBRCxDQUFSLElBQTJCTCxLQUFLLEtBQUssQ0FBekMsRUFBNEM7QUFDM0NGLFVBQUFBLE9BQU8sQ0FBQ08sYUFBRCxDQUFQLEdBQXlCLEVBQXpCO0FBQ0FOLFVBQUFBLFVBQVUsR0FBR0QsT0FBTyxDQUFDTyxhQUFELENBQXBCO0FBQ0FGLFVBQUFBLFNBQVMsR0FBR0EsU0FBUyxHQUFHRSxhQUF4QjtBQUNBTCxVQUFBQSxLQUFLO0FBQ0wsU0FMRCxNQUtPLElBQUksQ0FBQ0QsVUFBVSxDQUFDTSxhQUFELENBQWYsRUFBZ0M7QUFDdENGLFVBQUFBLFNBQVMsR0FBR0EsU0FBUyxHQUFHLEdBQVosR0FBa0JFLGFBQTlCOztBQUNBLGNBQUlGLFNBQVMsS0FBS04sS0FBbEIsRUFBeUI7QUFDeEJFLFlBQUFBLFVBQVUsQ0FBQ00sYUFBRCxDQUFWLEdBQTRCLEVBQTVCO0FBQ0FOLFlBQUFBLFVBQVUsR0FBR0EsVUFBVSxDQUFDTSxhQUFELENBQXZCO0FBQ0EsV0FIRCxNQUdPO0FBQ05OLFlBQUFBLFVBQVUsQ0FBQ00sYUFBRCxDQUFWLEdBQTRCLEVBQTVCO0FBQ0E7QUFDRDtBQUNELE9BZkQ7QUFnQkEsYUFBT04sVUFBUDtBQUNBLEtBL0JxQjs7QUFpQ3RCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ08sSUFBQUEsZUFBZSxFQUFFLFVBQVNDLE1BQVQsRUFBeUJQLEtBQXpCLEVBQXdDUSxJQUF4QyxFQUFxRDtBQUNyRSxVQUFJRCxNQUFKLEVBQVk7QUFDWCxlQUFPQyxJQUFJLENBQUNDLE9BQUwsQ0FBYUYsTUFBYixNQUF5QlAsS0FBaEM7QUFDQTtBQUNELEtBN0NxQjs7QUErQ3RCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ1UsSUFBQUEseUJBQXlCLEVBQUUsVUFBU0MsaUJBQVQsRUFBb0NDLE9BQXBDLEVBQWtEO0FBQzVFLFVBQUlELGlCQUFpQixJQUFJQSxpQkFBaUIsQ0FBQ0YsT0FBbEIsQ0FBMEIsR0FBMUIsSUFBaUMsQ0FBMUQsRUFBNkQ7QUFDNUQsWUFBTUksY0FBYyxHQUFHRixpQkFBaUIsQ0FBQ1QsS0FBbEIsQ0FBd0IsR0FBeEIsQ0FBdkI7QUFDQSxZQUFJWSxNQUFKO0FBQ0FELFFBQUFBLGNBQWMsQ0FBQ1QsT0FBZixDQUF1QixVQUFTUCxLQUFULEVBQXdCO0FBQzlDaUIsVUFBQUEsTUFBTSxHQUFHRixPQUFPLElBQUlBLE9BQU8sQ0FBQ2YsS0FBRCxDQUFsQixHQUE0QmUsT0FBTyxDQUFDZixLQUFELENBQW5DLEdBQTZDaUIsTUFBTSxJQUFJQSxNQUFNLENBQUNqQixLQUFELENBQXRFO0FBQ0EsU0FGRDtBQUdBLGVBQU9pQixNQUFQO0FBQ0E7QUFDRCxLQWhFcUI7O0FBa0V0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLCtCQUErQixFQUFFLFVBQVNDLFNBQVQsRUFBMkJMLGlCQUEzQixFQUFzRDtBQUN0RixVQUFJQSxpQkFBaUIsSUFBSUssU0FBUyxDQUFDQyxNQUFWLEdBQW1CLENBQTVDLEVBQStDO0FBQzlDLFlBQU1DLGdCQUFnQixHQUFHRixTQUF6QjtBQUFBLFlBQ0NHLGVBQXNCLEdBQUcsRUFEMUI7QUFFQUQsUUFBQUEsZ0JBQWdCLENBQUNkLE9BQWpCLENBQXlCLFVBQVNnQixRQUFULEVBQXdCO0FBQ2hELGNBQU1DLFdBQVcsR0FBR0QsUUFBUSxDQUFDRSxTQUFULEVBQXBCO0FBQ0EsY0FBTUMsd0JBQXdCLEdBQzdCWixpQkFBaUIsQ0FBQ0YsT0FBbEIsQ0FBMEIsR0FBMUIsSUFBaUMsQ0FBQyxDQUFsQyxJQUF1Q1ksV0FBVyxDQUFDRyxjQUFaLENBQTJCYixpQkFBaUIsQ0FBQ1QsS0FBbEIsQ0FBd0IsR0FBeEIsRUFBNkIsQ0FBN0IsQ0FBM0IsQ0FEeEM7O0FBRUEsY0FBSWtCLFFBQVEsS0FBS0MsV0FBVyxDQUFDRyxjQUFaLENBQTJCYixpQkFBM0IsS0FBaURZLHdCQUF0RCxDQUFaLEVBQTZGO0FBQzVGSixZQUFBQSxlQUFlLENBQUNNLElBQWhCLENBQXFCTCxRQUFRLENBQUNFLFNBQVQsQ0FBbUJYLGlCQUFuQixDQUFyQjtBQUNBO0FBQ0QsU0FQRDtBQVFBLFlBQU1lLHFCQUFxQixHQUFHUCxlQUFlLENBQUNRLE1BQWhCLENBQXVCaEMsY0FBYyxDQUFDVyxlQUF0QyxDQUE5Qjs7QUFDQSxZQUFJb0IscUJBQXFCLENBQUNULE1BQXRCLEdBQStCLENBQW5DLEVBQXNDO0FBQ3JDLGlCQUFPLGFBQWFOLGlCQUFwQjtBQUNBLFNBRkQsTUFFTyxJQUFJZSxxQkFBcUIsQ0FBQ1QsTUFBdEIsS0FBaUMsQ0FBckMsRUFBd0M7QUFDOUMsaUJBQU8sV0FBV04saUJBQWxCO0FBQ0EsU0FGTSxNQUVBLElBQUllLHFCQUFxQixDQUFDVCxNQUF0QixLQUFpQyxDQUFyQyxFQUF3QztBQUM5QyxpQkFBT04saUJBQVA7QUFDQTtBQUNEO0FBQ0QsS0FsR3FCOztBQW9HdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ2lCLElBQUFBLHlCQUF5QixFQUFFLFVBQVNDLFdBQVQsRUFBMkJiLFNBQTNCLEVBQTZDO0FBQ3ZFLFVBQUlhLFdBQVcsSUFBSUEsV0FBVyxDQUFDQyxLQUEvQixFQUFzQztBQUNyQyxlQUFPLENBQUNkLFNBQVMsQ0FBQ2UsSUFBVixDQUFlLFVBQVNiLGdCQUFULEVBQWdDO0FBQ3RELGlCQUFPQSxnQkFBZ0IsQ0FBQ0ksU0FBakIsQ0FBMkJPLFdBQVcsQ0FBQ0MsS0FBdkMsTUFBa0QsS0FBekQ7QUFDQSxTQUZPLENBQVI7QUFHQTs7QUFDRCxhQUFPRCxXQUFQO0FBQ0EsS0FsSHFCOztBQW9IdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDRyxJQUFBQSxvQkFBb0IsRUFBRSxVQUFTQyxNQUFULEVBQXdCakIsU0FBeEIsRUFBMENrQixVQUExQyxFQUE2RDtBQUNsRixVQUFNQyxVQUFVLEdBQUdGLE1BQU0sSUFBS0EsTUFBTSxDQUFDRyxRQUFQLEdBQWtCQyxZQUFsQixFQUE5QjtBQUFBLFVBQ0NDLHFCQUFxQixHQUFHTCxNQUFNLENBQUNNLElBQVAsQ0FBWSxVQUFaLENBRHpCO0FBQUEsVUFFQ0MsWUFBWSxHQUFHN0MsY0FBYyxDQUFDOEMsY0FBZixDQUE4QlIsTUFBOUIsQ0FGaEI7QUFBQSxVQUdDUyxrQkFBa0IsR0FBR1AsVUFBVSxDQUFDUSxVQUFYLENBQXNCTCxxQkFBcUIsR0FBRyxJQUE5QyxDQUh0QjtBQUFBLFVBSUNNLG9CQUFvQixHQUFHQywyQkFBMkIsQ0FBQ0gsa0JBQUQsQ0FKbkQ7QUFNQSxVQUFNSSxlQUFlLEdBQUcsSUFBSUMsU0FBSixFQUF4QjtBQUNBLFVBQUlDLE9BQUo7QUFDQSxVQUFJQyxVQUFKO0FBQ0EsVUFBSUMsaUJBQUo7QUFDQSxVQUFJQyxpQkFBSjtBQUNBLFVBQUlDLHdCQUFKO0FBQ0EsVUFBSUMsWUFBSjtBQUNBLFVBQUlDLFdBQUo7QUFDQSxVQUFJQyxjQUFKO0FBQ0EsVUFBSUMsWUFBSjtBQUNBLFVBQUlDLGNBQUo7QUFDQSxVQUFJQyxpQkFBSjtBQUVBbEIsTUFBQUEsWUFBWSxDQUFDcEMsT0FBYixDQUFxQixVQUFTdUQsV0FBVCxFQUEyQjtBQUMvQyxZQUFNaEQsaUJBQWlCLEdBQUdnRCxXQUFXLENBQUNDLFlBQXRDOztBQUNBLFlBQUlqRCxpQkFBSixFQUF1QjtBQUN0QixjQUFJa0QsYUFBYSxHQUFHbEQsaUJBQWlCLElBQUl3QixVQUFVLENBQUNiLFNBQVgsQ0FBcUJnQixxQkFBcUIsR0FBRyxHQUF4QixHQUE4QjNCLGlCQUE5QixHQUFrRCxHQUF2RSxDQUF6QztBQUNBdUMsVUFBQUEsaUJBQWlCLEdBQ2hCdkMsaUJBQWlCLElBQ2pCd0IsVUFBVSxDQUFDYixTQUFYLENBQXFCZ0IscUJBQXFCLEdBQUcsR0FBeEIsR0FBOEIzQixpQkFBOUIsR0FBa0QsR0FBdkUsQ0FEQSxJQUVBd0IsVUFBVSxDQUFDYixTQUFYLENBQXFCZ0IscUJBQXFCLEdBQUcsR0FBeEIsR0FBOEIzQixpQkFBOUIsR0FBa0QsR0FBdkUsRUFDQywyQ0FERCxDQUhEO0FBTUF3QyxVQUFBQSxpQkFBaUIsR0FDZlUsYUFBYSxJQUFJQSxhQUFhLENBQUMsNkJBQUQsQ0FBOUIsSUFBaUVBLGFBQWEsQ0FBQyw2QkFBRCxDQUFiLENBQTZDL0IsS0FBL0csSUFDQytCLGFBQWEsSUFDYkEsYUFBYSxDQUFDLG9DQUFELENBRGIsSUFFQUEsYUFBYSxDQUFDLG9DQUFELENBQWIsQ0FBb0QvQixLQUp0RDtBQUtBbUIsVUFBQUEsVUFBVSxHQUFHVSxXQUFXLENBQUNHLEtBQVosSUFBc0JELGFBQWEsSUFBSUEsYUFBYSxDQUFDLHVDQUFELENBQWpFO0FBQ0FULFVBQUFBLHdCQUF3QixHQUN2QkQsaUJBQWlCLElBQ2pCaEIsVUFBVSxDQUFDYixTQUFYLENBQXFCZ0IscUJBQXFCLEdBQUcsR0FBeEIsR0FBOEJhLGlCQUE5QixHQUFrRCxHQUF2RSxDQURBLElBRUFoQixVQUFVLENBQUNiLFNBQVgsQ0FBcUJnQixxQkFBcUIsR0FBRyxHQUF4QixHQUE4QmEsaUJBQTlCLEdBQWtELEdBQXZFLEVBQ0MsMkNBREQsQ0FIRDs7QUFNQSxjQUFJUCxvQkFBSixFQUEwQjtBQUN6QkEsWUFBQUEsb0JBQW9CLENBQUNtQixZQUFyQixHQUFvQ25CLG9CQUFvQixDQUFDb0IsZ0JBQXJCLENBQXNDQyxnQkFBdEMsQ0FBdUR0QyxNQUF2RCxDQUE4RCxVQUNqR3VDLFNBRGlHLEVBRWhHO0FBQ0QscUJBQU9BLFNBQVMsQ0FBQ0MsSUFBVixLQUFtQnhELGlCQUExQjtBQUNBLGFBSm1DLENBQXBDO0FBS0E7O0FBQ0RpQyxVQUFBQSxvQkFBb0IsQ0FBQ21CLFlBQXJCLEdBQW9DbkIsb0JBQW9CLENBQUNtQixZQUFyQixDQUFrQyxDQUFsQyxLQUF3QyxFQUE1RTtBQUNBUCxVQUFBQSxZQUFZLEdBQUdZLGNBQWMsQ0FBQ3hCLG9CQUFELEVBQXVCLEVBQXZCLEVBQTJCLElBQTNCLENBQWQsSUFBa0QsRUFBakU7QUFDQSxjQUFNeUIsYUFBYSxHQUFHbEMsVUFBVSxDQUFDUSxVQUFYLENBQXNCZ0IsV0FBVyxDQUFDVyxjQUFsQyxDQUF0QjtBQUFBLGNBQ0NDLG1CQUFtQixHQUFHQyx1QkFBdUIsQ0FBQ0gsYUFBRCxDQUQ5QztBQUFBLGNBRUNJLGdCQUFnQixHQUFHdEMsVUFBVSxDQUFDUSxVQUFYLENBQXNCTCxxQkFBcUIsR0FBRyxHQUF4QixHQUE4QjNCLGlCQUE5QixHQUFrRCxHQUF4RSxDQUZwQjtBQUFBLGNBR0MrRCxVQUFVLEdBQUdELGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ0UsWUFBakIsRUFIbEM7QUFJQXRCLFVBQUFBLFlBQVksR0FDWG9CLGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ0csV0FBakIsRUFBcEIsSUFBc0RILGdCQUFnQixDQUFDRyxXQUFqQixHQUErQiw4QkFBL0IsQ0FEdkQ7QUFFQXRCLFVBQUFBLFdBQVcsR0FDVm1CLGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ0csV0FBakIsRUFBcEIsSUFBc0RILGdCQUFnQixDQUFDRyxXQUFqQixHQUErQiw2QkFBL0IsQ0FEdkQ7QUFFQSxjQUFNQyxZQUFZLEdBQ2pCbEYsY0FBYyxDQUFDaUMseUJBQWYsQ0FDQ3lDLGFBQWEsSUFBSUEsYUFBYSxDQUFDL0MsU0FBZCxHQUEwQixvQ0FBMUIsQ0FEbEIsRUFFQ04sU0FGRCxLQUdLLEtBSk47QUFLQTBELFVBQUFBLFVBQVUsQ0FBQ0ksT0FBWCxHQUFxQjtBQUNwQjFDLFlBQUFBLFFBQVEsRUFBRSxZQUFXO0FBQ3BCLHFCQUFPc0MsVUFBVSxDQUFDdEMsUUFBWCxFQUFQO0FBQ0EsYUFIbUI7QUFJcEIyQyxZQUFBQSxPQUFPLEVBQUUsWUFBVztBQUNuQixxQkFBT3pDLHFCQUFxQixHQUFHLEdBQXhCLEdBQThCM0IsaUJBQXJDO0FBQ0E7QUFObUIsV0FBckI7QUFRQWtELFVBQUFBLGFBQWEsR0FDWFUsbUJBQW1CLElBQUlBLG1CQUFtQixDQUFDUyxLQUEzQyxJQUFvRFQsbUJBQW1CLENBQUNTLEtBQXBCLENBQTBCQyxPQUEvRSxJQUNDVixtQkFBbUIsSUFBSUEsbUJBQW1CLENBQUNXLE1BQTNDLElBQXFEWCxtQkFBbUIsQ0FBQ1csTUFBcEIsQ0FBMkJELE9BRmxGLENBbERzQixDQXFEdEI7O0FBQ0EsY0FBTUUsVUFBVSxHQUFHQyxvQkFBb0IsQ0FBQ3ZCLGFBQUQsQ0FBdkM7QUFDQU4sVUFBQUEsY0FBYyxHQUFHTSxhQUFhLElBQUlBLGFBQWEsQ0FBQ3dCLElBQS9CLElBQXVDeEIsYUFBYSxDQUFDd0IsSUFBZCxLQUF1QixrQ0FBL0U7QUFDQTVCLFVBQUFBLGNBQWMsR0FBR0ksYUFBYSxJQUFJbkUsZUFBZSxDQUFDZSxPQUFoQixDQUF3Qm9ELGFBQWEsQ0FBQ3lCLElBQXRDLE1BQWdELENBQUMsQ0FBbkY7QUFDQTVCLFVBQUFBLGlCQUFpQixHQUNmQyxXQUFXLElBQ1hBLFdBQVcsQ0FBQzRCLFNBRFosS0FFQzVCLFdBQVcsQ0FBQzRCLFNBQVosS0FBMEIsdUJBQTFCLElBQXFENUIsV0FBVyxDQUFDNEIsU0FBWixLQUEwQiw0QkFGaEYsQ0FBRCxJQUdBQywyQkFBMkIsQ0FBQzNCLGFBQUQsQ0FKNUI7O0FBS0EsY0FDQ2xELGlCQUFpQixJQUNqQixDQUFDa0UsWUFERCxJQUVBLENBQUN4QixZQUZELElBR0EsQ0FBQ0MsV0FIRCxJQUlBLENBQUNDLGNBSkQsSUFLQUUsY0FMQSxJQU1BLENBQUNDLGlCQU5ELElBT0FDLFdBQVcsQ0FBQzRCLFNBUFosSUFRQUUscUJBQXFCLENBQUM1QixhQUFELEVBQWdCVSxtQkFBaEIsRUFBcUMzQixvQkFBckMsQ0FBckIsS0FBb0YsT0FUckYsRUFVRTtBQUNESSxZQUFBQSxPQUFPLEdBQUc7QUFDVCx1QkFBU0MsVUFBVSxHQUFHLEdBRGI7QUFFVCx5QkFDQ3RDLGlCQUFpQixJQUNqQixDQUFDa0UsWUFERCxJQUVBLENBQUN4QixZQUZELElBR0EsQ0FBQ0MsV0FIRCxJQUlBbUMscUJBQXFCLENBQUM1QixhQUFELEVBQWdCVSxtQkFBaEIsRUFBcUMzQixvQkFBckMsQ0FQYjtBQVFULDhCQUFnQmpDLGlCQVJQO0FBU1Qsb0NBQXNCdUMsaUJBQWlCLEdBQUdBLGlCQUFILEdBQXVCLEtBVHJEO0FBVVQsOEJBQWdCQyxpQkFBaUIsR0FBR0EsaUJBQUgsR0FBdUIsS0FWL0M7QUFXVCwyQ0FBNkJDLHdCQUF3QixHQUFHQSx3QkFBSCxHQUE4QixLQVgxRTtBQVlULDBDQUE0QmQscUJBQXFCLEdBQUcsR0FBeEIsR0FBOEIzQixpQkFaakQ7QUFhVCw4Q0FBZ0MyQixxQkFBcUIsR0FBRyxHQUF4QixHQUE4QmEsaUJBYnJEO0FBY1QsaUNBQW1CdUMscUJBQXFCLENBQUM3QixhQUFELEVBQWdCVSxtQkFBaEIsRUFBcUMsSUFBckMsQ0FkL0I7QUFlVCxzQ0FBd0I1RCxpQkFBaUIsR0FDdENoQixjQUFjLENBQUNvQiwrQkFBZixDQUErQ0MsU0FBL0MsRUFBMERMLGlCQUExRCxDQURzQyxHQUV0QyxLQWpCTTtBQWtCVCwwQ0FBNEJ3QyxpQkFBaUIsR0FDMUN4RCxjQUFjLENBQUNvQiwrQkFBZixDQUErQ0MsU0FBL0MsRUFBMERtQyxpQkFBMUQsQ0FEMEMsR0FFMUMsS0FwQk07QUFxQlQsMkJBQWFiLHFCQXJCSjtBQXNCVCw2QkFBZWtCLFlBdEJOO0FBdUJULDBCQUFZSyxhQUFhLENBQUM4QixRQUFkLEtBQTJCQyxTQUEzQixHQUF1Qy9CLGFBQWEsQ0FBQzhCLFFBQXJELEdBQWdFLElBdkJuRTtBQXdCVCxvQ0FBc0JSLFVBQVUsS0FBS1MsU0FBZixHQUEyQlQsVUFBM0IsR0FBd0M7QUF4QnJELGFBQVY7QUEwQkFqRCxZQUFBQSxVQUFVLENBQUNULElBQVgsQ0FBZ0J1QixPQUFoQjtBQUNBO0FBQ0Q7QUFDRCxPQXhHRDtBQXlHQUYsTUFBQUEsZUFBZSxDQUFDK0MsT0FBaEIsQ0FBd0IzRCxVQUF4QjtBQUNBLGFBQU9ZLGVBQVA7QUFDQSxLQTNQcUI7QUE2UHRCZ0QsSUFBQUEscUJBQXFCLEVBQUUsVUFBU0MsT0FBVCxFQUF1QjtBQUM3QyxhQUNDQSxPQUFPLENBQUNDLFdBQVIsR0FBc0JDLFVBQXRCLElBQ0FGLE9BQU8sQ0FBQ0MsV0FBUixHQUFzQkMsVUFBdEIsRUFEQSxJQUVBRixPQUFPLENBQUNDLFdBQVIsR0FBc0JDLFVBQXRCLEdBQW1DQyxjQUZuQyxJQUdBSCxPQUFPLENBQ0xDLFdBREYsR0FFRUMsVUFGRixHQUdFQyxjQUhGLEVBSEEsSUFPQUgsT0FBTyxDQUNMQyxXQURGLEdBRUVDLFVBRkYsR0FHRUMsY0FIRixHQUdtQixDQUhuQixDQVBBLElBV0FILE9BQU8sQ0FDTEMsV0FERixHQUVFQyxVQUZGLEdBR0VDLGNBSEYsR0FHbUIsQ0FIbkIsRUFJRUMsV0FKRixHQUtFQyxPQUxGLEVBWkQ7QUFtQkEsS0FqUnFCO0FBbVJ0QjNELElBQUFBLGNBQWMsRUFBRSxVQUFTUixNQUFULEVBQXNCO0FBQ3JDLFVBQU1vRSxRQUFRLEdBQUlwRSxNQUFNLElBQUlBLE1BQU0sQ0FBQ3FFLFVBQVAsRUFBWCxJQUFtQyxFQUFwRDtBQUNBLGFBQU9ELFFBQVEsQ0FBQ0UsR0FBVCxDQUFhLFVBQVNSLE9BQVQsRUFBdUI7QUFDMUMsWUFBTVMsYUFBYSxHQUFHVCxPQUFPLElBQUlBLE9BQU8sQ0FBQ1UsZUFBUixFQUFqQztBQUFBLFlBQ0NDLGtCQUFrQixHQUNqQnpFLE1BQU0sQ0FBQ00sSUFBUCxDQUFZLFNBQVosS0FDQU4sTUFBTSxDQUFDTSxJQUFQLENBQVksU0FBWixFQUF1Qm9FLFVBQXZCLENBQWtDaEYsTUFBbEMsQ0FBeUMsVUFBU2dDLFdBQVQsRUFBMkI7QUFDbkUsaUJBQU9BLFdBQVcsQ0FBQ1EsSUFBWixLQUFxQnFDLGFBQXJCLElBQXNDN0MsV0FBVyxDQUFDMkIsSUFBWixLQUFxQixZQUFsRTtBQUNBLFNBRkQsQ0FIRjtBQU1BLGVBQU87QUFDTiwwQkFBZ0JrQixhQURWO0FBRU4sbUJBQVNULE9BQU8sQ0FBQ2EsU0FBUixFQUZIO0FBR04sNEJBQWtCRixrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUMsQ0FBRCxDQUF4QyxJQUErQ0Esa0JBQWtCLENBQUMsQ0FBRCxDQUFsQixDQUFzQnBDLGNBSGpGO0FBSU4sdUJBQWEzRSxjQUFjLENBQUNtRyxxQkFBZixDQUFxQ0MsT0FBckM7QUFKUCxTQUFQO0FBTUEsT0FiTSxDQUFQO0FBY0EsS0FuU3FCO0FBcVN0QmMsSUFBQUEsd0JBQXdCLEVBQUUsVUFBU0MsZUFBVCxFQUErQkMsaUJBQS9CLEVBQXVEOUUsTUFBdkQsRUFBb0U7QUFDN0Y7QUFDQSxVQUFNK0UsWUFBWSxHQUFHL0UsTUFBTSxDQUFDTSxJQUFQLENBQVksNEJBQVosTUFBOEMsTUFBbkU7QUFFQSxhQUFPO0FBQ04sOEJBQXNCLFFBRGhCO0FBRU4sMkJBQW1CLGlCQUZiO0FBR04sMkJBQW1CLGtCQUhiO0FBSU4seUJBQWlCdUUsZUFBZSxDQUFDRyxPQUFoQixDQUF3QiwwQkFBeEIsRUFBb0RGLGlCQUFpQixDQUFDRyxRQUFsQixFQUFwRCxDQUpYO0FBS04sMkJBQW1CRixZQUFZLEdBQzVCRixlQUFlLENBQUNHLE9BQWhCLENBQXdCLDhCQUF4QixDQUQ0QixHQUU1QkgsZUFBZSxDQUFDRyxPQUFoQixDQUF3QiwrQkFBeEIsQ0FQRztBQVFOLDRCQUFvQkgsZUFBZSxDQUFDRyxPQUFoQixDQUF3QixnQ0FBeEI7QUFSZCxPQUFQO0FBVUEsS0FuVHFCOztBQXFUdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NFLElBQUFBLHlCQUF5QixFQUFFLFVBQVNDLFVBQVQsRUFBNkI7QUFDdkQsVUFBSUMsT0FBTyxHQUFHLFFBQWQ7O0FBRUEsY0FBUUQsVUFBUjtBQUNDO0FBQ0EsYUFBSyxrQkFBTDtBQUNDQyxVQUFBQSxPQUFPLEdBQUcsT0FBVjtBQUNBOztBQUNELGFBQUssZ0JBQUw7QUFDQ0EsVUFBQUEsT0FBTyxHQUFHLFVBQVY7QUFDQTtBQVBGOztBQVNBLGFBQU9BLE9BQVA7QUFDQSxLQXhVcUI7O0FBMFV0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEsd0JBQXdCLEVBQUUsVUFBU3hILE9BQVQsRUFBeUJrQixTQUF6QixFQUEyQ3VHLGNBQTNDLEVBQWdFMUQsYUFBaEUsRUFBb0YyRCxTQUFwRixFQUF5RztBQUNsSSxVQUFNbkgsYUFBYSxHQUFHd0QsYUFBYSxDQUFDRCxZQUFwQztBQUFBLFVBQ0N3RCxVQUFVLEdBQUd2RCxhQUFhLENBQUMwQixTQUQ1QjtBQUFBLFVBRUNrQyxpQkFBaUIsR0FBRzVELGFBQWEsQ0FBQzZELGVBRm5DO0FBR0EsVUFBTUMsc0JBQXNCLEdBQUdoSSxjQUFjLENBQUN3SCx5QkFBZixDQUF5Q0MsVUFBekMsQ0FBL0IsQ0FKa0ksQ0FLbEk7QUFDQTs7QUFDQSxVQUFNUSwyQkFBMkIsR0FBRzVHLFNBQVMsQ0FBQ2UsSUFBVixDQUFlLFVBQVNiLGdCQUFULEVBQWdDO0FBQ2xGLGVBQU9BLGdCQUFnQixDQUFDSSxTQUFqQixDQUEyQmpCLGFBQTNCLENBQVA7QUFDQSxPQUZtQyxDQUFwQzs7QUFHQSxVQUFJdUgsMkJBQUosRUFBaUM7QUFDaEMsWUFBSUgsaUJBQWlCLEtBQUssTUFBdEIsSUFBZ0MsQ0FBQ0QsU0FBckMsRUFBZ0Q7QUFDL0MxSCxVQUFBQSxPQUFPLENBQUMrSCxPQUFSLENBQWdCO0FBQUVDLFlBQUFBLElBQUksRUFBRVAsY0FBYyxDQUFDUSxlQUF2QjtBQUF3Q0MsWUFBQUEsR0FBRyxFQUFFLHFCQUFxQjNIO0FBQWxFLFdBQWhCO0FBQ0E7QUFDRCxPQUpELE1BSU87QUFDTlAsUUFBQUEsT0FBTyxDQUFDK0gsT0FBUixDQUFnQjtBQUFFQyxVQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ1UsZUFBdkI7QUFBd0NELFVBQUFBLEdBQUcsRUFBRSxXQUFXM0g7QUFBeEQsU0FBaEI7QUFDQTs7QUFDRFAsTUFBQUEsT0FBTyxDQUFDK0gsT0FBUixDQUFnQjtBQUNmQyxRQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ1csa0JBQWYsR0FBb0MsR0FBcEMsR0FBMENQLHNCQUExQyxHQUFtRSxJQUQxRDtBQUVmSyxRQUFBQSxHQUFHLEVBQUUsYUFBYTNIO0FBRkgsT0FBaEI7QUFJQSxLQXhXcUI7QUEwV3RCOEgsSUFBQUEsc0JBQXNCLEVBQUUsVUFDdkJDLFNBRHVCLEVBRXZCNUUsWUFGdUIsRUFHdkI2RSxpQkFIdUIsRUFJdkJuSCxnQkFKdUIsRUFLVztBQUNsQyxVQUFNaUIsVUFBVSxHQUFHakIsZ0JBQWdCLENBQUNrQixRQUFqQixHQUE0QkMsWUFBNUIsRUFBbkI7QUFDQSxVQUFNaUcsWUFBWSxHQUFHQyxXQUFXLENBQUNDLGtCQUFaLENBQStCckcsVUFBVSxDQUFDYixTQUFYLENBQXFCK0csaUJBQWlCLEdBQUcsR0FBcEIsR0FBMEJELFNBQTFCLEdBQXNDLEdBQTNELENBQS9CLENBQXJCO0FBQ0EsVUFBSUssZ0JBQUosRUFBc0JsSSxNQUF0QixFQUE4Qm1JLGlCQUE5QixFQUFpREMsU0FBakQ7O0FBQ0EsVUFBSW5GLFlBQVksS0FBS0EsWUFBWSxDQUFDb0YsSUFBYixJQUFzQnBGLFlBQVksQ0FBQ3FGLFVBQWIsSUFBMkJyRixZQUFZLENBQUNxRixVQUFiLENBQXdCNUgsTUFBOUUsQ0FBWixJQUFzR21ILFNBQTFHLEVBQXFIO0FBQ3BILFlBQUk1RSxZQUFZLENBQUNvRixJQUFqQixFQUF1QjtBQUN0QixjQUFJTixZQUFZLEtBQUssYUFBckIsRUFBb0M7QUFDbkMvSCxZQUFBQSxNQUFNLEdBQUdXLGdCQUFnQixDQUFDSSxTQUFqQixDQUEyQjhHLFNBQTNCLENBQVQ7QUFDQU0sWUFBQUEsaUJBQWlCLEdBQUd4SCxnQkFBZ0IsQ0FBQ0ksU0FBakIsQ0FBMkJrQyxZQUFZLENBQUNvRixJQUF4QyxDQUFwQjtBQUNBRCxZQUFBQSxTQUFTLEdBQUdELGlCQUFaO0FBQ0EsV0FKRCxNQUlPLElBQUlKLFlBQVksS0FBSyxPQUFyQixFQUE4QjtBQUNwQy9ILFlBQUFBLE1BQU0sR0FBR1csZ0JBQWdCLENBQUNJLFNBQWpCLENBQTJCOEcsU0FBM0IsQ0FBVDtBQUNBTyxZQUFBQSxTQUFTLEdBQUdwSSxNQUFaO0FBQ0E7QUFDRCxTQVRELE1BU08sSUFBSWlELFlBQVksQ0FBQ3FGLFVBQWpCLEVBQTZCO0FBQ25DckYsVUFBQUEsWUFBWSxDQUFDcUYsVUFBYixDQUF3QnpJLE9BQXhCLENBQWdDLFVBQVMwSSxNQUFULEVBQXNCO0FBQ3JELGdCQUFJQSxNQUFNLENBQUNGLElBQVAsSUFBZUUsTUFBTSxDQUFDRixJQUFQLEtBQWdCUixTQUFuQyxFQUE4QztBQUM3Q0ssY0FBQUEsZ0JBQWdCLEdBQUdLLE1BQU0sQ0FBQ0YsSUFBMUI7QUFDQTtBQUNELFdBSkQ7QUFLQXJJLFVBQUFBLE1BQU0sR0FBR1csZ0JBQWdCLENBQUNJLFNBQWpCLENBQTJCOEcsU0FBM0IsQ0FBVDtBQUNBTSxVQUFBQSxpQkFBaUIsR0FBR3hILGdCQUFnQixDQUFDSSxTQUFqQixDQUEyQm1ILGdCQUEzQixDQUFwQjs7QUFDQSxjQUFJSCxZQUFZLEtBQUssa0JBQWpCLElBQXVDL0gsTUFBdkMsSUFBaURtSSxpQkFBckQsRUFBd0U7QUFDdkVDLFlBQUFBLFNBQVMsR0FBR3BJLE1BQU0sR0FBRyxJQUFULEdBQWdCbUksaUJBQWhCLEdBQW9DLEdBQWhEO0FBQ0EsV0FGRCxNQUVPLElBQUlKLFlBQVksS0FBSyxrQkFBakIsSUFBdUNJLGlCQUF2QyxJQUE0RG5JLE1BQWhFLEVBQXdFO0FBQzlFb0ksWUFBQUEsU0FBUyxHQUFHRCxpQkFBaUIsR0FBRyxJQUFwQixHQUEyQm5JLE1BQTNCLEdBQW9DLEdBQWhEO0FBQ0E7QUFDRDs7QUFDRCxlQUFPO0FBQ04sNkJBQW1CK0gsWUFEYjtBQUVOLHVCQUFhRixTQUZQO0FBR04sNkJBQW1CSyxnQkFIYjtBQUlOLG1CQUFTbEksTUFKSDtBQUtOLHlCQUFlbUksaUJBTFQ7QUFNTixzQkFBWUM7QUFOTixTQUFQO0FBUUE7O0FBQ0QsYUFBTy9DLFNBQVA7QUFDQSxLQXJacUI7O0FBdVp0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDbUQsSUFBQUEsdUJBQXVCLEVBQUUsVUFBUy9ILFNBQVQsRUFBMkJrQixVQUEzQixFQUE4Q3FGLGNBQTlDLEVBQW1FO0FBQzNGLFVBQU16SCxPQUFjLEdBQUcsRUFBdkI7QUFDQSxVQUFNa0osU0FBZ0IsR0FBRyxFQUF6QjtBQUNBLFVBQU1DLFFBQWUsR0FBRyxFQUF4QjtBQUNBLFVBQU1DLGtCQUF5QixHQUFHLEVBQWxDO0FBQ0EsVUFBTUMsaUJBQXNCLEdBQUcsRUFBL0I7QUFDQSxVQUFJQyxhQUFKO0FBQ0FsSCxNQUFBQSxVQUFVLENBQUM5QixPQUFYLENBQW1CLFVBQVNpSixLQUFULEVBQXFCO0FBQ3ZDLFlBQUlDLFNBQUo7O0FBQ0EsWUFBSUQsS0FBSyxDQUFDekYsWUFBTixJQUFzQnlGLEtBQUssQ0FBQ3pGLFlBQU4sQ0FBbUJuRCxPQUFuQixDQUEyQixHQUEzQixJQUFrQyxDQUFDLENBQTdELEVBQWdFO0FBQy9ELGNBQU1WLFVBQVUsR0FBR0osY0FBYyxDQUFDQywyQkFBZixDQUEyQ3lKLEtBQUssQ0FBQ3pGLFlBQWpELEVBQStEOUQsT0FBL0QsQ0FBbkI7QUFDQSxjQUFNZSxjQUFjLEdBQUd3SSxLQUFLLENBQUN6RixZQUFOLENBQW1CMUQsS0FBbkIsQ0FBeUIsR0FBekIsQ0FBdkI7QUFDQSxjQUFJcUosWUFBSjs7QUFDQSxlQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUd4SSxTQUFTLENBQUNDLE1BQTlCLEVBQXNDdUksQ0FBQyxFQUF2QyxFQUEyQztBQUMxQyxnQkFBTUMsb0JBQW9CLEdBQUd6SSxTQUFTLENBQUN3SSxDQUFELENBQVQsQ0FBYWxJLFNBQWIsQ0FBdUIrSCxLQUFLLENBQUN6RixZQUE3QixDQUE3QjtBQUNBMkYsWUFBQUEsWUFBWSxHQUFHRixLQUFLLENBQUN6RixZQUFOLEdBQXFCLEdBQXJCLEdBQTJCNkYsb0JBQTFDOztBQUNBLGdCQUFJLENBQUNOLGlCQUFpQixDQUFDSSxZQUFELENBQWxCLElBQW9DeEosVUFBVSxDQUFDYyxjQUFjLENBQUNBLGNBQWMsQ0FBQ0ksTUFBZixHQUF3QixDQUF6QixDQUFmLENBQWxELEVBQStGO0FBQzlGcUksY0FBQUEsU0FBUyxHQUFHM0osY0FBYyxDQUFDd0ksc0JBQWYsQ0FDWGtCLEtBQUssQ0FBQ3pGLFlBREssRUFFWHlGLEtBQUssQ0FBQ0ssV0FGSyxFQUdYTCxLQUFLLENBQUNNLFNBSEssRUFJWDNJLFNBQVMsQ0FBQ3dJLENBQUQsQ0FKRSxDQUFaO0FBTUF6SixjQUFBQSxVQUFVLENBQUNjLGNBQWMsQ0FBQ0EsY0FBYyxDQUFDSSxNQUFmLEdBQXdCLENBQXpCLENBQWYsQ0FBVixDQUFzRFEsSUFBdEQsQ0FBMkQ7QUFDMUQsd0JBQVM2SCxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sUUFBeEIsSUFBcUNILG9CQURhO0FBRTFELHVCQUFPSixLQUFLLENBQUN6RixZQUY2QztBQUcxRCw0QkFBWTBGO0FBSDhDLGVBQTNEO0FBS0FILGNBQUFBLGlCQUFpQixDQUFDSSxZQUFELENBQWpCLEdBQWtDRSxvQkFBbEM7QUFDQTtBQUNEO0FBQ0QsU0F0QkQsTUFzQk87QUFDTjNKLFVBQUFBLE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxHQUE4QjlELE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxJQUErQixFQUE3RDs7QUFDQSxjQUFJeUYsS0FBSyxDQUFDUSxZQUFWLEVBQXdCO0FBQ3ZCYixZQUFBQSxTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULEdBQWdDYixTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULElBQWlDLEVBQWpFO0FBQ0E7O0FBQ0QsZUFBSyxJQUFJTCxFQUFDLEdBQUcsQ0FBYixFQUFnQkEsRUFBQyxHQUFHeEksU0FBUyxDQUFDQyxNQUE5QixFQUFzQ3VJLEVBQUMsRUFBdkMsRUFBMkM7QUFDMUMsZ0JBQU1uSSxXQUFXLEdBQUdMLFNBQVMsQ0FBQ3dJLEVBQUQsQ0FBVCxDQUFhbEksU0FBYixFQUFwQjs7QUFDQThILFlBQUFBLGFBQWEsR0FBR0MsS0FBSyxDQUFDekYsWUFBTixHQUFxQixHQUFyQixHQUEyQnZDLFdBQVcsQ0FBQ2dJLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBdEQ7O0FBQ0EsZ0JBQUl5RixLQUFLLENBQUN6RixZQUFOLElBQXNCdkMsV0FBVyxDQUFDZ0ksS0FBSyxDQUFDekYsWUFBUCxDQUFqQyxJQUF5RCxDQUFDdUYsaUJBQWlCLENBQUNDLGFBQUQsQ0FBL0UsRUFBZ0c7QUFDL0ZFLGNBQUFBLFNBQVMsR0FBRzNKLGNBQWMsQ0FBQ3dJLHNCQUFmLENBQ1hrQixLQUFLLENBQUN6RixZQURLLEVBRVh5RixLQUFLLENBQUNLLFdBRkssRUFHWEwsS0FBSyxDQUFDTSxTQUhLLEVBSVgzSSxTQUFTLENBQUN3SSxFQUFELENBSkUsQ0FBWjtBQU1BMUosY0FBQUEsT0FBTyxDQUFDdUosS0FBSyxDQUFDekYsWUFBUCxDQUFQLENBQTRCbkMsSUFBNUIsQ0FBaUM7QUFDaEMsd0JBQVM2SCxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sUUFBeEIsSUFBcUN2SSxXQUFXLENBQUNnSSxLQUFLLENBQUN6RixZQUFQLENBRHhCO0FBRWhDLHVCQUFPeUYsS0FBSyxDQUFDekYsWUFGbUI7QUFHaEMsNEJBQVkwRjtBQUhvQixlQUFqQztBQUtBSCxjQUFBQSxpQkFBaUIsQ0FBQ0MsYUFBRCxDQUFqQixHQUFtQy9ILFdBQVcsQ0FBQ2dJLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBOUM7QUFDQTs7QUFDRCxnQkFBSXlGLEtBQUssQ0FBQ1EsWUFBTixJQUFzQnhJLFdBQVcsQ0FBQ2dJLEtBQUssQ0FBQ1EsWUFBUCxDQUFyQyxFQUEyRDtBQUMxRFQsY0FBQUEsYUFBYSxHQUFHQyxLQUFLLENBQUNRLFlBQU4sR0FBcUIsR0FBckIsR0FBMkJ4SSxXQUFXLENBQUNnSSxLQUFLLENBQUNRLFlBQVAsQ0FBdEQ7O0FBQ0Esa0JBQUksQ0FBQ1YsaUJBQWlCLENBQUNDLGFBQUQsQ0FBdEIsRUFBdUM7QUFDdENFLGdCQUFBQSxTQUFTLEdBQUczSixjQUFjLENBQUN3SSxzQkFBZixDQUNYa0IsS0FBSyxDQUFDUSxZQURLLEVBRVhSLEtBQUssQ0FBQ0ssV0FGSyxFQUdYTCxLQUFLLENBQUNNLFNBSEssRUFJWDNJLFNBQVMsQ0FBQ3dJLEVBQUQsQ0FKRSxDQUFaO0FBTUFSLGdCQUFBQSxTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULENBQThCcEksSUFBOUIsQ0FBbUM7QUFDbEMsMEJBQVM2SCxTQUFTLElBQUlBLFNBQVMsQ0FBQ00sUUFBeEIsSUFBcUN2SSxXQUFXLENBQUNnSSxLQUFLLENBQUNRLFlBQVAsQ0FEdEI7QUFFbEMseUJBQU9SLEtBQUssQ0FBQ1EsWUFGcUI7QUFHbEMsOEJBQVlQO0FBSHNCLGlCQUFuQztBQUtBSCxnQkFBQUEsaUJBQWlCLENBQUNDLGFBQUQsQ0FBakIsR0FBbUMvSCxXQUFXLENBQUNnSSxLQUFLLENBQUNRLFlBQVAsQ0FBOUM7QUFDQTtBQUNEO0FBQ0Q7QUFDRDtBQUNELE9BakVEO0FBa0VBM0gsTUFBQUEsVUFBVSxDQUFDOUIsT0FBWCxDQUFtQixVQUFTaUosS0FBVCxFQUFxQjtBQUN2QyxZQUFJQSxLQUFLLENBQUN6RixZQUFOLENBQW1CbkQsT0FBbkIsQ0FBMkIsR0FBM0IsSUFBa0MsQ0FBQyxDQUF2QyxFQUEwQztBQUN6QyxjQUFNcUosd0JBQXdCLEdBQUduSyxjQUFjLENBQUNlLHlCQUFmLENBQXlDMkksS0FBSyxDQUFDekYsWUFBL0MsRUFBNkQ5RCxPQUE3RCxDQUFqQzs7QUFDQSxjQUFJLENBQUNnSyx3QkFBTCxFQUErQjtBQUM5QkEsWUFBQUEsd0JBQXdCLENBQUNySSxJQUF6QixDQUE4QjtBQUFFcUcsY0FBQUEsSUFBSSxFQUFFUCxjQUFjLENBQUNVLGVBQXZCO0FBQXdDRCxjQUFBQSxHQUFHLEVBQUUsV0FBV3FCLEtBQUssQ0FBQ3pGO0FBQTlELGFBQTlCO0FBQ0EsV0FGRCxNQUVPO0FBQ05qRSxZQUFBQSxjQUFjLENBQUMySCx3QkFBZixDQUF3Q3dDLHdCQUF4QyxFQUFrRTlJLFNBQWxFLEVBQTZFdUcsY0FBN0UsRUFBNkY4QixLQUE3RjtBQUNBO0FBQ0QsU0FQRCxNQU9PLElBQUl2SixPQUFPLENBQUN1SixLQUFLLENBQUN6RixZQUFQLENBQVAsSUFBK0I5RCxPQUFPLENBQUN1SixLQUFLLENBQUN6RixZQUFQLENBQVAsQ0FBNEIzQyxNQUEvRCxFQUF1RTtBQUM3RXRCLFVBQUFBLGNBQWMsQ0FBQzJILHdCQUFmLENBQXdDeEgsT0FBTyxDQUFDdUosS0FBSyxDQUFDekYsWUFBUCxDQUEvQyxFQUFxRTVDLFNBQXJFLEVBQWdGdUcsY0FBaEYsRUFBZ0c4QixLQUFoRztBQUNBOztBQUNELFlBQUlMLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDUSxZQUFQLENBQVQsSUFBaUNiLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDUSxZQUFQLENBQVQsQ0FBOEI1SSxNQUFuRSxFQUEyRTtBQUMxRXRCLFVBQUFBLGNBQWMsQ0FBQzJILHdCQUFmLENBQXdDMEIsU0FBUyxDQUFDSyxLQUFLLENBQUNRLFlBQVAsQ0FBakQsRUFBdUU3SSxTQUF2RSxFQUFrRnVHLGNBQWxGLEVBQWtHOEIsS0FBbEcsRUFBeUcsSUFBekc7QUFDQSxTQUZELE1BRU8sSUFDTEEsS0FBSyxDQUFDekYsWUFBTixJQUFzQjlELE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBN0IsSUFBcUQsQ0FBQzlELE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxDQUE0QjNDLE1BQW5GLElBQ0NvSSxLQUFLLENBQUNRLFlBQU4sSUFBc0JiLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDUSxZQUFQLENBQS9CLElBQXVELENBQUNiLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDUSxZQUFQLENBQVQsQ0FBOEI1SSxNQUZqRixFQUdMO0FBQ0QsY0FBTThJLDZCQUE2QixHQUNsQ2pLLE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxJQUNBOUQsT0FBTyxDQUFDdUosS0FBSyxDQUFDekYsWUFBUCxDQUFQLENBQTRCN0IsSUFBNUIsQ0FBaUMsVUFBU2lJLEdBQVQsRUFBbUI7QUFDbkQsbUJBQU9BLEdBQUcsQ0FBQ2xDLElBQUosS0FBYSxrQkFBYixJQUFtQ2tDLEdBQUcsQ0FBQ2xDLElBQUosS0FBYSxpQkFBdkQ7QUFDQSxXQUZELENBRkQ7O0FBS0EsY0FBSXVCLEtBQUssQ0FBQ3pGLFlBQU4sSUFBc0IsQ0FBQ21HLDZCQUEzQixFQUEwRDtBQUN6RGpLLFlBQUFBLE9BQU8sQ0FBQ3VKLEtBQUssQ0FBQ3pGLFlBQVAsQ0FBUCxDQUE0Qm5DLElBQTVCLENBQWlDO0FBQUVxRyxjQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ1UsZUFBdkI7QUFBd0NELGNBQUFBLEdBQUcsRUFBRSxXQUFXcUIsS0FBSyxDQUFDekY7QUFBOUQsYUFBakM7QUFDQTs7QUFDRCxjQUFNcUcsaUNBQWlDLEdBQ3RDakIsU0FBUyxDQUFDSyxLQUFLLENBQUNRLFlBQVAsQ0FBVCxJQUNBYixTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULENBQThCOUgsSUFBOUIsQ0FBbUMsVUFBU2lJLEdBQVQsRUFBbUI7QUFDckQsbUJBQU9BLEdBQUcsQ0FBQ2xDLElBQUosS0FBYSxrQkFBYixJQUFtQ2tDLEdBQUcsQ0FBQ2xDLElBQUosS0FBYSxpQkFBdkQ7QUFDQSxXQUZELENBRkQ7O0FBS0EsY0FBSXVCLEtBQUssQ0FBQ1EsWUFBTixJQUFzQixDQUFDSSxpQ0FBM0IsRUFBOEQ7QUFDN0RqQixZQUFBQSxTQUFTLENBQUNLLEtBQUssQ0FBQ1EsWUFBUCxDQUFULENBQThCcEksSUFBOUIsQ0FBbUM7QUFDbENxRyxjQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ1UsZUFEYTtBQUVsQ0QsY0FBQUEsR0FBRyxFQUFFLFdBQVdxQixLQUFLLENBQUNRO0FBRlksYUFBbkM7QUFJQTtBQUNEOztBQUNELFlBQUlSLEtBQUssQ0FBQ2Esa0JBQU4sSUFBNEIsT0FBT2IsS0FBSyxDQUFDYSxrQkFBYixLQUFvQyxTQUFwRSxFQUErRTtBQUM5RWhCLFVBQUFBLGtCQUFrQixDQUFDekgsSUFBbkIsQ0FBd0I7QUFBRSx3QkFBWTRILEtBQUssQ0FBQ3pGLFlBQXBCO0FBQWtDdUcsWUFBQUEsS0FBSyxFQUFFZCxLQUFLLENBQUNhLGtCQUEvQztBQUFtRTVFLFlBQUFBLElBQUksRUFBRTtBQUF6RSxXQUF4QjtBQUNBLFNBRkQsTUFFTyxJQUNOK0QsS0FBSyxDQUFDYSxrQkFBTixJQUNBYixLQUFLLENBQUNhLGtCQUFOLENBQXlCRSxRQUR6QixJQUVBZixLQUFLLENBQUNhLGtCQUFOLENBQXlCRSxRQUF6QixDQUFrQyxDQUFsQyxDQUZBLElBR0FmLEtBQUssQ0FBQ2Esa0JBQU4sQ0FBeUJFLFFBQXpCLENBQWtDLENBQWxDLEVBQXFDQyxRQUhyQyxJQUlBaEIsS0FBSyxDQUFDYSxrQkFBTixDQUF5QkUsUUFBekIsQ0FBa0MsQ0FBbEMsRUFBcUNFLFFBTC9CLEVBTUw7QUFDRDtBQUNBcEIsVUFBQUEsa0JBQWtCLENBQUN6SCxJQUFuQixDQUF3QjtBQUN2Qix3QkFBWTRILEtBQUssQ0FBQ3pGLFlBREs7QUFFdkIyRyxZQUFBQSxZQUFZLEVBQUVsQixLQUFLLENBQUNhLGtCQUFOLENBQXlCRSxRQUF6QixDQUFrQyxDQUFsQyxFQUFxQ0MsUUFBckMsQ0FBOEN6QixJQUZyQztBQUd2QjRCLFlBQUFBLGFBQWEsRUFBRW5CLEtBQUssQ0FBQ2Esa0JBQU4sQ0FBeUJFLFFBQXpCLENBQWtDLENBQWxDLEVBQXFDRSxRQUFyQyxDQUE4Q0gsS0FIdEM7QUFJdkI3RSxZQUFBQSxJQUFJLEVBQUU7QUFKaUIsV0FBeEI7QUFNQTtBQUNELE9BdEREO0FBdURBLFVBQU0rRCxLQUFLLEdBQUc7QUFBRSxrQkFBVXZKLE9BQVo7QUFBcUIsb0JBQVlrSixTQUFqQztBQUE0QyxtQkFBV0MsUUFBdkQ7QUFBaUUsZ0NBQXdCQztBQUF6RixPQUFkO0FBQ0EsVUFBTXVCLGdCQUFnQixHQUFHLElBQUkxSCxTQUFKLENBQWNzRyxLQUFkLENBQXpCO0FBQ0EsYUFBT29CLGdCQUFQO0FBQ0EsS0FwaUJxQjs7QUFzaUJ0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLFlBQVksRUFBRSxVQUFTekksTUFBVCxFQUF3QmpCLFNBQXhCLEVBQTBDMkosV0FBMUMsRUFBdUU7QUFDcEYsVUFBTUMsYUFBYSxHQUFHLDhDQUF0QjtBQUFBLFVBQ0MxSSxVQUFpQixHQUFHLEVBRHJCO0FBQUEsVUFFQzRFLGVBQWUsR0FBRytELEdBQUcsQ0FBQ0MsRUFBSixDQUFPQyxPQUFQLEdBQWlCQyx3QkFBakIsQ0FBMEMsYUFBMUMsQ0FGbkI7QUFBQSxVQUdDekQsY0FBYyxHQUFHNUgsY0FBYyxDQUFDa0gsd0JBQWYsQ0FBd0NDLGVBQXhDLEVBQXlEOUYsU0FBUyxDQUFDQyxNQUFuRSxFQUEyRWdCLE1BQTNFLENBSGxCO0FBQUEsVUFJQ2EsZUFBZSxHQUFHbkQsY0FBYyxDQUFDcUMsb0JBQWYsQ0FBb0NDLE1BQXBDLEVBQTRDakIsU0FBNUMsRUFBdURrQixVQUF2RCxDQUpuQjtBQUFBLFVBS0N1SSxnQkFBZ0IsR0FBRzlLLGNBQWMsQ0FBQ29KLHVCQUFmLENBQXVDL0gsU0FBdkMsRUFBa0RrQixVQUFsRCxFQUE4RHFGLGNBQTlELENBTHBCO0FBT0EsYUFBTyxJQUFJMEQsT0FBSixDQUFZLFVBQVNDLE9BQVQsRUFBd0NDLE1BQXhDLEVBQXdFO0FBQzFGLFlBQU1DLFNBQVMsR0FBR0Msb0JBQW9CLENBQUNDLFlBQXJCLENBQWtDVixhQUFsQyxFQUFpRCxVQUFqRCxDQUFsQjtBQUNBLGVBQU9LLE9BQU8sQ0FBQ0MsT0FBUixDQUNOSyxlQUFlLENBQUNDLE9BQWhCLENBQ0NKLFNBREQsRUFFQztBQUFFakgsVUFBQUEsSUFBSSxFQUFFeUc7QUFBUixTQUZELEVBR0M7QUFDQ2EsVUFBQUEsZUFBZSxFQUFFO0FBQ2hCQyxZQUFBQSxjQUFjLEVBQUU1SSxlQUFlLENBQUM2SSxvQkFBaEIsQ0FBcUMsR0FBckM7QUFEQSxXQURsQjtBQUlDQyxVQUFBQSxNQUFNLEVBQUU7QUFDUEYsWUFBQUEsY0FBYyxFQUFFNUk7QUFEVDtBQUpULFNBSEQsQ0FETSxFQWNMK0ksSUFkSyxDQWNBLFVBQVNULFNBQVQsRUFBeUI7QUFDOUIsaUJBQU9VLFFBQVEsQ0FBQ0MsSUFBVCxDQUFjO0FBQUVDLFlBQUFBLFVBQVUsRUFBRVo7QUFBZCxXQUFkLEVBQXlDUyxJQUF6QyxDQUE4QyxVQUFTSSxjQUFULEVBQThCO0FBQ2xGLGdCQUFNQyxPQUFPLEdBQUcsSUFBSUMsTUFBSixDQUFXO0FBQzFCQyxjQUFBQSxLQUFLLEVBQUU3RSxjQUFjLENBQUM4RSxhQURJO0FBRTFCQyxjQUFBQSxPQUFPLEVBQUUsQ0FBQ0wsY0FBRCxDQUZpQjtBQUcxQk0sY0FBQUEsV0FBVyxFQUFFLElBQUlDLE1BQUosQ0FBVztBQUN2QjFFLGdCQUFBQSxJQUFJLEVBQUVQLGNBQWMsQ0FBQ2tGLGVBREU7QUFFdkJuSCxnQkFBQUEsSUFBSSxFQUFFLFlBRmlCO0FBR3ZCb0gsZ0JBQUFBLEtBQUssRUFBRSxVQUFTQyxNQUFULEVBQXNCO0FBQzVCLHNCQUFNVCxPQUFPLEdBQUdTLE1BQU0sQ0FBQ0MsU0FBUCxHQUFtQkMsU0FBbkIsRUFBaEI7QUFDQSxzQkFBTUMsTUFBTSxHQUFHWixPQUFPLENBQUM5SixRQUFSLENBQWlCLFlBQWpCLENBQWY7QUFDQSxzQkFBTTZHLFFBQVEsR0FBRzZELE1BQU0sQ0FBQ2xJLFdBQVAsQ0FBbUIsVUFBbkIsQ0FBakI7QUFDQSxzQkFBTW1JLHFCQUFxQixHQUFHRCxNQUFNLENBQUNsSSxXQUFQLENBQW1CLHVCQUFuQixDQUE5QjtBQUNBLHNCQUFNb0ksYUFBb0IsR0FBRyxFQUE3QjtBQUNBLHNCQUFJQyxjQUFjLEdBQUcsS0FBckI7QUFFQWpNLGtCQUFBQSxTQUFTLENBQUNaLE9BQVYsQ0FBa0IsVUFBU2MsZ0JBQVQsRUFBZ0M7QUFDakQrSCxvQkFBQUEsUUFBUSxDQUFDN0ksT0FBVCxDQUFpQixVQUFTNEMsT0FBVCxFQUF1QjtBQUN2QztBQUNBLDBCQUFJK0oscUJBQUosRUFBMkI7QUFDMUJFLHdCQUFBQSxjQUFjLEdBQUdGLHFCQUFxQixDQUFDaEwsSUFBdEIsQ0FBMkIsVUFBUzhCLGFBQVQsRUFBNkI7QUFDeEUsOEJBQUliLE9BQU8sQ0FBQ2tLLFFBQVIsS0FBcUJySixhQUFhLENBQUNzSixRQUF2QyxFQUFpRDtBQUNoRCxnQ0FBSXRKLGFBQWEsQ0FBQ3lCLElBQWQsS0FBdUIsU0FBM0IsRUFBc0M7QUFDckMscUNBQU96QixhQUFhLENBQUNzRyxLQUFkLEtBQXdCLElBQS9CO0FBQ0EsNkJBRkQsTUFFTyxJQUNOdEcsYUFBYSxDQUFDeUIsSUFBZCxLQUF1QixNQUF2QixJQUNBekIsYUFBYSxDQUFDMkcsYUFEZCxJQUVBM0csYUFBYSxDQUFDMEcsWUFIUixFQUlMO0FBQ0QscUNBQ0NySixnQkFBZ0IsQ0FBQ0ksU0FBakIsQ0FBMkJ1QyxhQUFhLENBQUMwRyxZQUF6QyxNQUNBMUcsYUFBYSxDQUFDMkcsYUFGZjtBQUlBO0FBQ0Q7QUFDRCx5QkFmZ0IsQ0FBakI7QUFnQkE7O0FBQ0QsMEJBQUl4SCxPQUFPLENBQUNrSyxRQUFSLElBQW9CbEssT0FBTyxDQUFDbUgsS0FBUixLQUFrQixTQUF0QyxJQUFtRCxDQUFDOEMsY0FBeEQsRUFBd0U7QUFDdkVELHdCQUFBQSxhQUFhLENBQUN2TCxJQUFkLENBQW1CUCxnQkFBZ0IsQ0FBQ2tNLFdBQWpCLENBQTZCcEssT0FBTyxDQUFDa0ssUUFBckMsRUFBK0NsSyxPQUFPLENBQUNtSCxLQUF2RCxDQUFuQjtBQUNBO0FBQ0QscUJBdkJEO0FBd0JBLG1CQXpCRDtBQTBCQSx5QkFBT2MsT0FBTyxDQUFDb0MsR0FBUixDQUFZTCxhQUFaLEVBQ0xuQixJQURLLENBQ0EsVUFBU3lCLElBQVQsRUFBc0I7QUFDM0Isd0JBQU1DLFlBQVksR0FBR3RMLE1BQU0sQ0FBQ3VMLGFBQVAsRUFBckI7QUFBQSx3QkFDQ0MsYUFBYSxHQUFHOUMsV0FBVyxJQUFLQSxXQUFXLENBQUMrQyxlQUFaLEVBRGpDO0FBRUEsMkJBQU9ELGFBQWEsQ0FBQ0UsT0FBZCxDQUFzQkosWUFBWSxDQUFDeEksT0FBYixFQUF0QixFQUE4QzhHLElBQTlDLENBQW1ELFlBQVc7QUFDcEVLLHNCQUFBQSxPQUFPLENBQUMwQixLQUFSO0FBQ0ExQixzQkFBQUEsT0FBTyxDQUFDMkIsT0FBUjtBQUNBLDZCQUFPUCxJQUFQO0FBQ0EscUJBSk0sQ0FBUDtBQUtBLG1CQVRLLEVBVUxRLEtBVkssQ0FVQyxVQUFTQyxNQUFULEVBQXNCO0FBQzVCO0FBQ0FDLG9CQUFBQSxHQUFHLENBQUNDLEtBQUosQ0FBVSxzREFBVixFQUFrRUYsTUFBbEU7QUFDQSxtQkFiSyxDQUFQO0FBY0E7QUFuRHNCLGVBQVgsQ0FIYTtBQXdEMUJHLGNBQUFBLFNBQVMsRUFBRSxJQUFJMUIsTUFBSixDQUFXO0FBQ3JCMUUsZ0JBQUFBLElBQUksRUFBRVAsY0FBYyxDQUFDNEcsZ0JBREE7QUFFckJ6QixnQkFBQUEsS0FBSyxFQUFFLFVBQVNDLE1BQVQsRUFBc0I7QUFDNUIsc0JBQU1ULE9BQU8sR0FBR1MsTUFBTSxDQUFDQyxTQUFQLEdBQW1CQyxTQUFuQixFQUFoQjtBQUNBWCxrQkFBQUEsT0FBTyxDQUFDMEIsS0FBUjtBQUNBMUIsa0JBQUFBLE9BQU8sQ0FBQzJCLE9BQVI7QUFDQTtBQU5vQixlQUFYO0FBeERlLGFBQVgsQ0FBaEI7QUFpRUEzQixZQUFBQSxPQUFPLENBQUNrQyxRQUFSLENBQWlCM0QsZ0JBQWpCLEVBQW1DLFlBQW5DO0FBQ0FTLFlBQUFBLE9BQU8sQ0FBQ2dCLE9BQUQsQ0FBUDtBQUNBLFdBcEVNLENBQVA7QUFxRUEsU0FwRkssRUFxRkw0QixLQXJGSyxDQXFGQzNDLE1BckZELENBQVA7QUFzRkEsT0F4Rk0sQ0FBUDtBQXlGQTtBQS9vQnFCLEdBQXZCO1NBa3BCZXhMLGMiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCwgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBnZXRUZXh0QmluZGluZyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHsgZ2V0RWRpdGFibGVFeHByZXNzaW9uLCBnZXRSZXF1aXJlZEV4cHJlc3Npb24gfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuXG4vKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBmb3IgbWFzcyBlZGl0IGZ1bmN0aW9uYWxpdHkgKi9cbnR5cGUgVGV4dEFycmFuZ2VtZW50SW5mbyA9IHtcblx0dGV4dEFycmFuZ2VtZW50OiBzdHJpbmc7XG5cdHZhbHVlUGF0aDogc3RyaW5nO1xuXHRkZXNjcmlwdGlvblBhdGg/OiBzdHJpbmc7XG5cdHZhbHVlOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdGZ1bGxUZXh0OiBzdHJpbmc7XG59O1xuY29uc3QgYVZhbGlkRGF0YVR5cGVzID0gW1xuXHRcIkVkbS5Cb29sZWFuXCIsXG5cdFwiRWRtLkJ5dGVcIixcblx0XCJFZG0uRGVjaW1hbFwiLFxuXHRcIkVkbS5Eb3VibGVcIixcblx0XCJFZG0uRmxvYXRcIixcblx0XCJFZG0uR3VpZFwiLFxuXHRcIkVkbS5JbnQxNlwiLFxuXHRcIkVkbS5JbnQzMlwiLFxuXHRcIkVkbS5JbnQ2NFwiLFxuXHRcIkVkbS5TQnl0ZVwiLFxuXHRcIkVkbS5TaW5nbGVcIixcblx0XCJFZG0uU3RyaW5nXCJcbl07XG5jb25zdCBNYXNzRWRpdEhlbHBlciA9IHtcblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBhdCBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGggd2l0aCBhIGJsYW5rIGFycmF5LlxuXHQgKiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkgcG9pbnRpbmcgdG8gdGhlIGZpbmFsIG9yIGRlZXBlc3QgbGV2ZWwgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEByZXR1cm5zIHtBcnJheX1cblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZywgYVZhbHVlczogYW55KSB7XG5cdFx0bGV0IGFGaW5hbFBhdGg6IGFueTtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdGNvbnN0IGFQYXRocyA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgc0Z1bGxQYXRoID0gXCJcIjtcblx0XHRhUGF0aHMuZm9yRWFjaChmdW5jdGlvbihzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGlmICghYVZhbHVlc1tzUHJvcGVydHlQYXRoXSAmJiBpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdGFGaW5hbFBhdGggPSBhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fSBlbHNlIGlmICghYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBcIi9cIiArIHNQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGlmIChzRnVsbFBhdGggIT09IHNQYXRoKSB7XG5cdFx0XHRcdFx0YUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSA9IHt9O1xuXHRcdFx0XHRcdGFGaW5hbFBhdGggPSBhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhRmluYWxQYXRoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHVuaXF1ZSB2YWx1ZXMgZm9yIGdpdmVuIGFycmF5IHZhbHVlcy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNWYWx1ZSBQcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggb2YgdGhlIHByb3BlcnR5IHZhbHVlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgSW5zdGFuY2Ugb2YgdGhlIGFycmF5XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0Z2V0VW5pcXVlVmFsdWVzOiBmdW5jdGlvbihzVmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgc2VsZjogYW55W10pIHtcblx0XHRpZiAoc1ZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gc2VsZi5pbmRleE9mKHNWYWx1ZSkgPT09IGluZGV4O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGEgbXVsdGktbGV2ZWwgcGF0aCAoZm9yIGV4YW1wbGU6IF9NYXRlcmlhbHMvTWF0ZXJpYWxfRGV0YWlscyBnZXRzIHRoZSB2YWx1ZSBvZiBNYXRlcmlhbF9EZXRhaWxzIHVuZGVyIF9NYXRlcmlhbHMgT2JqZWN0KS5cblx0ICogUmV0dXJucyB0aGUgcHJvcGVydHlWYWx1ZSwgd2hpY2ggY2FuIGJlIG9mIGFueSB0eXBlIChzdHJpbmcsIG51bWJlciwgZXRjLi4pLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0RhdGFQcm9wZXJ0eVBhdGggUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZhbHVlcyBPYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Z2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aDogZnVuY3Rpb24oc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZywgb1ZhbHVlczogYW55KSB7XG5cdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoICYmIHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRsZXQgUmVzdWx0OiBhbnk7XG5cdFx0XHRhUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0UmVzdWx0ID0gb1ZhbHVlcyAmJiBvVmFsdWVzW3NQYXRoXSA/IG9WYWx1ZXNbc1BhdGhdIDogUmVzdWx0ICYmIFJlc3VsdFtzUGF0aF07XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBSZXN1bHQ7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBrZXkgcGF0aCBmb3IgdGhlIGtleSBvZiBhIGNvbWJvIGJveCB0aGF0IG11c3QgYmUgc2VsZWN0ZWQgaW5pdGlhbGx5IHdoZW4gdGhlIGRpYWxvZyBvcGVuczpcblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGRpZmZlcmVudCwgdGhlbiA8IEtlZXAgRXhpc3RpbmcgVmFsdWVzID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyB0aGUgc2FtZSwgdGhlbiB0aGUgcHJvcGVydHlWYWx1ZSBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGVtcHR5LCB0aGVuIDwgTGVhdmUgQmxhbmsgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICpcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIERhdGEgcHJvcGVydHkgcGF0aFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24oYUNvbnRleHRzOiBhbnlbXSwgc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGFDb250ZXh0cyxcblx0XHRcdFx0YVByb3BlcnR5VmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0b1NlbGVjdGVkQ29udGV4dC5mb3JFYWNoKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGFPYmplY3QgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0Y29uc3Qgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uID1cblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xICYmIG9EYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KHNEYXRhUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKVswXSk7XG5cdFx0XHRcdGlmIChvQ29udGV4dCAmJiAob0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGgpIHx8IHNNdWx0aUxldmVsUGF0aENvbmRpdGlvbikpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlWYWx1ZXMucHVzaChvQ29udGV4dC5nZXRPYmplY3Qoc0RhdGFQcm9wZXJ0eVBhdGgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhVW5pcXVlUHJvcGVydHlWYWx1ZXMgPSBhUHJvcGVydHlWYWx1ZXMuZmlsdGVyKE1hc3NFZGl0SGVscGVyLmdldFVuaXF1ZVZhbHVlcyk7XG5cdFx0XHRpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0cmV0dXJuIFwiRGVmYXVsdC9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiBcIkVtcHR5L1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHR9IGVsc2UgaWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGhpZGRlbiBhbm5vdGF0aW9uIHZhbHVlIFtib3RoIHN0YXRpYyBhbmQgcGF0aCBiYXNlZF0gZm9yIHRhYmxlJ3Mgc2VsZWN0ZWQgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHsqfSBoaWRkZW5WYWx1ZSBIaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSAvIHBhdGggZm9yIGZpZWxkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0Z2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0czogZnVuY3Rpb24oaGlkZGVuVmFsdWU6IGFueSwgYUNvbnRleHRzOiBhbnlbXSkge1xuXHRcdGlmIChoaWRkZW5WYWx1ZSAmJiBoaWRkZW5WYWx1ZS4kUGF0aCkge1xuXHRcdFx0cmV0dXJuICFhQ29udGV4dHMuc29tZShmdW5jdGlvbihvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIEpTT04gTW9kZWwgZm9yIHByb3BlcnRpZXMgb2YgZGlhbG9nIGZpZWxkcyBbbGFiZWwsIHZpc2libGl0eSwgZGF0YXByb3BlcnR5LCBldGMuXS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9UYWJsZSBJbnN0YW5jZSBvZiBUYWJsZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9XG5cdCAqL1xuXHRwcmVwYXJlRGF0YUZvckRpYWxvZzogZnVuY3Rpb24ob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1RhYmxlICYmIChvVGFibGUuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLFxuXHRcdFx0c0N1cnJlbnRFbnRpdHlTZXROYW1lID0gb1RhYmxlLmRhdGEoXCJtZXRhUGF0aFwiKSxcblx0XHRcdGFUYWJsZUZpZWxkcyA9IE1hc3NFZGl0SGVscGVyLmdldFRhYmxlRmllbGRzKG9UYWJsZSksXG5cdFx0XHRvRW50aXR5VHlwZUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvQFwiKSxcblx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlUeXBlQ29udGV4dCk7XG5cblx0XHRjb25zdCBvRGF0YUZpZWxkTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0bGV0IG9SZXN1bHQ7XG5cdFx0bGV0IHNMYWJlbFRleHQ7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkO1xuXHRcdGxldCBzVW5pdFByb3BlcnR5UGF0aDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0O1xuXHRcdGxldCBiSXNJbW11dGFibGU7XG5cdFx0bGV0IGJJc0NvbXB1dGVkO1xuXHRcdGxldCBiQ2hhcnRQcm9wZXJ0eTtcblx0XHRsZXQgb1RleHRCaW5kaW5nO1xuXHRcdGxldCBiVmFsaWREYXRhVHlwZTtcblx0XHRsZXQgYkluVmFsaWRJbnB1dFR5cGU7XG5cblx0XHRhVGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbihvQ29sdW1uSW5mbzogYW55KSB7XG5cdFx0XHRjb25zdCBzRGF0YVByb3BlcnR5UGF0aCA9IG9Db2x1bW5JbmZvLmRhdGFQcm9wZXJ0eTtcblx0XHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCkge1xuXHRcdFx0XHRsZXQgb1Byb3BlcnR5SW5mbyA9IHNEYXRhUHJvcGVydHlQYXRoICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGggKyBcIkBcIik7XG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkID1cblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGggKyBcIkBcIikgJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpW1xuXHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFwiXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0c1VuaXRQcm9wZXJ0eVBhdGggPVxuXHRcdFx0XHRcdChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLlVuaXRcIl0gJiYgb1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuVW5pdFwiXS4kUGF0aCkgfHxcblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJlxuXHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuSVNPQ3VycmVuY3lcIl0gJiZcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLklTT0N1cnJlbmN5XCJdLiRQYXRoKTtcblx0XHRcdFx0c0xhYmVsVGV4dCA9IG9Db2x1bW5JbmZvLmxhYmVsIHx8IChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsXCJdKTtcblx0XHRcdFx0YlZhbHVlSGVscEVuYWJsZWRGb3JVbml0ID1cblx0XHRcdFx0XHRzVW5pdFByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc1VuaXRQcm9wZXJ0eVBhdGggKyBcIkBcIikgJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNVbml0UHJvcGVydHlQYXRoICsgXCJAXCIpW1xuXHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFwiXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0aWYgKG9EYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0XHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbihcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXHRcdFx0XHRiSXNJbW11dGFibGUgPVxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgJiYgb1Byb3BlcnR5Q29udGV4dC5nZXRQcm9wZXJ0eSgpICYmIG9Qcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoKVtcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl07XG5cdFx0XHRcdGJJc0NvbXB1dGVkID1cblx0XHRcdFx0XHRvUHJvcGVydHlDb250ZXh0ICYmIG9Qcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoKSAmJiBvUHJvcGVydHlDb250ZXh0LmdldFByb3BlcnR5KClbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl07XG5cdFx0XHRcdGNvbnN0IGJIaWRkZW5GaWVsZCA9XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyhcblx0XHRcdFx0XHRcdG9GaWVsZENvbnRleHQgJiYgb0ZpZWxkQ29udGV4dC5nZXRPYmplY3QoKVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl0sXG5cdFx0XHRcdFx0XHRhQ29udGV4dHNcblx0XHRcdFx0XHQpIHx8IGZhbHNlO1xuXHRcdFx0XHRvSW50ZXJmYWNlLmNvbnRleHQgPSB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvUHJvcGVydHlJbmZvID1cblx0XHRcdFx0XHQob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUuJHRhcmdldCkgfHxcblx0XHRcdFx0XHQob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC4kdGFyZ2V0KTtcblx0XHRcdFx0Ly8gRGF0YWZpZWxkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgRmllbGRDb250cm9sIGNhbGN1bGF0aW9uLCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0XHRjb25zdCBpc1JlYWRPbmx5ID0gaXNSZWFkT25seUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGJDaGFydFByb3BlcnR5ID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLnRlcm0gJiYgb1Byb3BlcnR5SW5mby50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHRcdGJWYWxpZERhdGFUeXBlID0gb1Byb3BlcnR5SW5mbyAmJiBhVmFsaWREYXRhVHlwZXMuaW5kZXhPZihvUHJvcGVydHlJbmZvLnR5cGUpICE9PSAtMTtcblx0XHRcdFx0YkluVmFsaWRJbnB1dFR5cGUgPVxuXHRcdFx0XHRcdChvQ29sdW1uSW5mbyAmJlxuXHRcdFx0XHRcdFx0b0NvbHVtbkluZm8uaW5wdXRUeXBlICYmXG5cdFx0XHRcdFx0XHQob0NvbHVtbkluZm8uaW5wdXRUeXBlID09PSBcInNhcC5tLlJhdGluZ0luZGljYXRvclwiIHx8IG9Db2x1bW5JbmZvLmlucHV0VHlwZSA9PT0gXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkgfHxcblx0XHRcdFx0XHRoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdCFiSGlkZGVuRmllbGQgJiZcblx0XHRcdFx0XHQhYklzSW1tdXRhYmxlICYmXG5cdFx0XHRcdFx0IWJJc0NvbXB1dGVkICYmXG5cdFx0XHRcdFx0IWJDaGFydFByb3BlcnR5ICYmXG5cdFx0XHRcdFx0YlZhbGlkRGF0YVR5cGUgJiZcblx0XHRcdFx0XHQhYkluVmFsaWRJbnB1dFR5cGUgJiZcblx0XHRcdFx0XHRvQ29sdW1uSW5mby5pbnB1dFR5cGUgJiZcblx0XHRcdFx0XHRnZXRFZGl0YWJsZUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbywgb0RhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpICE9PSBcImZhbHNlXCJcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b1Jlc3VsdCA9IHtcblx0XHRcdFx0XHRcdFwibGFiZWxcIjogc0xhYmVsVGV4dCArIFwiOlwiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6XG5cdFx0XHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoICYmXG5cdFx0XHRcdFx0XHRcdCFiSGlkZGVuRmllbGQgJiZcblx0XHRcdFx0XHRcdFx0IWJJc0ltbXV0YWJsZSAmJlxuXHRcdFx0XHRcdFx0XHQhYklzQ29tcHV0ZWQgJiZcblx0XHRcdFx0XHRcdFx0Z2V0RWRpdGFibGVFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxPYmplY3RQYXRoKSxcblx0XHRcdFx0XHRcdFwiZGF0YVByb3BlcnR5XCI6IHNEYXRhUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRcIjogYlZhbHVlSGVscEVuYWJsZWQgPyBiVmFsdWVIZWxwRW5hYmxlZCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJ1bml0UHJvcGVydHlcIjogc1VuaXRQcm9wZXJ0eVBhdGggPyBzVW5pdFByb3BlcnR5UGF0aCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0XCI6IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA/IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJwcm9wZXJ0eVBhdGhGb3JWYWx1ZUhlbHBcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwVW5pdFwiOiBzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNVbml0UHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XCJpc0ZpZWxkUmVxdWlyZWRcIjogZ2V0UmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIHRydWUpLFxuXHRcdFx0XHRcdFx0XCJkZWZhdWx0U2VsZWN0aW9uUGF0aFwiOiBzRGF0YVByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzRGF0YVByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblVuaXRQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdD8gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIHNVbml0UHJvcGVydHlQYXRoKVxuXHRcdFx0XHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJlbnRpdHlTZXRcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdFx0XCJ0ZXh0QmluZGluZ1wiOiBvVGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcIm51bGxhYmxlXCI6IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgIT09IHVuZGVmaW5lZCA/IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJpc1Byb3BlcnR5UmVhZE9ubHlcIjogaXNSZWFkT25seSAhPT0gdW5kZWZpbmVkID8gaXNSZWFkT25seSA6IGZhbHNlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhRGF0YUFycmF5LnB1c2gob1Jlc3VsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGF0YUZpZWxkTW9kZWwuc2V0RGF0YShhRGF0YUFycmF5KTtcblx0XHRyZXR1cm4gb0RhdGFGaWVsZE1vZGVsO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZUZvckNvbHVtbjogZnVuY3Rpb24ob0NvbHVtbjogYW55KSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG9Db2x1bW4uZ2V0VGVtcGxhdGUoKS5nZXRDb250ZW50ICYmXG5cdFx0XHRvQ29sdW1uLmdldFRlbXBsYXRlKCkuZ2V0Q29udGVudCgpICYmXG5cdFx0XHRvQ29sdW1uLmdldFRlbXBsYXRlKCkuZ2V0Q29udGVudCgpLmdldENvbnRlbnRFZGl0ICYmXG5cdFx0XHRvQ29sdW1uXG5cdFx0XHRcdC5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdC5nZXRDb250ZW50KClcblx0XHRcdFx0LmdldENvbnRlbnRFZGl0KCkgJiZcblx0XHRcdG9Db2x1bW5cblx0XHRcdFx0LmdldFRlbXBsYXRlKClcblx0XHRcdFx0LmdldENvbnRlbnQoKVxuXHRcdFx0XHQuZ2V0Q29udGVudEVkaXQoKVswXSAmJlxuXHRcdFx0b0NvbHVtblxuXHRcdFx0XHQuZ2V0VGVtcGxhdGUoKVxuXHRcdFx0XHQuZ2V0Q29udGVudCgpXG5cdFx0XHRcdC5nZXRDb250ZW50RWRpdCgpWzBdXG5cdFx0XHRcdC5nZXRNZXRhZGF0YSgpXG5cdFx0XHRcdC5nZXROYW1lKClcblx0XHQpO1xuXHR9LFxuXG5cdGdldFRhYmxlRmllbGRzOiBmdW5jdGlvbihvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uKG9Db2x1bW46IGFueSkge1xuXHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eSA9IG9Db2x1bW4gJiYgb0NvbHVtbi5nZXREYXRhUHJvcGVydHkoKSxcblx0XHRcdFx0YVJlYWx0ZWRDb2x1bW5JbmZvID1cblx0XHRcdFx0XHRvVGFibGUuZGF0YShcImNvbHVtbnNcIikgJiZcblx0XHRcdFx0XHRvVGFibGUuZGF0YShcImNvbHVtbnNcIikuY3VzdG9tRGF0YS5maWx0ZXIoZnVuY3Rpb24ob0NvbHVtbkluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db2x1bW5JbmZvLm5hbWUgPT09IHNEYXRhUHJvcGVydHkgJiYgb0NvbHVtbkluZm8udHlwZSA9PT0gXCJBbm5vdGF0aW9uXCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcImxhYmVsXCI6IG9Db2x1bW4uZ2V0SGVhZGVyKCksXG5cdFx0XHRcdFwiYW5ub3RhdGlvblBhdGhcIjogYVJlYWx0ZWRDb2x1bW5JbmZvICYmIGFSZWFsdGVkQ29sdW1uSW5mb1swXSAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0uYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFwiaW5wdXRUeXBlXCI6IE1hc3NFZGl0SGVscGVyLmdldElucHV0VHlwZUZvckNvbHVtbihvQ29sdW1uKVxuXHRcdFx0fTtcblx0XHR9KTtcblx0fSxcblxuXHRnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2c6IGZ1bmN0aW9uKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmc6IGZ1bmN0aW9uKHNJbnB1dFR5cGU6IHN0cmluZykge1xuXHRcdGxldCBzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblxuXHRcdHN3aXRjaCAoc0lucHV0VHlwZSkge1xuXHRcdFx0Ly9UT0RPIC0gQWRkIGZvciBvdGhlciBjb250cm9sIHR5cGVzIGFzIHdlbGwgKFJhZGlvIEJ1dHRvbiwgRW1haWwsIElucHV0LCBNREMgRmllbGRzLCBJbWFnZSBldGMuKVxuXHRcdFx0Y2FzZSBcInNhcC5tLkRhdGVQaWNrZXJcIjpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiRGF0ZXNcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwic2FwLm0uQ2hlY2tCb3hcIjpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiU2V0dGluZ3NcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybiBzUmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBtb2RlbCBbS2VlcCBFeGlzdGluZyBWYWx1ZXMsIExlYXZlIEJsYW5rXS5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlVPTUZpZWxkXG5cdCAqL1xuXHRzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2c6IGZ1bmN0aW9uKGFWYWx1ZXM6IGFueVtdLCBhQ29udGV4dHM6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBvUHJvcGVydHlJbmZvOiBhbnksIGJVT01GaWVsZD86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gb1Byb3BlcnR5SW5mby5kYXRhUHJvcGVydHksXG5cdFx0XHRzSW5wdXRUeXBlID0gb1Byb3BlcnR5SW5mby5pbnB1dFR5cGUsXG5cdFx0XHRiUHJvcGVydHlSZXF1aXJlZCA9IG9Qcm9wZXJ0eUluZm8uaXNGaWVsZFJlcXVpcmVkO1xuXHRcdGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBNYXNzRWRpdEhlbHBlci5nZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nKHNJbnB1dFR5cGUpO1xuXHRcdC8vVE9ETyAtIEFkZCA8PFVzZSBWYWx1ZSBIZWxwIG9yIGNvbnRyb2wgaW1wbG1lbnRhdGlvbj4+IGFuZCByZWxhdGVkIGtleSBieSBjaGVja2luZyBpZiB2YWx1ZSBoZWxwIGlzIGVuYWJsZWQgZm9yIHByb3BlcnR5IG9yIFVuaXQuXG5cdFx0Ly9UT0RPIC0gQWRkIG9wdGlvbiBBcHBseSB0byBFbXB0eSBGaWVsZHMgb25seSBmb3IgQm90aCBWYWx1ZSBIZWxwIGFuZCBjb250cm9scy5cblx0XHRjb25zdCBiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGggPSBhQ29udGV4dHMuc29tZShmdW5jdGlvbihvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHlQYXRoKTtcblx0XHR9KTtcblx0XHRpZiAoYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRpZiAoYlByb3BlcnR5UmVxdWlyZWQgIT09IFwidHJ1ZVwiICYmICFiVU9NRmllbGQpIHtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IFwiQ2xlYXJGaWVsZFZhbHVlL1wiICsgc1Byb3BlcnR5UGF0aCB9KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBzUHJvcGVydHlQYXRoIH0pO1xuXHRcdH1cblx0XHRhVmFsdWVzLnVuc2hpZnQoe1xuXHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4ICsgXCIgXCIgKyBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nICsgXCIgPlwiLFxuXHRcdFx0a2V5OiBcIkRlZmF1bHQvXCIgKyBzUHJvcGVydHlQYXRoXG5cdFx0fSk7XG5cdH0sXG5cblx0Z2V0VGV4dEFycmFuZ2VtZW50SW5mbzogZnVuY3Rpb24oXG5cdFx0c1Byb3BlcnR5OiBhbnksXG5cdFx0b1RleHRCaW5kaW5nOiBhbnksXG5cdFx0c0N1cnJlbnRFbnRpdHlTZXQ6IGFueSxcblx0XHRvU2VsZWN0ZWRDb250ZXh0OiBhbnlcblx0KTogVGV4dEFycmFuZ2VtZW50SW5mbyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9TZWxlY3RlZENvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzRGlzcGxheU1vZGUgPSBDb21tb25VdGlscy5jb21wdXRlRGlzcGxheU1vZGUob01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXQgKyBcIi9cIiArIHNQcm9wZXJ0eSArIFwiQFwiKSk7XG5cdFx0bGV0IHNEZXNjcmlwdGlvblBhdGgsIHNWYWx1ZSwgc0Rlc2NyaXB0aW9uVmFsdWUsIHNGdWxsVGV4dDtcblx0XHRpZiAob1RleHRCaW5kaW5nICYmIChvVGV4dEJpbmRpbmcucGF0aCB8fCAob1RleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgb1RleHRCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoKSkgJiYgc1Byb3BlcnR5KSB7XG5cdFx0XHRpZiAob1RleHRCaW5kaW5nLnBhdGgpIHtcblx0XHRcdFx0aWYgKHNEaXNwbGF5TW9kZSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdFx0c1ZhbHVlID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc1Byb3BlcnR5KTtcblx0XHRcdFx0XHRzRGVzY3JpcHRpb25WYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KG9UZXh0QmluZGluZy5wYXRoKTtcblx0XHRcdFx0XHRzRnVsbFRleHQgPSBzRGVzY3JpcHRpb25WYWx1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChzRGlzcGxheU1vZGUgPT09IFwiVmFsdWVcIikge1xuXHRcdFx0XHRcdHNWYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c0Z1bGxUZXh0ID0gc1ZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24ob1Byb3BzOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob1Byb3BzLnBhdGggJiYgb1Byb3BzLnBhdGggIT09IHNQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0c0Rlc2NyaXB0aW9uUGF0aCA9IG9Qcm9wcy5wYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNWYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSk7XG5cdFx0XHRcdHNEZXNjcmlwdGlvblZhbHVlID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc0Rlc2NyaXB0aW9uUGF0aCk7XG5cdFx0XHRcdGlmIChzRGlzcGxheU1vZGUgPT09IFwiVmFsdWVEZXNjcmlwdGlvblwiICYmIHNWYWx1ZSAmJiBzRGVzY3JpcHRpb25WYWx1ZSkge1xuXHRcdFx0XHRcdHNGdWxsVGV4dCA9IHNWYWx1ZSArIFwiIChcIiArIHNEZXNjcmlwdGlvblZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Rpc3BsYXlNb2RlID09PSBcIkRlc2NyaXB0aW9uVmFsdWVcIiAmJiBzRGVzY3JpcHRpb25WYWx1ZSAmJiBzVmFsdWUpIHtcblx0XHRcdFx0XHRzRnVsbFRleHQgPSBzRGVzY3JpcHRpb25WYWx1ZSArIFwiIChcIiArIHNWYWx1ZSArIFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcInRleHRBcnJhbmdlbWVudFwiOiBzRGlzcGxheU1vZGUsXG5cdFx0XHRcdFwidmFsdWVQYXRoXCI6IHNQcm9wZXJ0eSxcblx0XHRcdFx0XCJkZXNjcmlwdGlvblBhdGhcIjogc0Rlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XCJ2YWx1ZVwiOiBzVmFsdWUsXG5cdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogc0Rlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcdFwiZnVsbFRleHRcIjogc0Z1bGxUZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIHJ1bnRpbWUgbW9kZWw6XG5cdCAqID0+IFRoZSBtb2RlbCBjb25zaXN0cyBvZiB2YWx1ZXMgc2hvd24gaW4gdGhlIGNvbWJvQm94IG9mIHRoZSBkaWFsb2cgKExlYXZlIEJsYW5rLCBLZWVwIEV4aXN0aW5nIFZhbHVlcywgb3IgYW55IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgY29udGV4dCwgZXRjLilcblx0ICogPT4gVGhlIG1vZGVsIHdpbGwgY2FwdHVyZSBydW50aW1lIGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgcHJvcGVydHkgKHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBjb21ib0JveCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0c2V0UnVudGltZU1vZGVsT25EaWFsb2c6IGZ1bmN0aW9uKGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55KSB7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhVW5pdERhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlYWRPbmx5RmllbGRJbmZvOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9EaXN0aW5jdFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRsZXQgc1Byb3BlcnR5TmFtZTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24ob0RhdGE6IGFueSkge1xuXHRcdFx0bGV0IG9UZXh0SW5mbztcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMpO1xuXHRcdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IG9EYXRhLmRhdGFQcm9wZXJ0eS5zcGxpdChcIi9cIik7XG5cdFx0XHRcdGxldCBzUHJvcGVydHlLZXk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc011bHRpTGV2ZWxQYXRoVmFsdWUgPSBhQ29udGV4dHNbaV0uZ2V0T2JqZWN0KG9EYXRhLmRhdGFQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c1Byb3BlcnR5S2V5ID0gb0RhdGEuZGF0YVByb3BlcnR5ICsgXCIvXCIgKyBzTXVsdGlMZXZlbFBhdGhWYWx1ZTtcblx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eUtleV0gJiYgYUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0pIHtcblx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0b0RhdGEudGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmVudGl0eVNldCxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzW2ldXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0YUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgc011bHRpTGV2ZWxQYXRoVmFsdWUsXG5cdFx0XHRcdFx0XHRcdFwia2V5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IHNNdWx0aUxldmVsUGF0aFZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gYUNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdHNQcm9wZXJ0eU5hbWUgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eSAmJiBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRvRGF0YS50ZXh0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b0RhdGEuZW50aXR5U2V0LFxuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHNbaV1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgb0RhdGFPYmplY3Rbb0RhdGEuZGF0YVByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogb0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XSkge1xuXHRcdFx0XHRcdFx0c1Byb3BlcnR5TmFtZSA9IG9EYXRhLnVuaXRQcm9wZXJ0eSArIFwiL1wiICsgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XTtcblx0XHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5TmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRvRGF0YS51bml0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEudGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEuZW50aXR5U2V0LFxuXHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0c1tpXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogb0RhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YURhdGFBcnJheS5mb3JFYWNoKGZ1bmN0aW9uKG9EYXRhOiBhbnkpIHtcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPiAtMSkge1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUgPSBNYXNzRWRpdEhlbHBlci5nZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoKG9EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyk7XG5cdFx0XHRcdGlmICghc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlKSB7XG5cdFx0XHRcdFx0c011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIG9EYXRhLmRhdGFQcm9wZXJ0eSB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLCBhQ29udGV4dHMsIG9EZWZhdWx0VmFsdWVzLCBvRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmIGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSwgYUNvbnRleHRzLCBvRGVmYXVsdFZhbHVlcywgb0RhdGEpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhLCB0cnVlKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChvRGF0YS5kYXRhUHJvcGVydHkgJiYgYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ubGVuZ3RoKSB8fFxuXHRcdFx0XHQob0RhdGEudW5pdFByb3BlcnR5ICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5sZW5ndGgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0RhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBvRGF0YS5kYXRhUHJvcGVydHkgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzID1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24ob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnB1c2goe1xuXHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLFxuXHRcdFx0XHRcdFx0a2V5OiBcIkVtcHR5L1wiICsgb0RhdGEudW5pdFByb3BlcnR5XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiYgdHlwZW9mIG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBcInByb3BlcnR5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSwgdmFsdWU6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSwgdHlwZTogXCJEZWZhdWx0XCIgfSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzICYmXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdLm9wZXJhbmQyXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBuZWVkcyB0byBiZSByZWZhY3RvcmVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgUmVhZE9ubHlFeHByZXNzaW9uIGNoYW5nZVxuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7XG5cdFx0XHRcdFx0XCJwcm9wZXJ0eVwiOiBvRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDIudmFsdWUsXG5cdFx0XHRcdFx0dHlwZTogXCJQYXRoXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb0RhdGEgPSB7IFwidmFsdWVzXCI6IGFWYWx1ZXMsIFwidW5pdERhdGFcIjogYVVuaXREYXRhLCBcInJlc3VsdHNcIjogYVJlc3VsdHMsIFwicmVhZGFibGVQcm9wZXJ0eURhdGFcIjogYVJlYWRPbmx5RmllbGRJbmZvIH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdHJldHVybiBvRGlhbG9nRGF0YU1vZGVsO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sbGVyIENvbnRyb2xsZXIgZm9yIHRoZSB2aWV3XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgcmV0dXJuaW5nIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGNyZWF0ZURpYWxvZzogZnVuY3Rpb24ob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgb0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0b0RpYWxvZ0RhdGFNb2RlbCA9IE1hc3NFZGl0SGVscGVyLnNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nKGFDb250ZXh0cywgYURhdGFBcnJheSwgb0RlZmF1bHRWYWx1ZXMpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQgfSkudGhlbihmdW5jdGlvbihvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBvRGVmYXVsdFZhbHVlcy5tYXNzRWRpdFRpdGxlLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbihvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9EaWFsb2cuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3VsdHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVzdWx0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVJlYWRhYmxlSW5mbyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWFkYWJsZVByb3BlcnR5RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZVByb21pc2U6IGFueVtdID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlJlYWRPbmx5RmllbGQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24ob1NlbGVjdGVkQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24ob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbihvUHJvcGVydHlJbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgPT09IG9Qcm9wZXJ0eUluZm8ucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5SW5mby50eXBlID09PSBcIkRlZmF1bHRcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eUluZm8udmFsdWUgPT09IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJQYXRoXCIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlICYmIG9SZXN1bHQudmFsdWUgIT09IFwiRGVmYXVsdFwiICYmICFiUmVhZE9ubHlGaWVsZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hhbmdlUHJvbWlzZS5wdXNoKG9TZWxlY3RlZENvbnRleHQuc2V0UHJvcGVydHkob1Jlc3VsdC5rZXlWYWx1ZSwgb1Jlc3VsdC52YWx1ZSkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChjaGFuZ2VQcm9taXNlKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvUmVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXh0ZW5zaW9uQVBJID0gb0NvbnRyb2xsZXIgJiYgKG9Db250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9FeHRlbnNpb25BUEkucmVmcmVzaChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1Jlcztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIGVycm9yIGhhbmRsaW5nIHBhcnQgZm9yIHRoZSBEaWFsb2dcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHVwZGF0aW5nIGVudHJpZXMuXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuY2FuY2VsQnV0dG9uVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24ob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob0RpYWxvZ0RhdGFNb2RlbCwgXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvRGlhbG9nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGVscGVyO1xuIl19
|