/* AUTOMATICALLY GENERATED, DO NOT MODIFY */

/*
 * schema-defined QAPI types
 *
 * Copyright IBM, Corp. 2011
 *
 * Authors:
 *  Anthony Liguori   <aliguori@us.ibm.com>
 *
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
 * See the COPYING.LIB file in the top-level directory.
 *
 */

#ifndef QAPI_TYPES_H
#define QAPI_TYPES_H

#include <stdbool.h>
#include <stdint.h>


#ifndef QAPI_TYPES_BUILTIN_STRUCT_DECL_H
#define QAPI_TYPES_BUILTIN_STRUCT_DECL_H


typedef struct strList
{
    union {
        char * value;
        uint64_t padding;
    };
    struct strList *next;
} strList;

typedef struct intList
{
    union {
        int64_t value;
        uint64_t padding;
    };
    struct intList *next;
} intList;

typedef struct numberList
{
    union {
        double value;
        uint64_t padding;
    };
    struct numberList *next;
} numberList;

typedef struct boolList
{
    union {
        bool value;
        uint64_t padding;
    };
    struct boolList *next;
} boolList;

typedef struct int8List
{
    union {
        int8_t value;
        uint64_t padding;
    };
    struct int8List *next;
} int8List;

typedef struct int16List
{
    union {
        int16_t value;
        uint64_t padding;
    };
    struct int16List *next;
} int16List;

typedef struct int32List
{
    union {
        int32_t value;
        uint64_t padding;
    };
    struct int32List *next;
} int32List;

typedef struct int64List
{
    union {
        int64_t value;
        uint64_t padding;
    };
    struct int64List *next;
} int64List;

typedef struct uint8List
{
    union {
        uint8_t value;
        uint64_t padding;
    };
    struct uint8List *next;
} uint8List;

typedef struct uint16List
{
    union {
        uint16_t value;
        uint64_t padding;
    };
    struct uint16List *next;
} uint16List;

typedef struct uint32List
{
    union {
        uint32_t value;
        uint64_t padding;
    };
    struct uint32List *next;
} uint32List;

typedef struct uint64List
{
    union {
        uint64_t value;
        uint64_t padding;
    };
    struct uint64List *next;
} uint64List;

#endif /* QAPI_TYPES_BUILTIN_STRUCT_DECL_H */


extern const char *ErrorClass_lookup[];
typedef enum ErrorClass
{
    ERROR_CLASS_GENERIC_ERROR = 0,
    ERROR_CLASS_COMMAND_NOT_FOUND = 1,
    ERROR_CLASS_DEVICE_ENCRYPTED = 2,
    ERROR_CLASS_DEVICE_NOT_ACTIVE = 3,
    ERROR_CLASS_DEVICE_NOT_FOUND = 4,
    ERROR_CLASS_K_V_M_MISSING_CAP = 5,
    ERROR_CLASS_MAX = 6,
} ErrorClass;

typedef struct ErrorClassList
{
    union {
        ErrorClass value;
        uint64_t padding;
    };
    struct ErrorClassList *next;
} ErrorClassList;


typedef struct NameInfo NameInfo;

typedef struct NameInfoList
{
    union {
        NameInfo *value;
        uint64_t padding;
    };
    struct NameInfoList *next;
} NameInfoList;


typedef struct VersionInfo VersionInfo;

typedef struct VersionInfoList
{
    union {
        VersionInfo *value;
        uint64_t padding;
    };
    struct VersionInfoList *next;
} VersionInfoList;


typedef struct KvmInfo KvmInfo;

typedef struct KvmInfoList
{
    union {
        KvmInfo *value;
        uint64_t padding;
    };
    struct KvmInfoList *next;
} KvmInfoList;

extern const char *RunState_lookup[];
typedef enum RunState
{
    RUN_STATE_DEBUG = 0,
    RUN_STATE_INMIGRATE = 1,
    RUN_STATE_INTERNAL_ERROR = 2,
    RUN_STATE_IO_ERROR = 3,
    RUN_STATE_PAUSED = 4,
    RUN_STATE_POSTMIGRATE = 5,
    RUN_STATE_PRELAUNCH = 6,
    RUN_STATE_FINISH_MIGRATE = 7,
    RUN_STATE_RESTORE_VM = 8,
    RUN_STATE_RUNNING = 9,
    RUN_STATE_SAVE_VM = 10,
    RUN_STATE_SHUTDOWN = 11,
    RUN_STATE_SUSPENDED = 12,
    RUN_STATE_WATCHDOG = 13,
    RUN_STATE_GUEST_PANICKED = 14,
    RUN_STATE_MAX = 15,
} RunState;

typedef struct RunStateList
{
    union {
        RunState value;
        uint64_t padding;
    };
    struct RunStateList *next;
} RunStateList;


typedef struct SnapshotInfo SnapshotInfo;

typedef struct SnapshotInfoList
{
    union {
        SnapshotInfo *value;
        uint64_t padding;
    };
    struct SnapshotInfoList *next;
} SnapshotInfoList;


typedef struct ImageInfoSpecificQCow2 ImageInfoSpecificQCow2;

typedef struct ImageInfoSpecificQCow2List
{
    union {
        ImageInfoSpecificQCow2 *value;
        uint64_t padding;
    };
    struct ImageInfoSpecificQCow2List *next;
} ImageInfoSpecificQCow2List;


typedef struct ImageInfoSpecificVmdk ImageInfoSpecificVmdk;

typedef struct ImageInfoSpecificVmdkList
{
    union {
        ImageInfoSpecificVmdk *value;
        uint64_t padding;
    };
    struct ImageInfoSpecificVmdkList *next;
} ImageInfoSpecificVmdkList;


typedef struct ImageInfoSpecific ImageInfoSpecific;

typedef struct ImageInfoSpecificList
{
    union {
        ImageInfoSpecific *value;
        uint64_t padding;
    };
    struct ImageInfoSpecificList *next;
} ImageInfoSpecificList;

extern const char *ImageInfoSpecificKind_lookup[];
typedef enum ImageInfoSpecificKind
{
    IMAGE_INFO_SPECIFIC_KIND_QCOW2 = 0,
    IMAGE_INFO_SPECIFIC_KIND_VMDK = 1,
    IMAGE_INFO_SPECIFIC_KIND_MAX = 2,
} ImageInfoSpecificKind;


typedef struct ImageInfo ImageInfo;

typedef struct ImageInfoList
{
    union {
        ImageInfo *value;
        uint64_t padding;
    };
    struct ImageInfoList *next;
} ImageInfoList;


typedef struct ImageCheck ImageCheck;

typedef struct ImageCheckList
{
    union {
        ImageCheck *value;
        uint64_t padding;
    };
    struct ImageCheckList *next;
} ImageCheckList;


typedef struct StatusInfo StatusInfo;

typedef struct StatusInfoList
{
    union {
        StatusInfo *value;
        uint64_t padding;
    };
    struct StatusInfoList *next;
} StatusInfoList;


typedef struct UuidInfo UuidInfo;

typedef struct UuidInfoList
{
    union {
        UuidInfo *value;
        uint64_t padding;
    };
    struct UuidInfoList *next;
} UuidInfoList;


typedef struct ChardevInfo ChardevInfo;

typedef struct ChardevInfoList
{
    union {
        ChardevInfo *value;
        uint64_t padding;
    };
    struct ChardevInfoList *next;
} ChardevInfoList;

extern const char *DataFormat_lookup[];
typedef enum DataFormat
{
    DATA_FORMAT_UTF8 = 0,
    DATA_FORMAT_BASE64 = 1,
    DATA_FORMAT_MAX = 2,
} DataFormat;

typedef struct DataFormatList
{
    union {
        DataFormat value;
        uint64_t padding;
    };
    struct DataFormatList *next;
} DataFormatList;


typedef struct CommandInfo CommandInfo;

typedef struct CommandInfoList
{
    union {
        CommandInfo *value;
        uint64_t padding;
    };
    struct CommandInfoList *next;
} CommandInfoList;


typedef struct EventInfo EventInfo;

typedef struct EventInfoList
{
    union {
        EventInfo *value;
        uint64_t padding;
    };
    struct EventInfoList *next;
} EventInfoList;


typedef struct MigrationStats MigrationStats;

typedef struct MigrationStatsList
{
    union {
        MigrationStats *value;
        uint64_t padding;
    };
    struct MigrationStatsList *next;
} MigrationStatsList;


typedef struct XBZRLECacheStats XBZRLECacheStats;

typedef struct XBZRLECacheStatsList
{
    union {
        XBZRLECacheStats *value;
        uint64_t padding;
    };
    struct XBZRLECacheStatsList *next;
} XBZRLECacheStatsList;


typedef struct MigrationInfo MigrationInfo;

typedef struct MigrationInfoList
{
    union {
        MigrationInfo *value;
        uint64_t padding;
    };
    struct MigrationInfoList *next;
} MigrationInfoList;

extern const char *MigrationCapability_lookup[];
typedef enum MigrationCapability
{
    MIGRATION_CAPABILITY_XBZRLE = 0,
    MIGRATION_CAPABILITY_X_RDMA_PIN_ALL = 1,
    MIGRATION_CAPABILITY_AUTO_CONVERGE = 2,
    MIGRATION_CAPABILITY_ZERO_BLOCKS = 3,
    MIGRATION_CAPABILITY_MAX = 4,
} MigrationCapability;

typedef struct MigrationCapabilityList
{
    union {
        MigrationCapability value;
        uint64_t padding;
    };
    struct MigrationCapabilityList *next;
} MigrationCapabilityList;


typedef struct MigrationCapabilityStatus MigrationCapabilityStatus;

typedef struct MigrationCapabilityStatusList
{
    union {
        MigrationCapabilityStatus *value;
        uint64_t padding;
    };
    struct MigrationCapabilityStatusList *next;
} MigrationCapabilityStatusList;


typedef struct MouseInfo MouseInfo;

typedef struct MouseInfoList
{
    union {
        MouseInfo *value;
        uint64_t padding;
    };
    struct MouseInfoList *next;
} MouseInfoList;


typedef struct CpuInfo CpuInfo;

typedef struct CpuInfoList
{
    union {
        CpuInfo *value;
        uint64_t padding;
    };
    struct CpuInfoList *next;
} CpuInfoList;


typedef struct BlockDeviceInfo BlockDeviceInfo;

typedef struct BlockDeviceInfoList
{
    union {
        BlockDeviceInfo *value;
        uint64_t padding;
    };
    struct BlockDeviceInfoList *next;
} BlockDeviceInfoList;

extern const char *BlockDeviceIoStatus_lookup[];
typedef enum BlockDeviceIoStatus
{
    BLOCK_DEVICE_IO_STATUS_OK = 0,
    BLOCK_DEVICE_IO_STATUS_FAILED = 1,
    BLOCK_DEVICE_IO_STATUS_NOSPACE = 2,
    BLOCK_DEVICE_IO_STATUS_MAX = 3,
} BlockDeviceIoStatus;

typedef struct BlockDeviceIoStatusList
{
    union {
        BlockDeviceIoStatus value;
        uint64_t padding;
    };
    struct BlockDeviceIoStatusList *next;
} BlockDeviceIoStatusList;


typedef struct BlockDeviceMapEntry BlockDeviceMapEntry;

typedef struct BlockDeviceMapEntryList
{
    union {
        BlockDeviceMapEntry *value;
        uint64_t padding;
    };
    struct BlockDeviceMapEntryList *next;
} BlockDeviceMapEntryList;


typedef struct BlockDirtyInfo BlockDirtyInfo;

typedef struct BlockDirtyInfoList
{
    union {
        BlockDirtyInfo *value;
        uint64_t padding;
    };
    struct BlockDirtyInfoList *next;
} BlockDirtyInfoList;


typedef struct BlockInfo BlockInfo;

typedef struct BlockInfoList
{
    union {
        BlockInfo *value;
        uint64_t padding;
    };
    struct BlockInfoList *next;
} BlockInfoList;


typedef struct BlockDeviceStats BlockDeviceStats;

typedef struct BlockDeviceStatsList
{
    union {
        BlockDeviceStats *value;
        uint64_t padding;
    };
    struct BlockDeviceStatsList *next;
} BlockDeviceStatsList;


typedef struct BlockStats BlockStats;

typedef struct BlockStatsList
{
    union {
        BlockStats *value;
        uint64_t padding;
    };
    struct BlockStatsList *next;
} BlockStatsList;


typedef struct VncClientInfo VncClientInfo;

typedef struct VncClientInfoList
{
    union {
        VncClientInfo *value;
        uint64_t padding;
    };
    struct VncClientInfoList *next;
} VncClientInfoList;


typedef struct VncInfo VncInfo;

typedef struct VncInfoList
{
    union {
        VncInfo *value;
        uint64_t padding;
    };
    struct VncInfoList *next;
} VncInfoList;


typedef struct SpiceChannel SpiceChannel;

typedef struct SpiceChannelList
{
    union {
        SpiceChannel *value;
        uint64_t padding;
    };
    struct SpiceChannelList *next;
} SpiceChannelList;

extern const char *SpiceQueryMouseMode_lookup[];
typedef enum SpiceQueryMouseMode
{
    SPICE_QUERY_MOUSE_MODE_CLIENT = 0,
    SPICE_QUERY_MOUSE_MODE_SERVER = 1,
    SPICE_QUERY_MOUSE_MODE_UNKNOWN = 2,
    SPICE_QUERY_MOUSE_MODE_MAX = 3,
} SpiceQueryMouseMode;

typedef struct SpiceQueryMouseModeList
{
    union {
        SpiceQueryMouseMode value;
        uint64_t padding;
    };
    struct SpiceQueryMouseModeList *next;
} SpiceQueryMouseModeList;


typedef struct SpiceInfo SpiceInfo;

typedef struct SpiceInfoList
{
    union {
        SpiceInfo *value;
        uint64_t padding;
    };
    struct SpiceInfoList *next;
} SpiceInfoList;


typedef struct BalloonInfo BalloonInfo;

typedef struct BalloonInfoList
{
    union {
        BalloonInfo *value;
        uint64_t padding;
    };
    struct BalloonInfoList *next;
} BalloonInfoList;


typedef struct PciMemoryRange PciMemoryRange;

typedef struct PciMemoryRangeList
{
    union {
        PciMemoryRange *value;
        uint64_t padding;
    };
    struct PciMemoryRangeList *next;
} PciMemoryRangeList;


typedef struct PciMemoryRegion PciMemoryRegion;

typedef struct PciMemoryRegionList
{
    union {
        PciMemoryRegion *value;
        uint64_t padding;
    };
    struct PciMemoryRegionList *next;
} PciMemoryRegionList;


typedef struct PciBridgeInfo PciBridgeInfo;

typedef struct PciBridgeInfoList
{
    union {
        PciBridgeInfo *value;
        uint64_t padding;
    };
    struct PciBridgeInfoList *next;
} PciBridgeInfoList;


typedef struct PciDeviceInfo PciDeviceInfo;

typedef struct PciDeviceInfoList
{
    union {
        PciDeviceInfo *value;
        uint64_t padding;
    };
    struct PciDeviceInfoList *next;
} PciDeviceInfoList;


typedef struct PciInfo PciInfo;

typedef struct PciInfoList
{
    union {
        PciInfo *value;
        uint64_t padding;
    };
    struct PciInfoList *next;
} PciInfoList;

extern const char *BlockdevOnError_lookup[];
typedef enum BlockdevOnError
{
    BLOCKDEV_ON_ERROR_REPORT = 0,
    BLOCKDEV_ON_ERROR_IGNORE = 1,
    BLOCKDEV_ON_ERROR_ENOSPC = 2,
    BLOCKDEV_ON_ERROR_STOP = 3,
    BLOCKDEV_ON_ERROR_MAX = 4,
} BlockdevOnError;

typedef struct BlockdevOnErrorList
{
    union {
        BlockdevOnError value;
        uint64_t padding;
    };
    struct BlockdevOnErrorList *next;
} BlockdevOnErrorList;

extern const char *MirrorSyncMode_lookup[];
typedef enum MirrorSyncMode
{
    MIRROR_SYNC_MODE_TOP = 0,
    MIRROR_SYNC_MODE_FULL = 1,
    MIRROR_SYNC_MODE_NONE = 2,
    MIRROR_SYNC_MODE_MAX = 3,
} MirrorSyncMode;

typedef struct MirrorSyncModeList
{
    union {
        MirrorSyncMode value;
        uint64_t padding;
    };
    struct MirrorSyncModeList *next;
} MirrorSyncModeList;

extern const char *BlockJobType_lookup[];
typedef enum BlockJobType
{
    BLOCK_JOB_TYPE_COMMIT = 0,
    BLOCK_JOB_TYPE_STREAM = 1,
    BLOCK_JOB_TYPE_MIRROR = 2,
    BLOCK_JOB_TYPE_BACKUP = 3,
    BLOCK_JOB_TYPE_MAX = 4,
} BlockJobType;

typedef struct BlockJobTypeList
{
    union {
        BlockJobType value;
        uint64_t padding;
    };
    struct BlockJobTypeList *next;
} BlockJobTypeList;


typedef struct BlockJobInfo BlockJobInfo;

typedef struct BlockJobInfoList
{
    union {
        BlockJobInfo *value;
        uint64_t padding;
    };
    struct BlockJobInfoList *next;
} BlockJobInfoList;

extern const char *NewImageMode_lookup[];
typedef enum NewImageMode
{
    NEW_IMAGE_MODE_EXISTING = 0,
    NEW_IMAGE_MODE_ABSOLUTE_PATHS = 1,
    NEW_IMAGE_MODE_MAX = 2,
} NewImageMode;

typedef struct NewImageModeList
{
    union {
        NewImageMode value;
        uint64_t padding;
    };
    struct NewImageModeList *next;
} NewImageModeList;


typedef struct BlockdevSnapshot BlockdevSnapshot;

typedef struct BlockdevSnapshotList
{
    union {
        BlockdevSnapshot *value;
        uint64_t padding;
    };
    struct BlockdevSnapshotList *next;
} BlockdevSnapshotList;


typedef struct BlockdevSnapshotInternal BlockdevSnapshotInternal;

typedef struct BlockdevSnapshotInternalList
{
    union {
        BlockdevSnapshotInternal *value;
        uint64_t padding;
    };
    struct BlockdevSnapshotInternalList *next;
} BlockdevSnapshotInternalList;


typedef struct DriveBackup DriveBackup;

typedef struct DriveBackupList
{
    union {
        DriveBackup *value;
        uint64_t padding;
    };
    struct DriveBackupList *next;
} DriveBackupList;


typedef struct Abort Abort;

typedef struct AbortList
{
    union {
        Abort *value;
        uint64_t padding;
    };
    struct AbortList *next;
} AbortList;


typedef struct TransactionAction TransactionAction;

typedef struct TransactionActionList
{
    union {
        TransactionAction *value;
        uint64_t padding;
    };
    struct TransactionActionList *next;
} TransactionActionList;

extern const char *TransactionActionKind_lookup[];
typedef enum TransactionActionKind
{
    TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC = 0,
    TRANSACTION_ACTION_KIND_DRIVE_BACKUP = 1,
    TRANSACTION_ACTION_KIND_ABORT = 2,
    TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC = 3,
    TRANSACTION_ACTION_KIND_MAX = 4,
} TransactionActionKind;


typedef struct ObjectPropertyInfo ObjectPropertyInfo;

typedef struct ObjectPropertyInfoList
{
    union {
        ObjectPropertyInfo *value;
        uint64_t padding;
    };
    struct ObjectPropertyInfoList *next;
} ObjectPropertyInfoList;


typedef struct ObjectTypeInfo ObjectTypeInfo;

typedef struct ObjectTypeInfoList
{
    union {
        ObjectTypeInfo *value;
        uint64_t padding;
    };
    struct ObjectTypeInfoList *next;
} ObjectTypeInfoList;


typedef struct DevicePropertyInfo DevicePropertyInfo;

typedef struct DevicePropertyInfoList
{
    union {
        DevicePropertyInfo *value;
        uint64_t padding;
    };
    struct DevicePropertyInfoList *next;
} DevicePropertyInfoList;


typedef struct NetdevNoneOptions NetdevNoneOptions;

typedef struct NetdevNoneOptionsList
{
    union {
        NetdevNoneOptions *value;
        uint64_t padding;
    };
    struct NetdevNoneOptionsList *next;
} NetdevNoneOptionsList;


typedef struct NetLegacyNicOptions NetLegacyNicOptions;

typedef struct NetLegacyNicOptionsList
{
    union {
        NetLegacyNicOptions *value;
        uint64_t padding;
    };
    struct NetLegacyNicOptionsList *next;
} NetLegacyNicOptionsList;


typedef struct String String;

typedef struct StringList
{
    union {
        String *value;
        uint64_t padding;
    };
    struct StringList *next;
} StringList;


typedef struct NetdevUserOptions NetdevUserOptions;

typedef struct NetdevUserOptionsList
{
    union {
        NetdevUserOptions *value;
        uint64_t padding;
    };
    struct NetdevUserOptionsList *next;
} NetdevUserOptionsList;


typedef struct NetdevTapOptions NetdevTapOptions;

typedef struct NetdevTapOptionsList
{
    union {
        NetdevTapOptions *value;
        uint64_t padding;
    };
    struct NetdevTapOptionsList *next;
} NetdevTapOptionsList;


typedef struct NetdevSocketOptions NetdevSocketOptions;

typedef struct NetdevSocketOptionsList
{
    union {
        NetdevSocketOptions *value;
        uint64_t padding;
    };
    struct NetdevSocketOptionsList *next;
} NetdevSocketOptionsList;


typedef struct NetdevVdeOptions NetdevVdeOptions;

typedef struct NetdevVdeOptionsList
{
    union {
        NetdevVdeOptions *value;
        uint64_t padding;
    };
    struct NetdevVdeOptionsList *next;
} NetdevVdeOptionsList;


typedef struct NetdevDumpOptions NetdevDumpOptions;

typedef struct NetdevDumpOptionsList
{
    union {
        NetdevDumpOptions *value;
        uint64_t padding;
    };
    struct NetdevDumpOptionsList *next;
} NetdevDumpOptionsList;


typedef struct NetdevBridgeOptions NetdevBridgeOptions;

typedef struct NetdevBridgeOptionsList
{
    union {
        NetdevBridgeOptions *value;
        uint64_t padding;
    };
    struct NetdevBridgeOptionsList *next;
} NetdevBridgeOptionsList;


typedef struct NetdevHubPortOptions NetdevHubPortOptions;

typedef struct NetdevHubPortOptionsList
{
    union {
        NetdevHubPortOptions *value;
        uint64_t padding;
    };
    struct NetdevHubPortOptionsList *next;
} NetdevHubPortOptionsList;


typedef struct NetdevNetmapOptions NetdevNetmapOptions;

typedef struct NetdevNetmapOptionsList
{
    union {
        NetdevNetmapOptions *value;
        uint64_t padding;
    };
    struct NetdevNetmapOptionsList *next;
} NetdevNetmapOptionsList;


typedef struct NetClientOptions NetClientOptions;

typedef struct NetClientOptionsList
{
    union {
        NetClientOptions *value;
        uint64_t padding;
    };
    struct NetClientOptionsList *next;
} NetClientOptionsList;

extern const char *NetClientOptionsKind_lookup[];
typedef enum NetClientOptionsKind
{
    NET_CLIENT_OPTIONS_KIND_NONE = 0,
    NET_CLIENT_OPTIONS_KIND_NIC = 1,
    NET_CLIENT_OPTIONS_KIND_USER = 2,
    NET_CLIENT_OPTIONS_KIND_TAP = 3,
    NET_CLIENT_OPTIONS_KIND_SOCKET = 4,
    NET_CLIENT_OPTIONS_KIND_VDE = 5,
    NET_CLIENT_OPTIONS_KIND_DUMP = 6,
    NET_CLIENT_OPTIONS_KIND_BRIDGE = 7,
    NET_CLIENT_OPTIONS_KIND_HUBPORT = 8,
    NET_CLIENT_OPTIONS_KIND_NETMAP = 9,
    NET_CLIENT_OPTIONS_KIND_MAX = 10,
} NetClientOptionsKind;


typedef struct NetLegacy NetLegacy;

typedef struct NetLegacyList
{
    union {
        NetLegacy *value;
        uint64_t padding;
    };
    struct NetLegacyList *next;
} NetLegacyList;


typedef struct Netdev Netdev;

typedef struct NetdevList
{
    union {
        Netdev *value;
        uint64_t padding;
    };
    struct NetdevList *next;
} NetdevList;


typedef struct InetSocketAddress InetSocketAddress;

typedef struct InetSocketAddressList
{
    union {
        InetSocketAddress *value;
        uint64_t padding;
    };
    struct InetSocketAddressList *next;
} InetSocketAddressList;


typedef struct UnixSocketAddress UnixSocketAddress;

typedef struct UnixSocketAddressList
{
    union {
        UnixSocketAddress *value;
        uint64_t padding;
    };
    struct UnixSocketAddressList *next;
} UnixSocketAddressList;


typedef struct SocketAddress SocketAddress;

typedef struct SocketAddressList
{
    union {
        SocketAddress *value;
        uint64_t padding;
    };
    struct SocketAddressList *next;
} SocketAddressList;

extern const char *SocketAddressKind_lookup[];
typedef enum SocketAddressKind
{
    SOCKET_ADDRESS_KIND_INET = 0,
    SOCKET_ADDRESS_KIND_UNIX = 1,
    SOCKET_ADDRESS_KIND_FD = 2,
    SOCKET_ADDRESS_KIND_MAX = 3,
} SocketAddressKind;


typedef struct MachineInfo MachineInfo;

typedef struct MachineInfoList
{
    union {
        MachineInfo *value;
        uint64_t padding;
    };
    struct MachineInfoList *next;
} MachineInfoList;


typedef struct CpuDefinitionInfo CpuDefinitionInfo;

typedef struct CpuDefinitionInfoList
{
    union {
        CpuDefinitionInfo *value;
        uint64_t padding;
    };
    struct CpuDefinitionInfoList *next;
} CpuDefinitionInfoList;


typedef struct AddfdInfo AddfdInfo;

typedef struct AddfdInfoList
{
    union {
        AddfdInfo *value;
        uint64_t padding;
    };
    struct AddfdInfoList *next;
} AddfdInfoList;


typedef struct FdsetFdInfo FdsetFdInfo;

typedef struct FdsetFdInfoList
{
    union {
        FdsetFdInfo *value;
        uint64_t padding;
    };
    struct FdsetFdInfoList *next;
} FdsetFdInfoList;


typedef struct FdsetInfo FdsetInfo;

typedef struct FdsetInfoList
{
    union {
        FdsetInfo *value;
        uint64_t padding;
    };
    struct FdsetInfoList *next;
} FdsetInfoList;


typedef struct TargetInfo TargetInfo;

typedef struct TargetInfoList
{
    union {
        TargetInfo *value;
        uint64_t padding;
    };
    struct TargetInfoList *next;
} TargetInfoList;

extern const char *QKeyCode_lookup[];
typedef enum QKeyCode
{
    Q_KEY_CODE_SHIFT = 0,
    Q_KEY_CODE_SHIFT_R = 1,
    Q_KEY_CODE_ALT = 2,
    Q_KEY_CODE_ALT_R = 3,
    Q_KEY_CODE_ALTGR = 4,
    Q_KEY_CODE_ALTGR_R = 5,
    Q_KEY_CODE_CTRL = 6,
    Q_KEY_CODE_CTRL_R = 7,
    Q_KEY_CODE_MENU = 8,
    Q_KEY_CODE_ESC = 9,
    Q_KEY_CODE_1 = 10,
    Q_KEY_CODE_2 = 11,
    Q_KEY_CODE_3 = 12,
    Q_KEY_CODE_4 = 13,
    Q_KEY_CODE_5 = 14,
    Q_KEY_CODE_6 = 15,
    Q_KEY_CODE_7 = 16,
    Q_KEY_CODE_8 = 17,
    Q_KEY_CODE_9 = 18,
    Q_KEY_CODE_0 = 19,
    Q_KEY_CODE_MINUS = 20,
    Q_KEY_CODE_EQUAL = 21,
    Q_KEY_CODE_BACKSPACE = 22,
    Q_KEY_CODE_TAB = 23,
    Q_KEY_CODE_Q = 24,
    Q_KEY_CODE_W = 25,
    Q_KEY_CODE_E = 26,
    Q_KEY_CODE_R = 27,
    Q_KEY_CODE_T = 28,
    Q_KEY_CODE_Y = 29,
    Q_KEY_CODE_U = 30,
    Q_KEY_CODE_I = 31,
    Q_KEY_CODE_O = 32,
    Q_KEY_CODE_P = 33,
    Q_KEY_CODE_BRACKET_LEFT = 34,
    Q_KEY_CODE_BRACKET_RIGHT = 35,
    Q_KEY_CODE_RET = 36,
    Q_KEY_CODE_A = 37,
    Q_KEY_CODE_S = 38,
    Q_KEY_CODE_D = 39,
    Q_KEY_CODE_F = 40,
    Q_KEY_CODE_G = 41,
    Q_KEY_CODE_H = 42,
    Q_KEY_CODE_J = 43,
    Q_KEY_CODE_K = 44,
    Q_KEY_CODE_L = 45,
    Q_KEY_CODE_SEMICOLON = 46,
    Q_KEY_CODE_APOSTROPHE = 47,
    Q_KEY_CODE_GRAVE_ACCENT = 48,
    Q_KEY_CODE_BACKSLASH = 49,
    Q_KEY_CODE_Z = 50,
    Q_KEY_CODE_X = 51,
    Q_KEY_CODE_C = 52,
    Q_KEY_CODE_V = 53,
    Q_KEY_CODE_B = 54,
    Q_KEY_CODE_N = 55,
    Q_KEY_CODE_M = 56,
    Q_KEY_CODE_COMMA = 57,
    Q_KEY_CODE_DOT = 58,
    Q_KEY_CODE_SLASH = 59,
    Q_KEY_CODE_ASTERISK = 60,
    Q_KEY_CODE_SPC = 61,
    Q_KEY_CODE_CAPS_LOCK = 62,
    Q_KEY_CODE_F1 = 63,
    Q_KEY_CODE_F2 = 64,
    Q_KEY_CODE_F3 = 65,
    Q_KEY_CODE_F4 = 66,
    Q_KEY_CODE_F5 = 67,
    Q_KEY_CODE_F6 = 68,
    Q_KEY_CODE_F7 = 69,
    Q_KEY_CODE_F8 = 70,
    Q_KEY_CODE_F9 = 71,
    Q_KEY_CODE_F10 = 72,
    Q_KEY_CODE_NUM_LOCK = 73,
    Q_KEY_CODE_SCROLL_LOCK = 74,
    Q_KEY_CODE_KP_DIVIDE = 75,
    Q_KEY_CODE_KP_MULTIPLY = 76,
    Q_KEY_CODE_KP_SUBTRACT = 77,
    Q_KEY_CODE_KP_ADD = 78,
    Q_KEY_CODE_KP_ENTER = 79,
    Q_KEY_CODE_KP_DECIMAL = 80,
    Q_KEY_CODE_SYSRQ = 81,
    Q_KEY_CODE_KP_0 = 82,
    Q_KEY_CODE_KP_1 = 83,
    Q_KEY_CODE_KP_2 = 84,
    Q_KEY_CODE_KP_3 = 85,
    Q_KEY_CODE_KP_4 = 86,
    Q_KEY_CODE_KP_5 = 87,
    Q_KEY_CODE_KP_6 = 88,
    Q_KEY_CODE_KP_7 = 89,
    Q_KEY_CODE_KP_8 = 90,
    Q_KEY_CODE_KP_9 = 91,
    Q_KEY_CODE_LESS = 92,
    Q_KEY_CODE_F11 = 93,
    Q_KEY_CODE_F12 = 94,
    Q_KEY_CODE_PRINT = 95,
    Q_KEY_CODE_HOME = 96,
    Q_KEY_CODE_PGUP = 97,
    Q_KEY_CODE_PGDN = 98,
    Q_KEY_CODE_END = 99,
    Q_KEY_CODE_LEFT = 100,
    Q_KEY_CODE_UP = 101,
    Q_KEY_CODE_DOWN = 102,
    Q_KEY_CODE_RIGHT = 103,
    Q_KEY_CODE_INSERT = 104,
    Q_KEY_CODE_DELETE = 105,
    Q_KEY_CODE_STOP = 106,
    Q_KEY_CODE_AGAIN = 107,
    Q_KEY_CODE_PROPS = 108,
    Q_KEY_CODE_UNDO = 109,
    Q_KEY_CODE_FRONT = 110,
    Q_KEY_CODE_COPY = 111,
    Q_KEY_CODE_OPEN = 112,
    Q_KEY_CODE_PASTE = 113,
    Q_KEY_CODE_FIND = 114,
    Q_KEY_CODE_CUT = 115,
    Q_KEY_CODE_LF = 116,
    Q_KEY_CODE_HELP = 117,
    Q_KEY_CODE_META_L = 118,
    Q_KEY_CODE_META_R = 119,
    Q_KEY_CODE_COMPOSE = 120,
    Q_KEY_CODE_MAX = 121,
} QKeyCode;

typedef struct QKeyCodeList
{
    union {
        QKeyCode value;
        uint64_t padding;
    };
    struct QKeyCodeList *next;
} QKeyCodeList;


typedef struct KeyValue KeyValue;

typedef struct KeyValueList
{
    union {
        KeyValue *value;
        uint64_t padding;
    };
    struct KeyValueList *next;
} KeyValueList;

extern const char *KeyValueKind_lookup[];
typedef enum KeyValueKind
{
    KEY_VALUE_KIND_NUMBER = 0,
    KEY_VALUE_KIND_QCODE = 1,
    KEY_VALUE_KIND_MAX = 2,
} KeyValueKind;


typedef struct ChardevFile ChardevFile;

typedef struct ChardevFileList
{
    union {
        ChardevFile *value;
        uint64_t padding;
    };
    struct ChardevFileList *next;
} ChardevFileList;


typedef struct ChardevHostdev ChardevHostdev;

typedef struct ChardevHostdevList
{
    union {
        ChardevHostdev *value;
        uint64_t padding;
    };
    struct ChardevHostdevList *next;
} ChardevHostdevList;


typedef struct ChardevSocket ChardevSocket;

typedef struct ChardevSocketList
{
    union {
        ChardevSocket *value;
        uint64_t padding;
    };
    struct ChardevSocketList *next;
} ChardevSocketList;


typedef struct ChardevUdp ChardevUdp;

typedef struct ChardevUdpList
{
    union {
        ChardevUdp *value;
        uint64_t padding;
    };
    struct ChardevUdpList *next;
} ChardevUdpList;


typedef struct ChardevMux ChardevMux;

typedef struct ChardevMuxList
{
    union {
        ChardevMux *value;
        uint64_t padding;
    };
    struct ChardevMuxList *next;
} ChardevMuxList;


typedef struct ChardevStdio ChardevStdio;

typedef struct ChardevStdioList
{
    union {
        ChardevStdio *value;
        uint64_t padding;
    };
    struct ChardevStdioList *next;
} ChardevStdioList;


typedef struct ChardevSpiceChannel ChardevSpiceChannel;

typedef struct ChardevSpiceChannelList
{
    union {
        ChardevSpiceChannel *value;
        uint64_t padding;
    };
    struct ChardevSpiceChannelList *next;
} ChardevSpiceChannelList;


typedef struct ChardevSpicePort ChardevSpicePort;

typedef struct ChardevSpicePortList
{
    union {
        ChardevSpicePort *value;
        uint64_t padding;
    };
    struct ChardevSpicePortList *next;
} ChardevSpicePortList;


typedef struct ChardevVC ChardevVC;

typedef struct ChardevVCList
{
    union {
        ChardevVC *value;
        uint64_t padding;
    };
    struct ChardevVCList *next;
} ChardevVCList;


typedef struct ChardevRingbuf ChardevRingbuf;

typedef struct ChardevRingbufList
{
    union {
        ChardevRingbuf *value;
        uint64_t padding;
    };
    struct ChardevRingbufList *next;
} ChardevRingbufList;


typedef struct ChardevDummy ChardevDummy;

typedef struct ChardevDummyList
{
    union {
        ChardevDummy *value;
        uint64_t padding;
    };
    struct ChardevDummyList *next;
} ChardevDummyList;


typedef struct ChardevBackend ChardevBackend;

typedef struct ChardevBackendList
{
    union {
        ChardevBackend *value;
        uint64_t padding;
    };
    struct ChardevBackendList *next;
} ChardevBackendList;

extern const char *ChardevBackendKind_lookup[];
typedef enum ChardevBackendKind
{
    CHARDEV_BACKEND_KIND_FILE = 0,
    CHARDEV_BACKEND_KIND_SERIAL = 1,
    CHARDEV_BACKEND_KIND_PARALLEL = 2,
    CHARDEV_BACKEND_KIND_PIPE = 3,
    CHARDEV_BACKEND_KIND_SOCKET = 4,
    CHARDEV_BACKEND_KIND_UDP = 5,
    CHARDEV_BACKEND_KIND_PTY = 6,
    CHARDEV_BACKEND_KIND_NULL = 7,
    CHARDEV_BACKEND_KIND_MUX = 8,
    CHARDEV_BACKEND_KIND_MSMOUSE = 9,
    CHARDEV_BACKEND_KIND_BRAILLE = 10,
    CHARDEV_BACKEND_KIND_STDIO = 11,
    CHARDEV_BACKEND_KIND_CONSOLE = 12,
    CHARDEV_BACKEND_KIND_SPICEVMC = 13,
    CHARDEV_BACKEND_KIND_SPICEPORT = 14,
    CHARDEV_BACKEND_KIND_VC = 15,
    CHARDEV_BACKEND_KIND_RINGBUF = 16,
    CHARDEV_BACKEND_KIND_MEMORY = 17,
    CHARDEV_BACKEND_KIND_MAX = 18,
} ChardevBackendKind;


typedef struct ChardevReturn ChardevReturn;

typedef struct ChardevReturnList
{
    union {
        ChardevReturn *value;
        uint64_t padding;
    };
    struct ChardevReturnList *next;
} ChardevReturnList;

extern const char *TpmModel_lookup[];
typedef enum TpmModel
{
    TPM_MODEL_TPM_TIS = 0,
    TPM_MODEL_MAX = 1,
} TpmModel;

typedef struct TpmModelList
{
    union {
        TpmModel value;
        uint64_t padding;
    };
    struct TpmModelList *next;
} TpmModelList;

extern const char *TpmType_lookup[];
typedef enum TpmType
{
    TPM_TYPE_PASSTHROUGH = 0,
    TPM_TYPE_MAX = 1,
} TpmType;

typedef struct TpmTypeList
{
    union {
        TpmType value;
        uint64_t padding;
    };
    struct TpmTypeList *next;
} TpmTypeList;


typedef struct TPMPassthroughOptions TPMPassthroughOptions;

typedef struct TPMPassthroughOptionsList
{
    union {
        TPMPassthroughOptions *value;
        uint64_t padding;
    };
    struct TPMPassthroughOptionsList *next;
} TPMPassthroughOptionsList;


typedef struct TpmTypeOptions TpmTypeOptions;

typedef struct TpmTypeOptionsList
{
    union {
        TpmTypeOptions *value;
        uint64_t padding;
    };
    struct TpmTypeOptionsList *next;
} TpmTypeOptionsList;

extern const char *TpmTypeOptionsKind_lookup[];
typedef enum TpmTypeOptionsKind
{
    TPM_TYPE_OPTIONS_KIND_PASSTHROUGH = 0,
    TPM_TYPE_OPTIONS_KIND_MAX = 1,
} TpmTypeOptionsKind;


typedef struct TPMInfo TPMInfo;

typedef struct TPMInfoList
{
    union {
        TPMInfo *value;
        uint64_t padding;
    };
    struct TPMInfoList *next;
} TPMInfoList;


typedef struct AcpiTableOptions AcpiTableOptions;

typedef struct AcpiTableOptionsList
{
    union {
        AcpiTableOptions *value;
        uint64_t padding;
    };
    struct AcpiTableOptionsList *next;
} AcpiTableOptionsList;

extern const char *CommandLineParameterType_lookup[];
typedef enum CommandLineParameterType
{
    COMMAND_LINE_PARAMETER_TYPE_STRING = 0,
    COMMAND_LINE_PARAMETER_TYPE_BOOLEAN = 1,
    COMMAND_LINE_PARAMETER_TYPE_NUMBER = 2,
    COMMAND_LINE_PARAMETER_TYPE_SIZE = 3,
    COMMAND_LINE_PARAMETER_TYPE_MAX = 4,
} CommandLineParameterType;

typedef struct CommandLineParameterTypeList
{
    union {
        CommandLineParameterType value;
        uint64_t padding;
    };
    struct CommandLineParameterTypeList *next;
} CommandLineParameterTypeList;


typedef struct CommandLineParameterInfo CommandLineParameterInfo;

typedef struct CommandLineParameterInfoList
{
    union {
        CommandLineParameterInfo *value;
        uint64_t padding;
    };
    struct CommandLineParameterInfoList *next;
} CommandLineParameterInfoList;


typedef struct CommandLineOptionInfo CommandLineOptionInfo;

typedef struct CommandLineOptionInfoList
{
    union {
        CommandLineOptionInfo *value;
        uint64_t padding;
    };
    struct CommandLineOptionInfoList *next;
} CommandLineOptionInfoList;

extern const char *X86CPURegister32_lookup[];
typedef enum X86CPURegister32
{
    X86_C_P_U_REGISTER32_EAX = 0,
    X86_C_P_U_REGISTER32_EBX = 1,
    X86_C_P_U_REGISTER32_ECX = 2,
    X86_C_P_U_REGISTER32_EDX = 3,
    X86_C_P_U_REGISTER32_ESP = 4,
    X86_C_P_U_REGISTER32_EBP = 5,
    X86_C_P_U_REGISTER32_ESI = 6,
    X86_C_P_U_REGISTER32_EDI = 7,
    X86_C_P_U_REGISTER32_MAX = 8,
} X86CPURegister32;

typedef struct X86CPURegister32List
{
    union {
        X86CPURegister32 value;
        uint64_t padding;
    };
    struct X86CPURegister32List *next;
} X86CPURegister32List;


typedef struct X86CPUFeatureWordInfo X86CPUFeatureWordInfo;

typedef struct X86CPUFeatureWordInfoList
{
    union {
        X86CPUFeatureWordInfo *value;
        uint64_t padding;
    };
    struct X86CPUFeatureWordInfoList *next;
} X86CPUFeatureWordInfoList;

extern const char *RxState_lookup[];
typedef enum RxState
{
    RX_STATE_NORMAL = 0,
    RX_STATE_NONE = 1,
    RX_STATE_ALL = 2,
    RX_STATE_MAX = 3,
} RxState;

typedef struct RxStateList
{
    union {
        RxState value;
        uint64_t padding;
    };
    struct RxStateList *next;
} RxStateList;


typedef struct RxFilterInfo RxFilterInfo;

typedef struct RxFilterInfoList
{
    union {
        RxFilterInfo *value;
        uint64_t padding;
    };
    struct RxFilterInfoList *next;
} RxFilterInfoList;

extern const char *BlockdevDiscardOptions_lookup[];
typedef enum BlockdevDiscardOptions
{
    BLOCKDEV_DISCARD_OPTIONS_IGNORE = 0,
    BLOCKDEV_DISCARD_OPTIONS_UNMAP = 1,
    BLOCKDEV_DISCARD_OPTIONS_MAX = 2,
} BlockdevDiscardOptions;

typedef struct BlockdevDiscardOptionsList
{
    union {
        BlockdevDiscardOptions value;
        uint64_t padding;
    };
    struct BlockdevDiscardOptionsList *next;
} BlockdevDiscardOptionsList;

extern const char *BlockdevAioOptions_lookup[];
typedef enum BlockdevAioOptions
{
    BLOCKDEV_AIO_OPTIONS_THREADS = 0,
    BLOCKDEV_AIO_OPTIONS_NATIVE = 1,
    BLOCKDEV_AIO_OPTIONS_MAX = 2,
} BlockdevAioOptions;

typedef struct BlockdevAioOptionsList
{
    union {
        BlockdevAioOptions value;
        uint64_t padding;
    };
    struct BlockdevAioOptionsList *next;
} BlockdevAioOptionsList;


typedef struct BlockdevCacheOptions BlockdevCacheOptions;

typedef struct BlockdevCacheOptionsList
{
    union {
        BlockdevCacheOptions *value;
        uint64_t padding;
    };
    struct BlockdevCacheOptionsList *next;
} BlockdevCacheOptionsList;


typedef struct BlockdevOptionsBase BlockdevOptionsBase;

typedef struct BlockdevOptionsBaseList
{
    union {
        BlockdevOptionsBase *value;
        uint64_t padding;
    };
    struct BlockdevOptionsBaseList *next;
} BlockdevOptionsBaseList;


typedef struct BlockdevOptionsFile BlockdevOptionsFile;

typedef struct BlockdevOptionsFileList
{
    union {
        BlockdevOptionsFile *value;
        uint64_t padding;
    };
    struct BlockdevOptionsFileList *next;
} BlockdevOptionsFileList;


typedef struct BlockdevOptionsVVFAT BlockdevOptionsVVFAT;

typedef struct BlockdevOptionsVVFATList
{
    union {
        BlockdevOptionsVVFAT *value;
        uint64_t padding;
    };
    struct BlockdevOptionsVVFATList *next;
} BlockdevOptionsVVFATList;


typedef struct BlockdevOptionsGenericFormat BlockdevOptionsGenericFormat;

typedef struct BlockdevOptionsGenericFormatList
{
    union {
        BlockdevOptionsGenericFormat *value;
        uint64_t padding;
    };
    struct BlockdevOptionsGenericFormatList *next;
} BlockdevOptionsGenericFormatList;


typedef struct BlockdevOptionsGenericCOWFormat BlockdevOptionsGenericCOWFormat;

typedef struct BlockdevOptionsGenericCOWFormatList
{
    union {
        BlockdevOptionsGenericCOWFormat *value;
        uint64_t padding;
    };
    struct BlockdevOptionsGenericCOWFormatList *next;
} BlockdevOptionsGenericCOWFormatList;


typedef struct BlockdevOptionsQcow2 BlockdevOptionsQcow2;

typedef struct BlockdevOptionsQcow2List
{
    union {
        BlockdevOptionsQcow2 *value;
        uint64_t padding;
    };
    struct BlockdevOptionsQcow2List *next;
} BlockdevOptionsQcow2List;


typedef struct BlockdevOptions BlockdevOptions;

typedef struct BlockdevOptionsList
{
    union {
        BlockdevOptions *value;
        uint64_t padding;
    };
    struct BlockdevOptionsList *next;
} BlockdevOptionsList;

extern const char *BlockdevOptionsKind_lookup[];
typedef enum BlockdevOptionsKind
{
    BLOCKDEV_OPTIONS_KIND_FILE = 0,
    BLOCKDEV_OPTIONS_KIND_HTTP = 1,
    BLOCKDEV_OPTIONS_KIND_HTTPS = 2,
    BLOCKDEV_OPTIONS_KIND_FTP = 3,
    BLOCKDEV_OPTIONS_KIND_FTPS = 4,
    BLOCKDEV_OPTIONS_KIND_TFTP = 5,
    BLOCKDEV_OPTIONS_KIND_VVFAT = 6,
    BLOCKDEV_OPTIONS_KIND_BOCHS = 7,
    BLOCKDEV_OPTIONS_KIND_CLOOP = 8,
    BLOCKDEV_OPTIONS_KIND_COW = 9,
    BLOCKDEV_OPTIONS_KIND_DMG = 10,
    BLOCKDEV_OPTIONS_KIND_PARALLELS = 11,
    BLOCKDEV_OPTIONS_KIND_QCOW = 12,
    BLOCKDEV_OPTIONS_KIND_QCOW2 = 13,
    BLOCKDEV_OPTIONS_KIND_QED = 14,
    BLOCKDEV_OPTIONS_KIND_RAW = 15,
    BLOCKDEV_OPTIONS_KIND_VDI = 16,
    BLOCKDEV_OPTIONS_KIND_VHDX = 17,
    BLOCKDEV_OPTIONS_KIND_VMDK = 18,
    BLOCKDEV_OPTIONS_KIND_VPC = 19,
    BLOCKDEV_OPTIONS_KIND_MAX = 20,
} BlockdevOptionsKind;


typedef struct BlockdevRef BlockdevRef;

typedef struct BlockdevRefList
{
    union {
        BlockdevRef *value;
        uint64_t padding;
    };
    struct BlockdevRefList *next;
} BlockdevRefList;

extern const char *BlockdevRefKind_lookup[];
typedef enum BlockdevRefKind
{
    BLOCKDEV_REF_KIND_DEFINITION = 0,
    BLOCKDEV_REF_KIND_REFERENCE = 1,
    BLOCKDEV_REF_KIND_MAX = 2,
} BlockdevRefKind;

#ifndef QAPI_TYPES_BUILTIN_CLEANUP_DECL_H
#define QAPI_TYPES_BUILTIN_CLEANUP_DECL_H

void qapi_free_strList(strList * obj);
void qapi_free_intList(intList * obj);
void qapi_free_numberList(numberList * obj);
void qapi_free_boolList(boolList * obj);
void qapi_free_int8List(int8List * obj);
void qapi_free_int16List(int16List * obj);
void qapi_free_int32List(int32List * obj);
void qapi_free_int64List(int64List * obj);
void qapi_free_uint8List(uint8List * obj);
void qapi_free_uint16List(uint16List * obj);
void qapi_free_uint32List(uint32List * obj);
void qapi_free_uint64List(uint64List * obj);

#endif /* QAPI_TYPES_BUILTIN_CLEANUP_DECL_H */


void qapi_free_ErrorClassList(ErrorClassList * obj);

struct NameInfo
{
    bool has_name;
    char * name;
};

void qapi_free_NameInfoList(NameInfoList * obj);
void qapi_free_NameInfo(NameInfo * obj);

struct VersionInfo
{
    struct 
    {
        int64_t major;
        int64_t minor;
        int64_t micro;
    } qemu;
    char * package;
};

void qapi_free_VersionInfoList(VersionInfoList * obj);
void qapi_free_VersionInfo(VersionInfo * obj);

struct KvmInfo
{
    bool enabled;
    bool present;
};

void qapi_free_KvmInfoList(KvmInfoList * obj);
void qapi_free_KvmInfo(KvmInfo * obj);

void qapi_free_RunStateList(RunStateList * obj);

struct SnapshotInfo
{
    char * id;
    char * name;
    int64_t vm_state_size;
    int64_t date_sec;
    int64_t date_nsec;
    int64_t vm_clock_sec;
    int64_t vm_clock_nsec;
};

void qapi_free_SnapshotInfoList(SnapshotInfoList * obj);
void qapi_free_SnapshotInfo(SnapshotInfo * obj);

struct ImageInfoSpecificQCow2
{
    char * compat;
    bool has_lazy_refcounts;
    bool lazy_refcounts;
};

void qapi_free_ImageInfoSpecificQCow2List(ImageInfoSpecificQCow2List * obj);
void qapi_free_ImageInfoSpecificQCow2(ImageInfoSpecificQCow2 * obj);

struct ImageInfoSpecificVmdk
{
    char * create_type;
    int64_t cid;
    int64_t parent_cid;
    ImageInfoList * extents;
};

void qapi_free_ImageInfoSpecificVmdkList(ImageInfoSpecificVmdkList * obj);
void qapi_free_ImageInfoSpecificVmdk(ImageInfoSpecificVmdk * obj);

struct ImageInfoSpecific
{
    ImageInfoSpecificKind kind;
    union {
        void *data;
        ImageInfoSpecificQCow2 * qcow2;
        ImageInfoSpecificVmdk * vmdk;
    };
};
void qapi_free_ImageInfoSpecificList(ImageInfoSpecificList * obj);
void qapi_free_ImageInfoSpecific(ImageInfoSpecific * obj);

struct ImageInfo
{
    char * filename;
    char * format;
    bool has_dirty_flag;
    bool dirty_flag;
    bool has_actual_size;
    int64_t actual_size;
    int64_t virtual_size;
    bool has_cluster_size;
    int64_t cluster_size;
    bool has_encrypted;
    bool encrypted;
    bool has_compressed;
    bool compressed;
    bool has_backing_filename;
    char * backing_filename;
    bool has_full_backing_filename;
    char * full_backing_filename;
    bool has_backing_filename_format;
    char * backing_filename_format;
    bool has_snapshots;
    SnapshotInfoList * snapshots;
    bool has_backing_image;
    ImageInfo * backing_image;
    bool has_format_specific;
    ImageInfoSpecific * format_specific;
};

void qapi_free_ImageInfoList(ImageInfoList * obj);
void qapi_free_ImageInfo(ImageInfo * obj);

struct ImageCheck
{
    char * filename;
    char * format;
    int64_t check_errors;
    bool has_image_end_offset;
    int64_t image_end_offset;
    bool has_corruptions;
    int64_t corruptions;
    bool has_leaks;
    int64_t leaks;
    bool has_corruptions_fixed;
    int64_t corruptions_fixed;
    bool has_leaks_fixed;
    int64_t leaks_fixed;
    bool has_total_clusters;
    int64_t total_clusters;
    bool has_allocated_clusters;
    int64_t allocated_clusters;
    bool has_fragmented_clusters;
    int64_t fragmented_clusters;
    bool has_compressed_clusters;
    int64_t compressed_clusters;
};

void qapi_free_ImageCheckList(ImageCheckList * obj);
void qapi_free_ImageCheck(ImageCheck * obj);

struct StatusInfo
{
    bool running;
    bool singlestep;
    RunState status;
};

void qapi_free_StatusInfoList(StatusInfoList * obj);
void qapi_free_StatusInfo(StatusInfo * obj);

struct UuidInfo
{
    char * UUID;
};

void qapi_free_UuidInfoList(UuidInfoList * obj);
void qapi_free_UuidInfo(UuidInfo * obj);

struct ChardevInfo
{
    char * label;
    char * filename;
};

void qapi_free_ChardevInfoList(ChardevInfoList * obj);
void qapi_free_ChardevInfo(ChardevInfo * obj);

void qapi_free_DataFormatList(DataFormatList * obj);

struct CommandInfo
{
    char * name;
};

void qapi_free_CommandInfoList(CommandInfoList * obj);
void qapi_free_CommandInfo(CommandInfo * obj);

struct EventInfo
{
    char * name;
};

void qapi_free_EventInfoList(EventInfoList * obj);
void qapi_free_EventInfo(EventInfo * obj);

struct MigrationStats
{
    int64_t transferred;
    int64_t remaining;
    int64_t total;
    int64_t duplicate;
    int64_t skipped;
    int64_t normal;
    int64_t normal_bytes;
    int64_t dirty_pages_rate;
    double mbps;
};

void qapi_free_MigrationStatsList(MigrationStatsList * obj);
void qapi_free_MigrationStats(MigrationStats * obj);

struct XBZRLECacheStats
{
    int64_t cache_size;
    int64_t bytes;
    int64_t pages;
    int64_t cache_miss;
    int64_t overflow;
};

void qapi_free_XBZRLECacheStatsList(XBZRLECacheStatsList * obj);
void qapi_free_XBZRLECacheStats(XBZRLECacheStats * obj);

struct MigrationInfo
{
    bool has_status;
    char * status;
    bool has_ram;
    MigrationStats * ram;
    bool has_disk;
    MigrationStats * disk;
    bool has_xbzrle_cache;
    XBZRLECacheStats * xbzrle_cache;
    bool has_total_time;
    int64_t total_time;
    bool has_expected_downtime;
    int64_t expected_downtime;
    bool has_downtime;
    int64_t downtime;
    bool has_setup_time;
    int64_t setup_time;
};

void qapi_free_MigrationInfoList(MigrationInfoList * obj);
void qapi_free_MigrationInfo(MigrationInfo * obj);

void qapi_free_MigrationCapabilityList(MigrationCapabilityList * obj);

struct MigrationCapabilityStatus
{
    MigrationCapability capability;
    bool state;
};

void qapi_free_MigrationCapabilityStatusList(MigrationCapabilityStatusList * obj);
void qapi_free_MigrationCapabilityStatus(MigrationCapabilityStatus * obj);

struct MouseInfo
{
    char * name;
    int64_t index;
    bool current;
    bool absolute;
};

void qapi_free_MouseInfoList(MouseInfoList * obj);
void qapi_free_MouseInfo(MouseInfo * obj);

struct CpuInfo
{
    int64_t CPU;
    bool current;
    bool halted;
    bool has_pc;
    int64_t pc;
    bool has_nip;
    int64_t nip;
    bool has_npc;
    int64_t npc;
    bool has_PC;
    int64_t PC;
    int64_t thread_id;
};

void qapi_free_CpuInfoList(CpuInfoList * obj);
void qapi_free_CpuInfo(CpuInfo * obj);

struct BlockDeviceInfo
{
    char * file;
    bool ro;
    char * drv;
    bool has_backing_file;
    char * backing_file;
    int64_t backing_file_depth;
    bool encrypted;
    bool encryption_key_missing;
    int64_t bps;
    int64_t bps_rd;
    int64_t bps_wr;
    int64_t iops;
    int64_t iops_rd;
    int64_t iops_wr;
    ImageInfo * image;
    bool has_bps_max;
    int64_t bps_max;
    bool has_bps_rd_max;
    int64_t bps_rd_max;
    bool has_bps_wr_max;
    int64_t bps_wr_max;
    bool has_iops_max;
    int64_t iops_max;
    bool has_iops_rd_max;
    int64_t iops_rd_max;
    bool has_iops_wr_max;
    int64_t iops_wr_max;
    bool has_iops_size;
    int64_t iops_size;
};

void qapi_free_BlockDeviceInfoList(BlockDeviceInfoList * obj);
void qapi_free_BlockDeviceInfo(BlockDeviceInfo * obj);

void qapi_free_BlockDeviceIoStatusList(BlockDeviceIoStatusList * obj);

struct BlockDeviceMapEntry
{
    int64_t start;
    int64_t length;
    int64_t depth;
    bool zero;
    bool data;
    bool has_offset;
    int64_t offset;
};

void qapi_free_BlockDeviceMapEntryList(BlockDeviceMapEntryList * obj);
void qapi_free_BlockDeviceMapEntry(BlockDeviceMapEntry * obj);

struct BlockDirtyInfo
{
    int64_t count;
    int64_t granularity;
};

void qapi_free_BlockDirtyInfoList(BlockDirtyInfoList * obj);
void qapi_free_BlockDirtyInfo(BlockDirtyInfo * obj);

struct BlockInfo
{
    char * device;
    char * type;
    bool removable;
    bool locked;
    bool has_inserted;
    BlockDeviceInfo * inserted;
    bool has_tray_open;
    bool tray_open;
    bool has_io_status;
    BlockDeviceIoStatus io_status;
    bool has_dirty_bitmaps;
    BlockDirtyInfoList * dirty_bitmaps;
};

void qapi_free_BlockInfoList(BlockInfoList * obj);
void qapi_free_BlockInfo(BlockInfo * obj);

struct BlockDeviceStats
{
    int64_t rd_bytes;
    int64_t wr_bytes;
    int64_t rd_operations;
    int64_t wr_operations;
    int64_t flush_operations;
    int64_t flush_total_time_ns;
    int64_t wr_total_time_ns;
    int64_t rd_total_time_ns;
    int64_t wr_highest_offset;
};

void qapi_free_BlockDeviceStatsList(BlockDeviceStatsList * obj);
void qapi_free_BlockDeviceStats(BlockDeviceStats * obj);

struct BlockStats
{
    bool has_device;
    char * device;
    BlockDeviceStats * stats;
    bool has_parent;
    BlockStats * parent;
};

void qapi_free_BlockStatsList(BlockStatsList * obj);
void qapi_free_BlockStats(BlockStats * obj);

struct VncClientInfo
{
    char * host;
    char * family;
    char * service;
    bool has_x509_dname;
    char * x509_dname;
    bool has_sasl_username;
    char * sasl_username;
};

void qapi_free_VncClientInfoList(VncClientInfoList * obj);
void qapi_free_VncClientInfo(VncClientInfo * obj);

struct VncInfo
{
    bool enabled;
    bool has_host;
    char * host;
    bool has_family;
    char * family;
    bool has_service;
    char * service;
    bool has_auth;
    char * auth;
    bool has_clients;
    VncClientInfoList * clients;
};

void qapi_free_VncInfoList(VncInfoList * obj);
void qapi_free_VncInfo(VncInfo * obj);

struct SpiceChannel
{
    char * host;
    char * family;
    char * port;
    int64_t connection_id;
    int64_t channel_type;
    int64_t channel_id;
    bool tls;
};

void qapi_free_SpiceChannelList(SpiceChannelList * obj);
void qapi_free_SpiceChannel(SpiceChannel * obj);

void qapi_free_SpiceQueryMouseModeList(SpiceQueryMouseModeList * obj);

struct SpiceInfo
{
    bool enabled;
    bool migrated;
    bool has_host;
    char * host;
    bool has_port;
    int64_t port;
    bool has_tls_port;
    int64_t tls_port;
    bool has_auth;
    char * auth;
    bool has_compiled_version;
    char * compiled_version;
    SpiceQueryMouseMode mouse_mode;
    bool has_channels;
    SpiceChannelList * channels;
};

void qapi_free_SpiceInfoList(SpiceInfoList * obj);
void qapi_free_SpiceInfo(SpiceInfo * obj);

struct BalloonInfo
{
    int64_t actual;
};

void qapi_free_BalloonInfoList(BalloonInfoList * obj);
void qapi_free_BalloonInfo(BalloonInfo * obj);

struct PciMemoryRange
{
    int64_t base;
    int64_t limit;
};

void qapi_free_PciMemoryRangeList(PciMemoryRangeList * obj);
void qapi_free_PciMemoryRange(PciMemoryRange * obj);

struct PciMemoryRegion
{
    int64_t bar;
    char * type;
    int64_t address;
    int64_t size;
    bool has_prefetch;
    bool prefetch;
    bool has_mem_type_64;
    bool mem_type_64;
};

void qapi_free_PciMemoryRegionList(PciMemoryRegionList * obj);
void qapi_free_PciMemoryRegion(PciMemoryRegion * obj);

struct PciBridgeInfo
{
    struct 
    {
        int64_t number;
        int64_t secondary;
        int64_t subordinate;
        PciMemoryRange * io_range;
        PciMemoryRange * memory_range;
        PciMemoryRange * prefetchable_range;
    } bus;
    bool has_devices;
    PciDeviceInfoList * devices;
};

void qapi_free_PciBridgeInfoList(PciBridgeInfoList * obj);
void qapi_free_PciBridgeInfo(PciBridgeInfo * obj);

struct PciDeviceInfo
{
    int64_t bus;
    int64_t slot;
    int64_t function;
    struct 
    {
        bool has_desc;
        char * desc;
        int64_t q_class;
    } class_info;
    struct 
    {
        int64_t device;
        int64_t vendor;
    } id;
    bool has_irq;
    int64_t irq;
    char * qdev_id;
    bool has_pci_bridge;
    PciBridgeInfo * pci_bridge;
    PciMemoryRegionList * regions;
};

void qapi_free_PciDeviceInfoList(PciDeviceInfoList * obj);
void qapi_free_PciDeviceInfo(PciDeviceInfo * obj);

struct PciInfo
{
    int64_t bus;
    PciDeviceInfoList * devices;
};

void qapi_free_PciInfoList(PciInfoList * obj);
void qapi_free_PciInfo(PciInfo * obj);

void qapi_free_BlockdevOnErrorList(BlockdevOnErrorList * obj);

void qapi_free_MirrorSyncModeList(MirrorSyncModeList * obj);

void qapi_free_BlockJobTypeList(BlockJobTypeList * obj);

struct BlockJobInfo
{
    char * type;
    char * device;
    int64_t len;
    int64_t offset;
    bool busy;
    bool paused;
    int64_t speed;
    BlockDeviceIoStatus io_status;
};

void qapi_free_BlockJobInfoList(BlockJobInfoList * obj);
void qapi_free_BlockJobInfo(BlockJobInfo * obj);

void qapi_free_NewImageModeList(NewImageModeList * obj);

struct BlockdevSnapshot
{
    char * device;
    char * snapshot_file;
    bool has_format;
    char * format;
    bool has_mode;
    NewImageMode mode;
};

void qapi_free_BlockdevSnapshotList(BlockdevSnapshotList * obj);
void qapi_free_BlockdevSnapshot(BlockdevSnapshot * obj);

struct BlockdevSnapshotInternal
{
    char * device;
    char * name;
};

void qapi_free_BlockdevSnapshotInternalList(BlockdevSnapshotInternalList * obj);
void qapi_free_BlockdevSnapshotInternal(BlockdevSnapshotInternal * obj);

struct DriveBackup
{
    char * device;
    char * target;
    bool has_format;
    char * format;
    MirrorSyncMode sync;
    bool has_mode;
    NewImageMode mode;
    bool has_speed;
    int64_t speed;
    bool has_on_source_error;
    BlockdevOnError on_source_error;
    bool has_on_target_error;
    BlockdevOnError on_target_error;
};

void qapi_free_DriveBackupList(DriveBackupList * obj);
void qapi_free_DriveBackup(DriveBackup * obj);

struct Abort
{
};

void qapi_free_AbortList(AbortList * obj);
void qapi_free_Abort(Abort * obj);

struct TransactionAction
{
    TransactionActionKind kind;
    union {
        void *data;
        BlockdevSnapshot * blockdev_snapshot_sync;
        DriveBackup * drive_backup;
        Abort * abort;
        BlockdevSnapshotInternal * blockdev_snapshot_internal_sync;
    };
};
void qapi_free_TransactionActionList(TransactionActionList * obj);
void qapi_free_TransactionAction(TransactionAction * obj);

struct ObjectPropertyInfo
{
    char * name;
    char * type;
};

void qapi_free_ObjectPropertyInfoList(ObjectPropertyInfoList * obj);
void qapi_free_ObjectPropertyInfo(ObjectPropertyInfo * obj);

struct ObjectTypeInfo
{
    char * name;
};

void qapi_free_ObjectTypeInfoList(ObjectTypeInfoList * obj);
void qapi_free_ObjectTypeInfo(ObjectTypeInfo * obj);

struct DevicePropertyInfo
{
    char * name;
    char * type;
};

void qapi_free_DevicePropertyInfoList(DevicePropertyInfoList * obj);
void qapi_free_DevicePropertyInfo(DevicePropertyInfo * obj);

struct NetdevNoneOptions
{
};

void qapi_free_NetdevNoneOptionsList(NetdevNoneOptionsList * obj);
void qapi_free_NetdevNoneOptions(NetdevNoneOptions * obj);

struct NetLegacyNicOptions
{
    bool has_netdev;
    char * netdev;
    bool has_macaddr;
    char * macaddr;
    bool has_model;
    char * model;
    bool has_addr;
    char * addr;
    bool has_vectors;
    uint32_t vectors;
};

void qapi_free_NetLegacyNicOptionsList(NetLegacyNicOptionsList * obj);
void qapi_free_NetLegacyNicOptions(NetLegacyNicOptions * obj);

struct String
{
    char * str;
};

void qapi_free_StringList(StringList * obj);
void qapi_free_String(String * obj);

struct NetdevUserOptions
{
    bool has_hostname;
    char * hostname;
    bool has_q_restrict;
    bool q_restrict;
    bool has_ip;
    char * ip;
    bool has_net;
    char * net;
    bool has_host;
    char * host;
    bool has_tftp;
    char * tftp;
    bool has_bootfile;
    char * bootfile;
    bool has_dhcpstart;
    char * dhcpstart;
    bool has_dns;
    char * dns;
    bool has_dnssearch;
    StringList * dnssearch;
    bool has_smb;
    char * smb;
    bool has_smbserver;
    char * smbserver;
    bool has_hostfwd;
    StringList * hostfwd;
    bool has_guestfwd;
    StringList * guestfwd;
};

void qapi_free_NetdevUserOptionsList(NetdevUserOptionsList * obj);
void qapi_free_NetdevUserOptions(NetdevUserOptions * obj);

struct NetdevTapOptions
{
    bool has_ifname;
    char * ifname;
    bool has_fd;
    char * fd;
    bool has_fds;
    char * fds;
    bool has_script;
    char * script;
    bool has_downscript;
    char * downscript;
    bool has_helper;
    char * helper;
    bool has_sndbuf;
    uint64_t sndbuf;
    bool has_vnet_hdr;
    bool vnet_hdr;
    bool has_vhost;
    bool vhost;
    bool has_vhostfd;
    char * vhostfd;
    bool has_vhostfds;
    char * vhostfds;
    bool has_vhostforce;
    bool vhostforce;
    bool has_queues;
    uint32_t queues;
};

void qapi_free_NetdevTapOptionsList(NetdevTapOptionsList * obj);
void qapi_free_NetdevTapOptions(NetdevTapOptions * obj);

struct NetdevSocketOptions
{
    bool has_fd;
    char * fd;
    bool has_listen;
    char * listen;
    bool has_connect;
    char * connect;
    bool has_mcast;
    char * mcast;
    bool has_localaddr;
    char * localaddr;
    bool has_udp;
    char * udp;
};

void qapi_free_NetdevSocketOptionsList(NetdevSocketOptionsList * obj);
void qapi_free_NetdevSocketOptions(NetdevSocketOptions * obj);

struct NetdevVdeOptions
{
    bool has_sock;
    char * sock;
    bool has_port;
    uint16_t port;
    bool has_group;
    char * group;
    bool has_mode;
    uint16_t mode;
};

void qapi_free_NetdevVdeOptionsList(NetdevVdeOptionsList * obj);
void qapi_free_NetdevVdeOptions(NetdevVdeOptions * obj);

struct NetdevDumpOptions
{
    bool has_len;
    uint64_t len;
    bool has_file;
    char * file;
};

void qapi_free_NetdevDumpOptionsList(NetdevDumpOptionsList * obj);
void qapi_free_NetdevDumpOptions(NetdevDumpOptions * obj);

struct NetdevBridgeOptions
{
    bool has_br;
    char * br;
    bool has_helper;
    char * helper;
};

void qapi_free_NetdevBridgeOptionsList(NetdevBridgeOptionsList * obj);
void qapi_free_NetdevBridgeOptions(NetdevBridgeOptions * obj);

struct NetdevHubPortOptions
{
    int32_t hubid;
};

void qapi_free_NetdevHubPortOptionsList(NetdevHubPortOptionsList * obj);
void qapi_free_NetdevHubPortOptions(NetdevHubPortOptions * obj);

struct NetdevNetmapOptions
{
    char * ifname;
    bool has_devname;
    char * devname;
};

void qapi_free_NetdevNetmapOptionsList(NetdevNetmapOptionsList * obj);
void qapi_free_NetdevNetmapOptions(NetdevNetmapOptions * obj);

struct NetClientOptions
{
    NetClientOptionsKind kind;
    union {
        void *data;
        NetdevNoneOptions * none;
        NetLegacyNicOptions * nic;
        NetdevUserOptions * user;
        NetdevTapOptions * tap;
        NetdevSocketOptions * socket;
        NetdevVdeOptions * vde;
        NetdevDumpOptions * dump;
        NetdevBridgeOptions * bridge;
        NetdevHubPortOptions * hubport;
        NetdevNetmapOptions * netmap;
    };
};
void qapi_free_NetClientOptionsList(NetClientOptionsList * obj);
void qapi_free_NetClientOptions(NetClientOptions * obj);

struct NetLegacy
{
    bool has_vlan;
    int32_t vlan;
    bool has_id;
    char * id;
    bool has_name;
    char * name;
    NetClientOptions * opts;
};

void qapi_free_NetLegacyList(NetLegacyList * obj);
void qapi_free_NetLegacy(NetLegacy * obj);

struct Netdev
{
    char * id;
    NetClientOptions * opts;
};

void qapi_free_NetdevList(NetdevList * obj);
void qapi_free_Netdev(Netdev * obj);

struct InetSocketAddress
{
    char * host;
    char * port;
    bool has_to;
    uint16_t to;
    bool has_ipv4;
    bool ipv4;
    bool has_ipv6;
    bool ipv6;
};

void qapi_free_InetSocketAddressList(InetSocketAddressList * obj);
void qapi_free_InetSocketAddress(InetSocketAddress * obj);

struct UnixSocketAddress
{
    char * path;
};

void qapi_free_UnixSocketAddressList(UnixSocketAddressList * obj);
void qapi_free_UnixSocketAddress(UnixSocketAddress * obj);

struct SocketAddress
{
    SocketAddressKind kind;
    union {
        void *data;
        InetSocketAddress * inet;
        UnixSocketAddress * q_unix;
        String * fd;
    };
};
void qapi_free_SocketAddressList(SocketAddressList * obj);
void qapi_free_SocketAddress(SocketAddress * obj);

struct MachineInfo
{
    char * name;
    bool has_alias;
    char * alias;
    bool has_is_default;
    bool is_default;
    int64_t cpu_max;
};

void qapi_free_MachineInfoList(MachineInfoList * obj);
void qapi_free_MachineInfo(MachineInfo * obj);

struct CpuDefinitionInfo
{
    char * name;
};

void qapi_free_CpuDefinitionInfoList(CpuDefinitionInfoList * obj);
void qapi_free_CpuDefinitionInfo(CpuDefinitionInfo * obj);

struct AddfdInfo
{
    int64_t fdset_id;
    int64_t fd;
};

void qapi_free_AddfdInfoList(AddfdInfoList * obj);
void qapi_free_AddfdInfo(AddfdInfo * obj);

struct FdsetFdInfo
{
    int64_t fd;
    bool has_opaque;
    char * opaque;
};

void qapi_free_FdsetFdInfoList(FdsetFdInfoList * obj);
void qapi_free_FdsetFdInfo(FdsetFdInfo * obj);

struct FdsetInfo
{
    int64_t fdset_id;
    FdsetFdInfoList * fds;
};

void qapi_free_FdsetInfoList(FdsetInfoList * obj);
void qapi_free_FdsetInfo(FdsetInfo * obj);

struct TargetInfo
{
    char * arch;
};

void qapi_free_TargetInfoList(TargetInfoList * obj);
void qapi_free_TargetInfo(TargetInfo * obj);

void qapi_free_QKeyCodeList(QKeyCodeList * obj);

struct KeyValue
{
    KeyValueKind kind;
    union {
        void *data;
        int64_t number;
        QKeyCode qcode;
    };
};
void qapi_free_KeyValueList(KeyValueList * obj);
void qapi_free_KeyValue(KeyValue * obj);

struct ChardevFile
{
    bool has_in;
    char * in;
    char * out;
};

void qapi_free_ChardevFileList(ChardevFileList * obj);
void qapi_free_ChardevFile(ChardevFile * obj);

struct ChardevHostdev
{
    char * device;
};

void qapi_free_ChardevHostdevList(ChardevHostdevList * obj);
void qapi_free_ChardevHostdev(ChardevHostdev * obj);

struct ChardevSocket
{
    SocketAddress * addr;
    bool has_server;
    bool server;
    bool has_wait;
    bool wait;
    bool has_nodelay;
    bool nodelay;
    bool has_telnet;
    bool telnet;
};

void qapi_free_ChardevSocketList(ChardevSocketList * obj);
void qapi_free_ChardevSocket(ChardevSocket * obj);

struct ChardevUdp
{
    SocketAddress * remote;
    bool has_local;
    SocketAddress * local;
};

void qapi_free_ChardevUdpList(ChardevUdpList * obj);
void qapi_free_ChardevUdp(ChardevUdp * obj);

struct ChardevMux
{
    char * chardev;
};

void qapi_free_ChardevMuxList(ChardevMuxList * obj);
void qapi_free_ChardevMux(ChardevMux * obj);

struct ChardevStdio
{
    bool has_signal;
    bool signal;
};

void qapi_free_ChardevStdioList(ChardevStdioList * obj);
void qapi_free_ChardevStdio(ChardevStdio * obj);

struct ChardevSpiceChannel
{
    char * type;
};

void qapi_free_ChardevSpiceChannelList(ChardevSpiceChannelList * obj);
void qapi_free_ChardevSpiceChannel(ChardevSpiceChannel * obj);

struct ChardevSpicePort
{
    char * fqdn;
};

void qapi_free_ChardevSpicePortList(ChardevSpicePortList * obj);
void qapi_free_ChardevSpicePort(ChardevSpicePort * obj);

struct ChardevVC
{
    bool has_width;
    int64_t width;
    bool has_height;
    int64_t height;
    bool has_cols;
    int64_t cols;
    bool has_rows;
    int64_t rows;
};

void qapi_free_ChardevVCList(ChardevVCList * obj);
void qapi_free_ChardevVC(ChardevVC * obj);

struct ChardevRingbuf
{
    bool has_size;
    int64_t size;
};

void qapi_free_ChardevRingbufList(ChardevRingbufList * obj);
void qapi_free_ChardevRingbuf(ChardevRingbuf * obj);

struct ChardevDummy
{
};

void qapi_free_ChardevDummyList(ChardevDummyList * obj);
void qapi_free_ChardevDummy(ChardevDummy * obj);

struct ChardevBackend
{
    ChardevBackendKind kind;
    union {
        void *data;
        ChardevFile * file;
        ChardevHostdev * serial;
        ChardevHostdev * parallel;
        ChardevHostdev * pipe;
        ChardevSocket * socket;
        ChardevUdp * udp;
        ChardevDummy * pty;
        ChardevDummy * null;
        ChardevMux * mux;
        ChardevDummy * msmouse;
        ChardevDummy * braille;
        ChardevStdio * stdio;
        ChardevDummy * console;
        ChardevSpiceChannel * spicevmc;
        ChardevSpicePort * spiceport;
        ChardevVC * vc;
        ChardevRingbuf * ringbuf;
        ChardevRingbuf * memory;
    };
};
void qapi_free_ChardevBackendList(ChardevBackendList * obj);
void qapi_free_ChardevBackend(ChardevBackend * obj);

struct ChardevReturn
{
    bool has_pty;
    char * pty;
};

void qapi_free_ChardevReturnList(ChardevReturnList * obj);
void qapi_free_ChardevReturn(ChardevReturn * obj);

void qapi_free_TpmModelList(TpmModelList * obj);

void qapi_free_TpmTypeList(TpmTypeList * obj);

struct TPMPassthroughOptions
{
    bool has_path;
    char * path;
    bool has_cancel_path;
    char * cancel_path;
};

void qapi_free_TPMPassthroughOptionsList(TPMPassthroughOptionsList * obj);
void qapi_free_TPMPassthroughOptions(TPMPassthroughOptions * obj);

struct TpmTypeOptions
{
    TpmTypeOptionsKind kind;
    union {
        void *data;
        TPMPassthroughOptions * passthrough;
    };
};
void qapi_free_TpmTypeOptionsList(TpmTypeOptionsList * obj);
void qapi_free_TpmTypeOptions(TpmTypeOptions * obj);

struct TPMInfo
{
    char * id;
    TpmModel model;
    TpmTypeOptions * options;
};

void qapi_free_TPMInfoList(TPMInfoList * obj);
void qapi_free_TPMInfo(TPMInfo * obj);

struct AcpiTableOptions
{
    bool has_sig;
    char * sig;
    bool has_rev;
    uint8_t rev;
    bool has_oem_id;
    char * oem_id;
    bool has_oem_table_id;
    char * oem_table_id;
    bool has_oem_rev;
    uint32_t oem_rev;
    bool has_asl_compiler_id;
    char * asl_compiler_id;
    bool has_asl_compiler_rev;
    uint32_t asl_compiler_rev;
    bool has_file;
    char * file;
    bool has_data;
    char * data;
};

void qapi_free_AcpiTableOptionsList(AcpiTableOptionsList * obj);
void qapi_free_AcpiTableOptions(AcpiTableOptions * obj);

void qapi_free_CommandLineParameterTypeList(CommandLineParameterTypeList * obj);

struct CommandLineParameterInfo
{
    char * name;
    CommandLineParameterType type;
    bool has_help;
    char * help;
};

void qapi_free_CommandLineParameterInfoList(CommandLineParameterInfoList * obj);
void qapi_free_CommandLineParameterInfo(CommandLineParameterInfo * obj);

struct CommandLineOptionInfo
{
    char * option;
    CommandLineParameterInfoList * parameters;
};

void qapi_free_CommandLineOptionInfoList(CommandLineOptionInfoList * obj);
void qapi_free_CommandLineOptionInfo(CommandLineOptionInfo * obj);

void qapi_free_X86CPURegister32List(X86CPURegister32List * obj);

struct X86CPUFeatureWordInfo
{
    int64_t cpuid_input_eax;
    bool has_cpuid_input_ecx;
    int64_t cpuid_input_ecx;
    X86CPURegister32 cpuid_register;
    int64_t features;
};

void qapi_free_X86CPUFeatureWordInfoList(X86CPUFeatureWordInfoList * obj);
void qapi_free_X86CPUFeatureWordInfo(X86CPUFeatureWordInfo * obj);

void qapi_free_RxStateList(RxStateList * obj);

struct RxFilterInfo
{
    char * name;
    bool promiscuous;
    RxState multicast;
    RxState unicast;
    bool broadcast_allowed;
    bool multicast_overflow;
    bool unicast_overflow;
    char * main_mac;
    intList * vlan_table;
    strList * unicast_table;
    strList * multicast_table;
};

void qapi_free_RxFilterInfoList(RxFilterInfoList * obj);
void qapi_free_RxFilterInfo(RxFilterInfo * obj);

void qapi_free_BlockdevDiscardOptionsList(BlockdevDiscardOptionsList * obj);

void qapi_free_BlockdevAioOptionsList(BlockdevAioOptionsList * obj);

struct BlockdevCacheOptions
{
    bool has_writeback;
    bool writeback;
    bool has_direct;
    bool direct;
    bool has_no_flush;
    bool no_flush;
};

void qapi_free_BlockdevCacheOptionsList(BlockdevCacheOptionsList * obj);
void qapi_free_BlockdevCacheOptions(BlockdevCacheOptions * obj);

struct BlockdevOptionsBase
{
    char * driver;
    bool has_id;
    char * id;
    bool has_discard;
    BlockdevDiscardOptions discard;
    bool has_cache;
    BlockdevCacheOptions * cache;
    bool has_aio;
    BlockdevAioOptions aio;
    bool has_rerror;
    BlockdevOnError rerror;
    bool has_werror;
    BlockdevOnError werror;
    bool has_read_only;
    bool read_only;
};

void qapi_free_BlockdevOptionsBaseList(BlockdevOptionsBaseList * obj);
void qapi_free_BlockdevOptionsBase(BlockdevOptionsBase * obj);

struct BlockdevOptionsFile
{
    char * filename;
};

void qapi_free_BlockdevOptionsFileList(BlockdevOptionsFileList * obj);
void qapi_free_BlockdevOptionsFile(BlockdevOptionsFile * obj);

struct BlockdevOptionsVVFAT
{
    char * dir;
    bool has_fat_type;
    int64_t fat_type;
    bool has_floppy;
    bool floppy;
    bool has_rw;
    bool rw;
};

void qapi_free_BlockdevOptionsVVFATList(BlockdevOptionsVVFATList * obj);
void qapi_free_BlockdevOptionsVVFAT(BlockdevOptionsVVFAT * obj);

struct BlockdevOptionsGenericFormat
{
    BlockdevRef * file;
};

void qapi_free_BlockdevOptionsGenericFormatList(BlockdevOptionsGenericFormatList * obj);
void qapi_free_BlockdevOptionsGenericFormat(BlockdevOptionsGenericFormat * obj);

struct BlockdevOptionsGenericCOWFormat
{
    BlockdevOptionsGenericFormat * base;
    bool has_backing;
    BlockdevRef * backing;
};

void qapi_free_BlockdevOptionsGenericCOWFormatList(BlockdevOptionsGenericCOWFormatList * obj);
void qapi_free_BlockdevOptionsGenericCOWFormat(BlockdevOptionsGenericCOWFormat * obj);

struct BlockdevOptionsQcow2
{
    BlockdevOptionsGenericCOWFormat * base;
    bool has_lazy_refcounts;
    bool lazy_refcounts;
    bool has_pass_discard_request;
    bool pass_discard_request;
    bool has_pass_discard_snapshot;
    bool pass_discard_snapshot;
    bool has_pass_discard_other;
    bool pass_discard_other;
};

void qapi_free_BlockdevOptionsQcow2List(BlockdevOptionsQcow2List * obj);
void qapi_free_BlockdevOptionsQcow2(BlockdevOptionsQcow2 * obj);

struct BlockdevOptions
{
    BlockdevOptionsKind kind;
    union {
        void *data;
        BlockdevOptionsFile * file;
        BlockdevOptionsFile * http;
        BlockdevOptionsFile * https;
        BlockdevOptionsFile * ftp;
        BlockdevOptionsFile * ftps;
        BlockdevOptionsFile * tftp;
        BlockdevOptionsVVFAT * vvfat;
        BlockdevOptionsGenericFormat * bochs;
        BlockdevOptionsGenericFormat * cloop;
        BlockdevOptionsGenericCOWFormat * cow;
        BlockdevOptionsGenericFormat * dmg;
        BlockdevOptionsGenericFormat * parallels;
        BlockdevOptionsGenericCOWFormat * qcow;
        BlockdevOptionsQcow2 * qcow2;
        BlockdevOptionsGenericCOWFormat * qed;
        BlockdevOptionsGenericFormat * raw;
        BlockdevOptionsGenericFormat * vdi;
        BlockdevOptionsGenericFormat * vhdx;
        BlockdevOptionsGenericCOWFormat * vmdk;
        BlockdevOptionsGenericFormat * vpc;
    };
    bool has_id;
    char * id;
    bool has_discard;
    BlockdevDiscardOptions discard;
    bool has_cache;
    BlockdevCacheOptions * cache;
    bool has_aio;
    BlockdevAioOptions aio;
    bool has_rerror;
    BlockdevOnError rerror;
    bool has_werror;
    BlockdevOnError werror;
    bool has_read_only;
    bool read_only;
};
void qapi_free_BlockdevOptionsList(BlockdevOptionsList * obj);
void qapi_free_BlockdevOptions(BlockdevOptions * obj);

struct BlockdevRef
{
    BlockdevRefKind kind;
    union {
        void *data;
        BlockdevOptions * definition;
        char * reference;
    };
};
extern const int BlockdevRef_qtypes[];
void qapi_free_BlockdevRefList(BlockdevRefList * obj);
void qapi_free_BlockdevRef(BlockdevRef * obj);

#endif
