// Code generated by protoc-gen-go. DO NOT EDIT.
// source: proto3/fields.proto

package proto3

import proto "github.com/golang/protobuf/proto"

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

type FieldTestMessage_Enum int32

const (
	FieldTestMessage_ZERO FieldTestMessage_Enum = 0
)

var FieldTestMessage_Enum_name = map[int32]string{
	0: "ZERO",
}

var FieldTestMessage_Enum_value = map[string]int32{
	"ZERO": 0,
}

func (x FieldTestMessage_Enum) String() string {
	return proto.EnumName(FieldTestMessage_Enum_name, int32(x))
}

func (FieldTestMessage_Enum) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_f1e3ea068187307c, []int{0, 0}
}

type FieldTestMessage struct {
	OptionalBool         string                               `protobuf:"bytes,1,opt,name=optional_bool,json=optionalBool,proto3" json:"optional_bool,omitempty"`
	OptionalEnum         FieldTestMessage_Enum                `protobuf:"varint,2,opt,name=optional_enum,json=optionalEnum,proto3,enum=goproto.protoc.proto3.FieldTestMessage_Enum" json:"optional_enum,omitempty"`
	OptionalInt32        int32                                `protobuf:"varint,3,opt,name=optional_int32,json=optionalInt32,proto3" json:"optional_int32,omitempty"`
	OptionalSint32       int32                                `protobuf:"zigzag32,4,opt,name=optional_sint32,json=optionalSint32,proto3" json:"optional_sint32,omitempty"`
	OptionalUint32       uint32                               `protobuf:"varint,5,opt,name=optional_uint32,json=optionalUint32,proto3" json:"optional_uint32,omitempty"`
	OptionalInt64        int64                                `protobuf:"varint,6,opt,name=optional_int64,json=optionalInt64,proto3" json:"optional_int64,omitempty"`
	OptionalSint64       int64                                `protobuf:"zigzag64,7,opt,name=optional_sint64,json=optionalSint64,proto3" json:"optional_sint64,omitempty"`
	OptionalUint64       uint64                               `protobuf:"varint,8,opt,name=optional_uint64,json=optionalUint64,proto3" json:"optional_uint64,omitempty"`
	OptionalSfixed32     int32                                `protobuf:"fixed32,9,opt,name=optional_sfixed32,json=optionalSfixed32,proto3" json:"optional_sfixed32,omitempty"`
	OptionalFixed32      uint32                               `protobuf:"fixed32,10,opt,name=optional_fixed32,json=optionalFixed32,proto3" json:"optional_fixed32,omitempty"`
	OptionalFloat        float32                              `protobuf:"fixed32,11,opt,name=optional_float,json=optionalFloat,proto3" json:"optional_float,omitempty"`
	OptionalSfixed64     int64                                `protobuf:"fixed64,12,opt,name=optional_sfixed64,json=optionalSfixed64,proto3" json:"optional_sfixed64,omitempty"`
	OptionalFixed64      uint64                               `protobuf:"fixed64,13,opt,name=optional_fixed64,json=optionalFixed64,proto3" json:"optional_fixed64,omitempty"`
	OptionalDouble       float64                              `protobuf:"fixed64,14,opt,name=optional_double,json=optionalDouble,proto3" json:"optional_double,omitempty"`
	OptionalString       string                               `protobuf:"bytes,15,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"`
	OptionalBytes        []byte                               `protobuf:"bytes,16,opt,name=optional_bytes,json=optionalBytes,proto3" json:"optional_bytes,omitempty"`
	Optional_Message     *FieldTestMessage_Message            `protobuf:"bytes,17,opt,name=optional_Message,json=optionalMessage,proto3" json:"optional_Message,omitempty"`
	MapInt32Int64        map[int32]int64                      `protobuf:"bytes,500,rep,name=map_int32_int64,json=mapInt32Int64,proto3" json:"map_int32_int64,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
	MapStringMessage     map[string]*FieldTestMessage_Message `protobuf:"bytes,501,rep,name=map_string_message,json=mapStringMessage,proto3" json:"map_string_message,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	MapFixed64Enum       map[uint64]FieldTestMessage_Enum     `protobuf:"bytes,502,rep,name=map_fixed64_enum,json=mapFixed64Enum,proto3" json:"map_fixed64_enum,omitempty" protobuf_key:"fixed64,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=goproto.protoc.proto3.FieldTestMessage_Enum"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

func (m *FieldTestMessage) Reset()         { *m = FieldTestMessage{} }
func (m *FieldTestMessage) String() string { return proto.CompactTextString(m) }
func (*FieldTestMessage) ProtoMessage()    {}
func (*FieldTestMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_f1e3ea068187307c, []int{0}
}
func (m *FieldTestMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FieldTestMessage.Unmarshal(m, b)
}
func (m *FieldTestMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FieldTestMessage.Marshal(b, m, deterministic)
}
func (m *FieldTestMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FieldTestMessage.Merge(m, src)
}
func (m *FieldTestMessage) XXX_Size() int {
	return xxx_messageInfo_FieldTestMessage.Size(m)
}
func (m *FieldTestMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_FieldTestMessage.DiscardUnknown(m)
}

var xxx_messageInfo_FieldTestMessage proto.InternalMessageInfo

func (m *FieldTestMessage) GetOptionalBool() string {
	if m != nil {
		return m.OptionalBool
	}
	return ""
}

func (m *FieldTestMessage) GetOptionalEnum() FieldTestMessage_Enum {
	if m != nil {
		return m.OptionalEnum
	}
	return FieldTestMessage_ZERO
}

func (m *FieldTestMessage) GetOptionalInt32() int32 {
	if m != nil {
		return m.OptionalInt32
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalSint32() int32 {
	if m != nil {
		return m.OptionalSint32
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalUint32() uint32 {
	if m != nil {
		return m.OptionalUint32
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalInt64() int64 {
	if m != nil {
		return m.OptionalInt64
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalSint64() int64 {
	if m != nil {
		return m.OptionalSint64
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalUint64() uint64 {
	if m != nil {
		return m.OptionalUint64
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalSfixed32() int32 {
	if m != nil {
		return m.OptionalSfixed32
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalFixed32() uint32 {
	if m != nil {
		return m.OptionalFixed32
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalFloat() float32 {
	if m != nil {
		return m.OptionalFloat
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalSfixed64() int64 {
	if m != nil {
		return m.OptionalSfixed64
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalFixed64() uint64 {
	if m != nil {
		return m.OptionalFixed64
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalDouble() float64 {
	if m != nil {
		return m.OptionalDouble
	}
	return 0
}

func (m *FieldTestMessage) GetOptionalString() string {
	if m != nil {
		return m.OptionalString
	}
	return ""
}

func (m *FieldTestMessage) GetOptionalBytes() []byte {
	if m != nil {
		return m.OptionalBytes
	}
	return nil
}

func (m *FieldTestMessage) GetOptional_Message() *FieldTestMessage_Message {
	if m != nil {
		return m.Optional_Message
	}
	return nil
}

func (m *FieldTestMessage) GetMapInt32Int64() map[int32]int64 {
	if m != nil {
		return m.MapInt32Int64
	}
	return nil
}

func (m *FieldTestMessage) GetMapStringMessage() map[string]*FieldTestMessage_Message {
	if m != nil {
		return m.MapStringMessage
	}
	return nil
}

func (m *FieldTestMessage) GetMapFixed64Enum() map[uint64]FieldTestMessage_Enum {
	if m != nil {
		return m.MapFixed64Enum
	}
	return nil
}

type FieldTestMessage_Message struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FieldTestMessage_Message) Reset()         { *m = FieldTestMessage_Message{} }
func (m *FieldTestMessage_Message) String() string { return proto.CompactTextString(m) }
func (*FieldTestMessage_Message) ProtoMessage()    {}
func (*FieldTestMessage_Message) Descriptor() ([]byte, []int) {
	return fileDescriptor_f1e3ea068187307c, []int{0, 3}
}
func (m *FieldTestMessage_Message) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FieldTestMessage_Message.Unmarshal(m, b)
}
func (m *FieldTestMessage_Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FieldTestMessage_Message.Marshal(b, m, deterministic)
}
func (m *FieldTestMessage_Message) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FieldTestMessage_Message.Merge(m, src)
}
func (m *FieldTestMessage_Message) XXX_Size() int {
	return xxx_messageInfo_FieldTestMessage_Message.Size(m)
}
func (m *FieldTestMessage_Message) XXX_DiscardUnknown() {
	xxx_messageInfo_FieldTestMessage_Message.DiscardUnknown(m)
}

var xxx_messageInfo_FieldTestMessage_Message proto.InternalMessageInfo

func init() {
	proto.RegisterType((*FieldTestMessage)(nil), "goproto.protoc.proto3.FieldTestMessage")
	proto.RegisterMapType((map[uint64]FieldTestMessage_Enum)(nil), "goproto.protoc.proto3.FieldTestMessage.MapFixed64EnumEntry")
	proto.RegisterMapType((map[int32]int64)(nil), "goproto.protoc.proto3.FieldTestMessage.MapInt32Int64Entry")
	proto.RegisterMapType((map[string]*FieldTestMessage_Message)(nil), "goproto.protoc.proto3.FieldTestMessage.MapStringMessageEntry")
	proto.RegisterType((*FieldTestMessage_Message)(nil), "goproto.protoc.proto3.FieldTestMessage.Message")
	proto.RegisterEnum("goproto.protoc.proto3.FieldTestMessage_Enum", FieldTestMessage_Enum_name, FieldTestMessage_Enum_value)
}

func init() { proto.RegisterFile("proto3/fields.proto", fileDescriptor_f1e3ea068187307c) }

var fileDescriptor_f1e3ea068187307c = []byte{
	// 596 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x4b, 0x8f, 0xd3, 0x3c,
	0x18, 0x85, 0x3f, 0x4f, 0x7a, 0x99, 0xba, 0xb7, 0xd4, 0xf3, 0x8d, 0x64, 0xcd, 0xca, 0x1a, 0x84,
	0x30, 0x82, 0x49, 0xa5, 0x36, 0x8a, 0x60, 0x46, 0x48, 0xa8, 0xa2, 0x95, 0x58, 0x20, 0x44, 0x80,
	0x4d, 0x37, 0x55, 0xda, 0xba, 0x51, 0x44, 0x12, 0x57, 0x8d, 0x83, 0xe8, 0x4f, 0xe2, 0xff, 0x01,
	0x6b, 0x14, 0x3b, 0xcd, 0xad, 0x5d, 0x4c, 0x59, 0xd9, 0x3e, 0x3d, 0x7d, 0x9f, 0x1c, 0xfb, 0xb5,
	0xe1, 0xd5, 0x76, 0xc7, 0x05, 0x1f, 0x0f, 0x37, 0x1e, 0xf3, 0xd7, 0x91, 0x21, 0x57, 0xe8, 0xda,
	0xe5, 0x72, 0xa2, 0x96, 0x2b, 0x35, 0x8c, 0x6f, 0x7f, 0xb6, 0xa1, 0x3e, 0x4b, 0x7c, 0x5f, 0x58,
	0x24, 0x3e, 0xb0, 0x28, 0x72, 0x5c, 0x86, 0x9e, 0xc0, 0x2e, 0xdf, 0x0a, 0x8f, 0x87, 0x8e, 0xbf,
	0x58, 0x72, 0xee, 0x63, 0x40, 0x00, 0x6d, 0xd9, 0x9d, 0x83, 0x38, 0xe1, 0xdc, 0x47, 0x9f, 0x0a,
	0x26, 0x16, 0xc6, 0x01, 0xbe, 0x20, 0x80, 0xf6, 0x46, 0x2f, 0x8d, 0x93, 0x20, 0xa3, 0x0a, 0x31,
	0xa6, 0x61, 0x1c, 0xe4, 0x25, 0x93, 0x15, 0x7a, 0x0a, 0x7b, 0x59, 0x49, 0x2f, 0x14, 0xe3, 0x11,
	0xd6, 0x08, 0xa0, 0x75, 0x3b, 0x03, 0xbd, 0x4f, 0x44, 0xf4, 0x0c, 0xf6, 0x33, 0x5b, 0xa4, 0x7c,
	0x35, 0x02, 0xe8, 0xc0, 0xce, 0xfe, 0xfd, 0xd9, 0x3b, 0x32, 0xc6, 0xca, 0x58, 0x27, 0x80, 0x76,
	0x73, 0xe3, 0x57, 0x65, 0xac, 0x80, 0x2d, 0x13, 0x37, 0x08, 0xa0, 0x5a, 0x09, 0x6c, 0x99, 0x47,
	0x60, 0xcb, 0xc4, 0x4d, 0x02, 0x28, 0x2a, 0x83, 0x2b, 0xc6, 0x58, 0x19, 0x2f, 0x09, 0xa0, 0xb5,
	0x32, 0xd8, 0x32, 0xd1, 0x0b, 0x38, 0xc8, 0x2b, 0x6e, 0xbc, 0x1f, 0x6c, 0x3d, 0x1e, 0xe1, 0x16,
	0x01, 0xb4, 0x6f, 0xeb, 0x59, 0xcd, 0x54, 0x47, 0xcf, 0x61, 0xa6, 0x2d, 0x0e, 0x5e, 0x48, 0x00,
	0x6d, 0xda, 0x19, 0x6d, 0x96, 0x5a, 0x8b, 0x81, 0x36, 0x3e, 0x77, 0x04, 0x6e, 0x13, 0x40, 0x2f,
	0xf2, 0x40, 0xb3, 0x44, 0x3c, 0x81, 0xb7, 0x4c, 0xdc, 0x21, 0x80, 0xea, 0x55, 0xbc, 0x65, 0x1e,
	0xe3, 0x2d, 0x13, 0x77, 0x09, 0xa0, 0x8d, 0x0a, 0xbe, 0x92, 0x7f, 0xcd, 0xe3, 0xa5, 0xcf, 0x70,
	0x8f, 0x00, 0x0a, 0xf2, 0xfc, 0xef, 0xa4, 0x5a, 0xde, 0x51, 0xb1, 0xf3, 0x42, 0x17, 0xf7, 0x65,
	0xaf, 0xe5, 0x3b, 0x2a, 0xd5, 0x52, 0xa0, 0xe5, 0x5e, 0xb0, 0x08, 0xeb, 0x04, 0xd0, 0x4e, 0x1e,
	0x68, 0x92, 0x88, 0x68, 0x5e, 0xf8, 0xc6, 0xb4, 0xd1, 0xf0, 0x80, 0x00, 0xda, 0x1e, 0x0d, 0x1f,
	0xdb, 0x97, 0xe9, 0x98, 0x87, 0x3a, 0xdc, 0x8a, 0x15, 0xec, 0x07, 0xce, 0x56, 0x35, 0x66, 0xda,
	0x25, 0xbf, 0x34, 0xa2, 0xd1, 0xf6, 0xe8, 0xfe, 0xd1, 0xb5, 0x9d, 0xad, 0x6c, 0x61, 0xd9, 0x4e,
	0xd3, 0x50, 0xec, 0xf6, 0x76, 0x37, 0x28, 0x6a, 0xc8, 0x87, 0x28, 0x81, 0xa8, 0xbd, 0x58, 0x04,
	0x69, 0x84, 0xdf, 0x8a, 0xf3, 0xe6, 0x0c, 0x8e, 0xda, 0xb7, 0x54, 0x50, 0x28, 0x3d, 0xa8, 0xc8,
	0x68, 0x03, 0x13, 0xed, 0x70, 0x9a, 0xea, 0x1a, 0xff, 0x51, 0xac, 0x87, 0x33, 0x58, 0xe9, 0xb1,
	0x27, 0x77, 0x58, 0x91, 0x7a, 0x41, 0x49, 0xbc, 0x79, 0x0b, 0xd1, 0x71, 0x74, 0xa4, 0x43, 0xed,
	0x1b, 0xdb, 0xcb, 0xc7, 0xa5, 0x6e, 0x27, 0x53, 0xf4, 0x3f, 0xac, 0x7f, 0x77, 0xfc, 0x98, 0xc9,
	0xb7, 0x44, 0xb3, 0xd5, 0xe2, 0xfe, 0xe2, 0x15, 0xb8, 0x11, 0xf0, 0xfa, 0x64, 0xa8, 0x62, 0x91,
	0x96, 0x2a, 0x32, 0x2d, 0x16, 0xf9, 0x87, 0x83, 0x2f, 0x50, 0x39, 0xbc, 0x3a, 0x11, 0xaf, 0xc8,
	0x6c, 0x28, 0xe6, 0xa4, 0xc8, 0x3c, 0xf7, 0x11, 0x2c, 0x00, 0x5b, 0xb0, 0x99, 0xfe, 0x74, 0xab,
	0xc3, 0x9a, 0x7c, 0x14, 0x2f, 0x61, 0x6d, 0x3e, 0xb5, 0x3f, 0xea, 0xff, 0x4d, 0x1e, 0xe6, 0xaf,
	0x5d, 0xce, 0x5d, 0x9f, 0x19, 0x2e, 0xf7, 0x9d, 0xd0, 0x35, 0xf8, 0xce, 0x1d, 0xca, 0xca, 0xc3,
	0x55, 0xb0, 0x56, 0xb3, 0xd5, 0x9d, 0xcb, 0xc2, 0x3b, 0x97, 0x0f, 0x05, 0x8b, 0xc4, 0xda, 0x11,
	0x8e, 0x92, 0xc7, 0xcb, 0x86, 0x1a, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x3e, 0xd2, 0xfc, 0xf5,
	0x1d, 0x06, 0x00, 0x00,
}
