// Code generated by protoc-gen-go. DO NOT EDIT.
// source: go.chromium.org/luci/dm/api/service/v1/walk_graph.proto

package dm

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

// Direction indicates that direction of dependencies that the request should
// walk.
type WalkGraphReq_Mode_Direction int32

const (
	WalkGraphReq_Mode_FORWARDS  WalkGraphReq_Mode_Direction = 0
	WalkGraphReq_Mode_BACKWARDS WalkGraphReq_Mode_Direction = 1
	WalkGraphReq_Mode_BOTH      WalkGraphReq_Mode_Direction = 2
)

var WalkGraphReq_Mode_Direction_name = map[int32]string{
	0: "FORWARDS",
	1: "BACKWARDS",
	2: "BOTH",
}

var WalkGraphReq_Mode_Direction_value = map[string]int32{
	"FORWARDS":  0,
	"BACKWARDS": 1,
	"BOTH":      2,
}

func (x WalkGraphReq_Mode_Direction) String() string {
	return proto.EnumName(WalkGraphReq_Mode_Direction_name, int32(x))
}

func (WalkGraphReq_Mode_Direction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_0ff1922d0e189b66, []int{0, 0, 0}
}

// WalkGraphReq allows you to walk from one or more Quests through their
// Attempt's forward dependencies.
//
//
// The handler will evaluate all of the queries, executing them in parallel.
// For each attempt or quest produced by the query, it will queue a walk
// operation for that node, respecting the options set (max_depth, etc.).
type WalkGraphReq struct {
	// Optional. See Include.AttemptResult for restrictions.
	Auth *Execution_Auth `protobuf:"bytes,1,opt,name=auth,proto3" json:"auth,omitempty"`
	// Query specifies a list of queries to start the graph traversal on. The
	// traversal will occur as a union of the query results. Redundant
	// specification will not cause additional heavy work; every graph node will
	// be processed exactly once, regardless of how many times it appears in the
	// query results. However, redundancy in the queries will cause the server to
	// retrieve and discard more information.
	Query *GraphQuery         `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"`
	Mode  *WalkGraphReq_Mode  `protobuf:"bytes,3,opt,name=mode,proto3" json:"mode,omitempty"`
	Limit *WalkGraphReq_Limit `protobuf:"bytes,4,opt,name=limit,proto3" json:"limit,omitempty"`
	// Include allows you to add additional information to the returned
	// GraphData which is typically medium-to-large sized.
	Include              *WalkGraphReq_Include `protobuf:"bytes,5,opt,name=include,proto3" json:"include,omitempty"`
	Exclude              *WalkGraphReq_Exclude `protobuf:"bytes,6,opt,name=exclude,proto3" json:"exclude,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_WalkGraphReq proto.InternalMessageInfo

func (m *WalkGraphReq) GetAuth() *Execution_Auth {
	if m != nil {
		return m.Auth
	}
	return nil
}

func (m *WalkGraphReq) GetQuery() *GraphQuery {
	if m != nil {
		return m.Query
	}
	return nil
}

func (m *WalkGraphReq) GetMode() *WalkGraphReq_Mode {
	if m != nil {
		return m.Mode
	}
	return nil
}

func (m *WalkGraphReq) GetLimit() *WalkGraphReq_Limit {
	if m != nil {
		return m.Limit
	}
	return nil
}

func (m *WalkGraphReq) GetInclude() *WalkGraphReq_Include {
	if m != nil {
		return m.Include
	}
	return nil
}

func (m *WalkGraphReq) GetExclude() *WalkGraphReq_Exclude {
	if m != nil {
		return m.Exclude
	}
	return nil
}

type WalkGraphReq_Mode struct {
	// DFS sets whether this is a Depth-first (ish) or a Breadth-first (ish) load.
	// Since the load operation is multi-threaded, the search order is best
	// effort, but will actually be some hybrid between DFS and BFS. This setting
	// controls the bias direction of the hybrid loading algorithm.
	Dfs                  bool                        `protobuf:"varint,1,opt,name=dfs,proto3" json:"dfs,omitempty"`
	Direction            WalkGraphReq_Mode_Direction `protobuf:"varint,2,opt,name=direction,proto3,enum=dm.WalkGraphReq_Mode_Direction" json:"direction,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_WalkGraphReq_Mode proto.InternalMessageInfo

func (m *WalkGraphReq_Mode) GetDfs() bool {
	if m != nil {
		return m.Dfs
	}
	return false
}

func (m *WalkGraphReq_Mode) GetDirection() WalkGraphReq_Mode_Direction {
	if m != nil {
		return m.Direction
	}
	return WalkGraphReq_Mode_FORWARDS
}

type WalkGraphReq_Limit struct {
	// MaxDepth sets the number of attempts to traverse; 0 means 'immediate'
	// (no dependencies), -1 means 'no limit', and >0 is a limit.
	//
	// Any negative value besides -1 is an error.
	MaxDepth int64 `protobuf:"varint,1,opt,name=max_depth,json=maxDepth,proto3" json:"max_depth,omitempty"`
	// MaxTime sets the maximum amount of time that the query processor should
	// take. Application of this deadline is 'best effort', which means the query
	// may take a bit longer than this timeout and still attempt to return data.
	//
	// This is different than the grpc timeout header, which will set a hard
	// deadline for the request.
	MaxTime *duration.Duration `protobuf:"bytes,2,opt,name=max_time,json=maxTime,proto3" json:"max_time,omitempty"`
	// MaxDataSize sets the maximum amount of 'Data' (in bytes) that can be
	// returned, if include.quest_data, include.attempt_data, and/or
	// include.attempt_result are set. If this limit is hit, then the
	// appropriate 'partial' value will be set for that object, but the base
	// object would still be included in the result.
	//
	// If this limit is 0, a default limit of 16MB will be used. If this limit
	// exceeds 30MB, it will be reduced to 30MB.
	MaxDataSize          uint32   `protobuf:"varint,3,opt,name=max_data_size,json=maxDataSize,proto3" json:"max_data_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_WalkGraphReq_Limit proto.InternalMessageInfo

func (m *WalkGraphReq_Limit) GetMaxDepth() int64 {
	if m != nil {
		return m.MaxDepth
	}
	return 0
}

func (m *WalkGraphReq_Limit) GetMaxTime() *duration.Duration {
	if m != nil {
		return m.MaxTime
	}
	return nil
}

func (m *WalkGraphReq_Limit) GetMaxDataSize() uint32 {
	if m != nil {
		return m.MaxDataSize
	}
	return 0
}

type WalkGraphReq_Include struct {
	Quest     *WalkGraphReq_Include_Options `protobuf:"bytes,1,opt,name=quest,proto3" json:"quest,omitempty"`
	Attempt   *WalkGraphReq_Include_Options `protobuf:"bytes,2,opt,name=attempt,proto3" json:"attempt,omitempty"`
	Execution *WalkGraphReq_Include_Options `protobuf:"bytes,3,opt,name=execution,proto3" json:"execution,omitempty"`
	// Executions is the number of Executions to include per Attempt. If this
	// is 0, then the execution data will be omitted completely.
	//
	// Executions included are from high ids to low ids. So setting this to `1`
	// would return the LAST execution made for this Attempt.
	NumExecutions uint32 `protobuf:"varint,4,opt,name=num_executions,json=numExecutions,proto3" json:"num_executions,omitempty"`
	// FwdDeps instructs WalkGraph to include forward dependency information
	// from the result. This only changes the presence of information in the
	// result; if the query is walking forward attempt dependencies, that will
	// still occur even if this is false.
	FwdDeps bool `protobuf:"varint,5,opt,name=fwd_deps,json=fwdDeps,proto3" json:"fwd_deps,omitempty"`
	// BackDeps instructs WalkGraph to include the backwards dependency
	// information. This only changes the presence of information in the result;
	// if the query is walking backward attempt dependencies, that will still
	// occur even if this is false.
	BackDeps             bool     `protobuf:"varint,6,opt,name=back_deps,json=backDeps,proto3" json:"back_deps,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_WalkGraphReq_Include proto.InternalMessageInfo

func (m *WalkGraphReq_Include) GetQuest() *WalkGraphReq_Include_Options {
	if m != nil {
		return m.Quest
	}
	return nil
}

func (m *WalkGraphReq_Include) GetAttempt() *WalkGraphReq_Include_Options {
	if m != nil {
		return m.Attempt
	}
	return nil
}

func (m *WalkGraphReq_Include) GetExecution() *WalkGraphReq_Include_Options {
	if m != nil {
		return m.Execution
	}
	return nil
}

func (m *WalkGraphReq_Include) GetNumExecutions() uint32 {
	if m != nil {
		return m.NumExecutions
	}
	return 0
}

func (m *WalkGraphReq_Include) GetFwdDeps() bool {
	if m != nil {
		return m.FwdDeps
	}
	return false
}

func (m *WalkGraphReq_Include) GetBackDeps() bool {
	if m != nil {
		return m.BackDeps
	}
	return false
}

type WalkGraphReq_Include_Options struct {
	// Fills the 'id' field.
	//
	// If this is false, it will be omitted.
	//
	// Note that there's enough information contextually to derive these ids
	// on the client side, though it can be handy to have the server produce
	// them for you.
	Ids bool `protobuf:"varint,1,opt,name=ids,proto3" json:"ids,omitempty"`
	// Instructs the request to include the Data field
	Data bool `protobuf:"varint,2,opt,name=data,proto3" json:"data,omitempty"`
	// Instructs finished objects to include the Result field.
	//
	// If the requestor is an execution, the query logic will only include the
	// result if the execution's Attempt depends on it, otherwise it will be
	// blank.
	//
	// If the request's cumulative result data would be more than
	// limit.max_data_size of data, the remaining results will have their
	// Partial.Result set to DATA_SIZE_LIMIT.
	//
	// Has no effect for Quests.
	Result bool `protobuf:"varint,3,opt,name=result,proto3" json:"result,omitempty"`
	// If set to true, objects with an abnormal termination will be included.
	Abnormal bool `protobuf:"varint,4,opt,name=abnormal,proto3" json:"abnormal,omitempty"`
	// If set to true, expired objects will be included.
	Expired              bool     `protobuf:"varint,5,opt,name=expired,proto3" json:"expired,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_WalkGraphReq_Include_Options proto.InternalMessageInfo

func (m *WalkGraphReq_Include_Options) GetIds() bool {
	if m != nil {
		return m.Ids
	}
	return false
}

func (m *WalkGraphReq_Include_Options) GetData() bool {
	if m != nil {
		return m.Data
	}
	return false
}

func (m *WalkGraphReq_Include_Options) GetResult() bool {
	if m != nil {
		return m.Result
	}
	return false
}

func (m *WalkGraphReq_Include_Options) GetAbnormal() bool {
	if m != nil {
		return m.Abnormal
	}
	return false
}

func (m *WalkGraphReq_Include_Options) GetExpired() bool {
	if m != nil {
		return m.Expired
	}
	return false
}

type WalkGraphReq_Exclude struct {
	// Do not include data from the following quests in the response.
	Quests []string `protobuf:"bytes,1,rep,name=quests,proto3" json:"quests,omitempty"`
	// Do not include data from the following attempts in the response.
	Attempts             *AttemptList `protobuf:"bytes,2,opt,name=attempts,proto3" json:"attempts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_WalkGraphReq_Exclude proto.InternalMessageInfo

func (m *WalkGraphReq_Exclude) GetQuests() []string {
	if m != nil {
		return m.Quests
	}
	return nil
}

func (m *WalkGraphReq_Exclude) GetAttempts() *AttemptList {
	if m != nil {
		return m.Attempts
	}
	return nil
}

func init() {
	proto.RegisterEnum("dm.WalkGraphReq_Mode_Direction", WalkGraphReq_Mode_Direction_name, WalkGraphReq_Mode_Direction_value)
	proto.RegisterType((*WalkGraphReq)(nil), "dm.WalkGraphReq")
	proto.RegisterType((*WalkGraphReq_Mode)(nil), "dm.WalkGraphReq.Mode")
	proto.RegisterType((*WalkGraphReq_Limit)(nil), "dm.WalkGraphReq.Limit")
	proto.RegisterType((*WalkGraphReq_Include)(nil), "dm.WalkGraphReq.Include")
	proto.RegisterType((*WalkGraphReq_Include_Options)(nil), "dm.WalkGraphReq.Include.Options")
	proto.RegisterType((*WalkGraphReq_Exclude)(nil), "dm.WalkGraphReq.Exclude")
}

func init() {
	proto.RegisterFile("go.chromium.org/luci/dm/api/service/v1/walk_graph.proto", fileDescriptor_0ff1922d0e189b66)
}

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