/*
 *
 *    Copyright (c) 2022 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

#import "MTRCallbackBridgeBase.h"
#import <Foundation/Foundation.h>

#include <app-common/zap-generated/cluster-objects.h>
#include <app/data-model/DecodableList.h>
#include <app/util/im-client-callbacks.h>

typedef void (*CommandSuccessCallback)(void *, const chip::app::DataModel::NullObjectType &);
using CommandSuccessCallbackType = CommandSuccessCallback;
typedef void (*DefaultSuccessCallbackType)(void *);

typedef void (*VendorIdAttributeCallback)(void *, chip::VendorId);
typedef void (*NullableVendorIdAttributeCallback)(void *, const chip::app::DataModel::Nullable<chip::VendorId> &);

typedef void (*GroupsClusterAddGroupResponseCallbackType)(
    void *, const chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType &);
typedef void (*GroupsClusterViewGroupResponseCallbackType)(
    void *, const chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType &);
typedef void (*GroupsClusterGetGroupMembershipResponseCallbackType)(
    void *, const chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType &);
typedef void (*GroupsClusterRemoveGroupResponseCallbackType)(
    void *, const chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType &);
typedef void (*ScenesClusterAddSceneResponseCallbackType)(
    void *, const chip::app::Clusters::Scenes::Commands::AddSceneResponse::DecodableType &);
typedef void (*ScenesClusterViewSceneResponseCallbackType)(
    void *, const chip::app::Clusters::Scenes::Commands::ViewSceneResponse::DecodableType &);
typedef void (*ScenesClusterRemoveSceneResponseCallbackType)(
    void *, const chip::app::Clusters::Scenes::Commands::RemoveSceneResponse::DecodableType &);
typedef void (*ScenesClusterRemoveAllScenesResponseCallbackType)(
    void *, const chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType &);
typedef void (*ScenesClusterStoreSceneResponseCallbackType)(
    void *, const chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType &);
typedef void (*ScenesClusterGetSceneMembershipResponseCallbackType)(
    void *, const chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType &);
typedef void (*ScenesClusterEnhancedAddSceneResponseCallbackType)(
    void *, const chip::app::Clusters::Scenes::Commands::EnhancedAddSceneResponse::DecodableType &);
typedef void (*ScenesClusterEnhancedViewSceneResponseCallbackType)(
    void *, const chip::app::Clusters::Scenes::Commands::EnhancedViewSceneResponse::DecodableType &);
typedef void (*ScenesClusterCopySceneResponseCallbackType)(
    void *, const chip::app::Clusters::Scenes::Commands::CopySceneResponse::DecodableType &);
typedef void (*OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType)(
    void *, const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::QueryImageResponse::DecodableType &);
typedef void (*OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType)(
    void *, const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::ApplyUpdateResponse::DecodableType &);
typedef void (*GeneralCommissioningClusterArmFailSafeResponseCallbackType)(
    void *, const chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType &);
typedef void (*GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType)(
    void *, const chip::app::Clusters::GeneralCommissioning::Commands::SetRegulatoryConfigResponse::DecodableType &);
typedef void (*GeneralCommissioningClusterCommissioningCompleteResponseCallbackType)(
    void *, const chip::app::Clusters::GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType &);
typedef void (*NetworkCommissioningClusterScanNetworksResponseCallbackType)(
    void *, const chip::app::Clusters::NetworkCommissioning::Commands::ScanNetworksResponse::DecodableType &);
typedef void (*NetworkCommissioningClusterNetworkConfigResponseCallbackType)(
    void *, const chip::app::Clusters::NetworkCommissioning::Commands::NetworkConfigResponse::DecodableType &);
typedef void (*NetworkCommissioningClusterConnectNetworkResponseCallbackType)(
    void *, const chip::app::Clusters::NetworkCommissioning::Commands::ConnectNetworkResponse::DecodableType &);
typedef void (*DiagnosticLogsClusterRetrieveLogsResponseCallbackType)(
    void *, const chip::app::Clusters::DiagnosticLogs::Commands::RetrieveLogsResponse::DecodableType &);
typedef void (*OperationalCredentialsClusterAttestationResponseCallbackType)(
    void *, const chip::app::Clusters::OperationalCredentials::Commands::AttestationResponse::DecodableType &);
typedef void (*OperationalCredentialsClusterCertificateChainResponseCallbackType)(
    void *, const chip::app::Clusters::OperationalCredentials::Commands::CertificateChainResponse::DecodableType &);
typedef void (*OperationalCredentialsClusterCSRResponseCallbackType)(
    void *, const chip::app::Clusters::OperationalCredentials::Commands::CSRResponse::DecodableType &);
typedef void (*OperationalCredentialsClusterNOCResponseCallbackType)(
    void *, const chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType &);
typedef void (*GroupKeyManagementClusterKeySetReadResponseCallbackType)(
    void *, const chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType &);
typedef void (*GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType)(
    void *, const chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadAllIndicesResponse::DecodableType &);
typedef void (*DoorLockClusterGetWeekDayScheduleResponseCallbackType)(
    void *, const chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType &);
typedef void (*DoorLockClusterGetYearDayScheduleResponseCallbackType)(
    void *, const chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType &);
typedef void (*DoorLockClusterGetHolidayScheduleResponseCallbackType)(
    void *, const chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType &);
typedef void (*DoorLockClusterGetUserResponseCallbackType)(
    void *, const chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType &);
typedef void (*DoorLockClusterSetCredentialResponseCallbackType)(
    void *, const chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType &);
typedef void (*DoorLockClusterGetCredentialStatusResponseCallbackType)(
    void *, const chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType &);
typedef void (*ThermostatClusterGetWeeklyScheduleResponseCallbackType)(
    void *, const chip::app::Clusters::Thermostat::Commands::GetWeeklyScheduleResponse::DecodableType &);
typedef void (*ChannelClusterChangeChannelResponseCallbackType)(
    void *, const chip::app::Clusters::Channel::Commands::ChangeChannelResponse::DecodableType &);
typedef void (*TargetNavigatorClusterNavigateTargetResponseCallbackType)(
    void *, const chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::DecodableType &);
typedef void (*MediaPlaybackClusterPlaybackResponseCallbackType)(
    void *, const chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType &);
typedef void (*KeypadInputClusterSendKeyResponseCallbackType)(
    void *, const chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType &);
typedef void (*ContentLauncherClusterLauncherResponseCallbackType)(
    void *, const chip::app::Clusters::ContentLauncher::Commands::LauncherResponse::DecodableType &);
typedef void (*ApplicationLauncherClusterLauncherResponseCallbackType)(
    void *, const chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType &);
typedef void (*AccountLoginClusterGetSetupPINResponseCallbackType)(
    void *, const chip::app::Clusters::AccountLogin::Commands::GetSetupPINResponse::DecodableType &);
typedef void (*UnitTestingClusterTestSpecificResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestSpecificResponse::DecodableType &);
typedef void (*UnitTestingClusterTestAddArgumentsResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType &);
typedef void (*UnitTestingClusterTestSimpleArgumentResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestSimpleArgumentResponse::DecodableType &);
typedef void (*UnitTestingClusterTestStructArrayArgumentResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestStructArrayArgumentResponse::DecodableType &);
typedef void (*UnitTestingClusterTestListInt8UReverseResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseResponse::DecodableType &);
typedef void (*UnitTestingClusterTestEnumsResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestEnumsResponse::DecodableType &);
typedef void (*UnitTestingClusterTestNullableOptionalResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalResponse::DecodableType &);
typedef void (*UnitTestingClusterTestComplexNullableOptionalResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestComplexNullableOptionalResponse::DecodableType &);
typedef void (*UnitTestingClusterBooleanResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType &);
typedef void (*UnitTestingClusterSimpleStructResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::SimpleStructResponse::DecodableType &);
typedef void (*UnitTestingClusterTestEmitTestEventResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventResponse::DecodableType &);
typedef void (*UnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackType)(
    void *, const chip::app::Clusters::UnitTesting::Commands::TestEmitTestFabricScopedEventResponse::DecodableType &);

typedef void (*IdentifyClusterIdentifyEffectIdentifierAttributeCallback)(void *,
                                                                         chip::app::Clusters::Identify::IdentifyEffectIdentifier);
typedef void (*NullableIdentifyClusterIdentifyEffectIdentifierAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Identify::IdentifyEffectIdentifier> &);
typedef void (*IdentifyClusterIdentifyEffectVariantAttributeCallback)(void *, chip::app::Clusters::Identify::IdentifyEffectVariant);
typedef void (*NullableIdentifyClusterIdentifyEffectVariantAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Identify::IdentifyEffectVariant> &);
typedef void (*IdentifyClusterIdentifyIdentifyTypeAttributeCallback)(void *, chip::app::Clusters::Identify::IdentifyIdentifyType);
typedef void (*NullableIdentifyClusterIdentifyIdentifyTypeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Identify::IdentifyIdentifyType> &);
typedef void (*OnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback)(
    void *, chip::app::Clusters::OnOff::OnOffDelayedAllOffEffectVariant);
typedef void (*NullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffDelayedAllOffEffectVariant> &);
typedef void (*OnOffClusterOnOffDyingLightEffectVariantAttributeCallback)(void *,
                                                                          chip::app::Clusters::OnOff::OnOffDyingLightEffectVariant);
typedef void (*NullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffDyingLightEffectVariant> &);
typedef void (*OnOffClusterOnOffEffectIdentifierAttributeCallback)(void *, chip::app::Clusters::OnOff::OnOffEffectIdentifier);
typedef void (*NullableOnOffClusterOnOffEffectIdentifierAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffEffectIdentifier> &);
typedef void (*OnOffClusterOnOffStartUpOnOffAttributeCallback)(void *, chip::app::Clusters::OnOff::OnOffStartUpOnOff);
typedef void (*NullableOnOffClusterOnOffStartUpOnOffAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> &);
typedef void (*LevelControlClusterMoveModeAttributeCallback)(void *, chip::app::Clusters::LevelControl::MoveMode);
typedef void (*NullableLevelControlClusterMoveModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::LevelControl::MoveMode> &);
typedef void (*LevelControlClusterStepModeAttributeCallback)(void *, chip::app::Clusters::LevelControl::StepMode);
typedef void (*NullableLevelControlClusterStepModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::LevelControl::StepMode> &);
typedef void (*AccessControlClusterAccessControlEntryAuthModeEnumAttributeCallback)(
    void *, chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum);
typedef void (*NullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum> &);
typedef void (*AccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallback)(
    void *, chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum);
typedef void (*NullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum> &);
typedef void (*AccessControlClusterChangeTypeEnumAttributeCallback)(void *, chip::app::Clusters::AccessControl::ChangeTypeEnum);
typedef void (*NullableAccessControlClusterChangeTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::AccessControl::ChangeTypeEnum> &);
typedef void (*ActionsClusterActionErrorEnumAttributeCallback)(void *, chip::app::Clusters::Actions::ActionErrorEnum);
typedef void (*NullableActionsClusterActionErrorEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::ActionErrorEnum> &);
typedef void (*ActionsClusterActionStateEnumAttributeCallback)(void *, chip::app::Clusters::Actions::ActionStateEnum);
typedef void (*NullableActionsClusterActionStateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::ActionStateEnum> &);
typedef void (*ActionsClusterActionTypeEnumAttributeCallback)(void *, chip::app::Clusters::Actions::ActionTypeEnum);
typedef void (*NullableActionsClusterActionTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::ActionTypeEnum> &);
typedef void (*ActionsClusterEndpointListTypeEnumAttributeCallback)(void *, chip::app::Clusters::Actions::EndpointListTypeEnum);
typedef void (*NullableActionsClusterEndpointListTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::EndpointListTypeEnum> &);
typedef void (*BasicInformationClusterColorEnumAttributeCallback)(void *, chip::app::Clusters::BasicInformation::ColorEnum);
typedef void (*NullableBasicInformationClusterColorEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BasicInformation::ColorEnum> &);
typedef void (*BasicInformationClusterProductFinishEnumAttributeCallback)(void *,
                                                                          chip::app::Clusters::BasicInformation::ProductFinishEnum);
typedef void (*NullableBasicInformationClusterProductFinishEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BasicInformation::ProductFinishEnum> &);
typedef void (*OTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback)(
    void *, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction);
typedef void (*NullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction> &);
typedef void (*OTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback)(
    void *, chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol);
typedef void (*NullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol> &);
typedef void (*OTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback)(
    void *, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus);
typedef void (*NullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus> &);
typedef void (*OTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback)(
    void *, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason);
typedef void (*NullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason> &);
typedef void (*OTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback)(
    void *, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum);
typedef void (*NullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum> &);
typedef void (*OTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback)(
    void *, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum);
typedef void (*NullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum> &);
typedef void (*TimeFormatLocalizationClusterCalendarTypeEnumAttributeCallback)(
    void *, chip::app::Clusters::TimeFormatLocalization::CalendarTypeEnum);
typedef void (*NullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TimeFormatLocalization::CalendarTypeEnum> &);
typedef void (*TimeFormatLocalizationClusterHourFormatEnumAttributeCallback)(
    void *, chip::app::Clusters::TimeFormatLocalization::HourFormatEnum);
typedef void (*NullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TimeFormatLocalization::HourFormatEnum> &);
typedef void (*UnitLocalizationClusterTempUnitEnumAttributeCallback)(void *, chip::app::Clusters::UnitLocalization::TempUnitEnum);
typedef void (*NullableUnitLocalizationClusterTempUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::UnitLocalization::TempUnitEnum> &);
typedef void (*PowerSourceClusterBatApprovedChemistryEnumAttributeCallback)(
    void *, chip::app::Clusters::PowerSource::BatApprovedChemistryEnum);
typedef void (*NullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatApprovedChemistryEnum> &);
typedef void (*PowerSourceClusterBatChargeFaultEnumAttributeCallback)(void *, chip::app::Clusters::PowerSource::BatChargeFaultEnum);
typedef void (*NullablePowerSourceClusterBatChargeFaultEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatChargeFaultEnum> &);
typedef void (*PowerSourceClusterBatChargeLevelEnumAttributeCallback)(void *, chip::app::Clusters::PowerSource::BatChargeLevelEnum);
typedef void (*NullablePowerSourceClusterBatChargeLevelEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatChargeLevelEnum> &);
typedef void (*PowerSourceClusterBatChargeStateEnumAttributeCallback)(void *, chip::app::Clusters::PowerSource::BatChargeStateEnum);
typedef void (*NullablePowerSourceClusterBatChargeStateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatChargeStateEnum> &);
typedef void (*PowerSourceClusterBatCommonDesignationEnumAttributeCallback)(
    void *, chip::app::Clusters::PowerSource::BatCommonDesignationEnum);
typedef void (*NullablePowerSourceClusterBatCommonDesignationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatCommonDesignationEnum> &);
typedef void (*PowerSourceClusterBatFaultEnumAttributeCallback)(void *, chip::app::Clusters::PowerSource::BatFaultEnum);
typedef void (*NullablePowerSourceClusterBatFaultEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatFaultEnum> &);
typedef void (*PowerSourceClusterBatReplaceabilityEnumAttributeCallback)(void *,
                                                                         chip::app::Clusters::PowerSource::BatReplaceabilityEnum);
typedef void (*NullablePowerSourceClusterBatReplaceabilityEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatReplaceabilityEnum> &);
typedef void (*PowerSourceClusterPowerSourceStatusEnumAttributeCallback)(void *,
                                                                         chip::app::Clusters::PowerSource::PowerSourceStatusEnum);
typedef void (*NullablePowerSourceClusterPowerSourceStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::PowerSourceStatusEnum> &);
typedef void (*PowerSourceClusterWiredCurrentTypeEnumAttributeCallback)(void *,
                                                                        chip::app::Clusters::PowerSource::WiredCurrentTypeEnum);
typedef void (*NullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::WiredCurrentTypeEnum> &);
typedef void (*PowerSourceClusterWiredFaultEnumAttributeCallback)(void *, chip::app::Clusters::PowerSource::WiredFaultEnum);
typedef void (*NullablePowerSourceClusterWiredFaultEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::WiredFaultEnum> &);
typedef void (*GeneralCommissioningClusterCommissioningErrorEnumAttributeCallback)(
    void *, chip::app::Clusters::GeneralCommissioning::CommissioningErrorEnum);
typedef void (*NullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralCommissioning::CommissioningErrorEnum> &);
typedef void (*GeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallback)(
    void *, chip::app::Clusters::GeneralCommissioning::RegulatoryLocationTypeEnum);
typedef void (*NullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralCommissioning::RegulatoryLocationTypeEnum> &);
typedef void (*NetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback)(
    void *, chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatus);
typedef void (*NullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatus> &);
typedef void (*NetworkCommissioningClusterWiFiBandAttributeCallback)(void *, chip::app::Clusters::NetworkCommissioning::WiFiBand);
typedef void (*NullableNetworkCommissioningClusterWiFiBandAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::NetworkCommissioning::WiFiBand> &);
typedef void (*DiagnosticLogsClusterIntentEnumAttributeCallback)(void *, chip::app::Clusters::DiagnosticLogs::IntentEnum);
typedef void (*NullableDiagnosticLogsClusterIntentEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DiagnosticLogs::IntentEnum> &);
typedef void (*DiagnosticLogsClusterStatusEnumAttributeCallback)(void *, chip::app::Clusters::DiagnosticLogs::StatusEnum);
typedef void (*NullableDiagnosticLogsClusterStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DiagnosticLogs::StatusEnum> &);
typedef void (*DiagnosticLogsClusterTransferProtocolEnumAttributeCallback)(
    void *, chip::app::Clusters::DiagnosticLogs::TransferProtocolEnum);
typedef void (*NullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DiagnosticLogs::TransferProtocolEnum> &);
typedef void (*GeneralDiagnosticsClusterBootReasonEnumAttributeCallback)(void *,
                                                                         chip::app::Clusters::GeneralDiagnostics::BootReasonEnum);
typedef void (*NullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::BootReasonEnum> &);
typedef void (*GeneralDiagnosticsClusterHardwareFaultEnumAttributeCallback)(
    void *, chip::app::Clusters::GeneralDiagnostics::HardwareFaultEnum);
typedef void (*NullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::HardwareFaultEnum> &);
typedef void (*GeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallback)(
    void *, chip::app::Clusters::GeneralDiagnostics::InterfaceTypeEnum);
typedef void (*NullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::InterfaceTypeEnum> &);
typedef void (*GeneralDiagnosticsClusterNetworkFaultEnumAttributeCallback)(
    void *, chip::app::Clusters::GeneralDiagnostics::NetworkFaultEnum);
typedef void (*NullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::NetworkFaultEnum> &);
typedef void (*GeneralDiagnosticsClusterRadioFaultEnumAttributeCallback)(void *,
                                                                         chip::app::Clusters::GeneralDiagnostics::RadioFaultEnum);
typedef void (*NullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::RadioFaultEnum> &);
typedef void (*ThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback)(
    void *, chip::app::Clusters::ThreadNetworkDiagnostics::ConnectionStatusEnum);
typedef void (*NullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::ConnectionStatusEnum> &);
typedef void (*ThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback)(
    void *, chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFault);
typedef void (*NullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFault> &);
typedef void (*ThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback)(
    void *, chip::app::Clusters::ThreadNetworkDiagnostics::RoutingRole);
typedef void (*NullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::RoutingRole> &);
typedef void (*WiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallback)(
    void *, chip::app::Clusters::WiFiNetworkDiagnostics::AssociationFailureCauseEnum);
typedef void (*NullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::AssociationFailureCauseEnum> &);
typedef void (*WiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback)(
    void *, chip::app::Clusters::WiFiNetworkDiagnostics::ConnectionStatusEnum);
typedef void (*NullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::ConnectionStatusEnum> &);
typedef void (*WiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallback)(
    void *, chip::app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum);
typedef void (*NullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum> &);
typedef void (*WiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallback)(
    void *, chip::app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum);
typedef void (*NullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum> &);
typedef void (*EthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallback)(
    void *, chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum);
typedef void (*NullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> &);
typedef void (*TimeSynchronizationClusterGranularityEnumAttributeCallback)(
    void *, chip::app::Clusters::TimeSynchronization::GranularityEnum);
typedef void (*NullableTimeSynchronizationClusterGranularityEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TimeSynchronization::GranularityEnum> &);
typedef void (*TimeSynchronizationClusterTimeSourceEnumAttributeCallback)(void *,
                                                                          chip::app::Clusters::TimeSynchronization::TimeSourceEnum);
typedef void (*NullableTimeSynchronizationClusterTimeSourceEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TimeSynchronization::TimeSourceEnum> &);
typedef void (*BridgedDeviceBasicInformationClusterColorEnumAttributeCallback)(
    void *, chip::app::Clusters::BridgedDeviceBasicInformation::ColorEnum);
typedef void (*NullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BridgedDeviceBasicInformation::ColorEnum> &);
typedef void (*BridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallback)(
    void *, chip::app::Clusters::BridgedDeviceBasicInformation::ProductFinishEnum);
typedef void (*NullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BridgedDeviceBasicInformation::ProductFinishEnum> &);
typedef void (*AdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallback)(
    void *, chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum);
typedef void (*NullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum> &);
typedef void (*AdministratorCommissioningClusterStatusCodeAttributeCallback)(
    void *, chip::app::Clusters::AdministratorCommissioning::StatusCode);
typedef void (*NullableAdministratorCommissioningClusterStatusCodeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::AdministratorCommissioning::StatusCode> &);
typedef void (*OperationalCredentialsClusterCertificateChainTypeEnumAttributeCallback)(
    void *, chip::app::Clusters::OperationalCredentials::CertificateChainTypeEnum);
typedef void (*NullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OperationalCredentials::CertificateChainTypeEnum> &);
typedef void (*OperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallback)(
    void *, chip::app::Clusters::OperationalCredentials::NodeOperationalCertStatusEnum);
typedef void (*NullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OperationalCredentials::NodeOperationalCertStatusEnum> &);
typedef void (*GroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallback)(
    void *, chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum);
typedef void (*NullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum> &);
typedef void (*AirQualityClusterAirQualityEnumAttributeCallback)(void *, chip::app::Clusters::AirQuality::AirQualityEnum);
typedef void (*NullableAirQualityClusterAirQualityEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::AirQuality::AirQualityEnum> &);
typedef void (*SmokeCOAlarmClusterAlarmStateEnumAttributeCallback)(void *, chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum);
typedef void (*NullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum> &);
typedef void (*SmokeCOAlarmClusterContaminationStateEnumAttributeCallback)(
    void *, chip::app::Clusters::SmokeCoAlarm::ContaminationStateEnum);
typedef void (*NullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::ContaminationStateEnum> &);
typedef void (*SmokeCOAlarmClusterEndOfServiceEnumAttributeCallback)(void *, chip::app::Clusters::SmokeCoAlarm::EndOfServiceEnum);
typedef void (*NullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::EndOfServiceEnum> &);
typedef void (*SmokeCOAlarmClusterExpressedStateEnumAttributeCallback)(void *,
                                                                       chip::app::Clusters::SmokeCoAlarm::ExpressedStateEnum);
typedef void (*NullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::ExpressedStateEnum> &);
typedef void (*SmokeCOAlarmClusterMuteStateEnumAttributeCallback)(void *, chip::app::Clusters::SmokeCoAlarm::MuteStateEnum);
typedef void (*NullableSmokeCOAlarmClusterMuteStateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::MuteStateEnum> &);
typedef void (*SmokeCOAlarmClusterSensitivityEnumAttributeCallback)(void *, chip::app::Clusters::SmokeCoAlarm::SensitivityEnum);
typedef void (*NullableSmokeCOAlarmClusterSensitivityEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::SensitivityEnum> &);
typedef void (*HEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::HepaFilterMonitoring::ChangeIndicationEnum);
typedef void (*NullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::HepaFilterMonitoring::ChangeIndicationEnum> &);
typedef void (*HEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::HepaFilterMonitoring::DegradationDirectionEnum);
typedef void (*NullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::HepaFilterMonitoring::DegradationDirectionEnum> &);
typedef void (*ActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::ActivatedCarbonFilterMonitoring::ChangeIndicationEnum);
typedef void (*NullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ActivatedCarbonFilterMonitoring::ChangeIndicationEnum> &);
typedef void (*ActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::ActivatedCarbonFilterMonitoring::DegradationDirectionEnum);
typedef void (*NullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ActivatedCarbonFilterMonitoring::DegradationDirectionEnum> &);
typedef void (*CeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::CeramicFilterMonitoring::ChangeIndicationEnum);
typedef void (*NullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::CeramicFilterMonitoring::ChangeIndicationEnum> &);
typedef void (*CeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::CeramicFilterMonitoring::DegradationDirectionEnum);
typedef void (*NullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::CeramicFilterMonitoring::DegradationDirectionEnum> &);
typedef void (*ElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::ElectrostaticFilterMonitoring::ChangeIndicationEnum);
typedef void (*NullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ElectrostaticFilterMonitoring::ChangeIndicationEnum> &);
typedef void (*ElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::ElectrostaticFilterMonitoring::DegradationDirectionEnum);
typedef void (*NullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ElectrostaticFilterMonitoring::DegradationDirectionEnum> &);
typedef void (*UVFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::UvFilterMonitoring::ChangeIndicationEnum);
typedef void (*NullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::UvFilterMonitoring::ChangeIndicationEnum> &);
typedef void (*UVFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::UvFilterMonitoring::DegradationDirectionEnum);
typedef void (*NullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::UvFilterMonitoring::DegradationDirectionEnum> &);
typedef void (*IonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::IonizingFilterMonitoring::ChangeIndicationEnum);
typedef void (*NullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::IonizingFilterMonitoring::ChangeIndicationEnum> &);
typedef void (*IonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::IonizingFilterMonitoring::DegradationDirectionEnum);
typedef void (*NullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::IonizingFilterMonitoring::DegradationDirectionEnum> &);
typedef void (*ZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::ZeoliteFilterMonitoring::ChangeIndicationEnum);
typedef void (*NullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ZeoliteFilterMonitoring::ChangeIndicationEnum> &);
typedef void (*ZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::ZeoliteFilterMonitoring::DegradationDirectionEnum);
typedef void (*NullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ZeoliteFilterMonitoring::DegradationDirectionEnum> &);
typedef void (*OzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::OzoneFilterMonitoring::ChangeIndicationEnum);
typedef void (*NullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneFilterMonitoring::ChangeIndicationEnum> &);
typedef void (*OzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::OzoneFilterMonitoring::DegradationDirectionEnum);
typedef void (*NullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneFilterMonitoring::DegradationDirectionEnum> &);
typedef void (*WaterTankMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::WaterTankMonitoring::ChangeIndicationEnum);
typedef void (*NullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::WaterTankMonitoring::ChangeIndicationEnum> &);
typedef void (*WaterTankMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::WaterTankMonitoring::DegradationDirectionEnum);
typedef void (*NullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::WaterTankMonitoring::DegradationDirectionEnum> &);
typedef void (*FuelTankMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::FuelTankMonitoring::ChangeIndicationEnum);
typedef void (*NullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FuelTankMonitoring::ChangeIndicationEnum> &);
typedef void (*FuelTankMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::FuelTankMonitoring::DegradationDirectionEnum);
typedef void (*NullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FuelTankMonitoring::DegradationDirectionEnum> &);
typedef void (*InkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::InkCartridgeMonitoring::ChangeIndicationEnum);
typedef void (*NullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::InkCartridgeMonitoring::ChangeIndicationEnum> &);
typedef void (*InkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::InkCartridgeMonitoring::DegradationDirectionEnum);
typedef void (*NullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::InkCartridgeMonitoring::DegradationDirectionEnum> &);
typedef void (*TonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, chip::app::Clusters::TonerCartridgeMonitoring::ChangeIndicationEnum);
typedef void (*NullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TonerCartridgeMonitoring::ChangeIndicationEnum> &);
typedef void (*TonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, chip::app::Clusters::TonerCartridgeMonitoring::DegradationDirectionEnum);
typedef void (*NullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TonerCartridgeMonitoring::DegradationDirectionEnum> &);
typedef void (*DoorLockClusterAlarmCodeEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::AlarmCodeEnum);
typedef void (*NullableDoorLockClusterAlarmCodeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::AlarmCodeEnum> &);
typedef void (*DoorLockClusterCredentialRuleEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::CredentialRuleEnum);
typedef void (*NullableDoorLockClusterCredentialRuleEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::CredentialRuleEnum> &);
typedef void (*DoorLockClusterCredentialTypeEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::CredentialTypeEnum);
typedef void (*NullableDoorLockClusterCredentialTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::CredentialTypeEnum> &);
typedef void (*DoorLockClusterDataOperationTypeEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::DataOperationTypeEnum);
typedef void (*NullableDoorLockClusterDataOperationTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DataOperationTypeEnum> &);
typedef void (*DoorLockClusterDlLockStateAttributeCallback)(void *, chip::app::Clusters::DoorLock::DlLockState);
typedef void (*NullableDoorLockClusterDlLockStateAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> &);
typedef void (*DoorLockClusterDlLockTypeAttributeCallback)(void *, chip::app::Clusters::DoorLock::DlLockType);
typedef void (*NullableDoorLockClusterDlLockTypeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockType> &);
typedef void (*DoorLockClusterDlStatusAttributeCallback)(void *, chip::app::Clusters::DoorLock::DlStatus);
typedef void (*NullableDoorLockClusterDlStatusAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlStatus> &);
typedef void (*DoorLockClusterDoorLockOperationEventCodeAttributeCallback)(
    void *, chip::app::Clusters::DoorLock::DoorLockOperationEventCode);
typedef void (*NullableDoorLockClusterDoorLockOperationEventCodeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorLockOperationEventCode> &);
typedef void (*DoorLockClusterDoorLockProgrammingEventCodeAttributeCallback)(
    void *, chip::app::Clusters::DoorLock::DoorLockProgrammingEventCode);
typedef void (*NullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorLockProgrammingEventCode> &);
typedef void (*DoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback)(void *,
                                                                         chip::app::Clusters::DoorLock::DoorLockSetPinOrIdStatus);
typedef void (*NullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorLockSetPinOrIdStatus> &);
typedef void (*DoorLockClusterDoorStateEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::DoorStateEnum);
typedef void (*NullableDoorLockClusterDoorStateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorStateEnum> &);
typedef void (*DoorLockClusterLockDataTypeEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::LockDataTypeEnum);
typedef void (*NullableDoorLockClusterLockDataTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::LockDataTypeEnum> &);
typedef void (*DoorLockClusterLockOperationTypeEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::LockOperationTypeEnum);
typedef void (*NullableDoorLockClusterLockOperationTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::LockOperationTypeEnum> &);
typedef void (*DoorLockClusterOperatingModeEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::OperatingModeEnum);
typedef void (*NullableDoorLockClusterOperatingModeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::OperatingModeEnum> &);
typedef void (*DoorLockClusterOperationErrorEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::OperationErrorEnum);
typedef void (*NullableDoorLockClusterOperationErrorEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::OperationErrorEnum> &);
typedef void (*DoorLockClusterOperationSourceEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::OperationSourceEnum);
typedef void (*NullableDoorLockClusterOperationSourceEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::OperationSourceEnum> &);
typedef void (*DoorLockClusterUserStatusEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::UserStatusEnum);
typedef void (*NullableDoorLockClusterUserStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::UserStatusEnum> &);
typedef void (*DoorLockClusterUserTypeEnumAttributeCallback)(void *, chip::app::Clusters::DoorLock::UserTypeEnum);
typedef void (*NullableDoorLockClusterUserTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::UserTypeEnum> &);
typedef void (*WindowCoveringClusterEndProductTypeAttributeCallback)(void *, chip::app::Clusters::WindowCovering::EndProductType);
typedef void (*NullableWindowCoveringClusterEndProductTypeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::WindowCovering::EndProductType> &);
typedef void (*WindowCoveringClusterTypeAttributeCallback)(void *, chip::app::Clusters::WindowCovering::Type);
typedef void (*NullableWindowCoveringClusterTypeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::WindowCovering::Type> &);
typedef void (*PumpConfigurationAndControlClusterControlModeEnumAttributeCallback)(
    void *, chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum);
typedef void (*NullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum> &);
typedef void (*PumpConfigurationAndControlClusterOperationModeEnumAttributeCallback)(
    void *, chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum);
typedef void (*NullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum> &);
typedef void (*ThermostatClusterSetpointAdjustModeAttributeCallback)(void *, chip::app::Clusters::Thermostat::SetpointAdjustMode);
typedef void (*NullableThermostatClusterSetpointAdjustModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::SetpointAdjustMode> &);
typedef void (*ThermostatClusterThermostatControlSequenceAttributeCallback)(
    void *, chip::app::Clusters::Thermostat::ThermostatControlSequence);
typedef void (*NullableThermostatClusterThermostatControlSequenceAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::ThermostatControlSequence> &);
typedef void (*ThermostatClusterThermostatRunningModeAttributeCallback)(void *,
                                                                        chip::app::Clusters::Thermostat::ThermostatRunningMode);
typedef void (*NullableThermostatClusterThermostatRunningModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::ThermostatRunningMode> &);
typedef void (*ThermostatClusterThermostatSystemModeAttributeCallback)(void *,
                                                                       chip::app::Clusters::Thermostat::ThermostatSystemMode);
typedef void (*NullableThermostatClusterThermostatSystemModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::ThermostatSystemMode> &);
typedef void (*FanControlClusterFanModeSequenceTypeAttributeCallback)(void *, chip::app::Clusters::FanControl::FanModeSequenceType);
typedef void (*NullableFanControlClusterFanModeSequenceTypeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FanControl::FanModeSequenceType> &);
typedef void (*FanControlClusterFanModeTypeAttributeCallback)(void *, chip::app::Clusters::FanControl::FanModeType);
typedef void (*NullableFanControlClusterFanModeTypeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FanControl::FanModeType> &);
typedef void (*ColorControlClusterColorLoopActionAttributeCallback)(void *, chip::app::Clusters::ColorControl::ColorLoopAction);
typedef void (*NullableColorControlClusterColorLoopActionAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::ColorLoopAction> &);
typedef void (*ColorControlClusterColorLoopDirectionAttributeCallback)(void *,
                                                                       chip::app::Clusters::ColorControl::ColorLoopDirection);
typedef void (*NullableColorControlClusterColorLoopDirectionAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::ColorLoopDirection> &);
typedef void (*ColorControlClusterColorModeAttributeCallback)(void *, chip::app::Clusters::ColorControl::ColorMode);
typedef void (*NullableColorControlClusterColorModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::ColorMode> &);
typedef void (*ColorControlClusterHueDirectionAttributeCallback)(void *, chip::app::Clusters::ColorControl::HueDirection);
typedef void (*NullableColorControlClusterHueDirectionAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::HueDirection> &);
typedef void (*ColorControlClusterHueMoveModeAttributeCallback)(void *, chip::app::Clusters::ColorControl::HueMoveMode);
typedef void (*NullableColorControlClusterHueMoveModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::HueMoveMode> &);
typedef void (*ColorControlClusterHueStepModeAttributeCallback)(void *, chip::app::Clusters::ColorControl::HueStepMode);
typedef void (*NullableColorControlClusterHueStepModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::HueStepMode> &);
typedef void (*ColorControlClusterSaturationMoveModeAttributeCallback)(void *,
                                                                       chip::app::Clusters::ColorControl::SaturationMoveMode);
typedef void (*NullableColorControlClusterSaturationMoveModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::SaturationMoveMode> &);
typedef void (*ColorControlClusterSaturationStepModeAttributeCallback)(void *,
                                                                       chip::app::Clusters::ColorControl::SaturationStepMode);
typedef void (*NullableColorControlClusterSaturationStepModeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::SaturationStepMode> &);
typedef void (*IlluminanceMeasurementClusterLightSensorTypeAttributeCallback)(
    void *, chip::app::Clusters::IlluminanceMeasurement::LightSensorType);
typedef void (*NullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::IlluminanceMeasurement::LightSensorType> &);
typedef void (*OccupancySensingClusterOccupancySensorTypeEnumAttributeCallback)(
    void *, chip::app::Clusters::OccupancySensing::OccupancySensorTypeEnum);
typedef void (*NullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OccupancySensing::OccupancySensorTypeEnum> &);
typedef void (*CarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::LevelValueEnum> &);
typedef void (*CarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*CarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*CarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::CarbonDioxideConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonDioxideConcentrationMeasurement::LevelValueEnum> &);
typedef void (*CarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*CarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*EthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::EthyleneConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneConcentrationMeasurement::LevelValueEnum> &);
typedef void (*EthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*EthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*EthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::EthyleneOxideConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneOxideConcentrationMeasurement::LevelValueEnum> &);
typedef void (*EthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*EthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*HydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::HydrogenConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenConcentrationMeasurement::LevelValueEnum> &);
typedef void (*HydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*HydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*HydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::LevelValueEnum> &);
typedef void (*HydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*HydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*NitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::NitricOxideConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::NitricOxideConcentrationMeasurement::LevelValueEnum> &);
typedef void (*NitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*NitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*NitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::LevelValueEnum> &);
typedef void (*NitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*NitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*OxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::OxygenConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OxygenConcentrationMeasurement::LevelValueEnum> &);
typedef void (*OxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*OxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*OzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::OzoneConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneConcentrationMeasurement::LevelValueEnum> &);
typedef void (*OzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*OzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*SulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::SulfurDioxideConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SulfurDioxideConcentrationMeasurement::LevelValueEnum> &);
typedef void (*SulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*SulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*DissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::LevelValueEnum> &);
typedef void (*DissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*DissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*BromateConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::BromateConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BromateConcentrationMeasurement::LevelValueEnum> &);
typedef void (*BromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::BromateConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BromateConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*BromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::BromateConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BromateConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*ChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::ChloraminesConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ChloraminesConcentrationMeasurement::LevelValueEnum> &);
typedef void (*ChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*ChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*ChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::ChlorineConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ChlorineConcentrationMeasurement::LevelValueEnum> &);
typedef void (*ChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*ChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*FecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::LevelValueEnum> &);
typedef void (*FecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*FecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*FluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::FluorideConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FluorideConcentrationMeasurement::LevelValueEnum> &);
typedef void (*FluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*FluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*HaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::LevelValueEnum> &);
typedef void (*HaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*HaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*TotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::LevelValueEnum> &);
typedef void (*TotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<
        chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*TotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*TotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::LevelValueEnum> &);
typedef void (*TotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<
        chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*TotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<
        chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*TurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::TurbidityConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TurbidityConcentrationMeasurement::LevelValueEnum> &);
typedef void (*TurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*TurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*CopperConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::CopperConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::CopperConcentrationMeasurement::LevelValueEnum> &);
typedef void (*CopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::CopperConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::CopperConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*CopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::CopperConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::CopperConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*LeadConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::LeadConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::LeadConcentrationMeasurement::LevelValueEnum> &);
typedef void (*LeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::LeadConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::LeadConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*LeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::LeadConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::LeadConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*ManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::ManganeseConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ManganeseConcentrationMeasurement::LevelValueEnum> &);
typedef void (*ManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*ManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*SulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::SulfateConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SulfateConcentrationMeasurement::LevelValueEnum> &);
typedef void (*SulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*SulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*BromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::LevelValueEnum> &);
typedef void (*BromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<
        chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*BromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*BromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::BromoformConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BromoformConcentrationMeasurement::LevelValueEnum> &);
typedef void (*BromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*BromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*ChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::LevelValueEnum> &);
typedef void (*ChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<
        chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*ChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*ChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::ChloroformConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ChloroformConcentrationMeasurement::LevelValueEnum> &);
typedef void (*ChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*ChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*SodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::SodiumConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SodiumConcentrationMeasurement::LevelValueEnum> &);
typedef void (*SodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*SodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*PM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::Pm25ConcentrationMeasurement::LevelValueEnum);
typedef void (*NullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Pm25ConcentrationMeasurement::LevelValueEnum> &);
typedef void (*PM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*PM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*FormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::FormaldehydeConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FormaldehydeConcentrationMeasurement::LevelValueEnum> &);
typedef void (*FormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*FormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*PM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::Pm1ConcentrationMeasurement::LevelValueEnum);
typedef void (*NullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Pm1ConcentrationMeasurement::LevelValueEnum> &);
typedef void (*PM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*PM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*PM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::Pm10ConcentrationMeasurement::LevelValueEnum);
typedef void (*NullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Pm10ConcentrationMeasurement::LevelValueEnum> &);
typedef void (*PM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*PM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*TotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<
        chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::LevelValueEnum> &);
typedef void (*TotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<
        chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*TotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<
        chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*RadonConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, chip::app::Clusters::RadonConcentrationMeasurement::LevelValueEnum);
typedef void (*NullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::RadonConcentrationMeasurement::LevelValueEnum> &);
typedef void (*RadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, chip::app::Clusters::RadonConcentrationMeasurement::MeasurementMediumEnum);
typedef void (*NullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::RadonConcentrationMeasurement::MeasurementMediumEnum> &);
typedef void (*RadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, chip::app::Clusters::RadonConcentrationMeasurement::MeasurementUnitEnum);
typedef void (*NullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::RadonConcentrationMeasurement::MeasurementUnitEnum> &);
typedef void (*ChannelClusterChannelStatusEnumAttributeCallback)(void *, chip::app::Clusters::Channel::ChannelStatusEnum);
typedef void (*NullableChannelClusterChannelStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::ChannelStatusEnum> &);
typedef void (*ChannelClusterLineupInfoTypeEnumAttributeCallback)(void *, chip::app::Clusters::Channel::LineupInfoTypeEnum);
typedef void (*NullableChannelClusterLineupInfoTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::LineupInfoTypeEnum> &);
typedef void (*TargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback)(
    void *, chip::app::Clusters::TargetNavigator::TargetNavigatorStatusEnum);
typedef void (*NullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::TargetNavigator::TargetNavigatorStatusEnum> &);
typedef void (*MediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback)(
    void *, chip::app::Clusters::MediaPlayback::MediaPlaybackStatusEnum);
typedef void (*NullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::MediaPlaybackStatusEnum> &);
typedef void (*MediaPlaybackClusterPlaybackStateEnumAttributeCallback)(void *,
                                                                       chip::app::Clusters::MediaPlayback::PlaybackStateEnum);
typedef void (*NullableMediaPlaybackClusterPlaybackStateEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::PlaybackStateEnum> &);
typedef void (*MediaInputClusterInputTypeEnumAttributeCallback)(void *, chip::app::Clusters::MediaInput::InputTypeEnum);
typedef void (*NullableMediaInputClusterInputTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::MediaInput::InputTypeEnum> &);
typedef void (*KeypadInputClusterCecKeyCodeAttributeCallback)(void *, chip::app::Clusters::KeypadInput::CecKeyCode);
typedef void (*NullableKeypadInputClusterCecKeyCodeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::KeypadInput::CecKeyCode> &);
typedef void (*KeypadInputClusterKeypadInputStatusEnumAttributeCallback)(void *,
                                                                         chip::app::Clusters::KeypadInput::KeypadInputStatusEnum);
typedef void (*NullableKeypadInputClusterKeypadInputStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::KeypadInput::KeypadInputStatusEnum> &);
typedef void (*ContentLauncherClusterContentLaunchStatusEnumAttributeCallback)(
    void *, chip::app::Clusters::ContentLauncher::ContentLaunchStatusEnum);
typedef void (*NullableContentLauncherClusterContentLaunchStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ContentLauncher::ContentLaunchStatusEnum> &);
typedef void (*ContentLauncherClusterMetricTypeEnumAttributeCallback)(void *, chip::app::Clusters::ContentLauncher::MetricTypeEnum);
typedef void (*NullableContentLauncherClusterMetricTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ContentLauncher::MetricTypeEnum> &);
typedef void (*ContentLauncherClusterParameterEnumAttributeCallback)(void *, chip::app::Clusters::ContentLauncher::ParameterEnum);
typedef void (*NullableContentLauncherClusterParameterEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ContentLauncher::ParameterEnum> &);
typedef void (*AudioOutputClusterOutputTypeEnumAttributeCallback)(void *, chip::app::Clusters::AudioOutput::OutputTypeEnum);
typedef void (*NullableAudioOutputClusterOutputTypeEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::AudioOutput::OutputTypeEnum> &);
typedef void (*ApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback)(
    void *, chip::app::Clusters::ApplicationLauncher::ApplicationLauncherStatusEnum);
typedef void (*NullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ApplicationLauncher::ApplicationLauncherStatusEnum> &);
typedef void (*ApplicationBasicClusterApplicationStatusEnumAttributeCallback)(
    void *, chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum);
typedef void (*NullableApplicationBasicClusterApplicationStatusEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum> &);
typedef void (*UnitTestingClusterSimpleEnumAttributeCallback)(void *, chip::app::Clusters::UnitTesting::SimpleEnum);
typedef void (*NullableUnitTestingClusterSimpleEnumAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> &);
typedef void (*FaultInjectionClusterFaultTypeAttributeCallback)(void *, chip::app::Clusters::FaultInjection::FaultType);
typedef void (*NullableFaultInjectionClusterFaultTypeAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::FaultInjection::FaultType> &);

typedef void (*IdentifyGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*IdentifyAcceptedCommandListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*IdentifyEventListListAttributeCallback)(void * context,
                                                       const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*IdentifyAttributeListListAttributeCallback)(void * context,
                                                           const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*GroupsNameSupportAttributeCallback)(void *, chip::BitMask<chip::app::Clusters::Groups::NameSupportBitmap>);
typedef void (*GroupsGeneratedCommandListListAttributeCallback)(void * context,
                                                                const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*GroupsAcceptedCommandListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*GroupsEventListListAttributeCallback)(void * context,
                                                     const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*GroupsAttributeListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ScenesGeneratedCommandListListAttributeCallback)(void * context,
                                                                const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ScenesAcceptedCommandListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ScenesEventListListAttributeCallback)(void * context,
                                                     const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ScenesAttributeListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*OnOffGeneratedCommandListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OnOffAcceptedCommandListListAttributeCallback)(void * context,
                                                              const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OnOffEventListListAttributeCallback)(void * context,
                                                    const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*OnOffAttributeListListAttributeCallback)(void * context,
                                                        const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*OnOffSwitchConfigurationGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OnOffSwitchConfigurationAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OnOffSwitchConfigurationEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*OnOffSwitchConfigurationAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*LevelControlOptionsAttributeCallback)(void *, chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>);
typedef void (*LevelControlGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*LevelControlAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*LevelControlEventListListAttributeCallback)(void * context,
                                                           const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*LevelControlAttributeListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*BinaryInputBasicGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BinaryInputBasicAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BinaryInputBasicEventListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BinaryInputBasicAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*PulseWidthModulationEventListListAttributeCallback)(void * context,
                                                                   const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*DescriptorDeviceTypeListListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::Descriptor::Structs::DeviceTypeStruct::DecodableType> & data);
typedef void (*DescriptorServerListListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<chip::ClusterId> & data);
typedef void (*DescriptorClientListListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<chip::ClusterId> & data);
typedef void (*DescriptorPartsListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::EndpointId> & data);
typedef void (*DescriptorGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*DescriptorAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*DescriptorEventListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*DescriptorAttributeListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*BindingBindingListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> & data);
typedef void (*BindingGeneratedCommandListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BindingAcceptedCommandListListAttributeCallback)(void * context,
                                                                const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BindingEventListListAttributeCallback)(void * context,
                                                      const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BindingAttributeListListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*AccessControlACLListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<
        chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType> & data);
typedef void (*AccessControlExtensionListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<
        chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType> & data);
typedef void (*AccessControlGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AccessControlAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AccessControlEventListListAttributeCallback)(void * context,
                                                            const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*AccessControlAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ActionsActionListListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::Actions::Structs::ActionStruct::DecodableType> & data);
typedef void (*ActionsEndpointListsListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::Actions::Structs::EndpointListStruct::DecodableType> & data);
typedef void (*ActionsGeneratedCommandListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ActionsAcceptedCommandListListAttributeCallback)(void * context,
                                                                const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ActionsEventListListAttributeCallback)(void * context,
                                                      const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ActionsAttributeListListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*BasicInformationCapabilityMinimaStructAttributeCallback)(
    void *, const chip::app::Clusters::BasicInformation::Structs::CapabilityMinimaStruct::DecodableType &);
typedef void (*BasicInformationProductAppearanceStructAttributeCallback)(
    void *, const chip::app::Clusters::BasicInformation::Structs::ProductAppearanceStruct::DecodableType &);
typedef void (*BasicInformationGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BasicInformationAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BasicInformationEventListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BasicInformationAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*OTASoftwareUpdateProviderGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OTASoftwareUpdateProviderAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OTASoftwareUpdateProviderEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*OTASoftwareUpdateProviderAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*OTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<
        chip::app::Clusters::OtaSoftwareUpdateRequestor::Structs::ProviderLocation::DecodableType> & data);
typedef void (*OTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OTASoftwareUpdateRequestorEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*OTASoftwareUpdateRequestorAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*LocalizationConfigurationSupportedLocalesListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CharSpan> & data);
typedef void (*LocalizationConfigurationGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*LocalizationConfigurationAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*LocalizationConfigurationEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*LocalizationConfigurationAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TimeFormatLocalizationSupportedCalendarTypesListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::TimeFormatLocalization::CalendarTypeEnum> & data);
typedef void (*TimeFormatLocalizationGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TimeFormatLocalizationAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TimeFormatLocalizationEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*TimeFormatLocalizationAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*UnitLocalizationGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*UnitLocalizationAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*UnitLocalizationEventListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*UnitLocalizationAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*PowerSourceConfigurationSourcesListAttributeCallback)(void * context,
                                                                     const chip::app::DataModel::DecodableList<uint8_t> & data);
typedef void (*PowerSourceConfigurationGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PowerSourceConfigurationAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PowerSourceConfigurationEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*PowerSourceConfigurationAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*PowerSourceActiveWiredFaultsListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::WiredFaultEnum> & data);
typedef void (*PowerSourceActiveBatFaultsListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatFaultEnum> & data);
typedef void (*PowerSourceActiveBatChargeFaultsListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatChargeFaultEnum> & data);
typedef void (*PowerSourceGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PowerSourceAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PowerSourceEventListListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*PowerSourceAttributeListListAttributeCallback)(void * context,
                                                              const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*GeneralCommissioningBasicCommissioningInfoStructAttributeCallback)(
    void *, const chip::app::Clusters::GeneralCommissioning::Structs::BasicCommissioningInfo::DecodableType &);
typedef void (*GeneralCommissioningGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*GeneralCommissioningAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*GeneralCommissioningEventListListAttributeCallback)(void * context,
                                                                   const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*GeneralCommissioningAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*NetworkCommissioningNetworksListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::NetworkCommissioning::Structs::NetworkInfo::DecodableType> &
        data);
typedef void (*NetworkCommissioningGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*NetworkCommissioningAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*NetworkCommissioningEventListListAttributeCallback)(void * context,
                                                                   const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*NetworkCommissioningAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*DiagnosticLogsGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*DiagnosticLogsAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*DiagnosticLogsEventListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*DiagnosticLogsAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*GeneralDiagnosticsNetworkInterfacesListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::Structs::NetworkInterface::DecodableType> &
        data);
typedef void (*GeneralDiagnosticsActiveHardwareFaultsListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::HardwareFaultEnum> & data);
typedef void (*GeneralDiagnosticsActiveRadioFaultsListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::RadioFaultEnum> & data);
typedef void (*GeneralDiagnosticsActiveNetworkFaultsListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::NetworkFaultEnum> & data);
typedef void (*GeneralDiagnosticsGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*GeneralDiagnosticsAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*GeneralDiagnosticsEventListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*GeneralDiagnosticsAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*SoftwareDiagnosticsThreadMetricsListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<
        chip::app::Clusters::SoftwareDiagnostics::Structs::ThreadMetricsStruct::DecodableType> & data);
typedef void (*SoftwareDiagnosticsGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SoftwareDiagnosticsAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SoftwareDiagnosticsEventListListAttributeCallback)(void * context,
                                                                  const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*SoftwareDiagnosticsAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ThreadNetworkDiagnosticsNeighborTableListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<
        chip::app::Clusters::ThreadNetworkDiagnostics::Structs::NeighborTable::DecodableType> & data);
typedef void (*ThreadNetworkDiagnosticsRouteTableListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::ThreadNetworkDiagnostics::Structs::RouteTable::DecodableType> &
        data);
typedef void (*ThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::Structs::SecurityPolicy::DecodableType> &);
typedef void (*ThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<
        chip::app::Clusters::ThreadNetworkDiagnostics::Structs::OperationalDatasetComponents::DecodableType> &);
typedef void (*ThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFault> & data);
typedef void (*ThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ThreadNetworkDiagnosticsEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ThreadNetworkDiagnosticsAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*WiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*WiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*WiFiNetworkDiagnosticsEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*WiFiNetworkDiagnosticsAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*EthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*EthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*EthernetNetworkDiagnosticsEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*EthernetNetworkDiagnosticsAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TimeSynchronizationEventListListAttributeCallback)(void * context,
                                                                  const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BridgedDeviceBasicInformationProductAppearanceStructAttributeCallback)(
    void *, const chip::app::Clusters::BridgedDeviceBasicInformation::Structs::ProductAppearanceStruct::DecodableType &);
typedef void (*BridgedDeviceBasicInformationGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BridgedDeviceBasicInformationAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BridgedDeviceBasicInformationEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BridgedDeviceBasicInformationAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*SwitchGeneratedCommandListListAttributeCallback)(void * context,
                                                                const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SwitchAcceptedCommandListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SwitchEventListListAttributeCallback)(void * context,
                                                     const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*SwitchAttributeListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*AdministratorCommissioningGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AdministratorCommissioningAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AdministratorCommissioningEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*AdministratorCommissioningAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*OperationalCredentialsNOCsListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::OperationalCredentials::Structs::NOCStruct::DecodableType> &
        data);
typedef void (*OperationalCredentialsFabricsListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<
        chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType> & data);
typedef void (*OperationalCredentialsTrustedRootCertificatesListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::ByteSpan> & data);
typedef void (*OperationalCredentialsGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OperationalCredentialsAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OperationalCredentialsEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*OperationalCredentialsAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*GroupKeyManagementGroupKeyMapListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType> &
        data);
typedef void (*GroupKeyManagementGroupTableListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType> &
        data);
typedef void (*GroupKeyManagementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*GroupKeyManagementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*GroupKeyManagementEventListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*GroupKeyManagementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*FixedLabelLabelListListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::FixedLabel::Structs::LabelStruct::DecodableType> & data);
typedef void (*FixedLabelGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FixedLabelAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FixedLabelEventListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*FixedLabelAttributeListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*UserLabelLabelListListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> & data);
typedef void (*UserLabelGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*UserLabelAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*UserLabelEventListListAttributeCallback)(void * context,
                                                        const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*UserLabelAttributeListListAttributeCallback)(void * context,
                                                            const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ProxyConfigurationEventListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ProxyDiscoveryEventListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ProxyValidEventListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BooleanStateGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BooleanStateAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BooleanStateEventListListAttributeCallback)(void * context,
                                                           const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BooleanStateAttributeListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ModeSelectSupportedModesListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::ModeSelect::Structs::ModeOptionStruct::DecodableType> & data);
typedef void (*ModeSelectGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ModeSelectAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ModeSelectEventListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ModeSelectAttributeListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TemperatureControlSupportedTemperatureLevelsListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<
        chip::app::Clusters::TemperatureControl::Structs::TemperatureLevelStruct::DecodableType> & data);
typedef void (*TemperatureControlGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TemperatureControlAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TemperatureControlEventListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*TemperatureControlAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*RefrigeratorAlarmMaskAttributeCallback)(void *, chip::BitMask<chip::app::Clusters::RefrigeratorAlarm::AlarmMap>);
typedef void (*RefrigeratorAlarmLatchAttributeCallback)(void *, chip::BitMask<chip::app::Clusters::RefrigeratorAlarm::AlarmMap>);
typedef void (*RefrigeratorAlarmStateAttributeCallback)(void *, chip::BitMask<chip::app::Clusters::RefrigeratorAlarm::AlarmMap>);
typedef void (*RefrigeratorAlarmGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*RefrigeratorAlarmAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*RefrigeratorAlarmEventListListAttributeCallback)(void * context,
                                                                const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*RefrigeratorAlarmAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*AirQualityGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AirQualityAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AirQualityEventListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*AirQualityAttributeListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*SmokeCOAlarmGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SmokeCOAlarmAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SmokeCOAlarmEventListListAttributeCallback)(void * context,
                                                           const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*SmokeCOAlarmAttributeListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*HEPAFilterMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*HEPAFilterMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*HEPAFilterMonitoringEventListListAttributeCallback)(void * context,
                                                                   const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*HEPAFilterMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ActivatedCarbonFilterMonitoringEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ActivatedCarbonFilterMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*CeramicFilterMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*CeramicFilterMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*CeramicFilterMonitoringEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*CeramicFilterMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ElectrostaticFilterMonitoringEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ElectrostaticFilterMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*UVFilterMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*UVFilterMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*UVFilterMonitoringEventListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*UVFilterMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*IonizingFilterMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*IonizingFilterMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*IonizingFilterMonitoringEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*IonizingFilterMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ZeoliteFilterMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ZeoliteFilterMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ZeoliteFilterMonitoringEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ZeoliteFilterMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*OzoneFilterMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OzoneFilterMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OzoneFilterMonitoringEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*OzoneFilterMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*WaterTankMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*WaterTankMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*WaterTankMonitoringEventListListAttributeCallback)(void * context,
                                                                  const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*WaterTankMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*FuelTankMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FuelTankMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FuelTankMonitoringEventListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*FuelTankMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*InkCartridgeMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*InkCartridgeMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*InkCartridgeMonitoringEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*InkCartridgeMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TonerCartridgeMonitoringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TonerCartridgeMonitoringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TonerCartridgeMonitoringEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*TonerCartridgeMonitoringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*DoorLockCredentialRulesSupportAttributeCallback)(void *,
                                                                chip::BitMask<chip::app::Clusters::DoorLock::DlCredentialRuleMask>);
typedef void (*DoorLockSupportedOperatingModesAttributeCallback)(
    void *, chip::BitMask<chip::app::Clusters::DoorLock::DlSupportedOperatingModes>);
typedef void (*DoorLockDefaultConfigurationRegisterAttributeCallback)(
    void *, chip::BitMask<chip::app::Clusters::DoorLock::DlDefaultConfigurationRegister>);
typedef void (*DoorLockLocalProgrammingFeaturesAttributeCallback)(
    void *, chip::BitMask<chip::app::Clusters::DoorLock::DlLocalProgrammingFeatures>);
typedef void (*DoorLockGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*DoorLockAcceptedCommandListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*DoorLockEventListListAttributeCallback)(void * context,
                                                       const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*DoorLockAttributeListListAttributeCallback)(void * context,
                                                           const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*WindowCoveringConfigStatusAttributeCallback)(void *,
                                                            chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus>);
typedef void (*WindowCoveringOperationalStatusAttributeCallback)(
    void *, chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus>);
typedef void (*WindowCoveringModeAttributeCallback)(void *, chip::BitMask<chip::app::Clusters::WindowCovering::Mode>);
typedef void (*WindowCoveringSafetyStatusAttributeCallback)(void *,
                                                            chip::BitMask<chip::app::Clusters::WindowCovering::SafetyStatus>);
typedef void (*WindowCoveringGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*WindowCoveringAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*WindowCoveringEventListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*WindowCoveringAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*BarrierControlGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BarrierControlAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BarrierControlEventListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BarrierControlAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*PumpConfigurationAndControlPumpStatusAttributeCallback)(
    void *, chip::BitMask<chip::app::Clusters::PumpConfigurationAndControl::PumpStatusBitmap>);
typedef void (*PumpConfigurationAndControlGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PumpConfigurationAndControlAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PumpConfigurationAndControlEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*PumpConfigurationAndControlAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ThermostatGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ThermostatAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ThermostatEventListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ThermostatAttributeListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*FanControlGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FanControlAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FanControlEventListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*FanControlAttributeListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ThermostatUserInterfaceConfigurationEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ThermostatUserInterfaceConfigurationAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ColorControlGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ColorControlAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ColorControlEventListListAttributeCallback)(void * context,
                                                           const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ColorControlAttributeListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*BallastConfigurationGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BallastConfigurationAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BallastConfigurationEventListListAttributeCallback)(void * context,
                                                                   const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BallastConfigurationAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*IlluminanceMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*IlluminanceMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*IlluminanceMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*IlluminanceMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TemperatureMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TemperatureMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TemperatureMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*TemperatureMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*PressureMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PressureMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PressureMeasurementEventListListAttributeCallback)(void * context,
                                                                  const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*PressureMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*FlowMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FlowMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FlowMeasurementEventListListAttributeCallback)(void * context,
                                                              const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*FlowMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*RelativeHumidityMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*RelativeHumidityMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*RelativeHumidityMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*RelativeHumidityMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*OccupancySensingOccupancyAttributeCallback)(void *,
                                                           chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancyBitmap>);
typedef void (*OccupancySensingOccupancySensorTypeBitmapAttributeCallback)(
    void *, chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancySensorTypeBitmap>);
typedef void (*OccupancySensingGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OccupancySensingAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OccupancySensingEventListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*OccupancySensingAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*CarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*CarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*CarbonMonoxideConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*CarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*CarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*CarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*CarbonDioxideConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*CarbonDioxideConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*EthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*EthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*EthyleneConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*EthyleneConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*EthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*EthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*EthyleneOxideConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*EthyleneOxideConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*HydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*HydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*HydrogenConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*HydrogenConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*HydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*HydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*HydrogenSulfideConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*HydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*NitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*NitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*NitricOxideConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*NitricOxideConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*NitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*NitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*NitrogenDioxideConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*NitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*OxygenConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OxygenConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OxygenConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*OxygenConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*OzoneConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OzoneConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*OzoneConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*OzoneConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*SulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SulfurDioxideConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*SulfurDioxideConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*DissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*DissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*DissolvedOxygenConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*DissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*BromateConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BromateConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BromateConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BromateConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChloraminesConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ChloraminesConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChlorineConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ChlorineConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*FecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FecalColiformEColiConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*FecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*FluorideConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FluorideConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FluorideConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*FluorideConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*HaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*HaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*HaloaceticAcidsConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*HaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*TotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*TotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TurbidityConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*TurbidityConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*CopperConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*CopperConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*CopperConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*CopperConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*LeadConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*LeadConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*LeadConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*LeadConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ManganeseConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ManganeseConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*SulfateConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SulfateConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SulfateConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*SulfateConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*BromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BromodichloromethaneConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*BromoformConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BromoformConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*BromoformConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*BromoformConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChloroformConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ChloroformConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*SodiumConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SodiumConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*SodiumConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*SodiumConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*PM25ConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PM25ConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PM25ConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*PM25ConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*FormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*FormaldehydeConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*FormaldehydeConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*PM1ConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PM1ConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PM1ConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*PM1ConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*PM10ConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PM10ConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*PM10ConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*PM10ConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*TotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*RadonConcentrationMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*RadonConcentrationMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*RadonConcentrationMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*RadonConcentrationMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*WakeOnLANGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*WakeOnLANAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*WakeOnLANEventListListAttributeCallback)(void * context,
                                                        const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*WakeOnLANAttributeListListAttributeCallback)(void * context,
                                                            const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ChannelChannelListListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> & data);
typedef void (*ChannelLineupStructAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::LineupInfoStruct::DecodableType> &);
typedef void (*ChannelCurrentChannelStructAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> &);
typedef void (*ChannelGeneratedCommandListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChannelAcceptedCommandListListAttributeCallback)(void * context,
                                                                const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ChannelEventListListAttributeCallback)(void * context,
                                                      const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ChannelAttributeListListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*TargetNavigatorTargetListListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::TargetNavigator::Structs::TargetInfoStruct::DecodableType> &
        data);
typedef void (*TargetNavigatorGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TargetNavigatorAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*TargetNavigatorEventListListAttributeCallback)(void * context,
                                                              const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*TargetNavigatorAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*MediaPlaybackSampledPositionStructAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType> &);
typedef void (*MediaPlaybackGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*MediaPlaybackAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*MediaPlaybackEventListListAttributeCallback)(void * context,
                                                            const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*MediaPlaybackAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*MediaInputInputListListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType> & data);
typedef void (*MediaInputGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*MediaInputAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*MediaInputEventListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*MediaInputAttributeListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*LowPowerGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*LowPowerAcceptedCommandListListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*LowPowerEventListListAttributeCallback)(void * context,
                                                       const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*LowPowerAttributeListListAttributeCallback)(void * context,
                                                           const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*KeypadInputGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*KeypadInputAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*KeypadInputEventListListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*KeypadInputAttributeListListAttributeCallback)(void * context,
                                                              const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ContentLauncherAcceptHeaderListAttributeCallback)(void * context,
                                                                 const chip::app::DataModel::DecodableList<chip::CharSpan> & data);
typedef void (*ContentLauncherGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ContentLauncherAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ContentLauncherEventListListAttributeCallback)(void * context,
                                                              const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ContentLauncherAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*AudioOutputOutputListListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::DecodableType> & data);
typedef void (*AudioOutputGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AudioOutputAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AudioOutputEventListListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*AudioOutputAttributeListListAttributeCallback)(void * context,
                                                              const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ApplicationLauncherCatalogListListAttributeCallback)(void * context,
                                                                    const chip::app::DataModel::DecodableList<uint16_t> & data);
typedef void (*ApplicationLauncherCurrentAppStructAttributeCallback)(
    void *,
    const chip::app::DataModel::Nullable<chip::app::Clusters::ApplicationLauncher::Structs::ApplicationEPStruct::DecodableType> &);
typedef void (*ApplicationLauncherGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ApplicationLauncherAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ApplicationLauncherEventListListAttributeCallback)(void * context,
                                                                  const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ApplicationLauncherAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ApplicationBasicApplicationStructAttributeCallback)(
    void *, const chip::app::Clusters::ApplicationBasic::Structs::ApplicationStruct::DecodableType &);
typedef void (*ApplicationBasicAllowedVendorListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::VendorId> & data);
typedef void (*ApplicationBasicGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ApplicationBasicAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ApplicationBasicEventListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ApplicationBasicAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*AccountLoginGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AccountLoginAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*AccountLoginEventListListAttributeCallback)(void * context,
                                                           const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*AccountLoginAttributeListListAttributeCallback)(void * context,
                                                               const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*ElectricalMeasurementGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ElectricalMeasurementAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*ElectricalMeasurementEventListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*ElectricalMeasurementAttributeListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*UnitTestingBitmap8AttributeCallback)(void *, chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>);
typedef void (*UnitTestingBitmap16AttributeCallback)(void *, chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>);
typedef void (*UnitTestingBitmap32AttributeCallback)(void *, chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>);
typedef void (*UnitTestingBitmap64AttributeCallback)(void *, chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>);
typedef void (*UnitTestingListInt8uListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<uint8_t> & data);
typedef void (*UnitTestingListOctetStringListAttributeCallback)(void * context,
                                                                const chip::app::DataModel::DecodableList<chip::ByteSpan> & data);
typedef void (*UnitTestingListStructOctetStringListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::DecodableType> &
        data);
typedef void (*UnitTestingListNullablesAndOptionalsStructListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<
        chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::DecodableType> & data);
typedef void (*UnitTestingStructAttrStructAttributeCallback)(
    void *, const chip::app::Clusters::UnitTesting::Structs::SimpleStruct::DecodableType &);
typedef void (*UnitTestingListLongOctetStringListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::ByteSpan> & data);
typedef void (*UnitTestingListFabricScopedListAttributeCallback)(
    void * context,
    const chip::app::DataModel::DecodableList<chip::app::Clusters::UnitTesting::Structs::TestFabricScoped::DecodableType> & data);
typedef void (*UnitTestingNullableBitmap8AttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> &);
typedef void (*UnitTestingNullableBitmap16AttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> &);
typedef void (*UnitTestingNullableBitmap32AttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> &);
typedef void (*UnitTestingNullableBitmap64AttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> &);
typedef void (*UnitTestingNullableStructStructAttributeCallback)(
    void *, const chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::DecodableType> &);
typedef void (*UnitTestingGeneratedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*UnitTestingAcceptedCommandListListAttributeCallback)(
    void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
typedef void (*UnitTestingEventListListAttributeCallback)(void * context,
                                                          const chip::app::DataModel::DecodableList<chip::EventId> & data);
typedef void (*UnitTestingAttributeListListAttributeCallback)(void * context,
                                                              const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
typedef void (*FaultInjectionEventListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::EventId> & data);

class MTRDefaultSuccessCallbackBridge : public MTRCallbackBridge<DefaultSuccessCallback>
{
public:
    MTRDefaultSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DefaultSuccessCallback>(queue, handler, OnSuccessFn){};

    MTRDefaultSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DefaultSuccessCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context);
};

class MTRCommandSuccessCallbackBridge : public MTRCallbackBridge<CommandSuccessCallback>
{
public:
    MTRCommandSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CommandSuccessCallback>(queue, handler, OnSuccessFn){};

    MTRCommandSuccessCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<CommandSuccessCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::NullObjectType &);
};

class MTROctetStringAttributeCallbackBridge : public MTRCallbackBridge<OctetStringAttributeCallback>
{
public:
    MTROctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OctetStringAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<OctetStringAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::ByteSpan value);
};

class MTROctetStringAttributeCallbackSubscriptionBridge : public MTROctetStringAttributeCallbackBridge
{
public:
    MTROctetStringAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROctetStringAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROctetStringAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROctetStringAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOctetStringAttributeCallbackBridge : public MTRCallbackBridge<NullableOctetStringAttributeCallback>
{
public:
    MTRNullableOctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableOctetStringAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableOctetStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableOctetStringAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<chip::ByteSpan> & value);
};

class MTRNullableOctetStringAttributeCallbackSubscriptionBridge : public MTRNullableOctetStringAttributeCallbackBridge
{
public:
    MTRNullableOctetStringAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOctetStringAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOctetStringAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOctetStringAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCharStringAttributeCallbackBridge : public MTRCallbackBridge<CharStringAttributeCallback>
{
public:
    MTRCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CharStringAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<CharStringAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::CharSpan value);
};

class MTRCharStringAttributeCallbackSubscriptionBridge : public MTRCharStringAttributeCallbackBridge
{
public:
    MTRCharStringAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCharStringAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCharStringAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCharStringAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCharStringAttributeCallbackBridge : public MTRCallbackBridge<NullableCharStringAttributeCallback>
{
public:
    MTRNullableCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableCharStringAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableCharStringAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableCharStringAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<chip::CharSpan> & value);
};

class MTRNullableCharStringAttributeCallbackSubscriptionBridge : public MTRNullableCharStringAttributeCallbackBridge
{
public:
    MTRNullableCharStringAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCharStringAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCharStringAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCharStringAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBooleanAttributeCallbackBridge : public MTRCallbackBridge<BooleanAttributeCallback>
{
public:
    MTRBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BooleanAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<BooleanAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, bool value);
};

class MTRBooleanAttributeCallbackSubscriptionBridge : public MTRBooleanAttributeCallbackBridge
{
public:
    MTRBooleanAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBooleanAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBooleanAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBooleanAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBooleanAttributeCallbackBridge : public MTRCallbackBridge<NullableBooleanAttributeCallback>
{
public:
    MTRNullableBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableBooleanAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableBooleanAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableBooleanAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<bool> & value);
};

class MTRNullableBooleanAttributeCallbackSubscriptionBridge : public MTRNullableBooleanAttributeCallbackBridge
{
public:
    MTRNullableBooleanAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBooleanAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBooleanAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBooleanAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInt8uAttributeCallbackBridge : public MTRCallbackBridge<Int8uAttributeCallback>
{
public:
    MTRInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<Int8uAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<Int8uAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, uint8_t value);
};

class MTRInt8uAttributeCallbackSubscriptionBridge : public MTRInt8uAttributeCallbackBridge
{
public:
    MTRInt8uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInt8uAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInt8uAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInt8uAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInt8uAttributeCallbackBridge : public MTRCallbackBridge<NullableInt8uAttributeCallback>
{
public:
    MTRNullableInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableInt8uAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableInt8uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableInt8uAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<uint8_t> & value);
};

class MTRNullableInt8uAttributeCallbackSubscriptionBridge : public MTRNullableInt8uAttributeCallbackBridge
{
public:
    MTRNullableInt8uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInt8uAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInt8uAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInt8uAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInt8sAttributeCallbackBridge : public MTRCallbackBridge<Int8sAttributeCallback>
{
public:
    MTRInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<Int8sAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<Int8sAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, int8_t value);
};

class MTRInt8sAttributeCallbackSubscriptionBridge : public MTRInt8sAttributeCallbackBridge
{
public:
    MTRInt8sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInt8sAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInt8sAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInt8sAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInt8sAttributeCallbackBridge : public MTRCallbackBridge<NullableInt8sAttributeCallback>
{
public:
    MTRNullableInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableInt8sAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableInt8sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableInt8sAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<int8_t> & value);
};

class MTRNullableInt8sAttributeCallbackSubscriptionBridge : public MTRNullableInt8sAttributeCallbackBridge
{
public:
    MTRNullableInt8sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInt8sAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInt8sAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInt8sAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInt16uAttributeCallbackBridge : public MTRCallbackBridge<Int16uAttributeCallback>
{
public:
    MTRInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<Int16uAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<Int16uAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, uint16_t value);
};

class MTRInt16uAttributeCallbackSubscriptionBridge : public MTRInt16uAttributeCallbackBridge
{
public:
    MTRInt16uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInt16uAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInt16uAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInt16uAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInt16uAttributeCallbackBridge : public MTRCallbackBridge<NullableInt16uAttributeCallback>
{
public:
    MTRNullableInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableInt16uAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableInt16uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableInt16uAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<uint16_t> & value);
};

class MTRNullableInt16uAttributeCallbackSubscriptionBridge : public MTRNullableInt16uAttributeCallbackBridge
{
public:
    MTRNullableInt16uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInt16uAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInt16uAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInt16uAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInt16sAttributeCallbackBridge : public MTRCallbackBridge<Int16sAttributeCallback>
{
public:
    MTRInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<Int16sAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<Int16sAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, int16_t value);
};

class MTRInt16sAttributeCallbackSubscriptionBridge : public MTRInt16sAttributeCallbackBridge
{
public:
    MTRInt16sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInt16sAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInt16sAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInt16sAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInt16sAttributeCallbackBridge : public MTRCallbackBridge<NullableInt16sAttributeCallback>
{
public:
    MTRNullableInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableInt16sAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableInt16sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableInt16sAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<int16_t> & value);
};

class MTRNullableInt16sAttributeCallbackSubscriptionBridge : public MTRNullableInt16sAttributeCallbackBridge
{
public:
    MTRNullableInt16sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInt16sAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInt16sAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInt16sAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInt32uAttributeCallbackBridge : public MTRCallbackBridge<Int32uAttributeCallback>
{
public:
    MTRInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<Int32uAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<Int32uAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, uint32_t value);
};

class MTRInt32uAttributeCallbackSubscriptionBridge : public MTRInt32uAttributeCallbackBridge
{
public:
    MTRInt32uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInt32uAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInt32uAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInt32uAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInt32uAttributeCallbackBridge : public MTRCallbackBridge<NullableInt32uAttributeCallback>
{
public:
    MTRNullableInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableInt32uAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableInt32uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableInt32uAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<uint32_t> & value);
};

class MTRNullableInt32uAttributeCallbackSubscriptionBridge : public MTRNullableInt32uAttributeCallbackBridge
{
public:
    MTRNullableInt32uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInt32uAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInt32uAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInt32uAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInt32sAttributeCallbackBridge : public MTRCallbackBridge<Int32sAttributeCallback>
{
public:
    MTRInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<Int32sAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<Int32sAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, int32_t value);
};

class MTRInt32sAttributeCallbackSubscriptionBridge : public MTRInt32sAttributeCallbackBridge
{
public:
    MTRInt32sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInt32sAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInt32sAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInt32sAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInt32sAttributeCallbackBridge : public MTRCallbackBridge<NullableInt32sAttributeCallback>
{
public:
    MTRNullableInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableInt32sAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableInt32sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableInt32sAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<int32_t> & value);
};

class MTRNullableInt32sAttributeCallbackSubscriptionBridge : public MTRNullableInt32sAttributeCallbackBridge
{
public:
    MTRNullableInt32sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInt32sAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInt32sAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInt32sAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInt64uAttributeCallbackBridge : public MTRCallbackBridge<Int64uAttributeCallback>
{
public:
    MTRInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<Int64uAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<Int64uAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, uint64_t value);
};

class MTRInt64uAttributeCallbackSubscriptionBridge : public MTRInt64uAttributeCallbackBridge
{
public:
    MTRInt64uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInt64uAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInt64uAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInt64uAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInt64uAttributeCallbackBridge : public MTRCallbackBridge<NullableInt64uAttributeCallback>
{
public:
    MTRNullableInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableInt64uAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableInt64uAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableInt64uAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<uint64_t> & value);
};

class MTRNullableInt64uAttributeCallbackSubscriptionBridge : public MTRNullableInt64uAttributeCallbackBridge
{
public:
    MTRNullableInt64uAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInt64uAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInt64uAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInt64uAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInt64sAttributeCallbackBridge : public MTRCallbackBridge<Int64sAttributeCallback>
{
public:
    MTRInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<Int64sAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<Int64sAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, int64_t value);
};

class MTRInt64sAttributeCallbackSubscriptionBridge : public MTRInt64sAttributeCallbackBridge
{
public:
    MTRInt64sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInt64sAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInt64sAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInt64sAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInt64sAttributeCallbackBridge : public MTRCallbackBridge<NullableInt64sAttributeCallback>
{
public:
    MTRNullableInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableInt64sAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableInt64sAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableInt64sAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<int64_t> & value);
};

class MTRNullableInt64sAttributeCallbackSubscriptionBridge : public MTRNullableInt64sAttributeCallbackBridge
{
public:
    MTRNullableInt64sAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInt64sAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInt64sAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInt64sAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFloatAttributeCallbackBridge : public MTRCallbackBridge<FloatAttributeCallback>
{
public:
    MTRFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FloatAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<FloatAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, float value);
};

class MTRFloatAttributeCallbackSubscriptionBridge : public MTRFloatAttributeCallbackBridge
{
public:
    MTRFloatAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFloatAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFloatAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFloatAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFloatAttributeCallbackBridge : public MTRCallbackBridge<NullableFloatAttributeCallback>
{
public:
    MTRNullableFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableFloatAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableFloatAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableFloatAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<float> & value);
};

class MTRNullableFloatAttributeCallbackSubscriptionBridge : public MTRNullableFloatAttributeCallbackBridge
{
public:
    MTRNullableFloatAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFloatAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFloatAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFloatAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoubleAttributeCallbackBridge : public MTRCallbackBridge<DoubleAttributeCallback>
{
public:
    MTRDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoubleAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoubleAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, double value);
};

class MTRDoubleAttributeCallbackSubscriptionBridge : public MTRDoubleAttributeCallbackBridge
{
public:
    MTRDoubleAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoubleAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoubleAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoubleAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoubleAttributeCallbackBridge : public MTRCallbackBridge<NullableDoubleAttributeCallback>
{
public:
    MTRNullableDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoubleAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoubleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableDoubleAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<double> & value);
};

class MTRNullableDoubleAttributeCallbackSubscriptionBridge : public MTRNullableDoubleAttributeCallbackBridge
{
public:
    MTRNullableDoubleAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoubleAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoubleAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoubleAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRVendorIdAttributeCallbackBridge : public MTRCallbackBridge<VendorIdAttributeCallback>
{
public:
    MTRVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<VendorIdAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<VendorIdAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::VendorId value);
};

class MTRVendorIdAttributeCallbackSubscriptionBridge : public MTRVendorIdAttributeCallbackBridge
{
public:
    MTRVendorIdAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRVendorIdAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRVendorIdAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRVendorIdAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableVendorIdAttributeCallbackBridge : public MTRCallbackBridge<NullableVendorIdAttributeCallback>
{
public:
    MTRNullableVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableVendorIdAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableVendorIdAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableVendorIdAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<chip::VendorId> & value);
};

class MTRNullableVendorIdAttributeCallbackSubscriptionBridge : public MTRNullableVendorIdAttributeCallbackBridge
{
public:
    MTRNullableVendorIdAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableVendorIdAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableVendorIdAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableVendorIdAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIdentifyGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<IdentifyGeneratedCommandListListAttributeCallback>
{
public:
    MTRIdentifyGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IdentifyGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIdentifyGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<IdentifyGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRIdentifyGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRIdentifyGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRIdentifyGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIdentifyGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIdentifyGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIdentifyGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIdentifyAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<IdentifyAcceptedCommandListListAttributeCallback>
{
public:
    MTRIdentifyAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IdentifyAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIdentifyAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<IdentifyAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRIdentifyAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRIdentifyAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRIdentifyAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIdentifyAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIdentifyAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIdentifyAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIdentifyEventListListAttributeCallbackBridge : public MTRCallbackBridge<IdentifyEventListListAttributeCallback>
{
public:
    MTRIdentifyEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IdentifyEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIdentifyEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<IdentifyEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRIdentifyEventListListAttributeCallbackSubscriptionBridge : public MTRIdentifyEventListListAttributeCallbackBridge
{
public:
    MTRIdentifyEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action,
                                                                MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIdentifyEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIdentifyEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIdentifyEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIdentifyAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<IdentifyAttributeListListAttributeCallback>
{
public:
    MTRIdentifyAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IdentifyAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIdentifyAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<IdentifyAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRIdentifyAttributeListListAttributeCallbackSubscriptionBridge : public MTRIdentifyAttributeListListAttributeCallbackBridge
{
public:
    MTRIdentifyAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIdentifyAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIdentifyAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIdentifyAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupsNameSupportAttributeCallbackBridge : public MTRCallbackBridge<GroupsNameSupportAttributeCallback>
{
public:
    MTRGroupsNameSupportAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupsNameSupportAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupsNameSupportAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<GroupsNameSupportAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::Groups::NameSupportBitmap> value);
};

class MTRGroupsNameSupportAttributeCallbackSubscriptionBridge : public MTRGroupsNameSupportAttributeCallbackBridge
{
public:
    MTRGroupsNameSupportAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupsNameSupportAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupsNameSupportAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupsNameSupportAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupsGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<GroupsGeneratedCommandListListAttributeCallback>
{
public:
    MTRGroupsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<GroupsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRGroupsGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRGroupsGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRGroupsGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupsGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupsAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<GroupsAcceptedCommandListListAttributeCallback>
{
public:
    MTRGroupsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<GroupsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRGroupsAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRGroupsAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRGroupsAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupsAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupsEventListListAttributeCallbackBridge : public MTRCallbackBridge<GroupsEventListListAttributeCallback>
{
public:
    MTRGroupsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupsEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<GroupsEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRGroupsEventListListAttributeCallbackSubscriptionBridge : public MTRGroupsEventListListAttributeCallbackBridge
{
public:
    MTRGroupsEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupsEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupsEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupsEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupsAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<GroupsAttributeListListAttributeCallback>
{
public:
    MTRGroupsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<GroupsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRGroupsAttributeListListAttributeCallbackSubscriptionBridge : public MTRGroupsAttributeListListAttributeCallbackBridge
{
public:
    MTRGroupsAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupsAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupsAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRScenesGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ScenesGeneratedCommandListListAttributeCallback>
{
public:
    MTRScenesGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRScenesGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<ScenesGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRScenesGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRScenesGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRScenesGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRScenesGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRScenesGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRScenesGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRScenesAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ScenesAcceptedCommandListListAttributeCallback>
{
public:
    MTRScenesAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRScenesAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<ScenesAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRScenesAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRScenesAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRScenesAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRScenesAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRScenesAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRScenesAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRScenesEventListListAttributeCallbackBridge : public MTRCallbackBridge<ScenesEventListListAttributeCallback>
{
public:
    MTRScenesEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRScenesEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ScenesEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRScenesEventListListAttributeCallbackSubscriptionBridge : public MTRScenesEventListListAttributeCallbackBridge
{
public:
    MTRScenesEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRScenesEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRScenesEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRScenesEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRScenesAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ScenesAttributeListListAttributeCallback>
{
public:
    MTRScenesAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRScenesAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ScenesAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRScenesAttributeListListAttributeCallbackSubscriptionBridge : public MTRScenesAttributeListListAttributeCallbackBridge
{
public:
    MTRScenesAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRScenesAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRScenesAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRScenesAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffGeneratedCommandListListAttributeCallback>
{
public:
    MTROnOffGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<OnOffGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROnOffGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROnOffGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTROnOffGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffAcceptedCommandListListAttributeCallback>
{
public:
    MTROnOffAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<OnOffAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROnOffAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROnOffAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTROnOffAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffEventListListAttributeCallbackBridge : public MTRCallbackBridge<OnOffEventListListAttributeCallback>
{
public:
    MTROnOffEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<OnOffEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTROnOffEventListListAttributeCallbackSubscriptionBridge : public MTROnOffEventListListAttributeCallbackBridge
{
public:
    MTROnOffEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<OnOffAttributeListListAttributeCallback>
{
public:
    MTROnOffAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<OnOffAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTROnOffAttributeListListAttributeCallbackSubscriptionBridge : public MTROnOffAttributeListListAttributeCallbackBridge
{
public:
    MTROnOffAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action,
                                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffSwitchConfigurationGeneratedCommandListListAttributeCallback>
{
public:
    MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffSwitchConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<OnOffSwitchConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffSwitchConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffSwitchConfigurationAcceptedCommandListListAttributeCallback>
{
public:
    MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffSwitchConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<OnOffSwitchConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffSwitchConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffSwitchConfigurationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffSwitchConfigurationEventListListAttributeCallback>
{
public:
    MTROnOffSwitchConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffSwitchConfigurationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffSwitchConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<OnOffSwitchConfigurationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTROnOffSwitchConfigurationEventListListAttributeCallbackSubscriptionBridge
    : public MTROnOffSwitchConfigurationEventListListAttributeCallbackBridge
{
public:
    MTROnOffSwitchConfigurationEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffSwitchConfigurationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffSwitchConfigurationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffSwitchConfigurationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffSwitchConfigurationAttributeListListAttributeCallback>
{
public:
    MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffSwitchConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<OnOffSwitchConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTROnOffSwitchConfigurationAttributeListListAttributeCallbackSubscriptionBridge
    : public MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge
{
public:
    MTROnOffSwitchConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffSwitchConfigurationAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLevelControlOptionsAttributeCallbackBridge : public MTRCallbackBridge<LevelControlOptionsAttributeCallback>
{
public:
    MTRLevelControlOptionsAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LevelControlOptionsAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLevelControlOptionsAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<LevelControlOptionsAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value);
};

class MTRLevelControlOptionsAttributeCallbackSubscriptionBridge : public MTRLevelControlOptionsAttributeCallbackBridge
{
public:
    MTRLevelControlOptionsAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLevelControlOptionsAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLevelControlOptionsAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLevelControlOptionsAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLevelControlGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<LevelControlGeneratedCommandListListAttributeCallback>
{
public:
    MTRLevelControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LevelControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLevelControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<LevelControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRLevelControlGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRLevelControlGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRLevelControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLevelControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLevelControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLevelControlGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLevelControlAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<LevelControlAcceptedCommandListListAttributeCallback>
{
public:
    MTRLevelControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LevelControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLevelControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<LevelControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRLevelControlAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRLevelControlAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRLevelControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLevelControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLevelControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLevelControlAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLevelControlEventListListAttributeCallbackBridge : public MTRCallbackBridge<LevelControlEventListListAttributeCallback>
{
public:
    MTRLevelControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LevelControlEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLevelControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<LevelControlEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRLevelControlEventListListAttributeCallbackSubscriptionBridge : public MTRLevelControlEventListListAttributeCallbackBridge
{
public:
    MTRLevelControlEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLevelControlEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLevelControlEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLevelControlEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLevelControlAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<LevelControlAttributeListListAttributeCallback>
{
public:
    MTRLevelControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LevelControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLevelControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<LevelControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRLevelControlAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRLevelControlAttributeListListAttributeCallbackBridge
{
public:
    MTRLevelControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLevelControlAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLevelControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLevelControlAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BinaryInputBasicGeneratedCommandListListAttributeCallback>
{
public:
    MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BinaryInputBasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<BinaryInputBasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBinaryInputBasicGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BinaryInputBasicAcceptedCommandListListAttributeCallback>
{
public:
    MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BinaryInputBasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<BinaryInputBasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBinaryInputBasicAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBinaryInputBasicEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<BinaryInputBasicEventListListAttributeCallback>
{
public:
    MTRBinaryInputBasicEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BinaryInputBasicEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBinaryInputBasicEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<BinaryInputBasicEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBinaryInputBasicEventListListAttributeCallbackSubscriptionBridge
    : public MTRBinaryInputBasicEventListListAttributeCallbackBridge
{
public:
    MTRBinaryInputBasicEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBinaryInputBasicEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBinaryInputBasicEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBinaryInputBasicEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBinaryInputBasicAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<BinaryInputBasicAttributeListListAttributeCallback>
{
public:
    MTRBinaryInputBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BinaryInputBasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBinaryInputBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<BinaryInputBasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBinaryInputBasicAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRBinaryInputBasicAttributeListListAttributeCallbackBridge
{
public:
    MTRBinaryInputBasicAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBinaryInputBasicAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBinaryInputBasicAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBinaryInputBasicAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPulseWidthModulationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<PulseWidthModulationEventListListAttributeCallback>
{
public:
    MTRPulseWidthModulationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PulseWidthModulationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPulseWidthModulationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<PulseWidthModulationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRPulseWidthModulationEventListListAttributeCallbackSubscriptionBridge
    : public MTRPulseWidthModulationEventListListAttributeCallbackBridge
{
public:
    MTRPulseWidthModulationEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPulseWidthModulationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPulseWidthModulationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPulseWidthModulationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDescriptorDeviceTypeListListAttributeCallbackBridge
    : public MTRCallbackBridge<DescriptorDeviceTypeListListAttributeCallback>
{
public:
    MTRDescriptorDeviceTypeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DescriptorDeviceTypeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDescriptorDeviceTypeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DescriptorDeviceTypeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::Descriptor::Structs::DeviceTypeStruct::DecodableType> &
            value);
};

class MTRDescriptorDeviceTypeListListAttributeCallbackSubscriptionBridge
    : public MTRDescriptorDeviceTypeListListAttributeCallbackBridge
{
public:
    MTRDescriptorDeviceTypeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDescriptorDeviceTypeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDescriptorDeviceTypeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDescriptorDeviceTypeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDescriptorServerListListAttributeCallbackBridge : public MTRCallbackBridge<DescriptorServerListListAttributeCallback>
{
public:
    MTRDescriptorServerListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DescriptorServerListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDescriptorServerListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DescriptorServerListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ClusterId> & value);
};

class MTRDescriptorServerListListAttributeCallbackSubscriptionBridge : public MTRDescriptorServerListListAttributeCallbackBridge
{
public:
    MTRDescriptorServerListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDescriptorServerListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDescriptorServerListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDescriptorServerListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDescriptorClientListListAttributeCallbackBridge : public MTRCallbackBridge<DescriptorClientListListAttributeCallback>
{
public:
    MTRDescriptorClientListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DescriptorClientListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDescriptorClientListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DescriptorClientListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ClusterId> & value);
};

class MTRDescriptorClientListListAttributeCallbackSubscriptionBridge : public MTRDescriptorClientListListAttributeCallbackBridge
{
public:
    MTRDescriptorClientListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDescriptorClientListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDescriptorClientListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDescriptorClientListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDescriptorPartsListListAttributeCallbackBridge : public MTRCallbackBridge<DescriptorPartsListListAttributeCallback>
{
public:
    MTRDescriptorPartsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DescriptorPartsListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDescriptorPartsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DescriptorPartsListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EndpointId> & value);
};

class MTRDescriptorPartsListListAttributeCallbackSubscriptionBridge : public MTRDescriptorPartsListListAttributeCallbackBridge
{
public:
    MTRDescriptorPartsListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDescriptorPartsListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDescriptorPartsListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDescriptorPartsListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDescriptorGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<DescriptorGeneratedCommandListListAttributeCallback>
{
public:
    MTRDescriptorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DescriptorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDescriptorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<DescriptorGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRDescriptorGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRDescriptorGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRDescriptorGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDescriptorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDescriptorGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDescriptorGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDescriptorAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<DescriptorAcceptedCommandListListAttributeCallback>
{
public:
    MTRDescriptorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DescriptorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDescriptorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<DescriptorAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRDescriptorAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRDescriptorAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRDescriptorAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDescriptorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDescriptorAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDescriptorAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDescriptorEventListListAttributeCallbackBridge : public MTRCallbackBridge<DescriptorEventListListAttributeCallback>
{
public:
    MTRDescriptorEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DescriptorEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDescriptorEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DescriptorEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRDescriptorEventListListAttributeCallbackSubscriptionBridge : public MTRDescriptorEventListListAttributeCallbackBridge
{
public:
    MTRDescriptorEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDescriptorEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDescriptorEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDescriptorEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDescriptorAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<DescriptorAttributeListListAttributeCallback>
{
public:
    MTRDescriptorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DescriptorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDescriptorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DescriptorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRDescriptorAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRDescriptorAttributeListListAttributeCallbackBridge
{
public:
    MTRDescriptorAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDescriptorAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDescriptorAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDescriptorAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBindingBindingListAttributeCallbackBridge : public MTRCallbackBridge<BindingBindingListAttributeCallback>
{
public:
    MTRBindingBindingListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BindingBindingListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBindingBindingListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<BindingBindingListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> & value);
};

class MTRBindingBindingListAttributeCallbackSubscriptionBridge : public MTRBindingBindingListAttributeCallbackBridge
{
public:
    MTRBindingBindingListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBindingBindingListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBindingBindingListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBindingBindingListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBindingGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BindingGeneratedCommandListListAttributeCallback>
{
public:
    MTRBindingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BindingGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBindingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<BindingGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBindingGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBindingGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBindingGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBindingGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBindingGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBindingGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBindingAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BindingAcceptedCommandListListAttributeCallback>
{
public:
    MTRBindingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BindingAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBindingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<BindingAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBindingAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBindingAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBindingAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBindingAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBindingAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBindingAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBindingEventListListAttributeCallbackBridge : public MTRCallbackBridge<BindingEventListListAttributeCallback>
{
public:
    MTRBindingEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BindingEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBindingEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<BindingEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBindingEventListListAttributeCallbackSubscriptionBridge : public MTRBindingEventListListAttributeCallbackBridge
{
public:
    MTRBindingEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action,
                                                               MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBindingEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBindingEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBindingEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBindingAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<BindingAttributeListListAttributeCallback>
{
public:
    MTRBindingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BindingAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBindingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<BindingAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBindingAttributeListListAttributeCallbackSubscriptionBridge : public MTRBindingAttributeListListAttributeCallbackBridge
{
public:
    MTRBindingAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBindingAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBindingAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBindingAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccessControlACLListAttributeCallbackBridge : public MTRCallbackBridge<AccessControlACLListAttributeCallback>
{
public:
    MTRAccessControlACLListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccessControlACLListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccessControlACLListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<AccessControlACLListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType> & value);
};

class MTRAccessControlACLListAttributeCallbackSubscriptionBridge : public MTRAccessControlACLListAttributeCallbackBridge
{
public:
    MTRAccessControlACLListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action,
                                                               MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccessControlACLListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccessControlACLListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccessControlACLListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccessControlExtensionListAttributeCallbackBridge : public MTRCallbackBridge<AccessControlExtensionListAttributeCallback>
{
public:
    MTRAccessControlExtensionListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccessControlExtensionListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccessControlExtensionListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<AccessControlExtensionListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType> & value);
};

class MTRAccessControlExtensionListAttributeCallbackSubscriptionBridge : public MTRAccessControlExtensionListAttributeCallbackBridge
{
public:
    MTRAccessControlExtensionListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccessControlExtensionListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccessControlExtensionListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccessControlExtensionListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccessControlGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AccessControlGeneratedCommandListListAttributeCallback>
{
public:
    MTRAccessControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccessControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccessControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<AccessControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAccessControlGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAccessControlGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRAccessControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccessControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccessControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccessControlGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccessControlAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AccessControlAcceptedCommandListListAttributeCallback>
{
public:
    MTRAccessControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccessControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccessControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<AccessControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAccessControlAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAccessControlAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRAccessControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccessControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccessControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccessControlAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccessControlEventListListAttributeCallbackBridge : public MTRCallbackBridge<AccessControlEventListListAttributeCallback>
{
public:
    MTRAccessControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccessControlEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccessControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<AccessControlEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRAccessControlEventListListAttributeCallbackSubscriptionBridge : public MTRAccessControlEventListListAttributeCallbackBridge
{
public:
    MTRAccessControlEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccessControlEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccessControlEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccessControlEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccessControlAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<AccessControlAttributeListListAttributeCallback>
{
public:
    MTRAccessControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccessControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccessControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<AccessControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRAccessControlAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRAccessControlAttributeListListAttributeCallbackBridge
{
public:
    MTRAccessControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccessControlAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccessControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccessControlAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsActionListListAttributeCallbackBridge : public MTRCallbackBridge<ActionsActionListListAttributeCallback>
{
public:
    MTRActionsActionListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsActionListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsActionListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ActionsActionListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::Actions::Structs::ActionStruct::DecodableType> & value);
};

class MTRActionsActionListListAttributeCallbackSubscriptionBridge : public MTRActionsActionListListAttributeCallbackBridge
{
public:
    MTRActionsActionListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action,
                                                                MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsActionListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsActionListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsActionListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsEndpointListsListAttributeCallbackBridge : public MTRCallbackBridge<ActionsEndpointListsListAttributeCallback>
{
public:
    MTRActionsEndpointListsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsEndpointListsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsEndpointListsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ActionsEndpointListsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::Actions::Structs::EndpointListStruct::DecodableType> &
            value);
};

class MTRActionsEndpointListsListAttributeCallbackSubscriptionBridge : public MTRActionsEndpointListsListAttributeCallbackBridge
{
public:
    MTRActionsEndpointListsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsEndpointListsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsEndpointListsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsEndpointListsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ActionsGeneratedCommandListListAttributeCallback>
{
public:
    MTRActionsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<ActionsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRActionsGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRActionsGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRActionsGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ActionsAcceptedCommandListListAttributeCallback>
{
public:
    MTRActionsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<ActionsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRActionsAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRActionsAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRActionsAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsEventListListAttributeCallbackBridge : public MTRCallbackBridge<ActionsEventListListAttributeCallback>
{
public:
    MTRActionsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ActionsEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRActionsEventListListAttributeCallbackSubscriptionBridge : public MTRActionsEventListListAttributeCallbackBridge
{
public:
    MTRActionsEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action,
                                                               MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ActionsAttributeListListAttributeCallback>
{
public:
    MTRActionsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ActionsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRActionsAttributeListListAttributeCallbackSubscriptionBridge : public MTRActionsAttributeListListAttributeCallbackBridge
{
public:
    MTRActionsAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBasicInformationCapabilityMinimaStructAttributeCallbackBridge
    : public MTRCallbackBridge<BasicInformationCapabilityMinimaStructAttributeCallback>
{
public:
    MTRBasicInformationCapabilityMinimaStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BasicInformationCapabilityMinimaStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBasicInformationCapabilityMinimaStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<BasicInformationCapabilityMinimaStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::BasicInformation::Structs::CapabilityMinimaStruct::DecodableType & value);
};

class MTRBasicInformationCapabilityMinimaStructAttributeCallbackSubscriptionBridge
    : public MTRBasicInformationCapabilityMinimaStructAttributeCallbackBridge
{
public:
    MTRBasicInformationCapabilityMinimaStructAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBasicInformationCapabilityMinimaStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBasicInformationCapabilityMinimaStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBasicInformationCapabilityMinimaStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBasicInformationProductAppearanceStructAttributeCallbackBridge
    : public MTRCallbackBridge<BasicInformationProductAppearanceStructAttributeCallback>
{
public:
    MTRBasicInformationProductAppearanceStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BasicInformationProductAppearanceStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBasicInformationProductAppearanceStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<BasicInformationProductAppearanceStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::BasicInformation::Structs::ProductAppearanceStruct::DecodableType & value);
};

class MTRBasicInformationProductAppearanceStructAttributeCallbackSubscriptionBridge
    : public MTRBasicInformationProductAppearanceStructAttributeCallbackBridge
{
public:
    MTRBasicInformationProductAppearanceStructAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBasicInformationProductAppearanceStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBasicInformationProductAppearanceStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBasicInformationProductAppearanceStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBasicInformationGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BasicInformationGeneratedCommandListListAttributeCallback>
{
public:
    MTRBasicInformationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BasicInformationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBasicInformationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<BasicInformationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBasicInformationGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBasicInformationGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBasicInformationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBasicInformationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBasicInformationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBasicInformationGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBasicInformationAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BasicInformationAcceptedCommandListListAttributeCallback>
{
public:
    MTRBasicInformationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BasicInformationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBasicInformationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<BasicInformationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBasicInformationAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBasicInformationAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBasicInformationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBasicInformationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBasicInformationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBasicInformationAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBasicInformationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<BasicInformationEventListListAttributeCallback>
{
public:
    MTRBasicInformationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BasicInformationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBasicInformationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<BasicInformationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBasicInformationEventListListAttributeCallbackSubscriptionBridge
    : public MTRBasicInformationEventListListAttributeCallbackBridge
{
public:
    MTRBasicInformationEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBasicInformationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBasicInformationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBasicInformationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBasicInformationAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<BasicInformationAttributeListListAttributeCallback>
{
public:
    MTRBasicInformationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BasicInformationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBasicInformationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<BasicInformationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBasicInformationAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRBasicInformationAttributeListListAttributeCallbackBridge
{
public:
    MTRBasicInformationAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBasicInformationAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBasicInformationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBasicInformationAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateProviderGeneratedCommandListListAttributeCallback>
{
public:
    MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateProviderAcceptedCommandListListAttributeCallback>
{
public:
    MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateProviderEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateProviderEventListListAttributeCallback>
{
public:
    MTROTASoftwareUpdateProviderEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateProviderEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateProviderEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateProviderEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTROTASoftwareUpdateProviderEventListListAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateProviderEventListListAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateProviderEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateProviderEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateProviderEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateProviderEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateProviderAttributeListListAttributeCallback>
{
public:
    MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallback>
{
public:
    MTROTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::OtaSoftwareUpdateRequestor::Structs::ProviderLocation::DecodableType> & value);
};

class MTROTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateRequestorDefaultOTAProvidersListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>
{
public:
    MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>
{
public:
    MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateRequestorEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateRequestorEventListListAttributeCallback>
{
public:
    MTROTASoftwareUpdateRequestorEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateRequestorEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTROTASoftwareUpdateRequestorEventListListAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateRequestorEventListListAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateRequestorEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateRequestorEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateRequestorEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateRequestorEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateRequestorAttributeListListAttributeCallback>
{
public:
    MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge
    : public MTRCallbackBridge<LocalizationConfigurationSupportedLocalesListAttributeCallback>
{
public:
    MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LocalizationConfigurationSupportedLocalesListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<LocalizationConfigurationSupportedLocalesListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CharSpan> & value);
};

class MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackSubscriptionBridge
    : public MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge
{
public:
    MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLocalizationConfigurationSupportedLocalesListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<LocalizationConfigurationGeneratedCommandListListAttributeCallback>
{
public:
    MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LocalizationConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<LocalizationConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLocalizationConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<LocalizationConfigurationAcceptedCommandListListAttributeCallback>
{
public:
    MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LocalizationConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<LocalizationConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLocalizationConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLocalizationConfigurationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<LocalizationConfigurationEventListListAttributeCallback>
{
public:
    MTRLocalizationConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LocalizationConfigurationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLocalizationConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<LocalizationConfigurationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRLocalizationConfigurationEventListListAttributeCallbackSubscriptionBridge
    : public MTRLocalizationConfigurationEventListListAttributeCallbackBridge
{
public:
    MTRLocalizationConfigurationEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLocalizationConfigurationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLocalizationConfigurationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLocalizationConfigurationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<LocalizationConfigurationAttributeListListAttributeCallback>
{
public:
    MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LocalizationConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<LocalizationConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRLocalizationConfigurationAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge
{
public:
    MTRLocalizationConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLocalizationConfigurationAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge
    : public MTRCallbackBridge<TimeFormatLocalizationSupportedCalendarTypesListAttributeCallback>
{
public:
    MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeFormatLocalizationSupportedCalendarTypesListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<TimeFormatLocalizationSupportedCalendarTypesListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::DecodableList<chip::app::Clusters::TimeFormatLocalization::CalendarTypeEnum> & value);
};

class MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackSubscriptionBridge
    : public MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge
{
public:
    MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeFormatLocalizationSupportedCalendarTypesListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TimeFormatLocalizationGeneratedCommandListListAttributeCallback>
{
public:
    MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeFormatLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<TimeFormatLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeFormatLocalizationGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TimeFormatLocalizationAcceptedCommandListListAttributeCallback>
{
public:
    MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeFormatLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<TimeFormatLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeFormatLocalizationAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeFormatLocalizationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TimeFormatLocalizationEventListListAttributeCallback>
{
public:
    MTRTimeFormatLocalizationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeFormatLocalizationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeFormatLocalizationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<TimeFormatLocalizationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTimeFormatLocalizationEventListListAttributeCallbackSubscriptionBridge
    : public MTRTimeFormatLocalizationEventListListAttributeCallbackBridge
{
public:
    MTRTimeFormatLocalizationEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeFormatLocalizationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeFormatLocalizationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeFormatLocalizationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<TimeFormatLocalizationAttributeListListAttributeCallback>
{
public:
    MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeFormatLocalizationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<TimeFormatLocalizationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRTimeFormatLocalizationAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge
{
public:
    MTRTimeFormatLocalizationAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeFormatLocalizationAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitLocalizationGeneratedCommandListListAttributeCallback>
{
public:
    MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<UnitLocalizationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRUnitLocalizationGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRUnitLocalizationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitLocalizationGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitLocalizationAcceptedCommandListListAttributeCallback>
{
public:
    MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<UnitLocalizationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRUnitLocalizationAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRUnitLocalizationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitLocalizationAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitLocalizationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitLocalizationEventListListAttributeCallback>
{
public:
    MTRUnitLocalizationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitLocalizationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitLocalizationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<UnitLocalizationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRUnitLocalizationEventListListAttributeCallbackSubscriptionBridge
    : public MTRUnitLocalizationEventListListAttributeCallbackBridge
{
public:
    MTRUnitLocalizationEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitLocalizationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitLocalizationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitLocalizationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitLocalizationAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitLocalizationAttributeListListAttributeCallback>
{
public:
    MTRUnitLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitLocalizationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitLocalizationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<UnitLocalizationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRUnitLocalizationAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRUnitLocalizationAttributeListListAttributeCallbackBridge
{
public:
    MTRUnitLocalizationAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitLocalizationAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitLocalizationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitLocalizationAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceConfigurationSourcesListAttributeCallback>
{
public:
    MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceConfigurationSourcesListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceConfigurationSourcesListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<uint8_t> & value);
};

class MTRPowerSourceConfigurationSourcesListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge
{
public:
    MTRPowerSourceConfigurationSourcesListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceConfigurationSourcesListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceConfigurationGeneratedCommandListListAttributeCallback>
{
public:
    MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceConfigurationAcceptedCommandListListAttributeCallback>
{
public:
    MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceConfigurationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceConfigurationEventListListAttributeCallback>
{
public:
    MTRPowerSourceConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceConfigurationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceConfigurationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRPowerSourceConfigurationEventListListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceConfigurationEventListListAttributeCallbackBridge
{
public:
    MTRPowerSourceConfigurationEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceConfigurationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceConfigurationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceConfigurationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceConfigurationAttributeListListAttributeCallback>
{
public:
    MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRPowerSourceConfigurationAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge
{
public:
    MTRPowerSourceConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceConfigurationAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceActiveWiredFaultsListAttributeCallback>
{
public:
    MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceActiveWiredFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceActiveWiredFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::WiredFaultEnum> & value);
};

class MTRPowerSourceActiveWiredFaultsListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge
{
public:
    MTRPowerSourceActiveWiredFaultsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceActiveWiredFaultsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceActiveBatFaultsListAttributeCallback>
{
public:
    MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceActiveBatFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceActiveBatFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatFaultEnum> & value);
};

class MTRPowerSourceActiveBatFaultsListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge
{
public:
    MTRPowerSourceActiveBatFaultsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceActiveBatFaultsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceActiveBatChargeFaultsListAttributeCallback>
{
public:
    MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceActiveBatChargeFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceActiveBatChargeFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatChargeFaultEnum> & value);
};

class MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge
{
public:
    MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceActiveBatChargeFaultsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceGeneratedCommandListListAttributeCallback>
{
public:
    MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPowerSourceGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRPowerSourceGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceAcceptedCommandListListAttributeCallback>
{
public:
    MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPowerSourceAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRPowerSourceAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceEventListListAttributeCallbackBridge : public MTRCallbackBridge<PowerSourceEventListListAttributeCallback>
{
public:
    MTRPowerSourceEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRPowerSourceEventListListAttributeCallbackSubscriptionBridge : public MTRPowerSourceEventListListAttributeCallbackBridge
{
public:
    MTRPowerSourceEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceAttributeListListAttributeCallback>
{
public:
    MTRPowerSourceAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRPowerSourceAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceAttributeListListAttributeCallbackBridge
{
public:
    MTRPowerSourceAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningBasicCommissioningInfoStructAttributeCallback>
{
public:
    MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningBasicCommissioningInfoStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningBasicCommissioningInfoStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::GeneralCommissioning::Structs::BasicCommissioningInfo::DecodableType & value);
};

class MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackSubscriptionBridge
    : public MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge
{
public:
    MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralCommissioningBasicCommissioningInfoStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningGeneratedCommandListListAttributeCallback>
{
public:
    MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralCommissioningGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningAcceptedCommandListListAttributeCallback>
{
public:
    MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralCommissioningAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralCommissioningEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningEventListListAttributeCallback>
{
public:
    MTRGeneralCommissioningEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRGeneralCommissioningEventListListAttributeCallbackSubscriptionBridge
    : public MTRGeneralCommissioningEventListListAttributeCallbackBridge
{
public:
    MTRGeneralCommissioningEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralCommissioningEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralCommissioningEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralCommissioningEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralCommissioningAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningAttributeListListAttributeCallback>
{
public:
    MTRGeneralCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRGeneralCommissioningAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRGeneralCommissioningAttributeListListAttributeCallbackBridge
{
public:
    MTRGeneralCommissioningAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralCommissioningAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralCommissioningAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralCommissioningAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNetworkCommissioningNetworksListAttributeCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningNetworksListAttributeCallback>
{
public:
    MTRNetworkCommissioningNetworksListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningNetworksListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningNetworksListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningNetworksListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::NetworkCommissioning::Structs::NetworkInfo::DecodableType> &
            value);
};

class MTRNetworkCommissioningNetworksListAttributeCallbackSubscriptionBridge
    : public MTRNetworkCommissioningNetworksListAttributeCallbackBridge
{
public:
    MTRNetworkCommissioningNetworksListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNetworkCommissioningNetworksListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNetworkCommissioningNetworksListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNetworkCommissioningNetworksListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningGeneratedCommandListListAttributeCallback>
{
public:
    MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNetworkCommissioningGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningAcceptedCommandListListAttributeCallback>
{
public:
    MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNetworkCommissioningAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNetworkCommissioningEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningEventListListAttributeCallback>
{
public:
    MTRNetworkCommissioningEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRNetworkCommissioningEventListListAttributeCallbackSubscriptionBridge
    : public MTRNetworkCommissioningEventListListAttributeCallbackBridge
{
public:
    MTRNetworkCommissioningEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNetworkCommissioningEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNetworkCommissioningEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNetworkCommissioningEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNetworkCommissioningAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningAttributeListListAttributeCallback>
{
public:
    MTRNetworkCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRNetworkCommissioningAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRNetworkCommissioningAttributeListListAttributeCallbackBridge
{
public:
    MTRNetworkCommissioningAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNetworkCommissioningAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNetworkCommissioningAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNetworkCommissioningAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<DiagnosticLogsGeneratedCommandListListAttributeCallback>
{
public:
    MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DiagnosticLogsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<DiagnosticLogsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDiagnosticLogsGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<DiagnosticLogsAcceptedCommandListListAttributeCallback>
{
public:
    MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DiagnosticLogsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<DiagnosticLogsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDiagnosticLogsAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDiagnosticLogsEventListListAttributeCallbackBridge : public MTRCallbackBridge<DiagnosticLogsEventListListAttributeCallback>
{
public:
    MTRDiagnosticLogsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DiagnosticLogsEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDiagnosticLogsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DiagnosticLogsEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRDiagnosticLogsEventListListAttributeCallbackSubscriptionBridge
    : public MTRDiagnosticLogsEventListListAttributeCallbackBridge
{
public:
    MTRDiagnosticLogsEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDiagnosticLogsEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDiagnosticLogsEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDiagnosticLogsEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDiagnosticLogsAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<DiagnosticLogsAttributeListListAttributeCallback>
{
public:
    MTRDiagnosticLogsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DiagnosticLogsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDiagnosticLogsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<DiagnosticLogsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRDiagnosticLogsAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRDiagnosticLogsAttributeListListAttributeCallbackBridge
{
public:
    MTRDiagnosticLogsAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDiagnosticLogsAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDiagnosticLogsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDiagnosticLogsAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsNetworkInterfacesListAttributeCallback>
{
public:
    MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsNetworkInterfacesListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsNetworkInterfacesListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::GeneralDiagnostics::Structs::NetworkInterface::DecodableType> & value);
};

class MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsNetworkInterfacesListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsActiveHardwareFaultsListAttributeCallback>
{
public:
    MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsActiveHardwareFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsActiveHardwareFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::HardwareFaultEnum> & value);
};

class MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsActiveHardwareFaultsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsActiveRadioFaultsListAttributeCallback>
{
public:
    MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsActiveRadioFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsActiveRadioFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::RadioFaultEnum> & value);
};

class MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsActiveRadioFaultsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsActiveNetworkFaultsListAttributeCallback>
{
public:
    MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsActiveNetworkFaultsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsActiveNetworkFaultsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::NetworkFaultEnum> & value);
};

class MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsActiveNetworkFaultsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsGeneratedCommandListListAttributeCallback>
{
public:
    MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsAcceptedCommandListListAttributeCallback>
{
public:
    MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsEventListListAttributeCallback>
{
public:
    MTRGeneralDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRGeneralDiagnosticsEventListListAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsEventListListAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsAttributeListListAttributeCallback>
{
public:
    MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRGeneralDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge
    : public MTRCallbackBridge<SoftwareDiagnosticsThreadMetricsListAttributeCallback>
{
public:
    MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SoftwareDiagnosticsThreadMetricsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<SoftwareDiagnosticsThreadMetricsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::SoftwareDiagnostics::Structs::ThreadMetricsStruct::DecodableType> & value);
};

class MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackSubscriptionBridge
    : public MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge
{
public:
    MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSoftwareDiagnosticsThreadMetricsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SoftwareDiagnosticsGeneratedCommandListListAttributeCallback>
{
public:
    MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SoftwareDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<SoftwareDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSoftwareDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SoftwareDiagnosticsAcceptedCommandListListAttributeCallback>
{
public:
    MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SoftwareDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<SoftwareDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSoftwareDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSoftwareDiagnosticsEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<SoftwareDiagnosticsEventListListAttributeCallback>
{
public:
    MTRSoftwareDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SoftwareDiagnosticsEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSoftwareDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<SoftwareDiagnosticsEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRSoftwareDiagnosticsEventListListAttributeCallbackSubscriptionBridge
    : public MTRSoftwareDiagnosticsEventListListAttributeCallbackBridge
{
public:
    MTRSoftwareDiagnosticsEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSoftwareDiagnosticsEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSoftwareDiagnosticsEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSoftwareDiagnosticsEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<SoftwareDiagnosticsAttributeListListAttributeCallback>
{
public:
    MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SoftwareDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<SoftwareDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRSoftwareDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge
{
public:
    MTRSoftwareDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSoftwareDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsNeighborTableListAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsNeighborTableListAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsNeighborTableListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsNeighborTableListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsNeighborTableListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsNeighborTableListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::ThreadNetworkDiagnostics::Structs::NeighborTable::DecodableType> & value);
};

class MTRThreadNetworkDiagnosticsNeighborTableListAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsNeighborTableListAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsNeighborTableListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsNeighborTableListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsNeighborTableListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsNeighborTableListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsRouteTableListAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsRouteTableListAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsRouteTableListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsRouteTableListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsRouteTableListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsRouteTableListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::ThreadNetworkDiagnostics::Structs::RouteTable::DecodableType> & value);
};

class MTRThreadNetworkDiagnosticsRouteTableListAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsRouteTableListAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsRouteTableListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsRouteTableListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsRouteTableListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsRouteTableListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::ThreadNetworkDiagnostics::Structs::SecurityPolicy::DecodableType> & value);
};

class MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsSecurityPolicyStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<
                    chip::app::Clusters::ThreadNetworkDiagnostics::Structs::OperationalDatasetComponents::DecodableType> & value);
};

class MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsOperationalDatasetComponentsStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::DecodableList<chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFault> & value);
};

class MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsActiveNetworkFaultsListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsEventListListAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRThreadNetworkDiagnosticsEventListListAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsEventListListAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsAttributeListListAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<WiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallback>
{
public:
    MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWiFiNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<WiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallback>
{
public:
    MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWiFiNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWiFiNetworkDiagnosticsEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<WiFiNetworkDiagnosticsEventListListAttributeCallback>
{
public:
    MTRWiFiNetworkDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWiFiNetworkDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRWiFiNetworkDiagnosticsEventListListAttributeCallbackSubscriptionBridge
    : public MTRWiFiNetworkDiagnosticsEventListListAttributeCallbackBridge
{
public:
    MTRWiFiNetworkDiagnosticsEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWiFiNetworkDiagnosticsEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWiFiNetworkDiagnosticsEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWiFiNetworkDiagnosticsEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<WiFiNetworkDiagnosticsAttributeListListAttributeCallback>
{
public:
    MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge
{
public:
    MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWiFiNetworkDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallback>
{
public:
    MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthernetNetworkDiagnosticsGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallback>
{
public:
    MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthernetNetworkDiagnosticsAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthernetNetworkDiagnosticsEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthernetNetworkDiagnosticsEventListListAttributeCallback>
{
public:
    MTREthernetNetworkDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthernetNetworkDiagnosticsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTREthernetNetworkDiagnosticsEventListListAttributeCallbackSubscriptionBridge
    : public MTREthernetNetworkDiagnosticsEventListListAttributeCallbackBridge
{
public:
    MTREthernetNetworkDiagnosticsEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthernetNetworkDiagnosticsEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthernetNetworkDiagnosticsEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthernetNetworkDiagnosticsEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthernetNetworkDiagnosticsAttributeListListAttributeCallback>
{
public:
    MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge
    : public MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge
{
public:
    MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthernetNetworkDiagnosticsAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeSynchronizationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TimeSynchronizationEventListListAttributeCallback>
{
public:
    MTRTimeSynchronizationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeSynchronizationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeSynchronizationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<TimeSynchronizationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTimeSynchronizationEventListListAttributeCallbackSubscriptionBridge
    : public MTRTimeSynchronizationEventListListAttributeCallbackBridge
{
public:
    MTRTimeSynchronizationEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeSynchronizationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeSynchronizationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeSynchronizationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBridgedDeviceBasicInformationProductAppearanceStructAttributeCallbackBridge
    : public MTRCallbackBridge<BridgedDeviceBasicInformationProductAppearanceStructAttributeCallback>
{
public:
    MTRBridgedDeviceBasicInformationProductAppearanceStructAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<BridgedDeviceBasicInformationProductAppearanceStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBridgedDeviceBasicInformationProductAppearanceStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<BridgedDeviceBasicInformationProductAppearanceStructAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::BridgedDeviceBasicInformation::Structs::ProductAppearanceStruct::DecodableType & value);
};

class MTRBridgedDeviceBasicInformationProductAppearanceStructAttributeCallbackSubscriptionBridge
    : public MTRBridgedDeviceBasicInformationProductAppearanceStructAttributeCallbackBridge
{
public:
    MTRBridgedDeviceBasicInformationProductAppearanceStructAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBridgedDeviceBasicInformationProductAppearanceStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBridgedDeviceBasicInformationProductAppearanceStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBridgedDeviceBasicInformationProductAppearanceStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBridgedDeviceBasicInformationGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BridgedDeviceBasicInformationGeneratedCommandListListAttributeCallback>
{
public:
    MTRBridgedDeviceBasicInformationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<BridgedDeviceBasicInformationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBridgedDeviceBasicInformationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<BridgedDeviceBasicInformationGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBridgedDeviceBasicInformationGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBridgedDeviceBasicInformationGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBridgedDeviceBasicInformationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBridgedDeviceBasicInformationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBridgedDeviceBasicInformationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBridgedDeviceBasicInformationGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBridgedDeviceBasicInformationAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BridgedDeviceBasicInformationAcceptedCommandListListAttributeCallback>
{
public:
    MTRBridgedDeviceBasicInformationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<BridgedDeviceBasicInformationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBridgedDeviceBasicInformationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<BridgedDeviceBasicInformationAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBridgedDeviceBasicInformationAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBridgedDeviceBasicInformationAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBridgedDeviceBasicInformationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBridgedDeviceBasicInformationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBridgedDeviceBasicInformationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBridgedDeviceBasicInformationAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBridgedDeviceBasicInformationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<BridgedDeviceBasicInformationEventListListAttributeCallback>
{
public:
    MTRBridgedDeviceBasicInformationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BridgedDeviceBasicInformationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBridgedDeviceBasicInformationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<BridgedDeviceBasicInformationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBridgedDeviceBasicInformationEventListListAttributeCallbackSubscriptionBridge
    : public MTRBridgedDeviceBasicInformationEventListListAttributeCallbackBridge
{
public:
    MTRBridgedDeviceBasicInformationEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBridgedDeviceBasicInformationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBridgedDeviceBasicInformationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBridgedDeviceBasicInformationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBridgedDeviceBasicInformationAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<BridgedDeviceBasicInformationAttributeListListAttributeCallback>
{
public:
    MTRBridgedDeviceBasicInformationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BridgedDeviceBasicInformationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBridgedDeviceBasicInformationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<BridgedDeviceBasicInformationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBridgedDeviceBasicInformationAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRBridgedDeviceBasicInformationAttributeListListAttributeCallbackBridge
{
public:
    MTRBridgedDeviceBasicInformationAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBridgedDeviceBasicInformationAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBridgedDeviceBasicInformationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBridgedDeviceBasicInformationAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSwitchGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SwitchGeneratedCommandListListAttributeCallback>
{
public:
    MTRSwitchGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SwitchGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSwitchGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<SwitchGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSwitchGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSwitchGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRSwitchGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSwitchGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSwitchGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSwitchGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSwitchAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SwitchAcceptedCommandListListAttributeCallback>
{
public:
    MTRSwitchAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SwitchAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSwitchAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<SwitchAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSwitchAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSwitchAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRSwitchAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSwitchAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSwitchAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSwitchAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSwitchEventListListAttributeCallbackBridge : public MTRCallbackBridge<SwitchEventListListAttributeCallback>
{
public:
    MTRSwitchEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SwitchEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSwitchEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<SwitchEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRSwitchEventListListAttributeCallbackSubscriptionBridge : public MTRSwitchEventListListAttributeCallbackBridge
{
public:
    MTRSwitchEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSwitchEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSwitchEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSwitchEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSwitchAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<SwitchAttributeListListAttributeCallback>
{
public:
    MTRSwitchAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SwitchAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSwitchAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<SwitchAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRSwitchAttributeListListAttributeCallbackSubscriptionBridge : public MTRSwitchAttributeListListAttributeCallbackBridge
{
public:
    MTRSwitchAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSwitchAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSwitchAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSwitchAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AdministratorCommissioningGeneratedCommandListListAttributeCallback>
{
public:
    MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AdministratorCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<AdministratorCommissioningGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAdministratorCommissioningGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AdministratorCommissioningAcceptedCommandListListAttributeCallback>
{
public:
    MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AdministratorCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<AdministratorCommissioningAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAdministratorCommissioningAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAdministratorCommissioningEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<AdministratorCommissioningEventListListAttributeCallback>
{
public:
    MTRAdministratorCommissioningEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AdministratorCommissioningEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAdministratorCommissioningEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<AdministratorCommissioningEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRAdministratorCommissioningEventListListAttributeCallbackSubscriptionBridge
    : public MTRAdministratorCommissioningEventListListAttributeCallbackBridge
{
public:
    MTRAdministratorCommissioningEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAdministratorCommissioningEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAdministratorCommissioningEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAdministratorCommissioningEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<AdministratorCommissioningAttributeListListAttributeCallback>
{
public:
    MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AdministratorCommissioningAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<AdministratorCommissioningAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRAdministratorCommissioningAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge
{
public:
    MTRAdministratorCommissioningAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAdministratorCommissioningAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROperationalCredentialsNOCsListAttributeCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsNOCsListAttributeCallback>
{
public:
    MTROperationalCredentialsNOCsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsNOCsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsNOCsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsNOCsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::OperationalCredentials::Structs::NOCStruct::DecodableType> &
            value);
};

class MTROperationalCredentialsNOCsListAttributeCallbackSubscriptionBridge
    : public MTROperationalCredentialsNOCsListAttributeCallbackBridge
{
public:
    MTROperationalCredentialsNOCsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROperationalCredentialsNOCsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROperationalCredentialsNOCsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROperationalCredentialsNOCsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROperationalCredentialsFabricsListAttributeCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsFabricsListAttributeCallback>
{
public:
    MTROperationalCredentialsFabricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsFabricsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsFabricsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsFabricsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType> & value);
};

class MTROperationalCredentialsFabricsListAttributeCallbackSubscriptionBridge
    : public MTROperationalCredentialsFabricsListAttributeCallbackBridge
{
public:
    MTROperationalCredentialsFabricsListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROperationalCredentialsFabricsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROperationalCredentialsFabricsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROperationalCredentialsFabricsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsTrustedRootCertificatesListAttributeCallback>
{
public:
    MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsTrustedRootCertificatesListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsTrustedRootCertificatesListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ByteSpan> & value);
};

class MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackSubscriptionBridge
    : public MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge
{
public:
    MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROperationalCredentialsTrustedRootCertificatesListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsGeneratedCommandListListAttributeCallback>
{
public:
    MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROperationalCredentialsGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTROperationalCredentialsGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROperationalCredentialsGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsAcceptedCommandListListAttributeCallback>
{
public:
    MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROperationalCredentialsAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTROperationalCredentialsAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROperationalCredentialsAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROperationalCredentialsEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsEventListListAttributeCallback>
{
public:
    MTROperationalCredentialsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTROperationalCredentialsEventListListAttributeCallbackSubscriptionBridge
    : public MTROperationalCredentialsEventListListAttributeCallbackBridge
{
public:
    MTROperationalCredentialsEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROperationalCredentialsEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROperationalCredentialsEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROperationalCredentialsEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROperationalCredentialsAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsAttributeListListAttributeCallback>
{
public:
    MTROperationalCredentialsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTROperationalCredentialsAttributeListListAttributeCallbackSubscriptionBridge
    : public MTROperationalCredentialsAttributeListListAttributeCallbackBridge
{
public:
    MTROperationalCredentialsAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROperationalCredentialsAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROperationalCredentialsAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROperationalCredentialsAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge
    : public MTRCallbackBridge<GroupKeyManagementGroupKeyMapListAttributeCallback>
{
public:
    MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupKeyManagementGroupKeyMapListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<GroupKeyManagementGroupKeyMapListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType> & value);
};

class MTRGroupKeyManagementGroupKeyMapListAttributeCallbackSubscriptionBridge
    : public MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge
{
public:
    MTRGroupKeyManagementGroupKeyMapListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupKeyManagementGroupKeyMapListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupKeyManagementGroupTableListAttributeCallbackBridge
    : public MTRCallbackBridge<GroupKeyManagementGroupTableListAttributeCallback>
{
public:
    MTRGroupKeyManagementGroupTableListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupKeyManagementGroupTableListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupKeyManagementGroupTableListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<GroupKeyManagementGroupTableListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType> & value);
};

class MTRGroupKeyManagementGroupTableListAttributeCallbackSubscriptionBridge
    : public MTRGroupKeyManagementGroupTableListAttributeCallbackBridge
{
public:
    MTRGroupKeyManagementGroupTableListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupKeyManagementGroupTableListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupKeyManagementGroupTableListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupKeyManagementGroupTableListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<GroupKeyManagementGeneratedCommandListListAttributeCallback>
{
public:
    MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupKeyManagementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<GroupKeyManagementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupKeyManagementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<GroupKeyManagementAcceptedCommandListListAttributeCallback>
{
public:
    MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupKeyManagementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<GroupKeyManagementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupKeyManagementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupKeyManagementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<GroupKeyManagementEventListListAttributeCallback>
{
public:
    MTRGroupKeyManagementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupKeyManagementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupKeyManagementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<GroupKeyManagementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRGroupKeyManagementEventListListAttributeCallbackSubscriptionBridge
    : public MTRGroupKeyManagementEventListListAttributeCallbackBridge
{
public:
    MTRGroupKeyManagementEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupKeyManagementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupKeyManagementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupKeyManagementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupKeyManagementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<GroupKeyManagementAttributeListListAttributeCallback>
{
public:
    MTRGroupKeyManagementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupKeyManagementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupKeyManagementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<GroupKeyManagementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRGroupKeyManagementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRGroupKeyManagementAttributeListListAttributeCallbackBridge
{
public:
    MTRGroupKeyManagementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupKeyManagementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupKeyManagementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupKeyManagementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFixedLabelLabelListListAttributeCallbackBridge : public MTRCallbackBridge<FixedLabelLabelListListAttributeCallback>
{
public:
    MTRFixedLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FixedLabelLabelListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFixedLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<FixedLabelLabelListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::FixedLabel::Structs::LabelStruct::DecodableType> & value);
};

class MTRFixedLabelLabelListListAttributeCallbackSubscriptionBridge : public MTRFixedLabelLabelListListAttributeCallbackBridge
{
public:
    MTRFixedLabelLabelListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFixedLabelLabelListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFixedLabelLabelListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFixedLabelLabelListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FixedLabelGeneratedCommandListListAttributeCallback>
{
public:
    MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FixedLabelGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<FixedLabelGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFixedLabelGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRFixedLabelGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFixedLabelGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FixedLabelAcceptedCommandListListAttributeCallback>
{
public:
    MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FixedLabelAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<FixedLabelAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFixedLabelAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRFixedLabelAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFixedLabelAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFixedLabelEventListListAttributeCallbackBridge : public MTRCallbackBridge<FixedLabelEventListListAttributeCallback>
{
public:
    MTRFixedLabelEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FixedLabelEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFixedLabelEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<FixedLabelEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRFixedLabelEventListListAttributeCallbackSubscriptionBridge : public MTRFixedLabelEventListListAttributeCallbackBridge
{
public:
    MTRFixedLabelEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFixedLabelEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFixedLabelEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFixedLabelEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFixedLabelAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<FixedLabelAttributeListListAttributeCallback>
{
public:
    MTRFixedLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FixedLabelAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFixedLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<FixedLabelAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRFixedLabelAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRFixedLabelAttributeListListAttributeCallbackBridge
{
public:
    MTRFixedLabelAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFixedLabelAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFixedLabelAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFixedLabelAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUserLabelLabelListListAttributeCallbackBridge : public MTRCallbackBridge<UserLabelLabelListListAttributeCallback>
{
public:
    MTRUserLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UserLabelLabelListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUserLabelLabelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UserLabelLabelListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> & value);
};

class MTRUserLabelLabelListListAttributeCallbackSubscriptionBridge : public MTRUserLabelLabelListListAttributeCallbackBridge
{
public:
    MTRUserLabelLabelListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action,
                                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUserLabelLabelListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUserLabelLabelListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUserLabelLabelListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUserLabelGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<UserLabelGeneratedCommandListListAttributeCallback>
{
public:
    MTRUserLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UserLabelGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUserLabelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<UserLabelGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRUserLabelGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRUserLabelGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRUserLabelGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUserLabelGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUserLabelGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUserLabelGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUserLabelAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<UserLabelAcceptedCommandListListAttributeCallback>
{
public:
    MTRUserLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UserLabelAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUserLabelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<UserLabelAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRUserLabelAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRUserLabelAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRUserLabelAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUserLabelAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUserLabelAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUserLabelAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUserLabelEventListListAttributeCallbackBridge : public MTRCallbackBridge<UserLabelEventListListAttributeCallback>
{
public:
    MTRUserLabelEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UserLabelEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUserLabelEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UserLabelEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRUserLabelEventListListAttributeCallbackSubscriptionBridge : public MTRUserLabelEventListListAttributeCallbackBridge
{
public:
    MTRUserLabelEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action,
                                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUserLabelEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUserLabelEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUserLabelEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUserLabelAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<UserLabelAttributeListListAttributeCallback>
{
public:
    MTRUserLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UserLabelAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUserLabelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UserLabelAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRUserLabelAttributeListListAttributeCallbackSubscriptionBridge : public MTRUserLabelAttributeListListAttributeCallbackBridge
{
public:
    MTRUserLabelAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUserLabelAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUserLabelAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUserLabelAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRProxyConfigurationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ProxyConfigurationEventListListAttributeCallback>
{
public:
    MTRProxyConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ProxyConfigurationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRProxyConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<ProxyConfigurationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRProxyConfigurationEventListListAttributeCallbackSubscriptionBridge
    : public MTRProxyConfigurationEventListListAttributeCallbackBridge
{
public:
    MTRProxyConfigurationEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRProxyConfigurationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRProxyConfigurationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRProxyConfigurationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRProxyDiscoveryEventListListAttributeCallbackBridge : public MTRCallbackBridge<ProxyDiscoveryEventListListAttributeCallback>
{
public:
    MTRProxyDiscoveryEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ProxyDiscoveryEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRProxyDiscoveryEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ProxyDiscoveryEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRProxyDiscoveryEventListListAttributeCallbackSubscriptionBridge
    : public MTRProxyDiscoveryEventListListAttributeCallbackBridge
{
public:
    MTRProxyDiscoveryEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRProxyDiscoveryEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRProxyDiscoveryEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRProxyDiscoveryEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRProxyValidEventListListAttributeCallbackBridge : public MTRCallbackBridge<ProxyValidEventListListAttributeCallback>
{
public:
    MTRProxyValidEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ProxyValidEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRProxyValidEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ProxyValidEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRProxyValidEventListListAttributeCallbackSubscriptionBridge : public MTRProxyValidEventListListAttributeCallbackBridge
{
public:
    MTRProxyValidEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRProxyValidEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRProxyValidEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRProxyValidEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BooleanStateGeneratedCommandListListAttributeCallback>
{
public:
    MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BooleanStateGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<BooleanStateGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBooleanStateGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBooleanStateGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBooleanStateGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BooleanStateAcceptedCommandListListAttributeCallback>
{
public:
    MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BooleanStateAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<BooleanStateAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBooleanStateAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBooleanStateAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBooleanStateAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBooleanStateEventListListAttributeCallbackBridge : public MTRCallbackBridge<BooleanStateEventListListAttributeCallback>
{
public:
    MTRBooleanStateEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BooleanStateEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBooleanStateEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<BooleanStateEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBooleanStateEventListListAttributeCallbackSubscriptionBridge : public MTRBooleanStateEventListListAttributeCallbackBridge
{
public:
    MTRBooleanStateEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBooleanStateEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBooleanStateEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBooleanStateEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBooleanStateAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<BooleanStateAttributeListListAttributeCallback>
{
public:
    MTRBooleanStateAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BooleanStateAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBooleanStateAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<BooleanStateAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBooleanStateAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRBooleanStateAttributeListListAttributeCallbackBridge
{
public:
    MTRBooleanStateAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBooleanStateAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBooleanStateAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBooleanStateAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRModeSelectSupportedModesListAttributeCallbackBridge
    : public MTRCallbackBridge<ModeSelectSupportedModesListAttributeCallback>
{
public:
    MTRModeSelectSupportedModesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ModeSelectSupportedModesListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRModeSelectSupportedModesListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ModeSelectSupportedModesListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::ModeSelect::Structs::ModeOptionStruct::DecodableType> &
            value);
};

class MTRModeSelectSupportedModesListAttributeCallbackSubscriptionBridge
    : public MTRModeSelectSupportedModesListAttributeCallbackBridge
{
public:
    MTRModeSelectSupportedModesListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRModeSelectSupportedModesListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRModeSelectSupportedModesListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRModeSelectSupportedModesListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRModeSelectGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ModeSelectGeneratedCommandListListAttributeCallback>
{
public:
    MTRModeSelectGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ModeSelectGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRModeSelectGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<ModeSelectGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRModeSelectGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRModeSelectGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRModeSelectGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRModeSelectGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRModeSelectGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRModeSelectGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRModeSelectAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ModeSelectAcceptedCommandListListAttributeCallback>
{
public:
    MTRModeSelectAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ModeSelectAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRModeSelectAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<ModeSelectAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRModeSelectAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRModeSelectAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRModeSelectAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRModeSelectAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRModeSelectAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRModeSelectAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRModeSelectEventListListAttributeCallbackBridge : public MTRCallbackBridge<ModeSelectEventListListAttributeCallback>
{
public:
    MTRModeSelectEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ModeSelectEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRModeSelectEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ModeSelectEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRModeSelectEventListListAttributeCallbackSubscriptionBridge : public MTRModeSelectEventListListAttributeCallbackBridge
{
public:
    MTRModeSelectEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRModeSelectEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRModeSelectEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRModeSelectEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRModeSelectAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ModeSelectAttributeListListAttributeCallback>
{
public:
    MTRModeSelectAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ModeSelectAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRModeSelectAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ModeSelectAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRModeSelectAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRModeSelectAttributeListListAttributeCallbackBridge
{
public:
    MTRModeSelectAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRModeSelectAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRModeSelectAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRModeSelectAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTemperatureControlSupportedTemperatureLevelsListAttributeCallbackBridge
    : public MTRCallbackBridge<TemperatureControlSupportedTemperatureLevelsListAttributeCallback>
{
public:
    MTRTemperatureControlSupportedTemperatureLevelsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TemperatureControlSupportedTemperatureLevelsListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTemperatureControlSupportedTemperatureLevelsListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<TemperatureControlSupportedTemperatureLevelsListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::TemperatureControl::Structs::TemperatureLevelStruct::DecodableType> & value);
};

class MTRTemperatureControlSupportedTemperatureLevelsListAttributeCallbackSubscriptionBridge
    : public MTRTemperatureControlSupportedTemperatureLevelsListAttributeCallbackBridge
{
public:
    MTRTemperatureControlSupportedTemperatureLevelsListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTemperatureControlSupportedTemperatureLevelsListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTemperatureControlSupportedTemperatureLevelsListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTemperatureControlSupportedTemperatureLevelsListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTemperatureControlGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TemperatureControlGeneratedCommandListListAttributeCallback>
{
public:
    MTRTemperatureControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TemperatureControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTemperatureControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<TemperatureControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTemperatureControlGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTemperatureControlGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRTemperatureControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTemperatureControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTemperatureControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTemperatureControlGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTemperatureControlAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TemperatureControlAcceptedCommandListListAttributeCallback>
{
public:
    MTRTemperatureControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TemperatureControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTemperatureControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<TemperatureControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTemperatureControlAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTemperatureControlAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRTemperatureControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTemperatureControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTemperatureControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTemperatureControlAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTemperatureControlEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TemperatureControlEventListListAttributeCallback>
{
public:
    MTRTemperatureControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TemperatureControlEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTemperatureControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<TemperatureControlEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTemperatureControlEventListListAttributeCallbackSubscriptionBridge
    : public MTRTemperatureControlEventListListAttributeCallbackBridge
{
public:
    MTRTemperatureControlEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTemperatureControlEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTemperatureControlEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTemperatureControlEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTemperatureControlAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<TemperatureControlAttributeListListAttributeCallback>
{
public:
    MTRTemperatureControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TemperatureControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTemperatureControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<TemperatureControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRTemperatureControlAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRTemperatureControlAttributeListListAttributeCallbackBridge
{
public:
    MTRTemperatureControlAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTemperatureControlAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTemperatureControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTemperatureControlAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRefrigeratorAlarmMaskAttributeCallbackBridge : public MTRCallbackBridge<RefrigeratorAlarmMaskAttributeCallback>
{
public:
    MTRRefrigeratorAlarmMaskAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RefrigeratorAlarmMaskAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRefrigeratorAlarmMaskAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<RefrigeratorAlarmMaskAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::RefrigeratorAlarm::AlarmMap> value);
};

class MTRRefrigeratorAlarmMaskAttributeCallbackSubscriptionBridge : public MTRRefrigeratorAlarmMaskAttributeCallbackBridge
{
public:
    MTRRefrigeratorAlarmMaskAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action,
                                                                MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRefrigeratorAlarmMaskAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRefrigeratorAlarmMaskAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRefrigeratorAlarmMaskAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRefrigeratorAlarmLatchAttributeCallbackBridge : public MTRCallbackBridge<RefrigeratorAlarmLatchAttributeCallback>
{
public:
    MTRRefrigeratorAlarmLatchAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RefrigeratorAlarmLatchAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRefrigeratorAlarmLatchAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<RefrigeratorAlarmLatchAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::RefrigeratorAlarm::AlarmMap> value);
};

class MTRRefrigeratorAlarmLatchAttributeCallbackSubscriptionBridge : public MTRRefrigeratorAlarmLatchAttributeCallbackBridge
{
public:
    MTRRefrigeratorAlarmLatchAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action,
                                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRefrigeratorAlarmLatchAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRefrigeratorAlarmLatchAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRefrigeratorAlarmLatchAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRefrigeratorAlarmStateAttributeCallbackBridge : public MTRCallbackBridge<RefrigeratorAlarmStateAttributeCallback>
{
public:
    MTRRefrigeratorAlarmStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RefrigeratorAlarmStateAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRefrigeratorAlarmStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<RefrigeratorAlarmStateAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::RefrigeratorAlarm::AlarmMap> value);
};

class MTRRefrigeratorAlarmStateAttributeCallbackSubscriptionBridge : public MTRRefrigeratorAlarmStateAttributeCallbackBridge
{
public:
    MTRRefrigeratorAlarmStateAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action,
                                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRefrigeratorAlarmStateAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRefrigeratorAlarmStateAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRefrigeratorAlarmStateAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRefrigeratorAlarmGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<RefrigeratorAlarmGeneratedCommandListListAttributeCallback>
{
public:
    MTRRefrigeratorAlarmGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RefrigeratorAlarmGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRefrigeratorAlarmGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<RefrigeratorAlarmGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRRefrigeratorAlarmGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRRefrigeratorAlarmGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRRefrigeratorAlarmGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRefrigeratorAlarmGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRefrigeratorAlarmGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRefrigeratorAlarmGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRefrigeratorAlarmAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<RefrigeratorAlarmAcceptedCommandListListAttributeCallback>
{
public:
    MTRRefrigeratorAlarmAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RefrigeratorAlarmAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRefrigeratorAlarmAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<RefrigeratorAlarmAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRRefrigeratorAlarmAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRRefrigeratorAlarmAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRRefrigeratorAlarmAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRefrigeratorAlarmAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRefrigeratorAlarmAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRefrigeratorAlarmAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRefrigeratorAlarmEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<RefrigeratorAlarmEventListListAttributeCallback>
{
public:
    MTRRefrigeratorAlarmEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RefrigeratorAlarmEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRefrigeratorAlarmEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<RefrigeratorAlarmEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRRefrigeratorAlarmEventListListAttributeCallbackSubscriptionBridge
    : public MTRRefrigeratorAlarmEventListListAttributeCallbackBridge
{
public:
    MTRRefrigeratorAlarmEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRefrigeratorAlarmEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRefrigeratorAlarmEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRefrigeratorAlarmEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRefrigeratorAlarmAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<RefrigeratorAlarmAttributeListListAttributeCallback>
{
public:
    MTRRefrigeratorAlarmAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RefrigeratorAlarmAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRefrigeratorAlarmAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<RefrigeratorAlarmAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRRefrigeratorAlarmAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRRefrigeratorAlarmAttributeListListAttributeCallbackBridge
{
public:
    MTRRefrigeratorAlarmAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRefrigeratorAlarmAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRefrigeratorAlarmAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRefrigeratorAlarmAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAirQualityGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AirQualityGeneratedCommandListListAttributeCallback>
{
public:
    MTRAirQualityGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AirQualityGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAirQualityGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<AirQualityGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAirQualityGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAirQualityGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRAirQualityGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAirQualityGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAirQualityGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAirQualityGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAirQualityAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AirQualityAcceptedCommandListListAttributeCallback>
{
public:
    MTRAirQualityAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AirQualityAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAirQualityAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<AirQualityAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAirQualityAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAirQualityAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRAirQualityAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAirQualityAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAirQualityAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAirQualityAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAirQualityEventListListAttributeCallbackBridge : public MTRCallbackBridge<AirQualityEventListListAttributeCallback>
{
public:
    MTRAirQualityEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AirQualityEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAirQualityEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<AirQualityEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRAirQualityEventListListAttributeCallbackSubscriptionBridge : public MTRAirQualityEventListListAttributeCallbackBridge
{
public:
    MTRAirQualityEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAirQualityEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAirQualityEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAirQualityEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAirQualityAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<AirQualityAttributeListListAttributeCallback>
{
public:
    MTRAirQualityAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AirQualityAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAirQualityAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<AirQualityAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRAirQualityAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRAirQualityAttributeListListAttributeCallbackBridge
{
public:
    MTRAirQualityAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAirQualityAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAirQualityAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAirQualityAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SmokeCOAlarmGeneratedCommandListListAttributeCallback>
{
public:
    MTRSmokeCOAlarmGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSmokeCOAlarmGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSmokeCOAlarmGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SmokeCOAlarmAcceptedCommandListListAttributeCallback>
{
public:
    MTRSmokeCOAlarmAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSmokeCOAlarmAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSmokeCOAlarmAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmEventListListAttributeCallbackBridge : public MTRCallbackBridge<SmokeCOAlarmEventListListAttributeCallback>
{
public:
    MTRSmokeCOAlarmEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRSmokeCOAlarmEventListListAttributeCallbackSubscriptionBridge : public MTRSmokeCOAlarmEventListListAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<SmokeCOAlarmAttributeListListAttributeCallback>
{
public:
    MTRSmokeCOAlarmAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRSmokeCOAlarmAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRSmokeCOAlarmAttributeListListAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHEPAFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<HEPAFilterMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRHEPAFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<HEPAFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHEPAFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<HEPAFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRHEPAFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRHEPAFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRHEPAFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHEPAFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHEPAFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHEPAFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHEPAFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<HEPAFilterMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRHEPAFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<HEPAFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHEPAFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<HEPAFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRHEPAFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRHEPAFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRHEPAFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHEPAFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHEPAFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHEPAFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHEPAFilterMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<HEPAFilterMonitoringEventListListAttributeCallback>
{
public:
    MTRHEPAFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<HEPAFilterMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHEPAFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<HEPAFilterMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRHEPAFilterMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRHEPAFilterMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRHEPAFilterMonitoringEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHEPAFilterMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHEPAFilterMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHEPAFilterMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHEPAFilterMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<HEPAFilterMonitoringAttributeListListAttributeCallback>
{
public:
    MTRHEPAFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<HEPAFilterMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHEPAFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<HEPAFilterMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRHEPAFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRHEPAFilterMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRHEPAFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHEPAFilterMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHEPAFilterMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHEPAFilterMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActivatedCarbonFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActivatedCarbonFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActivatedCarbonFilterMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ActivatedCarbonFilterMonitoringEventListListAttributeCallback>
{
public:
    MTRActivatedCarbonFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActivatedCarbonFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRActivatedCarbonFilterMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRActivatedCarbonFilterMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRActivatedCarbonFilterMonitoringEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActivatedCarbonFilterMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActivatedCarbonFilterMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActivatedCarbonFilterMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActivatedCarbonFilterMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ActivatedCarbonFilterMonitoringAttributeListListAttributeCallback>
{
public:
    MTRActivatedCarbonFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActivatedCarbonFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRActivatedCarbonFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRActivatedCarbonFilterMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRActivatedCarbonFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActivatedCarbonFilterMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActivatedCarbonFilterMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActivatedCarbonFilterMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCeramicFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<CeramicFilterMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRCeramicFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CeramicFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCeramicFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<CeramicFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRCeramicFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRCeramicFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRCeramicFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCeramicFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCeramicFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCeramicFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCeramicFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<CeramicFilterMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRCeramicFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CeramicFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCeramicFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<CeramicFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRCeramicFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRCeramicFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRCeramicFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCeramicFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCeramicFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCeramicFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCeramicFilterMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<CeramicFilterMonitoringEventListListAttributeCallback>
{
public:
    MTRCeramicFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CeramicFilterMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCeramicFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<CeramicFilterMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRCeramicFilterMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRCeramicFilterMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRCeramicFilterMonitoringEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCeramicFilterMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCeramicFilterMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCeramicFilterMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCeramicFilterMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<CeramicFilterMonitoringAttributeListListAttributeCallback>
{
public:
    MTRCeramicFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CeramicFilterMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCeramicFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<CeramicFilterMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRCeramicFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRCeramicFilterMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRCeramicFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCeramicFilterMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCeramicFilterMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCeramicFilterMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectrostaticFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectrostaticFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectrostaticFilterMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ElectrostaticFilterMonitoringEventListListAttributeCallback>
{
public:
    MTRElectrostaticFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRElectrostaticFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRElectrostaticFilterMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRElectrostaticFilterMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRElectrostaticFilterMonitoringEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectrostaticFilterMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectrostaticFilterMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectrostaticFilterMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectrostaticFilterMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ElectrostaticFilterMonitoringAttributeListListAttributeCallback>
{
public:
    MTRElectrostaticFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRElectrostaticFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRElectrostaticFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRElectrostaticFilterMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRElectrostaticFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectrostaticFilterMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectrostaticFilterMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectrostaticFilterMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUVFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<UVFilterMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRUVFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UVFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUVFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<UVFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRUVFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRUVFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRUVFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUVFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUVFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUVFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUVFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<UVFilterMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRUVFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UVFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUVFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<UVFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRUVFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRUVFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRUVFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUVFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUVFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUVFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUVFilterMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<UVFilterMonitoringEventListListAttributeCallback>
{
public:
    MTRUVFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UVFilterMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUVFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<UVFilterMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRUVFilterMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRUVFilterMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRUVFilterMonitoringEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUVFilterMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUVFilterMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUVFilterMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUVFilterMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<UVFilterMonitoringAttributeListListAttributeCallback>
{
public:
    MTRUVFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UVFilterMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUVFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<UVFilterMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRUVFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRUVFilterMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRUVFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUVFilterMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUVFilterMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUVFilterMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIonizingFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<IonizingFilterMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRIonizingFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IonizingFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIonizingFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<IonizingFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRIonizingFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRIonizingFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRIonizingFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIonizingFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIonizingFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIonizingFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIonizingFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<IonizingFilterMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRIonizingFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IonizingFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIonizingFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<IonizingFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRIonizingFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRIonizingFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRIonizingFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIonizingFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIonizingFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIonizingFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIonizingFilterMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<IonizingFilterMonitoringEventListListAttributeCallback>
{
public:
    MTRIonizingFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IonizingFilterMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIonizingFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<IonizingFilterMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRIonizingFilterMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRIonizingFilterMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRIonizingFilterMonitoringEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIonizingFilterMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIonizingFilterMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIonizingFilterMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIonizingFilterMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<IonizingFilterMonitoringAttributeListListAttributeCallback>
{
public:
    MTRIonizingFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IonizingFilterMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIonizingFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<IonizingFilterMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRIonizingFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRIonizingFilterMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRIonizingFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIonizingFilterMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIonizingFilterMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIonizingFilterMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRZeoliteFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ZeoliteFilterMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRZeoliteFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ZeoliteFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRZeoliteFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<ZeoliteFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRZeoliteFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRZeoliteFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRZeoliteFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRZeoliteFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRZeoliteFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRZeoliteFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRZeoliteFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ZeoliteFilterMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRZeoliteFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ZeoliteFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRZeoliteFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<ZeoliteFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRZeoliteFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRZeoliteFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRZeoliteFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRZeoliteFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRZeoliteFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRZeoliteFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRZeoliteFilterMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ZeoliteFilterMonitoringEventListListAttributeCallback>
{
public:
    MTRZeoliteFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ZeoliteFilterMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRZeoliteFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<ZeoliteFilterMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRZeoliteFilterMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRZeoliteFilterMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRZeoliteFilterMonitoringEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRZeoliteFilterMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRZeoliteFilterMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRZeoliteFilterMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRZeoliteFilterMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ZeoliteFilterMonitoringAttributeListListAttributeCallback>
{
public:
    MTRZeoliteFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ZeoliteFilterMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRZeoliteFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<ZeoliteFilterMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRZeoliteFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRZeoliteFilterMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRZeoliteFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRZeoliteFilterMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRZeoliteFilterMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRZeoliteFilterMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneFilterMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTROzoneFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OzoneFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<OzoneFilterMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROzoneFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROzoneFilterMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTROzoneFilterMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneFilterMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneFilterMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneFilterMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTROzoneFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OzoneFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<OzoneFilterMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROzoneFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROzoneFilterMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTROzoneFilterMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneFilterMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneFilterMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneFilterMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneFilterMonitoringEventListListAttributeCallback>
{
public:
    MTROzoneFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OzoneFilterMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneFilterMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<OzoneFilterMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTROzoneFilterMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTROzoneFilterMonitoringEventListListAttributeCallbackBridge
{
public:
    MTROzoneFilterMonitoringEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneFilterMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneFilterMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneFilterMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneFilterMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneFilterMonitoringAttributeListListAttributeCallback>
{
public:
    MTROzoneFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OzoneFilterMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneFilterMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<OzoneFilterMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTROzoneFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTROzoneFilterMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTROzoneFilterMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneFilterMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneFilterMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneFilterMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWaterTankMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<WaterTankMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRWaterTankMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WaterTankMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWaterTankMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<WaterTankMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRWaterTankMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRWaterTankMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRWaterTankMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWaterTankMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWaterTankMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWaterTankMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWaterTankMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<WaterTankMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRWaterTankMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WaterTankMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWaterTankMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<WaterTankMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRWaterTankMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRWaterTankMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRWaterTankMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWaterTankMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWaterTankMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWaterTankMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWaterTankMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<WaterTankMonitoringEventListListAttributeCallback>
{
public:
    MTRWaterTankMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WaterTankMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWaterTankMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<WaterTankMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRWaterTankMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRWaterTankMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRWaterTankMonitoringEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWaterTankMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWaterTankMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWaterTankMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWaterTankMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<WaterTankMonitoringAttributeListListAttributeCallback>
{
public:
    MTRWaterTankMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WaterTankMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWaterTankMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<WaterTankMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRWaterTankMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRWaterTankMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRWaterTankMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWaterTankMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWaterTankMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWaterTankMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFuelTankMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FuelTankMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRFuelTankMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FuelTankMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFuelTankMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<FuelTankMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFuelTankMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFuelTankMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRFuelTankMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFuelTankMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFuelTankMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFuelTankMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFuelTankMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FuelTankMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRFuelTankMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FuelTankMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFuelTankMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<FuelTankMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFuelTankMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFuelTankMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRFuelTankMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFuelTankMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFuelTankMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFuelTankMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFuelTankMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<FuelTankMonitoringEventListListAttributeCallback>
{
public:
    MTRFuelTankMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FuelTankMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFuelTankMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<FuelTankMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRFuelTankMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRFuelTankMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRFuelTankMonitoringEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFuelTankMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFuelTankMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFuelTankMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFuelTankMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<FuelTankMonitoringAttributeListListAttributeCallback>
{
public:
    MTRFuelTankMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FuelTankMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFuelTankMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<FuelTankMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRFuelTankMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRFuelTankMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRFuelTankMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFuelTankMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFuelTankMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFuelTankMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInkCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<InkCartridgeMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRInkCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<InkCartridgeMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInkCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<InkCartridgeMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRInkCartridgeMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRInkCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRInkCartridgeMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInkCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInkCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInkCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInkCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<InkCartridgeMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRInkCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<InkCartridgeMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInkCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<InkCartridgeMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRInkCartridgeMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRInkCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRInkCartridgeMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInkCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInkCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInkCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInkCartridgeMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<InkCartridgeMonitoringEventListListAttributeCallback>
{
public:
    MTRInkCartridgeMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<InkCartridgeMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInkCartridgeMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<InkCartridgeMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRInkCartridgeMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRInkCartridgeMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRInkCartridgeMonitoringEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInkCartridgeMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInkCartridgeMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInkCartridgeMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInkCartridgeMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<InkCartridgeMonitoringAttributeListListAttributeCallback>
{
public:
    MTRInkCartridgeMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<InkCartridgeMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInkCartridgeMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<InkCartridgeMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRInkCartridgeMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRInkCartridgeMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRInkCartridgeMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInkCartridgeMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInkCartridgeMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInkCartridgeMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTonerCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TonerCartridgeMonitoringGeneratedCommandListListAttributeCallback>
{
public:
    MTRTonerCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TonerCartridgeMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTonerCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<TonerCartridgeMonitoringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTonerCartridgeMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTonerCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRTonerCartridgeMonitoringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTonerCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTonerCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTonerCartridgeMonitoringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTonerCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TonerCartridgeMonitoringAcceptedCommandListListAttributeCallback>
{
public:
    MTRTonerCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TonerCartridgeMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTonerCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<TonerCartridgeMonitoringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTonerCartridgeMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTonerCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRTonerCartridgeMonitoringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTonerCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTonerCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTonerCartridgeMonitoringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTonerCartridgeMonitoringEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TonerCartridgeMonitoringEventListListAttributeCallback>
{
public:
    MTRTonerCartridgeMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TonerCartridgeMonitoringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTonerCartridgeMonitoringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<TonerCartridgeMonitoringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTonerCartridgeMonitoringEventListListAttributeCallbackSubscriptionBridge
    : public MTRTonerCartridgeMonitoringEventListListAttributeCallbackBridge
{
public:
    MTRTonerCartridgeMonitoringEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTonerCartridgeMonitoringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTonerCartridgeMonitoringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTonerCartridgeMonitoringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTonerCartridgeMonitoringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<TonerCartridgeMonitoringAttributeListListAttributeCallback>
{
public:
    MTRTonerCartridgeMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TonerCartridgeMonitoringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTonerCartridgeMonitoringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<TonerCartridgeMonitoringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRTonerCartridgeMonitoringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRTonerCartridgeMonitoringAttributeListListAttributeCallbackBridge
{
public:
    MTRTonerCartridgeMonitoringAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTonerCartridgeMonitoringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTonerCartridgeMonitoringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTonerCartridgeMonitoringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockCredentialRulesSupportAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockCredentialRulesSupportAttributeCallback>
{
public:
    MTRDoorLockCredentialRulesSupportAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockCredentialRulesSupportAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockCredentialRulesSupportAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<DoorLockCredentialRulesSupportAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::DoorLock::DlCredentialRuleMask> value);
};

class MTRDoorLockCredentialRulesSupportAttributeCallbackSubscriptionBridge
    : public MTRDoorLockCredentialRulesSupportAttributeCallbackBridge
{
public:
    MTRDoorLockCredentialRulesSupportAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockCredentialRulesSupportAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockCredentialRulesSupportAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockCredentialRulesSupportAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockSupportedOperatingModesAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockSupportedOperatingModesAttributeCallback>
{
public:
    MTRDoorLockSupportedOperatingModesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockSupportedOperatingModesAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockSupportedOperatingModesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<DoorLockSupportedOperatingModesAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::DoorLock::DlSupportedOperatingModes> value);
};

class MTRDoorLockSupportedOperatingModesAttributeCallbackSubscriptionBridge
    : public MTRDoorLockSupportedOperatingModesAttributeCallbackBridge
{
public:
    MTRDoorLockSupportedOperatingModesAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockSupportedOperatingModesAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockSupportedOperatingModesAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockSupportedOperatingModesAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockDefaultConfigurationRegisterAttributeCallback>
{
public:
    MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockDefaultConfigurationRegisterAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<DoorLockDefaultConfigurationRegisterAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::DoorLock::DlDefaultConfigurationRegister> value);
};

class MTRDoorLockDefaultConfigurationRegisterAttributeCallbackSubscriptionBridge
    : public MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge
{
public:
    MTRDoorLockDefaultConfigurationRegisterAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockDefaultConfigurationRegisterAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockLocalProgrammingFeaturesAttributeCallback>
{
public:
    MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockLocalProgrammingFeaturesAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<DoorLockLocalProgrammingFeaturesAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::DoorLock::DlLocalProgrammingFeatures> value);
};

class MTRDoorLockLocalProgrammingFeaturesAttributeCallbackSubscriptionBridge
    : public MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge
{
public:
    MTRDoorLockLocalProgrammingFeaturesAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockLocalProgrammingFeaturesAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockGeneratedCommandListListAttributeCallback>
{
public:
    MTRDoorLockGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<DoorLockGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRDoorLockGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRDoorLockGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRDoorLockGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockAcceptedCommandListListAttributeCallback>
{
public:
    MTRDoorLockAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<DoorLockAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRDoorLockAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRDoorLockAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRDoorLockAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockEventListListAttributeCallbackBridge : public MTRCallbackBridge<DoorLockEventListListAttributeCallback>
{
public:
    MTRDoorLockEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRDoorLockEventListListAttributeCallbackSubscriptionBridge : public MTRDoorLockEventListListAttributeCallbackBridge
{
public:
    MTRDoorLockEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action,
                                                                MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<DoorLockAttributeListListAttributeCallback>
{
public:
    MTRDoorLockAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRDoorLockAttributeListListAttributeCallbackSubscriptionBridge : public MTRDoorLockAttributeListListAttributeCallbackBridge
{
public:
    MTRDoorLockAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringConfigStatusAttributeCallbackBridge : public MTRCallbackBridge<WindowCoveringConfigStatusAttributeCallback>
{
public:
    MTRWindowCoveringConfigStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringConfigStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringConfigStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringConfigStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value);
};

class MTRWindowCoveringConfigStatusAttributeCallbackSubscriptionBridge : public MTRWindowCoveringConfigStatusAttributeCallbackBridge
{
public:
    MTRWindowCoveringConfigStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringConfigStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringConfigStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringConfigStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringOperationalStatusAttributeCallbackBridge
    : public MTRCallbackBridge<WindowCoveringOperationalStatusAttributeCallback>
{
public:
    MTRWindowCoveringOperationalStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringOperationalStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringOperationalStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringOperationalStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value);
};

class MTRWindowCoveringOperationalStatusAttributeCallbackSubscriptionBridge
    : public MTRWindowCoveringOperationalStatusAttributeCallbackBridge
{
public:
    MTRWindowCoveringOperationalStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringOperationalStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringOperationalStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringOperationalStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringModeAttributeCallbackBridge : public MTRCallbackBridge<WindowCoveringModeAttributeCallback>
{
public:
    MTRWindowCoveringModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value);
};

class MTRWindowCoveringModeAttributeCallbackSubscriptionBridge : public MTRWindowCoveringModeAttributeCallbackBridge
{
public:
    MTRWindowCoveringModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringSafetyStatusAttributeCallbackBridge : public MTRCallbackBridge<WindowCoveringSafetyStatusAttributeCallback>
{
public:
    MTRWindowCoveringSafetyStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringSafetyStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringSafetyStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringSafetyStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::WindowCovering::SafetyStatus> value);
};

class MTRWindowCoveringSafetyStatusAttributeCallbackSubscriptionBridge : public MTRWindowCoveringSafetyStatusAttributeCallbackBridge
{
public:
    MTRWindowCoveringSafetyStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringSafetyStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringSafetyStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringSafetyStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<WindowCoveringGeneratedCommandListListAttributeCallback>
{
public:
    MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRWindowCoveringGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRWindowCoveringGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<WindowCoveringAcceptedCommandListListAttributeCallback>
{
public:
    MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRWindowCoveringAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRWindowCoveringAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringEventListListAttributeCallbackBridge : public MTRCallbackBridge<WindowCoveringEventListListAttributeCallback>
{
public:
    MTRWindowCoveringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRWindowCoveringEventListListAttributeCallbackSubscriptionBridge
    : public MTRWindowCoveringEventListListAttributeCallbackBridge
{
public:
    MTRWindowCoveringEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<WindowCoveringAttributeListListAttributeCallback>
{
public:
    MTRWindowCoveringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRWindowCoveringAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRWindowCoveringAttributeListListAttributeCallbackBridge
{
public:
    MTRWindowCoveringAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BarrierControlGeneratedCommandListListAttributeCallback>
{
public:
    MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BarrierControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<BarrierControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBarrierControlGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBarrierControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBarrierControlGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BarrierControlAcceptedCommandListListAttributeCallback>
{
public:
    MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BarrierControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<BarrierControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBarrierControlAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBarrierControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBarrierControlAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBarrierControlEventListListAttributeCallbackBridge : public MTRCallbackBridge<BarrierControlEventListListAttributeCallback>
{
public:
    MTRBarrierControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BarrierControlEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBarrierControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<BarrierControlEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBarrierControlEventListListAttributeCallbackSubscriptionBridge
    : public MTRBarrierControlEventListListAttributeCallbackBridge
{
public:
    MTRBarrierControlEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBarrierControlEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBarrierControlEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBarrierControlEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBarrierControlAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<BarrierControlAttributeListListAttributeCallback>
{
public:
    MTRBarrierControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BarrierControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBarrierControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<BarrierControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBarrierControlAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRBarrierControlAttributeListListAttributeCallbackBridge
{
public:
    MTRBarrierControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBarrierControlAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBarrierControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBarrierControlAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge
    : public MTRCallbackBridge<PumpConfigurationAndControlPumpStatusAttributeCallback>
{
public:
    MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PumpConfigurationAndControlPumpStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<PumpConfigurationAndControlPumpStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::BitMask<chip::app::Clusters::PumpConfigurationAndControl::PumpStatusBitmap> value);
};

class MTRPumpConfigurationAndControlPumpStatusAttributeCallbackSubscriptionBridge
    : public MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge
{
public:
    MTRPumpConfigurationAndControlPumpStatusAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPumpConfigurationAndControlPumpStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PumpConfigurationAndControlGeneratedCommandListListAttributeCallback>
{
public:
    MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PumpConfigurationAndControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<PumpConfigurationAndControlGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPumpConfigurationAndControlGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PumpConfigurationAndControlAcceptedCommandListListAttributeCallback>
{
public:
    MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PumpConfigurationAndControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<PumpConfigurationAndControlAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPumpConfigurationAndControlAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPumpConfigurationAndControlEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<PumpConfigurationAndControlEventListListAttributeCallback>
{
public:
    MTRPumpConfigurationAndControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PumpConfigurationAndControlEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPumpConfigurationAndControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<PumpConfigurationAndControlEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRPumpConfigurationAndControlEventListListAttributeCallbackSubscriptionBridge
    : public MTRPumpConfigurationAndControlEventListListAttributeCallbackBridge
{
public:
    MTRPumpConfigurationAndControlEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPumpConfigurationAndControlEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPumpConfigurationAndControlEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPumpConfigurationAndControlEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<PumpConfigurationAndControlAttributeListListAttributeCallback>
{
public:
    MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PumpConfigurationAndControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<PumpConfigurationAndControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRPumpConfigurationAndControlAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge
{
public:
    MTRPumpConfigurationAndControlAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPumpConfigurationAndControlAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatGeneratedCommandListListAttributeCallback>
{
public:
    MTRThermostatGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<ThermostatGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRThermostatGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRThermostatGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRThermostatGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatAcceptedCommandListListAttributeCallback>
{
public:
    MTRThermostatAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<ThermostatAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRThermostatAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRThermostatAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRThermostatAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatEventListListAttributeCallbackBridge : public MTRCallbackBridge<ThermostatEventListListAttributeCallback>
{
public:
    MTRThermostatEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ThermostatEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRThermostatEventListListAttributeCallbackSubscriptionBridge : public MTRThermostatEventListListAttributeCallbackBridge
{
public:
    MTRThermostatEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ThermostatAttributeListListAttributeCallback>
{
public:
    MTRThermostatAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ThermostatAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRThermostatAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRThermostatAttributeListListAttributeCallbackBridge
{
public:
    MTRThermostatAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFanControlGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FanControlGeneratedCommandListListAttributeCallback>
{
public:
    MTRFanControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FanControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFanControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<FanControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFanControlGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFanControlGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRFanControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFanControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFanControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFanControlGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFanControlAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FanControlAcceptedCommandListListAttributeCallback>
{
public:
    MTRFanControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FanControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFanControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<FanControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFanControlAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFanControlAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRFanControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFanControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFanControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFanControlAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFanControlEventListListAttributeCallbackBridge : public MTRCallbackBridge<FanControlEventListListAttributeCallback>
{
public:
    MTRFanControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FanControlEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFanControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<FanControlEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRFanControlEventListListAttributeCallbackSubscriptionBridge : public MTRFanControlEventListListAttributeCallbackBridge
{
public:
    MTRFanControlEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFanControlEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFanControlEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFanControlEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFanControlAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<FanControlAttributeListListAttributeCallback>
{
public:
    MTRFanControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FanControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFanControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<FanControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRFanControlAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRFanControlAttributeListListAttributeCallbackBridge
{
public:
    MTRFanControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFanControlAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFanControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFanControlAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallback>
{
public:
    MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<ThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<ThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatUserInterfaceConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallback>
{
public:
    MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<ThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<ThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatUserInterfaceConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatUserInterfaceConfigurationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatUserInterfaceConfigurationEventListListAttributeCallback>
{
public:
    MTRThermostatUserInterfaceConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatUserInterfaceConfigurationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatUserInterfaceConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<ThermostatUserInterfaceConfigurationEventListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRThermostatUserInterfaceConfigurationEventListListAttributeCallbackSubscriptionBridge
    : public MTRThermostatUserInterfaceConfigurationEventListListAttributeCallbackBridge
{
public:
    MTRThermostatUserInterfaceConfigurationEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatUserInterfaceConfigurationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatUserInterfaceConfigurationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatUserInterfaceConfigurationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatUserInterfaceConfigurationAttributeListListAttributeCallback>
{
public:
    MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<ThermostatUserInterfaceConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<ThermostatUserInterfaceConfigurationAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge
{
public:
    MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatUserInterfaceConfigurationAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlGeneratedCommandListListAttributeCallback>
{
public:
    MTRColorControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<ColorControlGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRColorControlGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRColorControlGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRColorControlGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlAcceptedCommandListListAttributeCallback>
{
public:
    MTRColorControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<ColorControlAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRColorControlAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRColorControlAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRColorControlAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlEventListListAttributeCallbackBridge : public MTRCallbackBridge<ColorControlEventListListAttributeCallback>
{
public:
    MTRColorControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ColorControlEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRColorControlEventListListAttributeCallbackSubscriptionBridge : public MTRColorControlEventListListAttributeCallbackBridge
{
public:
    MTRColorControlEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlAttributeListListAttributeCallback>
{
public:
    MTRColorControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<ColorControlAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRColorControlAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRColorControlAttributeListListAttributeCallbackBridge
{
public:
    MTRColorControlAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BallastConfigurationGeneratedCommandListListAttributeCallback>
{
public:
    MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BallastConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<BallastConfigurationGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBallastConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBallastConfigurationGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBallastConfigurationGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BallastConfigurationAcceptedCommandListListAttributeCallback>
{
public:
    MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BallastConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<BallastConfigurationAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBallastConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBallastConfigurationAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBallastConfigurationAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBallastConfigurationEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<BallastConfigurationEventListListAttributeCallback>
{
public:
    MTRBallastConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BallastConfigurationEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBallastConfigurationEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<BallastConfigurationEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBallastConfigurationEventListListAttributeCallbackSubscriptionBridge
    : public MTRBallastConfigurationEventListListAttributeCallbackBridge
{
public:
    MTRBallastConfigurationEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBallastConfigurationEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBallastConfigurationEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBallastConfigurationEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBallastConfigurationAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<BallastConfigurationAttributeListListAttributeCallback>
{
public:
    MTRBallastConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BallastConfigurationAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBallastConfigurationAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<BallastConfigurationAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBallastConfigurationAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRBallastConfigurationAttributeListListAttributeCallbackBridge
{
public:
    MTRBallastConfigurationAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBallastConfigurationAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBallastConfigurationAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBallastConfigurationAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<IlluminanceMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IlluminanceMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<IlluminanceMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIlluminanceMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<IlluminanceMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IlluminanceMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<IlluminanceMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIlluminanceMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIlluminanceMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<IlluminanceMeasurementEventListListAttributeCallback>
{
public:
    MTRIlluminanceMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IlluminanceMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIlluminanceMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<IlluminanceMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRIlluminanceMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRIlluminanceMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRIlluminanceMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIlluminanceMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIlluminanceMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIlluminanceMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<IlluminanceMeasurementAttributeListListAttributeCallback>
{
public:
    MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IlluminanceMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<IlluminanceMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRIlluminanceMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRIlluminanceMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIlluminanceMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TemperatureMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TemperatureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<TemperatureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTemperatureMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TemperatureMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TemperatureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<TemperatureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTemperatureMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTemperatureMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TemperatureMeasurementEventListListAttributeCallback>
{
public:
    MTRTemperatureMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TemperatureMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTemperatureMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<TemperatureMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTemperatureMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRTemperatureMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRTemperatureMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTemperatureMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTemperatureMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTemperatureMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<TemperatureMeasurementAttributeListListAttributeCallback>
{
public:
    MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TemperatureMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<TemperatureMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRTemperatureMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRTemperatureMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTemperatureMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PressureMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PressureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<PressureMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPressureMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRPressureMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPressureMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PressureMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PressureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<PressureMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPressureMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRPressureMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPressureMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPressureMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<PressureMeasurementEventListListAttributeCallback>
{
public:
    MTRPressureMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PressureMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPressureMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<PressureMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRPressureMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRPressureMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRPressureMeasurementEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPressureMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPressureMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPressureMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPressureMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<PressureMeasurementAttributeListListAttributeCallback>
{
public:
    MTRPressureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PressureMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPressureMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<PressureMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRPressureMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRPressureMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRPressureMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPressureMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPressureMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPressureMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FlowMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FlowMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<FlowMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFlowMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRFlowMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFlowMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FlowMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FlowMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<FlowMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFlowMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRFlowMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFlowMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFlowMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<FlowMeasurementEventListListAttributeCallback>
{
public:
    MTRFlowMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FlowMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFlowMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<FlowMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRFlowMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRFlowMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRFlowMeasurementEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFlowMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFlowMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFlowMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFlowMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<FlowMeasurementAttributeListListAttributeCallback>
{
public:
    MTRFlowMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FlowMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFlowMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<FlowMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRFlowMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRFlowMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRFlowMeasurementAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFlowMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFlowMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFlowMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<RelativeHumidityMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RelativeHumidityMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<RelativeHumidityMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRelativeHumidityMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<RelativeHumidityMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RelativeHumidityMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<RelativeHumidityMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRelativeHumidityMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRelativeHumidityMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<RelativeHumidityMeasurementEventListListAttributeCallback>
{
public:
    MTRRelativeHumidityMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RelativeHumidityMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRelativeHumidityMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<RelativeHumidityMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRRelativeHumidityMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRRelativeHumidityMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRRelativeHumidityMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRelativeHumidityMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRelativeHumidityMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRelativeHumidityMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<RelativeHumidityMeasurementAttributeListListAttributeCallback>
{
public:
    MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RelativeHumidityMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<RelativeHumidityMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRelativeHumidityMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROccupancySensingOccupancyAttributeCallbackBridge : public MTRCallbackBridge<OccupancySensingOccupancyAttributeCallback>
{
public:
    MTROccupancySensingOccupancyAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OccupancySensingOccupancyAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROccupancySensingOccupancyAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<OccupancySensingOccupancyAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancyBitmap> value);
};

class MTROccupancySensingOccupancyAttributeCallbackSubscriptionBridge : public MTROccupancySensingOccupancyAttributeCallbackBridge
{
public:
    MTROccupancySensingOccupancyAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROccupancySensingOccupancyAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROccupancySensingOccupancyAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROccupancySensingOccupancyAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROccupancySensingOccupancySensorTypeBitmapAttributeCallbackBridge
    : public MTRCallbackBridge<OccupancySensingOccupancySensorTypeBitmapAttributeCallback>
{
public:
    MTROccupancySensingOccupancySensorTypeBitmapAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OccupancySensingOccupancySensorTypeBitmapAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROccupancySensingOccupancySensorTypeBitmapAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<OccupancySensingOccupancySensorTypeBitmapAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancySensorTypeBitmap> value);
};

class MTROccupancySensingOccupancySensorTypeBitmapAttributeCallbackSubscriptionBridge
    : public MTROccupancySensingOccupancySensorTypeBitmapAttributeCallbackBridge
{
public:
    MTROccupancySensingOccupancySensorTypeBitmapAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROccupancySensingOccupancySensorTypeBitmapAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROccupancySensingOccupancySensorTypeBitmapAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROccupancySensingOccupancySensorTypeBitmapAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OccupancySensingGeneratedCommandListListAttributeCallback>
{
public:
    MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OccupancySensingGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<OccupancySensingGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROccupancySensingGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTROccupancySensingGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROccupancySensingGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OccupancySensingAcceptedCommandListListAttributeCallback>
{
public:
    MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OccupancySensingAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<OccupancySensingAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROccupancySensingAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTROccupancySensingAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROccupancySensingAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROccupancySensingEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<OccupancySensingEventListListAttributeCallback>
{
public:
    MTROccupancySensingEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OccupancySensingEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROccupancySensingEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<OccupancySensingEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTROccupancySensingEventListListAttributeCallbackSubscriptionBridge
    : public MTROccupancySensingEventListListAttributeCallbackBridge
{
public:
    MTROccupancySensingEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROccupancySensingEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROccupancySensingEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROccupancySensingEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROccupancySensingAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<OccupancySensingAttributeListListAttributeCallback>
{
public:
    MTROccupancySensingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OccupancySensingAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROccupancySensingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<OccupancySensingAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTROccupancySensingAttributeListListAttributeCallbackSubscriptionBridge
    : public MTROccupancySensingAttributeListListAttributeCallbackBridge
{
public:
    MTROccupancySensingAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROccupancySensingAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROccupancySensingAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROccupancySensingAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRCarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRCarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRCarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRCarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRCarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonMonoxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRCarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRCarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRCarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRCarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRCarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonMonoxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonMonoxideConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRCarbonMonoxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCarbonMonoxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRCarbonMonoxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRCarbonMonoxideConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRCarbonMonoxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonMonoxideConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonMonoxideConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonMonoxideConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRCarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRCarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRCarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRCarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonMonoxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRCarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRCarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRCarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRCarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRCarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRCarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRCarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRCarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRCarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRCarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonDioxideConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonDioxideConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRCarbonDioxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCarbonDioxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRCarbonDioxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRCarbonDioxideConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRCarbonDioxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonDioxideConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonDioxideConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonDioxideConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonDioxideConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRCarbonDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCarbonDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRCarbonDioxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRCarbonDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRCarbonDioxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTREthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTREthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTREthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTREthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTREthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTREthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTREthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTREthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTREthyleneConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthyleneConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTREthyleneConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTREthyleneConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTREthyleneConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTREthyleneConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthyleneConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTREthyleneConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTREthyleneConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTREthyleneConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTREthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTREthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTREthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTREthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTREthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTREthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTREthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTREthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTREthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTREthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneOxideConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneOxideConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTREthyleneOxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthyleneOxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTREthyleneOxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTREthyleneOxideConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTREthyleneOxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneOxideConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneOxideConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneOxideConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneOxideConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTREthyleneOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthyleneOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTREthyleneOxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTREthyleneOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTREthyleneOxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRHydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRHydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRHydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRHydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRHydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRHydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRHydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRHydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRHydrogenConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHydrogenConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRHydrogenConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRHydrogenConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRHydrogenConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRHydrogenConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHydrogenConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRHydrogenConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRHydrogenConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRHydrogenConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRHydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRHydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRHydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRHydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRHydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenSulfideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRHydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRHydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRHydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRHydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRHydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenSulfideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenSulfideConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRHydrogenSulfideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHydrogenSulfideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRHydrogenSulfideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRHydrogenSulfideConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRHydrogenSulfideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenSulfideConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenSulfideConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenSulfideConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRHydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRHydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRHydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRHydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenSulfideConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<NitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRNitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRNitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRNitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRNitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitricOxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<NitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRNitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRNitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRNitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRNitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRNitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitricOxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitricOxideConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<NitricOxideConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRNitricOxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNitricOxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRNitricOxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRNitricOxideConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRNitricOxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitricOxideConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitricOxideConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitricOxideConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitricOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<NitricOxideConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRNitricOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNitricOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRNitricOxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRNitricOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRNitricOxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitricOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitricOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitricOxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRNitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRNitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRNitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRNitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRNitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitrogenDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRNitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRNitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRNitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRNitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitrogenDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitrogenDioxideConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRNitrogenDioxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNitrogenDioxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRNitrogenDioxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRNitrogenDioxideConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRNitrogenDioxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitrogenDioxideConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitrogenDioxideConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitrogenDioxideConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRNitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRNitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRNitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRNitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitrogenDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OxygenConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTROxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<OxygenConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<OxygenConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTROxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OxygenConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTROxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<OxygenConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<OxygenConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTROxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROxygenConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<OxygenConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTROxygenConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OxygenConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROxygenConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<OxygenConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTROxygenConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTROxygenConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTROxygenConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROxygenConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROxygenConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROxygenConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<OxygenConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTROxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OxygenConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<OxygenConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTROxygenConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTROxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTROxygenConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTROzoneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<OzoneConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<OzoneConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROzoneConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROzoneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTROzoneConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTROzoneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<OzoneConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<OzoneConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTROzoneConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTROzoneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTROzoneConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTROzoneConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OzoneConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<OzoneConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTROzoneConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTROzoneConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTROzoneConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTROzoneConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OzoneConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<OzoneConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTROzoneConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTROzoneConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTROzoneConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRSulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRSulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRSulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfurDioxideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRSulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRSulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRSulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfurDioxideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfurDioxideConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<SulfurDioxideConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRSulfurDioxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSulfurDioxideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRSulfurDioxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRSulfurDioxideConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRSulfurDioxideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfurDioxideConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfurDioxideConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfurDioxideConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfurDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<SulfurDioxideConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRSulfurDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSulfurDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRSulfurDioxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRSulfurDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRSulfurDioxideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfurDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfurDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfurDioxideConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRDissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRDissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRDissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRDissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRDissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDissolvedOxygenConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRDissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRDissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRDissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRDissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRDissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDissolvedOxygenConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDissolvedOxygenConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRDissolvedOxygenConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDissolvedOxygenConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRDissolvedOxygenConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRDissolvedOxygenConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRDissolvedOxygenConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDissolvedOxygenConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDissolvedOxygenConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDissolvedOxygenConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRDissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRDissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRDissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRDissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDissolvedOxygenConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromateConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRBromateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<BromateConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBromateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<BromateConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBromateConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBromateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBromateConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromateConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRBromateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<BromateConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBromateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<BromateConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBromateConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBromateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBromateConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromateConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromateConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRBromateConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BromateConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBromateConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<BromateConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBromateConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRBromateConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRBromateConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromateConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromateConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromateConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromateConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromateConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRBromateConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BromateConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBromateConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<BromateConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBromateConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRBromateConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRBromateConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromateConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromateConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromateConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloraminesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloraminesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloraminesConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChloraminesConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRChloraminesConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChloraminesConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRChloraminesConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRChloraminesConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRChloraminesConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloraminesConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloraminesConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloraminesConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloraminesConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChloraminesConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRChloraminesConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChloraminesConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRChloraminesConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRChloraminesConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRChloraminesConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloraminesConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloraminesConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloraminesConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorineConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorineConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorineConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorineConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRChlorineConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChlorineConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRChlorineConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRChlorineConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRChlorineConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorineConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorineConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorineConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorineConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorineConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRChlorineConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChlorineConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRChlorineConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRChlorineConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRChlorineConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorineConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorineConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorineConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRFecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRFecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRFecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFecalColiformEColiConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRFecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRFecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRFecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFecalColiformEColiConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFecalColiformEColiConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRFecalColiformEColiConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFecalColiformEColiConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRFecalColiformEColiConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRFecalColiformEColiConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRFecalColiformEColiConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFecalColiformEColiConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFecalColiformEColiConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFecalColiformEColiConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRFecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRFecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRFecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRFecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRFecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFecalColiformEColiConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFluorideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FluorideConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRFluorideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<FluorideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFluorideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<FluorideConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFluorideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFluorideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRFluorideConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFluorideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFluorideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFluorideConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFluorideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FluorideConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRFluorideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<FluorideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFluorideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<FluorideConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFluorideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFluorideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRFluorideConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFluorideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFluorideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFluorideConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFluorideConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<FluorideConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRFluorideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FluorideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFluorideConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<FluorideConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRFluorideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRFluorideConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRFluorideConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFluorideConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFluorideConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFluorideConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFluorideConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<FluorideConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRFluorideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FluorideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFluorideConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<FluorideConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRFluorideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRFluorideConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRFluorideConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFluorideConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFluorideConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFluorideConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRHaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRHaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRHaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHaloaceticAcidsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRHaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRHaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRHaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHaloaceticAcidsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHaloaceticAcidsConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHaloaceticAcidsConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRHaloaceticAcidsConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRHaloaceticAcidsConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHaloaceticAcidsConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHaloaceticAcidsConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHaloaceticAcidsConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRHaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRHaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHaloaceticAcidsConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRTotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalTrihalomethanesConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRTotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalTrihalomethanesConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRTotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRTotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalTrihalomethanesConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRTotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRTotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRTotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalTrihalomethanesConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                                  OnSuccessFn){};

    MTRTotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler,
                                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalColiformBacteriaConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRTotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalColiformBacteriaConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRTotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRTotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalColiformBacteriaConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRTotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRTotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRTotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalColiformBacteriaConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRTurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRTurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRTurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTurbidityConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRTurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRTurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTurbidityConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTurbidityConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TurbidityConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRTurbidityConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTurbidityConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTurbidityConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRTurbidityConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRTurbidityConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTurbidityConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTurbidityConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTurbidityConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTurbidityConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<TurbidityConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRTurbidityConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTurbidityConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRTurbidityConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRTurbidityConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRTurbidityConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTurbidityConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTurbidityConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTurbidityConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCopperConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<CopperConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRCopperConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<CopperConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCopperConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<CopperConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRCopperConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRCopperConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRCopperConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCopperConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCopperConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCopperConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCopperConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<CopperConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRCopperConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<CopperConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCopperConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<CopperConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRCopperConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRCopperConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRCopperConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCopperConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCopperConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCopperConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCopperConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<CopperConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRCopperConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CopperConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCopperConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<CopperConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRCopperConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRCopperConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRCopperConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCopperConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCopperConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCopperConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCopperConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<CopperConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRCopperConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CopperConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCopperConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<CopperConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRCopperConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRCopperConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRCopperConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCopperConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCopperConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCopperConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLeadConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<LeadConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRLeadConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<LeadConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLeadConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<LeadConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRLeadConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRLeadConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRLeadConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLeadConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLeadConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLeadConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLeadConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<LeadConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRLeadConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LeadConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLeadConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<LeadConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRLeadConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRLeadConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRLeadConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLeadConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLeadConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLeadConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLeadConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<LeadConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRLeadConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LeadConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLeadConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<LeadConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRLeadConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRLeadConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRLeadConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLeadConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLeadConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLeadConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLeadConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<LeadConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRLeadConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LeadConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLeadConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<LeadConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRLeadConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRLeadConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRLeadConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLeadConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLeadConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLeadConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRManganeseConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRManganeseConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRManganeseConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ManganeseConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRManganeseConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRManganeseConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRManganeseConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRManganeseConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRManganeseConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRManganeseConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRManganeseConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRManganeseConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRManganeseConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ManganeseConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRManganeseConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRManganeseConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRManganeseConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRManganeseConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRManganeseConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRManganeseConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRManganeseConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRManganeseConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SulfateConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRSulfateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<SulfateConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSulfateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<SulfateConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSulfateConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSulfateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRSulfateConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfateConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SulfateConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRSulfateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<SulfateConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSulfateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<SulfateConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSulfateConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSulfateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRSulfateConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfateConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfateConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<SulfateConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRSulfateConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SulfateConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSulfateConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<SulfateConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRSulfateConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRSulfateConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRSulfateConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfateConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfateConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfateConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfateConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<SulfateConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRSulfateConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SulfateConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSulfateConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<SulfateConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRSulfateConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRSulfateConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRSulfateConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfateConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfateConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfateConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRBromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRBromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromodichloromethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRBromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRBromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromodichloromethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromodichloromethaneConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRBromodichloromethaneConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementEventListListAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRBromodichloromethaneConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBromodichloromethaneConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRBromodichloromethaneConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRBromodichloromethaneConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromodichloromethaneConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromodichloromethaneConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromodichloromethaneConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRBromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRBromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRBromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRBromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromodichloromethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromoformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromoformConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRBromoformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<BromoformConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRBromoformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<BromoformConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBromoformConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBromoformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRBromoformConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromoformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromoformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromoformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromoformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromoformConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRBromoformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<BromoformConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBromoformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<BromoformConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRBromoformConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRBromoformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRBromoformConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromoformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromoformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromoformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromoformConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromoformConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRBromoformConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BromoformConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBromoformConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<BromoformConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRBromoformConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRBromoformConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRBromoformConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromoformConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromoformConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromoformConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromoformConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<BromoformConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRBromoformConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BromoformConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBromoformConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<BromoformConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRBromoformConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRBromoformConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRBromoformConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromoformConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromoformConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromoformConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorodibromomethaneConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorodibromomethaneConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorodibromomethaneConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorodibromomethaneConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloroformConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloroformConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloroformConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChloroformConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRChloroformConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChloroformConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRChloroformConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRChloroformConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRChloroformConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloroformConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloroformConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloroformConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloroformConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChloroformConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRChloroformConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChloroformConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRChloroformConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRChloroformConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRChloroformConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloroformConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloroformConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloroformConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSodiumConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SodiumConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRSodiumConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<SodiumConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSodiumConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<SodiumConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSodiumConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSodiumConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRSodiumConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSodiumConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSodiumConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSodiumConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSodiumConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<SodiumConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRSodiumConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<SodiumConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSodiumConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<SodiumConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRSodiumConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRSodiumConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRSodiumConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSodiumConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSodiumConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSodiumConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSodiumConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<SodiumConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRSodiumConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SodiumConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSodiumConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<SodiumConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRSodiumConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRSodiumConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRSodiumConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSodiumConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSodiumConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSodiumConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSodiumConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<SodiumConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRSodiumConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SodiumConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSodiumConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<SodiumConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRSodiumConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRSodiumConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRSodiumConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSodiumConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSodiumConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSodiumConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM25ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM25ConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRPM25ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<PM25ConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM25ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<PM25ConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPM25ConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPM25ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRPM25ConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM25ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM25ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM25ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM25ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM25ConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRPM25ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM25ConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM25ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<PM25ConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPM25ConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPM25ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRPM25ConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM25ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM25ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM25ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM25ConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM25ConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRPM25ConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM25ConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM25ConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<PM25ConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRPM25ConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRPM25ConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRPM25ConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM25ConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM25ConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM25ConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM25ConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM25ConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRPM25ConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM25ConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM25ConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<PM25ConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRPM25ConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRPM25ConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRPM25ConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM25ConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM25ConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM25ConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRFormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRFormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRFormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFormaldehydeConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<FormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRFormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRFormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRFormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRFormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRFormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFormaldehydeConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFormaldehydeConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<FormaldehydeConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRFormaldehydeConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFormaldehydeConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRFormaldehydeConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRFormaldehydeConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRFormaldehydeConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFormaldehydeConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFormaldehydeConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFormaldehydeConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFormaldehydeConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<FormaldehydeConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRFormaldehydeConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFormaldehydeConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRFormaldehydeConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRFormaldehydeConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRFormaldehydeConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFormaldehydeConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFormaldehydeConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFormaldehydeConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM1ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM1ConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRPM1ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM1ConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM1ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<PM1ConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPM1ConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPM1ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRPM1ConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM1ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM1ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM1ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM1ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM1ConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRPM1ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM1ConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM1ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<PM1ConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPM1ConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPM1ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRPM1ConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM1ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM1ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM1ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM1ConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM1ConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRPM1ConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM1ConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM1ConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<PM1ConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRPM1ConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRPM1ConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRPM1ConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM1ConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM1ConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM1ConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM1ConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM1ConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRPM1ConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM1ConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM1ConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<PM1ConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRPM1ConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRPM1ConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRPM1ConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM1ConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM1ConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM1ConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM10ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM10ConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRPM10ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<PM10ConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM10ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<PM10ConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPM10ConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPM10ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRPM10ConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM10ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM10ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM10ConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM10ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM10ConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRPM10ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM10ConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM10ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<PM10ConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRPM10ConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRPM10ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRPM10ConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM10ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM10ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM10ConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM10ConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM10ConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRPM10ConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM10ConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM10ConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<PM10ConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRPM10ConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRPM10ConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRPM10ConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM10ConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM10ConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM10ConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM10ConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<PM10ConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRPM10ConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM10ConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM10ConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<PM10ConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRPM10ConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRPM10ConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRPM10ConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM10ConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM10ConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM10ConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                            ResponseHandler handler,
                                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler,
                                                                                                                action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                           ResponseHandler handler,
                                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler,
                                                                                                               action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRTotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler,
                                                                                                                   OnSuccessFn){};

    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler,
                                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRadonConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<RadonConcentrationMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRRadonConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<RadonConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRadonConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<RadonConcentrationMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRRadonConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRRadonConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRRadonConcentrationMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRadonConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRadonConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRadonConcentrationMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRadonConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<RadonConcentrationMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRRadonConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<RadonConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRadonConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<RadonConcentrationMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRRadonConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRRadonConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRRadonConcentrationMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRadonConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRadonConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRadonConcentrationMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRadonConcentrationMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<RadonConcentrationMeasurementEventListListAttributeCallback>
{
public:
    MTRRadonConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RadonConcentrationMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRadonConcentrationMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<RadonConcentrationMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRRadonConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRRadonConcentrationMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRRadonConcentrationMeasurementEventListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRadonConcentrationMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRadonConcentrationMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRadonConcentrationMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRadonConcentrationMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<RadonConcentrationMeasurementAttributeListListAttributeCallback>
{
public:
    MTRRadonConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RadonConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRadonConcentrationMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<RadonConcentrationMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRRadonConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRRadonConcentrationMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRRadonConcentrationMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRadonConcentrationMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRadonConcentrationMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRadonConcentrationMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<WakeOnLANGeneratedCommandListListAttributeCallback>
{
public:
    MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WakeOnLANGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<WakeOnLANGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRWakeOnLANGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRWakeOnLANGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<WakeOnLANAcceptedCommandListListAttributeCallback>
{
public:
    MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WakeOnLANAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<WakeOnLANAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRWakeOnLANAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRWakeOnLANAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWakeOnLANEventListListAttributeCallbackBridge : public MTRCallbackBridge<WakeOnLANEventListListAttributeCallback>
{
public:
    MTRWakeOnLANEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WakeOnLANEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWakeOnLANEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<WakeOnLANEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRWakeOnLANEventListListAttributeCallbackSubscriptionBridge : public MTRWakeOnLANEventListListAttributeCallbackBridge
{
public:
    MTRWakeOnLANEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action,
                                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWakeOnLANEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWakeOnLANEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWakeOnLANEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWakeOnLANAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<WakeOnLANAttributeListListAttributeCallback>
{
public:
    MTRWakeOnLANAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WakeOnLANAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWakeOnLANAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<WakeOnLANAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRWakeOnLANAttributeListListAttributeCallbackSubscriptionBridge : public MTRWakeOnLANAttributeListListAttributeCallbackBridge
{
public:
    MTRWakeOnLANAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWakeOnLANAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWakeOnLANAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWakeOnLANAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChannelChannelListListAttributeCallbackBridge : public MTRCallbackBridge<ChannelChannelListListAttributeCallback>
{
public:
    MTRChannelChannelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelChannelListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChannelChannelListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ChannelChannelListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> & value);
};

class MTRChannelChannelListListAttributeCallbackSubscriptionBridge : public MTRChannelChannelListListAttributeCallbackBridge
{
public:
    MTRChannelChannelListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action,
                                                                 MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChannelChannelListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChannelChannelListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChannelChannelListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChannelLineupStructAttributeCallbackBridge : public MTRCallbackBridge<ChannelLineupStructAttributeCallback>
{
public:
    MTRChannelLineupStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelLineupStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChannelLineupStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ChannelLineupStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::LineupInfoStruct::DecodableType> & value);
};

class MTRChannelLineupStructAttributeCallbackSubscriptionBridge : public MTRChannelLineupStructAttributeCallbackBridge
{
public:
    MTRChannelLineupStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChannelLineupStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChannelLineupStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChannelLineupStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChannelCurrentChannelStructAttributeCallbackBridge : public MTRCallbackBridge<ChannelCurrentChannelStructAttributeCallback>
{
public:
    MTRChannelCurrentChannelStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelCurrentChannelStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChannelCurrentChannelStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ChannelCurrentChannelStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> & value);
};

class MTRChannelCurrentChannelStructAttributeCallbackSubscriptionBridge
    : public MTRChannelCurrentChannelStructAttributeCallbackBridge
{
public:
    MTRChannelCurrentChannelStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChannelCurrentChannelStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChannelCurrentChannelStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChannelCurrentChannelStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChannelGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChannelGeneratedCommandListListAttributeCallback>
{
public:
    MTRChannelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChannelGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<ChannelGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChannelGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChannelGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRChannelGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChannelGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChannelGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChannelGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChannelAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ChannelAcceptedCommandListListAttributeCallback>
{
public:
    MTRChannelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChannelAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<ChannelAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRChannelAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRChannelAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRChannelAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChannelAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChannelAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChannelAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChannelEventListListAttributeCallbackBridge : public MTRCallbackBridge<ChannelEventListListAttributeCallback>
{
public:
    MTRChannelEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChannelEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ChannelEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRChannelEventListListAttributeCallbackSubscriptionBridge : public MTRChannelEventListListAttributeCallbackBridge
{
public:
    MTRChannelEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action,
                                                               MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChannelEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChannelEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChannelEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChannelAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<ChannelAttributeListListAttributeCallback>
{
public:
    MTRChannelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChannelAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ChannelAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRChannelAttributeListListAttributeCallbackSubscriptionBridge : public MTRChannelAttributeListListAttributeCallbackBridge
{
public:
    MTRChannelAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChannelAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChannelAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChannelAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTargetNavigatorTargetListListAttributeCallbackBridge
    : public MTRCallbackBridge<TargetNavigatorTargetListListAttributeCallback>
{
public:
    MTRTargetNavigatorTargetListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TargetNavigatorTargetListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTargetNavigatorTargetListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<TargetNavigatorTargetListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::TargetNavigator::Structs::TargetInfoStruct::DecodableType> &
            value);
};

class MTRTargetNavigatorTargetListListAttributeCallbackSubscriptionBridge
    : public MTRTargetNavigatorTargetListListAttributeCallbackBridge
{
public:
    MTRTargetNavigatorTargetListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTargetNavigatorTargetListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTargetNavigatorTargetListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTargetNavigatorTargetListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TargetNavigatorGeneratedCommandListListAttributeCallback>
{
public:
    MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TargetNavigatorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<TargetNavigatorGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTargetNavigatorGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRTargetNavigatorGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTargetNavigatorGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<TargetNavigatorAcceptedCommandListListAttributeCallback>
{
public:
    MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TargetNavigatorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<TargetNavigatorAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRTargetNavigatorAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRTargetNavigatorAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTargetNavigatorAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTargetNavigatorEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<TargetNavigatorEventListListAttributeCallback>
{
public:
    MTRTargetNavigatorEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TargetNavigatorEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTargetNavigatorEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<TargetNavigatorEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRTargetNavigatorEventListListAttributeCallbackSubscriptionBridge
    : public MTRTargetNavigatorEventListListAttributeCallbackBridge
{
public:
    MTRTargetNavigatorEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTargetNavigatorEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTargetNavigatorEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTargetNavigatorEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTargetNavigatorAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<TargetNavigatorAttributeListListAttributeCallback>
{
public:
    MTRTargetNavigatorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TargetNavigatorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTargetNavigatorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<TargetNavigatorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRTargetNavigatorAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRTargetNavigatorAttributeListListAttributeCallbackBridge
{
public:
    MTRTargetNavigatorAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTargetNavigatorAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTargetNavigatorAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTargetNavigatorAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge
    : public MTRCallbackBridge<MediaPlaybackSampledPositionStructAttributeCallback>
{
public:
    MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaPlaybackSampledPositionStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<MediaPlaybackSampledPositionStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType> &
            value);
};

class MTRMediaPlaybackSampledPositionStructAttributeCallbackSubscriptionBridge
    : public MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge
{
public:
    MTRMediaPlaybackSampledPositionStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaPlaybackSampledPositionStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<MediaPlaybackGeneratedCommandListListAttributeCallback>
{
public:
    MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaPlaybackGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<MediaPlaybackGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRMediaPlaybackGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRMediaPlaybackGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaPlaybackGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<MediaPlaybackAcceptedCommandListListAttributeCallback>
{
public:
    MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaPlaybackAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<MediaPlaybackAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRMediaPlaybackAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRMediaPlaybackAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaPlaybackAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaPlaybackEventListListAttributeCallbackBridge : public MTRCallbackBridge<MediaPlaybackEventListListAttributeCallback>
{
public:
    MTRMediaPlaybackEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaPlaybackEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaPlaybackEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<MediaPlaybackEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRMediaPlaybackEventListListAttributeCallbackSubscriptionBridge : public MTRMediaPlaybackEventListListAttributeCallbackBridge
{
public:
    MTRMediaPlaybackEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaPlaybackEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaPlaybackEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaPlaybackEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaPlaybackAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<MediaPlaybackAttributeListListAttributeCallback>
{
public:
    MTRMediaPlaybackAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaPlaybackAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaPlaybackAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<MediaPlaybackAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRMediaPlaybackAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRMediaPlaybackAttributeListListAttributeCallbackBridge
{
public:
    MTRMediaPlaybackAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaPlaybackAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaPlaybackAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaPlaybackAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaInputInputListListAttributeCallbackBridge : public MTRCallbackBridge<MediaInputInputListListAttributeCallback>
{
public:
    MTRMediaInputInputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaInputInputListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaInputInputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<MediaInputInputListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType> &
            value);
};

class MTRMediaInputInputListListAttributeCallbackSubscriptionBridge : public MTRMediaInputInputListListAttributeCallbackBridge
{
public:
    MTRMediaInputInputListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaInputInputListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaInputInputListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaInputInputListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaInputGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<MediaInputGeneratedCommandListListAttributeCallback>
{
public:
    MTRMediaInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaInputGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<MediaInputGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRMediaInputGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRMediaInputGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRMediaInputGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaInputGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaInputGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaInputGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaInputAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<MediaInputAcceptedCommandListListAttributeCallback>
{
public:
    MTRMediaInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaInputAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<MediaInputAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRMediaInputAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRMediaInputAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRMediaInputAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaInputAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaInputAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaInputAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaInputEventListListAttributeCallbackBridge : public MTRCallbackBridge<MediaInputEventListListAttributeCallback>
{
public:
    MTRMediaInputEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaInputEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaInputEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<MediaInputEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRMediaInputEventListListAttributeCallbackSubscriptionBridge : public MTRMediaInputEventListListAttributeCallbackBridge
{
public:
    MTRMediaInputEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaInputEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaInputEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaInputEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaInputAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<MediaInputAttributeListListAttributeCallback>
{
public:
    MTRMediaInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaInputAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<MediaInputAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRMediaInputAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRMediaInputAttributeListListAttributeCallbackBridge
{
public:
    MTRMediaInputAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaInputAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaInputAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaInputAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLowPowerGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<LowPowerGeneratedCommandListListAttributeCallback>
{
public:
    MTRLowPowerGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LowPowerGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLowPowerGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<LowPowerGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRLowPowerGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRLowPowerGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRLowPowerGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLowPowerGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLowPowerGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLowPowerGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLowPowerAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<LowPowerAcceptedCommandListListAttributeCallback>
{
public:
    MTRLowPowerAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LowPowerAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLowPowerAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<LowPowerAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRLowPowerAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRLowPowerAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRLowPowerAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLowPowerAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLowPowerAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLowPowerAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLowPowerEventListListAttributeCallbackBridge : public MTRCallbackBridge<LowPowerEventListListAttributeCallback>
{
public:
    MTRLowPowerEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LowPowerEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLowPowerEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<LowPowerEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRLowPowerEventListListAttributeCallbackSubscriptionBridge : public MTRLowPowerEventListListAttributeCallbackBridge
{
public:
    MTRLowPowerEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action,
                                                                MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLowPowerEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLowPowerEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLowPowerEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLowPowerAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<LowPowerAttributeListListAttributeCallback>
{
public:
    MTRLowPowerAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LowPowerAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLowPowerAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<LowPowerAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRLowPowerAttributeListListAttributeCallbackSubscriptionBridge : public MTRLowPowerAttributeListListAttributeCallbackBridge
{
public:
    MTRLowPowerAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLowPowerAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLowPowerAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLowPowerAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<KeypadInputGeneratedCommandListListAttributeCallback>
{
public:
    MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<KeypadInputGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<KeypadInputGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRKeypadInputGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRKeypadInputGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRKeypadInputGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<KeypadInputAcceptedCommandListListAttributeCallback>
{
public:
    MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<KeypadInputAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<KeypadInputAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRKeypadInputAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRKeypadInputAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRKeypadInputAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRKeypadInputEventListListAttributeCallbackBridge : public MTRCallbackBridge<KeypadInputEventListListAttributeCallback>
{
public:
    MTRKeypadInputEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<KeypadInputEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRKeypadInputEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<KeypadInputEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRKeypadInputEventListListAttributeCallbackSubscriptionBridge : public MTRKeypadInputEventListListAttributeCallbackBridge
{
public:
    MTRKeypadInputEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRKeypadInputEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRKeypadInputEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRKeypadInputEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRKeypadInputAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<KeypadInputAttributeListListAttributeCallback>
{
public:
    MTRKeypadInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<KeypadInputAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRKeypadInputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<KeypadInputAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRKeypadInputAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRKeypadInputAttributeListListAttributeCallbackBridge
{
public:
    MTRKeypadInputAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRKeypadInputAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRKeypadInputAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRKeypadInputAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRContentLauncherAcceptHeaderListAttributeCallbackBridge
    : public MTRCallbackBridge<ContentLauncherAcceptHeaderListAttributeCallback>
{
public:
    MTRContentLauncherAcceptHeaderListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ContentLauncherAcceptHeaderListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRContentLauncherAcceptHeaderListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<ContentLauncherAcceptHeaderListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CharSpan> & value);
};

class MTRContentLauncherAcceptHeaderListAttributeCallbackSubscriptionBridge
    : public MTRContentLauncherAcceptHeaderListAttributeCallbackBridge
{
public:
    MTRContentLauncherAcceptHeaderListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRContentLauncherAcceptHeaderListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRContentLauncherAcceptHeaderListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRContentLauncherAcceptHeaderListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ContentLauncherGeneratedCommandListListAttributeCallback>
{
public:
    MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ContentLauncherGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<ContentLauncherGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRContentLauncherGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRContentLauncherGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRContentLauncherGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ContentLauncherAcceptedCommandListListAttributeCallback>
{
public:
    MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ContentLauncherAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<ContentLauncherAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRContentLauncherAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRContentLauncherAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRContentLauncherAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRContentLauncherEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ContentLauncherEventListListAttributeCallback>
{
public:
    MTRContentLauncherEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ContentLauncherEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRContentLauncherEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ContentLauncherEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRContentLauncherEventListListAttributeCallbackSubscriptionBridge
    : public MTRContentLauncherEventListListAttributeCallbackBridge
{
public:
    MTRContentLauncherEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRContentLauncherEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRContentLauncherEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRContentLauncherEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRContentLauncherAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ContentLauncherAttributeListListAttributeCallback>
{
public:
    MTRContentLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ContentLauncherAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRContentLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<ContentLauncherAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRContentLauncherAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRContentLauncherAttributeListListAttributeCallbackBridge
{
public:
    MTRContentLauncherAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRContentLauncherAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRContentLauncherAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRContentLauncherAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAudioOutputOutputListListAttributeCallbackBridge : public MTRCallbackBridge<AudioOutputOutputListListAttributeCallback>
{
public:
    MTRAudioOutputOutputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AudioOutputOutputListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAudioOutputOutputListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<AudioOutputOutputListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::DecodableType> &
            value);
};

class MTRAudioOutputOutputListListAttributeCallbackSubscriptionBridge : public MTRAudioOutputOutputListListAttributeCallbackBridge
{
public:
    MTRAudioOutputOutputListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAudioOutputOutputListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAudioOutputOutputListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAudioOutputOutputListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AudioOutputGeneratedCommandListListAttributeCallback>
{
public:
    MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AudioOutputGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<AudioOutputGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAudioOutputGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRAudioOutputGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAudioOutputGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AudioOutputAcceptedCommandListListAttributeCallback>
{
public:
    MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AudioOutputAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<AudioOutputAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAudioOutputAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRAudioOutputAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAudioOutputAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAudioOutputEventListListAttributeCallbackBridge : public MTRCallbackBridge<AudioOutputEventListListAttributeCallback>
{
public:
    MTRAudioOutputEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AudioOutputEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAudioOutputEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<AudioOutputEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRAudioOutputEventListListAttributeCallbackSubscriptionBridge : public MTRAudioOutputEventListListAttributeCallbackBridge
{
public:
    MTRAudioOutputEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAudioOutputEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAudioOutputEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAudioOutputEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAudioOutputAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<AudioOutputAttributeListListAttributeCallback>
{
public:
    MTRAudioOutputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AudioOutputAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAudioOutputAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<AudioOutputAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRAudioOutputAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRAudioOutputAttributeListListAttributeCallbackBridge
{
public:
    MTRAudioOutputAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAudioOutputAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAudioOutputAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAudioOutputAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationLauncherCatalogListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationLauncherCatalogListListAttributeCallback>
{
public:
    MTRApplicationLauncherCatalogListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationLauncherCatalogListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationLauncherCatalogListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<ApplicationLauncherCatalogListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<uint16_t> & value);
};

class MTRApplicationLauncherCatalogListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationLauncherCatalogListListAttributeCallbackBridge
{
public:
    MTRApplicationLauncherCatalogListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationLauncherCatalogListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationLauncherCatalogListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationLauncherCatalogListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationLauncherCurrentAppStructAttributeCallback>
{
public:
    MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationLauncherCurrentAppStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<ApplicationLauncherCurrentAppStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::ApplicationLauncher::Structs::ApplicationEPStruct::DecodableType> & value);
};

class MTRApplicationLauncherCurrentAppStructAttributeCallbackSubscriptionBridge
    : public MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge
{
public:
    MTRApplicationLauncherCurrentAppStructAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationLauncherCurrentAppStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationLauncherGeneratedCommandListListAttributeCallback>
{
public:
    MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationLauncherGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<ApplicationLauncherGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRApplicationLauncherGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRApplicationLauncherGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationLauncherGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationLauncherAcceptedCommandListListAttributeCallback>
{
public:
    MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationLauncherAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<ApplicationLauncherAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRApplicationLauncherAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRApplicationLauncherAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationLauncherAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationLauncherEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationLauncherEventListListAttributeCallback>
{
public:
    MTRApplicationLauncherEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationLauncherEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationLauncherEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<ApplicationLauncherEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRApplicationLauncherEventListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationLauncherEventListListAttributeCallbackBridge
{
public:
    MTRApplicationLauncherEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationLauncherEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationLauncherEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationLauncherEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationLauncherAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationLauncherAttributeListListAttributeCallback>
{
public:
    MTRApplicationLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationLauncherAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationLauncherAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<ApplicationLauncherAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRApplicationLauncherAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationLauncherAttributeListListAttributeCallbackBridge
{
public:
    MTRApplicationLauncherAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationLauncherAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationLauncherAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationLauncherAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationBasicApplicationStructAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationBasicApplicationStructAttributeCallback>
{
public:
    MTRApplicationBasicApplicationStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationBasicApplicationStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationBasicApplicationStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<ApplicationBasicApplicationStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::ApplicationBasic::Structs::ApplicationStruct::DecodableType & value);
};

class MTRApplicationBasicApplicationStructAttributeCallbackSubscriptionBridge
    : public MTRApplicationBasicApplicationStructAttributeCallbackBridge
{
public:
    MTRApplicationBasicApplicationStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationBasicApplicationStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationBasicApplicationStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationBasicApplicationStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationBasicAllowedVendorListListAttributeCallback>
{
public:
    MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationBasicAllowedVendorListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<ApplicationBasicAllowedVendorListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::VendorId> & value);
};

class MTRApplicationBasicAllowedVendorListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge
{
public:
    MTRApplicationBasicAllowedVendorListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationBasicAllowedVendorListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationBasicGeneratedCommandListListAttributeCallback>
{
public:
    MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationBasicGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<ApplicationBasicGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRApplicationBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRApplicationBasicGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationBasicGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationBasicAcceptedCommandListListAttributeCallback>
{
public:
    MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationBasicAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<ApplicationBasicAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRApplicationBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRApplicationBasicAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationBasicAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationBasicEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationBasicEventListListAttributeCallback>
{
public:
    MTRApplicationBasicEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationBasicEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationBasicEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<ApplicationBasicEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRApplicationBasicEventListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationBasicEventListListAttributeCallbackBridge
{
public:
    MTRApplicationBasicEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationBasicEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationBasicEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationBasicEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationBasicAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationBasicAttributeListListAttributeCallback>
{
public:
    MTRApplicationBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationBasicAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationBasicAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<ApplicationBasicAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRApplicationBasicAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRApplicationBasicAttributeListListAttributeCallbackBridge
{
public:
    MTRApplicationBasicAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationBasicAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationBasicAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationBasicAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AccountLoginGeneratedCommandListListAttributeCallback>
{
public:
    MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccountLoginGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<AccountLoginGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAccountLoginGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRAccountLoginGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccountLoginGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<AccountLoginAcceptedCommandListListAttributeCallback>
{
public:
    MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccountLoginAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<AccountLoginAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRAccountLoginAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRAccountLoginAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccountLoginAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccountLoginEventListListAttributeCallbackBridge : public MTRCallbackBridge<AccountLoginEventListListAttributeCallback>
{
public:
    MTRAccountLoginEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccountLoginEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccountLoginEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<AccountLoginEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRAccountLoginEventListListAttributeCallbackSubscriptionBridge : public MTRAccountLoginEventListListAttributeCallbackBridge
{
public:
    MTRAccountLoginEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccountLoginEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccountLoginEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccountLoginEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccountLoginAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<AccountLoginAttributeListListAttributeCallback>
{
public:
    MTRAccountLoginAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccountLoginAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccountLoginAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<AccountLoginAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRAccountLoginAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRAccountLoginAttributeListListAttributeCallbackBridge
{
public:
    MTRAccountLoginAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccountLoginAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccountLoginAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccountLoginAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ElectricalMeasurementGeneratedCommandListListAttributeCallback>
{
public:
    MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ElectricalMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<ElectricalMeasurementGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectricalMeasurementGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<ElectricalMeasurementAcceptedCommandListListAttributeCallback>
{
public:
    MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ElectricalMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<ElectricalMeasurementAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectricalMeasurementAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectricalMeasurementEventListListAttributeCallbackBridge
    : public MTRCallbackBridge<ElectricalMeasurementEventListListAttributeCallback>
{
public:
    MTRElectricalMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ElectricalMeasurementEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRElectricalMeasurementEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<ElectricalMeasurementEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRElectricalMeasurementEventListListAttributeCallbackSubscriptionBridge
    : public MTRElectricalMeasurementEventListListAttributeCallbackBridge
{
public:
    MTRElectricalMeasurementEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectricalMeasurementEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectricalMeasurementEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectricalMeasurementEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectricalMeasurementAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<ElectricalMeasurementAttributeListListAttributeCallback>
{
public:
    MTRElectricalMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ElectricalMeasurementAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRElectricalMeasurementAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<ElectricalMeasurementAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRElectricalMeasurementAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRElectricalMeasurementAttributeListListAttributeCallbackBridge
{
public:
    MTRElectricalMeasurementAttributeListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectricalMeasurementAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectricalMeasurementAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectricalMeasurementAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingBitmap8AttributeCallbackBridge : public MTRCallbackBridge<UnitTestingBitmap8AttributeCallback>
{
public:
    MTRUnitTestingBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingBitmap8AttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingBitmap8AttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value);
};

class MTRUnitTestingBitmap8AttributeCallbackSubscriptionBridge : public MTRUnitTestingBitmap8AttributeCallbackBridge
{
public:
    MTRUnitTestingBitmap8AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingBitmap8AttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingBitmap8AttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingBitmap8AttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingBitmap16AttributeCallbackBridge : public MTRCallbackBridge<UnitTestingBitmap16AttributeCallback>
{
public:
    MTRUnitTestingBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingBitmap16AttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingBitmap16AttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value);
};

class MTRUnitTestingBitmap16AttributeCallbackSubscriptionBridge : public MTRUnitTestingBitmap16AttributeCallbackBridge
{
public:
    MTRUnitTestingBitmap16AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingBitmap16AttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingBitmap16AttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingBitmap16AttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingBitmap32AttributeCallbackBridge : public MTRCallbackBridge<UnitTestingBitmap32AttributeCallback>
{
public:
    MTRUnitTestingBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingBitmap32AttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingBitmap32AttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value);
};

class MTRUnitTestingBitmap32AttributeCallbackSubscriptionBridge : public MTRUnitTestingBitmap32AttributeCallbackBridge
{
public:
    MTRUnitTestingBitmap32AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingBitmap32AttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingBitmap32AttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingBitmap32AttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingBitmap64AttributeCallbackBridge : public MTRCallbackBridge<UnitTestingBitmap64AttributeCallback>
{
public:
    MTRUnitTestingBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingBitmap64AttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingBitmap64AttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value);
};

class MTRUnitTestingBitmap64AttributeCallbackSubscriptionBridge : public MTRUnitTestingBitmap64AttributeCallbackBridge
{
public:
    MTRUnitTestingBitmap64AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action,
                                                              MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingBitmap64AttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingBitmap64AttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingBitmap64AttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingListInt8uListAttributeCallbackBridge : public MTRCallbackBridge<UnitTestingListInt8uListAttributeCallback>
{
public:
    MTRUnitTestingListInt8uListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingListInt8uListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingListInt8uListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingListInt8uListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<uint8_t> & value);
};

class MTRUnitTestingListInt8uListAttributeCallbackSubscriptionBridge : public MTRUnitTestingListInt8uListAttributeCallbackBridge
{
public:
    MTRUnitTestingListInt8uListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingListInt8uListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingListInt8uListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingListInt8uListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingListOctetStringListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingListOctetStringListAttributeCallback>
{
public:
    MTRUnitTestingListOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingListOctetStringListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingListOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingListOctetStringListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ByteSpan> & value);
};

class MTRUnitTestingListOctetStringListAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingListOctetStringListAttributeCallbackBridge
{
public:
    MTRUnitTestingListOctetStringListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingListOctetStringListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingListOctetStringListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingListOctetStringListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingListStructOctetStringListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingListStructOctetStringListAttributeCallback>
{
public:
    MTRUnitTestingListStructOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingListStructOctetStringListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingListStructOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingListStructOctetStringListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::DecodableType> &
            value);
};

class MTRUnitTestingListStructOctetStringListAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingListStructOctetStringListAttributeCallbackBridge
{
public:
    MTRUnitTestingListStructOctetStringListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingListStructOctetStringListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingListStructOctetStringListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingListStructOctetStringListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingListNullablesAndOptionalsStructListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingListNullablesAndOptionalsStructListAttributeCallback>
{
public:
    MTRUnitTestingListNullablesAndOptionalsStructListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingListNullablesAndOptionalsStructListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingListNullablesAndOptionalsStructListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingListNullablesAndOptionalsStructListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::DecodableList<
                                chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::DecodableType> & value);
};

class MTRUnitTestingListNullablesAndOptionalsStructListAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingListNullablesAndOptionalsStructListAttributeCallbackBridge
{
public:
    MTRUnitTestingListNullablesAndOptionalsStructListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingListNullablesAndOptionalsStructListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingListNullablesAndOptionalsStructListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingListNullablesAndOptionalsStructListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingStructAttrStructAttributeCallbackBridge : public MTRCallbackBridge<UnitTestingStructAttrStructAttributeCallback>
{
public:
    MTRUnitTestingStructAttrStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingStructAttrStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingStructAttrStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingStructAttrStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::UnitTesting::Structs::SimpleStruct::DecodableType & value);
};

class MTRUnitTestingStructAttrStructAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingStructAttrStructAttributeCallbackBridge
{
public:
    MTRUnitTestingStructAttrStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingStructAttrStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingStructAttrStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingStructAttrStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingListLongOctetStringListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingListLongOctetStringListAttributeCallback>
{
public:
    MTRUnitTestingListLongOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingListLongOctetStringListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingListLongOctetStringListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingListLongOctetStringListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::ByteSpan> & value);
};

class MTRUnitTestingListLongOctetStringListAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingListLongOctetStringListAttributeCallbackBridge
{
public:
    MTRUnitTestingListLongOctetStringListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingListLongOctetStringListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingListLongOctetStringListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingListLongOctetStringListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingListFabricScopedListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingListFabricScopedListAttributeCallback>
{
public:
    MTRUnitTestingListFabricScopedListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingListFabricScopedListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingListFabricScopedListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingListFabricScopedListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::DecodableList<chip::app::Clusters::UnitTesting::Structs::TestFabricScoped::DecodableType> &
            value);
};

class MTRUnitTestingListFabricScopedListAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingListFabricScopedListAttributeCallbackBridge
{
public:
    MTRUnitTestingListFabricScopedListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingListFabricScopedListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingListFabricScopedListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingListFabricScopedListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingNullableBitmap8AttributeCallbackBridge : public MTRCallbackBridge<UnitTestingNullableBitmap8AttributeCallback>
{
public:
    MTRUnitTestingNullableBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingNullableBitmap8AttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingNullableBitmap8AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingNullableBitmap8AttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> & value);
};

class MTRUnitTestingNullableBitmap8AttributeCallbackSubscriptionBridge : public MTRUnitTestingNullableBitmap8AttributeCallbackBridge
{
public:
    MTRUnitTestingNullableBitmap8AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingNullableBitmap8AttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingNullableBitmap8AttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingNullableBitmap8AttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingNullableBitmap16AttributeCallbackBridge : public MTRCallbackBridge<UnitTestingNullableBitmap16AttributeCallback>
{
public:
    MTRUnitTestingNullableBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingNullableBitmap16AttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingNullableBitmap16AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingNullableBitmap16AttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> & value);
};

class MTRUnitTestingNullableBitmap16AttributeCallbackSubscriptionBridge
    : public MTRUnitTestingNullableBitmap16AttributeCallbackBridge
{
public:
    MTRUnitTestingNullableBitmap16AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingNullableBitmap16AttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingNullableBitmap16AttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingNullableBitmap16AttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingNullableBitmap32AttributeCallbackBridge : public MTRCallbackBridge<UnitTestingNullableBitmap32AttributeCallback>
{
public:
    MTRUnitTestingNullableBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingNullableBitmap32AttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingNullableBitmap32AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingNullableBitmap32AttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> & value);
};

class MTRUnitTestingNullableBitmap32AttributeCallbackSubscriptionBridge
    : public MTRUnitTestingNullableBitmap32AttributeCallbackBridge
{
public:
    MTRUnitTestingNullableBitmap32AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingNullableBitmap32AttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingNullableBitmap32AttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingNullableBitmap32AttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingNullableBitmap64AttributeCallbackBridge : public MTRCallbackBridge<UnitTestingNullableBitmap64AttributeCallback>
{
public:
    MTRUnitTestingNullableBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingNullableBitmap64AttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingNullableBitmap64AttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingNullableBitmap64AttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> & value);
};

class MTRUnitTestingNullableBitmap64AttributeCallbackSubscriptionBridge
    : public MTRUnitTestingNullableBitmap64AttributeCallbackBridge
{
public:
    MTRUnitTestingNullableBitmap64AttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingNullableBitmap64AttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingNullableBitmap64AttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingNullableBitmap64AttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingNullableStructStructAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingNullableStructStructAttributeCallback>
{
public:
    MTRUnitTestingNullableStructStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingNullableStructStructAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingNullableStructStructAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingNullableStructStructAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::DecodableType> & value);
};

class MTRUnitTestingNullableStructStructAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingNullableStructStructAttributeCallbackBridge
{
public:
    MTRUnitTestingNullableStructStructAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingNullableStructStructAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingNullableStructStructAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingNullableStructStructAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingGeneratedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingGeneratedCommandListListAttributeCallback>
{
public:
    MTRUnitTestingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRUnitTestingGeneratedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingGeneratedCommandListListAttributeCallbackBridge
{
public:
    MTRUnitTestingGeneratedCommandListListAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingGeneratedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingAcceptedCommandListListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingAcceptedCommandListListAttributeCallback>
{
public:
    MTRUnitTestingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
};

class MTRUnitTestingAcceptedCommandListListAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingAcceptedCommandListListAttributeCallbackBridge
{
public:
    MTRUnitTestingAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingAcceptedCommandListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingEventListListAttributeCallbackBridge : public MTRCallbackBridge<UnitTestingEventListListAttributeCallback>
{
public:
    MTRUnitTestingEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRUnitTestingEventListListAttributeCallbackSubscriptionBridge : public MTRUnitTestingEventListListAttributeCallbackBridge
{
public:
    MTRUnitTestingEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action,
                                                                   MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingAttributeListListAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingAttributeListListAttributeCallback>
{
public:
    MTRUnitTestingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
};

class MTRUnitTestingAttributeListListAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingAttributeListListAttributeCallbackBridge
{
public:
    MTRUnitTestingAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingAttributeListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingAttributeListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFaultInjectionEventListListAttributeCallbackBridge : public MTRCallbackBridge<FaultInjectionEventListListAttributeCallback>
{
public:
    MTRFaultInjectionEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FaultInjectionEventListListAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFaultInjectionEventListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<FaultInjectionEventListListAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::EventId> & value);
};

class MTRFaultInjectionEventListListAttributeCallbackSubscriptionBridge
    : public MTRFaultInjectionEventListListAttributeCallbackBridge
{
public:
    MTRFaultInjectionEventListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFaultInjectionEventListListAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFaultInjectionEventListListAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFaultInjectionEventListListAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupsClusterAddGroupResponseCallbackBridge : public MTRCallbackBridge<GroupsClusterAddGroupResponseCallbackType>
{
public:
    MTRGroupsClusterAddGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupsClusterAddGroupResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRGroupsClusterAddGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<GroupsClusterAddGroupResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType & data);
};

class MTRGroupsClusterViewGroupResponseCallbackBridge : public MTRCallbackBridge<GroupsClusterViewGroupResponseCallbackType>
{
public:
    MTRGroupsClusterViewGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupsClusterViewGroupResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRGroupsClusterViewGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<GroupsClusterViewGroupResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType & data);
};

class MTRGroupsClusterGetGroupMembershipResponseCallbackBridge
    : public MTRCallbackBridge<GroupsClusterGetGroupMembershipResponseCallbackType>
{
public:
    MTRGroupsClusterGetGroupMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupsClusterGetGroupMembershipResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRGroupsClusterGetGroupMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<GroupsClusterGetGroupMembershipResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType & data);
};

class MTRGroupsClusterRemoveGroupResponseCallbackBridge : public MTRCallbackBridge<GroupsClusterRemoveGroupResponseCallbackType>
{
public:
    MTRGroupsClusterRemoveGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupsClusterRemoveGroupResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRGroupsClusterRemoveGroupResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<GroupsClusterRemoveGroupResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType & data);
};

class MTRScenesClusterAddSceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterAddSceneResponseCallbackType>
{
public:
    MTRScenesClusterAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesClusterAddSceneResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRScenesClusterAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ScenesClusterAddSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::AddSceneResponse::DecodableType & data);
};

class MTRScenesClusterViewSceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterViewSceneResponseCallbackType>
{
public:
    MTRScenesClusterViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesClusterViewSceneResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRScenesClusterViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ScenesClusterViewSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::ViewSceneResponse::DecodableType & data);
};

class MTRScenesClusterRemoveSceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterRemoveSceneResponseCallbackType>
{
public:
    MTRScenesClusterRemoveSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesClusterRemoveSceneResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRScenesClusterRemoveSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ScenesClusterRemoveSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::RemoveSceneResponse::DecodableType & data);
};

class MTRScenesClusterRemoveAllScenesResponseCallbackBridge
    : public MTRCallbackBridge<ScenesClusterRemoveAllScenesResponseCallbackType>
{
public:
    MTRScenesClusterRemoveAllScenesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesClusterRemoveAllScenesResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRScenesClusterRemoveAllScenesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ScenesClusterRemoveAllScenesResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::Scenes::Commands::RemoveAllScenesResponse::DecodableType & data);
};

class MTRScenesClusterStoreSceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterStoreSceneResponseCallbackType>
{
public:
    MTRScenesClusterStoreSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesClusterStoreSceneResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRScenesClusterStoreSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ScenesClusterStoreSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::StoreSceneResponse::DecodableType & data);
};

class MTRScenesClusterGetSceneMembershipResponseCallbackBridge
    : public MTRCallbackBridge<ScenesClusterGetSceneMembershipResponseCallbackType>
{
public:
    MTRScenesClusterGetSceneMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesClusterGetSceneMembershipResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRScenesClusterGetSceneMembershipResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<ScenesClusterGetSceneMembershipResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::Scenes::Commands::GetSceneMembershipResponse::DecodableType & data);
};

class MTRScenesClusterEnhancedAddSceneResponseCallbackBridge
    : public MTRCallbackBridge<ScenesClusterEnhancedAddSceneResponseCallbackType>
{
public:
    MTRScenesClusterEnhancedAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesClusterEnhancedAddSceneResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRScenesClusterEnhancedAddSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ScenesClusterEnhancedAddSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::Scenes::Commands::EnhancedAddSceneResponse::DecodableType & data);
};

class MTRScenesClusterEnhancedViewSceneResponseCallbackBridge
    : public MTRCallbackBridge<ScenesClusterEnhancedViewSceneResponseCallbackType>
{
public:
    MTRScenesClusterEnhancedViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesClusterEnhancedViewSceneResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRScenesClusterEnhancedViewSceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<ScenesClusterEnhancedViewSceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::Scenes::Commands::EnhancedViewSceneResponse::DecodableType & data);
};

class MTRScenesClusterCopySceneResponseCallbackBridge : public MTRCallbackBridge<ScenesClusterCopySceneResponseCallbackType>
{
public:
    MTRScenesClusterCopySceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ScenesClusterCopySceneResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRScenesClusterCopySceneResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ScenesClusterCopySceneResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::CopySceneResponse::DecodableType & data);
};

class MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType>
{
public:
    MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::QueryImageResponse::DecodableType & data);
};

class MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>
{
public:
    MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::ApplyUpdateResponse::DecodableType & data);
};

class MTRGeneralCommissioningClusterArmFailSafeResponseCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningClusterArmFailSafeResponseCallbackType>
{
public:
    MTRGeneralCommissioningClusterArmFailSafeResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningClusterArmFailSafeResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningClusterArmFailSafeResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningClusterArmFailSafeResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType & data);
};

class MTRGeneralCommissioningClusterSetRegulatoryConfigResponseCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType>
{
public:
    MTRGeneralCommissioningClusterSetRegulatoryConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningClusterSetRegulatoryConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::GeneralCommissioning::Commands::SetRegulatoryConfigResponse::DecodableType & data);
};

class MTRGeneralCommissioningClusterCommissioningCompleteResponseCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningClusterCommissioningCompleteResponseCallbackType>
{
public:
    MTRGeneralCommissioningClusterCommissioningCompleteResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningClusterCommissioningCompleteResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningClusterCommissioningCompleteResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningClusterCommissioningCompleteResponseCallbackType>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType & data);
};

class MTRNetworkCommissioningClusterScanNetworksResponseCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningClusterScanNetworksResponseCallbackType>
{
public:
    MTRNetworkCommissioningClusterScanNetworksResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningClusterScanNetworksResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningClusterScanNetworksResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningClusterScanNetworksResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::NetworkCommissioning::Commands::ScanNetworksResponse::DecodableType & data);
};

class MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningClusterNetworkConfigResponseCallbackType>
{
public:
    MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningClusterNetworkConfigResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningClusterNetworkConfigResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::NetworkCommissioning::Commands::NetworkConfigResponse::DecodableType & data);
};

class MTRNetworkCommissioningClusterConnectNetworkResponseCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningClusterConnectNetworkResponseCallbackType>
{
public:
    MTRNetworkCommissioningClusterConnectNetworkResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningClusterConnectNetworkResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningClusterConnectNetworkResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningClusterConnectNetworkResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::NetworkCommissioning::Commands::ConnectNetworkResponse::DecodableType & data);
};

class MTRDiagnosticLogsClusterRetrieveLogsResponseCallbackBridge
    : public MTRCallbackBridge<DiagnosticLogsClusterRetrieveLogsResponseCallbackType>
{
public:
    MTRDiagnosticLogsClusterRetrieveLogsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DiagnosticLogsClusterRetrieveLogsResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRDiagnosticLogsClusterRetrieveLogsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<DiagnosticLogsClusterRetrieveLogsResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::DiagnosticLogs::Commands::RetrieveLogsResponse::DecodableType & data);
};

class MTROperationalCredentialsClusterAttestationResponseCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsClusterAttestationResponseCallbackType>
{
public:
    MTROperationalCredentialsClusterAttestationResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsClusterAttestationResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsClusterAttestationResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsClusterAttestationResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::OperationalCredentials::Commands::AttestationResponse::DecodableType & data);
};

class MTROperationalCredentialsClusterCertificateChainResponseCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsClusterCertificateChainResponseCallbackType>
{
public:
    MTROperationalCredentialsClusterCertificateChainResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsClusterCertificateChainResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsClusterCertificateChainResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsClusterCertificateChainResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::OperationalCredentials::Commands::CertificateChainResponse::DecodableType & data);
};

class MTROperationalCredentialsClusterCSRResponseCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsClusterCSRResponseCallbackType>
{
public:
    MTROperationalCredentialsClusterCSRResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsClusterCSRResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsClusterCSRResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsClusterCSRResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::OperationalCredentials::Commands::CSRResponse::DecodableType & data);
};

class MTROperationalCredentialsClusterNOCResponseCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsClusterNOCResponseCallbackType>
{
public:
    MTROperationalCredentialsClusterNOCResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsClusterNOCResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsClusterNOCResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsClusterNOCResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType & data);
};

class MTRGroupKeyManagementClusterKeySetReadResponseCallbackBridge
    : public MTRCallbackBridge<GroupKeyManagementClusterKeySetReadResponseCallbackType>
{
public:
    MTRGroupKeyManagementClusterKeySetReadResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRGroupKeyManagementClusterKeySetReadResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType & data);
};

class MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackBridge
    : public MTRCallbackBridge<GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType>
{
public:
    MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadAllIndicesResponse::DecodableType & data);
};

class MTRDoorLockClusterGetWeekDayScheduleResponseCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterGetWeekDayScheduleResponseCallbackType>
{
public:
    MTRDoorLockClusterGetWeekDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterGetWeekDayScheduleResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterGetWeekDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterGetWeekDayScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType & data);
};

class MTRDoorLockClusterGetYearDayScheduleResponseCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterGetYearDayScheduleResponseCallbackType>
{
public:
    MTRDoorLockClusterGetYearDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterGetYearDayScheduleResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterGetYearDayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterGetYearDayScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType & data);
};

class MTRDoorLockClusterGetHolidayScheduleResponseCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterGetHolidayScheduleResponseCallbackType>
{
public:
    MTRDoorLockClusterGetHolidayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterGetHolidayScheduleResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterGetHolidayScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterGetHolidayScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType & data);
};

class MTRDoorLockClusterGetUserResponseCallbackBridge : public MTRCallbackBridge<DoorLockClusterGetUserResponseCallbackType>
{
public:
    MTRDoorLockClusterGetUserResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterGetUserResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterGetUserResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterGetUserResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType & data);
};

class MTRDoorLockClusterSetCredentialResponseCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterSetCredentialResponseCallbackType>
{
public:
    MTRDoorLockClusterSetCredentialResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterSetCredentialResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterSetCredentialResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterSetCredentialResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType & data);
};

class MTRDoorLockClusterGetCredentialStatusResponseCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterGetCredentialStatusResponseCallbackType>
{
public:
    MTRDoorLockClusterGetCredentialStatusResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterGetCredentialStatusResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterGetCredentialStatusResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterGetCredentialStatusResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType & data);
};

class MTRThermostatClusterGetWeeklyScheduleResponseCallbackBridge
    : public MTRCallbackBridge<ThermostatClusterGetWeeklyScheduleResponseCallbackType>
{
public:
    MTRThermostatClusterGetWeeklyScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatClusterGetWeeklyScheduleResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRThermostatClusterGetWeeklyScheduleResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<ThermostatClusterGetWeeklyScheduleResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::Thermostat::Commands::GetWeeklyScheduleResponse::DecodableType & data);
};

class MTRChannelClusterChangeChannelResponseCallbackBridge
    : public MTRCallbackBridge<ChannelClusterChangeChannelResponseCallbackType>
{
public:
    MTRChannelClusterChangeChannelResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelClusterChangeChannelResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRChannelClusterChangeChannelResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ChannelClusterChangeChannelResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::Channel::Commands::ChangeChannelResponse::DecodableType & data);
};

class MTRTargetNavigatorClusterNavigateTargetResponseCallbackBridge
    : public MTRCallbackBridge<TargetNavigatorClusterNavigateTargetResponseCallbackType>
{
public:
    MTRTargetNavigatorClusterNavigateTargetResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TargetNavigatorClusterNavigateTargetResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRTargetNavigatorClusterNavigateTargetResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<TargetNavigatorClusterNavigateTargetResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::DecodableType & data);
};

class MTRMediaPlaybackClusterPlaybackResponseCallbackBridge
    : public MTRCallbackBridge<MediaPlaybackClusterPlaybackResponseCallbackType>
{
public:
    MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaPlaybackClusterPlaybackResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<MediaPlaybackClusterPlaybackResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType & data);
};

class MTRKeypadInputClusterSendKeyResponseCallbackBridge : public MTRCallbackBridge<KeypadInputClusterSendKeyResponseCallbackType>
{
public:
    MTRKeypadInputClusterSendKeyResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<KeypadInputClusterSendKeyResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRKeypadInputClusterSendKeyResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<KeypadInputClusterSendKeyResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType & data);
};

class MTRContentLauncherClusterLauncherResponseCallbackBridge
    : public MTRCallbackBridge<ContentLauncherClusterLauncherResponseCallbackType>
{
public:
    MTRContentLauncherClusterLauncherResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ContentLauncherClusterLauncherResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRContentLauncherClusterLauncherResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<ContentLauncherClusterLauncherResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::ContentLauncher::Commands::LauncherResponse::DecodableType & data);
};

class MTRApplicationLauncherClusterLauncherResponseCallbackBridge
    : public MTRCallbackBridge<ApplicationLauncherClusterLauncherResponseCallbackType>
{
public:
    MTRApplicationLauncherClusterLauncherResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationLauncherClusterLauncherResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRApplicationLauncherClusterLauncherResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<ApplicationLauncherClusterLauncherResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType & data);
};

class MTRAccountLoginClusterGetSetupPINResponseCallbackBridge
    : public MTRCallbackBridge<AccountLoginClusterGetSetupPINResponseCallbackType>
{
public:
    MTRAccountLoginClusterGetSetupPINResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccountLoginClusterGetSetupPINResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRAccountLoginClusterGetSetupPINResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<AccountLoginClusterGetSetupPINResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::AccountLogin::Commands::GetSetupPINResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestSpecificResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestSpecificResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestSpecificResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestSpecificResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestSpecificResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestSpecificResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::UnitTesting::Commands::TestSpecificResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestAddArgumentsResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestAddArgumentsResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestAddArgumentsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestAddArgumentsResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestAddArgumentsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestAddArgumentsResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestSimpleArgumentResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestSimpleArgumentResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestSimpleArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestSimpleArgumentResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestSimpleArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestSimpleArgumentResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::UnitTesting::Commands::TestSimpleArgumentResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestStructArrayArgumentResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestStructArrayArgumentResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestStructArrayArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestStructArrayArgumentResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestStructArrayArgumentResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestStructArrayArgumentResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::UnitTesting::Commands::TestStructArrayArgumentResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestListInt8UReverseResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestListInt8UReverseResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestListInt8UReverseResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestListInt8UReverseResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestListInt8UReverseResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestListInt8UReverseResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestEnumsResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestEnumsResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestEnumsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestEnumsResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestEnumsResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestEnumsResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::UnitTesting::Commands::TestEnumsResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestNullableOptionalResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestNullableOptionalResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestNullableOptionalResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestNullableOptionalResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestComplexNullableOptionalResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestComplexNullableOptionalResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestComplexNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestComplexNullableOptionalResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestComplexNullableOptionalResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestComplexNullableOptionalResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::UnitTesting::Commands::TestComplexNullableOptionalResponse::DecodableType & data);
};

class MTRUnitTestingClusterBooleanResponseCallbackBridge : public MTRCallbackBridge<UnitTestingClusterBooleanResponseCallbackType>
{
public:
    MTRUnitTestingClusterBooleanResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterBooleanResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterBooleanResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterBooleanResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType & data);
};

class MTRUnitTestingClusterSimpleStructResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterSimpleStructResponseCallbackType>
{
public:
    MTRUnitTestingClusterSimpleStructResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterSimpleStructResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterSimpleStructResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterSimpleStructResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::UnitTesting::Commands::SimpleStructResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestEmitTestEventResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestEmitTestEventResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestEmitTestEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestEmitTestEventResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestEmitTestEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestEmitTestEventResponseCallbackType>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventResponse::DecodableType & data);
};

class MTRUnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackType>
{
public:
    MTRUnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackType>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackType>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::Clusters::UnitTesting::Commands::TestEmitTestFabricScopedEventResponse::DecodableType & data);
};

class MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge
    : public MTRCallbackBridge<IdentifyClusterIdentifyEffectIdentifierAttributeCallback>
{
public:
    MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<IdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Identify::IdentifyEffectIdentifier value);
};

class MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackSubscriptionBridge
    : public MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge
{
public:
    MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge
    : public MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectIdentifierAttributeCallback>
{
public:
    MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Identify::IdentifyEffectIdentifier> & value);
};

class MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackSubscriptionBridge
    : public MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge
{
public:
    MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableIdentifyClusterIdentifyEffectIdentifierAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge
    : public MTRCallbackBridge<IdentifyClusterIdentifyEffectVariantAttributeCallback>
{
public:
    MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<IdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Identify::IdentifyEffectVariant value);
};

class MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackSubscriptionBridge
    : public MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge
{
public:
    MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge
    : public MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectVariantAttributeCallback>
{
public:
    MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableIdentifyClusterIdentifyEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Identify::IdentifyEffectVariant> & value);
};

class MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackSubscriptionBridge
    : public MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge
{
public:
    MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableIdentifyClusterIdentifyEffectVariantAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge
    : public MTRCallbackBridge<IdentifyClusterIdentifyIdentifyTypeAttributeCallback>
{
public:
    MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<IdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Identify::IdentifyIdentifyType value);
};

class MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackSubscriptionBridge
    : public MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge
{
public:
    MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableIdentifyClusterIdentifyIdentifyTypeAttributeCallback>
{
public:
    MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableIdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableIdentifyClusterIdentifyIdentifyTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Identify::IdentifyIdentifyType> & value);
};

class MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackSubscriptionBridge
    : public MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge
{
public:
    MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableIdentifyClusterIdentifyIdentifyTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>
{
public:
    MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<OnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OnOff::OnOffDelayedAllOffEffectVariant value);
};

class MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackSubscriptionBridge
    : public MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge
{
public:
    MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>
{
public:
    MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffDelayedAllOffEffectVariant> & value);
};

class MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackSubscriptionBridge
    : public MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge
{
public:
    MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOnOffClusterOnOffDelayedAllOffEffectVariantAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffClusterOnOffDyingLightEffectVariantAttributeCallback>
{
public:
    MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<OnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OnOff::OnOffDyingLightEffectVariant value);
};

class MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackSubscriptionBridge
    : public MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge
{
public:
    MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallback>
{
public:
    MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffDyingLightEffectVariant> & value);
};

class MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackSubscriptionBridge
    : public MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge
{
public:
    MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOnOffClusterOnOffDyingLightEffectVariantAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffClusterOnOffEffectIdentifierAttributeCallback>
{
public:
    MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<OnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OnOff::OnOffEffectIdentifier value);
};

class MTROnOffClusterOnOffEffectIdentifierAttributeCallbackSubscriptionBridge
    : public MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge
{
public:
    MTROnOffClusterOnOffEffectIdentifierAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffClusterOnOffEffectIdentifierAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOnOffClusterOnOffEffectIdentifierAttributeCallback>
{
public:
    MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableOnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableOnOffClusterOnOffEffectIdentifierAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffEffectIdentifier> & value);
};

class MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackSubscriptionBridge
    : public MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge
{
public:
    MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOnOffClusterOnOffEffectIdentifierAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge
    : public MTRCallbackBridge<OnOffClusterOnOffStartUpOnOffAttributeCallback>
{
public:
    MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<OnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OnOff::OnOffStartUpOnOff value);
};

class MTROnOffClusterOnOffStartUpOnOffAttributeCallbackSubscriptionBridge
    : public MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge
{
public:
    MTROnOffClusterOnOffStartUpOnOffAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROnOffClusterOnOffStartUpOnOffAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOnOffClusterOnOffStartUpOnOffAttributeCallback>
{
public:
    MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableOnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableOnOffClusterOnOffStartUpOnOffAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> & value);
};

class MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackSubscriptionBridge
    : public MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge
{
public:
    MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOnOffClusterOnOffStartUpOnOffAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLevelControlClusterMoveModeAttributeCallbackBridge : public MTRCallbackBridge<LevelControlClusterMoveModeAttributeCallback>
{
public:
    MTRLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LevelControlClusterMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<LevelControlClusterMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::LevelControl::MoveMode value);
};

class MTRLevelControlClusterMoveModeAttributeCallbackSubscriptionBridge
    : public MTRLevelControlClusterMoveModeAttributeCallbackBridge
{
public:
    MTRLevelControlClusterMoveModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLevelControlClusterMoveModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLevelControlClusterMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLevelControlClusterMoveModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableLevelControlClusterMoveModeAttributeCallback>
{
public:
    MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableLevelControlClusterMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableLevelControlClusterMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::LevelControl::MoveMode> & value);
};

class MTRNullableLevelControlClusterMoveModeAttributeCallbackSubscriptionBridge
    : public MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge
{
public:
    MTRNullableLevelControlClusterMoveModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableLevelControlClusterMoveModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLevelControlClusterStepModeAttributeCallbackBridge : public MTRCallbackBridge<LevelControlClusterStepModeAttributeCallback>
{
public:
    MTRLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LevelControlClusterStepModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<LevelControlClusterStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::LevelControl::StepMode value);
};

class MTRLevelControlClusterStepModeAttributeCallbackSubscriptionBridge
    : public MTRLevelControlClusterStepModeAttributeCallbackBridge
{
public:
    MTRLevelControlClusterStepModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLevelControlClusterStepModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLevelControlClusterStepModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLevelControlClusterStepModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableLevelControlClusterStepModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableLevelControlClusterStepModeAttributeCallback>
{
public:
    MTRNullableLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableLevelControlClusterStepModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableLevelControlClusterStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableLevelControlClusterStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::LevelControl::StepMode> & value);
};

class MTRNullableLevelControlClusterStepModeAttributeCallbackSubscriptionBridge
    : public MTRNullableLevelControlClusterStepModeAttributeCallbackBridge
{
public:
    MTRNullableLevelControlClusterStepModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableLevelControlClusterStepModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableLevelControlClusterStepModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableLevelControlClusterStepModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<AccessControlClusterAccessControlEntryAuthModeEnumAttributeCallback>
{
public:
    MTRAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccessControlClusterAccessControlEntryAuthModeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<AccessControlClusterAccessControlEntryAuthModeEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum value);
};

class MTRAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackSubscriptionBridge
    : public MTRAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge
{
public:
    MTRAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallback>
{
public:
    MTRNullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<NullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRNullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum> & value);
};

class MTRNullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge
{
public:
    MTRNullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableAccessControlClusterAccessControlEntryAuthModeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<AccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallback>
{
public:
    MTRAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<AccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum value);
};

class MTRAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackSubscriptionBridge
    : public MTRAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge
{
public:
    MTRAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallback>
{
public:
    MTRNullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum> & value);
};

class MTRNullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge
{
public:
    MTRNullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableAccessControlClusterAccessControlEntryPrivilegeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<AccessControlClusterChangeTypeEnumAttributeCallback>
{
public:
    MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<AccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::AccessControl::ChangeTypeEnum value);
};

class MTRAccessControlClusterChangeTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge
{
public:
    MTRAccessControlClusterChangeTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAccessControlClusterChangeTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableAccessControlClusterChangeTypeEnumAttributeCallback>
{
public:
    MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableAccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableAccessControlClusterChangeTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::AccessControl::ChangeTypeEnum> & value);
};

class MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableAccessControlClusterChangeTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsClusterActionErrorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ActionsClusterActionErrorEnumAttributeCallback>
{
public:
    MTRActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsClusterActionErrorEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<ActionsClusterActionErrorEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Actions::ActionErrorEnum value);
};

class MTRActionsClusterActionErrorEnumAttributeCallbackSubscriptionBridge
    : public MTRActionsClusterActionErrorEnumAttributeCallbackBridge
{
public:
    MTRActionsClusterActionErrorEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsClusterActionErrorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsClusterActionErrorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsClusterActionErrorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableActionsClusterActionErrorEnumAttributeCallback>
{
public:
    MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableActionsClusterActionErrorEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableActionsClusterActionErrorEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::ActionErrorEnum> & value);
};

class MTRNullableActionsClusterActionErrorEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge
{
public:
    MTRNullableActionsClusterActionErrorEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableActionsClusterActionErrorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsClusterActionStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ActionsClusterActionStateEnumAttributeCallback>
{
public:
    MTRActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsClusterActionStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<ActionsClusterActionStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Actions::ActionStateEnum value);
};

class MTRActionsClusterActionStateEnumAttributeCallbackSubscriptionBridge
    : public MTRActionsClusterActionStateEnumAttributeCallbackBridge
{
public:
    MTRActionsClusterActionStateEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsClusterActionStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsClusterActionStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsClusterActionStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableActionsClusterActionStateEnumAttributeCallback>
{
public:
    MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableActionsClusterActionStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableActionsClusterActionStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::ActionStateEnum> & value);
};

class MTRNullableActionsClusterActionStateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge
{
public:
    MTRNullableActionsClusterActionStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableActionsClusterActionStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsClusterActionTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ActionsClusterActionTypeEnumAttributeCallback>
{
public:
    MTRActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsClusterActionTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ActionsClusterActionTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Actions::ActionTypeEnum value);
};

class MTRActionsClusterActionTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRActionsClusterActionTypeEnumAttributeCallbackBridge
{
public:
    MTRActionsClusterActionTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsClusterActionTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsClusterActionTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsClusterActionTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableActionsClusterActionTypeEnumAttributeCallback>
{
public:
    MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableActionsClusterActionTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableActionsClusterActionTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::ActionTypeEnum> & value);
};

class MTRNullableActionsClusterActionTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableActionsClusterActionTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableActionsClusterActionTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ActionsClusterEndpointListTypeEnumAttributeCallback>
{
public:
    MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<ActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Actions::EndpointListTypeEnum value);
};

class MTRActionsClusterEndpointListTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge
{
public:
    MTRActionsClusterEndpointListTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActionsClusterEndpointListTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableActionsClusterEndpointListTypeEnumAttributeCallback>
{
public:
    MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableActionsClusterEndpointListTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::EndpointListTypeEnum> & value);
};

class MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableActionsClusterEndpointListTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBasicInformationClusterColorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BasicInformationClusterColorEnumAttributeCallback>
{
public:
    MTRBasicInformationClusterColorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BasicInformationClusterColorEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBasicInformationClusterColorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<BasicInformationClusterColorEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BasicInformation::ColorEnum value);
};

class MTRBasicInformationClusterColorEnumAttributeCallbackSubscriptionBridge
    : public MTRBasicInformationClusterColorEnumAttributeCallbackBridge
{
public:
    MTRBasicInformationClusterColorEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBasicInformationClusterColorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBasicInformationClusterColorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBasicInformationClusterColorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBasicInformationClusterColorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBasicInformationClusterColorEnumAttributeCallback>
{
public:
    MTRNullableBasicInformationClusterColorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableBasicInformationClusterColorEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableBasicInformationClusterColorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullableBasicInformationClusterColorEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::BasicInformation::ColorEnum> & value);
};

class MTRNullableBasicInformationClusterColorEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBasicInformationClusterColorEnumAttributeCallbackBridge
{
public:
    MTRNullableBasicInformationClusterColorEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBasicInformationClusterColorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBasicInformationClusterColorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBasicInformationClusterColorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBasicInformationClusterProductFinishEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BasicInformationClusterProductFinishEnumAttributeCallback>
{
public:
    MTRBasicInformationClusterProductFinishEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BasicInformationClusterProductFinishEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBasicInformationClusterProductFinishEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<BasicInformationClusterProductFinishEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BasicInformation::ProductFinishEnum value);
};

class MTRBasicInformationClusterProductFinishEnumAttributeCallbackSubscriptionBridge
    : public MTRBasicInformationClusterProductFinishEnumAttributeCallbackBridge
{
public:
    MTRBasicInformationClusterProductFinishEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBasicInformationClusterProductFinishEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBasicInformationClusterProductFinishEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBasicInformationClusterProductFinishEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBasicInformationClusterProductFinishEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBasicInformationClusterProductFinishEnumAttributeCallback>
{
public:
    MTRNullableBasicInformationClusterProductFinishEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableBasicInformationClusterProductFinishEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableBasicInformationClusterProductFinishEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableBasicInformationClusterProductFinishEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::BasicInformation::ProductFinishEnum> & value);
};

class MTRNullableBasicInformationClusterProductFinishEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBasicInformationClusterProductFinishEnumAttributeCallbackBridge
{
public:
    MTRNullableBasicInformationClusterProductFinishEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBasicInformationClusterProductFinishEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBasicInformationClusterProductFinishEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBasicInformationClusterProductFinishEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>
{
public:
    MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction value);
};

class MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>
{
public:
    MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction> & value);
};

class MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge
    : public MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
{
public:
    MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>
{
public:
    MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol value);
};

class MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>
{
public:
    MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol> & value);
};

class MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge
    : public MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
{
public:
    MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>
{
public:
    MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus value);
};

class MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>
{
public:
    MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus> & value);
};

class MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge
    : public MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
{
public:
    MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>
{
public:
    MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason value);
};

class MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>
{
public:
    MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason> & value);
};

class MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge
    : public MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
{
public:
    MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>
{
public:
    MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum value);
};

class MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>
{
public:
    MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum> & value);
};

class MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
{
public:
    MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>
{
public:
    MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum value);
};

class MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge
    : public MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
{
public:
    MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>
{
public:
    MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum> & value);
};

class MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
{
public:
    MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TimeFormatLocalizationClusterCalendarTypeEnumAttributeCallback>
{
public:
    MTRTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeFormatLocalizationClusterCalendarTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<TimeFormatLocalizationClusterCalendarTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TimeFormatLocalization::CalendarTypeEnum value);
};

class MTRTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge
{
public:
    MTRTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallback>
{
public:
    MTRNullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::TimeFormatLocalization::CalendarTypeEnum> & value);
};

class MTRNullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTimeFormatLocalizationClusterCalendarTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TimeFormatLocalizationClusterHourFormatEnumAttributeCallback>
{
public:
    MTRTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeFormatLocalizationClusterHourFormatEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<TimeFormatLocalizationClusterHourFormatEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TimeFormatLocalization::HourFormatEnum value);
};

class MTRTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackSubscriptionBridge
    : public MTRTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge
{
public:
    MTRTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallback>
{
public:
    MTRNullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::TimeFormatLocalization::HourFormatEnum> & value);
};

class MTRNullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge
{
public:
    MTRNullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTimeFormatLocalizationClusterHourFormatEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<UnitLocalizationClusterTempUnitEnumAttributeCallback>
{
public:
    MTRUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitLocalizationClusterTempUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<UnitLocalizationClusterTempUnitEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::UnitLocalization::TempUnitEnum value);
};

class MTRUnitLocalizationClusterTempUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge
{
public:
    MTRUnitLocalizationClusterTempUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableUnitLocalizationClusterTempUnitEnumAttributeCallback>
{
public:
    MTRNullableUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableUnitLocalizationClusterTempUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableUnitLocalizationClusterTempUnitEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::UnitLocalization::TempUnitEnum> & value);
};

class MTRNullableUnitLocalizationClusterTempUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableUnitLocalizationClusterTempUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableUnitLocalizationClusterTempUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterBatApprovedChemistryEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterBatApprovedChemistryEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterBatApprovedChemistryEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatApprovedChemistryEnum value);
};

class MTRPowerSourceClusterBatApprovedChemistryEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterBatApprovedChemistryEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatApprovedChemistryEnum> & value);
};

class MTRNullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterBatApprovedChemistryEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterBatChargeFaultEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterBatChargeFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterBatChargeFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatChargeFaultEnum value);
};

class MTRPowerSourceClusterBatChargeFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterBatChargeFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterBatChargeFaultEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterBatChargeFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterBatChargeFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatChargeFaultEnum> & value);
};

class MTRNullablePowerSourceClusterBatChargeFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterBatChargeFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterBatChargeFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterBatChargeLevelEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterBatChargeLevelEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterBatChargeLevelEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatChargeLevelEnum value);
};

class MTRPowerSourceClusterBatChargeLevelEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterBatChargeLevelEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterBatChargeLevelEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterBatChargeLevelEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterBatChargeLevelEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatChargeLevelEnum> & value);
};

class MTRNullablePowerSourceClusterBatChargeLevelEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterBatChargeLevelEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterBatChargeLevelEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterBatChargeStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterBatChargeStateEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterBatChargeStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterBatChargeStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterBatChargeStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterBatChargeStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatChargeStateEnum value);
};

class MTRPowerSourceClusterBatChargeStateEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterBatChargeStateEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterBatChargeStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterBatChargeStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterBatChargeStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterBatChargeStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterBatChargeStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterBatChargeStateEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterBatChargeStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterBatChargeStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterBatChargeStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterBatChargeStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatChargeStateEnum> & value);
};

class MTRNullablePowerSourceClusterBatChargeStateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterBatChargeStateEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterBatChargeStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterBatChargeStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterBatChargeStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterBatChargeStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterBatCommonDesignationEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterBatCommonDesignationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterBatCommonDesignationEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatCommonDesignationEnum value);
};

class MTRPowerSourceClusterBatCommonDesignationEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterBatCommonDesignationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterBatCommonDesignationEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterBatCommonDesignationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterBatCommonDesignationEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatCommonDesignationEnum> & value);
};

class MTRNullablePowerSourceClusterBatCommonDesignationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterBatCommonDesignationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterBatCommonDesignationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterBatFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterBatFaultEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterBatFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterBatFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterBatFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterBatFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatFaultEnum value);
};

class MTRPowerSourceClusterBatFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterBatFaultEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterBatFaultEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterBatFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterBatFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterBatFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterBatFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterBatFaultEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterBatFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterBatFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterBatFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterBatFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatFaultEnum> & value);
};

class MTRNullablePowerSourceClusterBatFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterBatFaultEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterBatFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterBatFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterBatFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterBatFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterBatReplaceabilityEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterBatReplaceabilityEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterBatReplaceabilityEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::BatReplaceabilityEnum value);
};

class MTRPowerSourceClusterBatReplaceabilityEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterBatReplaceabilityEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterBatReplaceabilityEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterBatReplaceabilityEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterBatReplaceabilityEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::BatReplaceabilityEnum> & value);
};

class MTRNullablePowerSourceClusterBatReplaceabilityEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterBatReplaceabilityEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterBatReplaceabilityEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterPowerSourceStatusEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterPowerSourceStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterPowerSourceStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::PowerSourceStatusEnum value);
};

class MTRPowerSourceClusterPowerSourceStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterPowerSourceStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterPowerSourceStatusEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterPowerSourceStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterPowerSourceStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::PowerSourceStatusEnum> & value);
};

class MTRNullablePowerSourceClusterPowerSourceStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterPowerSourceStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterPowerSourceStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterWiredCurrentTypeEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterWiredCurrentTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterWiredCurrentTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::WiredCurrentTypeEnum value);
};

class MTRPowerSourceClusterWiredCurrentTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterWiredCurrentTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::WiredCurrentTypeEnum> & value);
};

class MTRNullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterWiredCurrentTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPowerSourceClusterWiredFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PowerSourceClusterWiredFaultEnumAttributeCallback>
{
public:
    MTRPowerSourceClusterWiredFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PowerSourceClusterWiredFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPowerSourceClusterWiredFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<PowerSourceClusterWiredFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PowerSource::WiredFaultEnum value);
};

class MTRPowerSourceClusterWiredFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRPowerSourceClusterWiredFaultEnumAttributeCallbackBridge
{
public:
    MTRPowerSourceClusterWiredFaultEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPowerSourceClusterWiredFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPowerSourceClusterWiredFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPowerSourceClusterWiredFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePowerSourceClusterWiredFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePowerSourceClusterWiredFaultEnumAttributeCallback>
{
public:
    MTRNullablePowerSourceClusterWiredFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullablePowerSourceClusterWiredFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePowerSourceClusterWiredFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullablePowerSourceClusterWiredFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::PowerSource::WiredFaultEnum> & value);
};

class MTRNullablePowerSourceClusterWiredFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePowerSourceClusterWiredFaultEnumAttributeCallbackBridge
{
public:
    MTRNullablePowerSourceClusterWiredFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePowerSourceClusterWiredFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePowerSourceClusterWiredFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePowerSourceClusterWiredFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningClusterCommissioningErrorEnumAttributeCallback>
{
public:
    MTRGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningClusterCommissioningErrorEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningClusterCommissioningErrorEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::GeneralCommissioning::CommissioningErrorEnum value);
};

class MTRGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackSubscriptionBridge
    : public MTRGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge
{
public:
    MTRGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallback>
{
public:
    MTRNullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRNullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralCommissioning::CommissioningErrorEnum> & value);
};

class MTRNullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge
{
public:
    MTRNullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableGeneralCommissioningClusterCommissioningErrorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallback>
{
public:
    MTRGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<GeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<GeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::GeneralCommissioning::RegulatoryLocationTypeEnum value);
};

class MTRGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge
{
public:
    MTRGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallback>
{
public:
    MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralCommissioning::RegulatoryLocationTypeEnum> & value);
};

class MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableGeneralCommissioningClusterRegulatoryLocationTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>
{
public:
    MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatus value);
};

class MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackSubscriptionBridge
    : public MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge
{
public:
    MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge
    : public MTRCallbackBridge<NullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>
{
public:
    MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatus> & value);
};

class MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackSubscriptionBridge
    : public MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge
{
public:
    MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableNetworkCommissioningClusterNetworkCommissioningStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge
    : public MTRCallbackBridge<NetworkCommissioningClusterWiFiBandAttributeCallback>
{
public:
    MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::NetworkCommissioning::WiFiBand value);
};

class MTRNetworkCommissioningClusterWiFiBandAttributeCallbackSubscriptionBridge
    : public MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge
{
public:
    MTRNetworkCommissioningClusterWiFiBandAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNetworkCommissioningClusterWiFiBandAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge
    : public MTRCallbackBridge<NullableNetworkCommissioningClusterWiFiBandAttributeCallback>
{
public:
    MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableNetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableNetworkCommissioningClusterWiFiBandAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::NetworkCommissioning::WiFiBand> & value);
};

class MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackSubscriptionBridge
    : public MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge
{
public:
    MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableNetworkCommissioningClusterWiFiBandAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDiagnosticLogsClusterIntentEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DiagnosticLogsClusterIntentEnumAttributeCallback>
{
public:
    MTRDiagnosticLogsClusterIntentEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DiagnosticLogsClusterIntentEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDiagnosticLogsClusterIntentEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<DiagnosticLogsClusterIntentEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DiagnosticLogs::IntentEnum value);
};

class MTRDiagnosticLogsClusterIntentEnumAttributeCallbackSubscriptionBridge
    : public MTRDiagnosticLogsClusterIntentEnumAttributeCallbackBridge
{
public:
    MTRDiagnosticLogsClusterIntentEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDiagnosticLogsClusterIntentEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDiagnosticLogsClusterIntentEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDiagnosticLogsClusterIntentEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDiagnosticLogsClusterIntentEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDiagnosticLogsClusterIntentEnumAttributeCallback>
{
public:
    MTRNullableDiagnosticLogsClusterIntentEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDiagnosticLogsClusterIntentEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDiagnosticLogsClusterIntentEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableDiagnosticLogsClusterIntentEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DiagnosticLogs::IntentEnum> & value);
};

class MTRNullableDiagnosticLogsClusterIntentEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDiagnosticLogsClusterIntentEnumAttributeCallbackBridge
{
public:
    MTRNullableDiagnosticLogsClusterIntentEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDiagnosticLogsClusterIntentEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDiagnosticLogsClusterIntentEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDiagnosticLogsClusterIntentEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDiagnosticLogsClusterStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DiagnosticLogsClusterStatusEnumAttributeCallback>
{
public:
    MTRDiagnosticLogsClusterStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DiagnosticLogsClusterStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDiagnosticLogsClusterStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<DiagnosticLogsClusterStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DiagnosticLogs::StatusEnum value);
};

class MTRDiagnosticLogsClusterStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRDiagnosticLogsClusterStatusEnumAttributeCallbackBridge
{
public:
    MTRDiagnosticLogsClusterStatusEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDiagnosticLogsClusterStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDiagnosticLogsClusterStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDiagnosticLogsClusterStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDiagnosticLogsClusterStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDiagnosticLogsClusterStatusEnumAttributeCallback>
{
public:
    MTRNullableDiagnosticLogsClusterStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDiagnosticLogsClusterStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDiagnosticLogsClusterStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableDiagnosticLogsClusterStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DiagnosticLogs::StatusEnum> & value);
};

class MTRNullableDiagnosticLogsClusterStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDiagnosticLogsClusterStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableDiagnosticLogsClusterStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDiagnosticLogsClusterStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDiagnosticLogsClusterStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDiagnosticLogsClusterStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DiagnosticLogsClusterTransferProtocolEnumAttributeCallback>
{
public:
    MTRDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DiagnosticLogsClusterTransferProtocolEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<DiagnosticLogsClusterTransferProtocolEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DiagnosticLogs::TransferProtocolEnum value);
};

class MTRDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackSubscriptionBridge
    : public MTRDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge
{
public:
    MTRDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallback>
{
public:
    MTRNullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::DiagnosticLogs::TransferProtocolEnum> & value);
};

class MTRNullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge
{
public:
    MTRNullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDiagnosticLogsClusterTransferProtocolEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsClusterBootReasonEnumAttributeCallback>
{
public:
    MTRGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsClusterBootReasonEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsClusterBootReasonEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::BootReasonEnum value);
};

class MTRGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallback>
{
public:
    MTRNullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::BootReasonEnum> & value);
};

class MTRNullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge
{
public:
    MTRNullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableGeneralDiagnosticsClusterBootReasonEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsClusterHardwareFaultEnumAttributeCallback>
{
public:
    MTRGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsClusterHardwareFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsClusterHardwareFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::HardwareFaultEnum value);
};

class MTRGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallback>
{
public:
    MTRNullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::HardwareFaultEnum> & value);
};

class MTRNullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge
{
public:
    MTRNullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableGeneralDiagnosticsClusterHardwareFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallback>
{
public:
    MTRGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::InterfaceTypeEnum value);
};

class MTRGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallback>
{
public:
    MTRNullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::InterfaceTypeEnum> & value);
};

class MTRNullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableGeneralDiagnosticsClusterInterfaceTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsClusterNetworkFaultEnumAttributeCallback>
{
public:
    MTRGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsClusterNetworkFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsClusterNetworkFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::NetworkFaultEnum value);
};

class MTRGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallback>
{
public:
    MTRNullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::NetworkFaultEnum> & value);
};

class MTRNullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge
{
public:
    MTRNullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableGeneralDiagnosticsClusterNetworkFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<GeneralDiagnosticsClusterRadioFaultEnumAttributeCallback>
{
public:
    MTRGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GeneralDiagnosticsClusterRadioFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<GeneralDiagnosticsClusterRadioFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::GeneralDiagnostics::RadioFaultEnum value);
};

class MTRGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge
{
public:
    MTRGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallback>
{
public:
    MTRNullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::GeneralDiagnostics::RadioFaultEnum> & value);
};

class MTRNullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge
{
public:
    MTRNullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableGeneralDiagnosticsClusterRadioFaultEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ThreadNetworkDiagnostics::ConnectionStatusEnum value);
};

class MTRThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>
{
public:
    MTRNullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::ConnectionStatusEnum> & value);
};

class MTRNullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableThreadNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFault value);
};

class MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge
    : public MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>
{
public:
    MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFault> & value);
};

class MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackSubscriptionBridge
    : public MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge
{
public:
    MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableThreadNetworkDiagnosticsClusterNetworkFaultAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge
    : public MTRCallbackBridge<ThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>
{
public:
    MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<ThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ThreadNetworkDiagnostics::RoutingRole value);
};

class MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackSubscriptionBridge
    : public MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge
{
public:
    MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge
    : public MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>
{
public:
    MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::RoutingRole> & value);
};

class MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackSubscriptionBridge
    : public MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge
{
public:
    MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableThreadNetworkDiagnosticsClusterRoutingRoleAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge
    : public MTRCallbackBridge<WiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallback>
{
public:
    MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::WiFiNetworkDiagnostics::AssociationFailureCauseEnum value);
};

class MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackSubscriptionBridge
    : public MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge
{
public:
    MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallback>
{
public:
    MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::AssociationFailureCauseEnum> & value);
};

class MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge
{
public:
    MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableWiFiNetworkDiagnosticsClusterAssociationFailureCauseEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<WiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>
{
public:
    MTRWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::WiFiNetworkDiagnostics::ConnectionStatusEnum value);
};

class MTRWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge
{
public:
    MTRWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>
{
public:
    MTRNullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRNullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::ConnectionStatusEnum> & value);
};

class MTRNullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableWiFiNetworkDiagnosticsClusterConnectionStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<WiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallback>
{
public:
    MTRWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum value);
};

class MTRWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge
{
public:
    MTRWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallback>
{
public:
    MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum> & value);
};

class MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableWiFiNetworkDiagnosticsClusterSecurityTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallback>
{
public:
    MTRWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<WiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum value);
};

class MTRWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackSubscriptionBridge
    : public MTRWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge
{
public:
    MTRWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallback>
{
public:
    MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum> & value);
};

class MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge
{
public:
    MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableWiFiNetworkDiagnosticsClusterWiFiVersionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<EthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallback>
{
public:
    MTREthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<EthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum value);
};

class MTREthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackSubscriptionBridge
    : public MTREthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge
{
public:
    MTREthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallback>
{
public:
    MTRNullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> & value);
};

class MTRNullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge
{
public:
    MTRNullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableEthernetNetworkDiagnosticsClusterPHYRateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TimeSynchronizationClusterGranularityEnumAttributeCallback>
{
public:
    MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<TimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TimeSynchronization::GranularityEnum value);
};

class MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackSubscriptionBridge
    : public MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge
{
public:
    MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTimeSynchronizationClusterGranularityEnumAttributeCallback>
{
public:
    MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableTimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableTimeSynchronizationClusterGranularityEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::TimeSynchronization::GranularityEnum> & value);
};

class MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge
{
public:
    MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTimeSynchronizationClusterGranularityEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TimeSynchronizationClusterTimeSourceEnumAttributeCallback>
{
public:
    MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<TimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TimeSynchronization::TimeSourceEnum value);
};

class MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackSubscriptionBridge
    : public MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge
{
public:
    MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTimeSynchronizationClusterTimeSourceEnumAttributeCallback>
{
public:
    MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableTimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableTimeSynchronizationClusterTimeSourceEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::TimeSynchronization::TimeSourceEnum> & value);
};

class MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge
{
public:
    MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTimeSynchronizationClusterTimeSourceEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BridgedDeviceBasicInformationClusterColorEnumAttributeCallback>
{
public:
    MTRBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<BridgedDeviceBasicInformationClusterColorEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<BridgedDeviceBasicInformationClusterColorEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BridgedDeviceBasicInformation::ColorEnum value);
};

class MTRBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackSubscriptionBridge
    : public MTRBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge
{
public:
    MTRBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallback>
{
public:
    MTRNullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::BridgedDeviceBasicInformation::ColorEnum> & value);
};

class MTRNullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge
{
public:
    MTRNullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBridgedDeviceBasicInformationClusterColorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallback>
{
public:
    MTRBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<BridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<BridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BridgedDeviceBasicInformation::ProductFinishEnum value);
};

class MTRBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackSubscriptionBridge
    : public MTRBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge
{
public:
    MTRBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallback>
{
public:
    MTRNullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::BridgedDeviceBasicInformation::ProductFinishEnum> & value);
};

class MTRNullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge
{
public:
    MTRNullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBridgedDeviceBasicInformationClusterProductFinishEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<AdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallback>
{
public:
    MTRAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<AdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<AdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value);
};

class MTRAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge
{
public:
    MTRAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallback>
{
public:
    MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<NullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallback>(queue, handler,
                                                                                                                   OnSuccessFn){};

    MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler,
                                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum> &
            value);
};

class MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableAdministratorCommissioningClusterCommissioningWindowStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge
    : public MTRCallbackBridge<AdministratorCommissioningClusterStatusCodeAttributeCallback>
{
public:
    MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<AdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::AdministratorCommissioning::StatusCode value);
};

class MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackSubscriptionBridge
    : public MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge
{
public:
    MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableAdministratorCommissioningClusterStatusCodeAttributeCallback>
{
public:
    MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableAdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableAdministratorCommissioningClusterStatusCodeAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::AdministratorCommissioning::StatusCode> & value);
};

class MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackSubscriptionBridge
    : public MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge
{
public:
    MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableAdministratorCommissioningClusterStatusCodeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsClusterCertificateChainTypeEnumAttributeCallback>
{
public:
    MTROperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsClusterCertificateChainTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsClusterCertificateChainTypeEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OperationalCredentials::CertificateChainTypeEnum value);
};

class MTROperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackSubscriptionBridge
    : public MTROperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge
{
public:
    MTROperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallback>
{
public:
    MTRNullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::OperationalCredentials::CertificateChainTypeEnum> & value);
};

class MTRNullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOperationalCredentialsClusterCertificateChainTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallback>
{
public:
    MTROperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<OperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTROperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<OperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OperationalCredentials::NodeOperationalCertStatusEnum value);
};

class MTROperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackSubscriptionBridge
    : public MTROperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge
{
public:
    MTROperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallback>
{
public:
    MTRNullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::OperationalCredentials::NodeOperationalCertStatusEnum> & value);
};

class MTRNullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOperationalCredentialsClusterNodeOperationalCertStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge
    : public MTRCallbackBridge<GroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallback>
{
public:
    MTRGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<GroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<GroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum value);
};

class MTRGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackSubscriptionBridge
    : public MTRGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge
{
public:
    MTRGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallback>
{
public:
    MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum> & value);
};

class MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge
{
public:
    MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableGroupKeyManagementClusterGroupKeySecurityPolicyEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAirQualityClusterAirQualityEnumAttributeCallbackBridge
    : public MTRCallbackBridge<AirQualityClusterAirQualityEnumAttributeCallback>
{
public:
    MTRAirQualityClusterAirQualityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AirQualityClusterAirQualityEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAirQualityClusterAirQualityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<AirQualityClusterAirQualityEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::AirQuality::AirQualityEnum value);
};

class MTRAirQualityClusterAirQualityEnumAttributeCallbackSubscriptionBridge
    : public MTRAirQualityClusterAirQualityEnumAttributeCallbackBridge
{
public:
    MTRAirQualityClusterAirQualityEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAirQualityClusterAirQualityEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAirQualityClusterAirQualityEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAirQualityClusterAirQualityEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableAirQualityClusterAirQualityEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableAirQualityClusterAirQualityEnumAttributeCallback>
{
public:
    MTRNullableAirQualityClusterAirQualityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableAirQualityClusterAirQualityEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableAirQualityClusterAirQualityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableAirQualityClusterAirQualityEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::AirQuality::AirQualityEnum> & value);
};

class MTRNullableAirQualityClusterAirQualityEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableAirQualityClusterAirQualityEnumAttributeCallbackBridge
{
public:
    MTRNullableAirQualityClusterAirQualityEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableAirQualityClusterAirQualityEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableAirQualityClusterAirQualityEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableAirQualityClusterAirQualityEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SmokeCOAlarmClusterAlarmStateEnumAttributeCallback>
{
public:
    MTRSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmClusterAlarmStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmClusterAlarmStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum value);
};

class MTRSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackSubscriptionBridge
    : public MTRSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallback>
{
public:
    MTRNullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum> & value);
};

class MTRNullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge
{
public:
    MTRNullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSmokeCOAlarmClusterAlarmStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SmokeCOAlarmClusterContaminationStateEnumAttributeCallback>
{
public:
    MTRSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmClusterContaminationStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmClusterContaminationStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SmokeCoAlarm::ContaminationStateEnum value);
};

class MTRSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackSubscriptionBridge
    : public MTRSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallback>
{
public:
    MTRNullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::ContaminationStateEnum> & value);
};

class MTRNullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge
{
public:
    MTRNullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSmokeCOAlarmClusterContaminationStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SmokeCOAlarmClusterEndOfServiceEnumAttributeCallback>
{
public:
    MTRSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmClusterEndOfServiceEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmClusterEndOfServiceEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SmokeCoAlarm::EndOfServiceEnum value);
};

class MTRSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackSubscriptionBridge
    : public MTRSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallback>
{
public:
    MTRNullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::EndOfServiceEnum> & value);
};

class MTRNullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge
{
public:
    MTRNullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSmokeCOAlarmClusterEndOfServiceEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SmokeCOAlarmClusterExpressedStateEnumAttributeCallback>
{
public:
    MTRSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmClusterExpressedStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmClusterExpressedStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SmokeCoAlarm::ExpressedStateEnum value);
};

class MTRSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackSubscriptionBridge
    : public MTRSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallback>
{
public:
    MTRNullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::ExpressedStateEnum> & value);
};

class MTRNullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge
{
public:
    MTRNullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSmokeCOAlarmClusterExpressedStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SmokeCOAlarmClusterMuteStateEnumAttributeCallback>
{
public:
    MTRSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmClusterMuteStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmClusterMuteStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SmokeCoAlarm::MuteStateEnum value);
};

class MTRSmokeCOAlarmClusterMuteStateEnumAttributeCallbackSubscriptionBridge
    : public MTRSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmClusterMuteStateEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSmokeCOAlarmClusterMuteStateEnumAttributeCallback>
{
public:
    MTRNullableSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterMuteStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterMuteStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::MuteStateEnum> & value);
};

class MTRNullableSmokeCOAlarmClusterMuteStateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge
{
public:
    MTRNullableSmokeCOAlarmClusterMuteStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSmokeCOAlarmClusterMuteStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SmokeCOAlarmClusterSensitivityEnumAttributeCallback>
{
public:
    MTRSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SmokeCOAlarmClusterSensitivityEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<SmokeCOAlarmClusterSensitivityEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SmokeCoAlarm::SensitivityEnum value);
};

class MTRSmokeCOAlarmClusterSensitivityEnumAttributeCallbackSubscriptionBridge
    : public MTRSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge
{
public:
    MTRSmokeCOAlarmClusterSensitivityEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSmokeCOAlarmClusterSensitivityEnumAttributeCallback>
{
public:
    MTRNullableSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterSensitivityEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableSmokeCOAlarmClusterSensitivityEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::SmokeCoAlarm::SensitivityEnum> & value);
};

class MTRNullableSmokeCOAlarmClusterSensitivityEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge
{
public:
    MTRNullableSmokeCOAlarmClusterSensitivityEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSmokeCOAlarmClusterSensitivityEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<HEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<HEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::HepaFilterMonitoring::ChangeIndicationEnum value);
};

class MTRHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<NullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::HepaFilterMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableHEPAFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<HEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<HEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::HepaFilterMonitoring::DegradationDirectionEnum value);
};

class MTRHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::HepaFilterMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableHEPAFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ActivatedCarbonFilterMonitoring::ChangeIndicationEnum value);
};

class MTRActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ActivatedCarbonFilterMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableActivatedCarbonFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<ActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ActivatedCarbonFilterMonitoring::DegradationDirectionEnum value);
};

class MTRActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<NullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                                   OnSuccessFn){};

    MTRNullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler,
                                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ActivatedCarbonFilterMonitoring::DegradationDirectionEnum> &
            value);
};

class MTRNullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableActivatedCarbonFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<CeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::CeramicFilterMonitoring::ChangeIndicationEnum value);
};

class MTRCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<NullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRNullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::CeramicFilterMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCeramicFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<CeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<CeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::CeramicFilterMonitoring::DegradationDirectionEnum value);
};

class MTRCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::CeramicFilterMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCeramicFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ElectrostaticFilterMonitoring::ChangeIndicationEnum value);
};

class MTRElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ElectrostaticFilterMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableElectrostaticFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<ElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ElectrostaticFilterMonitoring::DegradationDirectionEnum value);
};

class MTRElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ElectrostaticFilterMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableElectrostaticFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<UVFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UVFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<UVFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::UvFilterMonitoring::ChangeIndicationEnum value);
};

class MTRUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::UvFilterMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableUVFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<UVFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UVFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<UVFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::UvFilterMonitoring::DegradationDirectionEnum value);
};

class MTRUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRNullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::UvFilterMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableUVFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<IonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<IonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::IonizingFilterMonitoring::ChangeIndicationEnum value);
};

class MTRIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::IonizingFilterMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableIonizingFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<IonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<IonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<IonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::IonizingFilterMonitoring::DegradationDirectionEnum value);
};

class MTRIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<NullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRNullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::IonizingFilterMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableIonizingFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<ZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ZeoliteFilterMonitoring::ChangeIndicationEnum value);
};

class MTRZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<NullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRNullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::ZeoliteFilterMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableZeoliteFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<ZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<ZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ZeoliteFilterMonitoring::DegradationDirectionEnum value);
};

class MTRZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ZeoliteFilterMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableZeoliteFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTROzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<OzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OzoneFilterMonitoring::ChangeIndicationEnum value);
};

class MTROzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTROzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTROzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<NullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneFilterMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOzoneFilterMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTROzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<OzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<OzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OzoneFilterMonitoring::DegradationDirectionEnum value);
};

class MTROzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTROzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTROzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<NullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRNullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneFilterMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOzoneFilterMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<WaterTankMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WaterTankMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<WaterTankMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::WaterTankMonitoring::ChangeIndicationEnum value);
};

class MTRWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<NullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::WaterTankMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableWaterTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<WaterTankMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WaterTankMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<WaterTankMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::WaterTankMonitoring::DegradationDirectionEnum value);
};

class MTRWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<NullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRNullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::WaterTankMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableWaterTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FuelTankMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FuelTankMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<FuelTankMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FuelTankMonitoring::ChangeIndicationEnum value);
};

class MTRFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::FuelTankMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFuelTankMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FuelTankMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FuelTankMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<FuelTankMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FuelTankMonitoring::DegradationDirectionEnum value);
};

class MTRFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRNullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::FuelTankMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFuelTankMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<InkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<InkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<InkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::InkCartridgeMonitoring::ChangeIndicationEnum value);
};

class MTRInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRNullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::InkCartridgeMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInkCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<InkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<InkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<InkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::InkCartridgeMonitoring::DegradationDirectionEnum value);
};

class MTRInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::InkCartridgeMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableInkCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<TonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TonerCartridgeMonitoring::ChangeIndicationEnum value);
};

class MTRTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>
{
public:
    MTRNullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::TonerCartridgeMonitoring::ChangeIndicationEnum> & value);
};

class MTRNullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge
{
public:
    MTRNullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTonerCartridgeMonitoringClusterChangeIndicationEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<TonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<TonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TonerCartridgeMonitoring::DegradationDirectionEnum value);
};

class MTRTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>
{
public:
    MTRNullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<NullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRNullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::TonerCartridgeMonitoring::DegradationDirectionEnum> & value);
};

class MTRNullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge
{
public:
    MTRNullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTonerCartridgeMonitoringClusterDegradationDirectionEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterAlarmCodeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterAlarmCodeEnumAttributeCallback>
{
public:
    MTRDoorLockClusterAlarmCodeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterAlarmCodeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterAlarmCodeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterAlarmCodeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::AlarmCodeEnum value);
};

class MTRDoorLockClusterAlarmCodeEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterAlarmCodeEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterAlarmCodeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterAlarmCodeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterAlarmCodeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterAlarmCodeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterAlarmCodeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterAlarmCodeEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterAlarmCodeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterAlarmCodeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterAlarmCodeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterAlarmCodeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::AlarmCodeEnum> & value);
};

class MTRNullableDoorLockClusterAlarmCodeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterAlarmCodeEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterAlarmCodeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterAlarmCodeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterAlarmCodeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterAlarmCodeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterCredentialRuleEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterCredentialRuleEnumAttributeCallback>
{
public:
    MTRDoorLockClusterCredentialRuleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterCredentialRuleEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterCredentialRuleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterCredentialRuleEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::CredentialRuleEnum value);
};

class MTRDoorLockClusterCredentialRuleEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterCredentialRuleEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterCredentialRuleEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterCredentialRuleEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterCredentialRuleEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterCredentialRuleEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterCredentialRuleEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterCredentialRuleEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterCredentialRuleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterCredentialRuleEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterCredentialRuleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterCredentialRuleEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::CredentialRuleEnum> & value);
};

class MTRNullableDoorLockClusterCredentialRuleEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterCredentialRuleEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterCredentialRuleEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterCredentialRuleEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterCredentialRuleEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterCredentialRuleEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterCredentialTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterCredentialTypeEnumAttributeCallback>
{
public:
    MTRDoorLockClusterCredentialTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterCredentialTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterCredentialTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterCredentialTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::CredentialTypeEnum value);
};

class MTRDoorLockClusterCredentialTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterCredentialTypeEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterCredentialTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterCredentialTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterCredentialTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterCredentialTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterCredentialTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterCredentialTypeEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterCredentialTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterCredentialTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterCredentialTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterCredentialTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::CredentialTypeEnum> & value);
};

class MTRNullableDoorLockClusterCredentialTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterCredentialTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterCredentialTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterCredentialTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterCredentialTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterCredentialTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterDataOperationTypeEnumAttributeCallback>
{
public:
    MTRDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterDataOperationTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterDataOperationTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DataOperationTypeEnum value);
};

class MTRDoorLockClusterDataOperationTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterDataOperationTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterDataOperationTypeEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterDataOperationTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterDataOperationTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DataOperationTypeEnum> & value);
};

class MTRNullableDoorLockClusterDataOperationTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterDataOperationTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterDataOperationTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterDlLockStateAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlLockStateAttributeCallback>
{
public:
    MTRDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterDlLockStateAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterDlLockStateAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlLockState value);
};

class MTRDoorLockClusterDlLockStateAttributeCallbackSubscriptionBridge : public MTRDoorLockClusterDlLockStateAttributeCallbackBridge
{
public:
    MTRDoorLockClusterDlLockStateAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action,
                                                                     MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterDlLockStateAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterDlLockStateAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterDlLockStateAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterDlLockStateAttributeCallback>
{
public:
    MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterDlLockStateAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterDlLockStateAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> & value);
};

class MTRNullableDoorLockClusterDlLockStateAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterDlLockStateAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterDlLockStateAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterDlLockTypeAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlLockTypeAttributeCallback>
{
public:
    MTRDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterDlLockTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterDlLockTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlLockType value);
};

class MTRDoorLockClusterDlLockTypeAttributeCallbackSubscriptionBridge : public MTRDoorLockClusterDlLockTypeAttributeCallbackBridge
{
public:
    MTRDoorLockClusterDlLockTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterDlLockTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterDlLockTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterDlLockTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterDlLockTypeAttributeCallback>
{
public:
    MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterDlLockTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterDlLockTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockType> & value);
};

class MTRNullableDoorLockClusterDlLockTypeAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterDlLockTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterDlLockTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterDlStatusAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterDlStatusAttributeCallback>
{
public:
    MTRDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterDlStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterDlStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DlStatus value);
};

class MTRDoorLockClusterDlStatusAttributeCallbackSubscriptionBridge : public MTRDoorLockClusterDlStatusAttributeCallbackBridge
{
public:
    MTRDoorLockClusterDlStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action,
                                                                  MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterDlStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterDlStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterDlStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterDlStatusAttributeCallback>
{
public:
    MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterDlStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterDlStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlStatus> & value);
};

class MTRNullableDoorLockClusterDlStatusAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterDlStatusAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterDlStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterDoorLockOperationEventCodeAttributeCallback>
{
public:
    MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DoorLockOperationEventCode value);
};

class MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge
{
public:
    MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterDoorLockOperationEventCodeAttributeCallback>
{
public:
    MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterDoorLockOperationEventCodeAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorLockOperationEventCode> & value);
};

class MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterDoorLockOperationEventCodeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>
{
public:
    MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DoorLockProgrammingEventCode value);
};

class MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge
{
public:
    MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>
{
public:
    MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorLockProgrammingEventCode> & value);
};

class MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterDoorLockProgrammingEventCodeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>
{
public:
    MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DoorLockSetPinOrIdStatus value);
};

class MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge
{
public:
    MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>
{
public:
    MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorLockSetPinOrIdStatus> & value);
};

class MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterDoorLockSetPinOrIdStatusAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterDoorStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterDoorStateEnumAttributeCallback>
{
public:
    MTRDoorLockClusterDoorStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterDoorStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterDoorStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterDoorStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::DoorStateEnum value);
};

class MTRDoorLockClusterDoorStateEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterDoorStateEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterDoorStateEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterDoorStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterDoorStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterDoorStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterDoorStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterDoorStateEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterDoorStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterDoorStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterDoorStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterDoorStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorStateEnum> & value);
};

class MTRNullableDoorLockClusterDoorStateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterDoorStateEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterDoorStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterDoorStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterDoorStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterDoorStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterLockDataTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterLockDataTypeEnumAttributeCallback>
{
public:
    MTRDoorLockClusterLockDataTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterLockDataTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterLockDataTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterLockDataTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::LockDataTypeEnum value);
};

class MTRDoorLockClusterLockDataTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterLockDataTypeEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterLockDataTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterLockDataTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterLockDataTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterLockDataTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterLockDataTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterLockDataTypeEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterLockDataTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterLockDataTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterLockDataTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterLockDataTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::LockDataTypeEnum> & value);
};

class MTRNullableDoorLockClusterLockDataTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterLockDataTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterLockDataTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterLockDataTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterLockDataTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterLockDataTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterLockOperationTypeEnumAttributeCallback>
{
public:
    MTRDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterLockOperationTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterLockOperationTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::LockOperationTypeEnum value);
};

class MTRDoorLockClusterLockOperationTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterLockOperationTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterLockOperationTypeEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterLockOperationTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterLockOperationTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::LockOperationTypeEnum> & value);
};

class MTRNullableDoorLockClusterLockOperationTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterLockOperationTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterLockOperationTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterOperatingModeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterOperatingModeEnumAttributeCallback>
{
public:
    MTRDoorLockClusterOperatingModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterOperatingModeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterOperatingModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterOperatingModeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::OperatingModeEnum value);
};

class MTRDoorLockClusterOperatingModeEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterOperatingModeEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterOperatingModeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterOperatingModeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterOperatingModeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterOperatingModeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterOperatingModeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterOperatingModeEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterOperatingModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterOperatingModeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterOperatingModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterOperatingModeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::OperatingModeEnum> & value);
};

class MTRNullableDoorLockClusterOperatingModeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterOperatingModeEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterOperatingModeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterOperatingModeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterOperatingModeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterOperatingModeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterOperationErrorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterOperationErrorEnumAttributeCallback>
{
public:
    MTRDoorLockClusterOperationErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterOperationErrorEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterOperationErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterOperationErrorEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::OperationErrorEnum value);
};

class MTRDoorLockClusterOperationErrorEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterOperationErrorEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterOperationErrorEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterOperationErrorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterOperationErrorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterOperationErrorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterOperationErrorEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterOperationErrorEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterOperationErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterOperationErrorEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterOperationErrorEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterOperationErrorEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::OperationErrorEnum> & value);
};

class MTRNullableDoorLockClusterOperationErrorEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterOperationErrorEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterOperationErrorEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterOperationErrorEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterOperationErrorEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterOperationErrorEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterOperationSourceEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterOperationSourceEnumAttributeCallback>
{
public:
    MTRDoorLockClusterOperationSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterOperationSourceEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterOperationSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterOperationSourceEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::OperationSourceEnum value);
};

class MTRDoorLockClusterOperationSourceEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterOperationSourceEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterOperationSourceEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterOperationSourceEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterOperationSourceEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterOperationSourceEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterOperationSourceEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterOperationSourceEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterOperationSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterOperationSourceEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterOperationSourceEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterOperationSourceEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::OperationSourceEnum> & value);
};

class MTRNullableDoorLockClusterOperationSourceEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterOperationSourceEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterOperationSourceEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterOperationSourceEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterOperationSourceEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterOperationSourceEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterUserStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DoorLockClusterUserStatusEnumAttributeCallback>
{
public:
    MTRDoorLockClusterUserStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterUserStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterUserStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                            MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterUserStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::UserStatusEnum value);
};

class MTRDoorLockClusterUserStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterUserStatusEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterUserStatusEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                        MTRActionBlock action,
                                                                        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterUserStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterUserStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterUserStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterUserStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterUserStatusEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterUserStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterUserStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterUserStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterUserStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::UserStatusEnum> & value);
};

class MTRNullableDoorLockClusterUserStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterUserStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterUserStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterUserStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterUserStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterUserStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDoorLockClusterUserTypeEnumAttributeCallbackBridge : public MTRCallbackBridge<DoorLockClusterUserTypeEnumAttributeCallback>
{
public:
    MTRDoorLockClusterUserTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<DoorLockClusterUserTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRDoorLockClusterUserTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<DoorLockClusterUserTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DoorLock::UserTypeEnum value);
};

class MTRDoorLockClusterUserTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRDoorLockClusterUserTypeEnumAttributeCallbackBridge
{
public:
    MTRDoorLockClusterUserTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDoorLockClusterUserTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDoorLockClusterUserTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDoorLockClusterUserTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDoorLockClusterUserTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDoorLockClusterUserTypeEnumAttributeCallback>
{
public:
    MTRNullableDoorLockClusterUserTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableDoorLockClusterUserTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableDoorLockClusterUserTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableDoorLockClusterUserTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::UserTypeEnum> & value);
};

class MTRNullableDoorLockClusterUserTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDoorLockClusterUserTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableDoorLockClusterUserTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDoorLockClusterUserTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDoorLockClusterUserTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDoorLockClusterUserTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge
    : public MTRCallbackBridge<WindowCoveringClusterEndProductTypeAttributeCallback>
{
public:
    MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::WindowCovering::EndProductType value);
};

class MTRWindowCoveringClusterEndProductTypeAttributeCallbackSubscriptionBridge
    : public MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge
{
public:
    MTRWindowCoveringClusterEndProductTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringClusterEndProductTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableWindowCoveringClusterEndProductTypeAttributeCallback>
{
public:
    MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableWindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableWindowCoveringClusterEndProductTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::WindowCovering::EndProductType> & value);
};

class MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackSubscriptionBridge
    : public MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge
{
public:
    MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableWindowCoveringClusterEndProductTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRWindowCoveringClusterTypeAttributeCallbackBridge : public MTRCallbackBridge<WindowCoveringClusterTypeAttributeCallback>
{
public:
    MTRWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<WindowCoveringClusterTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<WindowCoveringClusterTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::WindowCovering::Type value);
};

class MTRWindowCoveringClusterTypeAttributeCallbackSubscriptionBridge : public MTRWindowCoveringClusterTypeAttributeCallbackBridge
{
public:
    MTRWindowCoveringClusterTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action,
                                                                    MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRWindowCoveringClusterTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRWindowCoveringClusterTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRWindowCoveringClusterTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableWindowCoveringClusterTypeAttributeCallback>
{
public:
    MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableWindowCoveringClusterTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableWindowCoveringClusterTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::WindowCovering::Type> & value);
};

class MTRNullableWindowCoveringClusterTypeAttributeCallbackSubscriptionBridge
    : public MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge
{
public:
    MTRNullableWindowCoveringClusterTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableWindowCoveringClusterTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PumpConfigurationAndControlClusterControlModeEnumAttributeCallback>
{
public:
    MTRPumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PumpConfigurationAndControlClusterControlModeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<PumpConfigurationAndControlClusterControlModeEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value);
};

class MTRPumpConfigurationAndControlClusterControlModeEnumAttributeCallbackSubscriptionBridge
    : public MTRPumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge
{
public:
    MTRPumpConfigurationAndControlClusterControlModeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallback>
{
public:
    MTRNullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRNullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum> & value);
};

class MTRNullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge
{
public:
    MTRNullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePumpConfigurationAndControlClusterControlModeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PumpConfigurationAndControlClusterOperationModeEnumAttributeCallback>
{
public:
    MTRPumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PumpConfigurationAndControlClusterOperationModeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<PumpConfigurationAndControlClusterOperationModeEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value);
};

class MTRPumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackSubscriptionBridge
    : public MTRPumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge
{
public:
    MTRPumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallback>
{
public:
    MTRNullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum> & value);
};

class MTRNullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge
{
public:
    MTRNullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePumpConfigurationAndControlClusterOperationModeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatClusterSetpointAdjustModeAttributeCallback>
{
public:
    MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<ThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Thermostat::SetpointAdjustMode value);
};

class MTRThermostatClusterSetpointAdjustModeAttributeCallbackSubscriptionBridge
    : public MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge
{
public:
    MTRThermostatClusterSetpointAdjustModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatClusterSetpointAdjustModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableThermostatClusterSetpointAdjustModeAttributeCallback>
{
public:
    MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableThermostatClusterSetpointAdjustModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::SetpointAdjustMode> & value);
};

class MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackSubscriptionBridge
    : public MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge
{
public:
    MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableThermostatClusterSetpointAdjustModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatClusterThermostatControlSequenceAttributeCallback>
{
public:
    MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<ThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Thermostat::ThermostatControlSequence value);
};

class MTRThermostatClusterThermostatControlSequenceAttributeCallbackSubscriptionBridge
    : public MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge
{
public:
    MTRThermostatClusterThermostatControlSequenceAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatClusterThermostatControlSequenceAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge
    : public MTRCallbackBridge<NullableThermostatClusterThermostatControlSequenceAttributeCallback>
{
public:
    MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableThermostatClusterThermostatControlSequenceAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::ThermostatControlSequence> & value);
};

class MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackSubscriptionBridge
    : public MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge
{
public:
    MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableThermostatClusterThermostatControlSequenceAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatClusterThermostatRunningModeAttributeCallback>
{
public:
    MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<ThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Thermostat::ThermostatRunningMode value);
};

class MTRThermostatClusterThermostatRunningModeAttributeCallbackSubscriptionBridge
    : public MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge
{
public:
    MTRThermostatClusterThermostatRunningModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatClusterThermostatRunningModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableThermostatClusterThermostatRunningModeAttributeCallback>
{
public:
    MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullableThermostatClusterThermostatRunningModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::ThermostatRunningMode> & value);
};

class MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackSubscriptionBridge
    : public MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge
{
public:
    MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableThermostatClusterThermostatRunningModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge
    : public MTRCallbackBridge<ThermostatClusterThermostatSystemModeAttributeCallback>
{
public:
    MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<ThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Thermostat::ThermostatSystemMode value);
};

class MTRThermostatClusterThermostatSystemModeAttributeCallbackSubscriptionBridge
    : public MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge
{
public:
    MTRThermostatClusterThermostatSystemModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRThermostatClusterThermostatSystemModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableThermostatClusterThermostatSystemModeAttributeCallback>
{
public:
    MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableThermostatClusterThermostatSystemModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Thermostat::ThermostatSystemMode> & value);
};

class MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackSubscriptionBridge
    : public MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge
{
public:
    MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableThermostatClusterThermostatSystemModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge
    : public MTRCallbackBridge<FanControlClusterFanModeSequenceTypeAttributeCallback>
{
public:
    MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<FanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FanControl::FanModeSequenceType value);
};

class MTRFanControlClusterFanModeSequenceTypeAttributeCallbackSubscriptionBridge
    : public MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge
{
public:
    MTRFanControlClusterFanModeSequenceTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFanControlClusterFanModeSequenceTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFanControlClusterFanModeSequenceTypeAttributeCallback>
{
public:
    MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableFanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableFanControlClusterFanModeSequenceTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::FanControl::FanModeSequenceType> & value);
};

class MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackSubscriptionBridge
    : public MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge
{
public:
    MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFanControlClusterFanModeSequenceTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFanControlClusterFanModeTypeAttributeCallbackBridge
    : public MTRCallbackBridge<FanControlClusterFanModeTypeAttributeCallback>
{
public:
    MTRFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FanControlClusterFanModeTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<FanControlClusterFanModeTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FanControl::FanModeType value);
};

class MTRFanControlClusterFanModeTypeAttributeCallbackSubscriptionBridge
    : public MTRFanControlClusterFanModeTypeAttributeCallbackBridge
{
public:
    MTRFanControlClusterFanModeTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFanControlClusterFanModeTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFanControlClusterFanModeTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFanControlClusterFanModeTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFanControlClusterFanModeTypeAttributeCallback>
{
public:
    MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableFanControlClusterFanModeTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableFanControlClusterFanModeTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::FanControl::FanModeType> & value);
};

class MTRNullableFanControlClusterFanModeTypeAttributeCallbackSubscriptionBridge
    : public MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge
{
public:
    MTRNullableFanControlClusterFanModeTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFanControlClusterFanModeTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlClusterColorLoopActionAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlClusterColorLoopActionAttributeCallback>
{
public:
    MTRColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlClusterColorLoopActionAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
        MTRCallbackBridge<ColorControlClusterColorLoopActionAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::ColorLoopAction value);
};

class MTRColorControlClusterColorLoopActionAttributeCallbackSubscriptionBridge
    : public MTRColorControlClusterColorLoopActionAttributeCallbackBridge
{
public:
    MTRColorControlClusterColorLoopActionAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlClusterColorLoopActionAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlClusterColorLoopActionAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlClusterColorLoopActionAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge
    : public MTRCallbackBridge<NullableColorControlClusterColorLoopActionAttributeCallback>
{
public:
    MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableColorControlClusterColorLoopActionAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableColorControlClusterColorLoopActionAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::ColorLoopAction> & value);
};

class MTRNullableColorControlClusterColorLoopActionAttributeCallbackSubscriptionBridge
    : public MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge
{
public:
    MTRNullableColorControlClusterColorLoopActionAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableColorControlClusterColorLoopActionAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlClusterColorLoopDirectionAttributeCallback>
{
public:
    MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<ColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::ColorLoopDirection value);
};

class MTRColorControlClusterColorLoopDirectionAttributeCallbackSubscriptionBridge
    : public MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge
{
public:
    MTRColorControlClusterColorLoopDirectionAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlClusterColorLoopDirectionAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge
    : public MTRCallbackBridge<NullableColorControlClusterColorLoopDirectionAttributeCallback>
{
public:
    MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableColorControlClusterColorLoopDirectionAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::ColorLoopDirection> & value);
};

class MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackSubscriptionBridge
    : public MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge
{
public:
    MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableColorControlClusterColorLoopDirectionAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlClusterColorModeAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlClusterColorModeAttributeCallback>
{
public:
    MTRColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlClusterColorModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<ColorControlClusterColorModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::ColorMode value);
};

class MTRColorControlClusterColorModeAttributeCallbackSubscriptionBridge
    : public MTRColorControlClusterColorModeAttributeCallbackBridge
{
public:
    MTRColorControlClusterColorModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlClusterColorModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlClusterColorModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlClusterColorModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableColorControlClusterColorModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableColorControlClusterColorModeAttributeCallback>
{
public:
    MTRNullableColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableColorControlClusterColorModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableColorControlClusterColorModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableColorControlClusterColorModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::ColorMode> & value);
};

class MTRNullableColorControlClusterColorModeAttributeCallbackSubscriptionBridge
    : public MTRNullableColorControlClusterColorModeAttributeCallbackBridge
{
public:
    MTRNullableColorControlClusterColorModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableColorControlClusterColorModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableColorControlClusterColorModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableColorControlClusterColorModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlClusterHueDirectionAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlClusterHueDirectionAttributeCallback>
{
public:
    MTRColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlClusterHueDirectionAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<ColorControlClusterHueDirectionAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::HueDirection value);
};

class MTRColorControlClusterHueDirectionAttributeCallbackSubscriptionBridge
    : public MTRColorControlClusterHueDirectionAttributeCallbackBridge
{
public:
    MTRColorControlClusterHueDirectionAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlClusterHueDirectionAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlClusterHueDirectionAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlClusterHueDirectionAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge
    : public MTRCallbackBridge<NullableColorControlClusterHueDirectionAttributeCallback>
{
public:
    MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableColorControlClusterHueDirectionAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableColorControlClusterHueDirectionAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::HueDirection> & value);
};

class MTRNullableColorControlClusterHueDirectionAttributeCallbackSubscriptionBridge
    : public MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge
{
public:
    MTRNullableColorControlClusterHueDirectionAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableColorControlClusterHueDirectionAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlClusterHueMoveModeAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlClusterHueMoveModeAttributeCallback>
{
public:
    MTRColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlClusterHueMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<ColorControlClusterHueMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::HueMoveMode value);
};

class MTRColorControlClusterHueMoveModeAttributeCallbackSubscriptionBridge
    : public MTRColorControlClusterHueMoveModeAttributeCallbackBridge
{
public:
    MTRColorControlClusterHueMoveModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlClusterHueMoveModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlClusterHueMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlClusterHueMoveModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableColorControlClusterHueMoveModeAttributeCallback>
{
public:
    MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableColorControlClusterHueMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableColorControlClusterHueMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::HueMoveMode> & value);
};

class MTRNullableColorControlClusterHueMoveModeAttributeCallbackSubscriptionBridge
    : public MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge
{
public:
    MTRNullableColorControlClusterHueMoveModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableColorControlClusterHueMoveModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlClusterHueStepModeAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlClusterHueStepModeAttributeCallback>
{
public:
    MTRColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlClusterHueStepModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<ColorControlClusterHueStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::HueStepMode value);
};

class MTRColorControlClusterHueStepModeAttributeCallbackSubscriptionBridge
    : public MTRColorControlClusterHueStepModeAttributeCallbackBridge
{
public:
    MTRColorControlClusterHueStepModeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlClusterHueStepModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlClusterHueStepModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlClusterHueStepModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableColorControlClusterHueStepModeAttributeCallback>
{
public:
    MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableColorControlClusterHueStepModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableColorControlClusterHueStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::HueStepMode> & value);
};

class MTRNullableColorControlClusterHueStepModeAttributeCallbackSubscriptionBridge
    : public MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge
{
public:
    MTRNullableColorControlClusterHueStepModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableColorControlClusterHueStepModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlClusterSaturationMoveModeAttributeCallback>
{
public:
    MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<ColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::SaturationMoveMode value);
};

class MTRColorControlClusterSaturationMoveModeAttributeCallbackSubscriptionBridge
    : public MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge
{
public:
    MTRColorControlClusterSaturationMoveModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlClusterSaturationMoveModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableColorControlClusterSaturationMoveModeAttributeCallback>
{
public:
    MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableColorControlClusterSaturationMoveModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::SaturationMoveMode> & value);
};

class MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackSubscriptionBridge
    : public MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge
{
public:
    MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableColorControlClusterSaturationMoveModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRColorControlClusterSaturationStepModeAttributeCallbackBridge
    : public MTRCallbackBridge<ColorControlClusterSaturationStepModeAttributeCallback>
{
public:
    MTRColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<ColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ColorControl::SaturationStepMode value);
};

class MTRColorControlClusterSaturationStepModeAttributeCallbackSubscriptionBridge
    : public MTRColorControlClusterSaturationStepModeAttributeCallbackBridge
{
public:
    MTRColorControlClusterSaturationStepModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRColorControlClusterSaturationStepModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRColorControlClusterSaturationStepModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRColorControlClusterSaturationStepModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableColorControlClusterSaturationStepModeAttributeCallback>
{
public:
    MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableColorControlClusterSaturationStepModeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ColorControl::SaturationStepMode> & value);
};

class MTRNullableColorControlClusterSaturationStepModeAttributeCallbackSubscriptionBridge
    : public MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge
{
public:
    MTRNullableColorControlClusterSaturationStepModeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableColorControlClusterSaturationStepModeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge
    : public MTRCallbackBridge<IlluminanceMeasurementClusterLightSensorTypeAttributeCallback>
{
public:
    MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<IlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<IlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::IlluminanceMeasurement::LightSensorType value);
};

class MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackSubscriptionBridge
    : public MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge
{
public:
    MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallback>
{
public:
    MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::IlluminanceMeasurement::LightSensorType> & value);
};

class MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackSubscriptionBridge
    : public MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge
{
public:
    MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableIlluminanceMeasurementClusterLightSensorTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OccupancySensingClusterOccupancySensorTypeEnumAttributeCallback>
{
public:
    MTROccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OccupancySensingClusterOccupancySensorTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action) :
        MTRCallbackBridge<OccupancySensingClusterOccupancySensorTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OccupancySensing::OccupancySensorTypeEnum value);
};

class MTROccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackSubscriptionBridge
    : public MTROccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge
{
public:
    MTROccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallback>
{
public:
    MTRNullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<NullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OccupancySensing::OccupancySensorTypeEnum> & value);
};

class MTRNullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOccupancySensingClusterOccupancySensorTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::LevelValueEnum value);
};

class MTRCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<NullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRNullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCarbonMonoxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<NullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                         ResponseHandler handler,
                                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                             action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<CarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<NullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                     OnSuccessFn){};

    MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler,
                                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCarbonMonoxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::CarbonDioxideConcentrationMeasurement::LevelValueEnum value);
};

class MTRCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonDioxideConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCarbonDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<CarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<NullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                    OnSuccessFn){};

    MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler,
                                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCarbonDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTREthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTREthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::EthyleneConcentrationMeasurement::LevelValueEnum value);
};

class MTREthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTREthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTREthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableEthyleneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTREthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTREthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTREthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTREthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTREthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableEthyleneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTREthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTREthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<EthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTREthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTREthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTREthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableEthyleneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTREthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTREthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::EthyleneOxideConcentrationMeasurement::LevelValueEnum value);
};

class MTREthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTREthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTREthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneOxideConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableEthyleneOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTREthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTREthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTREthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTREthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTREthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTREthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<EthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTREthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTREthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<EthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTREthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTREthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTREthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTREthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTREthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTREthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<NullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                    OnSuccessFn){};

    MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler,
                                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableEthyleneOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::HydrogenConcentrationMeasurement::LevelValueEnum value);
};

class MTRHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableHydrogenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableHydrogenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<HydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableHydrogenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::LevelValueEnum value);
};

class MTRHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableHydrogenSulfideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                          ResponseHandler handler,
                                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                              action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<HydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableHydrogenSulfideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::NitricOxideConcentrationMeasurement::LevelValueEnum value);
};

class MTRNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::NitricOxideConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableNitricOxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<NullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                    OnSuccessFn){};

    MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler,
                                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                  OnSuccessFn){};

    MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler,
                                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableNitricOxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::LevelValueEnum value);
};

class MTRNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableNitrogenDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                          ResponseHandler handler,
                                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                              action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableNitrogenDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTROxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<OxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OxygenConcentrationMeasurement::LevelValueEnum value);
};

class MTROxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTROxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTROxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OxygenConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTROxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<OxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTROxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<OxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTROxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTROxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTROxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTROxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<OxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<OxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTROxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTROxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTROxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTROzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<OzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<OzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OzoneConcentrationMeasurement::LevelValueEnum value);
};

class MTROzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTROzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTROzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<NullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRNullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOzoneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTROzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<OzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTROzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<OzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTROzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTROzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTROzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<NullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRNullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOzoneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTROzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<OzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTROzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<OzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTROzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<OzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTROzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTROzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTROzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTROzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTROzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTROzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<NullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRNullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableOzoneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SulfurDioxideConcentrationMeasurement::LevelValueEnum value);
};

class MTRSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::SulfurDioxideConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSulfurDioxideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<SulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<NullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                    OnSuccessFn){};

    MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler,
                                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSulfurDioxideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::LevelValueEnum value);
};

class MTRDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDissolvedOxygenConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                          ResponseHandler handler,
                                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                              action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<DissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableDissolvedOxygenConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BromateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<BromateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<BromateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BromateConcentrationMeasurement::LevelValueEnum value);
};

class MTRBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<NullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRNullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::BromateConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBromateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<BromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<BromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BromateConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<NullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRNullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::BromateConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBromateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<BromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<BromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BromateConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<NullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRNullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::BromateConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBromateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ChloraminesConcentrationMeasurement::LevelValueEnum value);
};

class MTRChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChloraminesConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChloraminesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<NullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                    OnSuccessFn){};

    MTRNullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler,
                                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChloraminesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<ChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                  OnSuccessFn){};

    MTRNullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler,
                                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChloraminesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ChlorineConcentrationMeasurement::LevelValueEnum value);
};

class MTRChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChlorineConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChlorineConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChlorineConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<ChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChlorineConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::LevelValueEnum value);
};

class MTRFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<NullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                                    OnSuccessFn){};

    MTRNullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler,
                                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::LevelValueEnum> &
            value);
};

class MTRNullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFecalColiformEColiConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                   OnSuccessFn){};

    MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler,
                                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                                 action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<FecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                           ResponseHandler handler,
                                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler,
                                                                                                               action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableFecalColiformEColiConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<FluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<FluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FluorideConcentrationMeasurement::LevelValueEnum value);
};

class MTRFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::FluorideConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFluorideConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<FluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<FluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFluorideConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<FluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<FluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFluorideConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::LevelValueEnum value);
};

class MTRHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableHaloaceticAcidsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                          ResponseHandler handler,
                                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                              action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<HaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableHaloaceticAcidsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::LevelValueEnum value);
};

class MTRTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::LevelValueEnum> &
            value);
};

class MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                     OnSuccessFn){};

    MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler,
                                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                                   action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                   OnSuccessFn){};

    MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler,
                                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<TotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler,
                                                                                                                 action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableTotalTrihalomethanesConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::LevelValueEnum value);
};

class MTRTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<NullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                         ResponseHandler handler,
                                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::LevelValueEnum> &
            value);
};

class MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler,
                                                                                                             action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                                    action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                    OnSuccessFn){};

    MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                      ResponseHandler handler,
                                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<TotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler,
                                                                                                                  action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableTotalColiformBacteriaConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TurbidityConcentrationMeasurement::LevelValueEnum value);
};

class MTRTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::TurbidityConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTurbidityConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                  OnSuccessFn){};

    MTRNullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler,
                                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTurbidityConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<TurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<NullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRNullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTurbidityConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CopperConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<CopperConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<CopperConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::CopperConcentrationMeasurement::LevelValueEnum value);
};

class MTRCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::CopperConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCopperConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<CopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<CopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::CopperConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::CopperConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCopperConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<CopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<CopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<CopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::CopperConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::CopperConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableCopperConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<LeadConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<LeadConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<LeadConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::LeadConcentrationMeasurement::LevelValueEnum value);
};

class MTRLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRNullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::LeadConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableLeadConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<LeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<LeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<LeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::LeadConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::LeadConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableLeadConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<LeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<LeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<LeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::LeadConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::LeadConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableLeadConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ManganeseConcentrationMeasurement::LevelValueEnum value);
};

class MTRManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ManganeseConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableManganeseConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                  OnSuccessFn){};

    MTRNullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler,
                                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableManganeseConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<ManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<NullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRNullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableManganeseConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<SulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<SulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SulfateConcentrationMeasurement::LevelValueEnum value);
};

class MTRSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<NullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRNullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::SulfateConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSulfateConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<SulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<SulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<NullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRNullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSulfateConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<SulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<SulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<NullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRNullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSulfateConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::LevelValueEnum value);
};

class MTRBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::LevelValueEnum> &
            value);
};

class MTRNullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBromodichloromethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                     OnSuccessFn){};

    MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler,
                                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                                   action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                   OnSuccessFn){};

    MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler,
                                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<BromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler,
                                                                                                                 action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableBromodichloromethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<BromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<BromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BromoformConcentrationMeasurement::LevelValueEnum value);
};

class MTRBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::BromoformConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBromoformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<BromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<BromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                  OnSuccessFn){};

    MTRNullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                    ResponseHandler handler,
                                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBromoformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<BromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<BromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<BromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler) :
        MTRCallbackBridge<NullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                OnSuccessFn){};

    MTRNullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                  ResponseHandler handler,
                                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableBromoformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::LevelValueEnum value);
};

class MTRChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                        ResponseHandler handler,
                                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::LevelValueEnum> &
            value);
};

class MTRNullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChlorodibromomethaneConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                     OnSuccessFn){};

    MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler,
                                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                                   action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                   OnSuccessFn){};

    MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler,
                                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<ChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<
                                chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler,
                                                                                                                 action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableChlorodibromomethaneConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ChloroformConcentrationMeasurement::LevelValueEnum value);
};

class MTRChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<NullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRNullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChloroformConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChloroformConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<NullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                   OnSuccessFn){};

    MTRNullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler,
                                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChloroformConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};

    MTRChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
        MTRCallbackBridge<ChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                 OnSuccessFn){};

    MTRNullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                   ResponseHandler handler,
                                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChloroformConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<SodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<SodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SodiumConcentrationMeasurement::LevelValueEnum value);
};

class MTRSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler) :
        MTRCallbackBridge<NullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                        OnSuccessFn){};

    MTRNullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                          ResponseHandler handler,
                                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                        OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::SodiumConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSodiumConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<SodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<SodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler) :
        MTRCallbackBridge<NullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                               OnSuccessFn){};

    MTRNullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                 ResponseHandler handler,
                                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<NullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSodiumConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<SodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<SodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<SodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableSodiumConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRPM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<PM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Pm25ConcentrationMeasurement::LevelValueEnum value);
};

class MTRPM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRPM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRPM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRNullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::Pm25ConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePM25ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRPM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<PM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<PM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRPM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRPM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRPM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePM25ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRPM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<PM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<PM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRPM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRPM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRPM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePM25ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FormaldehydeConcentrationMeasurement::LevelValueEnum value);
};

class MTRFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<NullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRNullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::FormaldehydeConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFormaldehydeConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<NullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                                     OnSuccessFn){};

    MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                       ResponseHandler handler,
                                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementMediumEnum> &
            value);
};

class MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<FormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<FormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<NullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                                   OnSuccessFn){};

    MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                     ResponseHandler handler,
                                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementUnitEnum> &
            value);
};

class MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFormaldehydeConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRPM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                               MTRActionBlock action) :
        MTRCallbackBridge<PM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Pm1ConcentrationMeasurement::LevelValueEnum value);
};

class MTRPM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRPM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRPM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<NullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::Pm1ConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePM1ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRPM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<PM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<PM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRPM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRPM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRPM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<NullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRNullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePM1ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRPM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<PM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<PM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRPM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRPM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRPM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
        MTRCallbackBridge<NullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};

    MTRNullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePM1ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRPM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<PM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
        MTRCallbackBridge<PM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                              OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Pm10ConcentrationMeasurement::LevelValueEnum value);
};

class MTRPM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRPM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRPM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<NullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRNullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<NullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::Pm10ConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePM10ConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRPM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler) :
        MTRCallbackBridge<PM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                       ResponseHandler handler,
                                                                                       MTRActionBlock action) :
        MTRCallbackBridge<PM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                     OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRPM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRPM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRPM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler) :
        MTRCallbackBridge<NullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                             OnSuccessFn){};

    MTRNullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                               ResponseHandler handler,
                                                                                               MTRActionBlock action) :
        MTRCallbackBridge<NullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                             OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePM10ConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRPM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<PM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRPM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler) :
        MTRCallbackBridge<PM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRPM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                     ResponseHandler handler,
                                                                                     MTRActionBlock action) :
        MTRCallbackBridge<PM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                   OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRPM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRPM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRPM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRPM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRPM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRPM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler) :
        MTRCallbackBridge<NullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                           OnSuccessFn){};

    MTRNullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                             ResponseHandler handler,
                                                                                             MTRActionBlock action) :
        MTRCallbackBridge<NullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                           OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullablePM10ConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                         ResponseHandler handler,
                                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::LevelValueEnum value);
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler,
                                                                                                             action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<
                    chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler,
                                                                                                                     action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler,
                                                                                                                    action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<
          NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<
            NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<
            NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<
                    chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class
    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(
            queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::
        OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<TotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler,
                                                                                                                  action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<
          NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, OnSuccessFn){};

    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<NullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<
                    chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(
            queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::
        KeepAliveOnCallback;
    using MTRNullableTotalVolatileOrganicCompoundsConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<RadonConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<RadonConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
        MTRCallbackBridge<RadonConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::RadonConcentrationMeasurement::LevelValueEnum value);
};

class MTRRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallback>
{
public:
    MTRNullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler) :
        MTRCallbackBridge<NullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler,
                                                                                                       OnSuccessFn){};

    MTRNullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                         ResponseHandler handler,
                                                                                         MTRActionBlock action) :
        MTRCallbackBridge<NullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallback>(queue, handler, action,
                                                                                                       OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::RadonConcentrationMeasurement::LevelValueEnum> & value);
};

class MTRNullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge
{
public:
    MTRNullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableRadonConcentrationMeasurementClusterLevelValueEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<RadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler) :
        MTRCallbackBridge<RadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                      OnSuccessFn){};

    MTRRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                        ResponseHandler handler,
                                                                                        MTRActionBlock action) :
        MTRCallbackBridge<RadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler, action,
                                                                                                      OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::RadonConcentrationMeasurement::MeasurementMediumEnum value);
};

class MTRRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>
{
public:
    MTRNullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler) :
        MTRCallbackBridge<NullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(queue, handler,
                                                                                                              OnSuccessFn){};

    MTRNullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                                ResponseHandler handler,
                                                                                                MTRActionBlock action) :
        MTRCallbackBridge<NullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallback>(
            queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::RadonConcentrationMeasurement::MeasurementMediumEnum> & value);
};

class MTRNullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge
{
public:
    MTRNullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableRadonConcentrationMeasurementClusterMeasurementMediumEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<RadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<RadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<RadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::RadonConcentrationMeasurement::MeasurementUnitEnum value);
};

class MTRRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>
{
public:
    MTRNullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<NullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRNullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::RadonConcentrationMeasurement::MeasurementUnitEnum> & value);
};

class MTRNullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge
{
public:
    MTRNullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableRadonConcentrationMeasurementClusterMeasurementUnitEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChannelClusterChannelStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChannelClusterChannelStatusEnumAttributeCallback>
{
public:
    MTRChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                              MTRActionBlock action) :
        MTRCallbackBridge<ChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Channel::ChannelStatusEnum value);
};

class MTRChannelClusterChannelStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRChannelClusterChannelStatusEnumAttributeCallbackBridge
{
public:
    MTRChannelClusterChannelStatusEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action,
                                                                          MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChannelClusterChannelStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChannelClusterChannelStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChannelClusterChannelStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChannelClusterChannelStatusEnumAttributeCallback>
{
public:
    MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableChannelClusterChannelStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::ChannelStatusEnum> & value);
};

class MTRNullableChannelClusterChannelStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableChannelClusterChannelStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChannelClusterChannelStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ChannelClusterLineupInfoTypeEnumAttributeCallback>
{
public:
    MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<ChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::Channel::LineupInfoTypeEnum value);
};

class MTRChannelClusterLineupInfoTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge
{
public:
    MTRChannelClusterLineupInfoTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRChannelClusterLineupInfoTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableChannelClusterLineupInfoTypeEnumAttributeCallback>
{
public:
    MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullableChannelClusterLineupInfoTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::Channel::LineupInfoTypeEnum> & value);
};

class MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableChannelClusterLineupInfoTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<TargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>
{
public:
    MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<TargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<TargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::TargetNavigator::TargetNavigatorStatusEnum value);
};

class MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge
{
public:
    MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>
{
public:
    MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<NullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<NullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::TargetNavigator::TargetNavigatorStatusEnum> & value);
};

class MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableTargetNavigatorClusterTargetNavigatorStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<MediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>
{
public:
    MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<MediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::MediaPlayback::MediaPlaybackStatusEnum value);
};

class MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge
{
public:
    MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>
{
public:
    MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
        MTRCallbackBridge<NullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::MediaPlaybackStatusEnum> & value);
};

class MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableMediaPlaybackClusterMediaPlaybackStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<MediaPlaybackClusterPlaybackStateEnumAttributeCallback>
{
public:
    MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                    MTRActionBlock action) :
        MTRCallbackBridge<MediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::MediaPlayback::PlaybackStateEnum value);
};

class MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackSubscriptionBridge
    : public MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge
{
public:
    MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableMediaPlaybackClusterPlaybackStateEnumAttributeCallback>
{
public:
    MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableMediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<NullableMediaPlaybackClusterPlaybackStateEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::PlaybackStateEnum> & value);
};

class MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge
{
public:
    MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableMediaPlaybackClusterPlaybackStateEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<MediaInputClusterInputTypeEnumAttributeCallback>
{
public:
    MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<MediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<MediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::MediaInput::InputTypeEnum value);
};

class MTRMediaInputClusterInputTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge
{
public:
    MTRMediaInputClusterInputTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRMediaInputClusterInputTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableMediaInputClusterInputTypeEnumAttributeCallback>
{
public:
    MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableMediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableMediaInputClusterInputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::MediaInput::InputTypeEnum> & value);
};

class MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableMediaInputClusterInputTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge
    : public MTRCallbackBridge<KeypadInputClusterCecKeyCodeAttributeCallback>
{
public:
    MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<KeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<KeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::KeypadInput::CecKeyCode value);
};

class MTRKeypadInputClusterCecKeyCodeAttributeCallbackSubscriptionBridge
    : public MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge
{
public:
    MTRKeypadInputClusterCecKeyCodeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRKeypadInputClusterCecKeyCodeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableKeypadInputClusterCecKeyCodeAttributeCallback>
{
public:
    MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableKeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableKeypadInputClusterCecKeyCodeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::KeypadInput::CecKeyCode> & value);
};

class MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackSubscriptionBridge
    : public MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge
{
public:
    MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableKeypadInputClusterCecKeyCodeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<KeypadInputClusterKeypadInputStatusEnumAttributeCallback>
{
public:
    MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<KeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action) :
        MTRCallbackBridge<KeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::KeypadInput::KeypadInputStatusEnum value);
};

class MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge
{
public:
    MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableKeypadInputClusterKeypadInputStatusEnumAttributeCallback>
{
public:
    MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableKeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableKeypadInputClusterKeypadInputStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::KeypadInput::KeypadInputStatusEnum> & value);
};

class MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableKeypadInputClusterKeypadInputStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ContentLauncherClusterContentLaunchStatusEnumAttributeCallback>
{
public:
    MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action) :
        MTRCallbackBridge<ContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ContentLauncher::ContentLaunchStatusEnum value);
};

class MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge
{
public:
    MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableContentLauncherClusterContentLaunchStatusEnumAttributeCallback>
{
public:
    MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
        MTRCallbackBridge<NullableContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
        MTRCallbackBridge<NullableContentLauncherClusterContentLaunchStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::ContentLauncher::ContentLaunchStatusEnum> & value);
};

class MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableContentLauncherClusterContentLaunchStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ContentLauncherClusterMetricTypeEnumAttributeCallback>
{
public:
    MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<ContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ContentLauncher::MetricTypeEnum value);
};

class MTRContentLauncherClusterMetricTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge
{
public:
    MTRContentLauncherClusterMetricTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRContentLauncherClusterMetricTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableContentLauncherClusterMetricTypeEnumAttributeCallback>
{
public:
    MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<NullableContentLauncherClusterMetricTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ContentLauncher::MetricTypeEnum> & value);
};

class MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableContentLauncherClusterMetricTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRContentLauncherClusterParameterEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ContentLauncherClusterParameterEnumAttributeCallback>
{
public:
    MTRContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                  MTRActionBlock action) :
        MTRCallbackBridge<ContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ContentLauncher::ParameterEnum value);
};

class MTRContentLauncherClusterParameterEnumAttributeCallbackSubscriptionBridge
    : public MTRContentLauncherClusterParameterEnumAttributeCallbackBridge
{
public:
    MTRContentLauncherClusterParameterEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRContentLauncherClusterParameterEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRContentLauncherClusterParameterEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRContentLauncherClusterParameterEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableContentLauncherClusterParameterEnumAttributeCallback>
{
public:
    MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
        MTRCallbackBridge<NullableContentLauncherClusterParameterEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::ContentLauncher::ParameterEnum> & value);
};

class MTRNullableContentLauncherClusterParameterEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge
{
public:
    MTRNullableContentLauncherClusterParameterEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableContentLauncherClusterParameterEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<AudioOutputClusterOutputTypeEnumAttributeCallback>
{
public:
    MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<AudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                               MTRActionBlock action) :
        MTRCallbackBridge<AudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::AudioOutput::OutputTypeEnum value);
};

class MTRAudioOutputClusterOutputTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge
{
public:
    MTRAudioOutputClusterOutputTypeEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action,
                                                                           MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRAudioOutputClusterOutputTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableAudioOutputClusterOutputTypeEnumAttributeCallback>
{
public:
    MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableAudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action) :
        MTRCallbackBridge<NullableAudioOutputClusterOutputTypeEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::AudioOutput::OutputTypeEnum> & value);
};

class MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge
{
public:
    MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableAudioOutputClusterOutputTypeEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>
{
public:
    MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
        MTRCallbackBridge<ApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
        MTRCallbackBridge<ApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ApplicationLauncher::ApplicationLauncherStatusEnum value);
};

class MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge
{
public:
    MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>
{
public:
    MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
        MTRCallbackBridge<NullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};

    MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
        MTRCallbackBridge<NullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};

    static void OnSuccessFn(
        void * context,
        const chip::app::DataModel::Nullable<chip::app::Clusters::ApplicationLauncher::ApplicationLauncherStatusEnum> & value);
};

class MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableApplicationLauncherClusterApplicationLauncherStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<ApplicationBasicClusterApplicationStatusEnumAttributeCallback>
{
public:
    MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<ApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
        MTRCallbackBridge<ApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum value);
};

class MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge
{
public:
    MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableApplicationBasicClusterApplicationStatusEnumAttributeCallback>
{
public:
    MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                   ResponseHandler handler) :
        MTRCallbackBridge<NullableApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableApplicationBasicClusterApplicationStatusEnumAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};

    static void
    OnSuccessFn(void * context,
                const chip::app::DataModel::Nullable<chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum> & value);
};

class MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge
{
public:
    MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableApplicationBasicClusterApplicationStatusEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRUnitTestingClusterSimpleEnumAttributeCallbackBridge
    : public MTRCallbackBridge<UnitTestingClusterSimpleEnumAttributeCallback>
{
public:
    MTRUnitTestingClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<UnitTestingClusterSimpleEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRUnitTestingClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
        MTRCallbackBridge<UnitTestingClusterSimpleEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::UnitTesting::SimpleEnum value);
};

class MTRUnitTestingClusterSimpleEnumAttributeCallbackSubscriptionBridge
    : public MTRUnitTestingClusterSimpleEnumAttributeCallbackBridge
{
public:
    MTRUnitTestingClusterSimpleEnumAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                       MTRActionBlock action,
                                                                       MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRUnitTestingClusterSimpleEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRUnitTestingClusterSimpleEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRUnitTestingClusterSimpleEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableUnitTestingClusterSimpleEnumAttributeCallbackBridge
    : public MTRCallbackBridge<NullableUnitTestingClusterSimpleEnumAttributeCallback>
{
public:
    MTRNullableUnitTestingClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableUnitTestingClusterSimpleEnumAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableUnitTestingClusterSimpleEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                   MTRActionBlock action) :
        MTRCallbackBridge<NullableUnitTestingClusterSimpleEnumAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> & value);
};

class MTRNullableUnitTestingClusterSimpleEnumAttributeCallbackSubscriptionBridge
    : public MTRNullableUnitTestingClusterSimpleEnumAttributeCallbackBridge
{
public:
    MTRNullableUnitTestingClusterSimpleEnumAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableUnitTestingClusterSimpleEnumAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableUnitTestingClusterSimpleEnumAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableUnitTestingClusterSimpleEnumAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge
    : public MTRCallbackBridge<FaultInjectionClusterFaultTypeAttributeCallback>
{
public:
    MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<FaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                             MTRActionBlock action) :
        MTRCallbackBridge<FaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context, chip::app::Clusters::FaultInjection::FaultType value);
};

class MTRFaultInjectionClusterFaultTypeAttributeCallbackSubscriptionBridge
    : public MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge
{
public:
    MTRFaultInjectionClusterFaultTypeAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action,
                                                                         MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRFaultInjectionClusterFaultTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};

class MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge
    : public MTRCallbackBridge<NullableFaultInjectionClusterFaultTypeAttributeCallback>
{
public:
    MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
        MTRCallbackBridge<NullableFaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, OnSuccessFn){};

    MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                     MTRActionBlock action) :
        MTRCallbackBridge<NullableFaultInjectionClusterFaultTypeAttributeCallback>(queue, handler, action, OnSuccessFn){};

    static void OnSuccessFn(void * context,
                            const chip::app::DataModel::Nullable<chip::app::Clusters::FaultInjection::FaultType> & value);
};

class MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackSubscriptionBridge
    : public MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge
{
public:
    MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackSubscriptionBridge(
        dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
        MTRSubscriptionEstablishedHandler establishedHandler) :
        MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge(queue, handler, action),
        mEstablishedHandler(establishedHandler)
    {}

    void OnSubscriptionEstablished();
    using MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge::KeepAliveOnCallback;
    using MTRNullableFaultInjectionClusterFaultTypeAttributeCallbackBridge::OnDone;

private:
    MTRSubscriptionEstablishedHandler mEstablishedHandler;
};
