// Code generated by protoc-gen-go. DO NOT EDIT.
// source: import_public/sub2/a.proto

package sub2

import (
	proto "github.com/golang/protobuf/proto"
	protoapi "github.com/golang/protobuf/protoapi"
	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
	reflect "reflect"
)

// 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.ProtoPackageIsVersion3 // please upgrade the proto package

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

func (m *Sub2Message) ProtoReflect() protoreflect.Message {
	return xxx_File_import_public_sub2_a_proto_messageTypes[0].MessageOf(m)
}
func (m *Sub2Message) Reset()         { *m = Sub2Message{} }
func (m *Sub2Message) String() string { return proto.CompactTextString(m) }
func (*Sub2Message) ProtoMessage()    {}
func (*Sub2Message) Descriptor() ([]byte, []int) {
	return xxx_File_import_public_sub2_a_proto_rawdesc_gzipped, []int{0}
}

func (m *Sub2Message) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Sub2Message.Unmarshal(m, b)
}
func (m *Sub2Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Sub2Message.Marshal(b, m, deterministic)
}
func (m *Sub2Message) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Sub2Message.Merge(m, src)
}
func (m *Sub2Message) XXX_Size() int {
	return xxx_messageInfo_Sub2Message.Size(m)
}
func (m *Sub2Message) XXX_DiscardUnknown() {
	xxx_messageInfo_Sub2Message.DiscardUnknown(m)
}

var xxx_messageInfo_Sub2Message proto.InternalMessageInfo

func init() {
	proto.RegisterFile("import_public/sub2/a.proto", xxx_File_import_public_sub2_a_proto_rawdesc_gzipped)
	proto.RegisterType((*Sub2Message)(nil), "goproto.protoc.import_public.sub2.Sub2Message")
}

var xxx_File_import_public_sub2_a_proto_rawdesc = []byte{
	// 157 bytes of the wire-encoded FileDescriptorProto
	0x0a, 0x1a, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
	0x73, 0x75, 0x62, 0x32, 0x2f, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x67, 0x6f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2e, 0x69, 0x6d, 0x70,
	0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x73, 0x75, 0x62, 0x32, 0x22,
	0x0d, 0x0a, 0x0b, 0x53, 0x75, 0x62, 0x32, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x4d,
	0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
	0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x32, 0x2f,
	0x63, 0x6d, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x67,
	0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x69, 0x6d, 0x70, 0x6f, 0x72,
	0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x73, 0x75, 0x62, 0x32,
}

var xxx_File_import_public_sub2_a_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_import_public_sub2_a_proto_rawdesc)

const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)

var File_import_public_sub2_a_proto protoreflect.FileDescriptor

var xxx_File_import_public_sub2_a_proto_messageTypes = make([]protoimpl.MessageType, 1)
var xxx_File_import_public_sub2_a_proto_goTypes = []interface{}{
	(*Sub2Message)(nil), // 0: goproto.protoc.import_public.sub2.Sub2Message
}
var xxx_File_import_public_sub2_a_proto_depIdxs = []int32{}

func init() { xxx_File_import_public_sub2_a_proto_init() }
func xxx_File_import_public_sub2_a_proto_init() {
	if File_import_public_sub2_a_proto != nil {
		return
	}
	messageTypes := make([]protoreflect.MessageType, 1)
	File_import_public_sub2_a_proto = protoimpl.FileBuilder{
		RawDescriptor:      xxx_File_import_public_sub2_a_proto_rawdesc,
		GoTypes:            xxx_File_import_public_sub2_a_proto_goTypes,
		DependencyIndexes:  xxx_File_import_public_sub2_a_proto_depIdxs,
		MessageOutputTypes: messageTypes,
	}.Init()
	messageGoTypes := xxx_File_import_public_sub2_a_proto_goTypes[0:][:1]
	for i, mt := range messageTypes {
		xxx_File_import_public_sub2_a_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
		xxx_File_import_public_sub2_a_proto_messageTypes[i].PBType = mt
	}
	xxx_File_import_public_sub2_a_proto_goTypes = nil
	xxx_File_import_public_sub2_a_proto_depIdxs = nil
}
