/*
 *
 *    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 (*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 (*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 (*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 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 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 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;
};
