controller: refactor build inputs to external struct

This patch continues the move to attempt to merge the build.Options
struct into the controllerapi.Options message.

To do this, we extract all the input parameters into a dedicated message
(adding the missing ones, except for the InStream parameter which will
require some additional fiddling around). We also rework the
NamedContexts to allow containing States (by transmitting them as
DefinitionOps), and adding a Linked field to the common options.

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
pull/1861/head
Justin Chadwell 2 years ago committed by CrazyMax
parent ea06685c11
commit 3c3e4a6d5f
No known key found for this signature in database
GPG Key ID: 3248E46B6BB8C7F7

@ -86,38 +86,38 @@ type buildOptions struct {
progress string
quiet bool
builder string
metadataFile string
noCache bool
pull bool
exportPush bool
exportLoad bool
controllerapi.CommonOptions
control.ControlOptions
}
func (o *buildOptions) toControllerOptions() (*controllerapi.BuildOptions, error) {
var err error
opts := controllerapi.BuildOptions{
Allow: o.allow,
BuildArgs: listToMap(o.buildArgs, true),
CgroupParent: o.cgroupParent,
inputs := controllerapi.Inputs{
ContextPath: o.contextPath,
DockerfileName: o.dockerfileName,
ExtraHosts: o.extraHosts,
Labels: listToMap(o.labels, false),
NetworkMode: o.networkMode,
NoCacheFilter: o.noCacheFilter,
Platforms: o.platforms,
ShmSize: int64(o.shmSize),
Tags: o.tags,
Target: o.target,
Ulimits: dockerUlimitToControllerUlimit(o.ulimits),
Builder: o.builder,
NoCache: o.noCache,
Pull: o.pull,
ExportPush: o.exportPush,
ExportLoad: o.exportLoad,
}
inputs.NamedContexts, err = buildflags.ParseContextNames(o.contexts)
if err != nil {
return nil, err
}
opts := controllerapi.BuildOptions{
Inputs: &inputs,
Opts: &o.CommonOptions,
Allow: o.allow,
BuildArgs: listToMap(o.buildArgs, true),
CgroupParent: o.cgroupParent,
ExtraHosts: o.extraHosts,
Labels: listToMap(o.labels, false),
NetworkMode: o.networkMode,
NoCacheFilter: o.noCacheFilter,
Platforms: o.platforms,
ShmSize: int64(o.shmSize),
Tags: o.tags,
Target: o.target,
Ulimits: dockerUlimitToControllerUlimit(o.ulimits),
}
// TODO: extract env var parsing to a method easily usable by library consumers
@ -144,11 +144,6 @@ func (o *buildOptions) toControllerOptions() (*controllerapi.BuildOptions, error
return nil, err
}
opts.NamedContexts, err = buildflags.ParseContextNames(o.contexts)
if err != nil {
return nil, err
}
opts.Exports, err = buildflags.ParseExports(o.outputs)
if err != nil {
return nil, err
@ -228,7 +223,7 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) {
contextPathHash = absContextPath
}
b, err := builder.New(dockerCli,
builder.WithName(options.builder),
builder.WithName(options.Builder),
builder.WithContextPathHash(contextPathHash),
)
if err != nil {
@ -289,8 +284,8 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) {
return errors.Wrap(err, "writing image ID file")
}
}
if options.metadataFile != "" {
if err := writeMetadataFile(options.metadataFile, decodeExporterResponse(resp.ExporterResponse)); err != nil {
if options.MetadataFile != "" {
if err := writeMetadataFile(options.MetadataFile, decodeExporterResponse(resp.ExporterResponse)); err != nil {
return err
}
}
@ -418,15 +413,15 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
Args: cli.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
options.contextPath = args[0]
options.builder = rootOpts.builder
options.metadataFile = cFlags.metadataFile
options.noCache = false
options.Builder = rootOpts.builder
options.MetadataFile = cFlags.metadataFile
options.NoCache = false
if cFlags.noCache != nil {
options.noCache = *cFlags.noCache
options.NoCache = *cFlags.noCache
}
options.pull = false
options.Pull = false
if cFlags.pull != nil {
options.pull = *cFlags.pull
options.Pull = *cFlags.pull
}
options.progress = cFlags.progress
cmd.Flags().VisitAll(checkWarnedFlags)
@ -476,7 +471,7 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
flags.StringArrayVar(&options.labels, "label", []string{}, "Set metadata for an image")
flags.BoolVar(&options.exportLoad, "load", false, `Shorthand for "--output=type=docker"`)
flags.BoolVar(&options.ExportLoad, "load", false, `Shorthand for "--output=type=docker"`)
flags.StringVar(&options.networkMode, "network", "default", `Set the networking mode for the "RUN" instructions during build`)
@ -490,7 +485,7 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
flags.StringVar(&options.printFunc, "print", "", "Print result of information request (e.g., outline, targets) [experimental]")
}
flags.BoolVar(&options.exportPush, "push", false, `Shorthand for "--output=type=registry"`)
flags.BoolVar(&options.ExportPush, "push", false, `Shorthand for "--output=type=registry"`)
flags.BoolVarP(&options.quiet, "quiet", "q", false, "Suppress the build output and print image ID on success")

@ -23,6 +23,7 @@ import (
dockeropts "github.com/docker/cli/opts"
"github.com/docker/go-units"
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/session/auth/authprovider"
"github.com/moby/buildkit/util/grpcerrors"
"github.com/pkg/errors"
@ -37,29 +38,85 @@ const defaultTargetName = "default"
// this function returns it in addition to the error (i.e. it does "return nil, res, err"). The caller can
// inspect the result and debug the cause of that error.
func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.BuildOptions, inStream io.Reader, progress progress.Writer, generateResult bool) (*client.SolveResponse, *build.ResultHandle, error) {
if in.NoCache && len(in.NoCacheFilter) > 0 {
return nil, nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together")
opts, err := ToBuildOpts(in, inStream)
if err != nil {
return nil, nil, err
}
// key string used for kubernetes "sticky" mode
contextPathHash, err := filepath.Abs(in.Inputs.ContextPath)
if err != nil {
contextPathHash = in.Inputs.ContextPath
}
b, err := builder.New(dockerCli,
builder.WithName(in.Opts.Builder),
builder.WithContextPathHash(contextPathHash),
)
if err != nil {
return nil, nil, err
}
if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil {
return nil, nil, errors.Wrapf(err, "failed to update builder last activity time")
}
nodes, err := b.LoadNodes(ctx, false)
if err != nil {
return nil, nil, err
}
resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: *opts}, progress, generateResult)
err = wrapBuildError(err, false)
if err != nil {
return nil, nil, err
}
return resp, res, nil
}
func ToBuildOpts(in controllerapi.BuildOptions, inStream io.Reader) (*build.Options, error) {
if in.Opts.NoCache && len(in.NoCacheFilter) > 0 {
return nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together")
}
var ctxst *llb.State
if in.Inputs.ContextDefinition != nil {
defop, err := llb.NewDefinitionOp(in.Inputs.ContextDefinition)
if err != nil {
return nil, err
}
st := llb.NewState(defop)
ctxst = &st
}
contexts := map[string]build.NamedContext{}
for name, path := range in.NamedContexts {
contexts[name] = build.NamedContext{Path: path}
for name, nctx := range in.Inputs.NamedContexts {
if nctx.Definition != nil {
defop, err := llb.NewDefinitionOp(nctx.Definition)
if err != nil {
return nil, err
}
st := llb.NewState(defop)
contexts[name] = build.NamedContext{State: &st}
} else {
contexts[name] = build.NamedContext{Path: nctx.Path}
}
}
opts := build.Options{
Inputs: build.Inputs{
ContextPath: in.ContextPath,
DockerfilePath: in.DockerfileName,
InStream: inStream,
NamedContexts: contexts,
ContextPath: in.Inputs.ContextPath,
DockerfilePath: in.Inputs.DockerfileName,
DockerfileInline: in.Inputs.DockerfileInline,
ContextState: ctxst,
InStream: inStream,
NamedContexts: contexts,
},
BuildArgs: in.BuildArgs,
ExtraHosts: in.ExtraHosts,
Labels: in.Labels,
NetworkMode: in.NetworkMode,
NoCache: in.NoCache,
NoCache: in.Opts.NoCache,
NoCacheFilter: in.NoCacheFilter,
Pull: in.Pull,
Pull: in.Opts.Pull,
ShmSize: dockeropts.MemBytes(in.ShmSize),
Tags: in.Tags,
Target: in.Target,
@ -68,7 +125,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
platforms, err := platformutil.Parse(in.Platforms)
if err != nil {
return nil, nil, err
return nil, err
}
opts.Platforms = platforms
@ -77,27 +134,27 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
secrets, err := controllerapi.CreateSecrets(in.Secrets)
if err != nil {
return nil, nil, err
return nil, err
}
opts.Session = append(opts.Session, secrets)
sshSpecs := in.SSH
if len(sshSpecs) == 0 && buildflags.IsGitSSH(in.ContextPath) {
if len(sshSpecs) == 0 && buildflags.IsGitSSH(in.Inputs.ContextPath) {
sshSpecs = append(sshSpecs, &controllerapi.SSH{ID: "default"})
}
ssh, err := controllerapi.CreateSSH(sshSpecs)
if err != nil {
return nil, nil, err
return nil, err
}
opts.Session = append(opts.Session, ssh)
outputs, err := controllerapi.CreateExports(in.Exports)
if err != nil {
return nil, nil, err
return nil, err
}
if in.ExportPush {
if in.ExportLoad {
return nil, nil, errors.Errorf("push and load may not be set together at the moment")
if in.Opts.ExportPush {
if in.Opts.ExportLoad {
return nil, errors.Errorf("push and load may not be set together at the moment")
}
if len(outputs) == 0 {
outputs = []client.ExportEntry{{
@ -111,11 +168,11 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
case "image":
outputs[0].Attrs["push"] = "true"
default:
return nil, nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type)
return nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type)
}
}
}
if in.ExportLoad {
if in.Opts.ExportLoad {
if len(outputs) == 0 {
outputs = []client.ExportEntry{{
Type: "docker",
@ -125,7 +182,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
switch outputs[0].Type {
case "docker":
default:
return nil, nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type)
return nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type)
}
}
}
@ -140,7 +197,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
allow, err := buildflags.ParseEntitlements(in.Allow)
if err != nil {
return nil, nil, err
return nil, err
}
opts.Allow = allow
@ -151,35 +208,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
}
}
// key string used for kubernetes "sticky" mode
contextPathHash, err := filepath.Abs(in.ContextPath)
if err != nil {
contextPathHash = in.ContextPath
}
// TODO: this should not be loaded this side of the controller api
b, err := builder.New(dockerCli,
builder.WithName(in.Builder),
builder.WithContextPathHash(contextPathHash),
)
if err != nil {
return nil, nil, err
}
if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil {
return nil, nil, errors.Wrapf(err, "failed to update builder last activity time")
}
nodes, err := b.LoadNodes(ctx, false)
if err != nil {
return nil, nil, err
}
resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: opts}, progress, generateResult)
err = wrapBuildError(err, false)
if err != nil {
// NOTE: buildTargets can return *build.ResultHandle even on error.
return nil, res, err
}
return resp, res, nil
return &opts, nil
}
// buildTargets runs the specified build and returns the result.

@ -8,7 +8,8 @@ import (
fmt "fmt"
proto "github.com/gogo/protobuf/proto"
control "github.com/moby/buildkit/api/services/control"
pb "github.com/moby/buildkit/sourcepolicy/pb"
pb "github.com/moby/buildkit/solver/pb"
pb1 "github.com/moby/buildkit/sourcepolicy/pb"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
@ -270,35 +271,99 @@ func (m *BuildRequest) GetOptions() *BuildOptions {
return nil
}
type Inputs struct {
ContextPath string `protobuf:"bytes,1,opt,name=ContextPath,proto3" json:"ContextPath,omitempty"`
DockerfileName string `protobuf:"bytes,2,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"`
DockerfileInline string `protobuf:"bytes,3,opt,name=DockerfileInline,proto3" json:"DockerfileInline,omitempty"`
ContextDefinition *pb.Definition `protobuf:"bytes,4,opt,name=ContextDefinition,proto3" json:"ContextDefinition,omitempty"`
NamedContexts map[string]*NamedContext `protobuf:"bytes,5,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Inputs) Reset() { *m = Inputs{} }
func (m *Inputs) String() string { return proto.CompactTextString(m) }
func (*Inputs) ProtoMessage() {}
func (*Inputs) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{6}
}
func (m *Inputs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Inputs.Unmarshal(m, b)
}
func (m *Inputs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Inputs.Marshal(b, m, deterministic)
}
func (m *Inputs) XXX_Merge(src proto.Message) {
xxx_messageInfo_Inputs.Merge(m, src)
}
func (m *Inputs) XXX_Size() int {
return xxx_messageInfo_Inputs.Size(m)
}
func (m *Inputs) XXX_DiscardUnknown() {
xxx_messageInfo_Inputs.DiscardUnknown(m)
}
var xxx_messageInfo_Inputs proto.InternalMessageInfo
func (m *Inputs) GetContextPath() string {
if m != nil {
return m.ContextPath
}
return ""
}
func (m *Inputs) GetDockerfileName() string {
if m != nil {
return m.DockerfileName
}
return ""
}
func (m *Inputs) GetDockerfileInline() string {
if m != nil {
return m.DockerfileInline
}
return ""
}
func (m *Inputs) GetContextDefinition() *pb.Definition {
if m != nil {
return m.ContextDefinition
}
return nil
}
func (m *Inputs) GetNamedContexts() map[string]*NamedContext {
if m != nil {
return m.NamedContexts
}
return nil
}
type BuildOptions struct {
ContextPath string `protobuf:"bytes,1,opt,name=ContextPath,proto3" json:"ContextPath,omitempty"`
DockerfileName string `protobuf:"bytes,2,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"`
PrintFunc *PrintFunc `protobuf:"bytes,3,opt,name=PrintFunc,proto3" json:"PrintFunc,omitempty"`
NamedContexts map[string]string `protobuf:"bytes,4,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Allow []string `protobuf:"bytes,5,rep,name=Allow,proto3" json:"Allow,omitempty"`
Attests []*Attest `protobuf:"bytes,6,rep,name=Attests,proto3" json:"Attests,omitempty"`
BuildArgs map[string]string `protobuf:"bytes,7,rep,name=BuildArgs,proto3" json:"BuildArgs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
CacheFrom []*CacheOptionsEntry `protobuf:"bytes,8,rep,name=CacheFrom,proto3" json:"CacheFrom,omitempty"`
CacheTo []*CacheOptionsEntry `protobuf:"bytes,9,rep,name=CacheTo,proto3" json:"CacheTo,omitempty"`
CgroupParent string `protobuf:"bytes,10,opt,name=CgroupParent,proto3" json:"CgroupParent,omitempty"`
Exports []*ExportEntry `protobuf:"bytes,11,rep,name=Exports,proto3" json:"Exports,omitempty"`
ExtraHosts []string `protobuf:"bytes,12,rep,name=ExtraHosts,proto3" json:"ExtraHosts,omitempty"`
Labels map[string]string `protobuf:"bytes,13,rep,name=Labels,proto3" json:"Labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
NetworkMode string `protobuf:"bytes,14,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"`
NoCacheFilter []string `protobuf:"bytes,15,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"`
Platforms []string `protobuf:"bytes,16,rep,name=Platforms,proto3" json:"Platforms,omitempty"`
Secrets []*Secret `protobuf:"bytes,17,rep,name=Secrets,proto3" json:"Secrets,omitempty"`
ShmSize int64 `protobuf:"varint,18,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"`
SSH []*SSH `protobuf:"bytes,19,rep,name=SSH,proto3" json:"SSH,omitempty"`
Tags []string `protobuf:"bytes,20,rep,name=Tags,proto3" json:"Tags,omitempty"`
Target string `protobuf:"bytes,21,opt,name=Target,proto3" json:"Target,omitempty"`
Ulimits *UlimitOpt `protobuf:"bytes,22,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"`
Builder string `protobuf:"bytes,23,opt,name=Builder,proto3" json:"Builder,omitempty"`
NoCache bool `protobuf:"varint,24,opt,name=NoCache,proto3" json:"NoCache,omitempty"`
Pull bool `protobuf:"varint,25,opt,name=Pull,proto3" json:"Pull,omitempty"`
ExportPush bool `protobuf:"varint,26,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"`
ExportLoad bool `protobuf:"varint,27,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"`
SourcePolicy *pb.Policy `protobuf:"bytes,28,opt,name=SourcePolicy,proto3" json:"SourcePolicy,omitempty"`
Inputs *Inputs `protobuf:"bytes,1,opt,name=Inputs,proto3" json:"Inputs,omitempty"`
PrintFunc *PrintFunc `protobuf:"bytes,2,opt,name=PrintFunc,proto3" json:"PrintFunc,omitempty"`
Opts *CommonOptions `protobuf:"bytes,3,opt,name=Opts,proto3" json:"Opts,omitempty"`
Allow []string `protobuf:"bytes,4,rep,name=Allow,proto3" json:"Allow,omitempty"`
Attests []*Attest `protobuf:"bytes,5,rep,name=Attests,proto3" json:"Attests,omitempty"`
BuildArgs map[string]string `protobuf:"bytes,6,rep,name=BuildArgs,proto3" json:"BuildArgs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
CacheFrom []*CacheOptionsEntry `protobuf:"bytes,7,rep,name=CacheFrom,proto3" json:"CacheFrom,omitempty"`
CacheTo []*CacheOptionsEntry `protobuf:"bytes,8,rep,name=CacheTo,proto3" json:"CacheTo,omitempty"`
CgroupParent string `protobuf:"bytes,9,opt,name=CgroupParent,proto3" json:"CgroupParent,omitempty"`
Exports []*ExportEntry `protobuf:"bytes,10,rep,name=Exports,proto3" json:"Exports,omitempty"`
ExtraHosts []string `protobuf:"bytes,11,rep,name=ExtraHosts,proto3" json:"ExtraHosts,omitempty"`
Labels map[string]string `protobuf:"bytes,12,rep,name=Labels,proto3" json:"Labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
NetworkMode string `protobuf:"bytes,13,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"`
NoCacheFilter []string `protobuf:"bytes,14,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"`
Platforms []string `protobuf:"bytes,15,rep,name=Platforms,proto3" json:"Platforms,omitempty"`
Secrets []*Secret `protobuf:"bytes,16,rep,name=Secrets,proto3" json:"Secrets,omitempty"`
ShmSize int64 `protobuf:"varint,17,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"`
SSH []*SSH `protobuf:"bytes,18,rep,name=SSH,proto3" json:"SSH,omitempty"`
Tags []string `protobuf:"bytes,19,rep,name=Tags,proto3" json:"Tags,omitempty"`
Target string `protobuf:"bytes,20,opt,name=Target,proto3" json:"Target,omitempty"`
Ulimits *UlimitOpt `protobuf:"bytes,21,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"`
SourcePolicy *pb1.Policy `protobuf:"bytes,22,opt,name=SourcePolicy,proto3" json:"SourcePolicy,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -308,7 +373,7 @@ func (m *BuildOptions) Reset() { *m = BuildOptions{} }
func (m *BuildOptions) String() string { return proto.CompactTextString(m) }
func (*BuildOptions) ProtoMessage() {}
func (*BuildOptions) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{6}
return fileDescriptor_ed7f10298fa1d90f, []int{7}
}
func (m *BuildOptions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildOptions.Unmarshal(m, b)
@ -328,18 +393,11 @@ func (m *BuildOptions) XXX_DiscardUnknown() {
var xxx_messageInfo_BuildOptions proto.InternalMessageInfo
func (m *BuildOptions) GetContextPath() string {
func (m *BuildOptions) GetInputs() *Inputs {
if m != nil {
return m.ContextPath
return m.Inputs
}
return ""
}
func (m *BuildOptions) GetDockerfileName() string {
if m != nil {
return m.DockerfileName
}
return ""
return nil
}
func (m *BuildOptions) GetPrintFunc() *PrintFunc {
@ -349,9 +407,9 @@ func (m *BuildOptions) GetPrintFunc() *PrintFunc {
return nil
}
func (m *BuildOptions) GetNamedContexts() map[string]string {
func (m *BuildOptions) GetOpts() *CommonOptions {
if m != nil {
return m.NamedContexts
return m.Opts
}
return nil
}
@ -482,46 +540,148 @@ func (m *BuildOptions) GetUlimits() *UlimitOpt {
return nil
}
func (m *BuildOptions) GetBuilder() string {
func (m *BuildOptions) GetSourcePolicy() *pb1.Policy {
if m != nil {
return m.SourcePolicy
}
return nil
}
type NamedContext struct {
Path string `protobuf:"bytes,1,opt,name=Path,proto3" json:"Path,omitempty"`
Definition *pb.Definition `protobuf:"bytes,2,opt,name=Definition,proto3" json:"Definition,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *NamedContext) Reset() { *m = NamedContext{} }
func (m *NamedContext) String() string { return proto.CompactTextString(m) }
func (*NamedContext) ProtoMessage() {}
func (*NamedContext) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{8}
}
func (m *NamedContext) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NamedContext.Unmarshal(m, b)
}
func (m *NamedContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_NamedContext.Marshal(b, m, deterministic)
}
func (m *NamedContext) XXX_Merge(src proto.Message) {
xxx_messageInfo_NamedContext.Merge(m, src)
}
func (m *NamedContext) XXX_Size() int {
return xxx_messageInfo_NamedContext.Size(m)
}
func (m *NamedContext) XXX_DiscardUnknown() {
xxx_messageInfo_NamedContext.DiscardUnknown(m)
}
var xxx_messageInfo_NamedContext proto.InternalMessageInfo
func (m *NamedContext) GetPath() string {
if m != nil {
return m.Path
}
return ""
}
func (m *NamedContext) GetDefinition() *pb.Definition {
if m != nil {
return m.Definition
}
return nil
}
type CommonOptions struct {
Builder string `protobuf:"bytes,1,opt,name=Builder,proto3" json:"Builder,omitempty"`
MetadataFile string `protobuf:"bytes,2,opt,name=MetadataFile,proto3" json:"MetadataFile,omitempty"`
NoCache bool `protobuf:"varint,3,opt,name=NoCache,proto3" json:"NoCache,omitempty"`
// string Progress: no progress view on server side
Pull bool `protobuf:"varint,4,opt,name=Pull,proto3" json:"Pull,omitempty"`
ExportPush bool `protobuf:"varint,5,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"`
ExportLoad bool `protobuf:"varint,6,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"`
// TODO: we should remove Linked from the controllerapi, it's only used to
// produce a single warning. To allow this, we need to move the default
// export detection out from the controller server, as well as load the
// driver on the controller client.
Linked bool `protobuf:"varint,7,opt,name=Linked,proto3" json:"Linked,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CommonOptions) Reset() { *m = CommonOptions{} }
func (m *CommonOptions) String() string { return proto.CompactTextString(m) }
func (*CommonOptions) ProtoMessage() {}
func (*CommonOptions) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{9}
}
func (m *CommonOptions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommonOptions.Unmarshal(m, b)
}
func (m *CommonOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CommonOptions.Marshal(b, m, deterministic)
}
func (m *CommonOptions) XXX_Merge(src proto.Message) {
xxx_messageInfo_CommonOptions.Merge(m, src)
}
func (m *CommonOptions) XXX_Size() int {
return xxx_messageInfo_CommonOptions.Size(m)
}
func (m *CommonOptions) XXX_DiscardUnknown() {
xxx_messageInfo_CommonOptions.DiscardUnknown(m)
}
var xxx_messageInfo_CommonOptions proto.InternalMessageInfo
func (m *CommonOptions) GetBuilder() string {
if m != nil {
return m.Builder
}
return ""
}
func (m *BuildOptions) GetNoCache() bool {
func (m *CommonOptions) GetMetadataFile() string {
if m != nil {
return m.MetadataFile
}
return ""
}
func (m *CommonOptions) GetNoCache() bool {
if m != nil {
return m.NoCache
}
return false
}
func (m *BuildOptions) GetPull() bool {
func (m *CommonOptions) GetPull() bool {
if m != nil {
return m.Pull
}
return false
}
func (m *BuildOptions) GetExportPush() bool {
func (m *CommonOptions) GetExportPush() bool {
if m != nil {
return m.ExportPush
}
return false
}
func (m *BuildOptions) GetExportLoad() bool {
func (m *CommonOptions) GetExportLoad() bool {
if m != nil {
return m.ExportLoad
}
return false
}
func (m *BuildOptions) GetSourcePolicy() *pb.Policy {
func (m *CommonOptions) GetLinked() bool {
if m != nil {
return m.SourcePolicy
return m.Linked
}
return nil
return false
}
type ExportEntry struct {
@ -537,7 +697,7 @@ func (m *ExportEntry) Reset() { *m = ExportEntry{} }
func (m *ExportEntry) String() string { return proto.CompactTextString(m) }
func (*ExportEntry) ProtoMessage() {}
func (*ExportEntry) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{7}
return fileDescriptor_ed7f10298fa1d90f, []int{10}
}
func (m *ExportEntry) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExportEntry.Unmarshal(m, b)
@ -590,7 +750,7 @@ func (m *CacheOptionsEntry) Reset() { *m = CacheOptionsEntry{} }
func (m *CacheOptionsEntry) String() string { return proto.CompactTextString(m) }
func (*CacheOptionsEntry) ProtoMessage() {}
func (*CacheOptionsEntry) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{8}
return fileDescriptor_ed7f10298fa1d90f, []int{11}
}
func (m *CacheOptionsEntry) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CacheOptionsEntry.Unmarshal(m, b)
@ -637,7 +797,7 @@ func (m *Attest) Reset() { *m = Attest{} }
func (m *Attest) String() string { return proto.CompactTextString(m) }
func (*Attest) ProtoMessage() {}
func (*Attest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{9}
return fileDescriptor_ed7f10298fa1d90f, []int{12}
}
func (m *Attest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Attest.Unmarshal(m, b)
@ -690,7 +850,7 @@ func (m *SSH) Reset() { *m = SSH{} }
func (m *SSH) String() string { return proto.CompactTextString(m) }
func (*SSH) ProtoMessage() {}
func (*SSH) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{10}
return fileDescriptor_ed7f10298fa1d90f, []int{13}
}
func (m *SSH) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SSH.Unmarshal(m, b)
@ -737,7 +897,7 @@ func (m *Secret) Reset() { *m = Secret{} }
func (m *Secret) String() string { return proto.CompactTextString(m) }
func (*Secret) ProtoMessage() {}
func (*Secret) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{11}
return fileDescriptor_ed7f10298fa1d90f, []int{14}
}
func (m *Secret) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Secret.Unmarshal(m, b)
@ -790,7 +950,7 @@ func (m *PrintFunc) Reset() { *m = PrintFunc{} }
func (m *PrintFunc) String() string { return proto.CompactTextString(m) }
func (*PrintFunc) ProtoMessage() {}
func (*PrintFunc) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{12}
return fileDescriptor_ed7f10298fa1d90f, []int{15}
}
func (m *PrintFunc) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrintFunc.Unmarshal(m, b)
@ -835,7 +995,7 @@ func (m *InspectRequest) Reset() { *m = InspectRequest{} }
func (m *InspectRequest) String() string { return proto.CompactTextString(m) }
func (*InspectRequest) ProtoMessage() {}
func (*InspectRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{13}
return fileDescriptor_ed7f10298fa1d90f, []int{16}
}
func (m *InspectRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectRequest.Unmarshal(m, b)
@ -873,7 +1033,7 @@ func (m *InspectResponse) Reset() { *m = InspectResponse{} }
func (m *InspectResponse) String() string { return proto.CompactTextString(m) }
func (*InspectResponse) ProtoMessage() {}
func (*InspectResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{14}
return fileDescriptor_ed7f10298fa1d90f, []int{17}
}
func (m *InspectResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectResponse.Unmarshal(m, b)
@ -911,7 +1071,7 @@ func (m *UlimitOpt) Reset() { *m = UlimitOpt{} }
func (m *UlimitOpt) String() string { return proto.CompactTextString(m) }
func (*UlimitOpt) ProtoMessage() {}
func (*UlimitOpt) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{15}
return fileDescriptor_ed7f10298fa1d90f, []int{18}
}
func (m *UlimitOpt) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UlimitOpt.Unmarshal(m, b)
@ -951,7 +1111,7 @@ func (m *Ulimit) Reset() { *m = Ulimit{} }
func (m *Ulimit) String() string { return proto.CompactTextString(m) }
func (*Ulimit) ProtoMessage() {}
func (*Ulimit) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{16}
return fileDescriptor_ed7f10298fa1d90f, []int{19}
}
func (m *Ulimit) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Ulimit.Unmarshal(m, b)
@ -1003,7 +1163,7 @@ func (m *BuildResponse) Reset() { *m = BuildResponse{} }
func (m *BuildResponse) String() string { return proto.CompactTextString(m) }
func (*BuildResponse) ProtoMessage() {}
func (*BuildResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{17}
return fileDescriptor_ed7f10298fa1d90f, []int{20}
}
func (m *BuildResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildResponse.Unmarshal(m, b)
@ -1041,7 +1201,7 @@ func (m *DisconnectRequest) Reset() { *m = DisconnectRequest{} }
func (m *DisconnectRequest) String() string { return proto.CompactTextString(m) }
func (*DisconnectRequest) ProtoMessage() {}
func (*DisconnectRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{18}
return fileDescriptor_ed7f10298fa1d90f, []int{21}
}
func (m *DisconnectRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectRequest.Unmarshal(m, b)
@ -1078,7 +1238,7 @@ func (m *DisconnectResponse) Reset() { *m = DisconnectResponse{} }
func (m *DisconnectResponse) String() string { return proto.CompactTextString(m) }
func (*DisconnectResponse) ProtoMessage() {}
func (*DisconnectResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{19}
return fileDescriptor_ed7f10298fa1d90f, []int{22}
}
func (m *DisconnectResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectResponse.Unmarshal(m, b)
@ -1109,7 +1269,7 @@ func (m *ListRequest) Reset() { *m = ListRequest{} }
func (m *ListRequest) String() string { return proto.CompactTextString(m) }
func (*ListRequest) ProtoMessage() {}
func (*ListRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{20}
return fileDescriptor_ed7f10298fa1d90f, []int{23}
}
func (m *ListRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRequest.Unmarshal(m, b)
@ -1147,7 +1307,7 @@ func (m *ListResponse) Reset() { *m = ListResponse{} }
func (m *ListResponse) String() string { return proto.CompactTextString(m) }
func (*ListResponse) ProtoMessage() {}
func (*ListResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{21}
return fileDescriptor_ed7f10298fa1d90f, []int{24}
}
func (m *ListResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListResponse.Unmarshal(m, b)
@ -1188,7 +1348,7 @@ func (m *InputMessage) Reset() { *m = InputMessage{} }
func (m *InputMessage) String() string { return proto.CompactTextString(m) }
func (*InputMessage) ProtoMessage() {}
func (*InputMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{22}
return fileDescriptor_ed7f10298fa1d90f, []int{25}
}
func (m *InputMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputMessage.Unmarshal(m, b)
@ -1262,7 +1422,7 @@ func (m *InputInitMessage) Reset() { *m = InputInitMessage{} }
func (m *InputInitMessage) String() string { return proto.CompactTextString(m) }
func (*InputInitMessage) ProtoMessage() {}
func (*InputInitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{23}
return fileDescriptor_ed7f10298fa1d90f, []int{26}
}
func (m *InputInitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputInitMessage.Unmarshal(m, b)
@ -1301,7 +1461,7 @@ func (m *DataMessage) Reset() { *m = DataMessage{} }
func (m *DataMessage) String() string { return proto.CompactTextString(m) }
func (*DataMessage) ProtoMessage() {}
func (*DataMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{24}
return fileDescriptor_ed7f10298fa1d90f, []int{27}
}
func (m *DataMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DataMessage.Unmarshal(m, b)
@ -1345,7 +1505,7 @@ func (m *InputResponse) Reset() { *m = InputResponse{} }
func (m *InputResponse) String() string { return proto.CompactTextString(m) }
func (*InputResponse) ProtoMessage() {}
func (*InputResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{25}
return fileDescriptor_ed7f10298fa1d90f, []int{28}
}
func (m *InputResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputResponse.Unmarshal(m, b)
@ -1381,7 +1541,7 @@ func (m *Message) Reset() { *m = Message{} }
func (m *Message) String() string { return proto.CompactTextString(m) }
func (*Message) ProtoMessage() {}
func (*Message) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{26}
return fileDescriptor_ed7f10298fa1d90f, []int{29}
}
func (m *Message) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Message.Unmarshal(m, b)
@ -1483,7 +1643,7 @@ func (m *InitMessage) Reset() { *m = InitMessage{} }
func (m *InitMessage) String() string { return proto.CompactTextString(m) }
func (*InitMessage) ProtoMessage() {}
func (*InitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{27}
return fileDescriptor_ed7f10298fa1d90f, []int{30}
}
func (m *InitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InitMessage.Unmarshal(m, b)
@ -1544,7 +1704,7 @@ func (m *InvokeConfig) Reset() { *m = InvokeConfig{} }
func (m *InvokeConfig) String() string { return proto.CompactTextString(m) }
func (*InvokeConfig) ProtoMessage() {}
func (*InvokeConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{28}
return fileDescriptor_ed7f10298fa1d90f, []int{31}
}
func (m *InvokeConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InvokeConfig.Unmarshal(m, b)
@ -1647,7 +1807,7 @@ func (m *FdMessage) Reset() { *m = FdMessage{} }
func (m *FdMessage) String() string { return proto.CompactTextString(m) }
func (*FdMessage) ProtoMessage() {}
func (*FdMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{29}
return fileDescriptor_ed7f10298fa1d90f, []int{32}
}
func (m *FdMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FdMessage.Unmarshal(m, b)
@ -1700,7 +1860,7 @@ func (m *ResizeMessage) Reset() { *m = ResizeMessage{} }
func (m *ResizeMessage) String() string { return proto.CompactTextString(m) }
func (*ResizeMessage) ProtoMessage() {}
func (*ResizeMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{30}
return fileDescriptor_ed7f10298fa1d90f, []int{33}
}
func (m *ResizeMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResizeMessage.Unmarshal(m, b)
@ -1747,7 +1907,7 @@ func (m *SignalMessage) Reset() { *m = SignalMessage{} }
func (m *SignalMessage) String() string { return proto.CompactTextString(m) }
func (*SignalMessage) ProtoMessage() {}
func (*SignalMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{31}
return fileDescriptor_ed7f10298fa1d90f, []int{34}
}
func (m *SignalMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalMessage.Unmarshal(m, b)
@ -1785,7 +1945,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} }
func (m *StatusRequest) String() string { return proto.CompactTextString(m) }
func (*StatusRequest) ProtoMessage() {}
func (*StatusRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{32}
return fileDescriptor_ed7f10298fa1d90f, []int{35}
}
func (m *StatusRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusRequest.Unmarshal(m, b)
@ -1826,7 +1986,7 @@ func (m *StatusResponse) Reset() { *m = StatusResponse{} }
func (m *StatusResponse) String() string { return proto.CompactTextString(m) }
func (*StatusResponse) ProtoMessage() {}
func (*StatusResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{33}
return fileDescriptor_ed7f10298fa1d90f, []int{36}
}
func (m *StatusResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusResponse.Unmarshal(m, b)
@ -1884,7 +2044,7 @@ func (m *InfoRequest) Reset() { *m = InfoRequest{} }
func (m *InfoRequest) String() string { return proto.CompactTextString(m) }
func (*InfoRequest) ProtoMessage() {}
func (*InfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{34}
return fileDescriptor_ed7f10298fa1d90f, []int{37}
}
func (m *InfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoRequest.Unmarshal(m, b)
@ -1915,7 +2075,7 @@ func (m *InfoResponse) Reset() { *m = InfoResponse{} }
func (m *InfoResponse) String() string { return proto.CompactTextString(m) }
func (*InfoResponse) ProtoMessage() {}
func (*InfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{35}
return fileDescriptor_ed7f10298fa1d90f, []int{38}
}
func (m *InfoResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoResponse.Unmarshal(m, b)
@ -1955,7 +2115,7 @@ func (m *BuildxVersion) Reset() { *m = BuildxVersion{} }
func (m *BuildxVersion) String() string { return proto.CompactTextString(m) }
func (*BuildxVersion) ProtoMessage() {}
func (*BuildxVersion) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{36}
return fileDescriptor_ed7f10298fa1d90f, []int{39}
}
func (m *BuildxVersion) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildxVersion.Unmarshal(m, b)
@ -2003,10 +2163,13 @@ func init() {
proto.RegisterType((*DisconnectProcessRequest)(nil), "buildx.controller.v1.DisconnectProcessRequest")
proto.RegisterType((*DisconnectProcessResponse)(nil), "buildx.controller.v1.DisconnectProcessResponse")
proto.RegisterType((*BuildRequest)(nil), "buildx.controller.v1.BuildRequest")
proto.RegisterType((*Inputs)(nil), "buildx.controller.v1.Inputs")
proto.RegisterMapType((map[string]*NamedContext)(nil), "buildx.controller.v1.Inputs.NamedContextsEntry")
proto.RegisterType((*BuildOptions)(nil), "buildx.controller.v1.BuildOptions")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.BuildArgsEntry")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.LabelsEntry")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.NamedContextsEntry")
proto.RegisterType((*NamedContext)(nil), "buildx.controller.v1.NamedContext")
proto.RegisterType((*CommonOptions)(nil), "buildx.controller.v1.CommonOptions")
proto.RegisterType((*ExportEntry)(nil), "buildx.controller.v1.ExportEntry")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.ExportEntry.AttrsEntry")
proto.RegisterType((*CacheOptionsEntry)(nil), "buildx.controller.v1.CacheOptionsEntry")
@ -2046,125 +2209,134 @@ func init() {
func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) }
var fileDescriptor_ed7f10298fa1d90f = []byte{
// 1881 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x5f, 0x6f, 0xdb, 0xc8,
0x11, 0x2f, 0x25, 0x59, 0x7f, 0x46, 0x96, 0xe3, 0x6c, 0x9d, 0x74, 0xc3, 0xa4, 0x17, 0x87, 0x49,
0xae, 0x42, 0x53, 0x48, 0x77, 0xbe, 0xa6, 0xbe, 0x5c, 0xee, 0x80, 0xda, 0xb2, 0x05, 0xfb, 0x90,
0xd8, 0xc6, 0xca, 0xc9, 0xa1, 0x2d, 0xd0, 0x80, 0x92, 0xd6, 0x32, 0x21, 0x8a, 0xab, 0x72, 0x57,
0xb6, 0xd5, 0xa7, 0xbe, 0xf4, 0xad, 0xe8, 0xf7, 0x28, 0xfa, 0x11, 0xfa, 0xd2, 0x7e, 0xa1, 0xa2,
0x1f, 0xa1, 0xd8, 0x3f, 0xa4, 0x48, 0x4b, 0x94, 0xed, 0xf6, 0x49, 0x3b, 0xc3, 0xdf, 0x6f, 0x76,
0x67, 0x38, 0x3b, 0x33, 0x14, 0xac, 0xf7, 0x58, 0x20, 0x42, 0xe6, 0xfb, 0x34, 0x6c, 0x8c, 0x43,
0x26, 0x18, 0xda, 0xe8, 0x4e, 0x3c, 0xbf, 0x7f, 0xd5, 0x48, 0x3c, 0xb8, 0xf8, 0xd2, 0x7e, 0x3b,
0xf0, 0xc4, 0xf9, 0xa4, 0xdb, 0xe8, 0xb1, 0x51, 0x73, 0xc4, 0xba, 0xd3, 0xa6, 0x42, 0x0d, 0x3d,
0xd1, 0x74, 0xc7, 0x5e, 0x93, 0xd3, 0xf0, 0xc2, 0xeb, 0x51, 0xde, 0x34, 0xa4, 0xe8, 0x57, 0x9b,
0xb4, 0x5f, 0x67, 0x92, 0x39, 0x9b, 0x84, 0x3d, 0x3a, 0x66, 0xbe, 0xd7, 0x9b, 0x36, 0xc7, 0xdd,
0xa6, 0x5e, 0x69, 0x9a, 0x53, 0x87, 0x8d, 0x77, 0x1e, 0x17, 0x27, 0x21, 0xeb, 0x51, 0xce, 0x29,
0x27, 0xf4, 0x0f, 0x13, 0xca, 0x05, 0x5a, 0x87, 0x3c, 0xa1, 0x67, 0xd8, 0xda, 0xb4, 0xea, 0x15,
0x22, 0x97, 0xce, 0x09, 0x3c, 0xb8, 0x86, 0xe4, 0x63, 0x16, 0x70, 0x8a, 0xb6, 0x61, 0xe5, 0x30,
0x38, 0x63, 0x1c, 0x5b, 0x9b, 0xf9, 0x7a, 0x75, 0xeb, 0x59, 0x63, 0x91, 0x73, 0x0d, 0xc3, 0x93,
0x48, 0xa2, 0xf1, 0x0e, 0x87, 0x6a, 0x42, 0x8b, 0x9e, 0x40, 0x25, 0x12, 0xf7, 0xcc, 0xc6, 0x33,
0x05, 0x6a, 0xc3, 0xea, 0x61, 0x70, 0xc1, 0x86, 0xb4, 0xc5, 0x82, 0x33, 0x6f, 0x80, 0x73, 0x9b,
0x56, 0xbd, 0xba, 0xe5, 0x2c, 0xde, 0x2c, 0x89, 0x24, 0x29, 0x9e, 0xf3, 0x3d, 0xe0, 0x3d, 0x8f,
0xf7, 0x58, 0x10, 0xd0, 0x5e, 0xe4, 0x4c, 0xa6, 0xd3, 0xe9, 0x33, 0xe5, 0xae, 0x9d, 0xc9, 0x79,
0x0c, 0x8f, 0x16, 0xd8, 0xd2, 0x61, 0x71, 0x7e, 0x0f, 0xab, 0xbb, 0xf2, 0x6c, 0xd9, 0xc6, 0xbf,
0x85, 0xd2, 0xf1, 0x58, 0x78, 0x2c, 0xe0, 0xcb, 0xbd, 0x51, 0x66, 0x0c, 0x92, 0x44, 0x14, 0xe7,
0x9f, 0x55, 0xb3, 0x81, 0x51, 0xa0, 0x4d, 0xa8, 0xb6, 0x58, 0x20, 0xe8, 0x95, 0x38, 0x71, 0xc5,
0xb9, 0xd9, 0x28, 0xa9, 0x42, 0x9f, 0xc3, 0xda, 0x1e, 0xeb, 0x0d, 0x69, 0x78, 0xe6, 0xf9, 0xf4,
0xc8, 0x1d, 0x51, 0xe3, 0xd2, 0x35, 0x2d, 0xfa, 0x4e, 0x7a, 0xed, 0x05, 0xa2, 0x3d, 0x09, 0x7a,
0x38, 0xaf, 0x8e, 0xf6, 0x34, 0xeb, 0xad, 0x1a, 0x18, 0x99, 0x31, 0xd0, 0xef, 0xa0, 0x26, 0xcd,
0xf4, 0xcd, 0xd6, 0x1c, 0x17, 0x54, 0x62, 0xbc, 0xbe, 0xd9, 0xbb, 0x46, 0x8a, 0xb7, 0x1f, 0x88,
0x70, 0x4a, 0xd2, 0xb6, 0xd0, 0x06, 0xac, 0xec, 0xf8, 0x3e, 0xbb, 0xc4, 0x2b, 0x9b, 0xf9, 0x7a,
0x85, 0x68, 0x01, 0xfd, 0x0a, 0x4a, 0x3b, 0x42, 0x50, 0x2e, 0x38, 0x2e, 0xaa, 0xcd, 0x9e, 0x2c,
0xde, 0x4c, 0x83, 0x48, 0x04, 0x46, 0xc7, 0x50, 0x51, 0xfb, 0xef, 0x84, 0x03, 0x8e, 0x4b, 0x8a,
0xf9, 0xe5, 0x2d, 0x8e, 0x19, 0x73, 0xf4, 0x11, 0x67, 0x36, 0xd0, 0x3e, 0x54, 0x5a, 0x6e, 0xef,
0x9c, 0xb6, 0x43, 0x36, 0xc2, 0x65, 0x65, 0xf0, 0x67, 0x8b, 0x0d, 0x2a, 0x98, 0x31, 0x68, 0xcc,
0xc4, 0x4c, 0xb4, 0x03, 0x25, 0x25, 0x9c, 0x32, 0x5c, 0xb9, 0x9b, 0x91, 0x88, 0x87, 0x1c, 0x58,
0x6d, 0x0d, 0x42, 0x36, 0x19, 0x9f, 0xb8, 0x21, 0x0d, 0x04, 0x06, 0xf5, 0xaa, 0x53, 0x3a, 0xf4,
0x16, 0x4a, 0xfb, 0x57, 0x63, 0x16, 0x0a, 0x8e, 0xab, 0xcb, 0x2e, 0xaf, 0x06, 0x99, 0x0d, 0x0c,
0x03, 0x7d, 0x06, 0xb0, 0x7f, 0x25, 0x42, 0xf7, 0x80, 0xc9, 0xb0, 0xaf, 0xaa, 0xd7, 0x91, 0xd0,
0xa0, 0x36, 0x14, 0xdf, 0xb9, 0x5d, 0xea, 0x73, 0x5c, 0x53, 0xb6, 0x1b, 0xb7, 0x08, 0xac, 0x26,
0xe8, 0x8d, 0x0c, 0x5b, 0xe6, 0xf5, 0x11, 0x15, 0x97, 0x2c, 0x1c, 0xbe, 0x67, 0x7d, 0x8a, 0xd7,
0x74, 0x5e, 0x27, 0x54, 0xe8, 0x05, 0xd4, 0x8e, 0x98, 0x0e, 0x9e, 0xe7, 0x0b, 0x1a, 0xe2, 0x7b,
0xea, 0x30, 0x69, 0xa5, 0xba, 0xcb, 0xbe, 0x2b, 0xce, 0x58, 0x38, 0xe2, 0x78, 0x5d, 0x21, 0x66,
0x0a, 0x99, 0x41, 0x1d, 0xda, 0x0b, 0xa9, 0xe0, 0xf8, 0xfe, 0xb2, 0x0c, 0xd2, 0x20, 0x12, 0x81,
0x11, 0x86, 0x52, 0xe7, 0x7c, 0xd4, 0xf1, 0xfe, 0x48, 0x31, 0xda, 0xb4, 0xea, 0x79, 0x12, 0x89,
0xe8, 0x15, 0xe4, 0x3b, 0x9d, 0x03, 0xfc, 0x63, 0x65, 0xed, 0x51, 0x86, 0xb5, 0xce, 0x01, 0x91,
0x28, 0x84, 0xa0, 0x70, 0xea, 0x0e, 0x38, 0xde, 0x50, 0xe7, 0x52, 0x6b, 0xf4, 0x10, 0x8a, 0xa7,
0x6e, 0x38, 0xa0, 0x02, 0x3f, 0x50, 0x3e, 0x1b, 0x09, 0xbd, 0x81, 0xd2, 0x07, 0xdf, 0x1b, 0x79,
0x82, 0xe3, 0x87, 0xcb, 0x2e, 0xa7, 0x06, 0x1d, 0x8f, 0x05, 0x89, 0xf0, 0xf2, 0xb4, 0x2a, 0xde,
0x34, 0xc4, 0x3f, 0x51, 0x36, 0x23, 0x51, 0x3e, 0x31, 0xe1, 0xc2, 0x78, 0xd3, 0xaa, 0x97, 0x49,
0x24, 0xca, 0xa3, 0x9d, 0x4c, 0x7c, 0x1f, 0x3f, 0x52, 0x6a, 0xb5, 0xd6, 0xef, 0x5e, 0xa6, 0xc1,
0xc9, 0x84, 0x9f, 0x63, 0x5b, 0x3d, 0x49, 0x68, 0x66, 0xcf, 0xdf, 0x31, 0xb7, 0x8f, 0x1f, 0x27,
0x9f, 0x4b, 0x0d, 0x3a, 0x84, 0xd5, 0x8e, 0x6a, 0x4b, 0x27, 0xaa, 0x19, 0xe1, 0x27, 0xca, 0x8f,
0x97, 0x0d, 0xd9, 0xb9, 0x1a, 0x51, 0xe7, 0x92, 0x3e, 0x24, 0x9b, 0x57, 0x43, 0x83, 0x49, 0x8a,
0x6a, 0xff, 0x1a, 0xd0, 0x7c, 0xd5, 0x90, 0xd5, 0x76, 0x48, 0xa7, 0x51, 0xb5, 0x1d, 0xd2, 0xa9,
0x2c, 0x1c, 0x17, 0xae, 0x3f, 0x89, 0x6a, 0x9e, 0x16, 0xbe, 0xc9, 0x7d, 0x6d, 0xd9, 0xdf, 0xc2,
0x5a, 0xfa, 0x42, 0xdf, 0x89, 0xfd, 0x06, 0xaa, 0x89, 0xac, 0xbd, 0x0b, 0xd5, 0xf9, 0x97, 0x05,
0xd5, 0xc4, 0xd5, 0x52, 0x49, 0x30, 0x1d, 0x53, 0x43, 0x56, 0x6b, 0xb4, 0x0b, 0x2b, 0x3b, 0x42,
0x84, 0xb2, 0x45, 0xc8, 0x3c, 0xfa, 0xc5, 0x8d, 0x17, 0xb4, 0xa1, 0xe0, 0xfa, 0x0a, 0x69, 0xaa,
0xbc, 0x41, 0x7b, 0x94, 0x0b, 0x2f, 0x70, 0xe5, 0x2d, 0x53, 0x15, 0xbd, 0x42, 0x92, 0x2a, 0xfb,
0x6b, 0x80, 0x19, 0xed, 0x4e, 0x3e, 0xfc, 0xdd, 0x82, 0xfb, 0x73, 0x55, 0x68, 0xa1, 0x27, 0x07,
0x69, 0x4f, 0xb6, 0x6e, 0x59, 0xd1, 0xe6, 0xfd, 0xf9, 0x3f, 0x4e, 0x7b, 0x04, 0x45, 0x5d, 0xfa,
0x17, 0x9e, 0xd0, 0x86, 0xf2, 0x9e, 0xc7, 0xdd, 0xae, 0x4f, 0xfb, 0x8a, 0x5a, 0x26, 0xb1, 0xac,
0xfa, 0x8e, 0x3a, 0xbd, 0x8e, 0x9e, 0x16, 0x1c, 0x7d, 0xc7, 0xd1, 0x1a, 0xe4, 0xe2, 0x99, 0x25,
0x77, 0xb8, 0x27, 0xc1, 0xb2, 0xe1, 0x6a, 0x57, 0x2b, 0x44, 0x0b, 0x4e, 0x1b, 0x8a, 0xba, 0x6a,
0xcc, 0xe1, 0x6d, 0x28, 0xb7, 0x3d, 0x9f, 0xaa, 0xbe, 0xad, 0xcf, 0x1c, 0xcb, 0xd2, 0xbd, 0xfd,
0xe0, 0xc2, 0x6c, 0x2b, 0x97, 0xce, 0x76, 0xa2, 0x3d, 0x4b, 0x3f, 0x54, 0x27, 0x37, 0x7e, 0xa8,
0xfe, 0xfd, 0x10, 0x8a, 0x6d, 0x16, 0x8e, 0x5c, 0x61, 0x8c, 0x19, 0xc9, 0x71, 0x60, 0xed, 0x30,
0xe0, 0x63, 0xda, 0x13, 0xd9, 0x63, 0xde, 0x31, 0xdc, 0x8b, 0x31, 0x66, 0xc0, 0x4b, 0xcc, 0x29,
0xd6, 0xdd, 0xe7, 0x94, 0xbf, 0x59, 0x50, 0x89, 0x2b, 0x11, 0x6a, 0x41, 0x51, 0xbd, 0x8d, 0x68,
0x5a, 0x7c, 0x75, 0x43, 0xe9, 0x6a, 0x7c, 0x54, 0x68, 0xd3, 0x11, 0x34, 0xd5, 0xfe, 0x01, 0xaa,
0x09, 0xf5, 0x82, 0x04, 0xd8, 0x4a, 0x26, 0x40, 0x66, 0x29, 0xd7, 0x9b, 0x24, 0xd3, 0x63, 0x0f,
0x8a, 0x5a, 0xb9, 0x30, 0xac, 0x08, 0x0a, 0x07, 0x6e, 0xa8, 0x53, 0x23, 0x4f, 0xd4, 0x5a, 0xea,
0x3a, 0xec, 0x4c, 0xa8, 0xd7, 0x93, 0x27, 0x6a, 0xed, 0xfc, 0xc3, 0x82, 0x9a, 0x19, 0xfd, 0x4c,
0x04, 0x29, 0xac, 0xeb, 0x1b, 0x4a, 0xc3, 0x48, 0x67, 0xfc, 0x7f, 0xb3, 0x24, 0x94, 0x11, 0xb4,
0x71, 0x9d, 0xab, 0xa3, 0x31, 0x67, 0xd2, 0x6e, 0xc1, 0x83, 0x85, 0xd0, 0x3b, 0x5d, 0x91, 0x97,
0x70, 0x7f, 0x36, 0xd4, 0x66, 0xe7, 0xc9, 0x06, 0xa0, 0x24, 0xcc, 0x0c, 0xbd, 0x4f, 0xa1, 0x2a,
0x3f, 0x12, 0xb2, 0x69, 0x0e, 0xac, 0x6a, 0x80, 0x89, 0x0c, 0x82, 0xc2, 0x90, 0x4e, 0x75, 0x36,
0x54, 0x88, 0x5a, 0x3b, 0x7f, 0xb5, 0xe4, 0xac, 0x3f, 0x9e, 0x88, 0xf7, 0x94, 0x73, 0x77, 0x20,
0x13, 0xb0, 0x70, 0x18, 0x78, 0xc2, 0x64, 0xdf, 0xe7, 0x59, 0x33, 0xff, 0x78, 0x22, 0x24, 0xcc,
0xb0, 0x0e, 0x7e, 0x44, 0x14, 0x0b, 0x6d, 0x43, 0x61, 0xcf, 0x15, 0xae, 0xc9, 0x85, 0x8c, 0x09,
0x47, 0x22, 0x12, 0x44, 0x29, 0xee, 0x96, 0xe4, 0x87, 0xcd, 0x78, 0x22, 0x9c, 0x17, 0xb0, 0x7e,
0xdd, 0xfa, 0x02, 0xd7, 0xbe, 0x82, 0x6a, 0xc2, 0x8a, 0xba, 0xb7, 0xc7, 0x6d, 0x05, 0x28, 0x13,
0xb9, 0x94, 0xbe, 0xc6, 0x07, 0x59, 0xd5, 0x7b, 0x38, 0xf7, 0xa0, 0xa6, 0x4c, 0xc7, 0x11, 0xfc,
0x53, 0x0e, 0x4a, 0x91, 0x89, 0xed, 0x94, 0xdf, 0xcf, 0xb2, 0xfc, 0x9e, 0x77, 0xf9, 0x35, 0x14,
0x64, 0xfd, 0x30, 0x2e, 0x67, 0x8c, 0x07, 0xed, 0x7e, 0x82, 0x26, 0xe1, 0xe8, 0x3b, 0x28, 0x12,
0xca, 0xe5, 0x28, 0xa3, 0x87, 0xfe, 0xe7, 0x8b, 0x89, 0x1a, 0x33, 0x23, 0x1b, 0x92, 0xa4, 0x77,
0xbc, 0x41, 0xe0, 0xfa, 0xb8, 0xb0, 0x8c, 0xae, 0x31, 0x09, 0xba, 0x56, 0xcc, 0xc2, 0xfd, 0x67,
0x0b, 0xaa, 0x4b, 0x43, 0xbd, 0xfc, 0xb3, 0x6c, 0xee, 0x53, 0x31, 0xff, 0x3f, 0x7e, 0x2a, 0xfe,
0xdb, 0x4a, 0x1b, 0x52, 0x53, 0x8d, 0xbc, 0x4f, 0x63, 0xe6, 0x05, 0xc2, 0xa4, 0x6c, 0x42, 0x23,
0x0f, 0xda, 0x1a, 0xf5, 0x4d, 0xd1, 0x97, 0xcb, 0x59, 0xf1, 0xce, 0x9b, 0xe2, 0x2d, 0x93, 0xe0,
0x03, 0xa7, 0xa1, 0x0a, 0x51, 0x85, 0xa8, 0xb5, 0xac, 0xd7, 0x47, 0x4c, 0x69, 0x57, 0x54, 0xb6,
0x18, 0x49, 0xd9, 0xbb, 0xec, 0xe3, 0xa2, 0x76, 0xbc, 0x75, 0xa9, 0xba, 0xd0, 0x11, 0x93, 0xba,
0x92, 0x02, 0x6a, 0x41, 0xe2, 0x4e, 0xc5, 0x14, 0x97, 0x75, 0xaa, 0x9d, 0x8a, 0xa9, 0x6c, 0x28,
0x84, 0xf9, 0x7e, 0xd7, 0xed, 0x0d, 0x71, 0x45, 0x77, 0xb2, 0x48, 0x96, 0x93, 0x9e, 0x8c, 0xae,
0xe7, 0xfa, 0xea, 0x9b, 0xa0, 0x4c, 0x22, 0xd1, 0xd9, 0x81, 0x4a, 0x9c, 0x14, 0xb2, 0x47, 0xb5,
0xfb, 0x2a, 0xe8, 0x35, 0x92, 0x6b, 0xf7, 0xa3, 0x7c, 0xce, 0xcd, 0xe7, 0x73, 0x3e, 0x91, 0xcf,
0xdb, 0x50, 0x4b, 0xa5, 0x87, 0x04, 0x11, 0x76, 0xc9, 0x8d, 0x21, 0xb5, 0x96, 0xba, 0x16, 0xf3,
0xf5, 0x57, 0x6f, 0x8d, 0xa8, 0xb5, 0xf3, 0x1c, 0x6a, 0xa9, 0xc4, 0x58, 0x54, 0x81, 0x9d, 0x67,
0x50, 0xeb, 0x08, 0x57, 0x4c, 0x96, 0xfc, 0x4d, 0xf1, 0x1f, 0x0b, 0xd6, 0x22, 0x8c, 0xa9, 0x31,
0xbf, 0x84, 0xf2, 0x05, 0x0d, 0x05, 0xbd, 0x8a, 0xbb, 0x0e, 0x9e, 0x1f, 0x34, 0x3f, 0x2a, 0x04,
0x89, 0x91, 0xe8, 0x1b, 0x28, 0x73, 0x65, 0x87, 0x46, 0x13, 0xcb, 0x67, 0x59, 0x2c, 0xb3, 0x5f,
0x8c, 0x47, 0x4d, 0x28, 0xf8, 0x6c, 0xc0, 0xd5, 0x7b, 0xaf, 0x6e, 0x3d, 0xce, 0xe2, 0xbd, 0x63,
0x03, 0xa2, 0x80, 0xe8, 0x2d, 0x94, 0x2f, 0xdd, 0x30, 0xf0, 0x82, 0x41, 0xf4, 0xb5, 0xfc, 0x34,
0x8b, 0xf4, 0x83, 0xc6, 0x91, 0x98, 0xe0, 0xd4, 0xe4, 0x75, 0x39, 0x63, 0x26, 0x26, 0xce, 0x6f,
0x64, 0xd6, 0x4a, 0xd1, 0xb8, 0x7f, 0x08, 0x35, 0x9d, 0xf9, 0x1f, 0x69, 0xc8, 0xe5, 0xfc, 0x67,
0x2d, 0xbb, 0x9d, 0xbb, 0x49, 0x28, 0x49, 0x33, 0x9d, 0x4f, 0xa6, 0xb1, 0x45, 0x0a, 0x99, 0x4b,
0x63, 0xb7, 0x37, 0x74, 0x07, 0xd1, 0x7b, 0x8a, 0x44, 0xf9, 0xe4, 0xc2, 0xec, 0xa7, 0x2f, 0x68,
0x24, 0xca, 0xdc, 0x0c, 0xe9, 0x85, 0xc7, 0x67, 0xa3, 0x68, 0x2c, 0x6f, 0xfd, 0xa5, 0x04, 0xd0,
0x8a, 0xcf, 0x83, 0x4e, 0x60, 0x45, 0xed, 0x87, 0x9c, 0xa5, 0x6d, 0x52, 0xf9, 0x6d, 0x3f, 0xbf,
0x45, 0x2b, 0x45, 0x1f, 0x65, 0xf2, 0xab, 0xf1, 0x06, 0xbd, 0xc8, 0x2a, 0x08, 0xc9, 0x09, 0xc9,
0x7e, 0x79, 0x03, 0xca, 0xd8, 0xfd, 0x00, 0x45, 0x9d, 0x05, 0x28, 0xab, 0xea, 0x25, 0xf3, 0xd6,
0x7e, 0xb1, 0x1c, 0xa4, 0x8d, 0x7e, 0x61, 0x21, 0x62, 0x6a, 0x22, 0x72, 0x96, 0x34, 0x3d, 0x73,
0x63, 0xb2, 0x02, 0x90, 0xea, 0x2f, 0x75, 0x0b, 0x7d, 0x0f, 0x45, 0x5d, 0xd5, 0xd0, 0x4f, 0x17,
0x13, 0x22, 0x7b, 0xcb, 0x1f, 0xd7, 0xad, 0x2f, 0x2c, 0xf4, 0x1e, 0x0a, 0xb2, 0x9d, 0xa3, 0x8c,
0xde, 0x94, 0x98, 0x05, 0x6c, 0x67, 0x19, 0xc4, 0x44, 0xf1, 0x13, 0xc0, 0x6c, 0xa8, 0x40, 0x19,
0xff, 0x79, 0xcc, 0x4d, 0x27, 0x76, 0xfd, 0x66, 0xa0, 0xd9, 0xe0, 0xbd, 0xec, 0xa8, 0x67, 0x0c,
0x65, 0xf6, 0xd2, 0xf8, 0x1a, 0xd9, 0xce, 0x32, 0x88, 0x31, 0x77, 0x0e, 0xb5, 0xd4, 0x7f, 0xa2,
0xe8, 0xe7, 0xd9, 0x4e, 0x5e, 0xff, 0x8b, 0xd5, 0x7e, 0x75, 0x2b, 0xac, 0xd9, 0x49, 0x24, 0xa7,
0x32, 0xf3, 0x18, 0x35, 0x6e, 0xf2, 0x3b, 0xfd, 0xff, 0xa6, 0xdd, 0xbc, 0x35, 0x5e, 0xef, 0xba,
0x5b, 0xf8, 0x6d, 0x6e, 0xdc, 0xed, 0x16, 0xd5, 0x5f, 0xc5, 0x5f, 0xfd, 0x37, 0x00, 0x00, 0xff,
0xff, 0xc1, 0x4b, 0x2d, 0x65, 0xc8, 0x16, 0x00, 0x00,
// 2030 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x72, 0xdb, 0xc6,
0x15, 0x2e, 0x48, 0x8a, 0x3f, 0x87, 0xa2, 0x2c, 0x6f, 0x65, 0x0f, 0x82, 0xb8, 0x89, 0x0c, 0xdb,
0xa9, 0x26, 0xce, 0x80, 0x89, 0x92, 0xd4, 0x76, 0xec, 0x5c, 0x48, 0x94, 0x38, 0x52, 0x46, 0x7f,
0xb3, 0x94, 0x9d, 0x69, 0x2f, 0x9a, 0x01, 0xc9, 0x15, 0x85, 0x21, 0x88, 0x45, 0xb1, 0x4b, 0xfd,
0xf4, 0xaa, 0x37, 0xbd, 0xeb, 0xf4, 0x3d, 0x3a, 0x7d, 0x84, 0xce, 0x74, 0xa6, 0xcf, 0xd0, 0xf7,
0xe8, 0xf4, 0xb6, 0x77, 0x9d, 0xfd, 0x01, 0x08, 0x88, 0x04, 0x24, 0xb5, 0x57, 0xdc, 0x3d, 0xf8,
0xbe, 0xb3, 0x7b, 0xce, 0x9e, 0x3d, 0xe7, 0x2c, 0x61, 0x75, 0x40, 0x03, 0x1e, 0x51, 0xdf, 0x27,
0x91, 0x13, 0x46, 0x94, 0x53, 0xb4, 0xd6, 0x9f, 0x7a, 0xfe, 0xf0, 0xca, 0x49, 0x7d, 0xb8, 0xf8,
0xca, 0x7a, 0x3b, 0xf2, 0xf8, 0xf9, 0xb4, 0xef, 0x0c, 0xe8, 0xa4, 0x3d, 0xa1, 0xfd, 0xeb, 0xb6,
0x44, 0x8d, 0x3d, 0xde, 0x76, 0x43, 0xaf, 0xcd, 0x48, 0x74, 0xe1, 0x0d, 0x08, 0x6b, 0x6b, 0x52,
0xfc, 0xab, 0x54, 0x5a, 0xdf, 0xe6, 0x92, 0x19, 0x9d, 0x46, 0x03, 0x12, 0x52, 0xdf, 0x1b, 0x5c,
0xb7, 0xc3, 0x7e, 0x5b, 0x8d, 0x34, 0xed, 0x8b, 0x02, 0x9a, 0x7f, 0x41, 0x22, 0x41, 0xa0, 0x21,
0x53, 0x68, 0x7b, 0x03, 0xd6, 0x0e, 0x3c, 0xc6, 0x4f, 0x22, 0x3a, 0x20, 0x8c, 0x11, 0x86, 0xc9,
0xef, 0xa6, 0x84, 0x71, 0xb4, 0x0a, 0x65, 0x4c, 0xce, 0x4c, 0x63, 0xdd, 0xd8, 0x68, 0x60, 0x31,
0xb4, 0x4f, 0xe0, 0xd1, 0x0d, 0x24, 0x0b, 0x69, 0xc0, 0x08, 0x7a, 0x05, 0x4b, 0xfb, 0xc1, 0x19,
0x65, 0xa6, 0xb1, 0x5e, 0xde, 0x68, 0x6e, 0x3e, 0x75, 0x16, 0xb9, 0xc2, 0xd1, 0x3c, 0x81, 0xc4,
0x0a, 0x6f, 0x33, 0x68, 0xa6, 0xa4, 0xe8, 0x09, 0x34, 0xe2, 0xe9, 0x8e, 0x5e, 0x78, 0x26, 0x40,
0x5d, 0x58, 0xde, 0x0f, 0x2e, 0xe8, 0x98, 0x74, 0x68, 0x70, 0xe6, 0x8d, 0xcc, 0xd2, 0xba, 0xb1,
0xd1, 0xdc, 0xb4, 0x17, 0x2f, 0x96, 0x46, 0xe2, 0x0c, 0xcf, 0xfe, 0x01, 0xcc, 0x1d, 0x8f, 0x0d,
0x68, 0x10, 0x90, 0x41, 0x6c, 0x4c, 0xae, 0xd1, 0xd9, 0x3d, 0x95, 0x6e, 0xec, 0xc9, 0xfe, 0x18,
0x3e, 0x5a, 0xa0, 0x4b, 0xb9, 0xc5, 0xfe, 0x2d, 0x2c, 0x6f, 0x8b, 0xbd, 0xe5, 0x2b, 0x7f, 0x07,
0xb5, 0xe3, 0x90, 0x7b, 0x34, 0x60, 0xc5, 0xd6, 0x48, 0x35, 0x1a, 0x89, 0x63, 0x8a, 0xfd, 0x9f,
0x12, 0x54, 0xf7, 0x83, 0x70, 0xca, 0x19, 0x5a, 0x87, 0x66, 0x87, 0x06, 0x9c, 0x5c, 0xf1, 0x13,
0x97, 0x9f, 0xeb, 0x25, 0xd2, 0x22, 0xf4, 0x19, 0xac, 0xec, 0xd0, 0xc1, 0x98, 0x44, 0x67, 0x9e,
0x4f, 0x8e, 0xdc, 0x09, 0xd1, 0xc6, 0xdc, 0x90, 0xa2, 0xcf, 0x61, 0x75, 0x26, 0xd9, 0x0f, 0x7c,
0x2f, 0x20, 0x66, 0x59, 0x22, 0xe7, 0xe4, 0xe8, 0x1d, 0x3c, 0xd4, 0x4b, 0xec, 0x90, 0x33, 0x2f,
0xf0, 0xc4, 0xb6, 0xcc, 0x8a, 0x34, 0x64, 0xc5, 0x09, 0xfb, 0xce, 0x4c, 0x8a, 0xe7, 0x81, 0xe8,
0x3d, 0xb4, 0xc4, 0x8a, 0x43, 0xfd, 0x85, 0x99, 0x4b, 0x32, 0x7a, 0xda, 0x79, 0x07, 0x2a, 0x0c,
0x75, 0x32, 0x8c, 0xdd, 0x80, 0x47, 0xd7, 0x38, 0xab, 0xc5, 0x1a, 0x02, 0x9a, 0x07, 0x09, 0xdf,
0x8f, 0xc9, 0x75, 0xec, 0xfb, 0x31, 0xb9, 0x46, 0xaf, 0x61, 0xe9, 0xc2, 0xf5, 0xa7, 0xa4, 0xd8,
0xf3, 0x69, 0x55, 0x58, 0x11, 0xbe, 0x2b, 0xbd, 0x36, 0xec, 0xbf, 0x37, 0xf4, 0xe1, 0xea, 0xc3,
0x40, 0xdf, 0xc4, 0x67, 0x21, 0xd7, 0x68, 0x6e, 0x3e, 0x29, 0x32, 0x03, 0xc7, 0xe7, 0xf6, 0xbd,
0x88, 0x2e, 0x2f, 0xe0, 0xdd, 0x69, 0x30, 0xd0, 0x1b, 0xf9, 0x34, 0xef, 0xf6, 0x68, 0x18, 0x9e,
0x31, 0xd0, 0x2b, 0xa8, 0x1c, 0x87, 0x9c, 0xc9, 0x03, 0x6a, 0x6e, 0x3e, 0x5b, 0xcc, 0xec, 0xd0,
0xc9, 0x84, 0x06, 0x71, 0xf4, 0x48, 0x02, 0x5a, 0x83, 0xa5, 0x2d, 0xdf, 0xa7, 0x97, 0x66, 0x65,
0xbd, 0xbc, 0xd1, 0xc0, 0x6a, 0x82, 0x7e, 0x05, 0xb5, 0x2d, 0xce, 0x09, 0x4b, 0xce, 0x22, 0xc7,
0x08, 0x05, 0xc2, 0x31, 0x18, 0x1d, 0x43, 0x43, 0xfa, 0x62, 0x2b, 0x1a, 0x31, 0xb3, 0x2a, 0x99,
0x5f, 0xdd, 0x1e, 0xc8, 0x4e, 0xc2, 0x51, 0xe7, 0x38, 0xd3, 0x81, 0x76, 0xa1, 0xd1, 0x71, 0x07,
0xe7, 0xa4, 0x1b, 0xd1, 0x89, 0x59, 0x93, 0x0a, 0x7f, 0x99, 0x63, 0x9c, 0x80, 0x69, 0x85, 0x5a,
0x4d, 0xc2, 0x44, 0x5b, 0x50, 0x93, 0x93, 0x53, 0x6a, 0xd6, 0xef, 0xa7, 0x24, 0xe6, 0x21, 0x1b,
0x96, 0x3b, 0xa3, 0x88, 0x4e, 0xc3, 0x13, 0x37, 0x22, 0x01, 0x37, 0x1b, 0x32, 0x80, 0x32, 0x32,
0xf4, 0x16, 0x6a, 0xbb, 0x57, 0x21, 0x8d, 0x38, 0x33, 0xa1, 0x28, 0x01, 0x2a, 0x90, 0x5e, 0x40,
0x33, 0xd0, 0x27, 0x00, 0xbb, 0x57, 0x3c, 0x72, 0xf7, 0xa8, 0x70, 0x7b, 0x53, 0x1e, 0x47, 0x4a,
0x82, 0xba, 0x50, 0x3d, 0x70, 0xfb, 0xc4, 0x67, 0xe6, 0xb2, 0xd4, 0xed, 0xdc, 0xc1, 0xb1, 0x8a,
0xa0, 0x16, 0xd2, 0x6c, 0x91, 0x21, 0x8e, 0x08, 0xbf, 0xa4, 0xd1, 0xf8, 0x90, 0x0e, 0x89, 0xd9,
0x52, 0x19, 0x22, 0x25, 0x42, 0xcf, 0xa1, 0x75, 0x44, 0x95, 0xf3, 0x3c, 0x9f, 0x93, 0xc8, 0x5c,
0x91, 0x9b, 0xc9, 0x0a, 0x65, 0x3e, 0xf4, 0x5d, 0x7e, 0x46, 0xa3, 0x09, 0x33, 0x1f, 0x48, 0xc4,
0x4c, 0x20, 0x22, 0xa8, 0x47, 0x06, 0x11, 0xe1, 0xcc, 0x5c, 0x2d, 0x8a, 0x20, 0x05, 0xc2, 0x31,
0x18, 0x99, 0x50, 0xeb, 0x9d, 0x4f, 0x7a, 0xde, 0xef, 0x89, 0xf9, 0x70, 0xdd, 0xd8, 0x28, 0xe3,
0x78, 0x8a, 0x5e, 0x42, 0xb9, 0xd7, 0xdb, 0x33, 0x91, 0xd4, 0xf6, 0x51, 0x8e, 0xb6, 0xde, 0x1e,
0x16, 0x28, 0x84, 0xa0, 0x72, 0xea, 0x8e, 0x98, 0xf9, 0x73, 0xb9, 0x2f, 0x39, 0x46, 0x8f, 0xa1,
0x7a, 0xea, 0x46, 0x23, 0xc2, 0xcd, 0x35, 0x69, 0xb3, 0x9e, 0xa1, 0x37, 0x50, 0x7b, 0xef, 0x7b,
0x13, 0x8f, 0x33, 0xf3, 0x51, 0xd1, 0xc5, 0x53, 0xa0, 0xe3, 0x90, 0xe3, 0x18, 0x8f, 0xf6, 0x61,
0xb9, 0x27, 0x0b, 0xf0, 0x89, 0x2c, 0xbb, 0xe6, 0x63, 0xc9, 0x7f, 0xe1, 0x88, 0x62, 0xeb, 0xc4,
0xc5, 0x56, 0x70, 0xd3, 0x65, 0xda, 0x51, 0x60, 0x9c, 0xa1, 0x5a, 0xef, 0x60, 0x25, 0x7b, 0x0d,
0x16, 0x64, 0xaa, 0xb5, 0x74, 0xa6, 0x6a, 0xa4, 0xb2, 0x90, 0xf5, 0x06, 0x9a, 0xa9, 0xb3, 0xbe,
0x0f, 0xd5, 0xc6, 0xb0, 0x9c, 0xce, 0x6d, 0xc2, 0x75, 0xa9, 0xd2, 0x21, 0xc7, 0xc8, 0x01, 0x48,
0x25, 0xf6, 0xd2, 0xc2, 0xc4, 0x9e, 0x42, 0xd8, 0xff, 0x34, 0xa0, 0x95, 0xc9, 0x36, 0xe2, 0x5c,
0xa5, 0x79, 0x24, 0xd2, 0x8a, 0xe3, 0xa9, 0xb8, 0x58, 0x87, 0x84, 0xbb, 0x43, 0x97, 0xbb, 0x5d,
0xcf, 0x8f, 0x37, 0x98, 0x91, 0x09, 0xb6, 0x0e, 0x3e, 0x99, 0xe1, 0xea, 0x38, 0x9e, 0xca, 0xdd,
0x4e, 0x7d, 0x5f, 0x16, 0x9b, 0x3a, 0x96, 0x63, 0x75, 0x93, 0xc4, 0xa5, 0x3a, 0x99, 0xb2, 0x73,
0x73, 0x49, 0x7e, 0x49, 0x49, 0x66, 0xdf, 0x0f, 0xa8, 0x3b, 0x34, 0xab, 0xe9, 0xef, 0x42, 0x22,
0x02, 0xe5, 0xc0, 0x0b, 0xc6, 0x64, 0x68, 0xd6, 0xe4, 0x37, 0x3d, 0xb3, 0xff, 0x61, 0x40, 0x33,
0x75, 0x75, 0x65, 0x90, 0x5d, 0x87, 0x24, 0xf6, 0x94, 0x18, 0xa3, 0x6d, 0x58, 0xda, 0xe2, 0x3c,
0x12, 0x65, 0x5c, 0xc4, 0xe9, 0x17, 0xb7, 0x26, 0x00, 0x47, 0xc2, 0xd5, 0x15, 0x55, 0x54, 0x71,
0x43, 0x77, 0x08, 0xe3, 0x5e, 0xe0, 0x4a, 0x77, 0xab, 0xa2, 0x9b, 0x16, 0x59, 0xaf, 0x01, 0x66,
0xb4, 0x7b, 0x9d, 0xf6, 0x5f, 0x0d, 0x78, 0x38, 0x97, 0xe5, 0x16, 0x5a, 0xb2, 0x97, 0xb5, 0x64,
0xf3, 0x8e, 0x19, 0x73, 0xde, 0x9e, 0xff, 0x63, 0xb7, 0x47, 0x50, 0x55, 0xa5, 0x65, 0xe1, 0x0e,
0x2d, 0xa8, 0xef, 0x78, 0xcc, 0xed, 0xfb, 0x64, 0x28, 0xa9, 0x75, 0x9c, 0xcc, 0x65, 0x5d, 0x93,
0xbb, 0x57, 0xde, 0x53, 0x13, 0x5b, 0xe5, 0x10, 0xb4, 0x02, 0xa5, 0xa4, 0xaf, 0x2c, 0xed, 0xef,
0x08, 0xb0, 0x08, 0x73, 0x65, 0x6a, 0x03, 0xab, 0x89, 0xdd, 0x85, 0xaa, 0xca, 0x4a, 0x73, 0x78,
0x0b, 0xea, 0x22, 0x2c, 0xe5, 0x35, 0x51, 0x7b, 0x4e, 0xe6, 0xc2, 0xbc, 0xdd, 0xe0, 0x42, 0x2f,
0x2b, 0x86, 0xf6, 0xab, 0x54, 0x69, 0x17, 0x76, 0xc8, 0x9e, 0x4b, 0xdb, 0x21, 0x3b, 0xad, 0xc7,
0x50, 0xed, 0xd2, 0x68, 0xe2, 0x72, 0xad, 0x4c, 0xcf, 0x6c, 0x1b, 0x56, 0xf6, 0x03, 0x16, 0x92,
0x01, 0xcf, 0x6f, 0xc5, 0x8f, 0xe1, 0x41, 0x82, 0xd1, 0x4d, 0x78, 0xaa, 0x97, 0x34, 0xee, 0xdf,
0x4b, 0xfe, 0xc5, 0x80, 0x46, 0x92, 0xe9, 0x50, 0x07, 0xaa, 0xf2, 0x34, 0xe2, 0x8e, 0xfe, 0xe5,
0x2d, 0xa9, 0xd1, 0xf9, 0x20, 0xd1, 0xba, 0xe2, 0x28, 0xaa, 0xf5, 0x23, 0x34, 0x53, 0xe2, 0x05,
0x01, 0xb0, 0x99, 0xed, 0xc0, 0x9e, 0x14, 0x2d, 0x92, 0x0e, 0x8f, 0x1d, 0xa8, 0x2a, 0xe1, 0x42,
0xb7, 0x22, 0xa8, 0xec, 0xb9, 0x91, 0x0a, 0x8d, 0x32, 0x96, 0x63, 0x21, 0xeb, 0xd1, 0x33, 0x2e,
0x8f, 0xa7, 0x8c, 0xe5, 0xd8, 0xfe, 0x9b, 0x01, 0x2d, 0xdd, 0x9e, 0x6b, 0x0f, 0x12, 0x58, 0x55,
0x37, 0x94, 0x44, 0xb1, 0x4c, 0xdb, 0xff, 0xa6, 0xc0, 0x95, 0x31, 0xd4, 0xb9, 0xc9, 0x55, 0xde,
0x98, 0x53, 0x69, 0x75, 0xe0, 0xd1, 0x42, 0xe8, 0xbd, 0xae, 0xc8, 0x0b, 0x78, 0x38, 0x7b, 0x78,
0xe4, 0xc7, 0xc9, 0x1a, 0xa0, 0x34, 0x4c, 0x3f, 0x4c, 0x3e, 0x85, 0xa6, 0x78, 0xc8, 0xe5, 0xd3,
0x6c, 0x58, 0x56, 0x00, 0xed, 0x19, 0x04, 0x95, 0x31, 0xb9, 0x56, 0xd1, 0xd0, 0xc0, 0x72, 0x6c,
0xff, 0xd9, 0x10, 0xef, 0xb1, 0x70, 0xca, 0x0f, 0x09, 0x63, 0xee, 0x48, 0x04, 0x60, 0x65, 0x3f,
0xf0, 0xb8, 0x8e, 0xbe, 0xcf, 0x0a, 0xfa, 0x5f, 0x01, 0xd3, 0xac, 0xbd, 0x9f, 0x61, 0xc9, 0x12,
0xad, 0xec, 0x8e, 0xcb, 0x5d, 0x1d, 0x0b, 0x39, 0x1d, 0x94, 0x40, 0xa4, 0x88, 0x62, 0xba, 0x5d,
0x13, 0x8f, 0xcf, 0x70, 0xca, 0xed, 0xe7, 0xb0, 0x7a, 0x53, 0xfb, 0x02, 0xd3, 0xbe, 0x86, 0x66,
0x4a, 0x8b, 0xbc, 0xb7, 0xc7, 0x5d, 0x09, 0xa8, 0x63, 0x31, 0x14, 0xb6, 0x26, 0x1b, 0x59, 0x56,
0x6b, 0xd8, 0x0f, 0xa0, 0x25, 0x55, 0x27, 0x1e, 0xfc, 0x43, 0x09, 0x6a, 0xb1, 0x8a, 0x57, 0x19,
0xbb, 0x9f, 0xe6, 0xd9, 0x3d, 0x6f, 0xf2, 0xb7, 0x50, 0x49, 0x4a, 0x5f, 0x6e, 0xfb, 0xd1, 0x1d,
0xa6, 0x68, 0xb2, 0x2a, 0x7e, 0x0f, 0x55, 0x4c, 0x98, 0x68, 0x95, 0x0a, 0xdb, 0x7e, 0x85, 0x99,
0x91, 0x35, 0x49, 0xd0, 0x7b, 0xde, 0x28, 0x70, 0x7d, 0xfd, 0x52, 0xcb, 0xa1, 0x2b, 0x4c, 0x8a,
0xae, 0x04, 0x33, 0x77, 0xff, 0xd1, 0x80, 0x66, 0xa1, 0xab, 0x8b, 0x9f, 0xce, 0x73, 0xcf, 0xf9,
0xf2, 0xff, 0xf8, 0x9c, 0xff, 0x97, 0x91, 0x55, 0x24, 0xeb, 0xbc, 0xb8, 0x4f, 0x21, 0xf5, 0x02,
0xae, 0x43, 0x36, 0x25, 0x11, 0x1b, 0xed, 0x4c, 0x86, 0x3a, 0xe9, 0x8b, 0xe1, 0x2c, 0x79, 0x97,
0x75, 0xf2, 0x16, 0x41, 0xf0, 0x9e, 0x91, 0x48, 0xba, 0xa8, 0x81, 0xe5, 0x58, 0xe4, 0xeb, 0x23,
0x2a, 0xa5, 0xaa, 0xb7, 0xd0, 0x33, 0xa9, 0xef, 0x52, 0x35, 0x14, 0x42, 0xdf, 0xa5, 0xac, 0x42,
0x47, 0x54, 0xc8, 0x54, 0x23, 0xa1, 0x26, 0x02, 0x77, 0xca, 0xaf, 0xcd, 0xba, 0x0a, 0xb5, 0x53,
0x7e, 0x2d, 0x0a, 0x0a, 0xa6, 0xbe, 0xdf, 0x77, 0x07, 0x63, 0xf9, 0xb0, 0xa8, 0xe3, 0x64, 0x2e,
0x7a, 0x1f, 0xe1, 0x5d, 0xcf, 0xf5, 0x4d, 0x50, 0xbd, 0x8f, 0x9e, 0xda, 0x5b, 0xd0, 0x48, 0x82,
0x42, 0xd4, 0xa8, 0xee, 0x50, 0x3a, 0xbd, 0x85, 0x4b, 0xdd, 0x61, 0x1c, 0xcf, 0xa5, 0xf9, 0x78,
0x2e, 0xa7, 0xe2, 0xf9, 0x15, 0xb4, 0x32, 0xe1, 0x21, 0x40, 0x98, 0x5e, 0x32, 0xad, 0x48, 0x8e,
0x85, 0xac, 0x43, 0x7d, 0xf5, 0xcf, 0x44, 0x0b, 0xcb, 0xb1, 0xfd, 0x0c, 0x5a, 0x99, 0xc0, 0x58,
0x94, 0x81, 0xed, 0xa7, 0xd0, 0xea, 0x71, 0x97, 0x4f, 0x0b, 0xfe, 0x4a, 0xfa, 0xb7, 0x01, 0x2b,
0x31, 0x46, 0xe7, 0x98, 0x6f, 0xa0, 0x7e, 0x41, 0x22, 0x4e, 0xae, 0x92, 0xaa, 0x63, 0xce, 0x37,
0xd4, 0x1f, 0x24, 0x02, 0x27, 0x48, 0xf4, 0x1d, 0xd4, 0x99, 0xd4, 0x43, 0xe2, 0x8e, 0xe5, 0x93,
0x3c, 0x96, 0x5e, 0x2f, 0xc1, 0xa3, 0x36, 0x54, 0x7c, 0x3a, 0x62, 0xf2, 0xdc, 0x9b, 0x9b, 0x1f,
0xe7, 0xf1, 0x0e, 0xe8, 0x08, 0x4b, 0x20, 0x7a, 0x0b, 0xf5, 0x4b, 0x37, 0x0a, 0xbc, 0x60, 0xc4,
0xe4, 0xc3, 0x59, 0x5c, 0xda, 0x1c, 0xd2, 0x8f, 0x0a, 0x87, 0x13, 0x82, 0xdd, 0x12, 0xd7, 0xe5,
0x8c, 0x6a, 0x9f, 0xd8, 0xbf, 0x16, 0x51, 0x2b, 0xa6, 0xda, 0xfc, 0x7d, 0x68, 0xa9, 0xc8, 0xff,
0x40, 0x22, 0x26, 0xfa, 0x3f, 0xa3, 0xe8, 0x76, 0x6e, 0xa7, 0xa1, 0x38, 0xcb, 0xb4, 0x7f, 0xd2,
0x85, 0x2d, 0x16, 0x88, 0x58, 0x0a, 0xdd, 0xc1, 0xd8, 0x1d, 0xc5, 0xe7, 0x14, 0x4f, 0xc5, 0x97,
0x0b, 0xbd, 0x9e, 0xba, 0xa0, 0xf1, 0x54, 0xc4, 0x66, 0x44, 0x2e, 0x3c, 0x36, 0x6b, 0x45, 0x93,
0xf9, 0xe6, 0x9f, 0x6a, 0x00, 0x9d, 0x64, 0x3f, 0xe8, 0x04, 0x96, 0xe4, 0x7a, 0xc8, 0x2e, 0x2c,
0x93, 0xd2, 0x6e, 0xeb, 0xd9, 0x1d, 0x4a, 0x29, 0xfa, 0x20, 0x82, 0x5f, 0xb6, 0x37, 0xe8, 0x79,
0x5e, 0x42, 0x48, 0x77, 0x48, 0xd6, 0x8b, 0x5b, 0x50, 0x5a, 0xef, 0x7b, 0xa8, 0xaa, 0x28, 0x40,
0x79, 0x59, 0x2f, 0x1d, 0xb7, 0xd6, 0xf3, 0x62, 0x90, 0x52, 0xfa, 0xa5, 0x81, 0xb0, 0xce, 0x89,
0xc8, 0x2e, 0x28, 0x7a, 0xfa, 0xc6, 0xe4, 0x39, 0x20, 0x53, 0x5f, 0x36, 0x0c, 0xf4, 0x03, 0x54,
0x55, 0x56, 0x43, 0xbf, 0x58, 0x4c, 0x88, 0xf5, 0x15, 0x7f, 0xde, 0x30, 0xbe, 0x34, 0xd0, 0x21,
0x54, 0x44, 0x39, 0x47, 0x39, 0xb5, 0x29, 0xd5, 0x0b, 0x58, 0x76, 0x11, 0x44, 0x7b, 0xf1, 0x27,
0x80, 0x59, 0x53, 0x81, 0x72, 0xfe, 0x53, 0x99, 0xeb, 0x4e, 0xac, 0x8d, 0xdb, 0x81, 0x7a, 0x81,
0x43, 0x51, 0x51, 0xcf, 0x28, 0xca, 0xad, 0xa5, 0xc9, 0x35, 0xb2, 0xec, 0x22, 0x88, 0x56, 0x77,
0x0e, 0xad, 0xcc, 0xff, 0xd6, 0xe8, 0xf3, 0x7c, 0x23, 0x6f, 0xfe, 0x0d, 0x6e, 0xbd, 0xbc, 0x13,
0x56, 0xaf, 0xc4, 0xd3, 0x5d, 0x99, 0xfe, 0x8c, 0x9c, 0xdb, 0xec, 0xce, 0xfe, 0x07, 0x6d, 0xb5,
0xef, 0x8c, 0x57, 0xab, 0x6e, 0x57, 0x7e, 0x53, 0x0a, 0xfb, 0xfd, 0xaa, 0xfc, 0x3b, 0xff, 0xeb,
0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x09, 0xb4, 0x4e, 0xa7, 0x9a, 0x18, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

@ -4,6 +4,7 @@ package buildx.controller.v1;
import "github.com/moby/buildkit/api/services/control/control.proto";
import "github.com/moby/buildkit/sourcepolicy/pb/policy.proto";
import "github.com/moby/buildkit/solver/pb/ops.proto";
option go_package = "pb";
@ -46,37 +47,59 @@ message BuildRequest {
BuildOptions Options = 2;
}
message BuildOptions {
message Inputs {
string ContextPath = 1;
string DockerfileName = 2;
PrintFunc PrintFunc = 3;
map<string, string> NamedContexts = 4;
repeated string Allow = 5;
repeated Attest Attests = 6;
map<string, string> BuildArgs = 7;
repeated CacheOptionsEntry CacheFrom = 8;
repeated CacheOptionsEntry CacheTo = 9;
string CgroupParent = 10;
repeated ExportEntry Exports = 11;
repeated string ExtraHosts = 12;
map<string, string> Labels = 13;
string NetworkMode = 14;
repeated string NoCacheFilter = 15;
repeated string Platforms = 16;
repeated Secret Secrets = 17;
int64 ShmSize = 18;
repeated SSH SSH = 19;
repeated string Tags = 20;
string Target = 21;
UlimitOpt Ulimits = 22;
string Builder = 23;
bool NoCache = 24;
bool Pull = 25;
bool ExportPush = 26;
bool ExportLoad = 27;
moby.buildkit.v1.sourcepolicy.Policy SourcePolicy = 28;
string DockerfileInline = 3;
pb.Definition ContextDefinition = 4;
map<string, NamedContext> NamedContexts = 5;
// io.Reader InStream = ???;
}
message BuildOptions {
Inputs Inputs = 1;
PrintFunc PrintFunc = 2;
CommonOptions Opts = 3;
repeated string Allow = 4;
repeated Attest Attests = 5;
map<string, string> BuildArgs = 6;
repeated CacheOptionsEntry CacheFrom = 7;
repeated CacheOptionsEntry CacheTo = 8;
string CgroupParent = 9;
repeated ExportEntry Exports = 10;
repeated string ExtraHosts = 11;
map<string, string> Labels = 12;
string NetworkMode = 13;
repeated string NoCacheFilter = 14;
repeated string Platforms = 15;
repeated Secret Secrets = 16;
int64 ShmSize = 17;
repeated SSH SSH = 18;
repeated string Tags = 19;
string Target = 20;
UlimitOpt Ulimits = 21;
moby.buildkit.v1.sourcepolicy.Policy SourcePolicy = 22;
}
message NamedContext {
string Path = 1;
pb.Definition Definition = 2;
}
message CommonOptions {
string Builder = 1;
string MetadataFile = 2;
bool NoCache = 3;
// string Progress: no progress view on server side
bool Pull = 4;
bool ExportPush = 5;
bool ExportLoad = 6;
// TODO: we should remove Linked from the controllerapi, it's only used to
// produce a single warning. To allow this, we need to move the default
// export detection out from the controller server, as well as load the
// driver on the controller client.
bool Linked = 7;
}
message ExportEntry {

@ -11,52 +11,6 @@ import (
// ResolveOptionPaths resolves all paths contained in BuildOptions
// and replaces them to absolute paths.
func ResolveOptionPaths(options *BuildOptions) (_ *BuildOptions, err error) {
localContext := false
if options.ContextPath != "" && options.ContextPath != "-" {
if !isRemoteURL(options.ContextPath) {
localContext = true
options.ContextPath, err = filepath.Abs(options.ContextPath)
if err != nil {
return nil, err
}
}
}
if options.DockerfileName != "" && options.DockerfileName != "-" {
if localContext && !urlutil.IsURL(options.DockerfileName) {
options.DockerfileName, err = filepath.Abs(options.DockerfileName)
if err != nil {
return nil, err
}
}
}
var contexts map[string]string
for k, v := range options.NamedContexts {
if isRemoteURL(v) || strings.HasPrefix(v, "docker-image://") {
// url prefix, this is a remote path
} else if strings.HasPrefix(v, "oci-layout://") {
// oci layout prefix, this is a local path
p := strings.TrimPrefix(v, "oci-layout://")
p, err = filepath.Abs(p)
if err != nil {
return nil, err
}
v = "oci-layout://" + p
} else {
// no prefix, assume local path
v, err = filepath.Abs(v)
if err != nil {
return nil, err
}
}
if contexts == nil {
contexts = make(map[string]string)
}
contexts[k] = v
}
options.NamedContexts = contexts
var cacheFrom []*CacheOptionsEntry
for _, co := range options.CacheFrom {
switch co.Type {
@ -161,6 +115,59 @@ func ResolveOptionPaths(options *BuildOptions) (_ *BuildOptions, err error) {
}
options.SSH = ssh
if options.Inputs == nil {
return options, nil
}
localContext := false
if options.Inputs.ContextPath != "" && options.Inputs.ContextPath != "-" {
if !isRemoteURL(options.Inputs.ContextPath) {
localContext = true
options.Inputs.ContextPath, err = filepath.Abs(options.Inputs.ContextPath)
if err != nil {
return nil, err
}
}
}
if options.Inputs.DockerfileName != "" && options.Inputs.DockerfileName != "-" {
if localContext && !urlutil.IsURL(options.Inputs.DockerfileName) {
options.Inputs.DockerfileName, err = filepath.Abs(options.Inputs.DockerfileName)
if err != nil {
return nil, err
}
}
}
var contexts map[string]*NamedContext
for k, v := range options.Inputs.NamedContexts {
v := *v
if v.Definition != nil {
// definition, no path
} else if urlutil.IsGitURL(v.Path) || urlutil.IsURL(v.Path) || strings.HasPrefix(v.Path, "docker-image://") {
// url prefix, this is a remote path
} else if strings.HasPrefix(v.Path, "oci-layout://") {
// oci layout prefix, this is a local path
p := strings.TrimPrefix(v.Path, "oci-layout://")
p, err = filepath.Abs(p)
if err != nil {
return nil, err
}
v.Path = "oci-layout://" + p
} else {
// no prefix, assume local path
v.Path, err = filepath.Abs(v.Path)
if err != nil {
return nil, err
}
}
if contexts == nil {
contexts = make(map[string]*NamedContext)
}
contexts[k] = &v
}
options.Inputs.NamedContexts = contexts
return options, nil
}

@ -20,46 +20,86 @@ func TestResolvePaths(t *testing.T) {
want BuildOptions
}{
{
name: "contextpath",
options: BuildOptions{ContextPath: "test"},
want: BuildOptions{ContextPath: filepath.Join(tmpwd, "test")},
name: "contextpath",
options: BuildOptions{
Inputs: &Inputs{ContextPath: "test"},
},
want: BuildOptions{
Inputs: &Inputs{ContextPath: filepath.Join(tmpwd, "test")},
},
},
{
name: "contextpath-cwd",
options: BuildOptions{ContextPath: "."},
want: BuildOptions{ContextPath: tmpwd},
name: "contextpath-cwd",
options: BuildOptions{
Inputs: &Inputs{ContextPath: "."},
},
want: BuildOptions{
Inputs: &Inputs{ContextPath: tmpwd},
},
},
{
name: "contextpath-dash",
options: BuildOptions{ContextPath: "-"},
want: BuildOptions{ContextPath: "-"},
name: "contextpath-dash",
options: BuildOptions{
Inputs: &Inputs{ContextPath: "-"},
},
want: BuildOptions{
Inputs: &Inputs{ContextPath: "-"},
},
},
{
name: "contextpath-ssh",
options: BuildOptions{ContextPath: "git@github.com:docker/buildx.git"},
want: BuildOptions{ContextPath: "git@github.com:docker/buildx.git"},
name: "contextpath-ssh",
options: BuildOptions{
Inputs: &Inputs{ContextPath: "git@github.com:docker/buildx.git"},
},
want: BuildOptions{
Inputs: &Inputs{ContextPath: "git@github.com:docker/buildx.git"},
},
},
{
name: "dockerfilename",
options: BuildOptions{DockerfileName: "test", ContextPath: "."},
want: BuildOptions{DockerfileName: filepath.Join(tmpwd, "test"), ContextPath: tmpwd},
name: "dockerfilename",
options: BuildOptions{
Inputs: &Inputs{DockerfileName: "test", ContextPath: "."},
},
want: BuildOptions{
Inputs: &Inputs{DockerfileName: filepath.Join(tmpwd, "test"), ContextPath: tmpwd},
},
},
{
name: "dockerfilename-dash",
options: BuildOptions{DockerfileName: "-", ContextPath: "."},
want: BuildOptions{DockerfileName: "-", ContextPath: tmpwd},
name: "dockerfilename-dash",
options: BuildOptions{
Inputs: &Inputs{DockerfileName: "-", ContextPath: "."},
},
want: BuildOptions{
Inputs: &Inputs{DockerfileName: "-", ContextPath: tmpwd},
},
},
{
name: "dockerfilename-remote",
options: BuildOptions{DockerfileName: "test", ContextPath: "git@github.com:docker/buildx.git"},
want: BuildOptions{DockerfileName: "test", ContextPath: "git@github.com:docker/buildx.git"},
name: "dockerfilename-remote",
options: BuildOptions{
Inputs: &Inputs{DockerfileName: "test", ContextPath: "git@github.com:docker/buildx.git"},
},
want: BuildOptions{
Inputs: &Inputs{DockerfileName: "test", ContextPath: "git@github.com:docker/buildx.git"},
},
},
{
name: "contexts",
options: BuildOptions{NamedContexts: map[string]string{"a": "test1", "b": "test2",
"alpine": "docker-image://alpine@sha256:0123456789", "project": "https://github.com/myuser/project.git"}},
want: BuildOptions{NamedContexts: map[string]string{"a": filepath.Join(tmpwd, "test1"), "b": filepath.Join(tmpwd, "test2"),
"alpine": "docker-image://alpine@sha256:0123456789", "project": "https://github.com/myuser/project.git"}},
options: BuildOptions{
Inputs: &Inputs{NamedContexts: map[string]*NamedContext{
"a": {Path: "test1"},
"b": {Path: "test2"},
"alpine": {Path: "docker-image://alpine@sha256:0123456789"},
"project": {Path: "https://github.com/myuser/project.git"},
},
}},
want: BuildOptions{
Inputs: &Inputs{NamedContexts: map[string]*NamedContext{
"a": {Path: filepath.Join(tmpwd, "test1")},
"b": {Path: filepath.Join(tmpwd, "test2")},
"alpine": {Path: "docker-image://alpine@sha256:0123456789"},
"project": {Path: "https://github.com/myuser/project.git"},
},
}},
},
{
name: "cache-from",

@ -3,15 +3,16 @@ package buildflags
import (
"strings"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/docker/distribution/reference"
"github.com/pkg/errors"
)
func ParseContextNames(values []string) (map[string]string, error) {
func ParseContextNames(values []string) (map[string]*controllerapi.NamedContext, error) {
if len(values) == 0 {
return nil, nil
}
result := make(map[string]string, len(values))
result := make(map[string]*controllerapi.NamedContext, len(values))
for _, value := range values {
kv := strings.SplitN(value, "=", 2)
if len(kv) != 2 {
@ -22,7 +23,7 @@ func ParseContextNames(values []string) (map[string]string, error) {
return nil, errors.Wrapf(err, "invalid context name %s", kv[0])
}
name := strings.TrimSuffix(reference.FamiliarString(named), ":latest")
result[name] = kv[1]
result[name] = &controllerapi.NamedContext{Path: kv[1]}
}
return result, nil
}

Loading…
Cancel
Save