// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Code generated by tools/fidl/gidl-conformance-suite/regen.sh; DO NOT EDIT.

// +build fuchsia

//
// Code generated by fidlgen; DO NOT EDIT.

package conformance

import (
	_zx "syscall/zx"
	_bindings "syscall/zx/fidl"
)

type UnionWithBoundStringStruct struct {
	_ struct{}             `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	V UnionWithBoundString `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mUnionWithBoundStringStruct = _bindings.CreateLazyMarshaler(UnionWithBoundStringStruct{})

func (msg *UnionWithBoundStringStruct) Marshaler() _bindings.Marshaler {
	return _mUnionWithBoundStringStruct
}

type SingleVariantUnionStruct struct {
	_ struct{}           `fidl:"s,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	U SingleVariantUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mSingleVariantUnionStruct = _bindings.CreateLazyMarshaler(SingleVariantUnionStruct{})

func (msg *SingleVariantUnionStruct) Marshaler() _bindings.Marshaler {
	return _mSingleVariantUnionStruct
}

type SandwichUnionSize8Alignment4 struct {
	_      struct{}             `fidl:"s,16,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before uint32               `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Value  UnionSize8Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After  uint32               `fidl:"12" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwichUnionSize8Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize8Alignment4{})

func (msg *SandwichUnionSize8Alignment4) Marshaler() _bindings.Marshaler {
	return _mSandwichUnionSize8Alignment4
}

type SandwichUnionSize12Alignment4 struct {
	_      struct{}              `fidl:"s,20,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Value  UnionSize12Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After  uint32                `fidl:"16" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwichUnionSize12Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize12Alignment4{})

func (msg *SandwichUnionSize12Alignment4) Marshaler() _bindings.Marshaler {
	return _mSandwichUnionSize12Alignment4
}

type StructSize16Alignment8 struct {
	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
}

var _mStructSize16Alignment8 = _bindings.CreateLazyMarshaler(StructSize16Alignment8{})

func (msg *StructSize16Alignment8) Marshaler() _bindings.Marshaler {
	return _mStructSize16Alignment8
}

type SandwichUnionSize24Alignment8 struct {
	_      struct{}              `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Value  UnionSize24Alignment8 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After  uint32                `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwichUnionSize24Alignment8 = _bindings.CreateLazyMarshaler(SandwichUnionSize24Alignment8{})

func (msg *SandwichUnionSize24Alignment8) Marshaler() _bindings.Marshaler {
	return _mSandwichUnionSize24Alignment8
}

type SandwichUnionSize36Alignment4 struct {
	_      struct{}              `fidl:"s,44,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Value  UnionSize36Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After  uint32                `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwichUnionSize36Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize36Alignment4{})

func (msg *SandwichUnionSize36Alignment4) Marshaler() _bindings.Marshaler {
	return _mSandwichUnionSize36Alignment4
}

type Length2StringWrapper struct {
	_             struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Length2String string   `fidl:"0,2" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mLength2StringWrapper = _bindings.CreateLazyMarshaler(Length2StringWrapper{})

func (msg *Length2StringWrapper) Marshaler() _bindings.Marshaler {
	return _mLength2StringWrapper
}

type StringWrapper struct {
	_   struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Str string   `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStringWrapper = _bindings.CreateLazyMarshaler(StringWrapper{})

func (msg *StringWrapper) Marshaler() _bindings.Marshaler {
	return _mStringWrapper
}

type TestXUnionInTable struct {
	_     struct{}      `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Value XUnionInTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTestXUnionInTable = _bindings.CreateLazyMarshaler(TestXUnionInTable{})

func (msg *TestXUnionInTable) Marshaler() _bindings.Marshaler {
	return _mTestXUnionInTable
}

type InterfaceConfig struct {
	_               struct{}        `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Name            string          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	IpAddressConfig IpAddressConfig `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
}

var _mInterfaceConfig = _bindings.CreateLazyMarshaler(InterfaceConfig{})

func (msg *InterfaceConfig) Marshaler() _bindings.Marshaler {
	return _mInterfaceConfig
}

type TestAddEthernetDeviceRequest struct {
	_                   struct{}        `fidl:"s,72,8" fidl_size_v1:"64" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
	TopologicalPath     string          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Config              InterfaceConfig `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	ThisShouldBeAHandle uint32          `fidl:"64" fidl_offset_v1:"56" fidl_offset_v1_no_ee:"56"`
}

var _mTestAddEthernetDeviceRequest = _bindings.CreateLazyMarshaler(TestAddEthernetDeviceRequest{})

func (msg *TestAddEthernetDeviceRequest) Marshaler() _bindings.Marshaler {
	return _mTestAddEthernetDeviceRequest
}

type NodeAttributes struct {
	_                struct{} `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
	Mode             uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Id               uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	ContentSize      uint64   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	StorageSize      uint64   `fidl:"24" fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
	LinkCount        uint64   `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
	CreationTime     uint64   `fidl:"40" fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
	ModificationTime uint64   `fidl:"48" fidl_offset_v1:"48" fidl_offset_v1_no_ee:"48"`
}

var _mNodeAttributes = _bindings.CreateLazyMarshaler(NodeAttributes{})

func (msg *NodeAttributes) Marshaler() _bindings.Marshaler {
	return _mNodeAttributes
}

type FileGetAttrResponse struct {
	_          struct{}       `fidl:"s,64,8" fidl_size_v1:"64" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
	S          int32          `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Attributes NodeAttributes `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
}

var _mFileGetAttrResponse = _bindings.CreateLazyMarshaler(FileGetAttrResponse{})

func (msg *FileGetAttrResponse) Marshaler() _bindings.Marshaler {
	return _mFileGetAttrResponse
}

type StructOfSimpleTable struct {
	_     struct{}    `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table SimpleTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructOfSimpleTable = _bindings.CreateLazyMarshaler(StructOfSimpleTable{})

func (msg *StructOfSimpleTable) Marshaler() _bindings.Marshaler {
	return _mStructOfSimpleTable
}

type SimpleTableThenUint64 struct {
	_      struct{}    `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Table  SimpleTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Number uint64      `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
}

var _mSimpleTableThenUint64 = _bindings.CreateLazyMarshaler(SimpleTableThenUint64{})

func (msg *SimpleTableThenUint64) Marshaler() _bindings.Marshaler {
	return _mSimpleTableThenUint64
}

type StructOfTableWithStringAndVector struct {
	_     struct{}                 `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableWithStringAndVector `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructOfTableWithStringAndVector = _bindings.CreateLazyMarshaler(StructOfTableWithStringAndVector{})

func (msg *StructOfTableWithStringAndVector) Marshaler() _bindings.Marshaler {
	return _mStructOfTableWithStringAndVector
}

type Int64Struct struct {
	_ struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	X int64    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mInt64Struct = _bindings.CreateLazyMarshaler(Int64Struct{})

func (msg *Int64Struct) Marshaler() _bindings.Marshaler {
	return _mInt64Struct
}

type TestInlineXUnionInStruct struct {
	_      struct{}     `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
	Before string       `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Xu     SampleXUnion `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	After  string       `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
}

var _mTestInlineXUnionInStruct = _bindings.CreateLazyMarshaler(TestInlineXUnionInStruct{})

func (msg *TestInlineXUnionInStruct) Marshaler() _bindings.Marshaler {
	return _mTestInlineXUnionInStruct
}

type TestOptionalXUnionInStruct struct {
	_      struct{}      `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
	Before string        `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Xu     *SampleXUnion `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	After  string        `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
}

var _mTestOptionalXUnionInStruct = _bindings.CreateLazyMarshaler(TestOptionalXUnionInStruct{})

func (msg *TestOptionalXUnionInStruct) Marshaler() _bindings.Marshaler {
	return _mTestOptionalXUnionInStruct
}

type TestStrictXUnionInStruct struct {
	_  struct{}           `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu SampleStrictXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTestStrictXUnionInStruct = _bindings.CreateLazyMarshaler(TestStrictXUnionInStruct{})

func (msg *TestStrictXUnionInStruct) Marshaler() _bindings.Marshaler {
	return _mTestStrictXUnionInStruct
}

type TestFlexibleXUnionInStruct struct {
	_  struct{}     `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu SampleXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTestFlexibleXUnionInStruct = _bindings.CreateLazyMarshaler(TestFlexibleXUnionInStruct{})

func (msg *TestFlexibleXUnionInStruct) Marshaler() _bindings.Marshaler {
	return _mTestFlexibleXUnionInStruct
}

type StructWithOptionals struct {
	_   struct{}               `fidl:"s,104,8" fidl_size_v1:"128" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"128" fidl_alignment_v1_no_ee:"8"`
	S   EmptyStruct            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	S2  *EmptyStruct           `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	T   TableWithEmptyStruct   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	Xu  XUnionWithEmptyStruct  `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
	Xu2 *XUnionWithEmptyStruct `fidl:"56" fidl_offset_v1:"56" fidl_offset_v1_no_ee:"56"`
	U   UnionWithEmptyStruct   `fidl:"80" fidl_offset_v1:"80" fidl_offset_v1_no_ee:"80"`
	U2  *UnionWithEmptyStruct  `fidl:"96" fidl_offset_v1:"104" fidl_offset_v1_no_ee:"104"`
}

var _mStructWithOptionals = _bindings.CreateLazyMarshaler(StructWithOptionals{})

func (msg *StructWithOptionals) Marshaler() _bindings.Marshaler {
	return _mStructWithOptionals
}

type EmptyStruct struct {
	_ struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
}

var _mEmptyStruct = _bindings.CreateLazyMarshaler(EmptyStruct{})

func (msg *EmptyStruct) Marshaler() _bindings.Marshaler {
	return _mEmptyStruct
}

type EmptyStructSandwich struct {
	_      struct{}    `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before string      `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Es     EmptyStruct `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	After  string      `fidl:"24," fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
}

var _mEmptyStructSandwich = _bindings.CreateLazyMarshaler(EmptyStructSandwich{})

func (msg *EmptyStructSandwich) Marshaler() _bindings.Marshaler {
	return _mEmptyStructSandwich
}

type Uint8Uint16Uint32Uint64 struct {
	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	F1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint16   `fidl:"2" fidl_offset_v1:"2" fidl_offset_v1_no_ee:"2"`
	F3 uint32   `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
	F4 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
}

var _mUint8Uint16Uint32Uint64 = _bindings.CreateLazyMarshaler(Uint8Uint16Uint32Uint64{})

func (msg *Uint8Uint16Uint32Uint64) Marshaler() _bindings.Marshaler {
	return _mUint8Uint16Uint32Uint64
}

type Uint64Uint32Uint16Uint8 struct {
	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint32   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	F3 uint16   `fidl:"12" fidl_offset_v1:"12" fidl_offset_v1_no_ee:"12"`
	F4 uint8    `fidl:"14" fidl_offset_v1:"14" fidl_offset_v1_no_ee:"14"`
}

var _mUint64Uint32Uint16Uint8 = _bindings.CreateLazyMarshaler(Uint64Uint32Uint16Uint8{})

func (msg *Uint64Uint32Uint16Uint8) Marshaler() _bindings.Marshaler {
	return _mUint64Uint32Uint16Uint8
}

type ThreeByte struct {
	_     struct{} `fidl:"s,3,1" fidl_size_v1:"3" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"3" fidl_alignment_v1_no_ee:"1"`
	Elem1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Elem2 uint8    `fidl:"1" fidl_offset_v1:"1" fidl_offset_v1_no_ee:"1"`
	Elem3 uint8    `fidl:"2" fidl_offset_v1:"2" fidl_offset_v1_no_ee:"2"`
}

var _mThreeByte = _bindings.CreateLazyMarshaler(ThreeByte{})

func (msg *ThreeByte) Marshaler() _bindings.Marshaler {
	return _mThreeByte
}

type FiveByte struct {
	_     struct{} `fidl:"s,8,4" fidl_size_v1:"8" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"4"`
	Elem1 uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Elem2 uint8    `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
}

var _mFiveByte = _bindings.CreateLazyMarshaler(FiveByte{})

func (msg *FiveByte) Marshaler() _bindings.Marshaler {
	return _mFiveByte
}

type ThreeByteInStruct struct {
	_     struct{}  `fidl:"s,9,1" fidl_size_v1:"9" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"9" fidl_alignment_v1_no_ee:"1"`
	Elem1 ThreeByte `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Elem2 ThreeByte `fidl:"3" fidl_offset_v1:"3" fidl_offset_v1_no_ee:"3"`
	Elem3 ThreeByte `fidl:"6" fidl_offset_v1:"6" fidl_offset_v1_no_ee:"6"`
}

var _mThreeByteInStruct = _bindings.CreateLazyMarshaler(ThreeByteInStruct{})

func (msg *ThreeByteInStruct) Marshaler() _bindings.Marshaler {
	return _mThreeByteInStruct
}

type FiveByteInStruct struct {
	_     struct{} `fidl:"s,24,4" fidl_size_v1:"24" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"4"`
	Elem1 FiveByte `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Elem2 FiveByte `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	Elem3 FiveByte `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
}

var _mFiveByteInStruct = _bindings.CreateLazyMarshaler(FiveByteInStruct{})

func (msg *FiveByteInStruct) Marshaler() _bindings.Marshaler {
	return _mFiveByteInStruct
}

type ThreeByteInVector struct {
	_     struct{}    `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Elems []ThreeByte `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mThreeByteInVector = _bindings.CreateLazyMarshaler(ThreeByteInVector{})

func (msg *ThreeByteInVector) Marshaler() _bindings.Marshaler {
	return _mThreeByteInVector
}

type FiveByteInVector struct {
	_     struct{}   `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Elems []FiveByte `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mFiveByteInVector = _bindings.CreateLazyMarshaler(FiveByteInVector{})

func (msg *FiveByteInVector) Marshaler() _bindings.Marshaler {
	return _mFiveByteInVector
}

type ThreeByteInArray struct {
	_     struct{}     `fidl:"s,9,1" fidl_size_v1:"9" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"9" fidl_alignment_v1_no_ee:"1"`
	Elems [3]ThreeByte `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mThreeByteInArray = _bindings.CreateLazyMarshaler(ThreeByteInArray{})

func (msg *ThreeByteInArray) Marshaler() _bindings.Marshaler {
	return _mThreeByteInArray
}

type FiveByteInArray struct {
	_     struct{}    `fidl:"s,24,4" fidl_size_v1:"24" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"4"`
	Elems [3]FiveByte `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mFiveByteInArray = _bindings.CreateLazyMarshaler(FiveByteInArray{})

func (msg *FiveByteInArray) Marshaler() _bindings.Marshaler {
	return _mFiveByteInArray
}

type StructWithInt struct {
	_ struct{} `fidl:"s,4,4" fidl_size_v1:"4" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"4"`
	X int32    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructWithInt = _bindings.CreateLazyMarshaler(StructWithInt{})

func (msg *StructWithInt) Marshaler() _bindings.Marshaler {
	return _mStructWithInt
}

type StructWithArrays struct {
	_                 struct{}          `fidl:"s,120,8" fidl_size_v1:"120" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"120" fidl_alignment_v1_no_ee:"8"`
	ArrInt            [2]int32          `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	ArrString         [2]string         `fidl:"8," fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	ArrNullableString [2]*string        `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
	ArrStruct         [2]StructWithInt  `fidl:"72" fidl_offset_v1:"72" fidl_offset_v1_no_ee:"72"`
	ArrNullableStruct [2]*StructWithInt `fidl:"80" fidl_offset_v1:"80" fidl_offset_v1_no_ee:"80"`
	ArrArrInt         [2][3]int32       `fidl:"96" fidl_offset_v1:"96" fidl_offset_v1_no_ee:"96"`
}

var _mStructWithArrays = _bindings.CreateLazyMarshaler(StructWithArrays{})

func (msg *StructWithArrays) Marshaler() _bindings.Marshaler {
	return _mStructWithArrays
}

type StructWithVectors struct {
	_                 struct{}         `fidl:"s,112,8" fidl_size_v1:"112" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"112" fidl_alignment_v1_no_ee:"8"`
	VecEmpty          []int32          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	VecInt            []int32          `fidl:"16," fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	VecString         []string         `fidl:"32,," fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
	VecNullableString []*string        `fidl:"48,," fidl_offset_v1:"48" fidl_offset_v1_no_ee:"48"`
	VecStruct         []StructWithInt  `fidl:"64," fidl_offset_v1:"64" fidl_offset_v1_no_ee:"64"`
	VecNullableStruct []*StructWithInt `fidl:"80," fidl_offset_v1:"80" fidl_offset_v1_no_ee:"80"`
	VecVecInt         [][]int32        `fidl:"96,," fidl_offset_v1:"96" fidl_offset_v1_no_ee:"96"`
}

var _mStructWithVectors = _bindings.CreateLazyMarshaler(StructWithVectors{})

func (msg *StructWithVectors) Marshaler() _bindings.Marshaler {
	return _mStructWithVectors
}

type MyBool struct {
	_     struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
	Value bool     `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyBool = _bindings.CreateLazyMarshaler(MyBool{})

func (msg *MyBool) Marshaler() _bindings.Marshaler {
	return _mMyBool
}

type MyByte struct {
	_     struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
	Value uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyByte = _bindings.CreateLazyMarshaler(MyByte{})

func (msg *MyByte) Marshaler() _bindings.Marshaler {
	return _mMyByte
}

type MyInt8 struct {
	_     struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
	Value int8     `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyInt8 = _bindings.CreateLazyMarshaler(MyInt8{})

func (msg *MyInt8) Marshaler() _bindings.Marshaler {
	return _mMyInt8
}

type MyInt16 struct {
	_     struct{} `fidl:"s,2,2" fidl_size_v1:"2" fidl_alignment_v1:"2" fidl_size_v1_no_ee:"2" fidl_alignment_v1_no_ee:"2"`
	Value int16    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyInt16 = _bindings.CreateLazyMarshaler(MyInt16{})

func (msg *MyInt16) Marshaler() _bindings.Marshaler {
	return _mMyInt16
}

type MyInt32 struct {
	_     struct{} `fidl:"s,4,4" fidl_size_v1:"4" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"4"`
	Value int32    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyInt32 = _bindings.CreateLazyMarshaler(MyInt32{})

func (msg *MyInt32) Marshaler() _bindings.Marshaler {
	return _mMyInt32
}

type MyInt64 struct {
	_     struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	Value int64    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyInt64 = _bindings.CreateLazyMarshaler(MyInt64{})

func (msg *MyInt64) Marshaler() _bindings.Marshaler {
	return _mMyInt64
}

type MyUint8 struct {
	_     struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
	Value uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyUint8 = _bindings.CreateLazyMarshaler(MyUint8{})

func (msg *MyUint8) Marshaler() _bindings.Marshaler {
	return _mMyUint8
}

type MyUint16 struct {
	_     struct{} `fidl:"s,2,2" fidl_size_v1:"2" fidl_alignment_v1:"2" fidl_size_v1_no_ee:"2" fidl_alignment_v1_no_ee:"2"`
	Value uint16   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyUint16 = _bindings.CreateLazyMarshaler(MyUint16{})

func (msg *MyUint16) Marshaler() _bindings.Marshaler {
	return _mMyUint16
}

type MyUint32 struct {
	_     struct{} `fidl:"s,4,4" fidl_size_v1:"4" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"4"`
	Value uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyUint32 = _bindings.CreateLazyMarshaler(MyUint32{})

func (msg *MyUint32) Marshaler() _bindings.Marshaler {
	return _mMyUint32
}

type MyUint64 struct {
	_     struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	Value uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyUint64 = _bindings.CreateLazyMarshaler(MyUint64{})

func (msg *MyUint64) Marshaler() _bindings.Marshaler {
	return _mMyUint64
}

type MyFloat32 struct {
	_     struct{} `fidl:"s,4,4" fidl_size_v1:"4" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"4"`
	Value float32  `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyFloat32 = _bindings.CreateLazyMarshaler(MyFloat32{})

func (msg *MyFloat32) Marshaler() _bindings.Marshaler {
	return _mMyFloat32
}

type MyFloat64 struct {
	_     struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	Value float64  `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyFloat64 = _bindings.CreateLazyMarshaler(MyFloat64{})

func (msg *MyFloat64) Marshaler() _bindings.Marshaler {
	return _mMyFloat64
}

type StructSize16Align8 struct {
	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
}

var _mStructSize16Align8 = _bindings.CreateLazyMarshaler(StructSize16Align8{})

func (msg *StructSize16Align8) Marshaler() _bindings.Marshaler {
	return _mStructSize16Align8
}

type Sandwich1 struct {
	_        struct{}         `fidl:"s,16,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32           `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionSize8Align4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32           `fidl:"12" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich1 = _bindings.CreateLazyMarshaler(Sandwich1{})

func (msg *Sandwich1) Marshaler() _bindings.Marshaler {
	return _mSandwich1
}

type Sandwich2 struct {
	_        struct{}          `fidl:"s,20,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionSize12Align4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32            `fidl:"16" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich2 = _bindings.CreateLazyMarshaler(Sandwich2{})

func (msg *Sandwich2) Marshaler() _bindings.Marshaler {
	return _mSandwich2
}

type Sandwich3 struct {
	_        struct{}          `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionSize24Align8 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32            `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich3 = _bindings.CreateLazyMarshaler(Sandwich3{})

func (msg *Sandwich3) Marshaler() _bindings.Marshaler {
	return _mSandwich3
}

type Sandwich4 struct {
	_        struct{}          `fidl:"s,44,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionSize36Align4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32            `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich4 = _bindings.CreateLazyMarshaler(Sandwich4{})

func (msg *Sandwich4) Marshaler() _bindings.Marshaler {
	return _mSandwich4
}

type Sandwich5 struct {
	_            struct{}     `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before       uint32       `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	UnionOfUnion UnionOfUnion `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After        uint32       `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich5 = _bindings.CreateLazyMarshaler(Sandwich5{})

func (msg *Sandwich5) Marshaler() _bindings.Marshaler {
	return _mSandwich5
}

type StructSize3Align1 struct {
	_          struct{} `fidl:"s,3,1" fidl_size_v1:"3" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"3" fidl_alignment_v1_no_ee:"1"`
	ThreeBytes [3]uint8 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructSize3Align1 = _bindings.CreateLazyMarshaler(StructSize3Align1{})

func (msg *StructSize3Align1) Marshaler() _bindings.Marshaler {
	return _mStructSize3Align1
}

type StructSize3Align2 struct {
	_  struct{} `fidl:"s,4,2" fidl_size_v1:"4" fidl_alignment_v1:"2" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"2"`
	F1 uint16   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint8    `fidl:"2" fidl_offset_v1:"2" fidl_offset_v1_no_ee:"2"`
}

var _mStructSize3Align2 = _bindings.CreateLazyMarshaler(StructSize3Align2{})

func (msg *StructSize3Align2) Marshaler() _bindings.Marshaler {
	return _mStructSize3Align2
}

type Sandwich6 struct {
	_        struct{}        `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32          `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionWithVector `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32          `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich6 = _bindings.CreateLazyMarshaler(Sandwich6{})

func (msg *Sandwich6) Marshaler() _bindings.Marshaler {
	return _mSandwich6
}

type Sandwich7 struct {
	_            struct{}   `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Before       uint32     `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	OptSandwich1 *Sandwich1 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After        uint32     `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
}

var _mSandwich7 = _bindings.CreateLazyMarshaler(Sandwich7{})

func (msg *Sandwich7) Marshaler() _bindings.Marshaler {
	return _mSandwich7
}

type Sandwich8 struct {
	_            struct{}     `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before       uint64       `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	UnionOfUnion UnionOfUnion `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After        uint32       `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich8 = _bindings.CreateLazyMarshaler(Sandwich8{})

func (msg *Sandwich8) Marshaler() _bindings.Marshaler {
	return _mSandwich8
}

type Regression1 struct {
	_  struct{} `fidl:"s,32,8" fidl_size_v1:"32" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	F1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint32   `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
	F3 uint8    `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	F4 uint16   `fidl:"10" fidl_offset_v1:"10" fidl_offset_v1_no_ee:"10"`
	F5 uint64   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	F6 uint8    `fidl:"24" fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
}

var _mRegression1 = _bindings.CreateLazyMarshaler(Regression1{})

func (msg *Regression1) Marshaler() _bindings.Marshaler {
	return _mRegression1
}

type Regression2 struct {
	_    struct{}    `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Head Regression1 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F7   uint8       `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mRegression2 = _bindings.CreateLazyMarshaler(Regression2{})

func (msg *Regression2) Marshaler() _bindings.Marshaler {
	return _mRegression2
}

type Regression3 struct {
	_        struct{}     `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	OptValue *Regression2 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mRegression3 = _bindings.CreateLazyMarshaler(Regression3{})

func (msg *Regression3) Marshaler() _bindings.Marshaler {
	return _mRegression3
}

type TableStructWithReservedSandwichStruct struct {
	_     struct{}                        `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableStructWithReservedSandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTableStructWithReservedSandwichStruct = _bindings.CreateLazyMarshaler(TableStructWithReservedSandwichStruct{})

func (msg *TableStructWithReservedSandwichStruct) Marshaler() _bindings.Marshaler {
	return _mTableStructWithReservedSandwichStruct
}

type TableStructWithUint32SandwichStruct struct {
	_     struct{}                      `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableStructWithUint32Sandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTableStructWithUint32SandwichStruct = _bindings.CreateLazyMarshaler(TableStructWithUint32SandwichStruct{})

func (msg *TableStructWithUint32SandwichStruct) Marshaler() _bindings.Marshaler {
	return _mTableStructWithUint32SandwichStruct
}

type TableUnionWithVectorReservedSandwichStruct struct {
	_     struct{}                             `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableUnionWithVectorReservedSandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTableUnionWithVectorReservedSandwichStruct = _bindings.CreateLazyMarshaler(TableUnionWithVectorReservedSandwichStruct{})

func (msg *TableUnionWithVectorReservedSandwichStruct) Marshaler() _bindings.Marshaler {
	return _mTableUnionWithVectorReservedSandwichStruct
}

type TableUnionWithVectorStructSandwichStruct struct {
	_     struct{}                           `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableUnionWithVectorStructSandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTableUnionWithVectorStructSandwichStruct = _bindings.CreateLazyMarshaler(TableUnionWithVectorStructSandwichStruct{})

func (msg *TableUnionWithVectorStructSandwichStruct) Marshaler() _bindings.Marshaler {
	return _mTableUnionWithVectorStructSandwichStruct
}

type XUnionWithStructStruct struct {
	_  struct{}         `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu XUnionWithStruct `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mXUnionWithStructStruct = _bindings.CreateLazyMarshaler(XUnionWithStructStruct{})

func (msg *XUnionWithStructStruct) Marshaler() _bindings.Marshaler {
	return _mXUnionWithStructStruct
}

type XUnionWithXUnionStruct struct {
	_  struct{}         `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu XUnionWithXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mXUnionWithXUnionStruct = _bindings.CreateLazyMarshaler(XUnionWithXUnionStruct{})

func (msg *XUnionWithXUnionStruct) Marshaler() _bindings.Marshaler {
	return _mXUnionWithXUnionStruct
}

type StructSize5Align1 struct {
	_    struct{} `fidl:"s,5,1" fidl_size_v1:"5" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"5" fidl_alignment_v1_no_ee:"1"`
	Data [5]uint8 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructSize5Align1 = _bindings.CreateLazyMarshaler(StructSize5Align1{})

func (msg *StructSize5Align1) Marshaler() _bindings.Marshaler {
	return _mStructSize5Align1
}

type StructSize5Align4 struct {
	_    struct{} `fidl:"s,8,4" fidl_size_v1:"8" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"4"`
	Four uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	One  uint8    `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
}

var _mStructSize5Align4 = _bindings.CreateLazyMarshaler(StructSize5Align4{})

func (msg *StructSize5Align4) Marshaler() _bindings.Marshaler {
	return _mStructSize5Align4
}

type StructSize5Align1Vector struct {
	_ struct{}            `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	V []StructSize5Align1 `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructSize5Align1Vector = _bindings.CreateLazyMarshaler(StructSize5Align1Vector{})

func (msg *StructSize5Align1Vector) Marshaler() _bindings.Marshaler {
	return _mStructSize5Align1Vector
}

type StructSize5Align4Vector struct {
	_ struct{}            `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	V []StructSize5Align4 `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructSize5Align4Vector = _bindings.CreateLazyMarshaler(StructSize5Align4Vector{})

func (msg *StructSize5Align4Vector) Marshaler() _bindings.Marshaler {
	return _mStructSize5Align4Vector
}

type StructSize5Align1Array struct {
	_ struct{}             `fidl:"s,15,1" fidl_size_v1:"15" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"15" fidl_alignment_v1_no_ee:"1"`
	A [3]StructSize5Align1 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructSize5Align1Array = _bindings.CreateLazyMarshaler(StructSize5Align1Array{})

func (msg *StructSize5Align1Array) Marshaler() _bindings.Marshaler {
	return _mStructSize5Align1Array
}

type StructSize5Align4Array struct {
	_ struct{}             `fidl:"s,24,4" fidl_size_v1:"24" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"4"`
	A [3]StructSize5Align4 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructSize5Align4Array = _bindings.CreateLazyMarshaler(StructSize5Align4Array{})

func (msg *StructSize5Align4Array) Marshaler() _bindings.Marshaler {
	return _mStructSize5Align4Array
}

type ArrayStruct struct {
	_              struct{}        `fidl:"s,96,8" fidl_size_v1:"144" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"144" fidl_alignment_v1_no_ee:"8"`
	Unions         [3]StringUnion  `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	OptionalUnions [3]*StringUnion `fidl:"72" fidl_offset_v1:"72" fidl_offset_v1_no_ee:"72"`
}

var _mArrayStruct = _bindings.CreateLazyMarshaler(ArrayStruct{})

func (msg *ArrayStruct) Marshaler() _bindings.Marshaler {
	return _mArrayStruct
}

type I_unionWithBoundStringTag uint32

const (
	_ I_unionWithBoundStringTag = iota
	UnionWithBoundStringBoundFiveStr
)

type UnionWithBoundString struct {
	I_unionWithBoundStringTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	BoundFiveStr              string `fidl:"1,5"`
}

func (u *UnionWithBoundString) Which() I_unionWithBoundStringTag {
	return u.I_unionWithBoundStringTag
}

func (u *UnionWithBoundString) SetBoundFiveStr(boundFiveStr string) {
	u.I_unionWithBoundStringTag = UnionWithBoundStringBoundFiveStr
	u.BoundFiveStr = boundFiveStr
}

func UnionWithBoundStringWithBoundFiveStr(boundFiveStr string) UnionWithBoundString {
	var _u UnionWithBoundString
	_u.SetBoundFiveStr(boundFiveStr)
	return _u
}

type I_singleVariantUnionTag uint32

const (
	_ I_singleVariantUnionTag = iota
	SingleVariantUnionX
)

type SingleVariantUnion struct {
	I_singleVariantUnionTag `fidl:"u,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	X                       uint32 `fidl:"1"`
}

func (u *SingleVariantUnion) Which() I_singleVariantUnionTag {
	return u.I_singleVariantUnionTag
}

func (u *SingleVariantUnion) SetX(x uint32) {
	u.I_singleVariantUnionTag = SingleVariantUnionX
	u.X = x
}

func SingleVariantUnionWithX(x uint32) SingleVariantUnion {
	var _u SingleVariantUnion
	_u.SetX(x)
	return _u
}

type I_unionSize8Alignment4Tag uint32

const (
	_ I_unionSize8Alignment4Tag = iota
	UnionSize8Alignment4Unused1
	UnionSize8Alignment4Unused2
	UnionSize8Alignment4Variant
)

type UnionSize8Alignment4 struct {
	I_unionSize8Alignment4Tag `fidl:"u,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                   uint8  `fidl:"1"`
	Unused2                   uint8  `fidl:"2"`
	Variant                   uint32 `fidl:"3"`
}

func (u *UnionSize8Alignment4) Which() I_unionSize8Alignment4Tag {
	return u.I_unionSize8Alignment4Tag
}

func (u *UnionSize8Alignment4) SetUnused1(unused1 uint8) {
	u.I_unionSize8Alignment4Tag = UnionSize8Alignment4Unused1
	u.Unused1 = unused1
}

func UnionSize8Alignment4WithUnused1(unused1 uint8) UnionSize8Alignment4 {
	var _u UnionSize8Alignment4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize8Alignment4) SetUnused2(unused2 uint8) {
	u.I_unionSize8Alignment4Tag = UnionSize8Alignment4Unused2
	u.Unused2 = unused2
}

func UnionSize8Alignment4WithUnused2(unused2 uint8) UnionSize8Alignment4 {
	var _u UnionSize8Alignment4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize8Alignment4) SetVariant(variant uint32) {
	u.I_unionSize8Alignment4Tag = UnionSize8Alignment4Variant
	u.Variant = variant
}

func UnionSize8Alignment4WithVariant(variant uint32) UnionSize8Alignment4 {
	var _u UnionSize8Alignment4
	_u.SetVariant(variant)
	return _u
}

type I_unionSize12Alignment4Tag uint32

const (
	_ I_unionSize12Alignment4Tag = iota
	UnionSize12Alignment4Unused1
	UnionSize12Alignment4Unused2
	UnionSize12Alignment4Unused3
	UnionSize12Alignment4Variant
)

type UnionSize12Alignment4 struct {
	I_unionSize12Alignment4Tag `fidl:"u,12,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                    uint8    `fidl:"1"`
	Unused2                    uint8    `fidl:"2"`
	Unused3                    uint8    `fidl:"3"`
	Variant                    [6]uint8 `fidl:"4"`
}

func (u *UnionSize12Alignment4) Which() I_unionSize12Alignment4Tag {
	return u.I_unionSize12Alignment4Tag
}

func (u *UnionSize12Alignment4) SetUnused1(unused1 uint8) {
	u.I_unionSize12Alignment4Tag = UnionSize12Alignment4Unused1
	u.Unused1 = unused1
}

func UnionSize12Alignment4WithUnused1(unused1 uint8) UnionSize12Alignment4 {
	var _u UnionSize12Alignment4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize12Alignment4) SetUnused2(unused2 uint8) {
	u.I_unionSize12Alignment4Tag = UnionSize12Alignment4Unused2
	u.Unused2 = unused2
}

func UnionSize12Alignment4WithUnused2(unused2 uint8) UnionSize12Alignment4 {
	var _u UnionSize12Alignment4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize12Alignment4) SetUnused3(unused3 uint8) {
	u.I_unionSize12Alignment4Tag = UnionSize12Alignment4Unused3
	u.Unused3 = unused3
}

func UnionSize12Alignment4WithUnused3(unused3 uint8) UnionSize12Alignment4 {
	var _u UnionSize12Alignment4
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize12Alignment4) SetVariant(variant [6]uint8) {
	u.I_unionSize12Alignment4Tag = UnionSize12Alignment4Variant
	u.Variant = variant
}

func UnionSize12Alignment4WithVariant(variant [6]uint8) UnionSize12Alignment4 {
	var _u UnionSize12Alignment4
	_u.SetVariant(variant)
	return _u
}

type I_unionSize24Alignment8Tag uint32

const (
	_ I_unionSize24Alignment8Tag = iota
	UnionSize24Alignment8Unused1
	UnionSize24Alignment8Unused2
	UnionSize24Alignment8Unused3
	UnionSize24Alignment8Variant
)

type UnionSize24Alignment8 struct {
	I_unionSize24Alignment8Tag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                    uint8                  `fidl:"1"`
	Unused2                    uint8                  `fidl:"2"`
	Unused3                    uint8                  `fidl:"3"`
	Variant                    StructSize16Alignment8 `fidl:"4"`
}

func (u *UnionSize24Alignment8) Which() I_unionSize24Alignment8Tag {
	return u.I_unionSize24Alignment8Tag
}

func (u *UnionSize24Alignment8) SetUnused1(unused1 uint8) {
	u.I_unionSize24Alignment8Tag = UnionSize24Alignment8Unused1
	u.Unused1 = unused1
}

func UnionSize24Alignment8WithUnused1(unused1 uint8) UnionSize24Alignment8 {
	var _u UnionSize24Alignment8
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize24Alignment8) SetUnused2(unused2 uint8) {
	u.I_unionSize24Alignment8Tag = UnionSize24Alignment8Unused2
	u.Unused2 = unused2
}

func UnionSize24Alignment8WithUnused2(unused2 uint8) UnionSize24Alignment8 {
	var _u UnionSize24Alignment8
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize24Alignment8) SetUnused3(unused3 uint8) {
	u.I_unionSize24Alignment8Tag = UnionSize24Alignment8Unused3
	u.Unused3 = unused3
}

func UnionSize24Alignment8WithUnused3(unused3 uint8) UnionSize24Alignment8 {
	var _u UnionSize24Alignment8
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize24Alignment8) SetVariant(variant StructSize16Alignment8) {
	u.I_unionSize24Alignment8Tag = UnionSize24Alignment8Variant
	u.Variant = variant
}

func UnionSize24Alignment8WithVariant(variant StructSize16Alignment8) UnionSize24Alignment8 {
	var _u UnionSize24Alignment8
	_u.SetVariant(variant)
	return _u
}

type I_unionSize36Alignment4Tag uint32

const (
	_ I_unionSize36Alignment4Tag = iota
	UnionSize36Alignment4Unused1
	UnionSize36Alignment4Unused2
	UnionSize36Alignment4Unused3
	UnionSize36Alignment4Variant
)

type UnionSize36Alignment4 struct {
	I_unionSize36Alignment4Tag `fidl:"u,36,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                    uint8     `fidl:"1"`
	Unused2                    uint8     `fidl:"2"`
	Unused3                    uint8     `fidl:"3"`
	Variant                    [32]uint8 `fidl:"4"`
}

func (u *UnionSize36Alignment4) Which() I_unionSize36Alignment4Tag {
	return u.I_unionSize36Alignment4Tag
}

func (u *UnionSize36Alignment4) SetUnused1(unused1 uint8) {
	u.I_unionSize36Alignment4Tag = UnionSize36Alignment4Unused1
	u.Unused1 = unused1
}

func UnionSize36Alignment4WithUnused1(unused1 uint8) UnionSize36Alignment4 {
	var _u UnionSize36Alignment4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize36Alignment4) SetUnused2(unused2 uint8) {
	u.I_unionSize36Alignment4Tag = UnionSize36Alignment4Unused2
	u.Unused2 = unused2
}

func UnionSize36Alignment4WithUnused2(unused2 uint8) UnionSize36Alignment4 {
	var _u UnionSize36Alignment4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize36Alignment4) SetUnused3(unused3 uint8) {
	u.I_unionSize36Alignment4Tag = UnionSize36Alignment4Unused3
	u.Unused3 = unused3
}

func UnionSize36Alignment4WithUnused3(unused3 uint8) UnionSize36Alignment4 {
	var _u UnionSize36Alignment4
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize36Alignment4) SetVariant(variant [32]uint8) {
	u.I_unionSize36Alignment4Tag = UnionSize36Alignment4Variant
	u.Variant = variant
}

func UnionSize36Alignment4WithVariant(variant [32]uint8) UnionSize36Alignment4 {
	var _u UnionSize36Alignment4
	_u.SetVariant(variant)
	return _u
}

type I_ipAddressConfigTag uint32

const (
	_ I_ipAddressConfigTag = iota
	IpAddressConfigPaddingSize24Align4
	IpAddressConfigDhcp
)

type IpAddressConfig struct {
	I_ipAddressConfigTag `fidl:"u,28,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	PaddingSize24Align4  [6]uint32 `fidl:"1"`
	Dhcp                 bool      `fidl:"2"`
}

func (u *IpAddressConfig) Which() I_ipAddressConfigTag {
	return u.I_ipAddressConfigTag
}

func (u *IpAddressConfig) SetPaddingSize24Align4(paddingSize24Align4 [6]uint32) {
	u.I_ipAddressConfigTag = IpAddressConfigPaddingSize24Align4
	u.PaddingSize24Align4 = paddingSize24Align4
}

func IpAddressConfigWithPaddingSize24Align4(paddingSize24Align4 [6]uint32) IpAddressConfig {
	var _u IpAddressConfig
	_u.SetPaddingSize24Align4(paddingSize24Align4)
	return _u
}

func (u *IpAddressConfig) SetDhcp(dhcp bool) {
	u.I_ipAddressConfigTag = IpAddressConfigDhcp
	u.Dhcp = dhcp
}

func IpAddressConfigWithDhcp(dhcp bool) IpAddressConfig {
	var _u IpAddressConfig
	_u.SetDhcp(dhcp)
	return _u
}

type I_simpleUnionTag uint32

const (
	_ I_simpleUnionTag = iota
	SimpleUnionI32
	SimpleUnionI64
	SimpleUnionS
	SimpleUnionStr
)

type SimpleUnion struct {
	I_simpleUnionTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I32              int32       `fidl:"1"`
	I64              int64       `fidl:"2"`
	S                Int64Struct `fidl:"3"`
	Str              string      `fidl:"4,"`
}

func (u *SimpleUnion) Which() I_simpleUnionTag {
	return u.I_simpleUnionTag
}

func (u *SimpleUnion) SetI32(i32 int32) {
	u.I_simpleUnionTag = SimpleUnionI32
	u.I32 = i32
}

func SimpleUnionWithI32(i32 int32) SimpleUnion {
	var _u SimpleUnion
	_u.SetI32(i32)
	return _u
}

func (u *SimpleUnion) SetI64(i64 int64) {
	u.I_simpleUnionTag = SimpleUnionI64
	u.I64 = i64
}

func SimpleUnionWithI64(i64 int64) SimpleUnion {
	var _u SimpleUnion
	_u.SetI64(i64)
	return _u
}

func (u *SimpleUnion) SetS(s Int64Struct) {
	u.I_simpleUnionTag = SimpleUnionS
	u.S = s
}

func SimpleUnionWithS(s Int64Struct) SimpleUnion {
	var _u SimpleUnion
	_u.SetS(s)
	return _u
}

func (u *SimpleUnion) SetStr(str string) {
	u.I_simpleUnionTag = SimpleUnionStr
	u.Str = str
}

func SimpleUnionWithStr(str string) SimpleUnion {
	var _u SimpleUnion
	_u.SetStr(str)
	return _u
}

type I_unionWithEmptyStructTag uint32

const (
	_ I_unionWithEmptyStructTag = iota
	UnionWithEmptyStructS
	UnionWithEmptyStructForceAlignmentOf8
)

type UnionWithEmptyStruct struct {
	I_unionWithEmptyStructTag `fidl:"u,16,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	S                         EmptyStruct `fidl:"1"`
	ForceAlignmentOf8         uint64      `fidl:"2"`
}

func (u *UnionWithEmptyStruct) Which() I_unionWithEmptyStructTag {
	return u.I_unionWithEmptyStructTag
}

func (u *UnionWithEmptyStruct) SetS(s EmptyStruct) {
	u.I_unionWithEmptyStructTag = UnionWithEmptyStructS
	u.S = s
}

func UnionWithEmptyStructWithS(s EmptyStruct) UnionWithEmptyStruct {
	var _u UnionWithEmptyStruct
	_u.SetS(s)
	return _u
}

func (u *UnionWithEmptyStruct) SetForceAlignmentOf8(forceAlignmentOf8 uint64) {
	u.I_unionWithEmptyStructTag = UnionWithEmptyStructForceAlignmentOf8
	u.ForceAlignmentOf8 = forceAlignmentOf8
}

func UnionWithEmptyStructWithForceAlignmentOf8(forceAlignmentOf8 uint64) UnionWithEmptyStruct {
	var _u UnionWithEmptyStruct
	_u.SetForceAlignmentOf8(forceAlignmentOf8)
	return _u
}

type I_unionSize8Align4Tag uint32

const (
	_ I_unionSize8Align4Tag = iota
	UnionSize8Align4Unused1
	UnionSize8Align4Unused2
	UnionSize8Align4Variant
)

type UnionSize8Align4 struct {
	I_unionSize8Align4Tag `fidl:"u,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1               uint8  `fidl:"1"`
	Unused2               uint8  `fidl:"2"`
	Variant               uint32 `fidl:"3"`
}

func (u *UnionSize8Align4) Which() I_unionSize8Align4Tag {
	return u.I_unionSize8Align4Tag
}

func (u *UnionSize8Align4) SetUnused1(unused1 uint8) {
	u.I_unionSize8Align4Tag = UnionSize8Align4Unused1
	u.Unused1 = unused1
}

func UnionSize8Align4WithUnused1(unused1 uint8) UnionSize8Align4 {
	var _u UnionSize8Align4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize8Align4) SetUnused2(unused2 uint8) {
	u.I_unionSize8Align4Tag = UnionSize8Align4Unused2
	u.Unused2 = unused2
}

func UnionSize8Align4WithUnused2(unused2 uint8) UnionSize8Align4 {
	var _u UnionSize8Align4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize8Align4) SetVariant(variant uint32) {
	u.I_unionSize8Align4Tag = UnionSize8Align4Variant
	u.Variant = variant
}

func UnionSize8Align4WithVariant(variant uint32) UnionSize8Align4 {
	var _u UnionSize8Align4
	_u.SetVariant(variant)
	return _u
}

type I_unionSize12Align4Tag uint32

const (
	_ I_unionSize12Align4Tag = iota
	UnionSize12Align4Unused1
	UnionSize12Align4Unused2
	UnionSize12Align4Unused3
	UnionSize12Align4Variant
)

type UnionSize12Align4 struct {
	I_unionSize12Align4Tag `fidl:"u,12,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                uint8    `fidl:"1"`
	Unused2                uint8    `fidl:"2"`
	Unused3                uint8    `fidl:"3"`
	Variant                [6]uint8 `fidl:"4"`
}

func (u *UnionSize12Align4) Which() I_unionSize12Align4Tag {
	return u.I_unionSize12Align4Tag
}

func (u *UnionSize12Align4) SetUnused1(unused1 uint8) {
	u.I_unionSize12Align4Tag = UnionSize12Align4Unused1
	u.Unused1 = unused1
}

func UnionSize12Align4WithUnused1(unused1 uint8) UnionSize12Align4 {
	var _u UnionSize12Align4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize12Align4) SetUnused2(unused2 uint8) {
	u.I_unionSize12Align4Tag = UnionSize12Align4Unused2
	u.Unused2 = unused2
}

func UnionSize12Align4WithUnused2(unused2 uint8) UnionSize12Align4 {
	var _u UnionSize12Align4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize12Align4) SetUnused3(unused3 uint8) {
	u.I_unionSize12Align4Tag = UnionSize12Align4Unused3
	u.Unused3 = unused3
}

func UnionSize12Align4WithUnused3(unused3 uint8) UnionSize12Align4 {
	var _u UnionSize12Align4
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize12Align4) SetVariant(variant [6]uint8) {
	u.I_unionSize12Align4Tag = UnionSize12Align4Variant
	u.Variant = variant
}

func UnionSize12Align4WithVariant(variant [6]uint8) UnionSize12Align4 {
	var _u UnionSize12Align4
	_u.SetVariant(variant)
	return _u
}

type I_unionSize24Align8Tag uint32

const (
	_ I_unionSize24Align8Tag = iota
	UnionSize24Align8Unused1
	UnionSize24Align8Unused2
	UnionSize24Align8Unused3
	UnionSize24Align8Variant
)

type UnionSize24Align8 struct {
	I_unionSize24Align8Tag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                uint8              `fidl:"1"`
	Unused2                uint8              `fidl:"2"`
	Unused3                uint8              `fidl:"3"`
	Variant                StructSize16Align8 `fidl:"4"`
}

func (u *UnionSize24Align8) Which() I_unionSize24Align8Tag {
	return u.I_unionSize24Align8Tag
}

func (u *UnionSize24Align8) SetUnused1(unused1 uint8) {
	u.I_unionSize24Align8Tag = UnionSize24Align8Unused1
	u.Unused1 = unused1
}

func UnionSize24Align8WithUnused1(unused1 uint8) UnionSize24Align8 {
	var _u UnionSize24Align8
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize24Align8) SetUnused2(unused2 uint8) {
	u.I_unionSize24Align8Tag = UnionSize24Align8Unused2
	u.Unused2 = unused2
}

func UnionSize24Align8WithUnused2(unused2 uint8) UnionSize24Align8 {
	var _u UnionSize24Align8
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize24Align8) SetUnused3(unused3 uint8) {
	u.I_unionSize24Align8Tag = UnionSize24Align8Unused3
	u.Unused3 = unused3
}

func UnionSize24Align8WithUnused3(unused3 uint8) UnionSize24Align8 {
	var _u UnionSize24Align8
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize24Align8) SetVariant(variant StructSize16Align8) {
	u.I_unionSize24Align8Tag = UnionSize24Align8Variant
	u.Variant = variant
}

func UnionSize24Align8WithVariant(variant StructSize16Align8) UnionSize24Align8 {
	var _u UnionSize24Align8
	_u.SetVariant(variant)
	return _u
}

type I_unionSize36Align4Tag uint32

const (
	_ I_unionSize36Align4Tag = iota
	UnionSize36Align4Unused1
	UnionSize36Align4Unused2
	UnionSize36Align4Unused3
	UnionSize36Align4Variant
)

type UnionSize36Align4 struct {
	I_unionSize36Align4Tag `fidl:"u,36,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                uint8     `fidl:"1"`
	Unused2                uint8     `fidl:"2"`
	Unused3                uint8     `fidl:"3"`
	Variant                [32]uint8 `fidl:"4"`
}

func (u *UnionSize36Align4) Which() I_unionSize36Align4Tag {
	return u.I_unionSize36Align4Tag
}

func (u *UnionSize36Align4) SetUnused1(unused1 uint8) {
	u.I_unionSize36Align4Tag = UnionSize36Align4Unused1
	u.Unused1 = unused1
}

func UnionSize36Align4WithUnused1(unused1 uint8) UnionSize36Align4 {
	var _u UnionSize36Align4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize36Align4) SetUnused2(unused2 uint8) {
	u.I_unionSize36Align4Tag = UnionSize36Align4Unused2
	u.Unused2 = unused2
}

func UnionSize36Align4WithUnused2(unused2 uint8) UnionSize36Align4 {
	var _u UnionSize36Align4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize36Align4) SetUnused3(unused3 uint8) {
	u.I_unionSize36Align4Tag = UnionSize36Align4Unused3
	u.Unused3 = unused3
}

func UnionSize36Align4WithUnused3(unused3 uint8) UnionSize36Align4 {
	var _u UnionSize36Align4
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize36Align4) SetVariant(variant [32]uint8) {
	u.I_unionSize36Align4Tag = UnionSize36Align4Variant
	u.Variant = variant
}

func UnionSize36Align4WithVariant(variant [32]uint8) UnionSize36Align4 {
	var _u UnionSize36Align4
	_u.SetVariant(variant)
	return _u
}

type I_unionOfUnionTag uint32

const (
	_ I_unionOfUnionTag = iota
	UnionOfUnionUnused1
	UnionOfUnionSize8align4
	UnionOfUnionSize12align4
	UnionOfUnionUnused2
	UnionOfUnionSize24align8
)

type UnionOfUnion struct {
	I_unionOfUnionTag `fidl:"u,32,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1           uint8             `fidl:"1"`
	Size8align4       UnionSize8Align4  `fidl:"2"`
	Size12align4      UnionSize12Align4 `fidl:"3"`
	Unused2           uint8             `fidl:"4"`
	Size24align8      UnionSize24Align8 `fidl:"5"`
}

func (u *UnionOfUnion) Which() I_unionOfUnionTag {
	return u.I_unionOfUnionTag
}

func (u *UnionOfUnion) SetUnused1(unused1 uint8) {
	u.I_unionOfUnionTag = UnionOfUnionUnused1
	u.Unused1 = unused1
}

func UnionOfUnionWithUnused1(unused1 uint8) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionOfUnion) SetSize8align4(size8align4 UnionSize8Align4) {
	u.I_unionOfUnionTag = UnionOfUnionSize8align4
	u.Size8align4 = size8align4
}

func UnionOfUnionWithSize8align4(size8align4 UnionSize8Align4) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetSize8align4(size8align4)
	return _u
}

func (u *UnionOfUnion) SetSize12align4(size12align4 UnionSize12Align4) {
	u.I_unionOfUnionTag = UnionOfUnionSize12align4
	u.Size12align4 = size12align4
}

func UnionOfUnionWithSize12align4(size12align4 UnionSize12Align4) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetSize12align4(size12align4)
	return _u
}

func (u *UnionOfUnion) SetUnused2(unused2 uint8) {
	u.I_unionOfUnionTag = UnionOfUnionUnused2
	u.Unused2 = unused2
}

func UnionOfUnionWithUnused2(unused2 uint8) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionOfUnion) SetSize24align8(size24align8 UnionSize24Align8) {
	u.I_unionOfUnionTag = UnionOfUnionSize24align8
	u.Size24align8 = size24align8
}

func UnionOfUnionWithSize24align8(size24align8 UnionSize24Align8) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetSize24align8(size24align8)
	return _u
}

type I_unionWithVectorTag uint32

const (
	_ I_unionWithVectorTag = iota
	UnionWithVectorUnused
	UnionWithVectorVectorOfUint8
	UnionWithVectorString
	UnionWithVectorVectorS3A1
	UnionWithVectorVectorS3A2
	UnionWithVectorHandles
	UnionWithVectorArrayS3A1
	UnionWithVectorArrayS3A2
	UnionWithVectorVectorUnion
)

type UnionWithVector struct {
	I_unionWithVectorTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused               uint8                `fidl:"1"`
	VectorOfUint8        []uint8              `fidl:"2,"`
	String               string               `fidl:"3,"`
	VectorS3A1           []StructSize3Align1  `fidl:"4,"`
	VectorS3A2           []StructSize3Align2  `fidl:"5,"`
	Handles              []uint32             `fidl:"6,"`
	ArrayS3A1            [2]StructSize3Align1 `fidl:"7"`
	ArrayS3A2            [2]StructSize3Align2 `fidl:"8"`
	VectorUnion          []UnionSize8Align4   `fidl:"9,"`
}

func (u *UnionWithVector) Which() I_unionWithVectorTag {
	return u.I_unionWithVectorTag
}

func (u *UnionWithVector) SetUnused(unused uint8) {
	u.I_unionWithVectorTag = UnionWithVectorUnused
	u.Unused = unused
}

func UnionWithVectorWithUnused(unused uint8) UnionWithVector {
	var _u UnionWithVector
	_u.SetUnused(unused)
	return _u
}

func (u *UnionWithVector) SetVectorOfUint8(vectorOfUint8 []uint8) {
	u.I_unionWithVectorTag = UnionWithVectorVectorOfUint8
	u.VectorOfUint8 = vectorOfUint8
}

func UnionWithVectorWithVectorOfUint8(vectorOfUint8 []uint8) UnionWithVector {
	var _u UnionWithVector
	_u.SetVectorOfUint8(vectorOfUint8)
	return _u
}

func (u *UnionWithVector) SetString(string_ string) {
	u.I_unionWithVectorTag = UnionWithVectorString
	u.String = string_
}

func UnionWithVectorWithString(string_ string) UnionWithVector {
	var _u UnionWithVector
	_u.SetString(string_)
	return _u
}

func (u *UnionWithVector) SetVectorS3A1(vectorS3A1 []StructSize3Align1) {
	u.I_unionWithVectorTag = UnionWithVectorVectorS3A1
	u.VectorS3A1 = vectorS3A1
}

func UnionWithVectorWithVectorS3A1(vectorS3A1 []StructSize3Align1) UnionWithVector {
	var _u UnionWithVector
	_u.SetVectorS3A1(vectorS3A1)
	return _u
}

func (u *UnionWithVector) SetVectorS3A2(vectorS3A2 []StructSize3Align2) {
	u.I_unionWithVectorTag = UnionWithVectorVectorS3A2
	u.VectorS3A2 = vectorS3A2
}

func UnionWithVectorWithVectorS3A2(vectorS3A2 []StructSize3Align2) UnionWithVector {
	var _u UnionWithVector
	_u.SetVectorS3A2(vectorS3A2)
	return _u
}

func (u *UnionWithVector) SetHandles(handles []uint32) {
	u.I_unionWithVectorTag = UnionWithVectorHandles
	u.Handles = handles
}

func UnionWithVectorWithHandles(handles []uint32) UnionWithVector {
	var _u UnionWithVector
	_u.SetHandles(handles)
	return _u
}

func (u *UnionWithVector) SetArrayS3A1(arrayS3A1 [2]StructSize3Align1) {
	u.I_unionWithVectorTag = UnionWithVectorArrayS3A1
	u.ArrayS3A1 = arrayS3A1
}

func UnionWithVectorWithArrayS3A1(arrayS3A1 [2]StructSize3Align1) UnionWithVector {
	var _u UnionWithVector
	_u.SetArrayS3A1(arrayS3A1)
	return _u
}

func (u *UnionWithVector) SetArrayS3A2(arrayS3A2 [2]StructSize3Align2) {
	u.I_unionWithVectorTag = UnionWithVectorArrayS3A2
	u.ArrayS3A2 = arrayS3A2
}

func UnionWithVectorWithArrayS3A2(arrayS3A2 [2]StructSize3Align2) UnionWithVector {
	var _u UnionWithVector
	_u.SetArrayS3A2(arrayS3A2)
	return _u
}

func (u *UnionWithVector) SetVectorUnion(vectorUnion []UnionSize8Align4) {
	u.I_unionWithVectorTag = UnionWithVectorVectorUnion
	u.VectorUnion = vectorUnion
}

func UnionWithVectorWithVectorUnion(vectorUnion []UnionSize8Align4) UnionWithVector {
	var _u UnionWithVector
	_u.SetVectorUnion(vectorUnion)
	return _u
}

type I_stringUnionTag uint32

const (
	_ I_stringUnionTag = iota
	StringUnionUnused
	StringUnionS
)

type StringUnion struct {
	I_stringUnionTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused           uint8  `fidl:"1"`
	S                string `fidl:"2,"`
}

func (u *StringUnion) Which() I_stringUnionTag {
	return u.I_stringUnionTag
}

func (u *StringUnion) SetUnused(unused uint8) {
	u.I_stringUnionTag = StringUnionUnused
	u.Unused = unused
}

func StringUnionWithUnused(unused uint8) StringUnion {
	var _u StringUnion
	_u.SetUnused(unused)
	return _u
}

func (u *StringUnion) SetS(s string) {
	u.I_stringUnionTag = StringUnionS
	u.S = s
}

func StringUnionWithS(s string) StringUnion {
	var _u StringUnion
	_u.SetS(s)
	return _u
}

type I_sampleXUnionTag uint32

const (
	SampleXUnion_unknownData = 0          // 0x00000000
	SampleXUnionU            = 949769906  // 0x389c56b2
	SampleXUnionSu           = 2033143581 // 0x792f4f1d
	SampleXUnionSt           = 35514581   // 0x021de8d5
)

type SampleXUnion struct {
	I_sampleXUnionTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData     []byte
	U                 uint32      `fidl:"949769906"`
	Su                SimpleUnion `fidl:"2033143581"`
	St                SimpleTable `fidl:"35514581"`
}

func (_m *SampleXUnion) Which() I_sampleXUnionTag {
	switch _m.I_sampleXUnionTag {
	case 949769906:
		return SampleXUnionU
	case 2033143581:
		return SampleXUnionSu
	case 35514581:
		return SampleXUnionSt
	default:
		return SampleXUnion_unknownData
	}
}

func (_m *SampleXUnion) Ordinal() uint32 {
	return uint32(_m.I_sampleXUnionTag)
}

func (_m *SampleXUnion) SetU(u uint32) {
	_m.I_sampleXUnionTag = SampleXUnionU
	_m.U = u
}

func SampleXUnionWithU(u uint32) SampleXUnion {
	var _u SampleXUnion
	_u.SetU(u)
	return _u
}

func (_m *SampleXUnion) SetSu(su SimpleUnion) {
	_m.I_sampleXUnionTag = SampleXUnionSu
	_m.Su = su
}

func SampleXUnionWithSu(su SimpleUnion) SampleXUnion {
	var _u SampleXUnion
	_u.SetSu(su)
	return _u
}

func (_m *SampleXUnion) SetSt(st SimpleTable) {
	_m.I_sampleXUnionTag = SampleXUnionSt
	_m.St = st
}

func SampleXUnionWithSt(st SimpleTable) SampleXUnion {
	var _u SampleXUnion
	_u.SetSt(st)
	return _u
}

type I_sampleStrictXUnionTag uint32

const (
	SampleStrictXUnionU  = 149088882 // 0x08e2ea72
	SampleStrictXUnionSu = 670279483 // 0x27f3a73b
	SampleStrictXUnionSt = 925062383 // 0x372354ef
)

type SampleStrictXUnion struct {
	I_sampleStrictXUnionTag `fidl:"x!,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	U                       uint32      `fidl:"149088882"`
	Su                      SimpleUnion `fidl:"670279483"`
	St                      SimpleTable `fidl:"925062383"`
}

func (_m *SampleStrictXUnion) Which() I_sampleStrictXUnionTag {
	return _m.I_sampleStrictXUnionTag
}

func (_m *SampleStrictXUnion) Ordinal() uint32 {
	return uint32(_m.I_sampleStrictXUnionTag)
}

func (_m *SampleStrictXUnion) SetU(u uint32) {
	_m.I_sampleStrictXUnionTag = SampleStrictXUnionU
	_m.U = u
}

func SampleStrictXUnionWithU(u uint32) SampleStrictXUnion {
	var _u SampleStrictXUnion
	_u.SetU(u)
	return _u
}

func (_m *SampleStrictXUnion) SetSu(su SimpleUnion) {
	_m.I_sampleStrictXUnionTag = SampleStrictXUnionSu
	_m.Su = su
}

func SampleStrictXUnionWithSu(su SimpleUnion) SampleStrictXUnion {
	var _u SampleStrictXUnion
	_u.SetSu(su)
	return _u
}

func (_m *SampleStrictXUnion) SetSt(st SimpleTable) {
	_m.I_sampleStrictXUnionTag = SampleStrictXUnionSt
	_m.St = st
}

func SampleStrictXUnionWithSt(st SimpleTable) SampleStrictXUnion {
	var _u SampleStrictXUnion
	_u.SetSt(st)
	return _u
}

type I_xUnionWithEmptyStructTag uint32

const (
	XUnionWithEmptyStruct_unknownData = 0          // 0x00000000
	XUnionWithEmptyStructS            = 1956241662 // 0x7499e0fe
)

type XUnionWithEmptyStruct struct {
	I_xUnionWithEmptyStructTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData              []byte
	S                          EmptyStruct `fidl:"1956241662"`
}

func (_m *XUnionWithEmptyStruct) Which() I_xUnionWithEmptyStructTag {
	switch _m.I_xUnionWithEmptyStructTag {
	case 1956241662:
		return XUnionWithEmptyStructS
	default:
		return XUnionWithEmptyStruct_unknownData
	}
}

func (_m *XUnionWithEmptyStruct) Ordinal() uint32 {
	return uint32(_m.I_xUnionWithEmptyStructTag)
}

func (_m *XUnionWithEmptyStruct) SetS(s EmptyStruct) {
	_m.I_xUnionWithEmptyStructTag = XUnionWithEmptyStructS
	_m.S = s
}

func XUnionWithEmptyStructWithS(s EmptyStruct) XUnionWithEmptyStruct {
	var _u XUnionWithEmptyStruct
	_u.SetS(s)
	return _u
}

type I_xUnionWithStructTag uint32

const (
	XUnionWithStruct_unknownData = 0         // 0x00000000
	XUnionWithStructS            = 423517204 // 0x193e5c14
)

type XUnionWithStruct struct {
	I_xUnionWithStructTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData         []byte
	S                     StructSize3Align1 `fidl:"423517204"`
}

func (_m *XUnionWithStruct) Which() I_xUnionWithStructTag {
	switch _m.I_xUnionWithStructTag {
	case 423517204:
		return XUnionWithStructS
	default:
		return XUnionWithStruct_unknownData
	}
}

func (_m *XUnionWithStruct) Ordinal() uint32 {
	return uint32(_m.I_xUnionWithStructTag)
}

func (_m *XUnionWithStruct) SetS(s StructSize3Align1) {
	_m.I_xUnionWithStructTag = XUnionWithStructS
	_m.S = s
}

func XUnionWithStructWithS(s StructSize3Align1) XUnionWithStruct {
	var _u XUnionWithStruct
	_u.SetS(s)
	return _u
}

type I_xUnionWithXUnionTag uint32

const (
	XUnionWithXUnion_unknownData = 0          // 0x00000000
	XUnionWithXUnionXu           = 1812359455 // 0x6c06691f
)

type XUnionWithXUnion struct {
	I_xUnionWithXUnionTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData         []byte
	Xu                    XUnionWithStruct `fidl:"1812359455"`
}

func (_m *XUnionWithXUnion) Which() I_xUnionWithXUnionTag {
	switch _m.I_xUnionWithXUnionTag {
	case 1812359455:
		return XUnionWithXUnionXu
	default:
		return XUnionWithXUnion_unknownData
	}
}

func (_m *XUnionWithXUnion) Ordinal() uint32 {
	return uint32(_m.I_xUnionWithXUnionTag)
}

func (_m *XUnionWithXUnion) SetXu(xu XUnionWithStruct) {
	_m.I_xUnionWithXUnionTag = XUnionWithXUnionXu
	_m.Xu = xu
}

func XUnionWithXUnionWithXu(xu XUnionWithStruct) XUnionWithXUnion {
	var _u XUnionWithXUnion
	_u.SetXu(xu)
	return _u
}

type I_xUnionWithUnionsTag uint32

const (
	XUnionWithUnions_unknownData = 0          // 0x00000000
	XUnionWithUnionsU1           = 684009751  // 0x28c52917
	XUnionWithUnionsU2           = 1971727256 // 0x75862b98
)

type XUnionWithUnions struct {
	I_xUnionWithUnionsTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData         []byte
	U1                    UnionSize8Align4  `fidl:"684009751"`
	U2                    UnionSize12Align4 `fidl:"1971727256"`
}

func (_m *XUnionWithUnions) Which() I_xUnionWithUnionsTag {
	switch _m.I_xUnionWithUnionsTag {
	case 684009751:
		return XUnionWithUnionsU1
	case 1971727256:
		return XUnionWithUnionsU2
	default:
		return XUnionWithUnions_unknownData
	}
}

func (_m *XUnionWithUnions) Ordinal() uint32 {
	return uint32(_m.I_xUnionWithUnionsTag)
}

func (_m *XUnionWithUnions) SetU1(u1 UnionSize8Align4) {
	_m.I_xUnionWithUnionsTag = XUnionWithUnionsU1
	_m.U1 = u1
}

func XUnionWithUnionsWithU1(u1 UnionSize8Align4) XUnionWithUnions {
	var _u XUnionWithUnions
	_u.SetU1(u1)
	return _u
}

func (_m *XUnionWithUnions) SetU2(u2 UnionSize12Align4) {
	_m.I_xUnionWithUnionsTag = XUnionWithUnionsU2
	_m.U2 = u2
}

func XUnionWithUnionsWithU2(u2 UnionSize12Align4) XUnionWithUnions {
	var _u XUnionWithUnions
	_u.SetU2(u2)
	return _u
}

type XUnionInTable struct {
	_             struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Before        string   `fidl:"1,"`
	BeforePresent bool
	Xu            SampleXUnion `fidl:"2"`
	XuPresent     bool
	After         string `fidl:"3,"`
	AfterPresent  bool
}

func (u *XUnionInTable) SetBefore(before string) {
	u.Before = before
	u.BeforePresent = true
}

func (u *XUnionInTable) GetBefore() string {
	return u.Before
}

func (u *XUnionInTable) GetBeforeWithDefault(_default string) string {
	if !u.HasBefore() {
		return _default
	}
	return u.Before
}

func (u *XUnionInTable) HasBefore() bool {
	return u.BeforePresent
}

func (u *XUnionInTable) ClearBefore() {
	u.BeforePresent = false
}

func (u *XUnionInTable) SetXu(xu SampleXUnion) {
	u.Xu = xu
	u.XuPresent = true
}

func (u *XUnionInTable) GetXu() SampleXUnion {
	return u.Xu
}

func (u *XUnionInTable) GetXuWithDefault(_default SampleXUnion) SampleXUnion {
	if !u.HasXu() {
		return _default
	}
	return u.Xu
}

func (u *XUnionInTable) HasXu() bool {
	return u.XuPresent
}

func (u *XUnionInTable) ClearXu() {
	u.XuPresent = false
}

func (u *XUnionInTable) SetAfter(after string) {
	u.After = after
	u.AfterPresent = true
}

func (u *XUnionInTable) GetAfter() string {
	return u.After
}

func (u *XUnionInTable) GetAfterWithDefault(_default string) string {
	if !u.HasAfter() {
		return _default
	}
	return u.After
}

func (u *XUnionInTable) HasAfter() bool {
	return u.AfterPresent
}

func (u *XUnionInTable) ClearAfter() {
	u.AfterPresent = false
}

type SimpleTable struct {
	_        struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	X        int64    `fidl:"1"`
	XPresent bool
	Y        int64 `fidl:"5"`
	YPresent bool
}

func (u *SimpleTable) SetX(x int64) {
	u.X = x
	u.XPresent = true
}

func (u *SimpleTable) GetX() int64 {
	return u.X
}

func (u *SimpleTable) GetXWithDefault(_default int64) int64 {
	if !u.HasX() {
		return _default
	}
	return u.X
}

func (u *SimpleTable) HasX() bool {
	return u.XPresent
}

func (u *SimpleTable) ClearX() {
	u.XPresent = false
}

func (u *SimpleTable) SetY(y int64) {
	u.Y = y
	u.YPresent = true
}

func (u *SimpleTable) GetY() int64 {
	return u.Y
}

func (u *SimpleTable) GetYWithDefault(_default int64) int64 {
	if !u.HasY() {
		return _default
	}
	return u.Y
}

func (u *SimpleTable) HasY() bool {
	return u.YPresent
}

func (u *SimpleTable) ClearY() {
	u.YPresent = false
}

type TableWithStringAndVector struct {
	_          struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Foo        string   `fidl:"1,"`
	FooPresent bool
	Bar        int32 `fidl:"2"`
	BarPresent bool
	Baz        []uint8 `fidl:"3,"`
	BazPresent bool
}

func (u *TableWithStringAndVector) SetFoo(foo string) {
	u.Foo = foo
	u.FooPresent = true
}

func (u *TableWithStringAndVector) GetFoo() string {
	return u.Foo
}

func (u *TableWithStringAndVector) GetFooWithDefault(_default string) string {
	if !u.HasFoo() {
		return _default
	}
	return u.Foo
}

func (u *TableWithStringAndVector) HasFoo() bool {
	return u.FooPresent
}

func (u *TableWithStringAndVector) ClearFoo() {
	u.FooPresent = false
}

func (u *TableWithStringAndVector) SetBar(bar int32) {
	u.Bar = bar
	u.BarPresent = true
}

func (u *TableWithStringAndVector) GetBar() int32 {
	return u.Bar
}

func (u *TableWithStringAndVector) GetBarWithDefault(_default int32) int32 {
	if !u.HasBar() {
		return _default
	}
	return u.Bar
}

func (u *TableWithStringAndVector) HasBar() bool {
	return u.BarPresent
}

func (u *TableWithStringAndVector) ClearBar() {
	u.BarPresent = false
}

func (u *TableWithStringAndVector) SetBaz(baz []uint8) {
	u.Baz = baz
	u.BazPresent = true
}

func (u *TableWithStringAndVector) GetBaz() []uint8 {
	return u.Baz
}

func (u *TableWithStringAndVector) GetBazWithDefault(_default []uint8) []uint8 {
	if !u.HasBaz() {
		return _default
	}
	return u.Baz
}

func (u *TableWithStringAndVector) HasBaz() bool {
	return u.BazPresent
}

func (u *TableWithStringAndVector) ClearBaz() {
	u.BazPresent = false
}

type TableWithEmptyStruct struct {
	_        struct{}    `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	S        EmptyStruct `fidl:"1"`
	SPresent bool
}

func (u *TableWithEmptyStruct) SetS(s EmptyStruct) {
	u.S = s
	u.SPresent = true
}

func (u *TableWithEmptyStruct) GetS() EmptyStruct {
	return u.S
}

func (u *TableWithEmptyStruct) GetSWithDefault(_default EmptyStruct) EmptyStruct {
	if !u.HasS() {
		return _default
	}
	return u.S
}

func (u *TableWithEmptyStruct) HasS() bool {
	return u.SPresent
}

func (u *TableWithEmptyStruct) ClearS() {
	u.SPresent = false
}

type TableStructWithReservedSandwich struct {
	_         struct{}          `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	S1        StructSize3Align1 `fidl:"2"`
	S1Present bool
	S2        StructSize3Align1 `fidl:"3"`
	S2Present bool
}

func (u *TableStructWithReservedSandwich) SetS1(s1 StructSize3Align1) {
	u.S1 = s1
	u.S1Present = true
}

func (u *TableStructWithReservedSandwich) GetS1() StructSize3Align1 {
	return u.S1
}

func (u *TableStructWithReservedSandwich) GetS1WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS1() {
		return _default
	}
	return u.S1
}

func (u *TableStructWithReservedSandwich) HasS1() bool {
	return u.S1Present
}

func (u *TableStructWithReservedSandwich) ClearS1() {
	u.S1Present = false
}

func (u *TableStructWithReservedSandwich) SetS2(s2 StructSize3Align1) {
	u.S2 = s2
	u.S2Present = true
}

func (u *TableStructWithReservedSandwich) GetS2() StructSize3Align1 {
	return u.S2
}

func (u *TableStructWithReservedSandwich) GetS2WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS2() {
		return _default
	}
	return u.S2
}

func (u *TableStructWithReservedSandwich) HasS2() bool {
	return u.S2Present
}

func (u *TableStructWithReservedSandwich) ClearS2() {
	u.S2Present = false
}

type TableStructWithUint32Sandwich struct {
	_         struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	I         uint32   `fidl:"1"`
	IPresent  bool
	S1        StructSize3Align1 `fidl:"2"`
	S1Present bool
	S2        StructSize3Align1 `fidl:"3"`
	S2Present bool
	I2        uint32 `fidl:"4"`
	I2Present bool
}

func (u *TableStructWithUint32Sandwich) SetI(i uint32) {
	u.I = i
	u.IPresent = true
}

func (u *TableStructWithUint32Sandwich) GetI() uint32 {
	return u.I
}

func (u *TableStructWithUint32Sandwich) GetIWithDefault(_default uint32) uint32 {
	if !u.HasI() {
		return _default
	}
	return u.I
}

func (u *TableStructWithUint32Sandwich) HasI() bool {
	return u.IPresent
}

func (u *TableStructWithUint32Sandwich) ClearI() {
	u.IPresent = false
}

func (u *TableStructWithUint32Sandwich) SetS1(s1 StructSize3Align1) {
	u.S1 = s1
	u.S1Present = true
}

func (u *TableStructWithUint32Sandwich) GetS1() StructSize3Align1 {
	return u.S1
}

func (u *TableStructWithUint32Sandwich) GetS1WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS1() {
		return _default
	}
	return u.S1
}

func (u *TableStructWithUint32Sandwich) HasS1() bool {
	return u.S1Present
}

func (u *TableStructWithUint32Sandwich) ClearS1() {
	u.S1Present = false
}

func (u *TableStructWithUint32Sandwich) SetS2(s2 StructSize3Align1) {
	u.S2 = s2
	u.S2Present = true
}

func (u *TableStructWithUint32Sandwich) GetS2() StructSize3Align1 {
	return u.S2
}

func (u *TableStructWithUint32Sandwich) GetS2WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS2() {
		return _default
	}
	return u.S2
}

func (u *TableStructWithUint32Sandwich) HasS2() bool {
	return u.S2Present
}

func (u *TableStructWithUint32Sandwich) ClearS2() {
	u.S2Present = false
}

func (u *TableStructWithUint32Sandwich) SetI2(i2 uint32) {
	u.I2 = i2
	u.I2Present = true
}

func (u *TableStructWithUint32Sandwich) GetI2() uint32 {
	return u.I2
}

func (u *TableStructWithUint32Sandwich) GetI2WithDefault(_default uint32) uint32 {
	if !u.HasI2() {
		return _default
	}
	return u.I2
}

func (u *TableStructWithUint32Sandwich) HasI2() bool {
	return u.I2Present
}

func (u *TableStructWithUint32Sandwich) ClearI2() {
	u.I2Present = false
}

type TableUnionWithVectorReservedSandwich struct {
	_         struct{}        `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Uv        UnionWithVector `fidl:"2"`
	UvPresent bool
}

func (u *TableUnionWithVectorReservedSandwich) SetUv(uv UnionWithVector) {
	u.Uv = uv
	u.UvPresent = true
}

func (u *TableUnionWithVectorReservedSandwich) GetUv() UnionWithVector {
	return u.Uv
}

func (u *TableUnionWithVectorReservedSandwich) GetUvWithDefault(_default UnionWithVector) UnionWithVector {
	if !u.HasUv() {
		return _default
	}
	return u.Uv
}

func (u *TableUnionWithVectorReservedSandwich) HasUv() bool {
	return u.UvPresent
}

func (u *TableUnionWithVectorReservedSandwich) ClearUv() {
	u.UvPresent = false
}

type TableUnionWithVectorStructSandwich struct {
	_         struct{}          `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	S1        StructSize3Align1 `fidl:"1"`
	S1Present bool
	Uv        UnionWithVector `fidl:"2"`
	UvPresent bool
	S2        StructSize3Align1 `fidl:"3"`
	S2Present bool
}

func (u *TableUnionWithVectorStructSandwich) SetS1(s1 StructSize3Align1) {
	u.S1 = s1
	u.S1Present = true
}

func (u *TableUnionWithVectorStructSandwich) GetS1() StructSize3Align1 {
	return u.S1
}

func (u *TableUnionWithVectorStructSandwich) GetS1WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS1() {
		return _default
	}
	return u.S1
}

func (u *TableUnionWithVectorStructSandwich) HasS1() bool {
	return u.S1Present
}

func (u *TableUnionWithVectorStructSandwich) ClearS1() {
	u.S1Present = false
}

func (u *TableUnionWithVectorStructSandwich) SetUv(uv UnionWithVector) {
	u.Uv = uv
	u.UvPresent = true
}

func (u *TableUnionWithVectorStructSandwich) GetUv() UnionWithVector {
	return u.Uv
}

func (u *TableUnionWithVectorStructSandwich) GetUvWithDefault(_default UnionWithVector) UnionWithVector {
	if !u.HasUv() {
		return _default
	}
	return u.Uv
}

func (u *TableUnionWithVectorStructSandwich) HasUv() bool {
	return u.UvPresent
}

func (u *TableUnionWithVectorStructSandwich) ClearUv() {
	u.UvPresent = false
}

func (u *TableUnionWithVectorStructSandwich) SetS2(s2 StructSize3Align1) {
	u.S2 = s2
	u.S2Present = true
}

func (u *TableUnionWithVectorStructSandwich) GetS2() StructSize3Align1 {
	return u.S2
}

func (u *TableUnionWithVectorStructSandwich) GetS2WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS2() {
		return _default
	}
	return u.S2
}

func (u *TableUnionWithVectorStructSandwich) HasS2() bool {
	return u.S2Present
}

func (u *TableUnionWithVectorStructSandwich) ClearS2() {
	u.S2Present = false
}

type EthernetDeviceInterface _bindings.ChannelProxy

type EthernetDevice interface {
}

type EthernetDeviceTransitionalBase struct{}

type EthernetDeviceInterfaceRequest _bindings.InterfaceRequest

func NewEthernetDeviceInterfaceRequest() (EthernetDeviceInterfaceRequest, *EthernetDeviceInterface, error) {
	req, cli, err := _bindings.NewInterfaceRequest()
	return EthernetDeviceInterfaceRequest(req), (*EthernetDeviceInterface)(cli), err
}

type EthernetDeviceStub struct {
	Impl EthernetDevice
}

func (s_ *EthernetDeviceStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
	switch ordinal_ {
	}
	return nil, false, _bindings.ErrUnknownOrdinal
}

type EthernetDeviceService struct {
	_bindings.BindingSet
}

func (s *EthernetDeviceService) Add(impl EthernetDevice, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
	return s.BindingSet.Add(&EthernetDeviceStub{Impl: impl}, c, onError)
}

func (s *EthernetDeviceService) EventProxyFor(key _bindings.BindingKey) (*EthernetDeviceEventProxy, bool) {
	pxy, err := s.BindingSet.ProxyFor(key)
	return (*EthernetDeviceEventProxy)(pxy), err
}

type EthernetDeviceEventProxy _bindings.ChannelProxy
