// Code generated by protoc-gen-go. DO NOT EDIT.
// source: go.chromium.org/luci/buildbucket/proto/config/project_config.proto

package configpb

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

// Toggle is a boolean with an extra state UNSET.
// When protobuf messages are merged, UNSET does not overwrite an existing
// value.
// TODO(nodir): replace with Trinary in ../common.proto.
type Toggle int32

const (
	Toggle_UNSET Toggle = 0
	Toggle_YES   Toggle = 1
	Toggle_NO    Toggle = 2
)

var Toggle_name = map[int32]string{
	0: "UNSET",
	1: "YES",
	2: "NO",
}

var Toggle_value = map[string]int32{
	"UNSET": 0,
	"YES":   1,
	"NO":    2,
}

func (x Toggle) String() string {
	return proto.EnumName(Toggle_name, int32(x))
}

func (Toggle) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_90cd2cb373fa8af0, []int{0}
}

// A buiildbucket user role.
// Defines what a user can do.
//
// The order of enum member tags is important.
// A role with a higher tag number can perform any action that a role with a
// lower tag number can perform.
type Acl_Role int32

const (
	// Can do read-only operations, such as search for builds.
	Acl_READER Acl_Role = 0
	// Same as READER + can schedule and cancel builds.
	Acl_SCHEDULER Acl_Role = 1
	// Can do all write operations.
	Acl_WRITER Acl_Role = 2
)

var Acl_Role_name = map[int32]string{
	0: "READER",
	1: "SCHEDULER",
	2: "WRITER",
}

var Acl_Role_value = map[string]int32{
	"READER":    0,
	"SCHEDULER": 1,
	"WRITER":    2,
}

func (x Acl_Role) String() string {
	return proto.EnumName(Acl_Role_name, int32(x))
}

func (Acl_Role) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_90cd2cb373fa8af0, []int{0, 0}
}

// A single access control rule.
type Acl struct {
	// Role denotes a list of actions that an identity can perform.
	Role Acl_Role `protobuf:"varint,1,opt,name=role,proto3,enum=buildbucket.Acl_Role" json:"role,omitempty"`
	// Name of the group defined in the auth service.
	Group string `protobuf:"bytes,2,opt,name=group,proto3" json:"group,omitempty"`
	// An email address or a full identity string "kind:name". See auth service
	// on kinds of identities. Anonymous users are "anonymous:anonymous".
	// Either identity or group must be present, not both.
	Identity             string   `protobuf:"bytes,3,opt,name=identity,proto3" json:"identity,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Acl proto.InternalMessageInfo

func (m *Acl) GetRole() Acl_Role {
	if m != nil {
		return m.Role
	}
	return Acl_READER
}

func (m *Acl) GetGroup() string {
	if m != nil {
		return m.Group
	}
	return ""
}

func (m *Acl) GetIdentity() string {
	if m != nil {
		return m.Identity
	}
	return ""
}

// A set of Acl messages. Can be referenced in a bucket by name.
type AclSet struct {
	// A name of the ACL set. Required. Must match regex '^[a-z0-9_]+$'.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// List of access control rules.
	// The order does not matter.
	Acls                 []*Acl   `protobuf:"bytes,2,rep,name=acls,proto3" json:"acls,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AclSet proto.InternalMessageInfo

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

func (m *AclSet) GetAcls() []*Acl {
	if m != nil {
		return m.Acls
	}
	return nil
}

// Defines a swarmbucket builder or a builder mixin. A builder has a name, a
// category and specifies what should happen if a build is scheduled to that
// builder.
//
// SECURITY WARNING: if adding more fields to this message, keep in mind that
// a user that has permissions to schedule a build to the bucket, can override
// this config.
//
// Next tag: 23.
type Builder struct {
	// Name of the builder or builder mixin.
	//
	// If a builder name, will be propagated to "builder" build tag and
	// "buildername" recipe property.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Hostname of the swarming instance, e.g. "chromium-swarm.appspot.com".
	// Required, but defaults to deprecated Swarming.hostname.
	SwarmingHost string `protobuf:"bytes,21,opt,name=swarming_host,json=swarmingHost,proto3" json:"swarming_host,omitempty"`
	// Names of mixins to apply to this builder definition.
	//
	// FLATTENING
	//
	// Final builder/mixin values are computed as follows:
	// - start with an empty builder definition.
	// - if this is a builder, apply values in a bucket's builder_defaults,
	//   flattened in advance.
	// - apply each mixin, flattened in advance, in the same order.
	// - apply values in this builder/mixin.
	//
	// EXAMPLE
	//
	//   A definition
	//
	//     builder_mixins {
	//       name: "foo"
	//       dimensions: "os:Linux"
	//       dimensions: "cpu:x86"
	//       recipe {
	//         repository: "https://example.com"
	//         name: "x"
	//       }
	//     }
	//     builder_mixins {
	//       name: "bar"
	//       dimensions: "cores:8"
	//       dimensions: "cpu:x86-64"
	//     }
	//     bucket {
	//       name: "luci.x.try"
	//       swarming {
	//         builders {
	//           name: "release"
	//           mixins: "foo"
	//           mixins: "bar"
	//           recipe {
	//             name: "y"
	//           }
	//         }
	//       }
	//     }
	//
	//   is equivalent to
	//
	//     bucket {
	//      name: "luci.x.try"
	//      swarming {
	//         builders {
	//           name: "release"
	//           dimensions: "os:Linux"
	//           dimensions: "cpu:x86-64"
	//           dimensions: "cores:8"
	//           recipe {
	//             repository: "https://example.com"
	//             name: "y"
	//           }
	//         }
	//       }
	//     }
	//
	// A NOTE ON DIAMOND MERGES
	//
	// Given
	//   B mixes in A and overrides some values defined in A
	//   C mixes in A
	//   D mixes in B and C
	// B's overrides won't affect D because D mixes in C after B.
	//
	//   builder_mixins {
	//     name: "A"
	//     dimensions: "dim:a"
	//   }
	//   builder_mixins {
	//     name: "B"
	//     mixins: "A"
	//     dimensions: "dim:b"
	//   }
	//   builder_mixins {
	//     name: "C"
	//     mixins: "A"
	//   }
	//   ...
	//   builders {
	//     name: "D"
	//     mixins: "B"
	//     mixins: "C"
	//   }
	//
	// D's dim will be "a", not "b" because it is "a" in C which is applied after
	// B.
	//
	// OTHER
	//
	// Circular references are prohibited.
	Mixins []string `protobuf:"bytes,10,rep,name=mixins,proto3" json:"mixins,omitempty"`
	// Builder category. Will be used for visual grouping, for example in Code Review.
	Category string `protobuf:"bytes,6,opt,name=category,proto3" json:"category,omitempty"`
	// Will be become to swarming task tags.
	// Each tag will end up in "swarming_tag" buildbucket tag, for example
	// "swarming_tag:builder:release"
	SwarmingTags []string `protobuf:"bytes,2,rep,name=swarming_tags,json=swarmingTags,proto3" json:"swarming_tags,omitempty"`
	// A requirement for a bot to execute the build.
	//
	// Supports 3 forms:
	// - "<key>:" - exclude the defaults for the key.
	//   Mutually exclusive with other forms.
	// - "<key>:<value>" - require a bot with this dimension.
	//   This is a shortcut for "0:<key>:<value>", see below.
	// - "<expiration_secs>:<key>:<value>" - wait for up to expiration_secs.
	//   for a bot with the dimension.
	//   Supports mutliple values for different keys and expiration_secs.
	//   expiration_secs must be a multiple of 60.
	//
	// When merging a set of dimensions S1 into S2, all dimensions in S1 with a
	// key K replace all dimensions in S2 with K. This logic is used when applying
	// builder mixins and dimensions specified in a build request.
	//
	// If this builder is defined in a bucket, dimension "pool" is defaulted
	// to the name of the bucket. See Bucket message below.
	Dimensions []string `protobuf:"bytes,3,rep,name=dimensions,proto3" json:"dimensions,omitempty"`
	// Specifies that a recipe to run.
	Recipe *Builder_Recipe `protobuf:"bytes,4,opt,name=recipe,proto3" json:"recipe,omitempty"`
	// Swarming task priority.
	Priority uint32 `protobuf:"varint,5,opt,name=priority,proto3" json:"priority,omitempty"`
	// Maximum build execution time. Not to be confused with pending time.
	ExecutionTimeoutSecs uint32 `protobuf:"varint,7,opt,name=execution_timeout_secs,json=executionTimeoutSecs,proto3" json:"execution_timeout_secs,omitempty"`
	// Maximum build pending time.
	ExpirationSecs uint32 `protobuf:"varint,20,opt,name=expiration_secs,json=expirationSecs,proto3" json:"expiration_secs,omitempty"`
	// Caches that should be present on the bot.
	Caches []*Builder_CacheEntry `protobuf:"bytes,9,rep,name=caches,proto3" json:"caches,omitempty"`
	// If YES, generate monotonically increasing contiguous numbers for each
	// build, unique within the builder.
	// Note: this limits the build creation rate in this builder to 5 per second.
	BuildNumbers Toggle `protobuf:"varint,16,opt,name=build_numbers,json=buildNumbers,proto3,enum=buildbucket.Toggle" json:"build_numbers,omitempty"`
	// Email of a service account to run the build as or literal 'bot' string to
	// use Swarming bot's account (if available). Passed directly to Swarming.
	// Subject to Swarming's ACLs.
	ServiceAccount string `protobuf:"bytes,12,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"`
	// If YES, each builder will get extra dimension "builder:<builder name>"
	// added. Default is UNSET.
	//
	// For example, this config
	//
	//   builder {
	//     name: "linux-compiler"
	//     dimension: "builder:linux-compiler"
	//   }
	//
	// is equivalent to this:
	//
	//   builders {
	//     name: "linux-compiler"
	//     auto_builder_dimension: YES
	//   }
	//
	// We've considered providing interpolation like this
	//   builder_defaults {
	//     dimensions: "builder:${BUILDER}"
	//   }
	// (see also http://docs.buildbot.net/0.8.9/manual/cfg-properties.html#interpolate)
	// but are currently against complicating config with this.
	AutoBuilderDimension Toggle `protobuf:"varint,17,opt,name=auto_builder_dimension,json=autoBuilderDimension,proto3,enum=buildbucket.Toggle" json:"auto_builder_dimension,omitempty"`
	// If YES, by default a new build in this builder will be marked as
	// experimental.
	// This is useful for inherently experimental builders that use production
	// recipes.
	// See also luci_migration_host field.
	Experimental Toggle `protobuf:"varint,18,opt,name=experimental,proto3,enum=buildbucket.Toggle" json:"experimental,omitempty"`
	// If not empty and not "-", and a build request is not marked as
	// experimental/prod explicitly and has "mastername" property, buildbucket
	// will contact this instance of luci-migration app to determine whether the
	// builder is experimental.
	// On success, this takes precedence over Builder.experimental proto field
	// (above).
	//
	// Special value "-" means no luci_migration_host specified.
	// Useful in a builder that wants to override luci_migration_host
	// specified in builder_defaults or mixin.
	LuciMigrationHost string `protobuf:"bytes,19,opt,name=luci_migration_host,json=luciMigrationHost,proto3" json:"luci_migration_host,omitempty"`
	// Percentage of builds that should use a canary swarming task template.
	// A value from 0 to 100.
	// If omitted, a global server-defined default percentage is used.
	TaskTemplateCanaryPercentage *wrappers.UInt32Value `protobuf:"bytes,22,opt,name=task_template_canary_percentage,json=taskTemplateCanaryPercentage,proto3" json:"task_template_canary_percentage,omitempty"`
	XXX_NoUnkeyedLiteral         struct{}              `json:"-"`
	XXX_unrecognized             []byte                `json:"-"`
	XXX_sizecache                int32                 `json:"-"`
}

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

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

var xxx_messageInfo_Builder proto.InternalMessageInfo

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

func (m *Builder) GetSwarmingHost() string {
	if m != nil {
		return m.SwarmingHost
	}
	return ""
}

func (m *Builder) GetMixins() []string {
	if m != nil {
		return m.Mixins
	}
	return nil
}

func (m *Builder) GetCategory() string {
	if m != nil {
		return m.Category
	}
	return ""
}

func (m *Builder) GetSwarmingTags() []string {
	if m != nil {
		return m.SwarmingTags
	}
	return nil
}

func (m *Builder) GetDimensions() []string {
	if m != nil {
		return m.Dimensions
	}
	return nil
}

func (m *Builder) GetRecipe() *Builder_Recipe {
	if m != nil {
		return m.Recipe
	}
	return nil
}

func (m *Builder) GetPriority() uint32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *Builder) GetExecutionTimeoutSecs() uint32 {
	if m != nil {
		return m.ExecutionTimeoutSecs
	}
	return 0
}

func (m *Builder) GetExpirationSecs() uint32 {
	if m != nil {
		return m.ExpirationSecs
	}
	return 0
}

func (m *Builder) GetCaches() []*Builder_CacheEntry {
	if m != nil {
		return m.Caches
	}
	return nil
}

func (m *Builder) GetBuildNumbers() Toggle {
	if m != nil {
		return m.BuildNumbers
	}
	return Toggle_UNSET
}

func (m *Builder) GetServiceAccount() string {
	if m != nil {
		return m.ServiceAccount
	}
	return ""
}

func (m *Builder) GetAutoBuilderDimension() Toggle {
	if m != nil {
		return m.AutoBuilderDimension
	}
	return Toggle_UNSET
}

func (m *Builder) GetExperimental() Toggle {
	if m != nil {
		return m.Experimental
	}
	return Toggle_UNSET
}

func (m *Builder) GetLuciMigrationHost() string {
	if m != nil {
		return m.LuciMigrationHost
	}
	return ""
}

func (m *Builder) GetTaskTemplateCanaryPercentage() *wrappers.UInt32Value {
	if m != nil {
		return m.TaskTemplateCanaryPercentage
	}
	return nil
}

// Describes a cache directory persisted on a bot.
//
// If a build requested a cache, a cache directory is available on build
// startup. If the cache was present on the bot, the directory contains files
// from the previous run.
// The build can read/write to the cache directory while it runs.
// After build completes, the cache directory is persisted.
// Next time another build requests the same cache and runs on the same bot,
// if the cache wasn't evicted, the files will still be there.
//
// One bot can keep multiple caches at the same time and one build can request
// multiple different caches.
// A cache is identified by its name and mapped to a path.
// In recipes-based builds, the path is relative to api.paths['cache'] dir.
// For example, a cache {"name": "foo", "path": "bar"} maps foo to bar and
// the cache dir is available at
//   my_cache = api.path['cache'].join('bar')
//
// If the bot is running out of space, caches are evicted in LRU manner.
//
// Renaming a cache is equivalent to clearing it from the builder perspective.
// The files will still be there, but eventually will be purged by GC.
//
// Builder cache.
//
// Buildbucket implicitly declares cache
//   {"name": "<hash(bucket/builder)>", "path": "builder"}.
// This means that any LUCI builder has a "personal disk space" on the bot.
// Builder cache is often a good start before customizing caching.
// In recipes, it is available at api.path['cache'].join('builder').
//
// In order to share the builder cache among multiple builders, it can be
// overridden:
//
//   builders {
//     name: "a"
//     caches {
//       path: "builder"
//       name: "my_shared_cache"
//     }
//   }
//   builders {
//     name: "b"
//     caches {
//       path: "builder"
//       name: "my_shared_cache"
//     }
//   }
//
// Builders "a" and "b" share their builder cache. If an "a" build ran on a bot
// and left some files in the builder cache and then a "b" build runs on the
// same bot, the same files will be available in the builder cache.
type Builder_CacheEntry struct {
	// Identifier of the cache. Required. Length is limited to 128.
	//
	// If the pool of swarming bots is shared among multiple LUCI projects and
	// projects use same cache name, the cache will be shared across projects.
	// To avoid affecting and being affected by other projects, prefix the cache
	// name with something project-specific, e.g. "v8-".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Relative path where the cache in mapped into. Required.
	// Must use POSIX format (forward slashes).
	// In most cases, it does not need slashes at all.
	// Must be unique in the given builder.
	Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
	// Number of seconds to wait for a bot with a warm cache to pick up the
	// task, before falling back to a bot with a cold (non-existent) cache.
	//
	// The default is 0, which means that no preference will be chosen for a bot
	// with this or without this cache, and a bot without this cache may be
	// chosen instead.
	//
	// If no bot has this cache warm, the task will skip this wait and will
	// immediately fallback to a cold cache request.
	//
	// The value must be multiples of 60 seconds.
	WaitForWarmCacheSecs int32    `protobuf:"varint,3,opt,name=wait_for_warm_cache_secs,json=waitForWarmCacheSecs,proto3" json:"wait_for_warm_cache_secs,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Builder_CacheEntry proto.InternalMessageInfo

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

func (m *Builder_CacheEntry) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Builder_CacheEntry) GetWaitForWarmCacheSecs() int32 {
	if m != nil {
		return m.WaitForWarmCacheSecs
	}
	return 0
}

// Specifies a recipe to run.
type Builder_Recipe struct {
	// Repository URL of the recipe package.
	// Value "-" is treated as unset.
	Repository string `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"`
	// Name of the recipe to run.
	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	// If set, will use CIPD to fetch the recipes, rather than using git. This
	// obsoletes the `repository` parameter.
	//
	// Typically the package will look like:
	//
	//   infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build
	//
	// Recipes bundled from internal repositories are typically under
	// `infra_internal/recipe_bundles/...`.
	//
	// But if you're building your own recipe bundles, they could be located
	// elsewhere.
	CipdPackage string `protobuf:"bytes,6,opt,name=cipd_package,json=cipdPackage,proto3" json:"cipd_package,omitempty"`
	// The CIPD version to fetch. This can be a lower-cased git ref (like
	// `refs/heads/master` or `head`), or it can be a cipd tag (like
	// `git_revision:dead...beef`).
	//
	// The default is `head`, which corresponds to the git repo's HEAD ref. This
	// is typically (but not always) a symbolic ref for `refs/heads/master`.
	CipdVersion string `protobuf:"bytes,5,opt,name=cipd_version,json=cipdVersion,proto3" json:"cipd_version,omitempty"`
	// Colon-separated build properties to set.
	// A property can be overriden by "properties" build parameter.
	//
	// Use this field for string properties and use properties_j for other
	// types.
	Properties []string `protobuf:"bytes,3,rep,name=properties,proto3" json:"properties,omitempty"`
	// Same as properties, but the value must valid JSON. For example
	//   properties_j: "a:1"
	// means property a is a number 1, not string "1".
	//
	// If null, it means no property must be defined. In particular, it removes
	// a default value for the property, if any.
	//
	// Fields properties and properties_j can be used together, but cannot both
	// specify values for same property.
	PropertiesJ          []string `protobuf:"bytes,4,rep,name=properties_j,json=propertiesJ,proto3" json:"properties_j,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Builder_Recipe proto.InternalMessageInfo

func (m *Builder_Recipe) GetRepository() string {
	if m != nil {
		return m.Repository
	}
	return ""
}

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

func (m *Builder_Recipe) GetCipdPackage() string {
	if m != nil {
		return m.CipdPackage
	}
	return ""
}

func (m *Builder_Recipe) GetCipdVersion() string {
	if m != nil {
		return m.CipdVersion
	}
	return ""
}

func (m *Builder_Recipe) GetProperties() []string {
	if m != nil {
		return m.Properties
	}
	return nil
}

func (m *Builder_Recipe) GetPropertiesJ() []string {
	if m != nil {
		return m.PropertiesJ
	}
	return nil
}

// Configuration of buildbucket-swarming integration for one bucket.
type Swarming struct {
	// DEPERECATED. Use builder_defaults.swarming_host instead.
	// Setting this fields sets builder_defaults.swarming_host.
	Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"`
	// DEPRECATED, IGNORED.
	// Used to generate a URL for Build, may contain parameters
	// {swarming_hostname}, {task_id}, {bucket} and {builder}. Defaults to:
	// https://{swarming_hostname}/user/task/{task_id}
	UrlFormat string `protobuf:"bytes,2,opt,name=url_format,json=urlFormat,proto3" json:"url_format,omitempty"`
	// Defines default values for builders.
	BuilderDefaults *Builder `protobuf:"bytes,3,opt,name=builder_defaults,json=builderDefaults,proto3" json:"builder_defaults,omitempty"`
	// Configuration for each builder.
	// Swarming tasks are created only for builds for builders that are not
	// explicitly specified.
	Builders []*Builder `protobuf:"bytes,4,rep,name=builders,proto3" json:"builders,omitempty"`
	// DEPRECATED. Use builder_defaults.task_template_canary_percentage instead.
	// Setting this field sets builder_defaults.task_template_canary_percentage.
	TaskTemplateCanaryPercentage *wrappers.UInt32Value `protobuf:"bytes,5,opt,name=task_template_canary_percentage,json=taskTemplateCanaryPercentage,proto3" json:"task_template_canary_percentage,omitempty"`
	XXX_NoUnkeyedLiteral         struct{}              `json:"-"`
	XXX_unrecognized             []byte                `json:"-"`
	XXX_sizecache                int32                 `json:"-"`
}

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

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

var xxx_messageInfo_Swarming proto.InternalMessageInfo

func (m *Swarming) GetHostname() string {
	if m != nil {
		return m.Hostname
	}
	return ""
}

func (m *Swarming) GetUrlFormat() string {
	if m != nil {
		return m.UrlFormat
	}
	return ""
}

func (m *Swarming) GetBuilderDefaults() *Builder {
	if m != nil {
		return m.BuilderDefaults
	}
	return nil
}

func (m *Swarming) GetBuilders() []*Builder {
	if m != nil {
		return m.Builders
	}
	return nil
}

func (m *Swarming) GetTaskTemplateCanaryPercentage() *wrappers.UInt32Value {
	if m != nil {
		return m.TaskTemplateCanaryPercentage
	}
	return nil
}

// Defines one bucket in buildbucket.cfg
type Bucket struct {
	// Name of the bucket. Names are unique within one instance of buildbucket.
	// If another project already uses this name, a config will be rejected.
	// Name reservation is first-come first-serve.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// List of access control rules for the bucket.
	// The order does not matter.
	Acls []*Acl `protobuf:"bytes,2,rep,name=acls,proto3" json:"acls,omitempty"`
	// A list of ACL set names. Each ACL in each referenced ACL set will be
	// included in this bucket.
	// The order does not matter.
	AclSets []string `protobuf:"bytes,4,rep,name=acl_sets,json=aclSets,proto3" json:"acl_sets,omitempty"`
	// Buildbucket-swarming integration.
	Swarming             *Swarming `protobuf:"bytes,3,opt,name=swarming,proto3" json:"swarming,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_Bucket proto.InternalMessageInfo

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

func (m *Bucket) GetAcls() []*Acl {
	if m != nil {
		return m.Acls
	}
	return nil
}

func (m *Bucket) GetAclSets() []string {
	if m != nil {
		return m.AclSets
	}
	return nil
}

func (m *Bucket) GetSwarming() *Swarming {
	if m != nil {
		return m.Swarming
	}
	return nil
}

// Schema of buildbucket.cfg file, a project config.
type BuildbucketCfg struct {
	// All buckets defined for this project.
	Buckets []*Bucket `protobuf:"bytes,1,rep,name=buckets,proto3" json:"buckets,omitempty"`
	// A list of ACL sets. Names must be unique.
	AclSets []*AclSet `protobuf:"bytes,2,rep,name=acl_sets,json=aclSets,proto3" json:"acl_sets,omitempty"`
	// A list of builder mixin definitions.
	// A mixin can be referenced in any builder defined within the BuildbucketCfg.
	// See also Buider.mixins field.
	BuilderMixins        []*Builder `protobuf:"bytes,3,rep,name=builder_mixins,json=builderMixins,proto3" json:"builder_mixins,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_BuildbucketCfg proto.InternalMessageInfo

func (m *BuildbucketCfg) GetBuckets() []*Bucket {
	if m != nil {
		return m.Buckets
	}
	return nil
}

func (m *BuildbucketCfg) GetAclSets() []*AclSet {
	if m != nil {
		return m.AclSets
	}
	return nil
}

func (m *BuildbucketCfg) GetBuilderMixins() []*Builder {
	if m != nil {
		return m.BuilderMixins
	}
	return nil
}

func init() {
	proto.RegisterEnum("buildbucket.Toggle", Toggle_name, Toggle_value)
	proto.RegisterEnum("buildbucket.Acl_Role", Acl_Role_name, Acl_Role_value)
	proto.RegisterType((*Acl)(nil), "buildbucket.Acl")
	proto.RegisterType((*AclSet)(nil), "buildbucket.AclSet")
	proto.RegisterType((*Builder)(nil), "buildbucket.Builder")
	proto.RegisterType((*Builder_CacheEntry)(nil), "buildbucket.Builder.CacheEntry")
	proto.RegisterType((*Builder_Recipe)(nil), "buildbucket.Builder.Recipe")
	proto.RegisterType((*Swarming)(nil), "buildbucket.Swarming")
	proto.RegisterType((*Bucket)(nil), "buildbucket.Bucket")
	proto.RegisterType((*BuildbucketCfg)(nil), "buildbucket.BuildbucketCfg")
}

func init() {
	proto.RegisterFile("go.chromium.org/luci/buildbucket/proto/config/project_config.proto", fileDescriptor_90cd2cb373fa8af0)
}

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