// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab_platform/stable_version.proto

package lab_platform

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

// StableVersions is a structure containing all of the versions for various
// components: CrOS itself, the firmware image, and the testing firmware image (faft).
// Next Tag: 4
type StableVersions struct {
	Cros                 []*StableCrosVersion     `protobuf:"bytes,1,rep,name=cros,proto3" json:"cros,omitempty"`
	Faft                 []*StableFaftVersion     `protobuf:"bytes,2,rep,name=faft,proto3" json:"faft,omitempty"`
	Firmware             []*StableFirmwareVersion `protobuf:"bytes,3,rep,name=firmware,proto3" json:"firmware,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

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

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

var xxx_messageInfo_StableVersions proto.InternalMessageInfo

func (m *StableVersions) GetCros() []*StableCrosVersion {
	if m != nil {
		return m.Cros
	}
	return nil
}

func (m *StableVersions) GetFaft() []*StableFaftVersion {
	if m != nil {
		return m.Faft
	}
	return nil
}

func (m *StableVersions) GetFirmware() []*StableFirmwareVersion {
	if m != nil {
		return m.Firmware
	}
	return nil
}

func init() {
	proto.RegisterType((*StableVersions)(nil), "lab_platform.StableVersions")
}

func init() { proto.RegisterFile("lab_platform/stable_version.proto", fileDescriptor_c0fa218129a68f41) }

var fileDescriptor_c0fa218129a68f41 = []byte{
	// 215 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xcc, 0x49, 0x4c, 0x8a,
	0x2f, 0xc8, 0x49, 0x2c, 0x49, 0xcb, 0x2f, 0xca, 0xd5, 0x2f, 0x2e, 0x49, 0x4c, 0xca, 0x49, 0x8d,
	0x2f, 0x4b, 0x2d, 0x2a, 0xce, 0xcc, 0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x41,
	0x56, 0x22, 0xa5, 0x86, 0x4d, 0x43, 0x72, 0x51, 0x7e, 0x31, 0xaa, 0x2e, 0xec, 0xea, 0xd2, 0x12,
	0xd3, 0x4a, 0xd0, 0xd4, 0x69, 0x61, 0x55, 0x97, 0x59, 0x94, 0x5b, 0x9e, 0x58, 0x84, 0xe6, 0x12,
	0xa5, 0xdd, 0x8c, 0x5c, 0x7c, 0xc1, 0x60, 0x15, 0x61, 0x10, 0xf1, 0x62, 0x21, 0x63, 0x2e, 0x16,
	0x90, 0xe5, 0x12, 0x8c, 0x0a, 0xcc, 0x1a, 0xdc, 0x46, 0xf2, 0x7a, 0xc8, 0xa6, 0xe9, 0x41, 0xd4,
	0x3a, 0x17, 0xe5, 0x17, 0x43, 0xd5, 0x07, 0x81, 0x15, 0x83, 0x34, 0x81, 0x5c, 0x22, 0xc1, 0x84,
	0x5b, 0x93, 0x5b, 0x62, 0x5a, 0x09, 0x5c, 0x13, 0x48, 0xb1, 0x90, 0x3d, 0x17, 0x07, 0xcc, 0x59,
	0x12, 0xcc, 0x60, 0x8d, 0xca, 0x58, 0x35, 0x42, 0xd5, 0xc0, 0x34, 0xc3, 0x35, 0x39, 0x59, 0x44,
	0x99, 0xa5, 0xe7, 0xeb, 0x25, 0x67, 0x14, 0xe5, 0xe7, 0x66, 0x96, 0xe6, 0xea, 0xe5, 0x17, 0xa5,
	0xeb, 0xc3, 0x38, 0xf9, 0xc5, 0xfa, 0x99, 0x79, 0x69, 0x45, 0x89, 0xfa, 0x60, 0x7f, 0xea, 0xa7,
	0xe7, 0xeb, 0x23, 0x9b, 0x9c, 0xc4, 0x06, 0x16, 0x36, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x59,
	0xc3, 0x05, 0x85, 0xad, 0x01, 0x00, 0x00,
}
