// Code generated by protoc-gen-go. DO NOT EDIT.
// source: manufacturing/config_id.proto

package manufacturing

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// 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 ConfigID struct {
	// The ID that uniquely identifies the hardware configuration of a Chrome OS device.
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ConfigID) Reset()         { *m = ConfigID{} }
func (m *ConfigID) String() string { return proto.CompactTextString(m) }
func (*ConfigID) ProtoMessage()    {}
func (*ConfigID) Descriptor() ([]byte, []int) {
	return fileDescriptor_ad41e2e003e3d3a6, []int{0}
}

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

var xxx_messageInfo_ConfigID proto.InternalMessageInfo

func (m *ConfigID) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func init() {
	proto.RegisterType((*ConfigID)(nil), "manufacturing.ConfigID")
}

func init() { proto.RegisterFile("manufacturing/config_id.proto", fileDescriptor_ad41e2e003e3d3a6) }

var fileDescriptor_ad41e2e003e3d3a6 = []byte{
	// 130 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcd, 0x4d, 0xcc, 0x2b,
	0x4d, 0x4b, 0x4c, 0x2e, 0x29, 0x2d, 0xca, 0xcc, 0x4b, 0xd7, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c,
	0x8f, 0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x45, 0x91, 0x56, 0x52, 0xe0,
	0xe2, 0x70, 0x06, 0xab, 0xf0, 0x74, 0x11, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x95,
	0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x82, 0x70, 0x9c, 0x2c, 0xa3, 0xcc, 0xd3, 0xf3, 0xf5, 0x92,
	0x33, 0x8a, 0xf2, 0x73, 0x33, 0x4b, 0x73, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0x61, 0x9c, 0xfc, 0x62,
	0xfd, 0xcc, 0xbc, 0xb4, 0xa2, 0x44, 0x7d, 0xb0, 0xd1, 0xfa, 0xe9, 0xf9, 0xfa, 0x28, 0x86, 0x27,
	0xb1, 0x81, 0xc5, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x03, 0x0f, 0x84, 0x93, 0x00,
	0x00, 0x00,
}
