// Code generated by protoc-gen-go. DO NOT EDIT.
// source: dmi/hw.proto

package dmi

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

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

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type ComponentType int32

const (
	ComponentType_COMPONENT_TYPE_UNDEFINED    ComponentType = 0
	ComponentType_COMPONENT_TYPE_UNKNOWN      ComponentType = 1
	ComponentType_COMPONENT_TYPE_CHASSIS      ComponentType = 2
	ComponentType_COMPONENT_TYPE_BACKPLANE    ComponentType = 3
	ComponentType_COMPONENT_TYPE_CONTAINER    ComponentType = 4
	ComponentType_COMPONENT_TYPE_POWER_SUPPLY ComponentType = 5
	ComponentType_COMPONENT_TYPE_FAN          ComponentType = 6
	ComponentType_COMPONENT_TYPE_SENSOR       ComponentType = 7
	ComponentType_COMPONENT_TYPE_MODULE       ComponentType = 8
	ComponentType_COMPONENT_TYPE_PORT         ComponentType = 9
	ComponentType_COMPONENT_TYPE_CPU          ComponentType = 10
	ComponentType_COMPONENT_TYPE_BATTERY      ComponentType = 11
	ComponentType_COMPONENT_TYPE_STORAGE      ComponentType = 12
	ComponentType_COMPONENT_TYPE_MEMORY       ComponentType = 13
	ComponentType_COMPONENT_TYPE_TRANSCEIVER  ComponentType = 14
)

var ComponentType_name = map[int32]string{
	0:  "COMPONENT_TYPE_UNDEFINED",
	1:  "COMPONENT_TYPE_UNKNOWN",
	2:  "COMPONENT_TYPE_CHASSIS",
	3:  "COMPONENT_TYPE_BACKPLANE",
	4:  "COMPONENT_TYPE_CONTAINER",
	5:  "COMPONENT_TYPE_POWER_SUPPLY",
	6:  "COMPONENT_TYPE_FAN",
	7:  "COMPONENT_TYPE_SENSOR",
	8:  "COMPONENT_TYPE_MODULE",
	9:  "COMPONENT_TYPE_PORT",
	10: "COMPONENT_TYPE_CPU",
	11: "COMPONENT_TYPE_BATTERY",
	12: "COMPONENT_TYPE_STORAGE",
	13: "COMPONENT_TYPE_MEMORY",
	14: "COMPONENT_TYPE_TRANSCEIVER",
}

var ComponentType_value = map[string]int32{
	"COMPONENT_TYPE_UNDEFINED":    0,
	"COMPONENT_TYPE_UNKNOWN":      1,
	"COMPONENT_TYPE_CHASSIS":      2,
	"COMPONENT_TYPE_BACKPLANE":    3,
	"COMPONENT_TYPE_CONTAINER":    4,
	"COMPONENT_TYPE_POWER_SUPPLY": 5,
	"COMPONENT_TYPE_FAN":          6,
	"COMPONENT_TYPE_SENSOR":       7,
	"COMPONENT_TYPE_MODULE":       8,
	"COMPONENT_TYPE_PORT":         9,
	"COMPONENT_TYPE_CPU":          10,
	"COMPONENT_TYPE_BATTERY":      11,
	"COMPONENT_TYPE_STORAGE":      12,
	"COMPONENT_TYPE_MEMORY":       13,
	"COMPONENT_TYPE_TRANSCEIVER":  14,
}

func (x ComponentType) String() string {
	return proto.EnumName(ComponentType_name, int32(x))
}

func (ComponentType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{0}
}

type ComponentAdminState int32

const (
	ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED     ComponentAdminState = 0
	ComponentAdminState_COMP_ADMIN_STATE_UNKNOWN       ComponentAdminState = 1
	ComponentAdminState_COMP_ADMIN_STATE_LOCKED        ComponentAdminState = 2
	ComponentAdminState_COMP_ADMIN_STATE_SHUTTING_DOWN ComponentAdminState = 3
	ComponentAdminState_COMP_ADMIN_STATE_UNLOCKED      ComponentAdminState = 4
)

var ComponentAdminState_name = map[int32]string{
	0: "COMP_ADMIN_STATE_UNDEFINED",
	1: "COMP_ADMIN_STATE_UNKNOWN",
	2: "COMP_ADMIN_STATE_LOCKED",
	3: "COMP_ADMIN_STATE_SHUTTING_DOWN",
	4: "COMP_ADMIN_STATE_UNLOCKED",
}

var ComponentAdminState_value = map[string]int32{
	"COMP_ADMIN_STATE_UNDEFINED":     0,
	"COMP_ADMIN_STATE_UNKNOWN":       1,
	"COMP_ADMIN_STATE_LOCKED":        2,
	"COMP_ADMIN_STATE_SHUTTING_DOWN": 3,
	"COMP_ADMIN_STATE_UNLOCKED":      4,
}

func (x ComponentAdminState) String() string {
	return proto.EnumName(ComponentAdminState_name, int32(x))
}

func (ComponentAdminState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{1}
}

type ComponentOperState int32

const (
	ComponentOperState_COMP_OPER_STATE_UNDEFINED ComponentOperState = 0
	ComponentOperState_COMP_OPER_STATE_UNKNOWN   ComponentOperState = 1
	ComponentOperState_COMP_OPER_STATE_DISABLED  ComponentOperState = 2
	ComponentOperState_COMP_OPER_STATE_ENABLED   ComponentOperState = 3
	ComponentOperState_COMP_OPER_STATE_TESTING   ComponentOperState = 4
)

var ComponentOperState_name = map[int32]string{
	0: "COMP_OPER_STATE_UNDEFINED",
	1: "COMP_OPER_STATE_UNKNOWN",
	2: "COMP_OPER_STATE_DISABLED",
	3: "COMP_OPER_STATE_ENABLED",
	4: "COMP_OPER_STATE_TESTING",
}

var ComponentOperState_value = map[string]int32{
	"COMP_OPER_STATE_UNDEFINED": 0,
	"COMP_OPER_STATE_UNKNOWN":   1,
	"COMP_OPER_STATE_DISABLED":  2,
	"COMP_OPER_STATE_ENABLED":   3,
	"COMP_OPER_STATE_TESTING":   4,
}

func (x ComponentOperState) String() string {
	return proto.EnumName(ComponentOperState_name, int32(x))
}

func (ComponentOperState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{2}
}

type ComponentUsageState int32

const (
	ComponentUsageState_COMP_USAGE_STATE_UNDEFINED ComponentUsageState = 0
	ComponentUsageState_COMP_USAGE_STATE_UNKNOWN   ComponentUsageState = 1
	ComponentUsageState_COMP_USAGE_STATE_IDLE      ComponentUsageState = 2
	ComponentUsageState_COMP_USAGE_STATE_ACTIVE    ComponentUsageState = 3
	ComponentUsageState_COMP_USAGE_STATE_BUSY      ComponentUsageState = 4
)

var ComponentUsageState_name = map[int32]string{
	0: "COMP_USAGE_STATE_UNDEFINED",
	1: "COMP_USAGE_STATE_UNKNOWN",
	2: "COMP_USAGE_STATE_IDLE",
	3: "COMP_USAGE_STATE_ACTIVE",
	4: "COMP_USAGE_STATE_BUSY",
}

var ComponentUsageState_value = map[string]int32{
	"COMP_USAGE_STATE_UNDEFINED": 0,
	"COMP_USAGE_STATE_UNKNOWN":   1,
	"COMP_USAGE_STATE_IDLE":      2,
	"COMP_USAGE_STATE_ACTIVE":    3,
	"COMP_USAGE_STATE_BUSY":      4,
}

func (x ComponentUsageState) String() string {
	return proto.EnumName(ComponentUsageState_name, int32(x))
}

func (ComponentUsageState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{3}
}

type ComponentAlarmState int32

const (
	ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED    ComponentAlarmState = 0
	ComponentAlarmState_COMP_ALARM_STATE_UNKNOWN      ComponentAlarmState = 1
	ComponentAlarmState_COMP_ALARM_STATE_UNDER_REPAIR ComponentAlarmState = 2
	ComponentAlarmState_COMP_ALARM_STATE_CRITICAL     ComponentAlarmState = 3
	ComponentAlarmState_COMP_ALARM_STATE_MAJOR        ComponentAlarmState = 4
	ComponentAlarmState_COMP_ALARM_STATE_MINOR        ComponentAlarmState = 5
	ComponentAlarmState_COMP_ALARM_STATE_WARNING      ComponentAlarmState = 6
	ComponentAlarmState_COMP_ALARM_STATE_INTERMEDIATE ComponentAlarmState = 7
)

var ComponentAlarmState_name = map[int32]string{
	0: "COMP_ALARM_STATE_UNDEFINED",
	1: "COMP_ALARM_STATE_UNKNOWN",
	2: "COMP_ALARM_STATE_UNDER_REPAIR",
	3: "COMP_ALARM_STATE_CRITICAL",
	4: "COMP_ALARM_STATE_MAJOR",
	5: "COMP_ALARM_STATE_MINOR",
	6: "COMP_ALARM_STATE_WARNING",
	7: "COMP_ALARM_STATE_INTERMEDIATE",
}

var ComponentAlarmState_value = map[string]int32{
	"COMP_ALARM_STATE_UNDEFINED":    0,
	"COMP_ALARM_STATE_UNKNOWN":      1,
	"COMP_ALARM_STATE_UNDER_REPAIR": 2,
	"COMP_ALARM_STATE_CRITICAL":     3,
	"COMP_ALARM_STATE_MAJOR":        4,
	"COMP_ALARM_STATE_MINOR":        5,
	"COMP_ALARM_STATE_WARNING":      6,
	"COMP_ALARM_STATE_INTERMEDIATE": 7,
}

func (x ComponentAlarmState) String() string {
	return proto.EnumName(ComponentAlarmState_name, int32(x))
}

func (ComponentAlarmState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{4}
}

type ComponentStandbyState int32

const (
	ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED         ComponentStandbyState = 0
	ComponentStandbyState_COMP_STANDBY_STATE_UNKNOWN           ComponentStandbyState = 1
	ComponentStandbyState_COMP_STANDBY_STATE_HOT               ComponentStandbyState = 2
	ComponentStandbyState_COMP_STANDBY_STATE_COLD              ComponentStandbyState = 3
	ComponentStandbyState_COMP_STANDBY_STATE_PROVIDING_SERVICE ComponentStandbyState = 4
)

var ComponentStandbyState_name = map[int32]string{
	0: "COMP_STANDBY_STATE_UNDEFINED",
	1: "COMP_STANDBY_STATE_UNKNOWN",
	2: "COMP_STANDBY_STATE_HOT",
	3: "COMP_STANDBY_STATE_COLD",
	4: "COMP_STANDBY_STATE_PROVIDING_SERVICE",
}

var ComponentStandbyState_value = map[string]int32{
	"COMP_STANDBY_STATE_UNDEFINED":         0,
	"COMP_STANDBY_STATE_UNKNOWN":           1,
	"COMP_STANDBY_STATE_HOT":               2,
	"COMP_STANDBY_STATE_COLD":              3,
	"COMP_STANDBY_STATE_PROVIDING_SERVICE": 4,
}

func (x ComponentStandbyState) String() string {
	return proto.EnumName(ComponentStandbyState_name, int32(x))
}

func (ComponentStandbyState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{5}
}

type SensorValueType int32

const (
	SensorValueType_SENSOR_VALUE_TYPE_UNDEFINED   SensorValueType = 0
	SensorValueType_SENSOR_VALUE_TYPE_OTHER       SensorValueType = 1
	SensorValueType_SENSOR_VALUE_TYPE_UNKNOWN     SensorValueType = 2
	SensorValueType_SENSOR_VALUE_TYPE_VOLTS_AC    SensorValueType = 3
	SensorValueType_SENSOR_VALUE_TYPE_VOLTS_DC    SensorValueType = 4
	SensorValueType_SENSOR_VALUE_TYPE_AMPERES     SensorValueType = 5
	SensorValueType_SENSOR_VALUE_TYPE_WATTS       SensorValueType = 6
	SensorValueType_SENSOR_VALUE_TYPE_HERTZ       SensorValueType = 7
	SensorValueType_SENSOR_VALUE_TYPE_CELSIUS     SensorValueType = 8
	SensorValueType_SENSOR_VALUE_TYPE_PERCENT_RH  SensorValueType = 9
	SensorValueType_SENSOR_VALUE_TYPE_RPM         SensorValueType = 10
	SensorValueType_SENSOR_VALUE_TYPE_CMM         SensorValueType = 11
	SensorValueType_SENSOR_VALUE_TYPE_TRUTH_VALUE SensorValueType = 12
)

var SensorValueType_name = map[int32]string{
	0:  "SENSOR_VALUE_TYPE_UNDEFINED",
	1:  "SENSOR_VALUE_TYPE_OTHER",
	2:  "SENSOR_VALUE_TYPE_UNKNOWN",
	3:  "SENSOR_VALUE_TYPE_VOLTS_AC",
	4:  "SENSOR_VALUE_TYPE_VOLTS_DC",
	5:  "SENSOR_VALUE_TYPE_AMPERES",
	6:  "SENSOR_VALUE_TYPE_WATTS",
	7:  "SENSOR_VALUE_TYPE_HERTZ",
	8:  "SENSOR_VALUE_TYPE_CELSIUS",
	9:  "SENSOR_VALUE_TYPE_PERCENT_RH",
	10: "SENSOR_VALUE_TYPE_RPM",
	11: "SENSOR_VALUE_TYPE_CMM",
	12: "SENSOR_VALUE_TYPE_TRUTH_VALUE",
}

var SensorValueType_value = map[string]int32{
	"SENSOR_VALUE_TYPE_UNDEFINED":   0,
	"SENSOR_VALUE_TYPE_OTHER":       1,
	"SENSOR_VALUE_TYPE_UNKNOWN":     2,
	"SENSOR_VALUE_TYPE_VOLTS_AC":    3,
	"SENSOR_VALUE_TYPE_VOLTS_DC":    4,
	"SENSOR_VALUE_TYPE_AMPERES":     5,
	"SENSOR_VALUE_TYPE_WATTS":       6,
	"SENSOR_VALUE_TYPE_HERTZ":       7,
	"SENSOR_VALUE_TYPE_CELSIUS":     8,
	"SENSOR_VALUE_TYPE_PERCENT_RH":  9,
	"SENSOR_VALUE_TYPE_RPM":         10,
	"SENSOR_VALUE_TYPE_CMM":         11,
	"SENSOR_VALUE_TYPE_TRUTH_VALUE": 12,
}

func (x SensorValueType) String() string {
	return proto.EnumName(SensorValueType_name, int32(x))
}

func (SensorValueType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{6}
}

type SensorValueScale int32

const (
	SensorValueScale_SENSOR_VALUE_SCALE_UNDEFINED SensorValueScale = 0
	SensorValueScale_SENSOR_VALUE_SCALE_YOCTO     SensorValueScale = 1
	SensorValueScale_SENSOR_VALUE_SCALE_ZEPTO     SensorValueScale = 2
	SensorValueScale_SENSOR_VALUE_SCALE_ATTO      SensorValueScale = 3
	SensorValueScale_SENSOR_VALUE_SCALE_FEMTO     SensorValueScale = 4
	SensorValueScale_SENSOR_VALUE_SCALE_PICO      SensorValueScale = 5
	SensorValueScale_SENSOR_VALUE_SCALE_NANO      SensorValueScale = 6
	SensorValueScale_SENSOR_VALUE_SCALE_MICRO     SensorValueScale = 7
	SensorValueScale_SENSOR_VALUE_SCALE_MILLI     SensorValueScale = 8
	SensorValueScale_SENSOR_VALUE_SCALE_UNITS     SensorValueScale = 9
	SensorValueScale_SENSOR_VALUE_SCALE_KILO      SensorValueScale = 10
	SensorValueScale_SENSOR_VALUE_SCALE_MEGA      SensorValueScale = 11
	SensorValueScale_SENSOR_VALUE_SCALE_GIGA      SensorValueScale = 12
	SensorValueScale_SENSOR_VALUE_SCALE_TERA      SensorValueScale = 13
	SensorValueScale_SENSOR_VALUE_SCALE_PETA      SensorValueScale = 14
	SensorValueScale_SENSOR_VALUE_SCALE_EXA       SensorValueScale = 15
	SensorValueScale_SENSOR_VALUE_SCALE_ZETTA     SensorValueScale = 16
	SensorValueScale_SENSOR_VALUE_SCALE_YOTTA     SensorValueScale = 17
)

var SensorValueScale_name = map[int32]string{
	0:  "SENSOR_VALUE_SCALE_UNDEFINED",
	1:  "SENSOR_VALUE_SCALE_YOCTO",
	2:  "SENSOR_VALUE_SCALE_ZEPTO",
	3:  "SENSOR_VALUE_SCALE_ATTO",
	4:  "SENSOR_VALUE_SCALE_FEMTO",
	5:  "SENSOR_VALUE_SCALE_PICO",
	6:  "SENSOR_VALUE_SCALE_NANO",
	7:  "SENSOR_VALUE_SCALE_MICRO",
	8:  "SENSOR_VALUE_SCALE_MILLI",
	9:  "SENSOR_VALUE_SCALE_UNITS",
	10: "SENSOR_VALUE_SCALE_KILO",
	11: "SENSOR_VALUE_SCALE_MEGA",
	12: "SENSOR_VALUE_SCALE_GIGA",
	13: "SENSOR_VALUE_SCALE_TERA",
	14: "SENSOR_VALUE_SCALE_PETA",
	15: "SENSOR_VALUE_SCALE_EXA",
	16: "SENSOR_VALUE_SCALE_ZETTA",
	17: "SENSOR_VALUE_SCALE_YOTTA",
}

var SensorValueScale_value = map[string]int32{
	"SENSOR_VALUE_SCALE_UNDEFINED": 0,
	"SENSOR_VALUE_SCALE_YOCTO":     1,
	"SENSOR_VALUE_SCALE_ZEPTO":     2,
	"SENSOR_VALUE_SCALE_ATTO":      3,
	"SENSOR_VALUE_SCALE_FEMTO":     4,
	"SENSOR_VALUE_SCALE_PICO":      5,
	"SENSOR_VALUE_SCALE_NANO":      6,
	"SENSOR_VALUE_SCALE_MICRO":     7,
	"SENSOR_VALUE_SCALE_MILLI":     8,
	"SENSOR_VALUE_SCALE_UNITS":     9,
	"SENSOR_VALUE_SCALE_KILO":      10,
	"SENSOR_VALUE_SCALE_MEGA":      11,
	"SENSOR_VALUE_SCALE_GIGA":      12,
	"SENSOR_VALUE_SCALE_TERA":      13,
	"SENSOR_VALUE_SCALE_PETA":      14,
	"SENSOR_VALUE_SCALE_EXA":       15,
	"SENSOR_VALUE_SCALE_ZETTA":     16,
	"SENSOR_VALUE_SCALE_YOTTA":     17,
}

func (x SensorValueScale) String() string {
	return proto.EnumName(SensorValueScale_name, int32(x))
}

func (SensorValueScale) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{7}
}

type SensorStatus int32

const (
	SensorStatus_SENSOR_STATUS_UNDEFINED      SensorStatus = 0
	SensorStatus_SENSOR_STATUS_OK             SensorStatus = 1
	SensorStatus_SENSOR_STATUS_UNAVAILABLE    SensorStatus = 2
	SensorStatus_SENSOR_STATUS_NONOPERATIONAL SensorStatus = 3
)

var SensorStatus_name = map[int32]string{
	0: "SENSOR_STATUS_UNDEFINED",
	1: "SENSOR_STATUS_OK",
	2: "SENSOR_STATUS_UNAVAILABLE",
	3: "SENSOR_STATUS_NONOPERATIONAL",
}

var SensorStatus_value = map[string]int32{
	"SENSOR_STATUS_UNDEFINED":      0,
	"SENSOR_STATUS_OK":             1,
	"SENSOR_STATUS_UNAVAILABLE":    2,
	"SENSOR_STATUS_NONOPERATIONAL": 3,
}

func (x SensorStatus) String() string {
	return proto.EnumName(SensorStatus_name, int32(x))
}

func (SensorStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{8}
}

type Uuid struct {
	Uuid                 string   `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Uuid proto.InternalMessageInfo

func (m *Uuid) GetUuid() string {
	if m != nil {
		return m.Uuid
	}
	return ""
}

type HardwareID struct {
	Uuid                 *Uuid    `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HardwareID proto.InternalMessageInfo

func (m *HardwareID) GetUuid() *Uuid {
	if m != nil {
		return m.Uuid
	}
	return nil
}

type Uri struct {
	Uri                  string   `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Uri proto.InternalMessageInfo

func (m *Uri) GetUri() string {
	if m != nil {
		return m.Uri
	}
	return ""
}

type ComponentState struct {
	StateLastChanged     *timestamp.Timestamp  `protobuf:"bytes,1,opt,name=state_last_changed,json=stateLastChanged,proto3" json:"state_last_changed,omitempty"`
	AdminState           ComponentAdminState   `protobuf:"varint,2,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
	OperState            ComponentOperState    `protobuf:"varint,3,opt,name=oper_state,json=operState,proto3,enum=dmi.ComponentOperState" json:"oper_state,omitempty"`
	UsageState           ComponentUsageState   `protobuf:"varint,4,opt,name=usage_state,json=usageState,proto3,enum=dmi.ComponentUsageState" json:"usage_state,omitempty"`
	AlarmState           ComponentAlarmState   `protobuf:"varint,5,opt,name=alarm_state,json=alarmState,proto3,enum=dmi.ComponentAlarmState" json:"alarm_state,omitempty"`
	StandbyState         ComponentStandbyState `protobuf:"varint,6,opt,name=standby_state,json=standbyState,proto3,enum=dmi.ComponentStandbyState" json:"standby_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_ComponentState proto.InternalMessageInfo

func (m *ComponentState) GetStateLastChanged() *timestamp.Timestamp {
	if m != nil {
		return m.StateLastChanged
	}
	return nil
}

func (m *ComponentState) GetAdminState() ComponentAdminState {
	if m != nil {
		return m.AdminState
	}
	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
}

func (m *ComponentState) GetOperState() ComponentOperState {
	if m != nil {
		return m.OperState
	}
	return ComponentOperState_COMP_OPER_STATE_UNDEFINED
}

func (m *ComponentState) GetUsageState() ComponentUsageState {
	if m != nil {
		return m.UsageState
	}
	return ComponentUsageState_COMP_USAGE_STATE_UNDEFINED
}

func (m *ComponentState) GetAlarmState() ComponentAlarmState {
	if m != nil {
		return m.AlarmState
	}
	return ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED
}

func (m *ComponentState) GetStandbyState() ComponentStandbyState {
	if m != nil {
		return m.StandbyState
	}
	return ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED
}

type ComponentSensorData struct {
	Value           int32                `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
	Type            SensorValueType      `protobuf:"varint,2,opt,name=type,proto3,enum=dmi.SensorValueType" json:"type,omitempty"`
	Scale           SensorValueScale     `protobuf:"varint,3,opt,name=scale,proto3,enum=dmi.SensorValueScale" json:"scale,omitempty"`
	Precision       int32                `protobuf:"varint,4,opt,name=precision,proto3" json:"precision,omitempty"`
	Status          SensorStatus         `protobuf:"varint,5,opt,name=status,proto3,enum=dmi.SensorStatus" json:"status,omitempty"`
	UnitsDisplay    string               `protobuf:"bytes,6,opt,name=units_display,json=unitsDisplay,proto3" json:"units_display,omitempty"`
	Timestamp       *timestamp.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	ValueUpdateRate uint32               `protobuf:"varint,8,opt,name=value_update_rate,json=valueUpdateRate,proto3" json:"value_update_rate,omitempty"`
	// data_type can be of the string representation of MetricNames or something else as well
	DataType             string   `protobuf:"bytes,9,opt,name=data_type,json=dataType,proto3" json:"data_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ComponentSensorData proto.InternalMessageInfo

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

func (m *ComponentSensorData) GetType() SensorValueType {
	if m != nil {
		return m.Type
	}
	return SensorValueType_SENSOR_VALUE_TYPE_UNDEFINED
}

func (m *ComponentSensorData) GetScale() SensorValueScale {
	if m != nil {
		return m.Scale
	}
	return SensorValueScale_SENSOR_VALUE_SCALE_UNDEFINED
}

func (m *ComponentSensorData) GetPrecision() int32 {
	if m != nil {
		return m.Precision
	}
	return 0
}

func (m *ComponentSensorData) GetStatus() SensorStatus {
	if m != nil {
		return m.Status
	}
	return SensorStatus_SENSOR_STATUS_UNDEFINED
}

func (m *ComponentSensorData) GetUnitsDisplay() string {
	if m != nil {
		return m.UnitsDisplay
	}
	return ""
}

func (m *ComponentSensorData) GetTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.Timestamp
	}
	return nil
}

func (m *ComponentSensorData) GetValueUpdateRate() uint32 {
	if m != nil {
		return m.ValueUpdateRate
	}
	return 0
}

func (m *ComponentSensorData) GetDataType() string {
	if m != nil {
		return m.DataType
	}
	return ""
}

type Component struct {
	// The name of a component uniquely identifies an component within the Hardware
	Name         string               `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Class        ComponentType        `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
	Description  string               `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	Parent       *Component           `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"`
	ParentRelPos int32                `protobuf:"varint,5,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
	Children     []*Component         `protobuf:"bytes,6,rep,name=children,proto3" json:"children,omitempty"`
	HardwareRev  string               `protobuf:"bytes,7,opt,name=hardware_rev,json=hardwareRev,proto3" json:"hardware_rev,omitempty"`
	FirmwareRev  string               `protobuf:"bytes,8,opt,name=firmware_rev,json=firmwareRev,proto3" json:"firmware_rev,omitempty"`
	SoftwareRev  string               `protobuf:"bytes,9,opt,name=software_rev,json=softwareRev,proto3" json:"software_rev,omitempty"`
	SerialNum    string               `protobuf:"bytes,10,opt,name=serial_num,json=serialNum,proto3" json:"serial_num,omitempty"`
	MfgName      string               `protobuf:"bytes,11,opt,name=mfg_name,json=mfgName,proto3" json:"mfg_name,omitempty"`
	ModelName    string               `protobuf:"bytes,12,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
	Alias        string               `protobuf:"bytes,13,opt,name=alias,proto3" json:"alias,omitempty"`
	AssetId      string               `protobuf:"bytes,14,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
	IsFru        bool                 `protobuf:"varint,15,opt,name=is_fru,json=isFru,proto3" json:"is_fru,omitempty"`
	MfgDate      *timestamp.Timestamp `protobuf:"bytes,16,opt,name=mfg_date,json=mfgDate,proto3" json:"mfg_date,omitempty"`
	Uri          *Uri                 `protobuf:"bytes,17,opt,name=uri,proto3" json:"uri,omitempty"`
	// The uuid of the component uniquely identifies the component across the entire system
	Uuid                 *Uuid                  `protobuf:"bytes,18,opt,name=uuid,proto3" json:"uuid,omitempty"`
	State                *ComponentState        `protobuf:"bytes,19,opt,name=state,proto3" json:"state,omitempty"`
	SensorData           []*ComponentSensorData `protobuf:"bytes,20,rep,name=sensor_data,json=sensorData,proto3" json:"sensor_data,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_Component proto.InternalMessageInfo

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

func (m *Component) GetClass() ComponentType {
	if m != nil {
		return m.Class
	}
	return ComponentType_COMPONENT_TYPE_UNDEFINED
}

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

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

func (m *Component) GetParentRelPos() int32 {
	if m != nil {
		return m.ParentRelPos
	}
	return 0
}

func (m *Component) GetChildren() []*Component {
	if m != nil {
		return m.Children
	}
	return nil
}

func (m *Component) GetHardwareRev() string {
	if m != nil {
		return m.HardwareRev
	}
	return ""
}

func (m *Component) GetFirmwareRev() string {
	if m != nil {
		return m.FirmwareRev
	}
	return ""
}

func (m *Component) GetSoftwareRev() string {
	if m != nil {
		return m.SoftwareRev
	}
	return ""
}

func (m *Component) GetSerialNum() string {
	if m != nil {
		return m.SerialNum
	}
	return ""
}

func (m *Component) GetMfgName() string {
	if m != nil {
		return m.MfgName
	}
	return ""
}

func (m *Component) GetModelName() string {
	if m != nil {
		return m.ModelName
	}
	return ""
}

func (m *Component) GetAlias() string {
	if m != nil {
		return m.Alias
	}
	return ""
}

func (m *Component) GetAssetId() string {
	if m != nil {
		return m.AssetId
	}
	return ""
}

func (m *Component) GetIsFru() bool {
	if m != nil {
		return m.IsFru
	}
	return false
}

func (m *Component) GetMfgDate() *timestamp.Timestamp {
	if m != nil {
		return m.MfgDate
	}
	return nil
}

func (m *Component) GetUri() *Uri {
	if m != nil {
		return m.Uri
	}
	return nil
}

func (m *Component) GetUuid() *Uuid {
	if m != nil {
		return m.Uuid
	}
	return nil
}

func (m *Component) GetState() *ComponentState {
	if m != nil {
		return m.State
	}
	return nil
}

func (m *Component) GetSensorData() []*ComponentSensorData {
	if m != nil {
		return m.SensorData
	}
	return nil
}

type Hardware struct {
	LastChange *timestamp.Timestamp `protobuf:"bytes,1,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
	// Each HW has one parent/root and all other components are children of this
	// The class of the root component would be set as UNDEFINED
	Root                 *Component `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Hardware proto.InternalMessageInfo

func (m *Hardware) GetLastChange() *timestamp.Timestamp {
	if m != nil {
		return m.LastChange
	}
	return nil
}

func (m *Hardware) GetRoot() *Component {
	if m != nil {
		return m.Root
	}
	return nil
}

// The attributes of a component which are modifiable from the client side
type ModifiableComponent struct {
	// The name has to be unique for each component within the hardware and implementations need to
	// ascertain this when modifying the name
	Name                 string              `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Class                ComponentType       `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
	Parent               *Component          `protobuf:"bytes,3,opt,name=parent,proto3" json:"parent,omitempty"`
	ParentRelPos         int32               `protobuf:"varint,4,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
	Alias                string              `protobuf:"bytes,5,opt,name=alias,proto3" json:"alias,omitempty"`
	AssetId              string              `protobuf:"bytes,6,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
	Uri                  *Uri                `protobuf:"bytes,7,opt,name=uri,proto3" json:"uri,omitempty"`
	AdminState           ComponentAdminState `protobuf:"varint,8,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_ModifiableComponent proto.InternalMessageInfo

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

func (m *ModifiableComponent) GetClass() ComponentType {
	if m != nil {
		return m.Class
	}
	return ComponentType_COMPONENT_TYPE_UNDEFINED
}

func (m *ModifiableComponent) GetParent() *Component {
	if m != nil {
		return m.Parent
	}
	return nil
}

func (m *ModifiableComponent) GetParentRelPos() int32 {
	if m != nil {
		return m.ParentRelPos
	}
	return 0
}

func (m *ModifiableComponent) GetAlias() string {
	if m != nil {
		return m.Alias
	}
	return ""
}

func (m *ModifiableComponent) GetAssetId() string {
	if m != nil {
		return m.AssetId
	}
	return ""
}

func (m *ModifiableComponent) GetUri() *Uri {
	if m != nil {
		return m.Uri
	}
	return nil
}

func (m *ModifiableComponent) GetAdminState() ComponentAdminState {
	if m != nil {
		return m.AdminState
	}
	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
}

func init() {
	proto.RegisterEnum("dmi.ComponentType", ComponentType_name, ComponentType_value)
	proto.RegisterEnum("dmi.ComponentAdminState", ComponentAdminState_name, ComponentAdminState_value)
	proto.RegisterEnum("dmi.ComponentOperState", ComponentOperState_name, ComponentOperState_value)
	proto.RegisterEnum("dmi.ComponentUsageState", ComponentUsageState_name, ComponentUsageState_value)
	proto.RegisterEnum("dmi.ComponentAlarmState", ComponentAlarmState_name, ComponentAlarmState_value)
	proto.RegisterEnum("dmi.ComponentStandbyState", ComponentStandbyState_name, ComponentStandbyState_value)
	proto.RegisterEnum("dmi.SensorValueType", SensorValueType_name, SensorValueType_value)
	proto.RegisterEnum("dmi.SensorValueScale", SensorValueScale_name, SensorValueScale_value)
	proto.RegisterEnum("dmi.SensorStatus", SensorStatus_name, SensorStatus_value)
	proto.RegisterType((*Uuid)(nil), "dmi.Uuid")
	proto.RegisterType((*HardwareID)(nil), "dmi.HardwareID")
	proto.RegisterType((*Uri)(nil), "dmi.Uri")
	proto.RegisterType((*ComponentState)(nil), "dmi.ComponentState")
	proto.RegisterType((*ComponentSensorData)(nil), "dmi.ComponentSensorData")
	proto.RegisterType((*Component)(nil), "dmi.Component")
	proto.RegisterType((*Hardware)(nil), "dmi.Hardware")
	proto.RegisterType((*ModifiableComponent)(nil), "dmi.ModifiableComponent")
}

func init() { proto.RegisterFile("dmi/hw.proto", fileDescriptor_d7c33d745c4ab367) }

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