// WARNING: This file is machine generated by fidlc.

#include <lib/fidl/internal.h>


extern const struct FidlCodedXUnion fidl_test_arrays_UnionSmallArrayTable;
extern const struct FidlCodedXUnion fidl_test_arrays_UnionSmallArrayNullableRefTable;
extern const struct FidlCodedXUnion fidl_test_arrays_UnionLargeArrayTable;
extern const struct FidlCodedXUnion fidl_test_arrays_UnionLargeArrayNullableRefTable;
extern const struct FidlCodedTable fidl_test_arrays_TableSmallArrayTable;
extern const struct FidlCodedTable fidl_test_arrays_TableLargeArrayTable;
extern const struct FidlCodedStruct fidl_test_arrays_StructSmallArrayTable;
extern const struct FidlCodedStruct fidl_test_arrays_StructLargeArrayTable;


static const struct FidlCodedArray Array8_6uint32Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&fidl_internal_kUint32Table), .array_size=8u, .element_size=4u};

static const struct FidlCodedArray Array400_6uint32Table __attribute__((unused)) = {.tag=kFidlTypeArray, .element=(fidl_type_t*)(&fidl_internal_kUint32Table), .array_size=400u, .element_size=4u};


static const struct FidlXUnionField Fields32fidl_test_arrays_UnionSmallArray[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&Array8_6uint32Table)}
};
const struct FidlCodedXUnion fidl_test_arrays_UnionSmallArrayTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields32fidl_test_arrays_UnionSmallArray, .nullable=kFidlNullability_Nonnullable, .name="fidl.test.arrays/UnionSmallArray", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields43fidl_test_arrays_UnionSmallArrayNullableRef[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&Array8_6uint32Table)}
};
const struct FidlCodedXUnion fidl_test_arrays_UnionSmallArrayNullableRefTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields43fidl_test_arrays_UnionSmallArrayNullableRef, .nullable=kFidlNullability_Nullable, .name="fidl.test.arrays/UnionSmallArray", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields32fidl_test_arrays_UnionLargeArray[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&Array400_6uint32Table)}
};
const struct FidlCodedXUnion fidl_test_arrays_UnionLargeArrayTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields32fidl_test_arrays_UnionLargeArray, .nullable=kFidlNullability_Nonnullable, .name="fidl.test.arrays/UnionLargeArray", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields43fidl_test_arrays_UnionLargeArrayNullableRef[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&Array400_6uint32Table)}
};
const struct FidlCodedXUnion fidl_test_arrays_UnionLargeArrayNullableRefTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields43fidl_test_arrays_UnionLargeArrayNullableRef, .nullable=kFidlNullability_Nullable, .name="fidl.test.arrays/UnionLargeArray", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static const struct FidlTableField Fields32fidl_test_arrays_TableSmallArray[] = {
    /*FidlTableField*/{.type=(fidl_type_t*)(&Array8_6uint32Table), .ordinal=1u}
};
const struct FidlCodedTable fidl_test_arrays_TableSmallArrayTable = {.tag=kFidlTypeTable, .fields=Fields32fidl_test_arrays_TableSmallArray, .field_count=1u, .is_resource=kFidlIsResource_NotResource, .name="fidl.test.arrays/TableSmallArray"};

static const struct FidlTableField Fields32fidl_test_arrays_TableLargeArray[] = {
    /*FidlTableField*/{.type=(fidl_type_t*)(&Array400_6uint32Table), .ordinal=1u}
};
const struct FidlCodedTable fidl_test_arrays_TableLargeArrayTable = {.tag=kFidlTypeTable, .fields=Fields32fidl_test_arrays_TableLargeArray, .field_count=1u, .is_resource=kFidlIsResource_NotResource, .name="fidl.test.arrays/TableLargeArray"};

const struct FidlCodedStruct fidl_test_arrays_StructSmallArrayTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=8u, .name="fidl.test.arrays/StructSmallArray"};

const struct FidlCodedStruct fidl_test_arrays_StructLargeArrayTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=400u, .name="fidl.test.arrays/StructLargeArray"};

