// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/custom_results/graphics/software_config.proto

package graphics

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	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

// Software configuration of installed software on a device.
// Next Tag: 11
type SoftwareConfig struct {
	// Global unique software configuration identifier.
	Id         *SoftwareConfigId    `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	CreateTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// For nested systems, the software configuration of the host system.
	Parent               *SoftwareConfigId        `protobuf:"bytes,3,opt,name=parent,proto3" json:"parent,omitempty"`
	Packages             []*Package               `protobuf:"bytes,4,rep,name=packages,proto3" json:"packages,omitempty"`
	KernelRelease        string                   `protobuf:"bytes,5,opt,name=kernel_release,json=kernelRelease,proto3" json:"kernel_release,omitempty"`
	KernelVersion        string                   `protobuf:"bytes,6,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"`
	Chromeos             *SoftwareConfig_ChromeOS `protobuf:"bytes,7,opt,name=chromeos,proto3" json:"chromeos,omitempty"`
	Os                   *SoftwareConfig_OS       `protobuf:"bytes,8,opt,name=os,proto3" json:"os,omitempty"`
	BiosVersion          string                   `protobuf:"bytes,9,opt,name=bios_version,json=biosVersion,proto3" json:"bios_version,omitempty"`
	EcVersion            string                   `protobuf:"bytes,10,opt,name=ec_version,json=ecVersion,proto3" json:"ec_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

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

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

var xxx_messageInfo_SoftwareConfig proto.InternalMessageInfo

func (m *SoftwareConfig) GetId() *SoftwareConfigId {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *SoftwareConfig) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *SoftwareConfig) GetParent() *SoftwareConfigId {
	if m != nil {
		return m.Parent
	}
	return nil
}

func (m *SoftwareConfig) GetPackages() []*Package {
	if m != nil {
		return m.Packages
	}
	return nil
}

func (m *SoftwareConfig) GetKernelRelease() string {
	if m != nil {
		return m.KernelRelease
	}
	return ""
}

func (m *SoftwareConfig) GetKernelVersion() string {
	if m != nil {
		return m.KernelVersion
	}
	return ""
}

func (m *SoftwareConfig) GetChromeos() *SoftwareConfig_ChromeOS {
	if m != nil {
		return m.Chromeos
	}
	return nil
}

func (m *SoftwareConfig) GetOs() *SoftwareConfig_OS {
	if m != nil {
		return m.Os
	}
	return nil
}

func (m *SoftwareConfig) GetBiosVersion() string {
	if m != nil {
		return m.BiosVersion
	}
	return ""
}

func (m *SoftwareConfig) GetEcVersion() string {
	if m != nil {
		return m.EcVersion
	}
	return ""
}

type SoftwareConfig_ChromeOS struct {
	Board                string   `protobuf:"bytes,1,opt,name=board,proto3" json:"board,omitempty"`
	BranchNumber         uint32   `protobuf:"varint,2,opt,name=branch_number,json=branchNumber,proto3" json:"branch_number,omitempty"`
	BuilderPath          string   `protobuf:"bytes,3,opt,name=builder_path,json=builderPath,proto3" json:"builder_path,omitempty"`
	BuildNumber          uint32   `protobuf:"varint,4,opt,name=build_number,json=buildNumber,proto3" json:"build_number,omitempty"`
	BuildType            string   `protobuf:"bytes,5,opt,name=build_type,json=buildType,proto3" json:"build_type,omitempty"`
	ChromeMilestone      uint32   `protobuf:"varint,6,opt,name=chrome_milestone,json=chromeMilestone,proto3" json:"chrome_milestone,omitempty"`
	Description          string   `protobuf:"bytes,7,opt,name=description,proto3" json:"description,omitempty"`
	Keyset               string   `protobuf:"bytes,8,opt,name=keyset,proto3" json:"keyset,omitempty"`
	Name                 string   `protobuf:"bytes,9,opt,name=name,proto3" json:"name,omitempty"`
	PatchNumber          string   `protobuf:"bytes,10,opt,name=patch_number,json=patchNumber,proto3" json:"patch_number,omitempty"`
	Track                string   `protobuf:"bytes,11,opt,name=track,proto3" json:"track,omitempty"`
	Version              string   `protobuf:"bytes,12,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SoftwareConfig_ChromeOS proto.InternalMessageInfo

func (m *SoftwareConfig_ChromeOS) GetBoard() string {
	if m != nil {
		return m.Board
	}
	return ""
}

func (m *SoftwareConfig_ChromeOS) GetBranchNumber() uint32 {
	if m != nil {
		return m.BranchNumber
	}
	return 0
}

func (m *SoftwareConfig_ChromeOS) GetBuilderPath() string {
	if m != nil {
		return m.BuilderPath
	}
	return ""
}

func (m *SoftwareConfig_ChromeOS) GetBuildNumber() uint32 {
	if m != nil {
		return m.BuildNumber
	}
	return 0
}

func (m *SoftwareConfig_ChromeOS) GetBuildType() string {
	if m != nil {
		return m.BuildType
	}
	return ""
}

func (m *SoftwareConfig_ChromeOS) GetChromeMilestone() uint32 {
	if m != nil {
		return m.ChromeMilestone
	}
	return 0
}

func (m *SoftwareConfig_ChromeOS) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *SoftwareConfig_ChromeOS) GetKeyset() string {
	if m != nil {
		return m.Keyset
	}
	return ""
}

func (m *SoftwareConfig_ChromeOS) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *SoftwareConfig_ChromeOS) GetPatchNumber() string {
	if m != nil {
		return m.PatchNumber
	}
	return ""
}

func (m *SoftwareConfig_ChromeOS) GetTrack() string {
	if m != nil {
		return m.Track
	}
	return ""
}

func (m *SoftwareConfig_ChromeOS) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

type SoftwareConfig_OS struct {
	BuildId              string   `protobuf:"bytes,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
	Codename             string   `protobuf:"bytes,2,opt,name=codename,proto3" json:"codename,omitempty"`
	Id                   string   `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	Name                 string   `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	PrettyName           string   `protobuf:"bytes,5,opt,name=pretty_name,json=prettyName,proto3" json:"pretty_name,omitempty"`
	VersionId            string   `protobuf:"bytes,6,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"`
	Version              string   `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SoftwareConfig_OS proto.InternalMessageInfo

func (m *SoftwareConfig_OS) GetBuildId() string {
	if m != nil {
		return m.BuildId
	}
	return ""
}

func (m *SoftwareConfig_OS) GetCodename() string {
	if m != nil {
		return m.Codename
	}
	return ""
}

func (m *SoftwareConfig_OS) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *SoftwareConfig_OS) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *SoftwareConfig_OS) GetPrettyName() string {
	if m != nil {
		return m.PrettyName
	}
	return ""
}

func (m *SoftwareConfig_OS) GetVersionId() string {
	if m != nil {
		return m.VersionId
	}
	return ""
}

func (m *SoftwareConfig_OS) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func init() {
	proto.RegisterType((*SoftwareConfig)(nil), "test.custom_results.graphics.SoftwareConfig")
	proto.RegisterType((*SoftwareConfig_ChromeOS)(nil), "test.custom_results.graphics.SoftwareConfig.ChromeOS")
	proto.RegisterType((*SoftwareConfig_OS)(nil), "test.custom_results.graphics.SoftwareConfig.OS")
}

func init() {
	proto.RegisterFile("test/custom_results/graphics/software_config.proto", fileDescriptor_9bb41260180eeb52)
}

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