// Code generated by fidlgen; DO NOT EDIT.

package experimentalmaybefromtypealias

import (
	_bindings "syscall/zx/fidl"
)

type Testing struct {
	_   struct{}                             `fidl:"s" fidl_size_v1:"784" fidl_alignment_v1:"8"`
	U1  uint64                               `fidl_offset_v1:"0"`
	U2  []uint64                             `fidl_offset_v1:"8" fidl_bounds:"1"`
	U3  [1]uint64                            `fidl_offset_v1:"24"`
	U4  [][]uint64                           `fidl_offset_v1:"32" fidl_bounds:",1"`
	U5  [][1]uint64                          `fidl_offset_v1:"48" fidl_bounds:""`
	U6  [4][]uint64                          `fidl_offset_v1:"64" fidl_bounds:"1"`
	U7  [4][1]uint64                         `fidl_offset_v1:"128"`
	V1  *[]uint64                            `fidl_offset_v1:"160" fidl_bounds:""`
	V2  []*[]uint64                          `fidl_offset_v1:"176" fidl_bounds:""`
	V3  [4]*[]uint64                         `fidl_offset_v1:"192" fidl_bounds:""`
	A1  [1]uint64                            `fidl_offset_v1:"256"`
	A2  [][1]uint64                          `fidl_offset_v1:"264" fidl_bounds:""`
	A3  [4][1]uint64                         `fidl_offset_v1:"280"`
	P1  MyProtocolWithCtxInterfaceRequest    `fidl_offset_v1:"312" fidl_handle_subtype:"4" fidl_bounds:"0"`
	P2  []MyProtocolWithCtxInterfaceRequest  `fidl_offset_v1:"320" fidl_handle_subtype:"4" fidl_bounds:",0"`
	P3  [4]MyProtocolWithCtxInterfaceRequest `fidl_offset_v1:"336" fidl_handle_subtype:"4" fidl_bounds:"0"`
	R1  MyProtocolWithCtxInterfaceRequest    `fidl_offset_v1:"352" fidl_handle_subtype:"4" fidl_bounds:"1"`
	R2  []MyProtocolWithCtxInterfaceRequest  `fidl_offset_v1:"360" fidl_handle_subtype:"4" fidl_bounds:",1"`
	R3  [4]MyProtocolWithCtxInterfaceRequest `fidl_offset_v1:"376" fidl_handle_subtype:"4" fidl_bounds:"1"`
	B1  []uint8                              `fidl_offset_v1:"392" fidl_bounds:""`
	B2  [][]uint8                            `fidl_offset_v1:"408" fidl_bounds:""`
	B3  [4][]uint8                           `fidl_offset_v1:"424" fidl_bounds:""`
	S1  string                               `fidl_offset_v1:"488" fidl_bounds:""`
	S2  []string                             `fidl_offset_v1:"504" fidl_bounds:""`
	S3  [4]string                            `fidl_offset_v1:"520" fidl_bounds:""`
	Vv1 []uint64                             `fidl_offset_v1:"584" fidl_bounds:"2"`
	Vv2 [][]uint64                           `fidl_offset_v1:"600" fidl_bounds:"3,2"`
	Vv3 [3][]uint64                          `fidl_offset_v1:"616" fidl_bounds:"2"`
	Aa1 [2]uint64                            `fidl_offset_v1:"664"`
	Aa2 [][2]uint64                          `fidl_offset_v1:"680" fidl_bounds:"3"`
	Aa3 [3][2]uint64                         `fidl_offset_v1:"696"`
	Rr1 MyProtocolWithCtxInterfaceRequest    `fidl_offset_v1:"744" fidl_handle_subtype:"4" fidl_bounds:"0"`
	Rr2 []MyProtocolWithCtxInterfaceRequest  `fidl_offset_v1:"752" fidl_handle_subtype:"4" fidl_bounds:"3,0"`
	Rr3 [3]MyProtocolWithCtxInterfaceRequest `fidl_offset_v1:"768" fidl_handle_subtype:"4" fidl_bounds:"0"`
}

var _mTesting = _bindings.CreateLazyMarshaler(Testing{})

func (msg *Testing) Marshaler() _bindings.Marshaler {
	return _mTesting
}

const ()

type MyProtocolWithCtxInterface _bindings.ChannelProxy

type MyProtocolWithCtx interface {
}

type MyProtocolWithCtxTransitionalBase struct{}

type MyProtocolWithCtxInterfaceRequest _bindings.InterfaceRequest

func NewMyProtocolWithCtxInterfaceRequest() (MyProtocolWithCtxInterfaceRequest, *MyProtocolWithCtxInterface, error) {
	req, cli, err := _bindings.NewInterfaceRequest()
	return MyProtocolWithCtxInterfaceRequest(req), (*MyProtocolWithCtxInterface)(cli), err
}

type MyProtocolWithCtxStub struct {
	Impl MyProtocolWithCtx
}

func (s_ *MyProtocolWithCtxStub) Dispatch(args_ _bindings.DispatchArgs) (_bindings.Message, bool, error) {
	switch args_.Ordinal {
	}
	return nil, false, _bindings.ErrUnknownOrdinal
}

type MyProtocolEventProxy _bindings.ChannelProxy
