// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/config/api/topology.proto

package api

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 Topology_Type int32

const (
	Topology_TYPE_UNKNOWN                         Topology_Type = 0
	Topology_SCREEN                               Topology_Type = 1
	Topology_FORM_FACTOR                          Topology_Type = 2
	Topology_AUDIO                                Topology_Type = 3
	Topology_STYLUS                               Topology_Type = 4
	Topology_KEYBOARD                             Topology_Type = 5
	Topology_THERMAL                              Topology_Type = 6
	Topology_CAMERA                               Topology_Type = 7
	Topology_ACCELEROMETER_GYROSCOPE_MAGNETOMETER Topology_Type = 8
	Topology_FINGERPRINT                          Topology_Type = 9
	Topology_PROXIMITY_SENSOR                     Topology_Type = 10
	Topology_DAUGHTER_BOARD                       Topology_Type = 11
	Topology_NON_VOLATILE_STORAGE                 Topology_Type = 12
	Topology_RAM                                  Topology_Type = 13
	Topology_WIFI                                 Topology_Type = 14
	Topology_LTE_BOARD                            Topology_Type = 15
	Topology_SD_READER                            Topology_Type = 16
	Topology_MOTHERBOARD_USB                      Topology_Type = 17
	Topology_BLUETOOTH                            Topology_Type = 18
	Topology_BARRELJACK                           Topology_Type = 19
	Topology_POWER_BUTTON                         Topology_Type = 20
	Topology_VOLUME_BUTTON                        Topology_Type = 21
	Topology_EC                                   Topology_Type = 22
)

var Topology_Type_name = map[int32]string{
	0:  "TYPE_UNKNOWN",
	1:  "SCREEN",
	2:  "FORM_FACTOR",
	3:  "AUDIO",
	4:  "STYLUS",
	5:  "KEYBOARD",
	6:  "THERMAL",
	7:  "CAMERA",
	8:  "ACCELEROMETER_GYROSCOPE_MAGNETOMETER",
	9:  "FINGERPRINT",
	10: "PROXIMITY_SENSOR",
	11: "DAUGHTER_BOARD",
	12: "NON_VOLATILE_STORAGE",
	13: "RAM",
	14: "WIFI",
	15: "LTE_BOARD",
	16: "SD_READER",
	17: "MOTHERBOARD_USB",
	18: "BLUETOOTH",
	19: "BARRELJACK",
	20: "POWER_BUTTON",
	21: "VOLUME_BUTTON",
	22: "EC",
}

var Topology_Type_value = map[string]int32{
	"TYPE_UNKNOWN":                         0,
	"SCREEN":                               1,
	"FORM_FACTOR":                          2,
	"AUDIO":                                3,
	"STYLUS":                               4,
	"KEYBOARD":                             5,
	"THERMAL":                              6,
	"CAMERA":                               7,
	"ACCELEROMETER_GYROSCOPE_MAGNETOMETER": 8,
	"FINGERPRINT":                          9,
	"PROXIMITY_SENSOR":                     10,
	"DAUGHTER_BOARD":                       11,
	"NON_VOLATILE_STORAGE":                 12,
	"RAM":                                  13,
	"WIFI":                                 14,
	"LTE_BOARD":                            15,
	"SD_READER":                            16,
	"MOTHERBOARD_USB":                      17,
	"BLUETOOTH":                            18,
	"BARRELJACK":                           19,
	"POWER_BUTTON":                         20,
	"VOLUME_BUTTON":                        21,
	"EC":                                   22,
}

func (x Topology_Type) String() string {
	return proto.EnumName(Topology_Type_name, int32(x))
}

func (Topology_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{0, 0}
}

type HardwareFeatures_Present int32

const (
	HardwareFeatures_PRESENT_UNKNOWN HardwareFeatures_Present = 0
	HardwareFeatures_PRESENT         HardwareFeatures_Present = 1
	HardwareFeatures_NOT_PRESENT     HardwareFeatures_Present = 2
)

var HardwareFeatures_Present_name = map[int32]string{
	0: "PRESENT_UNKNOWN",
	1: "PRESENT",
	2: "NOT_PRESENT",
}

var HardwareFeatures_Present_value = map[string]int32{
	"PRESENT_UNKNOWN": 0,
	"PRESENT":         1,
	"NOT_PRESENT":     2,
}

func (x HardwareFeatures_Present) String() string {
	return proto.EnumName(HardwareFeatures_Present_name, int32(x))
}

func (HardwareFeatures_Present) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 0}
}

type HardwareFeatures_Audio_AudioCodec int32

const (
	HardwareFeatures_Audio_AUDIO_CODEC_UNKNOWN HardwareFeatures_Audio_AudioCodec = 0
	HardwareFeatures_Audio_RT5682              HardwareFeatures_Audio_AudioCodec = 1
	HardwareFeatures_Audio_ALC5682I            HardwareFeatures_Audio_AudioCodec = 2
	HardwareFeatures_Audio_ALC5682             HardwareFeatures_Audio_AudioCodec = 3
	HardwareFeatures_Audio_MAX98357            HardwareFeatures_Audio_AudioCodec = 4
	HardwareFeatures_Audio_MAX98373            HardwareFeatures_Audio_AudioCodec = 5
	HardwareFeatures_Audio_MAX98360            HardwareFeatures_Audio_AudioCodec = 6
	HardwareFeatures_Audio_RT1015              HardwareFeatures_Audio_AudioCodec = 7
	HardwareFeatures_Audio_DA7219              HardwareFeatures_Audio_AudioCodec = 8
)

var HardwareFeatures_Audio_AudioCodec_name = map[int32]string{
	0: "AUDIO_CODEC_UNKNOWN",
	1: "RT5682",
	2: "ALC5682I",
	3: "ALC5682",
	4: "MAX98357",
	5: "MAX98373",
	6: "MAX98360",
	7: "RT1015",
	8: "DA7219",
}

var HardwareFeatures_Audio_AudioCodec_value = map[string]int32{
	"AUDIO_CODEC_UNKNOWN": 0,
	"RT5682":              1,
	"ALC5682I":            2,
	"ALC5682":             3,
	"MAX98357":            4,
	"MAX98373":            5,
	"MAX98360":            6,
	"RT1015":              7,
	"DA7219":              8,
}

func (x HardwareFeatures_Audio_AudioCodec) String() string {
	return proto.EnumName(HardwareFeatures_Audio_AudioCodec_name, int32(x))
}

func (HardwareFeatures_Audio_AudioCodec) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 6, 0}
}

type HardwareFeatures_Camera_Interface int32

const (
	HardwareFeatures_Camera_INTERFACE_UNKNOWN HardwareFeatures_Camera_Interface = 0
	HardwareFeatures_Camera_INTERFACE_USB     HardwareFeatures_Camera_Interface = 1
	HardwareFeatures_Camera_INTERFACE_MIPI    HardwareFeatures_Camera_Interface = 2
)

var HardwareFeatures_Camera_Interface_name = map[int32]string{
	0: "INTERFACE_UNKNOWN",
	1: "INTERFACE_USB",
	2: "INTERFACE_MIPI",
}

var HardwareFeatures_Camera_Interface_value = map[string]int32{
	"INTERFACE_UNKNOWN": 0,
	"INTERFACE_USB":     1,
	"INTERFACE_MIPI":    2,
}

func (x HardwareFeatures_Camera_Interface) String() string {
	return proto.EnumName(HardwareFeatures_Camera_Interface_name, int32(x))
}

func (HardwareFeatures_Camera_Interface) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 7, 0}
}

type HardwareFeatures_Camera_Facing int32

const (
	HardwareFeatures_Camera_FACING_UNKNOWN HardwareFeatures_Camera_Facing = 0
	HardwareFeatures_Camera_FACING_FRONT   HardwareFeatures_Camera_Facing = 1
	HardwareFeatures_Camera_FACING_BACK    HardwareFeatures_Camera_Facing = 2
)

var HardwareFeatures_Camera_Facing_name = map[int32]string{
	0: "FACING_UNKNOWN",
	1: "FACING_FRONT",
	2: "FACING_BACK",
}

var HardwareFeatures_Camera_Facing_value = map[string]int32{
	"FACING_UNKNOWN": 0,
	"FACING_FRONT":   1,
	"FACING_BACK":    2,
}

func (x HardwareFeatures_Camera_Facing) String() string {
	return proto.EnumName(HardwareFeatures_Camera_Facing_name, int32(x))
}

func (HardwareFeatures_Camera_Facing) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 7, 1}
}

type HardwareFeatures_Camera_Orientation int32

const (
	HardwareFeatures_Camera_ORIENTATION_UNKNOWN HardwareFeatures_Camera_Orientation = 0
	HardwareFeatures_Camera_ORIENTATION_0       HardwareFeatures_Camera_Orientation = 1
	HardwareFeatures_Camera_ORIENTATION_90      HardwareFeatures_Camera_Orientation = 2
	HardwareFeatures_Camera_ORIENTATION_180     HardwareFeatures_Camera_Orientation = 3
	HardwareFeatures_Camera_ORIENTATION_270     HardwareFeatures_Camera_Orientation = 4
)

var HardwareFeatures_Camera_Orientation_name = map[int32]string{
	0: "ORIENTATION_UNKNOWN",
	1: "ORIENTATION_0",
	2: "ORIENTATION_90",
	3: "ORIENTATION_180",
	4: "ORIENTATION_270",
}

var HardwareFeatures_Camera_Orientation_value = map[string]int32{
	"ORIENTATION_UNKNOWN": 0,
	"ORIENTATION_0":       1,
	"ORIENTATION_90":      2,
	"ORIENTATION_180":     3,
	"ORIENTATION_270":     4,
}

func (x HardwareFeatures_Camera_Orientation) String() string {
	return proto.EnumName(HardwareFeatures_Camera_Orientation_name, int32(x))
}

func (HardwareFeatures_Camera_Orientation) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 7, 2}
}

type HardwareFeatures_Camera_Flags int32

const (
	HardwareFeatures_Camera_FLAGS_NONE              HardwareFeatures_Camera_Flags = 0
	HardwareFeatures_Camera_FLAGS_SUPPORT_1080P     HardwareFeatures_Camera_Flags = 1
	HardwareFeatures_Camera_FLAGS_SUPPORT_AUTOFOCUS HardwareFeatures_Camera_Flags = 2
)

var HardwareFeatures_Camera_Flags_name = map[int32]string{
	0: "FLAGS_NONE",
	1: "FLAGS_SUPPORT_1080P",
	2: "FLAGS_SUPPORT_AUTOFOCUS",
}

var HardwareFeatures_Camera_Flags_value = map[string]int32{
	"FLAGS_NONE":              0,
	"FLAGS_SUPPORT_1080P":     1,
	"FLAGS_SUPPORT_AUTOFOCUS": 2,
}

func (x HardwareFeatures_Camera_Flags) String() string {
	return proto.EnumName(HardwareFeatures_Camera_Flags_name, int32(x))
}

func (HardwareFeatures_Camera_Flags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 7, 3}
}

type HardwareFeatures_FormFactor_FormFactorType int32

const (
	HardwareFeatures_FormFactor_FORM_FACTOR_UNKNOWN HardwareFeatures_FormFactor_FormFactorType = 0
	HardwareFeatures_FormFactor_CLAMSHELL           HardwareFeatures_FormFactor_FormFactorType = 1
	HardwareFeatures_FormFactor_CONVERTIBLE         HardwareFeatures_FormFactor_FormFactorType = 2
	HardwareFeatures_FormFactor_DETACHABLE          HardwareFeatures_FormFactor_FormFactorType = 3
	HardwareFeatures_FormFactor_CHROMEBASE          HardwareFeatures_FormFactor_FormFactorType = 4
	HardwareFeatures_FormFactor_CHROMEBOX           HardwareFeatures_FormFactor_FormFactorType = 5
	HardwareFeatures_FormFactor_CHROMEBIT           HardwareFeatures_FormFactor_FormFactorType = 6
	HardwareFeatures_FormFactor_CHROMESLATE         HardwareFeatures_FormFactor_FormFactorType = 7
)

var HardwareFeatures_FormFactor_FormFactorType_name = map[int32]string{
	0: "FORM_FACTOR_UNKNOWN",
	1: "CLAMSHELL",
	2: "CONVERTIBLE",
	3: "DETACHABLE",
	4: "CHROMEBASE",
	5: "CHROMEBOX",
	6: "CHROMEBIT",
	7: "CHROMESLATE",
}

var HardwareFeatures_FormFactor_FormFactorType_value = map[string]int32{
	"FORM_FACTOR_UNKNOWN": 0,
	"CLAMSHELL":           1,
	"CONVERTIBLE":         2,
	"DETACHABLE":          3,
	"CHROMEBASE":          4,
	"CHROMEBOX":           5,
	"CHROMEBIT":           6,
	"CHROMESLATE":         7,
}

func (x HardwareFeatures_FormFactor_FormFactorType) String() string {
	return proto.EnumName(HardwareFeatures_FormFactor_FormFactorType_name, int32(x))
}

func (HardwareFeatures_FormFactor_FormFactorType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 13, 0}
}

type HardwareFeatures_Stylus_StylusType int32

const (
	HardwareFeatures_Stylus_STYLUS_UNKNOWN HardwareFeatures_Stylus_StylusType = 0
	HardwareFeatures_Stylus_NONE           HardwareFeatures_Stylus_StylusType = 1
	HardwareFeatures_Stylus_INTERNAL       HardwareFeatures_Stylus_StylusType = 2
	HardwareFeatures_Stylus_EXTERNAL       HardwareFeatures_Stylus_StylusType = 3
)

var HardwareFeatures_Stylus_StylusType_name = map[int32]string{
	0: "STYLUS_UNKNOWN",
	1: "NONE",
	2: "INTERNAL",
	3: "EXTERNAL",
}

var HardwareFeatures_Stylus_StylusType_value = map[string]int32{
	"STYLUS_UNKNOWN": 0,
	"NONE":           1,
	"INTERNAL":       2,
	"EXTERNAL":       3,
}

func (x HardwareFeatures_Stylus_StylusType) String() string {
	return proto.EnumName(HardwareFeatures_Stylus_StylusType_name, int32(x))
}

func (HardwareFeatures_Stylus_StylusType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 14, 0}
}

type HardwareFeatures_Keyboard_KeyboardType int32

const (
	HardwareFeatures_Keyboard_KEYBOARD_TYPE_UNKNOWN HardwareFeatures_Keyboard_KeyboardType = 0
	HardwareFeatures_Keyboard_INTERNAL              HardwareFeatures_Keyboard_KeyboardType = 1
	HardwareFeatures_Keyboard_NONE                  HardwareFeatures_Keyboard_KeyboardType = 2
	HardwareFeatures_Keyboard_DETACHABLE            HardwareFeatures_Keyboard_KeyboardType = 3
)

var HardwareFeatures_Keyboard_KeyboardType_name = map[int32]string{
	0: "KEYBOARD_TYPE_UNKNOWN",
	1: "INTERNAL",
	2: "NONE",
	3: "DETACHABLE",
}

var HardwareFeatures_Keyboard_KeyboardType_value = map[string]int32{
	"KEYBOARD_TYPE_UNKNOWN": 0,
	"INTERNAL":              1,
	"NONE":                  2,
	"DETACHABLE":            3,
}

func (x HardwareFeatures_Keyboard_KeyboardType) String() string {
	return proto.EnumName(HardwareFeatures_Keyboard_KeyboardType_name, int32(x))
}

func (HardwareFeatures_Keyboard_KeyboardType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 15, 0}
}

type HardwareFeatures_Fingerprint_Location int32

const (
	HardwareFeatures_Fingerprint_LOCATION_UNKNOWN HardwareFeatures_Fingerprint_Location = 0
	// Top of the screen (e.g. Pixel Slate) at the left
	HardwareFeatures_Fingerprint_POWER_BUTTON_TOP_LEFT HardwareFeatures_Fingerprint_Location = 1
	// Bottom of keyboard at the left
	HardwareFeatures_Fingerprint_KEYBOARD_BOTTOM_LEFT HardwareFeatures_Fingerprint_Location = 2
	// Bottom of keyboard at the right
	HardwareFeatures_Fingerprint_KEYBOARD_BOTTOM_RIGHT HardwareFeatures_Fingerprint_Location = 3
	// Top of keyboard at the right (e.g. Galaxy Chromebook)
	HardwareFeatures_Fingerprint_KEYBOARD_TOP_RIGHT HardwareFeatures_Fingerprint_Location = 4
	HardwareFeatures_Fingerprint_NOT_PRESENT        HardwareFeatures_Fingerprint_Location = 5
	// Sharing power button at the right side
	HardwareFeatures_Fingerprint_POWER_BUTTON_SIDE_RIGHT HardwareFeatures_Fingerprint_Location = 6
)

var HardwareFeatures_Fingerprint_Location_name = map[int32]string{
	0: "LOCATION_UNKNOWN",
	1: "POWER_BUTTON_TOP_LEFT",
	2: "KEYBOARD_BOTTOM_LEFT",
	3: "KEYBOARD_BOTTOM_RIGHT",
	4: "KEYBOARD_TOP_RIGHT",
	5: "NOT_PRESENT",
	6: "POWER_BUTTON_SIDE_RIGHT",
}

var HardwareFeatures_Fingerprint_Location_value = map[string]int32{
	"LOCATION_UNKNOWN":        0,
	"POWER_BUTTON_TOP_LEFT":   1,
	"KEYBOARD_BOTTOM_LEFT":    2,
	"KEYBOARD_BOTTOM_RIGHT":   3,
	"KEYBOARD_TOP_RIGHT":      4,
	"NOT_PRESENT":             5,
	"POWER_BUTTON_SIDE_RIGHT": 6,
}

func (x HardwareFeatures_Fingerprint_Location) String() string {
	return proto.EnumName(HardwareFeatures_Fingerprint_Location_name, int32(x))
}

func (HardwareFeatures_Fingerprint_Location) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 17, 0}
}

type HardwareFeatures_Wifi_WifiChip int32

const (
	HardwareFeatures_Wifi_WIFI_CHIP_UNKNOWN HardwareFeatures_Wifi_WifiChip = 0
	HardwareFeatures_Wifi_WIRELESS_86ED801D HardwareFeatures_Wifi_WifiChip = 1
	HardwareFeatures_Wifi_WIRELESS_REALTEK  HardwareFeatures_Wifi_WifiChip = 2
)

var HardwareFeatures_Wifi_WifiChip_name = map[int32]string{
	0: "WIFI_CHIP_UNKNOWN",
	1: "WIRELESS_86ED801D",
	2: "WIRELESS_REALTEK",
}

var HardwareFeatures_Wifi_WifiChip_value = map[string]int32{
	"WIFI_CHIP_UNKNOWN": 0,
	"WIRELESS_86ED801D": 1,
	"WIRELESS_REALTEK":  2,
}

func (x HardwareFeatures_Wifi_WifiChip) String() string {
	return proto.EnumName(HardwareFeatures_Wifi_WifiChip_name, int32(x))
}

func (HardwareFeatures_Wifi_WifiChip) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 21, 0}
}

// A general part of the device that contains the button,
// e.g. "on the screen", "on the keyboard".
type HardwareFeatures_Button_Region int32

const (
	HardwareFeatures_Button_REGION_UNKNOWN HardwareFeatures_Button_Region = 0
	HardwareFeatures_Button_SCREEN         HardwareFeatures_Button_Region = 1
	HardwareFeatures_Button_KEYBOARD       HardwareFeatures_Button_Region = 2
)

var HardwareFeatures_Button_Region_name = map[int32]string{
	0: "REGION_UNKNOWN",
	1: "SCREEN",
	2: "KEYBOARD",
}

var HardwareFeatures_Button_Region_value = map[string]int32{
	"REGION_UNKNOWN": 0,
	"SCREEN":         1,
	"KEYBOARD":       2,
}

func (x HardwareFeatures_Button_Region) String() string {
	return proto.EnumName(HardwareFeatures_Button_Region_name, int32(x))
}

func (HardwareFeatures_Button_Region) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 22, 0}
}

// The edge of the Region that contains the button.
type HardwareFeatures_Button_Edge int32

const (
	HardwareFeatures_Button_EDGE_UNKNOWN HardwareFeatures_Button_Edge = 0
	HardwareFeatures_Button_LEFT         HardwareFeatures_Button_Edge = 1
	HardwareFeatures_Button_RIGHT        HardwareFeatures_Button_Edge = 2
	HardwareFeatures_Button_TOP          HardwareFeatures_Button_Edge = 3
	HardwareFeatures_Button_BOTTOM       HardwareFeatures_Button_Edge = 4
)

var HardwareFeatures_Button_Edge_name = map[int32]string{
	0: "EDGE_UNKNOWN",
	1: "LEFT",
	2: "RIGHT",
	3: "TOP",
	4: "BOTTOM",
}

var HardwareFeatures_Button_Edge_value = map[string]int32{
	"EDGE_UNKNOWN": 0,
	"LEFT":         1,
	"RIGHT":        2,
	"TOP":          3,
	"BOTTOM":       4,
}

func (x HardwareFeatures_Button_Edge) String() string {
	return proto.EnumName(HardwareFeatures_Button_Edge_name, int32(x))
}

func (HardwareFeatures_Button_Edge) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 22, 1}
}

// The type of EC on the device.
// Next Tag: 3
type HardwareFeatures_EmbeddedController_EmbeddedControllerType int32

const (
	HardwareFeatures_EmbeddedController_EC_TYPE_UNKNOWN HardwareFeatures_EmbeddedController_EmbeddedControllerType = 0
	HardwareFeatures_EmbeddedController_EC_CHROME       HardwareFeatures_EmbeddedController_EmbeddedControllerType = 1
	HardwareFeatures_EmbeddedController_EC_WILCO        HardwareFeatures_EmbeddedController_EmbeddedControllerType = 2
)

var HardwareFeatures_EmbeddedController_EmbeddedControllerType_name = map[int32]string{
	0: "EC_TYPE_UNKNOWN",
	1: "EC_CHROME",
	2: "EC_WILCO",
}

var HardwareFeatures_EmbeddedController_EmbeddedControllerType_value = map[string]int32{
	"EC_TYPE_UNKNOWN": 0,
	"EC_CHROME":       1,
	"EC_WILCO":        2,
}

func (x HardwareFeatures_EmbeddedController_EmbeddedControllerType) String() string {
	return proto.EnumName(HardwareFeatures_EmbeddedController_EmbeddedControllerType_name, int32(x))
}

func (HardwareFeatures_EmbeddedController_EmbeddedControllerType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 23, 0}
}

// Represents a specific hardware topology option for a hardware feature, e.g.
// camera, microphone, gyroscope, daughter board connection. For example. one
// camera topology would be represented by a unique instance of this Topology
// message.
//
// All Topology instances are scoped to a particular Design.
type Topology struct {
	// Short, but meaningful string that represents the topology. Blank id is
	// not valid. Id values are validated by Design repo. Ids are
	// meaningful within a Design. Ids are scoped and unique within a
	// particular hardware features for a Design. For example, it is valid to have
	// a "NONE" id for both the camera and microphone hardware feature within the
	// same Design.
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// The type of hardware feature this topology describes. This is used to
	// ensure that the correct Topology values are used correctly within the
	// HardwareTopology message
	Type Topology_Type `protobuf:"varint,2,opt,name=type,proto3,enum=chromiumos.config.api.Topology_Type" json:"type,omitempty"`
	// Map of human readable descriptions in various languages. Maps language
	// code, e.g. "EN" or "ZH", to description of topology. These descriptions can
	// be displayed to factory operators to select the correct options that
	// applies to the board they are assembling.
	Description map[string]string `protobuf:"bytes,3,rep,name=description,proto3" json:"description,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Specify the subset of hardware features that this hardware topology
	// provides
	HardwareFeature      *HardwareFeatures `protobuf:"bytes,4,opt,name=hardware_feature,json=hardwareFeature,proto3" json:"hardware_feature,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Topology proto.InternalMessageInfo

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

func (m *Topology) GetType() Topology_Type {
	if m != nil {
		return m.Type
	}
	return Topology_TYPE_UNKNOWN
}

func (m *Topology) GetDescription() map[string]string {
	if m != nil {
		return m.Description
	}
	return nil
}

func (m *Topology) GetHardwareFeature() *HardwareFeatures {
	if m != nil {
		return m.HardwareFeature
	}
	return nil
}

// Each Topology message specifies what that topology means in a 1st class
// queryable way. Each Topology will only the subset of hardware features that
// are applicable to that value.
// The DesignConfig layer will combine all of the Topology messages
// HardwareFeature messages into a wholistic view of the hardware design
// configuration.
//
// Note to API designers: each field needs to be able to differentiate
// an unspecified value and from the 0-value; this can be down with
// messages or enums. Each field also defines how multiple values should be
// combined.
// NEXT TAG: 25
type HardwareFeatures struct {
	// USB-C properties
	UsbC *HardwareFeatures_UsbC `protobuf:"bytes,1,opt,name=usb_c,json=usbC,proto3" json:"usb_c,omitempty"`
	// USB-A properties
	UsbA *HardwareFeatures_UsbA `protobuf:"bytes,2,opt,name=usb_a,json=usbA,proto3" json:"usb_a,omitempty"`
	// LTE properties
	Lte *HardwareFeatures_Lte `protobuf:"bytes,3,opt,name=lte,proto3" json:"lte,omitempty"`
	// HDMI properties
	Hdmi *HardwareFeatures_Hdmi `protobuf:"bytes,4,opt,name=hdmi,proto3" json:"hdmi,omitempty"`
	// Firmware configuration field programmed in CBI. The value from each
	// topology value will be summed to create the final DesignConfig level
	// firmware configuration value.
	FwConfig *HardwareFeatures_FirmwareConfiguration `protobuf:"bytes,5,opt,name=fw_config,json=fwConfig,proto3" json:"fw_config,omitempty"`
	// Audio properties of system
	Audio *HardwareFeatures_Audio `protobuf:"bytes,6,opt,name=audio,proto3" json:"audio,omitempty"`
	// Camera properties of system.
	Camera *HardwareFeatures_Camera `protobuf:"bytes,7,opt,name=camera,proto3" json:"camera,omitempty"`
	// Accelerometer properties of system.
	Accelerometer *HardwareFeatures_Accelerometer `protobuf:"bytes,8,opt,name=accelerometer,proto3" json:"accelerometer,omitempty"`
	// Gyroscope properties of system.
	Gyroscope *HardwareFeatures_Gyroscope `protobuf:"bytes,9,opt,name=gyroscope,proto3" json:"gyroscope,omitempty"`
	// Magnetometer properties of system.
	Magnetometer *HardwareFeatures_Magnetometer `protobuf:"bytes,10,opt,name=magnetometer,proto3" json:"magnetometer,omitempty"`
	// LightSensor properties of system.
	LightSensor *HardwareFeatures_LightSensor `protobuf:"bytes,11,opt,name=light_sensor,json=lightSensor,proto3" json:"light_sensor,omitempty"`
	// Screen properties of system
	Screen *HardwareFeatures_Screen `protobuf:"bytes,12,opt,name=screen,proto3" json:"screen,omitempty"`
	// Function form factor of system
	FormFactor *HardwareFeatures_FormFactor `protobuf:"bytes,13,opt,name=form_factor,json=formFactor,proto3" json:"form_factor,omitempty"`
	// Stylus properites of system.
	Stylus *HardwareFeatures_Stylus `protobuf:"bytes,14,opt,name=stylus,proto3" json:"stylus,omitempty"`
	// Keyboard properties of system
	Keyboard *HardwareFeatures_Keyboard `protobuf:"bytes,15,opt,name=keyboard,proto3" json:"keyboard,omitempty"`
	// Memory properties of system
	Memory *HardwareFeatures_Memory `protobuf:"bytes,16,opt,name=memory,proto3" json:"memory,omitempty"`
	// Fingerprint properties of system
	Fingerprint *HardwareFeatures_Fingerprint `protobuf:"bytes,17,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"`
	// Non-volatile storage properties of system
	Storage *HardwareFeatures_Storage `protobuf:"bytes,18,opt,name=storage,proto3" json:"storage,omitempty"`
	// Bluetooth properties
	Bluetooth *HardwareFeatures_Bluetooth `protobuf:"bytes,19,opt,name=bluetooth,proto3" json:"bluetooth,omitempty"`
	// BarrelJack properties
	Barreljack           *HardwareFeatures_BarrelJack         `protobuf:"bytes,20,opt,name=barreljack,proto3" json:"barreljack,omitempty"`
	Wifi                 *HardwareFeatures_Wifi               `protobuf:"bytes,23,opt,name=wifi,proto3" json:"wifi,omitempty"`
	PowerButton          *HardwareFeatures_Button             `protobuf:"bytes,21,opt,name=power_button,json=powerButton,proto3" json:"power_button,omitempty"`
	VolumeButton         *HardwareFeatures_Button             `protobuf:"bytes,22,opt,name=volume_button,json=volumeButton,proto3" json:"volume_button,omitempty"`
	EmbeddedController   *HardwareFeatures_EmbeddedController `protobuf:"bytes,24,opt,name=embedded_controller,json=embeddedController,proto3" json:"embedded_controller,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

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

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

var xxx_messageInfo_HardwareFeatures proto.InternalMessageInfo

func (m *HardwareFeatures) GetUsbC() *HardwareFeatures_UsbC {
	if m != nil {
		return m.UsbC
	}
	return nil
}

func (m *HardwareFeatures) GetUsbA() *HardwareFeatures_UsbA {
	if m != nil {
		return m.UsbA
	}
	return nil
}

func (m *HardwareFeatures) GetLte() *HardwareFeatures_Lte {
	if m != nil {
		return m.Lte
	}
	return nil
}

func (m *HardwareFeatures) GetHdmi() *HardwareFeatures_Hdmi {
	if m != nil {
		return m.Hdmi
	}
	return nil
}

func (m *HardwareFeatures) GetFwConfig() *HardwareFeatures_FirmwareConfiguration {
	if m != nil {
		return m.FwConfig
	}
	return nil
}

func (m *HardwareFeatures) GetAudio() *HardwareFeatures_Audio {
	if m != nil {
		return m.Audio
	}
	return nil
}

func (m *HardwareFeatures) GetCamera() *HardwareFeatures_Camera {
	if m != nil {
		return m.Camera
	}
	return nil
}

func (m *HardwareFeatures) GetAccelerometer() *HardwareFeatures_Accelerometer {
	if m != nil {
		return m.Accelerometer
	}
	return nil
}

func (m *HardwareFeatures) GetGyroscope() *HardwareFeatures_Gyroscope {
	if m != nil {
		return m.Gyroscope
	}
	return nil
}

func (m *HardwareFeatures) GetMagnetometer() *HardwareFeatures_Magnetometer {
	if m != nil {
		return m.Magnetometer
	}
	return nil
}

func (m *HardwareFeatures) GetLightSensor() *HardwareFeatures_LightSensor {
	if m != nil {
		return m.LightSensor
	}
	return nil
}

func (m *HardwareFeatures) GetScreen() *HardwareFeatures_Screen {
	if m != nil {
		return m.Screen
	}
	return nil
}

func (m *HardwareFeatures) GetFormFactor() *HardwareFeatures_FormFactor {
	if m != nil {
		return m.FormFactor
	}
	return nil
}

func (m *HardwareFeatures) GetStylus() *HardwareFeatures_Stylus {
	if m != nil {
		return m.Stylus
	}
	return nil
}

func (m *HardwareFeatures) GetKeyboard() *HardwareFeatures_Keyboard {
	if m != nil {
		return m.Keyboard
	}
	return nil
}

func (m *HardwareFeatures) GetMemory() *HardwareFeatures_Memory {
	if m != nil {
		return m.Memory
	}
	return nil
}

func (m *HardwareFeatures) GetFingerprint() *HardwareFeatures_Fingerprint {
	if m != nil {
		return m.Fingerprint
	}
	return nil
}

func (m *HardwareFeatures) GetStorage() *HardwareFeatures_Storage {
	if m != nil {
		return m.Storage
	}
	return nil
}

func (m *HardwareFeatures) GetBluetooth() *HardwareFeatures_Bluetooth {
	if m != nil {
		return m.Bluetooth
	}
	return nil
}

func (m *HardwareFeatures) GetBarreljack() *HardwareFeatures_BarrelJack {
	if m != nil {
		return m.Barreljack
	}
	return nil
}

func (m *HardwareFeatures) GetWifi() *HardwareFeatures_Wifi {
	if m != nil {
		return m.Wifi
	}
	return nil
}

func (m *HardwareFeatures) GetPowerButton() *HardwareFeatures_Button {
	if m != nil {
		return m.PowerButton
	}
	return nil
}

func (m *HardwareFeatures) GetVolumeButton() *HardwareFeatures_Button {
	if m != nil {
		return m.VolumeButton
	}
	return nil
}

func (m *HardwareFeatures) GetEmbeddedController() *HardwareFeatures_EmbeddedController {
	if m != nil {
		return m.EmbeddedController
	}
	return nil
}

type HardwareFeatures_Count struct {
	Value                uint32   `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HardwareFeatures_Count proto.InternalMessageInfo

func (m *HardwareFeatures_Count) GetValue() uint32 {
	if m != nil {
		return m.Value
	}
	return 0
}

type HardwareFeatures_UsbC struct {
	// The number of USB-C ports
	Count                *HardwareFeatures_Count `protobuf:"bytes,1,opt,name=count,proto3" json:"count,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_HardwareFeatures_UsbC proto.InternalMessageInfo

func (m *HardwareFeatures_UsbC) GetCount() *HardwareFeatures_Count {
	if m != nil {
		return m.Count
	}
	return nil
}

type HardwareFeatures_UsbA struct {
	// The number of USB-A ports
	Count                *HardwareFeatures_Count `protobuf:"bytes,1,opt,name=count,proto3" json:"count,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *HardwareFeatures_UsbA) Reset()         { *m = HardwareFeatures_UsbA{} }
func (m *HardwareFeatures_UsbA) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_UsbA) ProtoMessage()    {}
func (*HardwareFeatures_UsbA) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 2}
}

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

var xxx_messageInfo_HardwareFeatures_UsbA proto.InternalMessageInfo

func (m *HardwareFeatures_UsbA) GetCount() *HardwareFeatures_Count {
	if m != nil {
		return m.Count
	}
	return nil
}

type HardwareFeatures_Lte struct {
	// If LTE is present on system
	Present              HardwareFeatures_Present `protobuf:"varint,1,opt,name=present,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"present,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *HardwareFeatures_Lte) Reset()         { *m = HardwareFeatures_Lte{} }
func (m *HardwareFeatures_Lte) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Lte) ProtoMessage()    {}
func (*HardwareFeatures_Lte) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 3}
}

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

var xxx_messageInfo_HardwareFeatures_Lte proto.InternalMessageInfo

func (m *HardwareFeatures_Lte) GetPresent() HardwareFeatures_Present {
	if m != nil {
		return m.Present
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

type HardwareFeatures_Hdmi struct {
	// If native HDMI support is present on system.
	Present              HardwareFeatures_Present `protobuf:"varint,1,opt,name=present,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"present,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *HardwareFeatures_Hdmi) Reset()         { *m = HardwareFeatures_Hdmi{} }
func (m *HardwareFeatures_Hdmi) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Hdmi) ProtoMessage()    {}
func (*HardwareFeatures_Hdmi) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 4}
}

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

var xxx_messageInfo_HardwareFeatures_Hdmi proto.InternalMessageInfo

func (m *HardwareFeatures_Hdmi) GetPresent() HardwareFeatures_Present {
	if m != nil {
		return m.Present
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

type HardwareFeatures_FirmwareConfiguration struct {
	// The firmware configuration value
	Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
	// The mask of valid bits that could be used by above value
	Mask                 uint32   `protobuf:"varint,2,opt,name=mask,proto3" json:"mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *HardwareFeatures_FirmwareConfiguration) Reset() {
	*m = HardwareFeatures_FirmwareConfiguration{}
}
func (m *HardwareFeatures_FirmwareConfiguration) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_FirmwareConfiguration) ProtoMessage()    {}
func (*HardwareFeatures_FirmwareConfiguration) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 5}
}

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

var xxx_messageInfo_HardwareFeatures_FirmwareConfiguration proto.InternalMessageInfo

func (m *HardwareFeatures_FirmwareConfiguration) GetValue() uint32 {
	if m != nil {
		return m.Value
	}
	return 0
}

func (m *HardwareFeatures_FirmwareConfiguration) GetMask() uint32 {
	if m != nil {
		return m.Mask
	}
	return 0
}

type HardwareFeatures_Audio struct {
	// Which audio codec is in use (deprecated)
	AudioCodec HardwareFeatures_Audio_AudioCodec `protobuf:"varint,1,opt,name=audio_codec,json=audioCodec,proto3,enum=chromiumos.config.api.HardwareFeatures_Audio_AudioCodec" json:"audio_codec,omitempty"`
	// Which audio codec is in use for the speakers
	SpeakerAmp HardwareFeatures_Audio_AudioCodec `protobuf:"varint,2,opt,name=speaker_amp,json=speakerAmp,proto3,enum=chromiumos.config.api.HardwareFeatures_Audio_AudioCodec" json:"speaker_amp,omitempty"`
	// Which audio codec is in use for the headphones
	HeadphoneCodec       HardwareFeatures_Audio_AudioCodec `protobuf:"varint,3,opt,name=headphone_codec,json=headphoneCodec,proto3,enum=chromiumos.config.api.HardwareFeatures_Audio_AudioCodec" json:"headphone_codec,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

func (m *HardwareFeatures_Audio) Reset()         { *m = HardwareFeatures_Audio{} }
func (m *HardwareFeatures_Audio) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Audio) ProtoMessage()    {}
func (*HardwareFeatures_Audio) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 6}
}

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

var xxx_messageInfo_HardwareFeatures_Audio proto.InternalMessageInfo

func (m *HardwareFeatures_Audio) GetAudioCodec() HardwareFeatures_Audio_AudioCodec {
	if m != nil {
		return m.AudioCodec
	}
	return HardwareFeatures_Audio_AUDIO_CODEC_UNKNOWN
}

func (m *HardwareFeatures_Audio) GetSpeakerAmp() HardwareFeatures_Audio_AudioCodec {
	if m != nil {
		return m.SpeakerAmp
	}
	return HardwareFeatures_Audio_AUDIO_CODEC_UNKNOWN
}

func (m *HardwareFeatures_Audio) GetHeadphoneCodec() HardwareFeatures_Audio_AudioCodec {
	if m != nil {
		return m.HeadphoneCodec
	}
	return HardwareFeatures_Audio_AUDIO_CODEC_UNKNOWN
}

type HardwareFeatures_Camera struct {
	// If user facing camera (front camera) is present
	UserFacingCamera HardwareFeatures_Present `protobuf:"varint,1,opt,name=user_facing_camera,json=userFacingCamera,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"user_facing_camera,omitempty"` // Deprecated: Do not use.
	// If world facing camera (rear camera) is present
	WorldFacingCamera HardwareFeatures_Present `protobuf:"varint,2,opt,name=world_facing_camera,json=worldFacingCamera,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"world_facing_camera,omitempty"` // Deprecated: Do not use.
	// Number of camera present on system
	Count *HardwareFeatures_Count `protobuf:"bytes,3,opt,name=count,proto3" json:"count,omitempty"` // Deprecated: Do not use.
	// List of camera devices on the model.
	Devices              []*HardwareFeatures_Camera_Device `protobuf:"bytes,4,rep,name=devices,proto3" json:"devices,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

func (m *HardwareFeatures_Camera) Reset()         { *m = HardwareFeatures_Camera{} }
func (m *HardwareFeatures_Camera) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Camera) ProtoMessage()    {}
func (*HardwareFeatures_Camera) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 7}
}

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

var xxx_messageInfo_HardwareFeatures_Camera proto.InternalMessageInfo

// Deprecated: Do not use.
func (m *HardwareFeatures_Camera) GetUserFacingCamera() HardwareFeatures_Present {
	if m != nil {
		return m.UserFacingCamera
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

// Deprecated: Do not use.
func (m *HardwareFeatures_Camera) GetWorldFacingCamera() HardwareFeatures_Present {
	if m != nil {
		return m.WorldFacingCamera
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

// Deprecated: Do not use.
func (m *HardwareFeatures_Camera) GetCount() *HardwareFeatures_Count {
	if m != nil {
		return m.Count
	}
	return nil
}

func (m *HardwareFeatures_Camera) GetDevices() []*HardwareFeatures_Camera_Device {
	if m != nil {
		return m.Devices
	}
	return nil
}

type HardwareFeatures_Camera_Device struct {
	// The interface type of the camera device.
	Interface HardwareFeatures_Camera_Interface `protobuf:"varint,2,opt,name=interface,proto3,enum=chromiumos.config.api.HardwareFeatures_Camera_Interface" json:"interface,omitempty"`
	// Direction the camera faces relative to device screen.
	Facing HardwareFeatures_Camera_Facing `protobuf:"varint,3,opt,name=facing,proto3,enum=chromiumos.config.api.HardwareFeatures_Camera_Facing" json:"facing,omitempty"`
	// Clockwise angle through which the output image needs to be rotated to
	// be upright on the device screen in its native orientation.
	Orientation HardwareFeatures_Camera_Orientation `protobuf:"varint,4,opt,name=orientation,proto3,enum=chromiumos.config.api.HardwareFeatures_Camera_Orientation" json:"orientation,omitempty"`
	// Bit flags representing camera capabilities of this device. A camera
	// module can be mounted on this slot only if all the flags match.
	Flags uint32 `protobuf:"varint,5,opt,name=flags,proto3" json:"flags,omitempty"`
	// List of strings each identifies a possible camera module on this slot.
	Ids                  []string `protobuf:"bytes,6,rep,name=ids,proto3" json:"ids,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HardwareFeatures_Camera_Device proto.InternalMessageInfo

func (m *HardwareFeatures_Camera_Device) GetInterface() HardwareFeatures_Camera_Interface {
	if m != nil {
		return m.Interface
	}
	return HardwareFeatures_Camera_INTERFACE_UNKNOWN
}

func (m *HardwareFeatures_Camera_Device) GetFacing() HardwareFeatures_Camera_Facing {
	if m != nil {
		return m.Facing
	}
	return HardwareFeatures_Camera_FACING_UNKNOWN
}

func (m *HardwareFeatures_Camera_Device) GetOrientation() HardwareFeatures_Camera_Orientation {
	if m != nil {
		return m.Orientation
	}
	return HardwareFeatures_Camera_ORIENTATION_UNKNOWN
}

func (m *HardwareFeatures_Camera_Device) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *HardwareFeatures_Camera_Device) GetIds() []string {
	if m != nil {
		return m.Ids
	}
	return nil
}

type HardwareFeatures_Accelerometer struct {
	// If lid accelerometer is present on system
	LidAccelerometer HardwareFeatures_Present `protobuf:"varint,1,opt,name=lid_accelerometer,json=lidAccelerometer,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"lid_accelerometer,omitempty"`
	// If base accelerometer is present on system
	BaseAccelerometer    HardwareFeatures_Present `protobuf:"varint,2,opt,name=base_accelerometer,json=baseAccelerometer,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"base_accelerometer,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *HardwareFeatures_Accelerometer) Reset()         { *m = HardwareFeatures_Accelerometer{} }
func (m *HardwareFeatures_Accelerometer) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Accelerometer) ProtoMessage()    {}
func (*HardwareFeatures_Accelerometer) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 8}
}

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

var xxx_messageInfo_HardwareFeatures_Accelerometer proto.InternalMessageInfo

func (m *HardwareFeatures_Accelerometer) GetLidAccelerometer() HardwareFeatures_Present {
	if m != nil {
		return m.LidAccelerometer
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

func (m *HardwareFeatures_Accelerometer) GetBaseAccelerometer() HardwareFeatures_Present {
	if m != nil {
		return m.BaseAccelerometer
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

type HardwareFeatures_Gyroscope struct {
	// If lid gyroscope is present on system
	LidGyroscope HardwareFeatures_Present `protobuf:"varint,1,opt,name=lid_gyroscope,json=lidGyroscope,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"lid_gyroscope,omitempty"`
	// If base gyroscope is present on system
	BaseGyroscope        HardwareFeatures_Present `protobuf:"varint,2,opt,name=base_gyroscope,json=baseGyroscope,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"base_gyroscope,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *HardwareFeatures_Gyroscope) Reset()         { *m = HardwareFeatures_Gyroscope{} }
func (m *HardwareFeatures_Gyroscope) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Gyroscope) ProtoMessage()    {}
func (*HardwareFeatures_Gyroscope) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 9}
}

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

var xxx_messageInfo_HardwareFeatures_Gyroscope proto.InternalMessageInfo

func (m *HardwareFeatures_Gyroscope) GetLidGyroscope() HardwareFeatures_Present {
	if m != nil {
		return m.LidGyroscope
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

func (m *HardwareFeatures_Gyroscope) GetBaseGyroscope() HardwareFeatures_Present {
	if m != nil {
		return m.BaseGyroscope
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

type HardwareFeatures_Magnetometer struct {
	// If lid magnometer is present on system
	LidMagnetometer HardwareFeatures_Present `protobuf:"varint,1,opt,name=lid_magnetometer,json=lidMagnetometer,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"lid_magnetometer,omitempty"`
	// If base magnometer is present on system
	BaseMagnetometer     HardwareFeatures_Present `protobuf:"varint,2,opt,name=base_magnetometer,json=baseMagnetometer,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"base_magnetometer,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *HardwareFeatures_Magnetometer) Reset()         { *m = HardwareFeatures_Magnetometer{} }
func (m *HardwareFeatures_Magnetometer) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Magnetometer) ProtoMessage()    {}
func (*HardwareFeatures_Magnetometer) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 10}
}

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

var xxx_messageInfo_HardwareFeatures_Magnetometer proto.InternalMessageInfo

func (m *HardwareFeatures_Magnetometer) GetLidMagnetometer() HardwareFeatures_Present {
	if m != nil {
		return m.LidMagnetometer
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

func (m *HardwareFeatures_Magnetometer) GetBaseMagnetometer() HardwareFeatures_Present {
	if m != nil {
		return m.BaseMagnetometer
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

type HardwareFeatures_LightSensor struct {
	// If lid light sensor is present on system
	LidLightsensor HardwareFeatures_Present `protobuf:"varint,1,opt,name=lid_lightsensor,json=lidLightsensor,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"lid_lightsensor,omitempty"`
	// If base light sensor is present on system
	BaseLightsensor      HardwareFeatures_Present `protobuf:"varint,2,opt,name=base_lightsensor,json=baseLightsensor,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"base_lightsensor,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *HardwareFeatures_LightSensor) Reset()         { *m = HardwareFeatures_LightSensor{} }
func (m *HardwareFeatures_LightSensor) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_LightSensor) ProtoMessage()    {}
func (*HardwareFeatures_LightSensor) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 11}
}

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

var xxx_messageInfo_HardwareFeatures_LightSensor proto.InternalMessageInfo

func (m *HardwareFeatures_LightSensor) GetLidLightsensor() HardwareFeatures_Present {
	if m != nil {
		return m.LidLightsensor
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

func (m *HardwareFeatures_LightSensor) GetBaseLightsensor() HardwareFeatures_Present {
	if m != nil {
		return m.BaseLightsensor
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

type HardwareFeatures_Screen struct {
	PanelProperties *Component_DisplayPanel_Properties `protobuf:"bytes,3,opt,name=panel_properties,json=panelProperties,proto3" json:"panel_properties,omitempty"`
	// If touch support is present on system
	TouchSupport         HardwareFeatures_Present `protobuf:"varint,2,opt,name=touch_support,json=touchSupport,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"touch_support,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *HardwareFeatures_Screen) Reset()         { *m = HardwareFeatures_Screen{} }
func (m *HardwareFeatures_Screen) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Screen) ProtoMessage()    {}
func (*HardwareFeatures_Screen) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 12}
}

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

var xxx_messageInfo_HardwareFeatures_Screen proto.InternalMessageInfo

func (m *HardwareFeatures_Screen) GetPanelProperties() *Component_DisplayPanel_Properties {
	if m != nil {
		return m.PanelProperties
	}
	return nil
}

func (m *HardwareFeatures_Screen) GetTouchSupport() HardwareFeatures_Present {
	if m != nil {
		return m.TouchSupport
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

type HardwareFeatures_FormFactor struct {
	// Form factory of system
	FormFactor           HardwareFeatures_FormFactor_FormFactorType `protobuf:"varint,1,opt,name=form_factor,json=formFactor,proto3,enum=chromiumos.config.api.HardwareFeatures_FormFactor_FormFactorType" json:"form_factor,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
	XXX_unrecognized     []byte                                     `json:"-"`
	XXX_sizecache        int32                                      `json:"-"`
}

func (m *HardwareFeatures_FormFactor) Reset()         { *m = HardwareFeatures_FormFactor{} }
func (m *HardwareFeatures_FormFactor) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_FormFactor) ProtoMessage()    {}
func (*HardwareFeatures_FormFactor) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 13}
}

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

var xxx_messageInfo_HardwareFeatures_FormFactor proto.InternalMessageInfo

func (m *HardwareFeatures_FormFactor) GetFormFactor() HardwareFeatures_FormFactor_FormFactorType {
	if m != nil {
		return m.FormFactor
	}
	return HardwareFeatures_FormFactor_FORM_FACTOR_UNKNOWN
}

type HardwareFeatures_Stylus struct {
	// Type of stylus
	Stylus               HardwareFeatures_Stylus_StylusType `protobuf:"varint,1,opt,name=stylus,proto3,enum=chromiumos.config.api.HardwareFeatures_Stylus_StylusType" json:"stylus,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

func (m *HardwareFeatures_Stylus) Reset()         { *m = HardwareFeatures_Stylus{} }
func (m *HardwareFeatures_Stylus) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Stylus) ProtoMessage()    {}
func (*HardwareFeatures_Stylus) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 14}
}

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

var xxx_messageInfo_HardwareFeatures_Stylus proto.InternalMessageInfo

func (m *HardwareFeatures_Stylus) GetStylus() HardwareFeatures_Stylus_StylusType {
	if m != nil {
		return m.Stylus
	}
	return HardwareFeatures_Stylus_STYLUS_UNKNOWN
}

type HardwareFeatures_Keyboard struct {
	// Type of keyboard present on system
	KeyboardType HardwareFeatures_Keyboard_KeyboardType `protobuf:"varint,1,opt,name=keyboard_type,json=keyboardType,proto3,enum=chromiumos.config.api.HardwareFeatures_Keyboard_KeyboardType" json:"keyboard_type,omitempty"`
	// If keyboard backlight is present on system
	Backlight HardwareFeatures_Present `protobuf:"varint,2,opt,name=backlight,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"backlight,omitempty"`
	// If power button is present on keyboard
	PowerButton          HardwareFeatures_Present `protobuf:"varint,3,opt,name=power_button,json=powerButton,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"power_button,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *HardwareFeatures_Keyboard) Reset()         { *m = HardwareFeatures_Keyboard{} }
func (m *HardwareFeatures_Keyboard) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Keyboard) ProtoMessage()    {}
func (*HardwareFeatures_Keyboard) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 15}
}

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

var xxx_messageInfo_HardwareFeatures_Keyboard proto.InternalMessageInfo

func (m *HardwareFeatures_Keyboard) GetKeyboardType() HardwareFeatures_Keyboard_KeyboardType {
	if m != nil {
		return m.KeyboardType
	}
	return HardwareFeatures_Keyboard_KEYBOARD_TYPE_UNKNOWN
}

func (m *HardwareFeatures_Keyboard) GetBacklight() HardwareFeatures_Present {
	if m != nil {
		return m.Backlight
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

func (m *HardwareFeatures_Keyboard) GetPowerButton() HardwareFeatures_Present {
	if m != nil {
		return m.PowerButton
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

type HardwareFeatures_Memory struct {
	Profile              *Component_Memory_Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *HardwareFeatures_Memory) Reset()         { *m = HardwareFeatures_Memory{} }
func (m *HardwareFeatures_Memory) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Memory) ProtoMessage()    {}
func (*HardwareFeatures_Memory) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 16}
}

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

var xxx_messageInfo_HardwareFeatures_Memory proto.InternalMessageInfo

func (m *HardwareFeatures_Memory) GetProfile() *Component_Memory_Profile {
	if m != nil {
		return m.Profile
	}
	return nil
}

type HardwareFeatures_Fingerprint struct {
	// Location of fingerprint sensor
	Location HardwareFeatures_Fingerprint_Location `protobuf:"varint,1,opt,name=location,proto3,enum=chromiumos.config.api.HardwareFeatures_Fingerprint_Location" json:"location,omitempty"`
	// Fingerprint board used.
	Board string `protobuf:"bytes,2,opt,name=board,proto3" json:"board,omitempty"`
	// Read-only (RO) firmware version to use (empty means use default).
	RoVersion            string   `protobuf:"bytes,3,opt,name=ro_version,json=roVersion,proto3" json:"ro_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *HardwareFeatures_Fingerprint) Reset()         { *m = HardwareFeatures_Fingerprint{} }
func (m *HardwareFeatures_Fingerprint) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Fingerprint) ProtoMessage()    {}
func (*HardwareFeatures_Fingerprint) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 17}
}

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

var xxx_messageInfo_HardwareFeatures_Fingerprint proto.InternalMessageInfo

func (m *HardwareFeatures_Fingerprint) GetLocation() HardwareFeatures_Fingerprint_Location {
	if m != nil {
		return m.Location
	}
	return HardwareFeatures_Fingerprint_LOCATION_UNKNOWN
}

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

func (m *HardwareFeatures_Fingerprint) GetRoVersion() string {
	if m != nil {
		return m.RoVersion
	}
	return ""
}

type HardwareFeatures_Storage struct {
	StorageType          Component_Storage_StorageType `protobuf:"varint,1,opt,name=storage_type,json=storageType,proto3,enum=chromiumos.config.api.Component_Storage_StorageType" json:"storage_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

func (m *HardwareFeatures_Storage) Reset()         { *m = HardwareFeatures_Storage{} }
func (m *HardwareFeatures_Storage) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Storage) ProtoMessage()    {}
func (*HardwareFeatures_Storage) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 18}
}

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

var xxx_messageInfo_HardwareFeatures_Storage proto.InternalMessageInfo

func (m *HardwareFeatures_Storage) GetStorageType() Component_Storage_StorageType {
	if m != nil {
		return m.StorageType
	}
	return Component_Storage_STORAGE_TYPE_UNKNOWN
}

type HardwareFeatures_Bluetooth struct {
	// Defines the specific bt component used in the design config
	Component            *Component_Bluetooth `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *HardwareFeatures_Bluetooth) Reset()         { *m = HardwareFeatures_Bluetooth{} }
func (m *HardwareFeatures_Bluetooth) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Bluetooth) ProtoMessage()    {}
func (*HardwareFeatures_Bluetooth) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 19}
}

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

var xxx_messageInfo_HardwareFeatures_Bluetooth proto.InternalMessageInfo

func (m *HardwareFeatures_Bluetooth) GetComponent() *Component_Bluetooth {
	if m != nil {
		return m.Component
	}
	return nil
}

type HardwareFeatures_BarrelJack struct {
	// If BarrelJack support is present on system.
	Present              HardwareFeatures_Present `protobuf:"varint,1,opt,name=present,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"present,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *HardwareFeatures_BarrelJack) Reset()         { *m = HardwareFeatures_BarrelJack{} }
func (m *HardwareFeatures_BarrelJack) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_BarrelJack) ProtoMessage()    {}
func (*HardwareFeatures_BarrelJack) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 20}
}

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

var xxx_messageInfo_HardwareFeatures_BarrelJack proto.InternalMessageInfo

func (m *HardwareFeatures_BarrelJack) GetPresent() HardwareFeatures_Present {
	if m != nil {
		return m.Present
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

// Wifi properties
// NEXT TAG: 3
type HardwareFeatures_Wifi struct {
	// WLAN protocols supported by the Wifi chipset(s).
	SupportedWlanProtocols []Component_Wifi_WLANProtocol    `protobuf:"varint,1,rep,packed,name=supported_wlan_protocols,json=supportedWlanProtocols,proto3,enum=chromiumos.config.api.Component_Wifi_WLANProtocol" json:"supported_wlan_protocols,omitempty"`
	WifiChips              []HardwareFeatures_Wifi_WifiChip `protobuf:"varint,2,rep,packed,name=wifi_chips,json=wifiChips,proto3,enum=chromiumos.config.api.HardwareFeatures_Wifi_WifiChip" json:"wifi_chips,omitempty"`
	XXX_NoUnkeyedLiteral   struct{}                         `json:"-"`
	XXX_unrecognized       []byte                           `json:"-"`
	XXX_sizecache          int32                            `json:"-"`
}

func (m *HardwareFeatures_Wifi) Reset()         { *m = HardwareFeatures_Wifi{} }
func (m *HardwareFeatures_Wifi) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Wifi) ProtoMessage()    {}
func (*HardwareFeatures_Wifi) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 21}
}

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

var xxx_messageInfo_HardwareFeatures_Wifi proto.InternalMessageInfo

func (m *HardwareFeatures_Wifi) GetSupportedWlanProtocols() []Component_Wifi_WLANProtocol {
	if m != nil {
		return m.SupportedWlanProtocols
	}
	return nil
}

func (m *HardwareFeatures_Wifi) GetWifiChips() []HardwareFeatures_Wifi_WifiChip {
	if m != nil {
		return m.WifiChips
	}
	return nil
}

type HardwareFeatures_Button struct {
	Region HardwareFeatures_Button_Region `protobuf:"varint,1,opt,name=region,proto3,enum=chromiumos.config.api.HardwareFeatures_Button_Region" json:"region,omitempty"`
	Edge   HardwareFeatures_Button_Edge   `protobuf:"varint,2,opt,name=edge,proto3,enum=chromiumos.config.api.HardwareFeatures_Button_Edge" json:"edge,omitempty"`
	// The percentage for button center position to the display's width/height
	// in primary landscape screen orientation. If Edge is LEFT or RIGHT,
	// specifies the button's center position as a fraction of the Region's
	// height relative to the top of the Region. For TOP and BOTTOM, specifies
	// the position as a fraction of the Region's width relative to the left
	// side of the Region.
	Position             float32  `protobuf:"fixed32,3,opt,name=position,proto3" json:"position,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *HardwareFeatures_Button) Reset()         { *m = HardwareFeatures_Button{} }
func (m *HardwareFeatures_Button) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_Button) ProtoMessage()    {}
func (*HardwareFeatures_Button) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 22}
}

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

var xxx_messageInfo_HardwareFeatures_Button proto.InternalMessageInfo

func (m *HardwareFeatures_Button) GetRegion() HardwareFeatures_Button_Region {
	if m != nil {
		return m.Region
	}
	return HardwareFeatures_Button_REGION_UNKNOWN
}

func (m *HardwareFeatures_Button) GetEdge() HardwareFeatures_Button_Edge {
	if m != nil {
		return m.Edge
	}
	return HardwareFeatures_Button_EDGE_UNKNOWN
}

func (m *HardwareFeatures_Button) GetPosition() float32 {
	if m != nil {
		return m.Position
	}
	return 0
}

// EmbeddedController properties
// Next Tag: 4
type HardwareFeatures_EmbeddedController struct {
	// Whether any kind of EC is present on the system.
	Present HardwareFeatures_Present                                   `protobuf:"varint,1,opt,name=present,proto3,enum=chromiumos.config.api.HardwareFeatures_Present" json:"present,omitempty"`
	EcType  HardwareFeatures_EmbeddedController_EmbeddedControllerType `protobuf:"varint,2,opt,name=ec_type,json=ecType,proto3,enum=chromiumos.config.api.HardwareFeatures_EmbeddedController_EmbeddedControllerType" json:"ec_type,omitempty"`
	// The physical component of the EC.
	Part                 *Component_EmbeddedController `protobuf:"bytes,3,opt,name=part,proto3" json:"part,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

func (m *HardwareFeatures_EmbeddedController) Reset()         { *m = HardwareFeatures_EmbeddedController{} }
func (m *HardwareFeatures_EmbeddedController) String() string { return proto.CompactTextString(m) }
func (*HardwareFeatures_EmbeddedController) ProtoMessage()    {}
func (*HardwareFeatures_EmbeddedController) Descriptor() ([]byte, []int) {
	return fileDescriptor_9bdbf9c393c85c5f, []int{1, 23}
}

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

var xxx_messageInfo_HardwareFeatures_EmbeddedController proto.InternalMessageInfo

func (m *HardwareFeatures_EmbeddedController) GetPresent() HardwareFeatures_Present {
	if m != nil {
		return m.Present
	}
	return HardwareFeatures_PRESENT_UNKNOWN
}

func (m *HardwareFeatures_EmbeddedController) GetEcType() HardwareFeatures_EmbeddedController_EmbeddedControllerType {
	if m != nil {
		return m.EcType
	}
	return HardwareFeatures_EmbeddedController_EC_TYPE_UNKNOWN
}

func (m *HardwareFeatures_EmbeddedController) GetPart() *Component_EmbeddedController {
	if m != nil {
		return m.Part
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.config.api.Topology_Type", Topology_Type_name, Topology_Type_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Present", HardwareFeatures_Present_name, HardwareFeatures_Present_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Audio_AudioCodec", HardwareFeatures_Audio_AudioCodec_name, HardwareFeatures_Audio_AudioCodec_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Camera_Interface", HardwareFeatures_Camera_Interface_name, HardwareFeatures_Camera_Interface_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Camera_Facing", HardwareFeatures_Camera_Facing_name, HardwareFeatures_Camera_Facing_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Camera_Orientation", HardwareFeatures_Camera_Orientation_name, HardwareFeatures_Camera_Orientation_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Camera_Flags", HardwareFeatures_Camera_Flags_name, HardwareFeatures_Camera_Flags_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_FormFactor_FormFactorType", HardwareFeatures_FormFactor_FormFactorType_name, HardwareFeatures_FormFactor_FormFactorType_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Stylus_StylusType", HardwareFeatures_Stylus_StylusType_name, HardwareFeatures_Stylus_StylusType_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Keyboard_KeyboardType", HardwareFeatures_Keyboard_KeyboardType_name, HardwareFeatures_Keyboard_KeyboardType_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Fingerprint_Location", HardwareFeatures_Fingerprint_Location_name, HardwareFeatures_Fingerprint_Location_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Wifi_WifiChip", HardwareFeatures_Wifi_WifiChip_name, HardwareFeatures_Wifi_WifiChip_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Button_Region", HardwareFeatures_Button_Region_name, HardwareFeatures_Button_Region_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_Button_Edge", HardwareFeatures_Button_Edge_name, HardwareFeatures_Button_Edge_value)
	proto.RegisterEnum("chromiumos.config.api.HardwareFeatures_EmbeddedController_EmbeddedControllerType", HardwareFeatures_EmbeddedController_EmbeddedControllerType_name, HardwareFeatures_EmbeddedController_EmbeddedControllerType_value)
	proto.RegisterType((*Topology)(nil), "chromiumos.config.api.Topology")
	proto.RegisterMapType((map[string]string)(nil), "chromiumos.config.api.Topology.DescriptionEntry")
	proto.RegisterType((*HardwareFeatures)(nil), "chromiumos.config.api.HardwareFeatures")
	proto.RegisterType((*HardwareFeatures_Count)(nil), "chromiumos.config.api.HardwareFeatures.Count")
	proto.RegisterType((*HardwareFeatures_UsbC)(nil), "chromiumos.config.api.HardwareFeatures.UsbC")
	proto.RegisterType((*HardwareFeatures_UsbA)(nil), "chromiumos.config.api.HardwareFeatures.UsbA")
	proto.RegisterType((*HardwareFeatures_Lte)(nil), "chromiumos.config.api.HardwareFeatures.Lte")
	proto.RegisterType((*HardwareFeatures_Hdmi)(nil), "chromiumos.config.api.HardwareFeatures.Hdmi")
	proto.RegisterType((*HardwareFeatures_FirmwareConfiguration)(nil), "chromiumos.config.api.HardwareFeatures.FirmwareConfiguration")
	proto.RegisterType((*HardwareFeatures_Audio)(nil), "chromiumos.config.api.HardwareFeatures.Audio")
	proto.RegisterType((*HardwareFeatures_Camera)(nil), "chromiumos.config.api.HardwareFeatures.Camera")
	proto.RegisterType((*HardwareFeatures_Camera_Device)(nil), "chromiumos.config.api.HardwareFeatures.Camera.Device")
	proto.RegisterType((*HardwareFeatures_Accelerometer)(nil), "chromiumos.config.api.HardwareFeatures.Accelerometer")
	proto.RegisterType((*HardwareFeatures_Gyroscope)(nil), "chromiumos.config.api.HardwareFeatures.Gyroscope")
	proto.RegisterType((*HardwareFeatures_Magnetometer)(nil), "chromiumos.config.api.HardwareFeatures.Magnetometer")
	proto.RegisterType((*HardwareFeatures_LightSensor)(nil), "chromiumos.config.api.HardwareFeatures.LightSensor")
	proto.RegisterType((*HardwareFeatures_Screen)(nil), "chromiumos.config.api.HardwareFeatures.Screen")
	proto.RegisterType((*HardwareFeatures_FormFactor)(nil), "chromiumos.config.api.HardwareFeatures.FormFactor")
	proto.RegisterType((*HardwareFeatures_Stylus)(nil), "chromiumos.config.api.HardwareFeatures.Stylus")
	proto.RegisterType((*HardwareFeatures_Keyboard)(nil), "chromiumos.config.api.HardwareFeatures.Keyboard")
	proto.RegisterType((*HardwareFeatures_Memory)(nil), "chromiumos.config.api.HardwareFeatures.Memory")
	proto.RegisterType((*HardwareFeatures_Fingerprint)(nil), "chromiumos.config.api.HardwareFeatures.Fingerprint")
	proto.RegisterType((*HardwareFeatures_Storage)(nil), "chromiumos.config.api.HardwareFeatures.Storage")
	proto.RegisterType((*HardwareFeatures_Bluetooth)(nil), "chromiumos.config.api.HardwareFeatures.Bluetooth")
	proto.RegisterType((*HardwareFeatures_BarrelJack)(nil), "chromiumos.config.api.HardwareFeatures.BarrelJack")
	proto.RegisterType((*HardwareFeatures_Wifi)(nil), "chromiumos.config.api.HardwareFeatures.Wifi")
	proto.RegisterType((*HardwareFeatures_Button)(nil), "chromiumos.config.api.HardwareFeatures.Button")
	proto.RegisterType((*HardwareFeatures_EmbeddedController)(nil), "chromiumos.config.api.HardwareFeatures.EmbeddedController")
}

func init() {
	proto.RegisterFile("chromiumos/config/api/topology.proto", fileDescriptor_9bdbf9c393c85c5f)
}

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