// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab/peripherals.proto

package lab

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

// Next Tag: 3
type CameraType int32

const (
	CameraType_CAMERA_INVALID CameraType = 0
	// camera Huddly GO
	CameraType_CAMERA_HUDDLY CameraType = 1
	// camera Logitech PTZ Pro 2
	CameraType_CAMERA_PTZPRO2 CameraType = 2
)

var CameraType_name = map[int32]string{
	0: "CAMERA_INVALID",
	1: "CAMERA_HUDDLY",
	2: "CAMERA_PTZPRO2",
}

var CameraType_value = map[string]int32{
	"CAMERA_INVALID": 0,
	"CAMERA_HUDDLY":  1,
	"CAMERA_PTZPRO2": 2,
}

func (x CameraType) String() string {
	return proto.EnumName(CameraType_name, int32(x))
}

func (CameraType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{0}
}

type CableType int32

const (
	CableType_CABLE_INVALID     CableType = 0
	CableType_CABLE_AUDIOJACK   CableType = 1
	CableType_CABLE_USBAUDIO    CableType = 2
	CableType_CABLE_USBPRINTING CableType = 3
	CableType_CABLE_HDMIAUDIO   CableType = 4
)

var CableType_name = map[int32]string{
	0: "CABLE_INVALID",
	1: "CABLE_AUDIOJACK",
	2: "CABLE_USBAUDIO",
	3: "CABLE_USBPRINTING",
	4: "CABLE_HDMIAUDIO",
}

var CableType_value = map[string]int32{
	"CABLE_INVALID":     0,
	"CABLE_AUDIOJACK":   1,
	"CABLE_USBAUDIO":    2,
	"CABLE_USBPRINTING": 3,
	"CABLE_HDMIAUDIO":   4,
}

func (x CableType) String() string {
	return proto.EnumName(CableType_name, int32(x))
}

func (CableType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{1}
}

// DUT's WiFi antenna's connection.
// Next Tag: 3
type Wifi_AntennaConnection int32

const (
	Wifi_CONN_UNKNOWN Wifi_AntennaConnection = 0
	// WIFI antenna is connected conductively.
	Wifi_CONN_CONDUCTIVE Wifi_AntennaConnection = 1
	// WIFI antenna is connected over-the-air.
	Wifi_CONN_OTA Wifi_AntennaConnection = 2
)

var Wifi_AntennaConnection_name = map[int32]string{
	0: "CONN_UNKNOWN",
	1: "CONN_CONDUCTIVE",
	2: "CONN_OTA",
}

var Wifi_AntennaConnection_value = map[string]int32{
	"CONN_UNKNOWN":    0,
	"CONN_CONDUCTIVE": 1,
	"CONN_OTA":        2,
}

func (x Wifi_AntennaConnection) String() string {
	return proto.EnumName(Wifi_AntennaConnection_name, int32(x))
}

func (Wifi_AntennaConnection) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{5, 0}
}

type Wifi_Router int32

const (
	Wifi_ROUTER_UNSPECIFIED Wifi_Router = 0
	Wifi_ROUTER_802_11AX    Wifi_Router = 1
)

var Wifi_Router_name = map[int32]string{
	0: "ROUTER_UNSPECIFIED",
	1: "ROUTER_802_11AX",
}

var Wifi_Router_value = map[string]int32{
	"ROUTER_UNSPECIFIED": 0,
	"ROUTER_802_11AX":    1,
}

func (x Wifi_Router) String() string {
	return proto.EnumName(Wifi_Router_name, int32(x))
}

func (Wifi_Router) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{5, 1}
}

// Facing of DUT's camera to be tested whose FOV should cover chart tablet's screen.
// Next Tag: 3
type Camerabox_Facing int32

const (
	Camerabox_FACING_UNKNOWN Camerabox_Facing = 0
	// DUT's back camera is facing to chart tablet.
	Camerabox_FACING_BACK Camerabox_Facing = 1
	// DUT's front camera is facing to chart tablet.
	Camerabox_FACING_FRONT Camerabox_Facing = 2
)

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

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

func (x Camerabox_Facing) String() string {
	return proto.EnumName(Camerabox_Facing_name, int32(x))
}

func (Camerabox_Facing) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{7, 0}
}

// Peripherals of device. Next Tag: 14
type Peripherals struct {
	Servo     *Servo     `protobuf:"bytes,1,opt,name=servo,proto3" json:"servo,omitempty"`
	Chameleon *Chameleon `protobuf:"bytes,2,opt,name=chameleon,proto3" json:"chameleon,omitempty"`
	Rpm       *RPM       `protobuf:"bytes,3,opt,name=rpm,proto3" json:"rpm,omitempty"`
	// refer to cameras that connected to the device.
	ConnectedCamera []*Camera `protobuf:"bytes,4,rep,name=connected_camera,json=connectedCamera,proto3" json:"connected_camera,omitempty"`
	Audio           *Audio    `protobuf:"bytes,5,opt,name=audio,proto3" json:"audio,omitempty"`
	Wifi            *Wifi     `protobuf:"bytes,6,opt,name=wifi,proto3" json:"wifi,omitempty"`
	Touch           *Touch    `protobuf:"bytes,7,opt,name=touch,proto3" json:"touch,omitempty"`
	// e.g: "att", "verizon",.. It's a manual label set by lab, varies dut by dut.
	Carrier string `protobuf:"bytes,8,opt,name=carrier,proto3" json:"carrier,omitempty"`
	// Indicate if the device is setup in a steady and controllable camera box environment for camera test automation.
	// http://go/cros-camera-box
	Camerabox bool `protobuf:"varint,9,opt,name=camerabox,proto3" json:"camerabox,omitempty"`
	// Indicate if the device is setup in a chaos environment. It's a special settings for running wifi interop tests.
	Chaos bool `protobuf:"varint,10,opt,name=chaos,proto3" json:"chaos,omitempty"`
	// Indicate the cables that connect audio, printer to the device in ACS lab.
	Cable []*Cable `protobuf:"bytes,11,rep,name=cable,proto3" json:"cable,omitempty"`
	// Incompatible upgraded type from bool camerabox=9.
	CameraboxInfo *Camerabox `protobuf:"bytes,12,opt,name=camerabox_info,json=cameraboxInfo,proto3" json:"camerabox_info,omitempty"`
	// Indicate if device is connected to a smart usb hub, detected in AdminRepair task.
	SmartUsbhub          bool     `protobuf:"varint,13,opt,name=smart_usbhub,json=smartUsbhub,proto3" json:"smart_usbhub,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Peripherals proto.InternalMessageInfo

func (m *Peripherals) GetServo() *Servo {
	if m != nil {
		return m.Servo
	}
	return nil
}

func (m *Peripherals) GetChameleon() *Chameleon {
	if m != nil {
		return m.Chameleon
	}
	return nil
}

func (m *Peripherals) GetRpm() *RPM {
	if m != nil {
		return m.Rpm
	}
	return nil
}

func (m *Peripherals) GetConnectedCamera() []*Camera {
	if m != nil {
		return m.ConnectedCamera
	}
	return nil
}

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

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

func (m *Peripherals) GetTouch() *Touch {
	if m != nil {
		return m.Touch
	}
	return nil
}

func (m *Peripherals) GetCarrier() string {
	if m != nil {
		return m.Carrier
	}
	return ""
}

func (m *Peripherals) GetCamerabox() bool {
	if m != nil {
		return m.Camerabox
	}
	return false
}

func (m *Peripherals) GetChaos() bool {
	if m != nil {
		return m.Chaos
	}
	return false
}

func (m *Peripherals) GetCable() []*Cable {
	if m != nil {
		return m.Cable
	}
	return nil
}

func (m *Peripherals) GetCameraboxInfo() *Camerabox {
	if m != nil {
		return m.CameraboxInfo
	}
	return nil
}

func (m *Peripherals) GetSmartUsbhub() bool {
	if m != nil {
		return m.SmartUsbhub
	}
	return false
}

// Remote power management info.
// Next Tag: 3
type RPM struct {
	PowerunitName        string   `protobuf:"bytes,1,opt,name=powerunit_name,json=powerunitName,proto3" json:"powerunit_name,omitempty"`
	PowerunitOutlet      string   `protobuf:"bytes,2,opt,name=powerunit_outlet,json=powerunitOutlet,proto3" json:"powerunit_outlet,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RPM proto.InternalMessageInfo

func (m *RPM) GetPowerunitName() string {
	if m != nil {
		return m.PowerunitName
	}
	return ""
}

func (m *RPM) GetPowerunitOutlet() string {
	if m != nil {
		return m.PowerunitOutlet
	}
	return ""
}

// Next Tag: 2
type Camera struct {
	CameraType           CameraType `protobuf:"varint,1,opt,name=camera_type,json=cameraType,proto3,enum=lab.CameraType" json:"camera_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Camera proto.InternalMessageInfo

func (m *Camera) GetCameraType() CameraType {
	if m != nil {
		return m.CameraType
	}
	return CameraType_CAMERA_INVALID
}

type Cable struct {
	Type                 CableType `protobuf:"varint,1,opt,name=type,proto3,enum=lab.CableType" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_Cable proto.InternalMessageInfo

func (m *Cable) GetType() CableType {
	if m != nil {
		return m.Type
	}
	return CableType_CABLE_INVALID
}

// Next Tag: 3
type Audio struct {
	// Indicate if the DUT is housed in an audio box to record / replay audio
	// for audio testing.
	AudioBox bool `protobuf:"varint,1,opt,name=audio_box,json=audioBox,proto3" json:"audio_box,omitempty"`
	// Indicate if the DUT is connected to Atrus speakermic
	Atrus                bool     `protobuf:"varint,2,opt,name=atrus,proto3" json:"atrus,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Audio proto.InternalMessageInfo

func (m *Audio) GetAudioBox() bool {
	if m != nil {
		return m.AudioBox
	}
	return false
}

func (m *Audio) GetAtrus() bool {
	if m != nil {
		return m.Atrus
	}
	return false
}

// Next Tag: 4
type Wifi struct {
	// Indicate if the device is inside a hermetic wifi cell.
	Wificell    bool                   `protobuf:"varint,1,opt,name=wificell,proto3" json:"wificell,omitempty"`
	AntennaConn Wifi_AntennaConnection `protobuf:"varint,2,opt,name=antenna_conn,json=antennaConn,proto3,enum=lab.Wifi_AntennaConnection" json:"antenna_conn,omitempty"`
	// Indicate if the device is in a pre-setup environment with 802.11ax routers.
	// crbug.com/1044786
	Router               Wifi_Router `protobuf:"varint,3,opt,name=router,proto3,enum=lab.Wifi_Router" json:"router,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_Wifi proto.InternalMessageInfo

func (m *Wifi) GetWificell() bool {
	if m != nil {
		return m.Wificell
	}
	return false
}

func (m *Wifi) GetAntennaConn() Wifi_AntennaConnection {
	if m != nil {
		return m.AntennaConn
	}
	return Wifi_CONN_UNKNOWN
}

func (m *Wifi) GetRouter() Wifi_Router {
	if m != nil {
		return m.Router
	}
	return Wifi_ROUTER_UNSPECIFIED
}

// Next Tag: 2
type Touch struct {
	// Has touch monitor mimo.
	Mimo                 bool     `protobuf:"varint,1,opt,name=mimo,proto3" json:"mimo,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Touch proto.InternalMessageInfo

func (m *Touch) GetMimo() bool {
	if m != nil {
		return m.Mimo
	}
	return false
}

// Next Tag: 2
type Camerabox struct {
	Facing               Camerabox_Facing `protobuf:"varint,1,opt,name=facing,proto3,enum=lab.Camerabox_Facing" json:"facing,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_Camerabox proto.InternalMessageInfo

func (m *Camerabox) GetFacing() Camerabox_Facing {
	if m != nil {
		return m.Facing
	}
	return Camerabox_FACING_UNKNOWN
}

func init() {
	proto.RegisterEnum("lab.CameraType", CameraType_name, CameraType_value)
	proto.RegisterEnum("lab.CableType", CableType_name, CableType_value)
	proto.RegisterEnum("lab.Wifi_AntennaConnection", Wifi_AntennaConnection_name, Wifi_AntennaConnection_value)
	proto.RegisterEnum("lab.Wifi_Router", Wifi_Router_name, Wifi_Router_value)
	proto.RegisterEnum("lab.Camerabox_Facing", Camerabox_Facing_name, Camerabox_Facing_value)
	proto.RegisterType((*Peripherals)(nil), "lab.Peripherals")
	proto.RegisterType((*RPM)(nil), "lab.RPM")
	proto.RegisterType((*Camera)(nil), "lab.Camera")
	proto.RegisterType((*Cable)(nil), "lab.Cable")
	proto.RegisterType((*Audio)(nil), "lab.Audio")
	proto.RegisterType((*Wifi)(nil), "lab.Wifi")
	proto.RegisterType((*Touch)(nil), "lab.Touch")
	proto.RegisterType((*Camerabox)(nil), "lab.Camerabox")
}

func init() { proto.RegisterFile("lab/peripherals.proto", fileDescriptor_3da5da8c71ea9e2e) }

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