Import changes for goma server

  - 911cc693fe6893f5cff9e1233660a95d81d65226 use github.com/bazelbuild/remote-apis
  - 1e1260fe16cebf8dbf9cf6492c41acb87fba379c roll cloud.google.com/go to 0.38.0
  - ce25504b9f0dc3014ff224a2b91d8bca2c1dfa5f roll google.golang.org/api to 0.4.0
  - ac2ccec0ffb4cf64403224fc5d5bf11ca03163a1 Allow arbitrary script name to as a wrapper script.
  - f71ce1e66b26dc811051e9e4f4db666a9639f041 remoteexec: no warn if op.metadata is nil
  - 69bd629b0b2ad20db1548ac22d9d262d9430cfe4 inputRootDir suggests use of overlay if it is needed.
  - 22550b34d191cb2429858d8d30aa59e728ff1f4c remoteexec: cwd agnostic test for ATS
  - 6d3b3f1f6ec031b7d4205c3ec7a674c23308e44e exec: Pick sets selector in cmdConfig
  - 46f16c7dff0436829fc61ff02e5c0f136da916e5 roll google.golang.org/grpc to 1.20.1
  - fed8af5e12f814b8b9ef4c04692bc2d7d84042c0 Exclude infra directory.
  - 543e146a14af12a3724403af910ef375635becc0 Reland "Allow to have multiple wrapper scripts."
  - 6e2ee97899a8a601580425ff8c74a2ec33599296 fix: error strings should not be capitalized & no arg err...
  - 8b529445fa3420c70fbf2d39eed7d994cc28554f remoteexec_proxy: add -file-cache-bucket
  - ff36c19b7ba7e768cae3ded4c074793f3e50aa73 Add function to confirm docker & workdir won't be overwri...
  - 134662af055e6805d6ee4ea926a25223cc77414d Revert "Allow to have multiple wrapper scripts."
  - 9b3fefa9841a321aa36455bf233f33b656325a96 Allow to have multiple wrapper scripts.
  - 4b191d09b6dbd8ab225784bc619f18d659d8f7ef remoteexec: Log input paths when no common dir found
  - 21ff47c58b5cbe63fc09d2f8647373d415deac53 remoteexec: Rename commonDirHasCommonPaths -> validCommon...
  - c755b3dfd3e260e445afa0a2abedf4ca4b80d859 remoteexec: Refactor inputroot.inputRootDir()
  - 37cf82aa8e6f6c9b31e2cd005e44a8ba9a471e4b goma_replay: count errors
  - 276a5308828814b736f3ee05072b2171db740b1f goma_replay: improve
  - 35340d6f853a4f9ed75758ab5a7da9658dcd1fa2 roll google.golang.org/grpc to 1.20.0
  - ca6e254669892e0508b4988ad42c77d93a393d5a remoteexec: Log all timestamps on one line

GitOrigin-RevId: 911cc693fe6893f5cff9e1233660a95d81d65226
Change-Id: I05e4f511cff49e0c594234c3156599c644558290
diff --git a/cache/redis/client.go b/cache/redis/client.go
index 5c48b5e..40bae91 100644
--- a/cache/redis/client.go
+++ b/cache/redis/client.go
@@ -6,6 +6,7 @@
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"net"
 	"os"
@@ -29,7 +30,7 @@
 	host := os.Getenv("REDISHOST")
 	port := os.Getenv("REDISPORT")
 	if host == "" {
-		return "", fmt.Errorf("no REDISHOST environment")
+		return "", errors.New("no REDISHOST environment")
 	}
 	if port == "" {
 		port = "6379" // redis default port
diff --git a/cmd/auth_server/main.go b/cmd/auth_server/main.go
index f04157e..e152ae0 100644
--- a/cmd/auth_server/main.go
+++ b/cmd/auth_server/main.go
@@ -14,7 +14,7 @@
 	"flag"
 	"path/filepath"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"go.opencensus.io/plugin/ocgrpc"
 	"go.opencensus.io/stats"
diff --git a/cmd/exec_server/main.go b/cmd/exec_server/main.go
index 87f65bd..1ee2ff3 100644
--- a/cmd/exec_server/main.go
+++ b/cmd/exec_server/main.go
@@ -11,6 +11,7 @@
 import (
 	"context"
 	"crypto/tls"
+	"errors"
 	"flag"
 	"fmt"
 	"io"
@@ -19,7 +20,7 @@
 	"path"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"cloud.google.com/go/pubsub"
 	"cloud.google.com/go/storage"
@@ -184,7 +185,7 @@
 	if *pubsubProjectID == "" {
 		*pubsubProjectID = server.ProjectID(ctx)
 		if *pubsubProjectID == "" {
-			return nil, fmt.Errorf("--pubsub-project-id must be set")
+			return nil, errors.New("--pubsub-project-id must be set")
 		}
 	}
 	var err error
diff --git a/cmd/goma_replay/main.go b/cmd/goma_replay/main.go
index 06567ae..7867666 100644
--- a/cmd/goma_replay/main.go
+++ b/cmd/goma_replay/main.go
@@ -20,11 +20,14 @@
 	"io/ioutil"
 	"net/http"
 	"os"
+	"os/signal"
 	"os/user"
 	"path/filepath"
 	"strconv"
 	"strings"
 	"sync"
+	"sync/atomic"
+	"syscall"
 	"time"
 
 	"github.com/golang/protobuf/proto"
@@ -40,8 +43,9 @@
 var (
 	dataSourceDir = flag.String("data_source_dir", gomaTmpDir(), "data source directory")
 
-	repeat = flag.Int("n", 1, "N repeat request")
-	limit  = flag.Int("l", 1, "limit at most N request")
+	repeat  = flag.Int("n", 1, "N repeat request")
+	limit   = flag.Int("l", 1, "limit at most N request")
+	buildID = flag.String("build_id", "", "overrides build_id")
 
 	asInternal = flag.Bool("as_internal", true, "use oauth2 for internal client")
 	verbose    = flag.Bool("v", false, "verbose flag")
@@ -87,8 +91,12 @@
 			return fmt.Errorf("%s: %v", path, err)
 		}
 		clearInputs(req)
+		if *buildID != "" {
+			req.GetRequesterInfo().BuildId = proto.String(*buildID)
+		}
 		reqs = append(reqs, req)
-		fmt.Println("use ", path)
+		fmt.Printf("req[%d]=%s\n", len(reqs)-1, path)
+		logger.Debugf("req[%d]=%s", len(reqs)-1, req)
 		return nil
 	})
 	logger.Infof("loaded %d req(s): err=%v", len(reqs), err)
@@ -258,34 +266,101 @@
 	if err != nil {
 		fatalf("request data: %v", err)
 	}
+	if *buildID != "" {
+		fmt.Println("build_id:", *buildID)
+	}
+
+	sigch := make(chan os.Signal, 1)
+	signal.Notify(sigch, syscall.SIGTERM, syscall.SIGINT)
+	ctx, cancel := context.WithCancel(ctx)
+	defer cancel()
+	go func() {
+		for {
+			<-sigch
+			fmt.Println("interrupted")
+			if ctx.Err() != nil {
+				fmt.Println("interrupted again. exiting...")
+				os.Exit(1)
+			}
+			cancel()
+		}
+	}()
 
 	t0 := time.Now()
 	var wg sync.WaitGroup
-	sema := make(chan bool, *limit)
-	for i, req := range reqs {
-		for j := 0; j < *repeat; j++ {
-			wg.Add(1)
-			go func(i int, req *gomapb.ExecReq) {
-				defer wg.Done()
+	nreq, nrep := len(reqs), *repeat
+	// atomic counters
+	var (
+		running, finished int32
+		httpErrors        int32
+		gomaExecErrors    int32
+		gomaMissingInputs int32
+		gomaOtherErrors   int32
+	)
+	wg.Add(1)
+	go func() {
+		defer wg.Done()
+		sema := make(chan bool, *limit)
+	Loop:
+		for i, req := range reqs {
+			for j := 0; j < *repeat; j++ {
+				if ctx.Err() != nil {
+					nreq = i
+					nrep = j
+					break Loop
+				}
+				wg.Add(1)
 				sema <- true
-				defer func() {
-					<-sema
-				}()
-				resp := &gomapb.ExecResp{}
-				t := time.Now()
-				err = httprpc.Call(ctx, c, targ.String(), req, resp)
-				if err != nil {
-					errorf("req[%d] %v", i, err)
-				}
-				if e := resp.GetError(); e != gomapb.ExecResp_OK {
-					errorf("req[%d] ExecError %s", e)
-					logger.Debugf("%s", resp)
-				}
-
-				logger.Infof("req[%d] %s %s", i, resp.GetError(), time.Since(t))
-			}(i, req)
+				go func(i, j int, req *gomapb.ExecReq) {
+					defer wg.Done()
+					defer func() {
+						atomic.AddInt32(&running, -1)
+						atomic.AddInt32(&finished, 1)
+						<-sema
+					}()
+					atomic.AddInt32(&running, 1)
+					resp := &gomapb.ExecResp{}
+					t := time.Now()
+					err = httprpc.Call(ctx, c, targ.String(), req, resp)
+					if err != nil {
+						if ctx.Err() != nil {
+							return
+						}
+						atomic.AddInt32(&httpErrors, 1)
+						errorf("req[%d]%d %v", i, j, err)
+					}
+					if e := resp.GetError(); e != gomapb.ExecResp_OK {
+						atomic.AddInt32(&gomaExecErrors, 1)
+						errorf("req[%d]%d ExecError %s %s", i, j, e, time.Since(t))
+						logger.Debugf("%s", resp)
+					}
+					if len(resp.MissingInput) > 0 {
+						atomic.AddInt32(&gomaMissingInputs, 1)
+						errorf("req[%d]%d missing inputs=%d %s", i, j, len(resp.MissingInput), time.Since(t))
+					}
+					if len(resp.ErrorMessage) > 0 {
+						atomic.AddInt32(&gomaOtherErrors, 1)
+						errorf("req[%d]%d error %q %s", i, j, resp.ErrorMessage, time.Since(t))
+					}
+					logger.Infof("req[%d]%d %s %s", i, j, resp.GetError(), time.Since(t))
+				}(i, j, req)
+				fmt.Printf("req[%d]%d/%d %d/%d error %d/%d/%d/%d %s\r", i, j, *repeat,
+					atomic.LoadInt32(&running),
+					atomic.LoadInt32(&finished),
+					atomic.LoadInt32(&httpErrors),
+					atomic.LoadInt32(&gomaExecErrors),
+					atomic.LoadInt32(&gomaMissingInputs),
+					atomic.LoadInt32(&gomaOtherErrors),
+					time.Since(t0))
+			}
 		}
-	}
+	}()
 	wg.Wait()
-	fmt.Printf("%s %d reqs * %d (limit:%d) in %s\n", targ, len(reqs), *repeat, *limit, time.Since(t0))
+	fmt.Printf("%s %d/%d reqs * %d/%d (limit:%d) finished=%d error http=%d/exec=%d/missing=%d/other=%d in %s\n", targ, nreq, len(reqs), nrep, *repeat, *limit,
+		atomic.LoadInt32(&finished),
+		atomic.LoadInt32(&httpErrors),
+		atomic.LoadInt32(&gomaExecErrors),
+		atomic.LoadInt32(&gomaMissingInputs),
+		atomic.LoadInt32(&gomaOtherErrors),
+		time.Since(t0))
 }
diff --git a/cmd/remoteexec_proxy/main.go b/cmd/remoteexec_proxy/main.go
index 58f6128..395d284 100644
--- a/cmd/remoteexec_proxy/main.go
+++ b/cmd/remoteexec_proxy/main.go
@@ -23,10 +23,12 @@
 	"strings"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
+	"cloud.google.com/go/storage"
 	"go.opencensus.io/plugin/ocgrpc"
 	"go.opencensus.io/trace"
+	"google.golang.org/api/option"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials"
 
@@ -34,6 +36,7 @@
 	"go.chromium.org/goma/server/auth/account"
 	"go.chromium.org/goma/server/auth/acl"
 	"go.chromium.org/goma/server/cache"
+	"go.chromium.org/goma/server/cache/gcs"
 	"go.chromium.org/goma/server/cache/redis"
 	"go.chromium.org/goma/server/file"
 	"go.chromium.org/goma/server/frontend"
@@ -60,9 +63,11 @@
 	remoteexecAddr         = flag.String("remoteexec-addr", "", "remoteexec API endpoint")
 	remoteInstanceName     = flag.String("remote-instance-name", "", "remote instance name")
 	whitelistedUsers       = flag.String("whitelisted-users", "", "comma separated list of whitelisted user. if empty, current user is allowed.")
-	serviceAccountJSON     = flag.String("service-account-json", "", "service account json")
+	serviceAccountJSON     = flag.String("service-account-json", "", "service account json, used to talk to RBE and cloud storage (if --file-cache-bucket is used)")
 	platformContainerImage = flag.String("platform-container-image", "", "docker uri of platform container image")
 
+	fileCacheBucket = flag.String("file-cache-bucket", "", "file cache bucking store bucket")
+
 	traceProjectID = flag.String("trace-project-id", "", "project id for cloud tracing")
 	traceFraction  = flag.Float64("trace-sampling-fraction", 1.0, "sampling fraction for stackdriver trace")
 	traceQPS       = flag.Float64("trace-sampling-qps-limit", 1.0, "sampling qps limit for stackdriver trace")
@@ -255,19 +260,36 @@
 		CheckToken: aclCheck.CheckToken,
 	}
 
-	// TODO: support redis for cache?
-	cacheService, err := cache.New(cache.Config{
-		MaxBytes: 1 * 1024 * 1024 * 1024,
-	})
-	if err != nil {
-		logger.Fatal(err)
+	var cclient cachepb.CacheServiceClient
+	if *fileCacheBucket != "" {
+		logger.Infof("use cloud storage bucket: %s", *fileCacheBucket)
+		var opts []option.ClientOption
+		if *serviceAccountJSON != "" {
+			opts = append(opts, option.WithServiceAccountFile(*serviceAccountJSON))
+		}
+		gsclient, err := storage.NewClient(ctx, opts...)
+		if err != nil {
+			logger.Fatalf("storage client failed: %v", err)
+		}
+		defer gsclient.Close()
+		cclient = cache.LocalClient{
+			CacheServiceServer: gcs.New(gsclient.Bucket(*fileCacheBucket)),
+		}
+	} else {
+		cacheService, err := cache.New(cache.Config{
+			MaxBytes: 1 * 1024 * 1024 * 1024,
+		})
+		if err != nil {
+			logger.Fatal(err)
+		}
+		cclient = cacheClient{
+			Service: cacheService,
+		}
 	}
 
 	fileServiceClient := fileClient{
 		Service: &file.Service{
-			Cache: cacheClient{
-				Service: cacheService,
-			},
+			Cache: cclient,
 		},
 	}
 
diff --git a/command/configmap.go b/command/configmap.go
index 4f312c8..4546bb2 100644
--- a/command/configmap.go
+++ b/command/configmap.go
@@ -524,11 +524,11 @@
 func storageReadAll(ctx context.Context, client stiface.Client, bucket, name string) ([]byte, error) {
 	bkt := client.Bucket(bucket)
 	if bkt == nil {
-		return nil, fmt.Errorf("Could not find bucket %s", bucket)
+		return nil, fmt.Errorf("could not find bucket %s", bucket)
 	}
 	obj := bkt.Object(name)
 	if obj == nil {
-		return nil, fmt.Errorf("Could not find object %s/%s", bucket, name)
+		return nil, fmt.Errorf("could not find object %s/%s", bucket, name)
 	}
 	rd, err := obj.NewReader(ctx)
 	if err != nil {
@@ -567,7 +567,7 @@
 
 	bkt := client.Bucket(bucket)
 	if bkt == nil {
-		return nil, fmt.Errorf("Could not find storage bucket %s", bucket)
+		return nil, fmt.Errorf("could not find storage bucket %s", bucket)
 	}
 	iter := bkt.Objects(ctx, &storage.Query{
 		Prefix: obj,
@@ -655,7 +655,7 @@
 
 	bkt := client.Bucket(bucket)
 	if bkt == nil {
-		return nil, fmt.Errorf("Could not find storage bucket %s", bucket)
+		return nil, fmt.Errorf("could not find storage bucket %s", bucket)
 	}
 	iter := bkt.Objects(ctx, &storage.Query{
 		Prefix: obj,
diff --git a/command/descriptor/posixpath/posixpath.go b/command/descriptor/posixpath/posixpath.go
index 3f841bd..16ceeff 100644
--- a/command/descriptor/posixpath/posixpath.go
+++ b/command/descriptor/posixpath/posixpath.go
@@ -14,6 +14,7 @@
 type FilePath struct{}
 
 func (FilePath) IsAbs(path string) bool     { return IsAbs(path) }
+func (FilePath) Base(path string) string    { return Base(path) }
 func (FilePath) Dir(path string) string     { return Dir(path) }
 func (FilePath) Join(elem ...string) string { return Join(elem...) }
 
@@ -23,6 +24,7 @@
 
 func (FilePath) Clean(path string) string       { return Clean(path) }
 func (FilePath) SplitElem(path string) []string { return SplitElem(path) }
+func (FilePath) PathSep() string                { return "/" }
 
 // IsAbs returns true if fname is absolute path.
 func IsAbs(fname string) bool {
diff --git a/command/descriptor/relocate.go b/command/descriptor/relocate.go
index ca60b6b..78a0b00 100644
--- a/command/descriptor/relocate.go
+++ b/command/descriptor/relocate.go
@@ -19,6 +19,10 @@
 	// IsAbs reports whether the path is absolute.
 	IsAbs(path string) bool
 
+	// Base returns the last element of path, typically
+	// the filename.
+	Base(string) string
+
 	// Dir returns all but the last element of path, typically
 	// the path's directory.
 	// Different filepath.Dir, it won't clean "..".
@@ -37,6 +41,9 @@
 
 	// SplitElem splits path by path separator.
 	SplitElem(path string) []string
+
+	// PathSep returns the path separator.
+	PathSep() string
 }
 
 // FilePathOf returns FilePath of path type.
diff --git a/command/descriptor/winpath/winpath.go b/command/descriptor/winpath/winpath.go
index 6330083..32788c3 100644
--- a/command/descriptor/winpath/winpath.go
+++ b/command/descriptor/winpath/winpath.go
@@ -23,6 +23,7 @@
 type FilePath struct{}
 
 func (FilePath) IsAbs(path string) bool     { return IsAbs(path) }
+func (FilePath) Base(path string) string    { return Base(path) }
 func (FilePath) Dir(path string) string     { return Dir(path) }
 func (FilePath) Join(elem ...string) string { return Join(elem...) }
 
@@ -32,6 +33,7 @@
 
 func (FilePath) Clean(path string) string       { return Clean(path) }
 func (FilePath) SplitElem(path string) []string { return SplitElem(path) }
+func (FilePath) PathSep() string                { return `\` }
 
 // IsAbs returns true if fname is absolute path.
 func IsAbs(fname string) bool {
diff --git a/exec/inventory.go b/exec/inventory.go
index f0ff93c..412d764 100644
--- a/exec/inventory.go
+++ b/exec/inventory.go
@@ -6,6 +6,7 @@
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"net/http"
 	"path/filepath"
@@ -473,7 +474,7 @@
 	if len(dimensions) == 0 {
 		resp.Error = gomapb.ExecResp_BAD_REQUEST.Enum()
 		resp.ErrorMessage = append(resp.ErrorMessage, "No dimensions are specified")
-		return nil, nil, fmt.Errorf("No dimensions are specified")
+		return nil, nil, errors.New("no dimensions are specified")
 	}
 
 	// Select the best possible platform. If there is multiple possible platforms,
@@ -492,10 +493,17 @@
 		return nil, nil, fmt.Errorf("possible platform not found in inventory: dimensions=%v", dimensions)
 	}
 
+	cmdSel, _, err := fromCommandSpec(req.GetCommandSpec())
+	if err != nil {
+		resp.Error = gomapb.ExecResp_BAD_REQUEST.Enum()
+		return nil, nil, fmt.Errorf("normalize %v: %v", req.GetCommandSpec(), err)
+	}
+
 	// Dynamically generate cmdpb.Config here.
 	cfg := &cmdpb.Config{
 		RemoteexecPlatform: matchedConfig.remoteexecPlatform,
 		CmdDescriptor: &cmdpb.CmdDescriptor{
+			Selector: cmdSel.Proto(),
 			Setup: &cmdpb.CmdDescriptor_Setup{
 				PathType: pathTypeFromPathStyle(req.GetRequesterInfo().GetPathStyle()),
 			},
diff --git a/go.mod b/go.mod
index 7d3f5f0..a9a3f47 100644
--- a/go.mod
+++ b/go.mod
@@ -3,8 +3,9 @@
 go 1.12
 
 require (
-	cloud.google.com/go v0.37.4
-	contrib.go.opencensus.io/exporter/stackdriver v0.10.0
+	cloud.google.com/go v0.38.0
+	contrib.go.opencensus.io/exporter/stackdriver v0.11.0
+	github.com/bazelbuild/remote-apis v0.0.0-20190507145712-5556e9c6153f
 	github.com/fsnotify/fsnotify v1.4.7
 	github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef
 	github.com/golang/protobuf v1.3.1
@@ -14,7 +15,7 @@
 	github.com/googleapis/gax-go/v2 v2.0.4
 	github.com/googleapis/google-cloud-go-testing v0.0.0-20190307174402-f55056552511
 	github.com/grpc-ecosystem/go-grpc-middleware v1.0.0
-	go.opencensus.io v0.20.1
+	go.opencensus.io v0.21.0
 	go.uber.org/atomic v1.3.2 // indirect
 	go.uber.org/multierr v1.1.0 // indirect
 	go.uber.org/zap v1.9.1
@@ -22,8 +23,8 @@
 	golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53
 	golang.org/x/oauth2 v0.0.0-20190319182350-c85d3e98c914
 	golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6
-	google.golang.org/api v0.3.2
-	google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107
-	google.golang.org/grpc v1.19.1
+	google.golang.org/api v0.4.0
+	google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873
+	google.golang.org/grpc v1.20.1
 	gopkg.in/yaml.v2 v2.2.2 // indirect
 )
diff --git a/go.sum b/go.sum
index 0b1ee6c..0af150c 100644
--- a/go.sum
+++ b/go.sum
@@ -6,10 +6,15 @@
 cloud.google.com/go v0.37.1/go.mod h1:SAbnLi6YTSPKSI0dTUEOVLCkyPfKXK8n4ibqiMoj4ok=
 cloud.google.com/go v0.37.4 h1:glPeL3BQJsbF6aIIYfZizMwc5LTYz250bDMjttbBGAU=
 cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
+cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 contrib.go.opencensus.io/exporter/ocagent v0.4.9 h1:8ZbMXpyd04/3LILa/9Tzr8N4HzZNj6Vb2xsaSuR4nQI=
 contrib.go.opencensus.io/exporter/ocagent v0.4.9/go.mod h1:ueLzZcP7LPhPulEBukGn4aLh7Mx9YJwpVJ9nL2FYltw=
+contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA=
 contrib.go.opencensus.io/exporter/stackdriver v0.10.0 h1:izjZKmiNZ7KynTHN6rZajJNpjbnZyZDRlF38q65Zoj8=
 contrib.go.opencensus.io/exporter/stackdriver v0.10.0/go.mod h1:vZAW3NS0lTrrzGcMndYsNJuJKub+Ta3GnUeKOf69oOE=
+contrib.go.opencensus.io/exporter/stackdriver v0.11.0 h1:PV4m31gF3xT3oFDou7SxUVver/jja9sJ20HeTIGR2nM=
+contrib.go.opencensus.io/exporter/stackdriver v0.11.0/go.mod h1:hA7rlmtavV03FGxzWXAPBUnZeZBhWN/QYQAuMtxc9Bk=
 contrib.go.opencensus.io/resource v0.0.0-20190131005048-21591786a5e0 h1:ICrSnXeuT4427bpR8X9I7GxiyT4X5qgLtFT7m1IjK2c=
 contrib.go.opencensus.io/resource v0.0.0-20190131005048-21591786a5e0/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA=
 dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
@@ -27,6 +32,8 @@
 github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/aws/aws-sdk-go v1.18.6 h1:NuUz/+bi6C5v3BpIXW/VfovfMpvlhl1WUnD0EiDkOwQ=
 github.com/aws/aws-sdk-go v1.18.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/bazelbuild/remote-apis v0.0.0-20190507145712-5556e9c6153f h1:KLZodm2mQtskynsbHchbt9IIbGrpmBm3/585uCA798M=
+github.com/bazelbuild/remote-apis v0.0.0-20190507145712-5556e9c6153f/go.mod h1:9Y+1FnaNUGVV6wKE0Jdh+mguqDUsyd9uUqokalrC7DQ=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
 github.com/census-instrumentation/opencensus-proto v0.2.0 h1:LzQXZOgg4CQfE6bFvXGM30YZL1WW/M337pXml+GrcZ4=
@@ -39,6 +46,7 @@
 github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
 github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
 github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -47,6 +55,7 @@
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
 github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
@@ -110,6 +119,7 @@
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -177,6 +187,9 @@
 go.opencensus.io v0.20.0/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M=
 go.opencensus.io v0.20.1 h1:pMEjRZ1M4ebWGikflH7nQpV6+Zr88KBMA2XJD3sbijw=
 go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
@@ -198,6 +211,7 @@
 golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -245,6 +259,7 @@
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190305160728-f8c04913dfb7/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
 google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
@@ -256,6 +271,8 @@
 google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
 google.golang.org/api v0.3.2 h1:iTp+3yyl/KOtxa/d1/JUE0GGSoR6FuW5udver22iwpw=
 google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.4.0 h1:KKgc1aqhV8wDPbDzlDtpvyjZFY3vjz85FP7p4wcQUyI=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -271,6 +288,10 @@
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 h1:xtNn7qFlagY2mQNFHMSRPjT2RkOV4OXM7P5TVy9xATo=
 google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7 h1:ZUjXAXmrAyrmmCPHgCA/vChHcpsX27MZ3yBonD/z1KE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
 google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
@@ -278,6 +299,10 @@
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.19.1 h1:TrBcJ1yqAl1G++wO39nD/qtgpsW9/1+QGrluyMGEYgM=
 google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.0 h1:DlsSIrgEBuZAUFJcta2B5i/lzeHHbnfkNFAfFXLVFYQ=
+google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
+google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/proto/remote-apis/build/bazel/remote/execution/v2/BUILD b/proto/remote-apis/build/bazel/remote/execution/v2/BUILD
deleted file mode 100644
index cd2b72a..0000000
--- a/proto/remote-apis/build/bazel/remote/execution/v2/BUILD
+++ /dev/null
@@ -1,22 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])
-
-proto_library(
-    name = "remote_execution_proto",
-    srcs = ["remote_execution.proto"],
-    deps = [
-        "//build/bazel/semver:semver_proto",
-        "@com_google_protobuf//:duration_proto",
-        "@com_google_protobuf//:timestamp_proto",
-        "@googleapis//:google_api_annotations_proto",
-        "@googleapis//:google_api_http_proto",
-        "@googleapis//:google_longrunning_operations_proto",
-        "@googleapis//:google_rpc_status_proto",
-    ],
-)
-
-java_proto_library(
-    name = "remote_execution_java_proto",
-    deps = [":remote_execution_proto"],
-)
diff --git a/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.pb.go b/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.pb.go
deleted file mode 100644
index dba3ca4..0000000
--- a/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.pb.go
+++ /dev/null
@@ -1,4329 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: build/bazel/remote/execution/v2/remote_execution.proto
-
-package remoteexecution
-
-import (
-	context "context"
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	duration "github.com/golang/protobuf/ptypes/duration"
-	timestamp "github.com/golang/protobuf/ptypes/timestamp"
-	semver "go.chromium.org/goma/server/proto/remote-apis/build/bazel/semver"
-	_ "google.golang.org/genproto/googleapis/api/annotations"
-	longrunning "google.golang.org/genproto/googleapis/longrunning"
-	status "google.golang.org/genproto/googleapis/rpc/status"
-	grpc "google.golang.org/grpc"
-	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
-
-// The digest function used for converting values into keys for CAS and Action
-// Cache.
-type DigestFunction int32
-
-const (
-	// It is an error for the server to return this value.
-	DigestFunction_UNKNOWN DigestFunction = 0
-	// The Sha-256 digest function.
-	DigestFunction_SHA256 DigestFunction = 1
-	// The Sha-1 digest function.
-	DigestFunction_SHA1 DigestFunction = 2
-	// The MD5 digest function.
-	DigestFunction_MD5 DigestFunction = 3
-)
-
-var DigestFunction_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "SHA256",
-	2: "SHA1",
-	3: "MD5",
-}
-
-var DigestFunction_value = map[string]int32{
-	"UNKNOWN": 0,
-	"SHA256":  1,
-	"SHA1":    2,
-	"MD5":     3,
-}
-
-func (x DigestFunction) String() string {
-	return proto.EnumName(DigestFunction_name, int32(x))
-}
-
-func (DigestFunction) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{0}
-}
-
-// The current stage of execution.
-type ExecuteOperationMetadata_Stage int32
-
-const (
-	ExecuteOperationMetadata_UNKNOWN ExecuteOperationMetadata_Stage = 0
-	// Checking the result against the cache.
-	ExecuteOperationMetadata_CACHE_CHECK ExecuteOperationMetadata_Stage = 1
-	// Currently idle, awaiting a free machine to execute.
-	ExecuteOperationMetadata_QUEUED ExecuteOperationMetadata_Stage = 2
-	// Currently being executed by a worker.
-	ExecuteOperationMetadata_EXECUTING ExecuteOperationMetadata_Stage = 3
-	// Finished execution.
-	ExecuteOperationMetadata_COMPLETED ExecuteOperationMetadata_Stage = 4
-)
-
-var ExecuteOperationMetadata_Stage_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "CACHE_CHECK",
-	2: "QUEUED",
-	3: "EXECUTING",
-	4: "COMPLETED",
-}
-
-var ExecuteOperationMetadata_Stage_value = map[string]int32{
-	"UNKNOWN":     0,
-	"CACHE_CHECK": 1,
-	"QUEUED":      2,
-	"EXECUTING":   3,
-	"COMPLETED":   4,
-}
-
-func (x ExecuteOperationMetadata_Stage) String() string {
-	return proto.EnumName(ExecuteOperationMetadata_Stage_name, int32(x))
-}
-
-func (ExecuteOperationMetadata_Stage) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{19, 0}
-}
-
-// Describes how the server treats absolute symlink targets.
-type CacheCapabilities_SymlinkAbsolutePathStrategy int32
-
-const (
-	CacheCapabilities_UNKNOWN CacheCapabilities_SymlinkAbsolutePathStrategy = 0
-	// Server will return an `INVALID_ARGUMENT` on input symlinks with absolute
-	// targets.
-	// If an action tries to create an output symlink with an absolute target, a
-	// `FAILED_PRECONDITION` will be returned.
-	CacheCapabilities_DISALLOWED CacheCapabilities_SymlinkAbsolutePathStrategy = 1
-	// Server will allow symlink targets to escape the input root tree, possibly
-	// resulting in non-hermetic builds.
-	CacheCapabilities_ALLOWED CacheCapabilities_SymlinkAbsolutePathStrategy = 2
-)
-
-var CacheCapabilities_SymlinkAbsolutePathStrategy_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "DISALLOWED",
-	2: "ALLOWED",
-}
-
-var CacheCapabilities_SymlinkAbsolutePathStrategy_value = map[string]int32{
-	"UNKNOWN":    0,
-	"DISALLOWED": 1,
-	"ALLOWED":    2,
-}
-
-func (x CacheCapabilities_SymlinkAbsolutePathStrategy) String() string {
-	return proto.EnumName(CacheCapabilities_SymlinkAbsolutePathStrategy_name, int32(x))
-}
-
-func (CacheCapabilities_SymlinkAbsolutePathStrategy) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{35, 0}
-}
-
-// An `Action` captures all the information about an execution which is required
-// to reproduce it.
-//
-// `Action`s are the core component of the [Execution] service. A single
-// `Action` represents a repeatable action that can be performed by the
-// execution service. `Action`s can be succinctly identified by the digest of
-// their wire format encoding and, once an `Action` has been executed, will be
-// cached in the action cache. Future requests can then use the cached result
-// rather than needing to run afresh.
-//
-// When a server completes execution of an
-// [Action][build.bazel.remote.execution.v2.Action], it MAY choose to
-// cache the [result][build.bazel.remote.execution.v2.ActionResult] in
-// the [ActionCache][build.bazel.remote.execution.v2.ActionCache] unless
-// `do_not_cache` is `true`. Clients SHOULD expect the server to do so. By
-// default, future calls to
-// [Execute][build.bazel.remote.execution.v2.Execution.Execute] the same
-// `Action` will also serve their results from the cache. Clients must take care
-// to understand the caching behaviour. Ideally, all `Action`s will be
-// reproducible so that serving a result from cache is always desirable and
-// correct.
-type Action struct {
-	// The digest of the [Command][build.bazel.remote.execution.v2.Command]
-	// to run, which MUST be present in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	CommandDigest *Digest `protobuf:"bytes,1,opt,name=command_digest,json=commandDigest,proto3" json:"command_digest,omitempty"`
-	// The digest of the root
-	// [Directory][build.bazel.remote.execution.v2.Directory] for the input
-	// files. The files in the directory tree are available in the correct
-	// location on the build machine before the command is executed. The root
-	// directory, as well as every subdirectory and content blob referred to, MUST
-	// be in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	InputRootDigest *Digest `protobuf:"bytes,2,opt,name=input_root_digest,json=inputRootDigest,proto3" json:"input_root_digest,omitempty"`
-	// A timeout after which the execution should be killed. If the timeout is
-	// absent, then the client is specifying that the execution should continue
-	// as long as the server will let it. The server SHOULD impose a timeout if
-	// the client does not specify one, however, if the client does specify a
-	// timeout that is longer than the server's maximum timeout, the server MUST
-	// reject the request.
-	//
-	// The timeout is a part of the
-	// [Action][build.bazel.remote.execution.v2.Action] message, and
-	// therefore two `Actions` with different timeouts are different, even if they
-	// are otherwise identical. This is because, if they were not, running an
-	// `Action` with a lower timeout than is required might result in a cache hit
-	// from an execution run with a longer timeout, hiding the fact that the
-	// timeout is too short. By encoding it directly in the `Action`, a lower
-	// timeout will result in a cache miss and the execution timeout will fail
-	// immediately, rather than whenever the cache entry gets evicted.
-	Timeout *duration.Duration `protobuf:"bytes,6,opt,name=timeout,proto3" json:"timeout,omitempty"`
-	// If true, then the `Action`'s result cannot be cached, and in-flight
-	// requests for the same `Action` may not be merged.
-	DoNotCache           bool     `protobuf:"varint,7,opt,name=do_not_cache,json=doNotCache,proto3" json:"do_not_cache,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Action) Reset()         { *m = Action{} }
-func (m *Action) String() string { return proto.CompactTextString(m) }
-func (*Action) ProtoMessage()    {}
-func (*Action) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{0}
-}
-
-func (m *Action) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Action.Unmarshal(m, b)
-}
-func (m *Action) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Action.Marshal(b, m, deterministic)
-}
-func (m *Action) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Action.Merge(m, src)
-}
-func (m *Action) XXX_Size() int {
-	return xxx_messageInfo_Action.Size(m)
-}
-func (m *Action) XXX_DiscardUnknown() {
-	xxx_messageInfo_Action.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Action proto.InternalMessageInfo
-
-func (m *Action) GetCommandDigest() *Digest {
-	if m != nil {
-		return m.CommandDigest
-	}
-	return nil
-}
-
-func (m *Action) GetInputRootDigest() *Digest {
-	if m != nil {
-		return m.InputRootDigest
-	}
-	return nil
-}
-
-func (m *Action) GetTimeout() *duration.Duration {
-	if m != nil {
-		return m.Timeout
-	}
-	return nil
-}
-
-func (m *Action) GetDoNotCache() bool {
-	if m != nil {
-		return m.DoNotCache
-	}
-	return false
-}
-
-// A `Command` is the actual command executed by a worker running an
-// [Action][build.bazel.remote.execution.v2.Action] and specifications of its
-// environment.
-//
-// Except as otherwise required, the environment (such as which system
-// libraries or binaries are available, and what filesystems are mounted where)
-// is defined by and specific to the implementation of the remote execution API.
-type Command struct {
-	// The arguments to the command. The first argument must be the path to the
-	// executable, which must be either a relative path, in which case it is
-	// evaluated with respect to the input root, or an absolute path.
-	Arguments []string `protobuf:"bytes,1,rep,name=arguments,proto3" json:"arguments,omitempty"`
-	// The environment variables to set when running the program. The worker may
-	// provide its own default environment variables; these defaults can be
-	// overridden using this field. Additional variables can also be specified.
-	//
-	// In order to ensure that equivalent
-	// [Command][build.bazel.remote.execution.v2.Command]s always hash to the same
-	// value, the environment variables MUST be lexicographically sorted by name.
-	// Sorting of strings is done by code point, equivalently, by the UTF-8 bytes.
-	EnvironmentVariables []*Command_EnvironmentVariable `protobuf:"bytes,2,rep,name=environment_variables,json=environmentVariables,proto3" json:"environment_variables,omitempty"`
-	// A list of the output files that the client expects to retrieve from the
-	// action. Only the listed files, as well as directories listed in
-	// `output_directories`, will be returned to the client as output.
-	// Other files or directories that may be created during command execution
-	// are discarded.
-	//
-	// The paths are relative to the working directory of the action execution.
-	// The paths are specified using a single forward slash (`/`) as a path
-	// separator, even if the execution platform natively uses a different
-	// separator. The path MUST NOT include a trailing slash, nor a leading slash,
-	// being a relative path.
-	//
-	// In order to ensure consistent hashing of the same Action, the output paths
-	// MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
-	// bytes).
-	//
-	// An output file cannot be duplicated, be a parent of another output file, or
-	// have the same path as any of the listed output directories.
-	//
-	// Directories leading up to the output files are created by the worker prior
-	// to execution, even if they are not explicitly part of the input root.
-	OutputFiles []string `protobuf:"bytes,3,rep,name=output_files,json=outputFiles,proto3" json:"output_files,omitempty"`
-	// A list of the output directories that the client expects to retrieve from
-	// the action. Only the listed directories will be returned (an entire
-	// directory structure will be returned as a
-	// [Tree][build.bazel.remote.execution.v2.Tree] message digest, see
-	// [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory]), as
-	// well as files listed in `output_files`. Other files or directories that
-	// may be created during command execution are discarded.
-	//
-	// The paths are relative to the working directory of the action execution.
-	// The paths are specified using a single forward slash (`/`) as a path
-	// separator, even if the execution platform natively uses a different
-	// separator. The path MUST NOT include a trailing slash, nor a leading slash,
-	// being a relative path. The special value of empty string is allowed,
-	// although not recommended, and can be used to capture the entire working
-	// directory tree, including inputs.
-	//
-	// In order to ensure consistent hashing of the same Action, the output paths
-	// MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
-	// bytes).
-	//
-	// An output directory cannot be duplicated or have the same path as any of
-	// the listed output files.
-	//
-	// Directories leading up to the output directories (but not the output
-	// directories themselves) are created by the worker prior to execution, even
-	// if they are not explicitly part of the input root.
-	OutputDirectories []string `protobuf:"bytes,4,rep,name=output_directories,json=outputDirectories,proto3" json:"output_directories,omitempty"`
-	// The platform requirements for the execution environment. The server MAY
-	// choose to execute the action on any worker satisfying the requirements, so
-	// the client SHOULD ensure that running the action on any such worker will
-	// have the same result.
-	Platform *Platform `protobuf:"bytes,5,opt,name=platform,proto3" json:"platform,omitempty"`
-	// The working directory, relative to the input root, for the command to run
-	// in. It must be a directory which exists in the input tree. If it is left
-	// empty, then the action is run in the input root.
-	WorkingDirectory     string   `protobuf:"bytes,6,opt,name=working_directory,json=workingDirectory,proto3" json:"working_directory,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Command) Reset()         { *m = Command{} }
-func (m *Command) String() string { return proto.CompactTextString(m) }
-func (*Command) ProtoMessage()    {}
-func (*Command) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{1}
-}
-
-func (m *Command) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Command.Unmarshal(m, b)
-}
-func (m *Command) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Command.Marshal(b, m, deterministic)
-}
-func (m *Command) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Command.Merge(m, src)
-}
-func (m *Command) XXX_Size() int {
-	return xxx_messageInfo_Command.Size(m)
-}
-func (m *Command) XXX_DiscardUnknown() {
-	xxx_messageInfo_Command.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Command proto.InternalMessageInfo
-
-func (m *Command) GetArguments() []string {
-	if m != nil {
-		return m.Arguments
-	}
-	return nil
-}
-
-func (m *Command) GetEnvironmentVariables() []*Command_EnvironmentVariable {
-	if m != nil {
-		return m.EnvironmentVariables
-	}
-	return nil
-}
-
-func (m *Command) GetOutputFiles() []string {
-	if m != nil {
-		return m.OutputFiles
-	}
-	return nil
-}
-
-func (m *Command) GetOutputDirectories() []string {
-	if m != nil {
-		return m.OutputDirectories
-	}
-	return nil
-}
-
-func (m *Command) GetPlatform() *Platform {
-	if m != nil {
-		return m.Platform
-	}
-	return nil
-}
-
-func (m *Command) GetWorkingDirectory() string {
-	if m != nil {
-		return m.WorkingDirectory
-	}
-	return ""
-}
-
-// An `EnvironmentVariable` is one variable to set in the running program's
-// environment.
-type Command_EnvironmentVariable struct {
-	// The variable name.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The variable value.
-	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Command_EnvironmentVariable) Reset()         { *m = Command_EnvironmentVariable{} }
-func (m *Command_EnvironmentVariable) String() string { return proto.CompactTextString(m) }
-func (*Command_EnvironmentVariable) ProtoMessage()    {}
-func (*Command_EnvironmentVariable) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{1, 0}
-}
-
-func (m *Command_EnvironmentVariable) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Command_EnvironmentVariable.Unmarshal(m, b)
-}
-func (m *Command_EnvironmentVariable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Command_EnvironmentVariable.Marshal(b, m, deterministic)
-}
-func (m *Command_EnvironmentVariable) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Command_EnvironmentVariable.Merge(m, src)
-}
-func (m *Command_EnvironmentVariable) XXX_Size() int {
-	return xxx_messageInfo_Command_EnvironmentVariable.Size(m)
-}
-func (m *Command_EnvironmentVariable) XXX_DiscardUnknown() {
-	xxx_messageInfo_Command_EnvironmentVariable.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Command_EnvironmentVariable proto.InternalMessageInfo
-
-func (m *Command_EnvironmentVariable) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Command_EnvironmentVariable) GetValue() string {
-	if m != nil {
-		return m.Value
-	}
-	return ""
-}
-
-// A `Platform` is a set of requirements, such as hardware, operating system, or
-// compiler toolchain, for an
-// [Action][build.bazel.remote.execution.v2.Action]'s execution
-// environment. A `Platform` is represented as a series of key-value pairs
-// representing the properties that are required of the platform.
-type Platform struct {
-	// The properties that make up this platform. In order to ensure that
-	// equivalent `Platform`s always hash to the same value, the properties MUST
-	// be lexicographically sorted by name, and then by value. Sorting of strings
-	// is done by code point, equivalently, by the UTF-8 bytes.
-	Properties           []*Platform_Property `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
-}
-
-func (m *Platform) Reset()         { *m = Platform{} }
-func (m *Platform) String() string { return proto.CompactTextString(m) }
-func (*Platform) ProtoMessage()    {}
-func (*Platform) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{2}
-}
-
-func (m *Platform) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Platform.Unmarshal(m, b)
-}
-func (m *Platform) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Platform.Marshal(b, m, deterministic)
-}
-func (m *Platform) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Platform.Merge(m, src)
-}
-func (m *Platform) XXX_Size() int {
-	return xxx_messageInfo_Platform.Size(m)
-}
-func (m *Platform) XXX_DiscardUnknown() {
-	xxx_messageInfo_Platform.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Platform proto.InternalMessageInfo
-
-func (m *Platform) GetProperties() []*Platform_Property {
-	if m != nil {
-		return m.Properties
-	}
-	return nil
-}
-
-// A single property for the environment. The server is responsible for
-// specifying the property `name`s that it accepts. If an unknown `name` is
-// provided in the requirements for an
-// [Action][build.bazel.remote.execution.v2.Action], the server SHOULD
-// reject the execution request. If permitted by the server, the same `name`
-// may occur multiple times.
-//
-// The server is also responsible for specifying the interpretation of
-// property `value`s. For instance, a property describing how much RAM must be
-// available may be interpreted as allowing a worker with 16GB to fulfill a
-// request for 8GB, while a property describing the OS environment on which
-// the action must be performed may require an exact match with the worker's
-// OS.
-//
-// The server MAY use the `value` of one or more properties to determine how
-// it sets up the execution environment, such as by making specific system
-// files available to the worker.
-type Platform_Property struct {
-	// The property name.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The property value.
-	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Platform_Property) Reset()         { *m = Platform_Property{} }
-func (m *Platform_Property) String() string { return proto.CompactTextString(m) }
-func (*Platform_Property) ProtoMessage()    {}
-func (*Platform_Property) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{2, 0}
-}
-
-func (m *Platform_Property) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Platform_Property.Unmarshal(m, b)
-}
-func (m *Platform_Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Platform_Property.Marshal(b, m, deterministic)
-}
-func (m *Platform_Property) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Platform_Property.Merge(m, src)
-}
-func (m *Platform_Property) XXX_Size() int {
-	return xxx_messageInfo_Platform_Property.Size(m)
-}
-func (m *Platform_Property) XXX_DiscardUnknown() {
-	xxx_messageInfo_Platform_Property.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Platform_Property proto.InternalMessageInfo
-
-func (m *Platform_Property) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Platform_Property) GetValue() string {
-	if m != nil {
-		return m.Value
-	}
-	return ""
-}
-
-// A `Directory` represents a directory node in a file tree, containing zero or
-// more children [FileNodes][build.bazel.remote.execution.v2.FileNode],
-// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode] and
-// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode].
-// Each `Node` contains its name in the directory, either the digest of its
-// content (either a file blob or a `Directory` proto) or a symlink target, as
-// well as possibly some metadata about the file or directory.
-//
-// In order to ensure that two equivalent directory trees hash to the same
-// value, the following restrictions MUST be obeyed when constructing a
-// a `Directory`:
-//
-// * Every child in the directory must have a path of exactly one segment.
-//   Multiple levels of directory hierarchy may not be collapsed.
-// * Each child in the directory must have a unique path segment (file name).
-//   Note that while the API itself is case-sensitive, the environment where
-//   the Action is executed may or may not be case-sensitive. That is, it is
-//   legal to call the API with a Directory that has both "Foo" and "foo" as
-//   children, but the Action may be rejected by the remote system upon
-//   execution.
-// * The files, directories and symlinks in the directory must each be sorted
-//   in lexicographical order by path. The path strings must be sorted by code
-//   point, equivalently, by UTF-8 bytes.
-//
-// A `Directory` that obeys the restrictions is said to be in canonical form.
-//
-// As an example, the following could be used for a file named `bar` and a
-// directory named `foo` with an executable file named `baz` (hashes shortened
-// for readability):
-//
-// ```json
-// // (Directory proto)
-// {
-//   files: [
-//     {
-//       name: "bar",
-//       digest: {
-//         hash: "4a73bc9d03...",
-//         size: 65534
-//       }
-//     }
-//   ],
-//   directories: [
-//     {
-//       name: "foo",
-//       digest: {
-//         hash: "4cf2eda940...",
-//         size: 43
-//       }
-//     }
-//   ]
-// }
-//
-// // (Directory proto with hash "4cf2eda940..." and size 43)
-// {
-//   files: [
-//     {
-//       name: "baz",
-//       digest: {
-//         hash: "b2c941073e...",
-//         size: 1294,
-//       },
-//       is_executable: true
-//     }
-//   ]
-// }
-// ```
-type Directory struct {
-	// The files in the directory.
-	Files []*FileNode `protobuf:"bytes,1,rep,name=files,proto3" json:"files,omitempty"`
-	// The subdirectories in the directory.
-	Directories []*DirectoryNode `protobuf:"bytes,2,rep,name=directories,proto3" json:"directories,omitempty"`
-	// The symlinks in the directory.
-	Symlinks             []*SymlinkNode `protobuf:"bytes,3,rep,name=symlinks,proto3" json:"symlinks,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *Directory) Reset()         { *m = Directory{} }
-func (m *Directory) String() string { return proto.CompactTextString(m) }
-func (*Directory) ProtoMessage()    {}
-func (*Directory) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{3}
-}
-
-func (m *Directory) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Directory.Unmarshal(m, b)
-}
-func (m *Directory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Directory.Marshal(b, m, deterministic)
-}
-func (m *Directory) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Directory.Merge(m, src)
-}
-func (m *Directory) XXX_Size() int {
-	return xxx_messageInfo_Directory.Size(m)
-}
-func (m *Directory) XXX_DiscardUnknown() {
-	xxx_messageInfo_Directory.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Directory proto.InternalMessageInfo
-
-func (m *Directory) GetFiles() []*FileNode {
-	if m != nil {
-		return m.Files
-	}
-	return nil
-}
-
-func (m *Directory) GetDirectories() []*DirectoryNode {
-	if m != nil {
-		return m.Directories
-	}
-	return nil
-}
-
-func (m *Directory) GetSymlinks() []*SymlinkNode {
-	if m != nil {
-		return m.Symlinks
-	}
-	return nil
-}
-
-// A `FileNode` represents a single file and associated metadata.
-type FileNode struct {
-	// The name of the file.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The digest of the file's content.
-	Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"`
-	// True if file is executable, false otherwise.
-	IsExecutable         bool     `protobuf:"varint,4,opt,name=is_executable,json=isExecutable,proto3" json:"is_executable,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *FileNode) Reset()         { *m = FileNode{} }
-func (m *FileNode) String() string { return proto.CompactTextString(m) }
-func (*FileNode) ProtoMessage()    {}
-func (*FileNode) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{4}
-}
-
-func (m *FileNode) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FileNode.Unmarshal(m, b)
-}
-func (m *FileNode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FileNode.Marshal(b, m, deterministic)
-}
-func (m *FileNode) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FileNode.Merge(m, src)
-}
-func (m *FileNode) XXX_Size() int {
-	return xxx_messageInfo_FileNode.Size(m)
-}
-func (m *FileNode) XXX_DiscardUnknown() {
-	xxx_messageInfo_FileNode.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FileNode proto.InternalMessageInfo
-
-func (m *FileNode) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *FileNode) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *FileNode) GetIsExecutable() bool {
-	if m != nil {
-		return m.IsExecutable
-	}
-	return false
-}
-
-// A `DirectoryNode` represents a child of a
-// [Directory][build.bazel.remote.execution.v2.Directory] which is itself
-// a `Directory` and its associated metadata.
-type DirectoryNode struct {
-	// The name of the directory.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The digest of the
-	// [Directory][build.bazel.remote.execution.v2.Directory] object
-	// represented. See [Digest][build.bazel.remote.execution.v2.Digest]
-	// for information about how to take the digest of a proto message.
-	Digest               *Digest  `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *DirectoryNode) Reset()         { *m = DirectoryNode{} }
-func (m *DirectoryNode) String() string { return proto.CompactTextString(m) }
-func (*DirectoryNode) ProtoMessage()    {}
-func (*DirectoryNode) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{5}
-}
-
-func (m *DirectoryNode) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DirectoryNode.Unmarshal(m, b)
-}
-func (m *DirectoryNode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DirectoryNode.Marshal(b, m, deterministic)
-}
-func (m *DirectoryNode) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DirectoryNode.Merge(m, src)
-}
-func (m *DirectoryNode) XXX_Size() int {
-	return xxx_messageInfo_DirectoryNode.Size(m)
-}
-func (m *DirectoryNode) XXX_DiscardUnknown() {
-	xxx_messageInfo_DirectoryNode.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DirectoryNode proto.InternalMessageInfo
-
-func (m *DirectoryNode) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *DirectoryNode) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-// A `SymlinkNode` represents a symbolic link.
-type SymlinkNode struct {
-	// The name of the symlink.
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// The target path of the symlink. The path separator is a forward slash `/`.
-	// The target path can be relative to the parent directory of the symlink or
-	// it can be an absolute path starting with `/`. Support for absolute paths
-	// can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-	// API. The canonical form forbids the substrings `/./` and `//` in the target
-	// path. `..` components are allowed anywhere in the target path.
-	Target               string   `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *SymlinkNode) Reset()         { *m = SymlinkNode{} }
-func (m *SymlinkNode) String() string { return proto.CompactTextString(m) }
-func (*SymlinkNode) ProtoMessage()    {}
-func (*SymlinkNode) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{6}
-}
-
-func (m *SymlinkNode) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SymlinkNode.Unmarshal(m, b)
-}
-func (m *SymlinkNode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SymlinkNode.Marshal(b, m, deterministic)
-}
-func (m *SymlinkNode) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SymlinkNode.Merge(m, src)
-}
-func (m *SymlinkNode) XXX_Size() int {
-	return xxx_messageInfo_SymlinkNode.Size(m)
-}
-func (m *SymlinkNode) XXX_DiscardUnknown() {
-	xxx_messageInfo_SymlinkNode.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SymlinkNode proto.InternalMessageInfo
-
-func (m *SymlinkNode) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *SymlinkNode) GetTarget() string {
-	if m != nil {
-		return m.Target
-	}
-	return ""
-}
-
-// A content digest. A digest for a given blob consists of the size of the blob
-// and its hash. The hash algorithm to use is defined by the server, but servers
-// SHOULD use SHA-256.
-//
-// The size is considered to be an integral part of the digest and cannot be
-// separated. That is, even if the `hash` field is correctly specified but
-// `size_bytes` is not, the server MUST reject the request.
-//
-// The reason for including the size in the digest is as follows: in a great
-// many cases, the server needs to know the size of the blob it is about to work
-// with prior to starting an operation with it, such as flattening Merkle tree
-// structures or streaming it to a worker. Technically, the server could
-// implement a separate metadata store, but this results in a significantly more
-// complicated implementation as opposed to having the client specify the size
-// up-front (or storing the size along with the digest in every message where
-// digests are embedded). This does mean that the API leaks some implementation
-// details of (what we consider to be) a reasonable server implementation, but
-// we consider this to be a worthwhile tradeoff.
-//
-// When a `Digest` is used to refer to a proto message, it always refers to the
-// message in binary encoded form. To ensure consistent hashing, clients and
-// servers MUST ensure that they serialize messages according to the following
-// rules, even if there are alternate valid encodings for the same message:
-//
-// * Fields are serialized in tag order.
-// * There are no unknown fields.
-// * There are no duplicate fields.
-// * Fields are serialized according to the default semantics for their type.
-//
-// Most protocol buffer implementations will always follow these rules when
-// serializing, but care should be taken to avoid shortcuts. For instance,
-// concatenating two messages to merge them may produce duplicate fields.
-type Digest struct {
-	// The hash. In the case of SHA-256, it will always be a lowercase hex string
-	// exactly 64 characters long.
-	Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`
-	// The size of the blob, in bytes.
-	SizeBytes            int64    `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Digest) Reset()         { *m = Digest{} }
-func (m *Digest) String() string { return proto.CompactTextString(m) }
-func (*Digest) ProtoMessage()    {}
-func (*Digest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{7}
-}
-
-func (m *Digest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Digest.Unmarshal(m, b)
-}
-func (m *Digest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Digest.Marshal(b, m, deterministic)
-}
-func (m *Digest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Digest.Merge(m, src)
-}
-func (m *Digest) XXX_Size() int {
-	return xxx_messageInfo_Digest.Size(m)
-}
-func (m *Digest) XXX_DiscardUnknown() {
-	xxx_messageInfo_Digest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Digest proto.InternalMessageInfo
-
-func (m *Digest) GetHash() string {
-	if m != nil {
-		return m.Hash
-	}
-	return ""
-}
-
-func (m *Digest) GetSizeBytes() int64 {
-	if m != nil {
-		return m.SizeBytes
-	}
-	return 0
-}
-
-// ExecutedActionMetadata contains details about a completed execution.
-type ExecutedActionMetadata struct {
-	// The name of the worker which ran the execution.
-	Worker string `protobuf:"bytes,1,opt,name=worker,proto3" json:"worker,omitempty"`
-	// When was the action added to the queue.
-	QueuedTimestamp *timestamp.Timestamp `protobuf:"bytes,2,opt,name=queued_timestamp,json=queuedTimestamp,proto3" json:"queued_timestamp,omitempty"`
-	// When the worker received the action.
-	WorkerStartTimestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=worker_start_timestamp,json=workerStartTimestamp,proto3" json:"worker_start_timestamp,omitempty"`
-	// When the worker completed the action, including all stages.
-	WorkerCompletedTimestamp *timestamp.Timestamp `protobuf:"bytes,4,opt,name=worker_completed_timestamp,json=workerCompletedTimestamp,proto3" json:"worker_completed_timestamp,omitempty"`
-	// When the worker started fetching action inputs.
-	InputFetchStartTimestamp *timestamp.Timestamp `protobuf:"bytes,5,opt,name=input_fetch_start_timestamp,json=inputFetchStartTimestamp,proto3" json:"input_fetch_start_timestamp,omitempty"`
-	// When the worker finished fetching action inputs.
-	InputFetchCompletedTimestamp *timestamp.Timestamp `protobuf:"bytes,6,opt,name=input_fetch_completed_timestamp,json=inputFetchCompletedTimestamp,proto3" json:"input_fetch_completed_timestamp,omitempty"`
-	// When the worker started executing the action command.
-	ExecutionStartTimestamp *timestamp.Timestamp `protobuf:"bytes,7,opt,name=execution_start_timestamp,json=executionStartTimestamp,proto3" json:"execution_start_timestamp,omitempty"`
-	// When the worker completed executing the action command.
-	ExecutionCompletedTimestamp *timestamp.Timestamp `protobuf:"bytes,8,opt,name=execution_completed_timestamp,json=executionCompletedTimestamp,proto3" json:"execution_completed_timestamp,omitempty"`
-	// When the worker started uploading action outputs.
-	OutputUploadStartTimestamp *timestamp.Timestamp `protobuf:"bytes,9,opt,name=output_upload_start_timestamp,json=outputUploadStartTimestamp,proto3" json:"output_upload_start_timestamp,omitempty"`
-	// When the worker finished uploading action outputs.
-	OutputUploadCompletedTimestamp *timestamp.Timestamp `protobuf:"bytes,10,opt,name=output_upload_completed_timestamp,json=outputUploadCompletedTimestamp,proto3" json:"output_upload_completed_timestamp,omitempty"`
-	XXX_NoUnkeyedLiteral           struct{}             `json:"-"`
-	XXX_unrecognized               []byte               `json:"-"`
-	XXX_sizecache                  int32                `json:"-"`
-}
-
-func (m *ExecutedActionMetadata) Reset()         { *m = ExecutedActionMetadata{} }
-func (m *ExecutedActionMetadata) String() string { return proto.CompactTextString(m) }
-func (*ExecutedActionMetadata) ProtoMessage()    {}
-func (*ExecutedActionMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{8}
-}
-
-func (m *ExecutedActionMetadata) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecutedActionMetadata.Unmarshal(m, b)
-}
-func (m *ExecutedActionMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecutedActionMetadata.Marshal(b, m, deterministic)
-}
-func (m *ExecutedActionMetadata) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecutedActionMetadata.Merge(m, src)
-}
-func (m *ExecutedActionMetadata) XXX_Size() int {
-	return xxx_messageInfo_ExecutedActionMetadata.Size(m)
-}
-func (m *ExecutedActionMetadata) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecutedActionMetadata.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecutedActionMetadata proto.InternalMessageInfo
-
-func (m *ExecutedActionMetadata) GetWorker() string {
-	if m != nil {
-		return m.Worker
-	}
-	return ""
-}
-
-func (m *ExecutedActionMetadata) GetQueuedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.QueuedTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetWorkerStartTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.WorkerStartTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetWorkerCompletedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.WorkerCompletedTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetInputFetchStartTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.InputFetchStartTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetInputFetchCompletedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.InputFetchCompletedTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetExecutionStartTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.ExecutionStartTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetExecutionCompletedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.ExecutionCompletedTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetOutputUploadStartTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.OutputUploadStartTimestamp
-	}
-	return nil
-}
-
-func (m *ExecutedActionMetadata) GetOutputUploadCompletedTimestamp() *timestamp.Timestamp {
-	if m != nil {
-		return m.OutputUploadCompletedTimestamp
-	}
-	return nil
-}
-
-// An ActionResult represents the result of an
-// [Action][build.bazel.remote.execution.v2.Action] being run.
-type ActionResult struct {
-	// The output files of the action. For each output file requested in the
-	// `output_files` field of the Action, if the corresponding file existed after
-	// the action completed, a single entry will be present either in this field,
-	// or in the output_file_symlinks field, if the file was a symbolic link to
-	// another file.
-	//
-	// If the action does not produce the requested output, or produces a
-	// directory where a regular file is expected or vice versa, then that output
-	// will be omitted from the list. The server is free to arrange the output
-	// list as desired; clients MUST NOT assume that the output list is sorted.
-	OutputFiles []*OutputFile `protobuf:"bytes,2,rep,name=output_files,json=outputFiles,proto3" json:"output_files,omitempty"`
-	// The output files of the action that are symbolic links to other files. Those
-	// may be links to other output files, or input files, or even absolute paths
-	// outside of the working directory, if the server supports
-	// [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
-	// For each output file requested in the `output_files` field of the Action,
-	// if the corresponding file existed after
-	// the action completed, a single entry will be present either in this field,
-	// or in the `output_files` field, if the file was not a symbolic link.
-	//
-	// If the action does not produce the requested output, or produces a
-	// directory where a regular file is expected or vice versa, then that output
-	// will be omitted from the list. The server is free to arrange the output
-	// list as desired; clients MUST NOT assume that the output list is sorted.
-	OutputFileSymlinks []*OutputSymlink `protobuf:"bytes,10,rep,name=output_file_symlinks,json=outputFileSymlinks,proto3" json:"output_file_symlinks,omitempty"`
-	// The output directories of the action. For each output directory requested
-	// in the `output_directories` field of the Action, if the corresponding
-	// directory existed after the action completed, a single entry will be
-	// present in the output list, which will contain the digest of a
-	// [Tree][build.bazel.remote.execution.v2.Tree] message containing the
-	// directory tree, and the path equal exactly to the corresponding Action
-	// output_directories member.
-	//
-	// As an example, suppose the Action had an output directory `a/b/dir` and the
-	// execution produced the following contents in `a/b/dir`: a file named `bar`
-	// and a directory named `foo` with an executable file named `baz`. Then,
-	// output_directory will contain (hashes shortened for readability):
-	//
-	// ```json
-	// // OutputDirectory proto:
-	// {
-	//   path: "a/b/dir"
-	//   tree_digest: {
-	//     hash: "4a73bc9d03...",
-	//     size: 55
-	//   }
-	// }
-	// // Tree proto with hash "4a73bc9d03..." and size 55:
-	// {
-	//   root: {
-	//     files: [
-	//       {
-	//         name: "bar",
-	//         digest: {
-	//           hash: "4a73bc9d03...",
-	//           size: 65534
-	//         }
-	//       }
-	//     ],
-	//     directories: [
-	//       {
-	//         name: "foo",
-	//         digest: {
-	//           hash: "4cf2eda940...",
-	//           size: 43
-	//         }
-	//       }
-	//     ]
-	//   }
-	//   children : {
-	//     // (Directory proto with hash "4cf2eda940..." and size 43)
-	//     files: [
-	//       {
-	//         name: "baz",
-	//         digest: {
-	//           hash: "b2c941073e...",
-	//           size: 1294,
-	//         },
-	//         is_executable: true
-	//       }
-	//     ]
-	//   }
-	// }
-	// ```
-	OutputDirectories []*OutputDirectory `protobuf:"bytes,3,rep,name=output_directories,json=outputDirectories,proto3" json:"output_directories,omitempty"`
-	// The output directories of the action that are symbolic links to other
-	// directories. Those may be links to other output directories, or input
-	// directories, or even absolute paths outside of the working directory,
-	// if the server supports
-	// [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
-	// For each output directory requested in the `output_directories` field of
-	// the Action, if the directory file existed after
-	// the action completed, a single entry will be present either in this field,
-	// or in the `output_directories` field, if the directory was not a symbolic link.
-	//
-	// If the action does not produce the requested output, or produces a
-	// file where a directory is expected or vice versa, then that output
-	// will be omitted from the list. The server is free to arrange the output
-	// list as desired; clients MUST NOT assume that the output list is sorted.
-	OutputDirectorySymlinks []*OutputSymlink `protobuf:"bytes,11,rep,name=output_directory_symlinks,json=outputDirectorySymlinks,proto3" json:"output_directory_symlinks,omitempty"`
-	// The exit code of the command.
-	ExitCode int32 `protobuf:"varint,4,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"`
-	// The standard output buffer of the action. The server will determine, based
-	// on the size of the buffer, whether to return it in raw form or to return
-	// a digest in `stdout_digest` that points to the buffer. If neither is set,
-	// then the buffer is empty. The client SHOULD NOT assume it will get one of
-	// the raw buffer or a digest on any given request and should be prepared to
-	// handle either.
-	StdoutRaw []byte `protobuf:"bytes,5,opt,name=stdout_raw,json=stdoutRaw,proto3" json:"stdout_raw,omitempty"`
-	// The digest for a blob containing the standard output of the action, which
-	// can be retrieved from the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	// See `stdout_raw` for when this will be set.
-	StdoutDigest *Digest `protobuf:"bytes,6,opt,name=stdout_digest,json=stdoutDigest,proto3" json:"stdout_digest,omitempty"`
-	// The standard error buffer of the action. The server will determine, based
-	// on the size of the buffer, whether to return it in raw form or to return
-	// a digest in `stderr_digest` that points to the buffer. If neither is set,
-	// then the buffer is empty. The client SHOULD NOT assume it will get one of
-	// the raw buffer or a digest on any given request and should be prepared to
-	// handle either.
-	StderrRaw []byte `protobuf:"bytes,7,opt,name=stderr_raw,json=stderrRaw,proto3" json:"stderr_raw,omitempty"`
-	// The digest for a blob containing the standard error of the action, which
-	// can be retrieved from the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	// See `stderr_raw` for when this will be set.
-	StderrDigest *Digest `protobuf:"bytes,8,opt,name=stderr_digest,json=stderrDigest,proto3" json:"stderr_digest,omitempty"`
-	// The details of the execution that originally produced this result.
-	ExecutionMetadata    *ExecutedActionMetadata `protobuf:"bytes,9,opt,name=execution_metadata,json=executionMetadata,proto3" json:"execution_metadata,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
-	XXX_unrecognized     []byte                  `json:"-"`
-	XXX_sizecache        int32                   `json:"-"`
-}
-
-func (m *ActionResult) Reset()         { *m = ActionResult{} }
-func (m *ActionResult) String() string { return proto.CompactTextString(m) }
-func (*ActionResult) ProtoMessage()    {}
-func (*ActionResult) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{9}
-}
-
-func (m *ActionResult) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ActionResult.Unmarshal(m, b)
-}
-func (m *ActionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ActionResult.Marshal(b, m, deterministic)
-}
-func (m *ActionResult) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ActionResult.Merge(m, src)
-}
-func (m *ActionResult) XXX_Size() int {
-	return xxx_messageInfo_ActionResult.Size(m)
-}
-func (m *ActionResult) XXX_DiscardUnknown() {
-	xxx_messageInfo_ActionResult.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ActionResult proto.InternalMessageInfo
-
-func (m *ActionResult) GetOutputFiles() []*OutputFile {
-	if m != nil {
-		return m.OutputFiles
-	}
-	return nil
-}
-
-func (m *ActionResult) GetOutputFileSymlinks() []*OutputSymlink {
-	if m != nil {
-		return m.OutputFileSymlinks
-	}
-	return nil
-}
-
-func (m *ActionResult) GetOutputDirectories() []*OutputDirectory {
-	if m != nil {
-		return m.OutputDirectories
-	}
-	return nil
-}
-
-func (m *ActionResult) GetOutputDirectorySymlinks() []*OutputSymlink {
-	if m != nil {
-		return m.OutputDirectorySymlinks
-	}
-	return nil
-}
-
-func (m *ActionResult) GetExitCode() int32 {
-	if m != nil {
-		return m.ExitCode
-	}
-	return 0
-}
-
-func (m *ActionResult) GetStdoutRaw() []byte {
-	if m != nil {
-		return m.StdoutRaw
-	}
-	return nil
-}
-
-func (m *ActionResult) GetStdoutDigest() *Digest {
-	if m != nil {
-		return m.StdoutDigest
-	}
-	return nil
-}
-
-func (m *ActionResult) GetStderrRaw() []byte {
-	if m != nil {
-		return m.StderrRaw
-	}
-	return nil
-}
-
-func (m *ActionResult) GetStderrDigest() *Digest {
-	if m != nil {
-		return m.StderrDigest
-	}
-	return nil
-}
-
-func (m *ActionResult) GetExecutionMetadata() *ExecutedActionMetadata {
-	if m != nil {
-		return m.ExecutionMetadata
-	}
-	return nil
-}
-
-// An `OutputFile` is similar to a
-// [FileNode][build.bazel.remote.execution.v2.FileNode], but it is used as an
-// output in an `ActionResult`. It allows a full file path rather than
-// only a name.
-//
-// `OutputFile` is binary-compatible with `FileNode`.
-type OutputFile struct {
-	// The full path of the file relative to the working directory, including the
-	// filename. The path separator is a forward slash `/`. Since this is a
-	// relative path, it MUST NOT begin with a leading forward slash.
-	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
-	// The digest of the file's content.
-	Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"`
-	// True if file is executable, false otherwise.
-	IsExecutable         bool     `protobuf:"varint,4,opt,name=is_executable,json=isExecutable,proto3" json:"is_executable,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OutputFile) Reset()         { *m = OutputFile{} }
-func (m *OutputFile) String() string { return proto.CompactTextString(m) }
-func (*OutputFile) ProtoMessage()    {}
-func (*OutputFile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{10}
-}
-
-func (m *OutputFile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OutputFile.Unmarshal(m, b)
-}
-func (m *OutputFile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OutputFile.Marshal(b, m, deterministic)
-}
-func (m *OutputFile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OutputFile.Merge(m, src)
-}
-func (m *OutputFile) XXX_Size() int {
-	return xxx_messageInfo_OutputFile.Size(m)
-}
-func (m *OutputFile) XXX_DiscardUnknown() {
-	xxx_messageInfo_OutputFile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OutputFile proto.InternalMessageInfo
-
-func (m *OutputFile) GetPath() string {
-	if m != nil {
-		return m.Path
-	}
-	return ""
-}
-
-func (m *OutputFile) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *OutputFile) GetIsExecutable() bool {
-	if m != nil {
-		return m.IsExecutable
-	}
-	return false
-}
-
-// A `Tree` contains all the
-// [Directory][build.bazel.remote.execution.v2.Directory] protos in a
-// single directory Merkle tree, compressed into one message.
-type Tree struct {
-	// The root directory in the tree.
-	Root *Directory `protobuf:"bytes,1,opt,name=root,proto3" json:"root,omitempty"`
-	// All the child directories: the directories referred to by the root and,
-	// recursively, all its children. In order to reconstruct the directory tree,
-	// the client must take the digests of each of the child directories and then
-	// build up a tree starting from the `root`.
-	Children             []*Directory `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
-}
-
-func (m *Tree) Reset()         { *m = Tree{} }
-func (m *Tree) String() string { return proto.CompactTextString(m) }
-func (*Tree) ProtoMessage()    {}
-func (*Tree) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{11}
-}
-
-func (m *Tree) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Tree.Unmarshal(m, b)
-}
-func (m *Tree) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Tree.Marshal(b, m, deterministic)
-}
-func (m *Tree) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Tree.Merge(m, src)
-}
-func (m *Tree) XXX_Size() int {
-	return xxx_messageInfo_Tree.Size(m)
-}
-func (m *Tree) XXX_DiscardUnknown() {
-	xxx_messageInfo_Tree.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Tree proto.InternalMessageInfo
-
-func (m *Tree) GetRoot() *Directory {
-	if m != nil {
-		return m.Root
-	}
-	return nil
-}
-
-func (m *Tree) GetChildren() []*Directory {
-	if m != nil {
-		return m.Children
-	}
-	return nil
-}
-
-// An `OutputDirectory` is the output in an `ActionResult` corresponding to a
-// directory's full contents rather than a single file.
-type OutputDirectory struct {
-	// The full path of the directory relative to the working directory. The path
-	// separator is a forward slash `/`. Since this is a relative path, it MUST
-	// NOT begin with a leading forward slash. The empty string value is allowed,
-	// and it denotes the entire working directory.
-	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
-	// The digest of the encoded
-	// [Tree][build.bazel.remote.execution.v2.Tree] proto containing the
-	// directory's contents.
-	TreeDigest           *Digest  `protobuf:"bytes,3,opt,name=tree_digest,json=treeDigest,proto3" json:"tree_digest,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OutputDirectory) Reset()         { *m = OutputDirectory{} }
-func (m *OutputDirectory) String() string { return proto.CompactTextString(m) }
-func (*OutputDirectory) ProtoMessage()    {}
-func (*OutputDirectory) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{12}
-}
-
-func (m *OutputDirectory) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OutputDirectory.Unmarshal(m, b)
-}
-func (m *OutputDirectory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OutputDirectory.Marshal(b, m, deterministic)
-}
-func (m *OutputDirectory) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OutputDirectory.Merge(m, src)
-}
-func (m *OutputDirectory) XXX_Size() int {
-	return xxx_messageInfo_OutputDirectory.Size(m)
-}
-func (m *OutputDirectory) XXX_DiscardUnknown() {
-	xxx_messageInfo_OutputDirectory.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OutputDirectory proto.InternalMessageInfo
-
-func (m *OutputDirectory) GetPath() string {
-	if m != nil {
-		return m.Path
-	}
-	return ""
-}
-
-func (m *OutputDirectory) GetTreeDigest() *Digest {
-	if m != nil {
-		return m.TreeDigest
-	}
-	return nil
-}
-
-// An `OutputSymlink` is similar to a
-// [Symlink][build.bazel.remote.execution.v2.SymlinkNode], but it is used as an
-// output in an `ActionResult`.
-//
-// `OutputSymlink` is binary-compatible with `SymlinkNode`.
-type OutputSymlink struct {
-	// The full path of the symlink relative to the working directory, including the
-	// filename. The path separator is a forward slash `/`. Since this is a
-	// relative path, it MUST NOT begin with a leading forward slash.
-	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
-	// The target path of the symlink. The path separator is a forward slash `/`.
-	// The target path can be relative to the parent directory of the symlink or
-	// it can be an absolute path starting with `/`. Support for absolute paths
-	// can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-	// API. The canonical form forbids the substrings `/./` and `//` in the target
-	// path. `..` components are allowed anywhere in the target path.
-	Target               string   `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OutputSymlink) Reset()         { *m = OutputSymlink{} }
-func (m *OutputSymlink) String() string { return proto.CompactTextString(m) }
-func (*OutputSymlink) ProtoMessage()    {}
-func (*OutputSymlink) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{13}
-}
-
-func (m *OutputSymlink) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OutputSymlink.Unmarshal(m, b)
-}
-func (m *OutputSymlink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OutputSymlink.Marshal(b, m, deterministic)
-}
-func (m *OutputSymlink) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OutputSymlink.Merge(m, src)
-}
-func (m *OutputSymlink) XXX_Size() int {
-	return xxx_messageInfo_OutputSymlink.Size(m)
-}
-func (m *OutputSymlink) XXX_DiscardUnknown() {
-	xxx_messageInfo_OutputSymlink.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OutputSymlink proto.InternalMessageInfo
-
-func (m *OutputSymlink) GetPath() string {
-	if m != nil {
-		return m.Path
-	}
-	return ""
-}
-
-func (m *OutputSymlink) GetTarget() string {
-	if m != nil {
-		return m.Target
-	}
-	return ""
-}
-
-// An `ExecutionPolicy` can be used to control the scheduling of the action.
-type ExecutionPolicy struct {
-	// The priority (relative importance) of this action. Generally, a lower value
-	// means that the action should be run sooner than actions having a greater
-	// priority value, but the interpretation of a given value is server-
-	// dependent. A priority of 0 means the *default* priority. Priorities may be
-	// positive or negative, and such actions should run later or sooner than
-	// actions having the default priority, respectively. The particular semantics
-	// of this field is up to the server. In particular, every server will have
-	// their own supported range of priorities, and will decide how these map into
-	// scheduling policy.
-	Priority             int32    `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ExecutionPolicy) Reset()         { *m = ExecutionPolicy{} }
-func (m *ExecutionPolicy) String() string { return proto.CompactTextString(m) }
-func (*ExecutionPolicy) ProtoMessage()    {}
-func (*ExecutionPolicy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{14}
-}
-
-func (m *ExecutionPolicy) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecutionPolicy.Unmarshal(m, b)
-}
-func (m *ExecutionPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecutionPolicy.Marshal(b, m, deterministic)
-}
-func (m *ExecutionPolicy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecutionPolicy.Merge(m, src)
-}
-func (m *ExecutionPolicy) XXX_Size() int {
-	return xxx_messageInfo_ExecutionPolicy.Size(m)
-}
-func (m *ExecutionPolicy) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecutionPolicy.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecutionPolicy proto.InternalMessageInfo
-
-func (m *ExecutionPolicy) GetPriority() int32 {
-	if m != nil {
-		return m.Priority
-	}
-	return 0
-}
-
-// A `ResultsCachePolicy` is used for fine-grained control over how action
-// outputs are stored in the CAS and Action Cache.
-type ResultsCachePolicy struct {
-	// The priority (relative importance) of this content in the overall cache.
-	// Generally, a lower value means a longer retention time or other advantage,
-	// but the interpretation of a given value is server-dependent. A priority of
-	// 0 means a *default* value, decided by the server.
-	//
-	// The particular semantics of this field is up to the server. In particular,
-	// every server will have their own supported range of priorities, and will
-	// decide how these map into retention/eviction policy.
-	Priority             int32    `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ResultsCachePolicy) Reset()         { *m = ResultsCachePolicy{} }
-func (m *ResultsCachePolicy) String() string { return proto.CompactTextString(m) }
-func (*ResultsCachePolicy) ProtoMessage()    {}
-func (*ResultsCachePolicy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{15}
-}
-
-func (m *ResultsCachePolicy) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ResultsCachePolicy.Unmarshal(m, b)
-}
-func (m *ResultsCachePolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ResultsCachePolicy.Marshal(b, m, deterministic)
-}
-func (m *ResultsCachePolicy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ResultsCachePolicy.Merge(m, src)
-}
-func (m *ResultsCachePolicy) XXX_Size() int {
-	return xxx_messageInfo_ResultsCachePolicy.Size(m)
-}
-func (m *ResultsCachePolicy) XXX_DiscardUnknown() {
-	xxx_messageInfo_ResultsCachePolicy.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ResultsCachePolicy proto.InternalMessageInfo
-
-func (m *ResultsCachePolicy) GetPriority() int32 {
-	if m != nil {
-		return m.Priority
-	}
-	return 0
-}
-
-// A request message for
-// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute].
-type ExecuteRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// If true, the action will be executed even if its result is already
-	// present in the [ActionCache][build.bazel.remote.execution.v2.ActionCache].
-	// The execution is still allowed to be merged with other in-flight executions
-	// of the same action, however - semantically, the service MUST only guarantee
-	// that the results of an execution with this field set were not visible
-	// before the corresponding execution request was sent.
-	// Note that actions from execution requests setting this field set are still
-	// eligible to be entered into the action cache upon completion, and services
-	// SHOULD overwrite any existing entries that may exist. This allows
-	// skip_cache_lookup requests to be used as a mechanism for replacing action
-	// cache entries that reference outputs no longer available or that are
-	// poisoned in any way.
-	// If false, the result may be served from the action cache.
-	SkipCacheLookup bool `protobuf:"varint,3,opt,name=skip_cache_lookup,json=skipCacheLookup,proto3" json:"skip_cache_lookup,omitempty"`
-	// The digest of the [Action][build.bazel.remote.execution.v2.Action] to
-	// execute.
-	ActionDigest *Digest `protobuf:"bytes,6,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
-	// An optional policy for execution of the action.
-	// The server will have a default policy if this is not provided.
-	ExecutionPolicy *ExecutionPolicy `protobuf:"bytes,7,opt,name=execution_policy,json=executionPolicy,proto3" json:"execution_policy,omitempty"`
-	// An optional policy for the results of this execution in the remote cache.
-	// The server will have a default policy if this is not provided.
-	// This may be applied to both the ActionResult and the associated blobs.
-	ResultsCachePolicy   *ResultsCachePolicy `protobuf:"bytes,8,opt,name=results_cache_policy,json=resultsCachePolicy,proto3" json:"results_cache_policy,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
-}
-
-func (m *ExecuteRequest) Reset()         { *m = ExecuteRequest{} }
-func (m *ExecuteRequest) String() string { return proto.CompactTextString(m) }
-func (*ExecuteRequest) ProtoMessage()    {}
-func (*ExecuteRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{16}
-}
-
-func (m *ExecuteRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecuteRequest.Unmarshal(m, b)
-}
-func (m *ExecuteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecuteRequest.Marshal(b, m, deterministic)
-}
-func (m *ExecuteRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecuteRequest.Merge(m, src)
-}
-func (m *ExecuteRequest) XXX_Size() int {
-	return xxx_messageInfo_ExecuteRequest.Size(m)
-}
-func (m *ExecuteRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecuteRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecuteRequest proto.InternalMessageInfo
-
-func (m *ExecuteRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *ExecuteRequest) GetSkipCacheLookup() bool {
-	if m != nil {
-		return m.SkipCacheLookup
-	}
-	return false
-}
-
-func (m *ExecuteRequest) GetActionDigest() *Digest {
-	if m != nil {
-		return m.ActionDigest
-	}
-	return nil
-}
-
-func (m *ExecuteRequest) GetExecutionPolicy() *ExecutionPolicy {
-	if m != nil {
-		return m.ExecutionPolicy
-	}
-	return nil
-}
-
-func (m *ExecuteRequest) GetResultsCachePolicy() *ResultsCachePolicy {
-	if m != nil {
-		return m.ResultsCachePolicy
-	}
-	return nil
-}
-
-// A `LogFile` is a log stored in the CAS.
-type LogFile struct {
-	// The digest of the log contents.
-	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
-	// This is a hint as to the purpose of the log, and is set to true if the log
-	// is human-readable text that can be usefully displayed to a user, and false
-	// otherwise. For instance, if a command-line client wishes to print the
-	// server logs to the terminal for a failed action, this allows it to avoid
-	// displaying a binary file.
-	HumanReadable        bool     `protobuf:"varint,2,opt,name=human_readable,json=humanReadable,proto3" json:"human_readable,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *LogFile) Reset()         { *m = LogFile{} }
-func (m *LogFile) String() string { return proto.CompactTextString(m) }
-func (*LogFile) ProtoMessage()    {}
-func (*LogFile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{17}
-}
-
-func (m *LogFile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_LogFile.Unmarshal(m, b)
-}
-func (m *LogFile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_LogFile.Marshal(b, m, deterministic)
-}
-func (m *LogFile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LogFile.Merge(m, src)
-}
-func (m *LogFile) XXX_Size() int {
-	return xxx_messageInfo_LogFile.Size(m)
-}
-func (m *LogFile) XXX_DiscardUnknown() {
-	xxx_messageInfo_LogFile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_LogFile proto.InternalMessageInfo
-
-func (m *LogFile) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *LogFile) GetHumanReadable() bool {
-	if m != nil {
-		return m.HumanReadable
-	}
-	return false
-}
-
-// The response message for
-// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute],
-// which will be contained in the [response
-// field][google.longrunning.Operation.response] of the
-// [Operation][google.longrunning.Operation].
-type ExecuteResponse struct {
-	// The result of the action.
-	Result *ActionResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
-	// True if the result was served from cache, false if it was executed.
-	CachedResult bool `protobuf:"varint,2,opt,name=cached_result,json=cachedResult,proto3" json:"cached_result,omitempty"`
-	// If the status has a code other than `OK`, it indicates that the action did
-	// not finish execution. For example, if the operation times out during
-	// execution, the status will have a `DEADLINE_EXCEEDED` code. Servers MUST
-	// use this field for errors in execution, rather than the error field on the
-	// `Operation` object.
-	//
-	// If the status code is other than `OK`, then the result MUST NOT be cached.
-	// For an error status, the `result` field is optional; the server may
-	// populate the output-, stdout-, and stderr-related fields if it has any
-	// information available, such as the stdout and stderr of a timed-out action.
-	Status *status.Status `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
-	// An optional list of additional log outputs the server wishes to provide. A
-	// server can use this to return execution-specific logs however it wishes.
-	// This is intended primarily to make it easier for users to debug issues that
-	// may be outside of the actual job execution, such as by identifying the
-	// worker executing the action or by providing logs from the worker's setup
-	// phase. The keys SHOULD be human readable so that a client can display them
-	// to a user.
-	ServerLogs map[string]*LogFile `protobuf:"bytes,4,rep,name=server_logs,json=serverLogs,proto3" json:"server_logs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	// Freeform informational message with details on the execution of the action
-	// that may be displayed to the user upon failure or when requested explicitly.
-	Message              string   `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ExecuteResponse) Reset()         { *m = ExecuteResponse{} }
-func (m *ExecuteResponse) String() string { return proto.CompactTextString(m) }
-func (*ExecuteResponse) ProtoMessage()    {}
-func (*ExecuteResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{18}
-}
-
-func (m *ExecuteResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecuteResponse.Unmarshal(m, b)
-}
-func (m *ExecuteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecuteResponse.Marshal(b, m, deterministic)
-}
-func (m *ExecuteResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecuteResponse.Merge(m, src)
-}
-func (m *ExecuteResponse) XXX_Size() int {
-	return xxx_messageInfo_ExecuteResponse.Size(m)
-}
-func (m *ExecuteResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecuteResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecuteResponse proto.InternalMessageInfo
-
-func (m *ExecuteResponse) GetResult() *ActionResult {
-	if m != nil {
-		return m.Result
-	}
-	return nil
-}
-
-func (m *ExecuteResponse) GetCachedResult() bool {
-	if m != nil {
-		return m.CachedResult
-	}
-	return false
-}
-
-func (m *ExecuteResponse) GetStatus() *status.Status {
-	if m != nil {
-		return m.Status
-	}
-	return nil
-}
-
-func (m *ExecuteResponse) GetServerLogs() map[string]*LogFile {
-	if m != nil {
-		return m.ServerLogs
-	}
-	return nil
-}
-
-func (m *ExecuteResponse) GetMessage() string {
-	if m != nil {
-		return m.Message
-	}
-	return ""
-}
-
-// Metadata about an ongoing
-// [execution][build.bazel.remote.execution.v2.Execution.Execute], which
-// will be contained in the [metadata
-// field][google.longrunning.Operation.response] of the
-// [Operation][google.longrunning.Operation].
-type ExecuteOperationMetadata struct {
-	Stage ExecuteOperationMetadata_Stage `protobuf:"varint,1,opt,name=stage,proto3,enum=build.bazel.remote.execution.v2.ExecuteOperationMetadata_Stage" json:"stage,omitempty"`
-	// The digest of the [Action][build.bazel.remote.execution.v2.Action]
-	// being executed.
-	ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
-	// If set, the client can use this name with
-	// [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-	// standard output.
-	StdoutStreamName string `protobuf:"bytes,3,opt,name=stdout_stream_name,json=stdoutStreamName,proto3" json:"stdout_stream_name,omitempty"`
-	// If set, the client can use this name with
-	// [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-	// standard error.
-	StderrStreamName     string   `protobuf:"bytes,4,opt,name=stderr_stream_name,json=stderrStreamName,proto3" json:"stderr_stream_name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ExecuteOperationMetadata) Reset()         { *m = ExecuteOperationMetadata{} }
-func (m *ExecuteOperationMetadata) String() string { return proto.CompactTextString(m) }
-func (*ExecuteOperationMetadata) ProtoMessage()    {}
-func (*ExecuteOperationMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{19}
-}
-
-func (m *ExecuteOperationMetadata) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecuteOperationMetadata.Unmarshal(m, b)
-}
-func (m *ExecuteOperationMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecuteOperationMetadata.Marshal(b, m, deterministic)
-}
-func (m *ExecuteOperationMetadata) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecuteOperationMetadata.Merge(m, src)
-}
-func (m *ExecuteOperationMetadata) XXX_Size() int {
-	return xxx_messageInfo_ExecuteOperationMetadata.Size(m)
-}
-func (m *ExecuteOperationMetadata) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecuteOperationMetadata.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecuteOperationMetadata proto.InternalMessageInfo
-
-func (m *ExecuteOperationMetadata) GetStage() ExecuteOperationMetadata_Stage {
-	if m != nil {
-		return m.Stage
-	}
-	return ExecuteOperationMetadata_UNKNOWN
-}
-
-func (m *ExecuteOperationMetadata) GetActionDigest() *Digest {
-	if m != nil {
-		return m.ActionDigest
-	}
-	return nil
-}
-
-func (m *ExecuteOperationMetadata) GetStdoutStreamName() string {
-	if m != nil {
-		return m.StdoutStreamName
-	}
-	return ""
-}
-
-func (m *ExecuteOperationMetadata) GetStderrStreamName() string {
-	if m != nil {
-		return m.StderrStreamName
-	}
-	return ""
-}
-
-// A request message for
-// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution].
-type WaitExecutionRequest struct {
-	// The name of the [Operation][google.longrunning.Operation]
-	// returned by [Execute][build.bazel.remote.execution.v2.Execution.Execute].
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *WaitExecutionRequest) Reset()         { *m = WaitExecutionRequest{} }
-func (m *WaitExecutionRequest) String() string { return proto.CompactTextString(m) }
-func (*WaitExecutionRequest) ProtoMessage()    {}
-func (*WaitExecutionRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{20}
-}
-
-func (m *WaitExecutionRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_WaitExecutionRequest.Unmarshal(m, b)
-}
-func (m *WaitExecutionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_WaitExecutionRequest.Marshal(b, m, deterministic)
-}
-func (m *WaitExecutionRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_WaitExecutionRequest.Merge(m, src)
-}
-func (m *WaitExecutionRequest) XXX_Size() int {
-	return xxx_messageInfo_WaitExecutionRequest.Size(m)
-}
-func (m *WaitExecutionRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_WaitExecutionRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_WaitExecutionRequest proto.InternalMessageInfo
-
-func (m *WaitExecutionRequest) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-// A request message for
-// [ActionCache.GetActionResult][build.bazel.remote.execution.v2.ActionCache.GetActionResult].
-type GetActionResultRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The digest of the [Action][build.bazel.remote.execution.v2.Action]
-	// whose result is requested.
-	ActionDigest         *Digest  `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetActionResultRequest) Reset()         { *m = GetActionResultRequest{} }
-func (m *GetActionResultRequest) String() string { return proto.CompactTextString(m) }
-func (*GetActionResultRequest) ProtoMessage()    {}
-func (*GetActionResultRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{21}
-}
-
-func (m *GetActionResultRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetActionResultRequest.Unmarshal(m, b)
-}
-func (m *GetActionResultRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetActionResultRequest.Marshal(b, m, deterministic)
-}
-func (m *GetActionResultRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetActionResultRequest.Merge(m, src)
-}
-func (m *GetActionResultRequest) XXX_Size() int {
-	return xxx_messageInfo_GetActionResultRequest.Size(m)
-}
-func (m *GetActionResultRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetActionResultRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetActionResultRequest proto.InternalMessageInfo
-
-func (m *GetActionResultRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *GetActionResultRequest) GetActionDigest() *Digest {
-	if m != nil {
-		return m.ActionDigest
-	}
-	return nil
-}
-
-// A request message for
-// [ActionCache.UpdateActionResult][build.bazel.remote.execution.v2.ActionCache.UpdateActionResult].
-type UpdateActionResultRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The digest of the [Action][build.bazel.remote.execution.v2.Action]
-	// whose result is being uploaded.
-	ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
-	// The [ActionResult][build.bazel.remote.execution.v2.ActionResult]
-	// to store in the cache.
-	ActionResult *ActionResult `protobuf:"bytes,3,opt,name=action_result,json=actionResult,proto3" json:"action_result,omitempty"`
-	// An optional policy for the results of this execution in the remote cache.
-	// The server will have a default policy if this is not provided.
-	// This may be applied to both the ActionResult and the associated blobs.
-	ResultsCachePolicy   *ResultsCachePolicy `protobuf:"bytes,4,opt,name=results_cache_policy,json=resultsCachePolicy,proto3" json:"results_cache_policy,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
-}
-
-func (m *UpdateActionResultRequest) Reset()         { *m = UpdateActionResultRequest{} }
-func (m *UpdateActionResultRequest) String() string { return proto.CompactTextString(m) }
-func (*UpdateActionResultRequest) ProtoMessage()    {}
-func (*UpdateActionResultRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{22}
-}
-
-func (m *UpdateActionResultRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_UpdateActionResultRequest.Unmarshal(m, b)
-}
-func (m *UpdateActionResultRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_UpdateActionResultRequest.Marshal(b, m, deterministic)
-}
-func (m *UpdateActionResultRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UpdateActionResultRequest.Merge(m, src)
-}
-func (m *UpdateActionResultRequest) XXX_Size() int {
-	return xxx_messageInfo_UpdateActionResultRequest.Size(m)
-}
-func (m *UpdateActionResultRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_UpdateActionResultRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_UpdateActionResultRequest proto.InternalMessageInfo
-
-func (m *UpdateActionResultRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *UpdateActionResultRequest) GetActionDigest() *Digest {
-	if m != nil {
-		return m.ActionDigest
-	}
-	return nil
-}
-
-func (m *UpdateActionResultRequest) GetActionResult() *ActionResult {
-	if m != nil {
-		return m.ActionResult
-	}
-	return nil
-}
-
-func (m *UpdateActionResultRequest) GetResultsCachePolicy() *ResultsCachePolicy {
-	if m != nil {
-		return m.ResultsCachePolicy
-	}
-	return nil
-}
-
-// A request message for
-// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
-type FindMissingBlobsRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// A list of the blobs to check.
-	BlobDigests          []*Digest `protobuf:"bytes,2,rep,name=blob_digests,json=blobDigests,proto3" json:"blob_digests,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
-
-func (m *FindMissingBlobsRequest) Reset()         { *m = FindMissingBlobsRequest{} }
-func (m *FindMissingBlobsRequest) String() string { return proto.CompactTextString(m) }
-func (*FindMissingBlobsRequest) ProtoMessage()    {}
-func (*FindMissingBlobsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{23}
-}
-
-func (m *FindMissingBlobsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FindMissingBlobsRequest.Unmarshal(m, b)
-}
-func (m *FindMissingBlobsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FindMissingBlobsRequest.Marshal(b, m, deterministic)
-}
-func (m *FindMissingBlobsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FindMissingBlobsRequest.Merge(m, src)
-}
-func (m *FindMissingBlobsRequest) XXX_Size() int {
-	return xxx_messageInfo_FindMissingBlobsRequest.Size(m)
-}
-func (m *FindMissingBlobsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_FindMissingBlobsRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FindMissingBlobsRequest proto.InternalMessageInfo
-
-func (m *FindMissingBlobsRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *FindMissingBlobsRequest) GetBlobDigests() []*Digest {
-	if m != nil {
-		return m.BlobDigests
-	}
-	return nil
-}
-
-// A response message for
-// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
-type FindMissingBlobsResponse struct {
-	// A list of the blobs requested *not* present in the storage.
-	MissingBlobDigests   []*Digest `protobuf:"bytes,2,rep,name=missing_blob_digests,json=missingBlobDigests,proto3" json:"missing_blob_digests,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
-
-func (m *FindMissingBlobsResponse) Reset()         { *m = FindMissingBlobsResponse{} }
-func (m *FindMissingBlobsResponse) String() string { return proto.CompactTextString(m) }
-func (*FindMissingBlobsResponse) ProtoMessage()    {}
-func (*FindMissingBlobsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{24}
-}
-
-func (m *FindMissingBlobsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FindMissingBlobsResponse.Unmarshal(m, b)
-}
-func (m *FindMissingBlobsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FindMissingBlobsResponse.Marshal(b, m, deterministic)
-}
-func (m *FindMissingBlobsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FindMissingBlobsResponse.Merge(m, src)
-}
-func (m *FindMissingBlobsResponse) XXX_Size() int {
-	return xxx_messageInfo_FindMissingBlobsResponse.Size(m)
-}
-func (m *FindMissingBlobsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_FindMissingBlobsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FindMissingBlobsResponse proto.InternalMessageInfo
-
-func (m *FindMissingBlobsResponse) GetMissingBlobDigests() []*Digest {
-	if m != nil {
-		return m.MissingBlobDigests
-	}
-	return nil
-}
-
-// A request message for
-// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-type BatchUpdateBlobsRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The individual upload requests.
-	Requests             []*BatchUpdateBlobsRequest_Request `protobuf:"bytes,2,rep,name=requests,proto3" json:"requests,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
-	XXX_unrecognized     []byte                             `json:"-"`
-	XXX_sizecache        int32                              `json:"-"`
-}
-
-func (m *BatchUpdateBlobsRequest) Reset()         { *m = BatchUpdateBlobsRequest{} }
-func (m *BatchUpdateBlobsRequest) String() string { return proto.CompactTextString(m) }
-func (*BatchUpdateBlobsRequest) ProtoMessage()    {}
-func (*BatchUpdateBlobsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{25}
-}
-
-func (m *BatchUpdateBlobsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchUpdateBlobsRequest.Unmarshal(m, b)
-}
-func (m *BatchUpdateBlobsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchUpdateBlobsRequest.Marshal(b, m, deterministic)
-}
-func (m *BatchUpdateBlobsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchUpdateBlobsRequest.Merge(m, src)
-}
-func (m *BatchUpdateBlobsRequest) XXX_Size() int {
-	return xxx_messageInfo_BatchUpdateBlobsRequest.Size(m)
-}
-func (m *BatchUpdateBlobsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchUpdateBlobsRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchUpdateBlobsRequest proto.InternalMessageInfo
-
-func (m *BatchUpdateBlobsRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *BatchUpdateBlobsRequest) GetRequests() []*BatchUpdateBlobsRequest_Request {
-	if m != nil {
-		return m.Requests
-	}
-	return nil
-}
-
-// A request corresponding to a single blob that the client wants to upload.
-type BatchUpdateBlobsRequest_Request struct {
-	// The digest of the blob. This MUST be the digest of `data`.
-	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
-	// The raw binary data.
-	Data                 []byte   `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *BatchUpdateBlobsRequest_Request) Reset()         { *m = BatchUpdateBlobsRequest_Request{} }
-func (m *BatchUpdateBlobsRequest_Request) String() string { return proto.CompactTextString(m) }
-func (*BatchUpdateBlobsRequest_Request) ProtoMessage()    {}
-func (*BatchUpdateBlobsRequest_Request) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{25, 0}
-}
-
-func (m *BatchUpdateBlobsRequest_Request) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchUpdateBlobsRequest_Request.Unmarshal(m, b)
-}
-func (m *BatchUpdateBlobsRequest_Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchUpdateBlobsRequest_Request.Marshal(b, m, deterministic)
-}
-func (m *BatchUpdateBlobsRequest_Request) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchUpdateBlobsRequest_Request.Merge(m, src)
-}
-func (m *BatchUpdateBlobsRequest_Request) XXX_Size() int {
-	return xxx_messageInfo_BatchUpdateBlobsRequest_Request.Size(m)
-}
-func (m *BatchUpdateBlobsRequest_Request) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchUpdateBlobsRequest_Request.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchUpdateBlobsRequest_Request proto.InternalMessageInfo
-
-func (m *BatchUpdateBlobsRequest_Request) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *BatchUpdateBlobsRequest_Request) GetData() []byte {
-	if m != nil {
-		return m.Data
-	}
-	return nil
-}
-
-// A response message for
-// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-type BatchUpdateBlobsResponse struct {
-	// The responses to the requests.
-	Responses            []*BatchUpdateBlobsResponse_Response `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
-	XXX_unrecognized     []byte                               `json:"-"`
-	XXX_sizecache        int32                                `json:"-"`
-}
-
-func (m *BatchUpdateBlobsResponse) Reset()         { *m = BatchUpdateBlobsResponse{} }
-func (m *BatchUpdateBlobsResponse) String() string { return proto.CompactTextString(m) }
-func (*BatchUpdateBlobsResponse) ProtoMessage()    {}
-func (*BatchUpdateBlobsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{26}
-}
-
-func (m *BatchUpdateBlobsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchUpdateBlobsResponse.Unmarshal(m, b)
-}
-func (m *BatchUpdateBlobsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchUpdateBlobsResponse.Marshal(b, m, deterministic)
-}
-func (m *BatchUpdateBlobsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchUpdateBlobsResponse.Merge(m, src)
-}
-func (m *BatchUpdateBlobsResponse) XXX_Size() int {
-	return xxx_messageInfo_BatchUpdateBlobsResponse.Size(m)
-}
-func (m *BatchUpdateBlobsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchUpdateBlobsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchUpdateBlobsResponse proto.InternalMessageInfo
-
-func (m *BatchUpdateBlobsResponse) GetResponses() []*BatchUpdateBlobsResponse_Response {
-	if m != nil {
-		return m.Responses
-	}
-	return nil
-}
-
-// A response corresponding to a single blob that the client tried to upload.
-type BatchUpdateBlobsResponse_Response struct {
-	// The blob digest to which this response corresponds.
-	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
-	// The result of attempting to upload that blob.
-	Status               *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *BatchUpdateBlobsResponse_Response) Reset()         { *m = BatchUpdateBlobsResponse_Response{} }
-func (m *BatchUpdateBlobsResponse_Response) String() string { return proto.CompactTextString(m) }
-func (*BatchUpdateBlobsResponse_Response) ProtoMessage()    {}
-func (*BatchUpdateBlobsResponse_Response) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{26, 0}
-}
-
-func (m *BatchUpdateBlobsResponse_Response) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchUpdateBlobsResponse_Response.Unmarshal(m, b)
-}
-func (m *BatchUpdateBlobsResponse_Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchUpdateBlobsResponse_Response.Marshal(b, m, deterministic)
-}
-func (m *BatchUpdateBlobsResponse_Response) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchUpdateBlobsResponse_Response.Merge(m, src)
-}
-func (m *BatchUpdateBlobsResponse_Response) XXX_Size() int {
-	return xxx_messageInfo_BatchUpdateBlobsResponse_Response.Size(m)
-}
-func (m *BatchUpdateBlobsResponse_Response) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchUpdateBlobsResponse_Response.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchUpdateBlobsResponse_Response proto.InternalMessageInfo
-
-func (m *BatchUpdateBlobsResponse_Response) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *BatchUpdateBlobsResponse_Response) GetStatus() *status.Status {
-	if m != nil {
-		return m.Status
-	}
-	return nil
-}
-
-// A request message for
-// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
-type BatchReadBlobsRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The individual blob digests.
-	Digests              []*Digest `protobuf:"bytes,2,rep,name=digests,proto3" json:"digests,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
-
-func (m *BatchReadBlobsRequest) Reset()         { *m = BatchReadBlobsRequest{} }
-func (m *BatchReadBlobsRequest) String() string { return proto.CompactTextString(m) }
-func (*BatchReadBlobsRequest) ProtoMessage()    {}
-func (*BatchReadBlobsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{27}
-}
-
-func (m *BatchReadBlobsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchReadBlobsRequest.Unmarshal(m, b)
-}
-func (m *BatchReadBlobsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchReadBlobsRequest.Marshal(b, m, deterministic)
-}
-func (m *BatchReadBlobsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchReadBlobsRequest.Merge(m, src)
-}
-func (m *BatchReadBlobsRequest) XXX_Size() int {
-	return xxx_messageInfo_BatchReadBlobsRequest.Size(m)
-}
-func (m *BatchReadBlobsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchReadBlobsRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchReadBlobsRequest proto.InternalMessageInfo
-
-func (m *BatchReadBlobsRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *BatchReadBlobsRequest) GetDigests() []*Digest {
-	if m != nil {
-		return m.Digests
-	}
-	return nil
-}
-
-// A response message for
-// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
-type BatchReadBlobsResponse struct {
-	// The responses to the requests.
-	Responses            []*BatchReadBlobsResponse_Response `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
-	XXX_unrecognized     []byte                             `json:"-"`
-	XXX_sizecache        int32                              `json:"-"`
-}
-
-func (m *BatchReadBlobsResponse) Reset()         { *m = BatchReadBlobsResponse{} }
-func (m *BatchReadBlobsResponse) String() string { return proto.CompactTextString(m) }
-func (*BatchReadBlobsResponse) ProtoMessage()    {}
-func (*BatchReadBlobsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{28}
-}
-
-func (m *BatchReadBlobsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchReadBlobsResponse.Unmarshal(m, b)
-}
-func (m *BatchReadBlobsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchReadBlobsResponse.Marshal(b, m, deterministic)
-}
-func (m *BatchReadBlobsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchReadBlobsResponse.Merge(m, src)
-}
-func (m *BatchReadBlobsResponse) XXX_Size() int {
-	return xxx_messageInfo_BatchReadBlobsResponse.Size(m)
-}
-func (m *BatchReadBlobsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchReadBlobsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchReadBlobsResponse proto.InternalMessageInfo
-
-func (m *BatchReadBlobsResponse) GetResponses() []*BatchReadBlobsResponse_Response {
-	if m != nil {
-		return m.Responses
-	}
-	return nil
-}
-
-// A response corresponding to a single blob that the client tried to download.
-type BatchReadBlobsResponse_Response struct {
-	// The digest to which this response corresponds.
-	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
-	// The raw binary data.
-	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
-	// The result of attempting to download that blob.
-	Status               *status.Status `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *BatchReadBlobsResponse_Response) Reset()         { *m = BatchReadBlobsResponse_Response{} }
-func (m *BatchReadBlobsResponse_Response) String() string { return proto.CompactTextString(m) }
-func (*BatchReadBlobsResponse_Response) ProtoMessage()    {}
-func (*BatchReadBlobsResponse_Response) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{28, 0}
-}
-
-func (m *BatchReadBlobsResponse_Response) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BatchReadBlobsResponse_Response.Unmarshal(m, b)
-}
-func (m *BatchReadBlobsResponse_Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BatchReadBlobsResponse_Response.Marshal(b, m, deterministic)
-}
-func (m *BatchReadBlobsResponse_Response) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BatchReadBlobsResponse_Response.Merge(m, src)
-}
-func (m *BatchReadBlobsResponse_Response) XXX_Size() int {
-	return xxx_messageInfo_BatchReadBlobsResponse_Response.Size(m)
-}
-func (m *BatchReadBlobsResponse_Response) XXX_DiscardUnknown() {
-	xxx_messageInfo_BatchReadBlobsResponse_Response.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_BatchReadBlobsResponse_Response proto.InternalMessageInfo
-
-func (m *BatchReadBlobsResponse_Response) GetDigest() *Digest {
-	if m != nil {
-		return m.Digest
-	}
-	return nil
-}
-
-func (m *BatchReadBlobsResponse_Response) GetData() []byte {
-	if m != nil {
-		return m.Data
-	}
-	return nil
-}
-
-func (m *BatchReadBlobsResponse_Response) GetStatus() *status.Status {
-	if m != nil {
-		return m.Status
-	}
-	return nil
-}
-
-// A request message for
-// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
-type GetTreeRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	// The digest of the root, which must be an encoded
-	// [Directory][build.bazel.remote.execution.v2.Directory] message
-	// stored in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	RootDigest *Digest `protobuf:"bytes,2,opt,name=root_digest,json=rootDigest,proto3" json:"root_digest,omitempty"`
-	// A maximum page size to request. If present, the server will request no more
-	// than this many items. Regardless of whether a page size is specified, the
-	// server may place its own limit on the number of items to be returned and
-	// require the client to retrieve more items using a subsequent request.
-	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
-	// A page token, which must be a value received in a previous
-	// [GetTreeResponse][build.bazel.remote.execution.v2.GetTreeResponse].
-	// If present, the server will use it to return the following page of results.
-	PageToken            string   `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetTreeRequest) Reset()         { *m = GetTreeRequest{} }
-func (m *GetTreeRequest) String() string { return proto.CompactTextString(m) }
-func (*GetTreeRequest) ProtoMessage()    {}
-func (*GetTreeRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{29}
-}
-
-func (m *GetTreeRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetTreeRequest.Unmarshal(m, b)
-}
-func (m *GetTreeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetTreeRequest.Marshal(b, m, deterministic)
-}
-func (m *GetTreeRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetTreeRequest.Merge(m, src)
-}
-func (m *GetTreeRequest) XXX_Size() int {
-	return xxx_messageInfo_GetTreeRequest.Size(m)
-}
-func (m *GetTreeRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetTreeRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetTreeRequest proto.InternalMessageInfo
-
-func (m *GetTreeRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-func (m *GetTreeRequest) GetRootDigest() *Digest {
-	if m != nil {
-		return m.RootDigest
-	}
-	return nil
-}
-
-func (m *GetTreeRequest) GetPageSize() int32 {
-	if m != nil {
-		return m.PageSize
-	}
-	return 0
-}
-
-func (m *GetTreeRequest) GetPageToken() string {
-	if m != nil {
-		return m.PageToken
-	}
-	return ""
-}
-
-// A response message for
-// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
-type GetTreeResponse struct {
-	// The directories descended from the requested root.
-	Directories []*Directory `protobuf:"bytes,1,rep,name=directories,proto3" json:"directories,omitempty"`
-	// If present, signifies that there are more results which the client can
-	// retrieve by passing this as the page_token in a subsequent
-	// [request][build.bazel.remote.execution.v2.GetTreeRequest].
-	// If empty, signifies that this is the last page of results.
-	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetTreeResponse) Reset()         { *m = GetTreeResponse{} }
-func (m *GetTreeResponse) String() string { return proto.CompactTextString(m) }
-func (*GetTreeResponse) ProtoMessage()    {}
-func (*GetTreeResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{30}
-}
-
-func (m *GetTreeResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetTreeResponse.Unmarshal(m, b)
-}
-func (m *GetTreeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetTreeResponse.Marshal(b, m, deterministic)
-}
-func (m *GetTreeResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetTreeResponse.Merge(m, src)
-}
-func (m *GetTreeResponse) XXX_Size() int {
-	return xxx_messageInfo_GetTreeResponse.Size(m)
-}
-func (m *GetTreeResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetTreeResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetTreeResponse proto.InternalMessageInfo
-
-func (m *GetTreeResponse) GetDirectories() []*Directory {
-	if m != nil {
-		return m.Directories
-	}
-	return nil
-}
-
-func (m *GetTreeResponse) GetNextPageToken() string {
-	if m != nil {
-		return m.NextPageToken
-	}
-	return ""
-}
-
-// A request message for
-// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
-type GetCapabilitiesRequest struct {
-	// The instance of the execution system to operate against. A server may
-	// support multiple instances of the execution system (with their own workers,
-	// storage, caches, etc.). The server MAY require use of this field to select
-	// between them in an implementation-defined fashion, otherwise it can be
-	// omitted.
-	InstanceName         string   `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetCapabilitiesRequest) Reset()         { *m = GetCapabilitiesRequest{} }
-func (m *GetCapabilitiesRequest) String() string { return proto.CompactTextString(m) }
-func (*GetCapabilitiesRequest) ProtoMessage()    {}
-func (*GetCapabilitiesRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{31}
-}
-
-func (m *GetCapabilitiesRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetCapabilitiesRequest.Unmarshal(m, b)
-}
-func (m *GetCapabilitiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetCapabilitiesRequest.Marshal(b, m, deterministic)
-}
-func (m *GetCapabilitiesRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetCapabilitiesRequest.Merge(m, src)
-}
-func (m *GetCapabilitiesRequest) XXX_Size() int {
-	return xxx_messageInfo_GetCapabilitiesRequest.Size(m)
-}
-func (m *GetCapabilitiesRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetCapabilitiesRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetCapabilitiesRequest proto.InternalMessageInfo
-
-func (m *GetCapabilitiesRequest) GetInstanceName() string {
-	if m != nil {
-		return m.InstanceName
-	}
-	return ""
-}
-
-// A response message for
-// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
-type ServerCapabilities struct {
-	// Capabilities of the remote cache system.
-	CacheCapabilities *CacheCapabilities `protobuf:"bytes,1,opt,name=cache_capabilities,json=cacheCapabilities,proto3" json:"cache_capabilities,omitempty"`
-	// Capabilities of the remote execution system.
-	ExecutionCapabilities *ExecutionCapabilities `protobuf:"bytes,2,opt,name=execution_capabilities,json=executionCapabilities,proto3" json:"execution_capabilities,omitempty"`
-	// Earliest RE API version supported, including deprecated versions.
-	DeprecatedApiVersion *semver.SemVer `protobuf:"bytes,3,opt,name=deprecated_api_version,json=deprecatedApiVersion,proto3" json:"deprecated_api_version,omitempty"`
-	// Earliest non-deprecated RE API version supported.
-	LowApiVersion *semver.SemVer `protobuf:"bytes,4,opt,name=low_api_version,json=lowApiVersion,proto3" json:"low_api_version,omitempty"`
-	// Latest RE API version supported.
-	HighApiVersion       *semver.SemVer `protobuf:"bytes,5,opt,name=high_api_version,json=highApiVersion,proto3" json:"high_api_version,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *ServerCapabilities) Reset()         { *m = ServerCapabilities{} }
-func (m *ServerCapabilities) String() string { return proto.CompactTextString(m) }
-func (*ServerCapabilities) ProtoMessage()    {}
-func (*ServerCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{32}
-}
-
-func (m *ServerCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServerCapabilities.Unmarshal(m, b)
-}
-func (m *ServerCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServerCapabilities.Marshal(b, m, deterministic)
-}
-func (m *ServerCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServerCapabilities.Merge(m, src)
-}
-func (m *ServerCapabilities) XXX_Size() int {
-	return xxx_messageInfo_ServerCapabilities.Size(m)
-}
-func (m *ServerCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServerCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ServerCapabilities proto.InternalMessageInfo
-
-func (m *ServerCapabilities) GetCacheCapabilities() *CacheCapabilities {
-	if m != nil {
-		return m.CacheCapabilities
-	}
-	return nil
-}
-
-func (m *ServerCapabilities) GetExecutionCapabilities() *ExecutionCapabilities {
-	if m != nil {
-		return m.ExecutionCapabilities
-	}
-	return nil
-}
-
-func (m *ServerCapabilities) GetDeprecatedApiVersion() *semver.SemVer {
-	if m != nil {
-		return m.DeprecatedApiVersion
-	}
-	return nil
-}
-
-func (m *ServerCapabilities) GetLowApiVersion() *semver.SemVer {
-	if m != nil {
-		return m.LowApiVersion
-	}
-	return nil
-}
-
-func (m *ServerCapabilities) GetHighApiVersion() *semver.SemVer {
-	if m != nil {
-		return m.HighApiVersion
-	}
-	return nil
-}
-
-// Describes the server/instance capabilities for updating the action cache.
-type ActionCacheUpdateCapabilities struct {
-	UpdateEnabled        bool     `protobuf:"varint,1,opt,name=update_enabled,json=updateEnabled,proto3" json:"update_enabled,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ActionCacheUpdateCapabilities) Reset()         { *m = ActionCacheUpdateCapabilities{} }
-func (m *ActionCacheUpdateCapabilities) String() string { return proto.CompactTextString(m) }
-func (*ActionCacheUpdateCapabilities) ProtoMessage()    {}
-func (*ActionCacheUpdateCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{33}
-}
-
-func (m *ActionCacheUpdateCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ActionCacheUpdateCapabilities.Unmarshal(m, b)
-}
-func (m *ActionCacheUpdateCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ActionCacheUpdateCapabilities.Marshal(b, m, deterministic)
-}
-func (m *ActionCacheUpdateCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ActionCacheUpdateCapabilities.Merge(m, src)
-}
-func (m *ActionCacheUpdateCapabilities) XXX_Size() int {
-	return xxx_messageInfo_ActionCacheUpdateCapabilities.Size(m)
-}
-func (m *ActionCacheUpdateCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_ActionCacheUpdateCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ActionCacheUpdateCapabilities proto.InternalMessageInfo
-
-func (m *ActionCacheUpdateCapabilities) GetUpdateEnabled() bool {
-	if m != nil {
-		return m.UpdateEnabled
-	}
-	return false
-}
-
-// Allowed values for priority in
-// [ResultsCachePolicy][google.devtools.remoteexecution.v2.ResultsCachePolicy]
-// Used for querying both cache and execution valid priority ranges.
-type PriorityCapabilities struct {
-	Priorities           []*PriorityCapabilities_PriorityRange `protobuf:"bytes,1,rep,name=priorities,proto3" json:"priorities,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
-	XXX_unrecognized     []byte                                `json:"-"`
-	XXX_sizecache        int32                                 `json:"-"`
-}
-
-func (m *PriorityCapabilities) Reset()         { *m = PriorityCapabilities{} }
-func (m *PriorityCapabilities) String() string { return proto.CompactTextString(m) }
-func (*PriorityCapabilities) ProtoMessage()    {}
-func (*PriorityCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{34}
-}
-
-func (m *PriorityCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PriorityCapabilities.Unmarshal(m, b)
-}
-func (m *PriorityCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PriorityCapabilities.Marshal(b, m, deterministic)
-}
-func (m *PriorityCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PriorityCapabilities.Merge(m, src)
-}
-func (m *PriorityCapabilities) XXX_Size() int {
-	return xxx_messageInfo_PriorityCapabilities.Size(m)
-}
-func (m *PriorityCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_PriorityCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PriorityCapabilities proto.InternalMessageInfo
-
-func (m *PriorityCapabilities) GetPriorities() []*PriorityCapabilities_PriorityRange {
-	if m != nil {
-		return m.Priorities
-	}
-	return nil
-}
-
-// Supported range of priorities, including boundaries.
-type PriorityCapabilities_PriorityRange struct {
-	MinPriority          int32    `protobuf:"varint,1,opt,name=min_priority,json=minPriority,proto3" json:"min_priority,omitempty"`
-	MaxPriority          int32    `protobuf:"varint,2,opt,name=max_priority,json=maxPriority,proto3" json:"max_priority,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *PriorityCapabilities_PriorityRange) Reset()         { *m = PriorityCapabilities_PriorityRange{} }
-func (m *PriorityCapabilities_PriorityRange) String() string { return proto.CompactTextString(m) }
-func (*PriorityCapabilities_PriorityRange) ProtoMessage()    {}
-func (*PriorityCapabilities_PriorityRange) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{34, 0}
-}
-
-func (m *PriorityCapabilities_PriorityRange) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PriorityCapabilities_PriorityRange.Unmarshal(m, b)
-}
-func (m *PriorityCapabilities_PriorityRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PriorityCapabilities_PriorityRange.Marshal(b, m, deterministic)
-}
-func (m *PriorityCapabilities_PriorityRange) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PriorityCapabilities_PriorityRange.Merge(m, src)
-}
-func (m *PriorityCapabilities_PriorityRange) XXX_Size() int {
-	return xxx_messageInfo_PriorityCapabilities_PriorityRange.Size(m)
-}
-func (m *PriorityCapabilities_PriorityRange) XXX_DiscardUnknown() {
-	xxx_messageInfo_PriorityCapabilities_PriorityRange.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PriorityCapabilities_PriorityRange proto.InternalMessageInfo
-
-func (m *PriorityCapabilities_PriorityRange) GetMinPriority() int32 {
-	if m != nil {
-		return m.MinPriority
-	}
-	return 0
-}
-
-func (m *PriorityCapabilities_PriorityRange) GetMaxPriority() int32 {
-	if m != nil {
-		return m.MaxPriority
-	}
-	return 0
-}
-
-// Capabilities of the remote cache system.
-type CacheCapabilities struct {
-	// All the digest functions supported by the remote cache.
-	// Remote cache may support multiple digest functions simultaneously.
-	DigestFunction []DigestFunction `protobuf:"varint,1,rep,packed,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction" json:"digest_function,omitempty"`
-	// Capabilities for updating the action cache.
-	ActionCacheUpdateCapabilities *ActionCacheUpdateCapabilities `protobuf:"bytes,2,opt,name=action_cache_update_capabilities,json=actionCacheUpdateCapabilities,proto3" json:"action_cache_update_capabilities,omitempty"`
-	// Supported cache priority range for both CAS and ActionCache.
-	CachePriorityCapabilities *PriorityCapabilities `protobuf:"bytes,3,opt,name=cache_priority_capabilities,json=cachePriorityCapabilities,proto3" json:"cache_priority_capabilities,omitempty"`
-	// Maximum total size of blobs to be uploaded/downloaded using
-	// batch methods. A value of 0 means no limit is set, although
-	// in practice there will always be a message size limitation
-	// of the protocol in use, e.g. GRPC.
-	MaxBatchTotalSizeBytes int64 `protobuf:"varint,4,opt,name=max_batch_total_size_bytes,json=maxBatchTotalSizeBytes,proto3" json:"max_batch_total_size_bytes,omitempty"`
-	// Whether absolute symlink targets are supported.
-	SymlinkAbsolutePathStrategy CacheCapabilities_SymlinkAbsolutePathStrategy `protobuf:"varint,5,opt,name=symlink_absolute_path_strategy,json=symlinkAbsolutePathStrategy,proto3,enum=build.bazel.remote.execution.v2.CacheCapabilities_SymlinkAbsolutePathStrategy" json:"symlink_absolute_path_strategy,omitempty"`
-	XXX_NoUnkeyedLiteral        struct{}                                      `json:"-"`
-	XXX_unrecognized            []byte                                        `json:"-"`
-	XXX_sizecache               int32                                         `json:"-"`
-}
-
-func (m *CacheCapabilities) Reset()         { *m = CacheCapabilities{} }
-func (m *CacheCapabilities) String() string { return proto.CompactTextString(m) }
-func (*CacheCapabilities) ProtoMessage()    {}
-func (*CacheCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{35}
-}
-
-func (m *CacheCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CacheCapabilities.Unmarshal(m, b)
-}
-func (m *CacheCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CacheCapabilities.Marshal(b, m, deterministic)
-}
-func (m *CacheCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CacheCapabilities.Merge(m, src)
-}
-func (m *CacheCapabilities) XXX_Size() int {
-	return xxx_messageInfo_CacheCapabilities.Size(m)
-}
-func (m *CacheCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_CacheCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_CacheCapabilities proto.InternalMessageInfo
-
-func (m *CacheCapabilities) GetDigestFunction() []DigestFunction {
-	if m != nil {
-		return m.DigestFunction
-	}
-	return nil
-}
-
-func (m *CacheCapabilities) GetActionCacheUpdateCapabilities() *ActionCacheUpdateCapabilities {
-	if m != nil {
-		return m.ActionCacheUpdateCapabilities
-	}
-	return nil
-}
-
-func (m *CacheCapabilities) GetCachePriorityCapabilities() *PriorityCapabilities {
-	if m != nil {
-		return m.CachePriorityCapabilities
-	}
-	return nil
-}
-
-func (m *CacheCapabilities) GetMaxBatchTotalSizeBytes() int64 {
-	if m != nil {
-		return m.MaxBatchTotalSizeBytes
-	}
-	return 0
-}
-
-func (m *CacheCapabilities) GetSymlinkAbsolutePathStrategy() CacheCapabilities_SymlinkAbsolutePathStrategy {
-	if m != nil {
-		return m.SymlinkAbsolutePathStrategy
-	}
-	return CacheCapabilities_UNKNOWN
-}
-
-// Capabilities of the remote execution system.
-type ExecutionCapabilities struct {
-	// Remote execution may only support a single digest function.
-	DigestFunction DigestFunction `protobuf:"varint,1,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction" json:"digest_function,omitempty"`
-	// Whether remote execution is enabled for the particular server/instance.
-	ExecEnabled bool `protobuf:"varint,2,opt,name=exec_enabled,json=execEnabled,proto3" json:"exec_enabled,omitempty"`
-	// Supported execution priority range.
-	ExecutionPriorityCapabilities *PriorityCapabilities `protobuf:"bytes,3,opt,name=execution_priority_capabilities,json=executionPriorityCapabilities,proto3" json:"execution_priority_capabilities,omitempty"`
-	XXX_NoUnkeyedLiteral          struct{}              `json:"-"`
-	XXX_unrecognized              []byte                `json:"-"`
-	XXX_sizecache                 int32                 `json:"-"`
-}
-
-func (m *ExecutionCapabilities) Reset()         { *m = ExecutionCapabilities{} }
-func (m *ExecutionCapabilities) String() string { return proto.CompactTextString(m) }
-func (*ExecutionCapabilities) ProtoMessage()    {}
-func (*ExecutionCapabilities) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{36}
-}
-
-func (m *ExecutionCapabilities) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ExecutionCapabilities.Unmarshal(m, b)
-}
-func (m *ExecutionCapabilities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ExecutionCapabilities.Marshal(b, m, deterministic)
-}
-func (m *ExecutionCapabilities) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExecutionCapabilities.Merge(m, src)
-}
-func (m *ExecutionCapabilities) XXX_Size() int {
-	return xxx_messageInfo_ExecutionCapabilities.Size(m)
-}
-func (m *ExecutionCapabilities) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExecutionCapabilities.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExecutionCapabilities proto.InternalMessageInfo
-
-func (m *ExecutionCapabilities) GetDigestFunction() DigestFunction {
-	if m != nil {
-		return m.DigestFunction
-	}
-	return DigestFunction_UNKNOWN
-}
-
-func (m *ExecutionCapabilities) GetExecEnabled() bool {
-	if m != nil {
-		return m.ExecEnabled
-	}
-	return false
-}
-
-func (m *ExecutionCapabilities) GetExecutionPriorityCapabilities() *PriorityCapabilities {
-	if m != nil {
-		return m.ExecutionPriorityCapabilities
-	}
-	return nil
-}
-
-// Details for the tool used to call the API.
-type ToolDetails struct {
-	// Name of the tool, e.g. bazel.
-	ToolName string `protobuf:"bytes,1,opt,name=tool_name,json=toolName,proto3" json:"tool_name,omitempty"`
-	// Version of the tool used for the request, e.g. 5.0.3.
-	ToolVersion          string   `protobuf:"bytes,2,opt,name=tool_version,json=toolVersion,proto3" json:"tool_version,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *ToolDetails) Reset()         { *m = ToolDetails{} }
-func (m *ToolDetails) String() string { return proto.CompactTextString(m) }
-func (*ToolDetails) ProtoMessage()    {}
-func (*ToolDetails) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{37}
-}
-
-func (m *ToolDetails) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ToolDetails.Unmarshal(m, b)
-}
-func (m *ToolDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ToolDetails.Marshal(b, m, deterministic)
-}
-func (m *ToolDetails) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ToolDetails.Merge(m, src)
-}
-func (m *ToolDetails) XXX_Size() int {
-	return xxx_messageInfo_ToolDetails.Size(m)
-}
-func (m *ToolDetails) XXX_DiscardUnknown() {
-	xxx_messageInfo_ToolDetails.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ToolDetails proto.InternalMessageInfo
-
-func (m *ToolDetails) GetToolName() string {
-	if m != nil {
-		return m.ToolName
-	}
-	return ""
-}
-
-func (m *ToolDetails) GetToolVersion() string {
-	if m != nil {
-		return m.ToolVersion
-	}
-	return ""
-}
-
-// An optional Metadata to attach to any RPC request to tell the server about an
-// external context of the request. The server may use this for logging or other
-// purposes. To use it, the client attaches the header to the call using the
-// canonical proto serialization:
-//
-// * name: `build.bazel.remote.execution.v2.requestmetadata-bin`
-// * contents: the base64 encoded binary `RequestMetadata` message.
-type RequestMetadata struct {
-	// The details for the tool invoking the requests.
-	ToolDetails *ToolDetails `protobuf:"bytes,1,opt,name=tool_details,json=toolDetails,proto3" json:"tool_details,omitempty"`
-	// An identifier that ties multiple requests to the same action.
-	// For example, multiple requests to the CAS, Action Cache, and Execution
-	// API are used in order to compile foo.cc.
-	ActionId string `protobuf:"bytes,2,opt,name=action_id,json=actionId,proto3" json:"action_id,omitempty"`
-	// An identifier that ties multiple actions together to a final result.
-	// For example, multiple actions are required to build and run foo_test.
-	ToolInvocationId string `protobuf:"bytes,3,opt,name=tool_invocation_id,json=toolInvocationId,proto3" json:"tool_invocation_id,omitempty"`
-	// An identifier to tie multiple tool invocations together. For example,
-	// runs of foo_test, bar_test and baz_test on a post-submit of a given patch.
-	CorrelatedInvocationsId string   `protobuf:"bytes,4,opt,name=correlated_invocations_id,json=correlatedInvocationsId,proto3" json:"correlated_invocations_id,omitempty"`
-	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
-	XXX_unrecognized        []byte   `json:"-"`
-	XXX_sizecache           int32    `json:"-"`
-}
-
-func (m *RequestMetadata) Reset()         { *m = RequestMetadata{} }
-func (m *RequestMetadata) String() string { return proto.CompactTextString(m) }
-func (*RequestMetadata) ProtoMessage()    {}
-func (*RequestMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c43847ba40caac95, []int{38}
-}
-
-func (m *RequestMetadata) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RequestMetadata.Unmarshal(m, b)
-}
-func (m *RequestMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RequestMetadata.Marshal(b, m, deterministic)
-}
-func (m *RequestMetadata) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RequestMetadata.Merge(m, src)
-}
-func (m *RequestMetadata) XXX_Size() int {
-	return xxx_messageInfo_RequestMetadata.Size(m)
-}
-func (m *RequestMetadata) XXX_DiscardUnknown() {
-	xxx_messageInfo_RequestMetadata.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RequestMetadata proto.InternalMessageInfo
-
-func (m *RequestMetadata) GetToolDetails() *ToolDetails {
-	if m != nil {
-		return m.ToolDetails
-	}
-	return nil
-}
-
-func (m *RequestMetadata) GetActionId() string {
-	if m != nil {
-		return m.ActionId
-	}
-	return ""
-}
-
-func (m *RequestMetadata) GetToolInvocationId() string {
-	if m != nil {
-		return m.ToolInvocationId
-	}
-	return ""
-}
-
-func (m *RequestMetadata) GetCorrelatedInvocationsId() string {
-	if m != nil {
-		return m.CorrelatedInvocationsId
-	}
-	return ""
-}
-
-func init() {
-	proto.RegisterEnum("build.bazel.remote.execution.v2.DigestFunction", DigestFunction_name, DigestFunction_value)
-	proto.RegisterEnum("build.bazel.remote.execution.v2.ExecuteOperationMetadata_Stage", ExecuteOperationMetadata_Stage_name, ExecuteOperationMetadata_Stage_value)
-	proto.RegisterEnum("build.bazel.remote.execution.v2.CacheCapabilities_SymlinkAbsolutePathStrategy", CacheCapabilities_SymlinkAbsolutePathStrategy_name, CacheCapabilities_SymlinkAbsolutePathStrategy_value)
-	proto.RegisterType((*Action)(nil), "build.bazel.remote.execution.v2.Action")
-	proto.RegisterType((*Command)(nil), "build.bazel.remote.execution.v2.Command")
-	proto.RegisterType((*Command_EnvironmentVariable)(nil), "build.bazel.remote.execution.v2.Command.EnvironmentVariable")
-	proto.RegisterType((*Platform)(nil), "build.bazel.remote.execution.v2.Platform")
-	proto.RegisterType((*Platform_Property)(nil), "build.bazel.remote.execution.v2.Platform.Property")
-	proto.RegisterType((*Directory)(nil), "build.bazel.remote.execution.v2.Directory")
-	proto.RegisterType((*FileNode)(nil), "build.bazel.remote.execution.v2.FileNode")
-	proto.RegisterType((*DirectoryNode)(nil), "build.bazel.remote.execution.v2.DirectoryNode")
-	proto.RegisterType((*SymlinkNode)(nil), "build.bazel.remote.execution.v2.SymlinkNode")
-	proto.RegisterType((*Digest)(nil), "build.bazel.remote.execution.v2.Digest")
-	proto.RegisterType((*ExecutedActionMetadata)(nil), "build.bazel.remote.execution.v2.ExecutedActionMetadata")
-	proto.RegisterType((*ActionResult)(nil), "build.bazel.remote.execution.v2.ActionResult")
-	proto.RegisterType((*OutputFile)(nil), "build.bazel.remote.execution.v2.OutputFile")
-	proto.RegisterType((*Tree)(nil), "build.bazel.remote.execution.v2.Tree")
-	proto.RegisterType((*OutputDirectory)(nil), "build.bazel.remote.execution.v2.OutputDirectory")
-	proto.RegisterType((*OutputSymlink)(nil), "build.bazel.remote.execution.v2.OutputSymlink")
-	proto.RegisterType((*ExecutionPolicy)(nil), "build.bazel.remote.execution.v2.ExecutionPolicy")
-	proto.RegisterType((*ResultsCachePolicy)(nil), "build.bazel.remote.execution.v2.ResultsCachePolicy")
-	proto.RegisterType((*ExecuteRequest)(nil), "build.bazel.remote.execution.v2.ExecuteRequest")
-	proto.RegisterType((*LogFile)(nil), "build.bazel.remote.execution.v2.LogFile")
-	proto.RegisterType((*ExecuteResponse)(nil), "build.bazel.remote.execution.v2.ExecuteResponse")
-	proto.RegisterMapType((map[string]*LogFile)(nil), "build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry")
-	proto.RegisterType((*ExecuteOperationMetadata)(nil), "build.bazel.remote.execution.v2.ExecuteOperationMetadata")
-	proto.RegisterType((*WaitExecutionRequest)(nil), "build.bazel.remote.execution.v2.WaitExecutionRequest")
-	proto.RegisterType((*GetActionResultRequest)(nil), "build.bazel.remote.execution.v2.GetActionResultRequest")
-	proto.RegisterType((*UpdateActionResultRequest)(nil), "build.bazel.remote.execution.v2.UpdateActionResultRequest")
-	proto.RegisterType((*FindMissingBlobsRequest)(nil), "build.bazel.remote.execution.v2.FindMissingBlobsRequest")
-	proto.RegisterType((*FindMissingBlobsResponse)(nil), "build.bazel.remote.execution.v2.FindMissingBlobsResponse")
-	proto.RegisterType((*BatchUpdateBlobsRequest)(nil), "build.bazel.remote.execution.v2.BatchUpdateBlobsRequest")
-	proto.RegisterType((*BatchUpdateBlobsRequest_Request)(nil), "build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request")
-	proto.RegisterType((*BatchUpdateBlobsResponse)(nil), "build.bazel.remote.execution.v2.BatchUpdateBlobsResponse")
-	proto.RegisterType((*BatchUpdateBlobsResponse_Response)(nil), "build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response")
-	proto.RegisterType((*BatchReadBlobsRequest)(nil), "build.bazel.remote.execution.v2.BatchReadBlobsRequest")
-	proto.RegisterType((*BatchReadBlobsResponse)(nil), "build.bazel.remote.execution.v2.BatchReadBlobsResponse")
-	proto.RegisterType((*BatchReadBlobsResponse_Response)(nil), "build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response")
-	proto.RegisterType((*GetTreeRequest)(nil), "build.bazel.remote.execution.v2.GetTreeRequest")
-	proto.RegisterType((*GetTreeResponse)(nil), "build.bazel.remote.execution.v2.GetTreeResponse")
-	proto.RegisterType((*GetCapabilitiesRequest)(nil), "build.bazel.remote.execution.v2.GetCapabilitiesRequest")
-	proto.RegisterType((*ServerCapabilities)(nil), "build.bazel.remote.execution.v2.ServerCapabilities")
-	proto.RegisterType((*ActionCacheUpdateCapabilities)(nil), "build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities")
-	proto.RegisterType((*PriorityCapabilities)(nil), "build.bazel.remote.execution.v2.PriorityCapabilities")
-	proto.RegisterType((*PriorityCapabilities_PriorityRange)(nil), "build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange")
-	proto.RegisterType((*CacheCapabilities)(nil), "build.bazel.remote.execution.v2.CacheCapabilities")
-	proto.RegisterType((*ExecutionCapabilities)(nil), "build.bazel.remote.execution.v2.ExecutionCapabilities")
-	proto.RegisterType((*ToolDetails)(nil), "build.bazel.remote.execution.v2.ToolDetails")
-	proto.RegisterType((*RequestMetadata)(nil), "build.bazel.remote.execution.v2.RequestMetadata")
-}
-
-func init() {
-	proto.RegisterFile("build/bazel/remote/execution/v2/remote_execution.proto", fileDescriptor_c43847ba40caac95)
-}
-
-var fileDescriptor_c43847ba40caac95 = []byte{
-	// 3076 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0x4d, 0x70, 0x5b, 0x57,
-	0xf5, 0xff, 0x3f, 0x49, 0x96, 0xa5, 0x23, 0xdb, 0x52, 0xee, 0xdf, 0x71, 0x1c, 0xb9, 0x69, 0x92,
-	0xd7, 0x69, 0x31, 0x4e, 0x23, 0xa5, 0x0a, 0x4d, 0x5b, 0xf7, 0x23, 0xf8, 0x43, 0x89, 0x93, 0x3a,
-	0xb6, 0x79, 0xb2, 0xd3, 0x14, 0x4a, 0x5f, 0xaf, 0xf4, 0xae, 0xe5, 0x87, 0xa5, 0xf7, 0x94, 0xf7,
-	0xae, 0xec, 0x38, 0x9d, 0x0c, 0x33, 0xcc, 0x40, 0x87, 0x96, 0x29, 0x8b, 0xb2, 0x82, 0x15, 0x2c,
-	0x19, 0x96, 0x6c, 0x18, 0x60, 0xc3, 0x0a, 0xb6, 0x30, 0x03, 0x4b, 0x36, 0x2c, 0x60, 0xa6, 0x2b,
-	0x66, 0xd8, 0xb1, 0x60, 0xee, 0xc7, 0xfb, 0x92, 0xe4, 0x3c, 0xc9, 0x49, 0x19, 0x56, 0x7a, 0xef,
-	0xdc, 0x7b, 0x7e, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, 0x09, 0xae, 0xd5, 0xbb, 0x66, 0xcb,
-	0x28, 0xd7, 0xf1, 0x43, 0xd2, 0x2a, 0x3b, 0xa4, 0x6d, 0x53, 0x52, 0x26, 0x0f, 0x48, 0xa3, 0x4b,
-	0x4d, 0xdb, 0x2a, 0x1f, 0x54, 0x24, 0x4d, 0xf7, 0x69, 0xa5, 0x8e, 0x63, 0x53, 0x1b, 0x9d, 0xe7,
-	0x7c, 0x25, 0xce, 0x57, 0x12, 0x73, 0x4a, 0xc1, 0x9c, 0x83, 0x4a, 0xf1, 0x7c, 0x18, 0xd8, 0x25,
-	0xed, 0x03, 0xe2, 0xc8, 0x1f, 0x81, 0x50, 0x7c, 0xa6, 0x69, 0xdb, 0xcd, 0x16, 0x29, 0xe3, 0x8e,
-	0x59, 0xc6, 0x96, 0x65, 0x53, 0xcc, 0x58, 0x5d, 0x39, 0xfa, 0x9c, 0x1c, 0x6d, 0xd9, 0x56, 0xd3,
-	0xe9, 0x5a, 0x96, 0x69, 0x35, 0xcb, 0x76, 0x87, 0x38, 0x91, 0x49, 0xcf, 0xca, 0x49, 0xfc, 0xad,
-	0xde, 0xdd, 0x2d, 0x1b, 0x5d, 0x31, 0x41, 0x8e, 0x9f, 0xef, 0x1d, 0xa7, 0x66, 0x9b, 0xb8, 0x14,
-	0xb7, 0x3b, 0x72, 0xc2, 0x19, 0x39, 0xc1, 0xe9, 0x34, 0xca, 0x2e, 0xc5, 0xb4, 0x2b, 0x91, 0xd5,
-	0x8f, 0x13, 0x90, 0x5e, 0x6a, 0x30, 0x28, 0xb4, 0x01, 0x53, 0x0d, 0xbb, 0xdd, 0xc6, 0x96, 0xa1,
-	0x1b, 0x66, 0x93, 0xb8, 0x74, 0x56, 0xb9, 0xa0, 0xcc, 0xe7, 0x2a, 0x5f, 0x2a, 0xc5, 0x98, 0xa0,
-	0xb4, 0xca, 0xa7, 0x6b, 0x93, 0x92, 0x5d, 0xbc, 0xa2, 0x1a, 0x9c, 0x32, 0xad, 0x4e, 0x97, 0xea,
-	0x8e, 0x6d, 0x53, 0x0f, 0x32, 0x31, 0x1a, 0x64, 0x9e, 0x23, 0x68, 0xb6, 0x4d, 0x25, 0xe8, 0x55,
-	0x18, 0x67, 0x6b, 0xb3, 0xbb, 0x74, 0x36, 0xcd, 0xa1, 0xce, 0x96, 0xc4, 0xd2, 0x4a, 0xde, 0xda,
-	0x4b, 0xab, 0xd2, 0x36, 0x9a, 0x37, 0x13, 0x5d, 0x80, 0x09, 0xc3, 0xd6, 0x2d, 0x9b, 0xea, 0x0d,
-	0xdc, 0xd8, 0x23, 0xb3, 0xe3, 0x17, 0x94, 0xf9, 0x8c, 0x06, 0x86, 0xbd, 0x61, 0xd3, 0x15, 0x46,
-	0xb9, 0x9d, 0xca, 0x24, 0x0b, 0x69, 0xf5, 0xa7, 0x49, 0x18, 0x5f, 0x11, 0x6b, 0x40, 0xcf, 0x40,
-	0x16, 0x3b, 0xcd, 0x6e, 0x9b, 0x58, 0xd4, 0x9d, 0x55, 0x2e, 0x24, 0xe7, 0xb3, 0x5a, 0x40, 0x40,
-	0xf7, 0xe1, 0x34, 0xb1, 0x0e, 0x4c, 0xc7, 0xb6, 0xd8, 0xbb, 0x7e, 0x80, 0x1d, 0x13, 0xd7, 0x5b,
-	0xc4, 0x9d, 0x4d, 0x5c, 0x48, 0xce, 0xe7, 0x2a, 0x6f, 0xc4, 0xae, 0x4f, 0x8a, 0x29, 0x55, 0x03,
-	0x94, 0xbb, 0x12, 0x44, 0x9b, 0x26, 0xfd, 0x44, 0x17, 0x5d, 0x84, 0x09, 0xbb, 0x4b, 0x99, 0x3d,
-	0x77, 0x4d, 0x26, 0x29, 0xc9, 0x75, 0xca, 0x09, 0xda, 0x0d, 0x46, 0x42, 0x97, 0x01, 0xc9, 0x29,
-	0x86, 0xe9, 0x90, 0x06, 0xb5, 0x1d, 0x93, 0xb8, 0xb3, 0x29, 0x3e, 0xf1, 0x94, 0x18, 0x59, 0x0d,
-	0x06, 0x50, 0x15, 0x32, 0x9d, 0x16, 0xa6, 0xbb, 0xb6, 0xd3, 0x9e, 0x1d, 0xe3, 0xc6, 0xfc, 0x72,
-	0xac, 0xde, 0x5b, 0x92, 0x41, 0xf3, 0x59, 0xd1, 0x25, 0x38, 0x75, 0x68, 0x3b, 0xfb, 0xa6, 0xd5,
-	0xf4, 0xc5, 0x1e, 0xf1, 0xcd, 0xc9, 0x6a, 0x05, 0x39, 0xe0, 0x49, 0x3d, 0x2a, 0x5e, 0x87, 0xff,
-	0x1f, 0xb0, 0x64, 0x84, 0x20, 0x65, 0xe1, 0x36, 0xe1, 0x1e, 0x97, 0xd5, 0xf8, 0x33, 0x9a, 0x86,
-	0xb1, 0x03, 0xdc, 0xea, 0x12, 0xee, 0x33, 0x59, 0x4d, 0xbc, 0xa8, 0x3f, 0x52, 0x20, 0xe3, 0x29,
-	0x81, 0x34, 0x80, 0x8e, 0xc3, 0xa2, 0x85, 0xb2, 0x85, 0x2a, 0xdc, 0xf6, 0x95, 0xa1, 0xd7, 0x50,
-	0xda, 0x12, 0xbc, 0x47, 0x5a, 0x08, 0xa5, 0xf8, 0x15, 0xc8, 0x78, 0xf4, 0x11, 0xd4, 0xfa, 0xbb,
-	0x02, 0x59, 0x7f, 0x95, 0xe8, 0x3a, 0x8c, 0x89, 0x4d, 0x12, 0x2a, 0xc5, 0x9b, 0x95, 0xed, 0xdf,
-	0x86, 0x6d, 0x10, 0x4d, 0xf0, 0xa1, 0x2d, 0xc8, 0x85, 0xb7, 0x50, 0x78, 0x55, 0x69, 0x88, 0xa8,
-	0x91, 0x1a, 0x70, 0xac, 0x30, 0x04, 0x5a, 0x83, 0x8c, 0x7b, 0xd4, 0x6e, 0x99, 0xd6, 0xbe, 0x70,
-	0x9d, 0x5c, 0xe5, 0xc5, 0x58, 0xb8, 0x9a, 0x60, 0xe0, 0x60, 0x3e, 0xb7, 0xfa, 0xb1, 0x02, 0x19,
-	0x4f, 0xdf, 0x81, 0x16, 0xba, 0x0e, 0xe9, 0x93, 0x45, 0xbb, 0x64, 0x43, 0xcf, 0xc1, 0xa4, 0xe9,
-	0xca, 0x4c, 0xcc, 0xdc, 0x63, 0x36, 0xc5, 0x03, 0x76, 0xc2, 0x74, 0xab, 0x3e, 0x8d, 0x87, 0x6c,
-	0x4a, 0x35, 0x60, 0x32, 0xb2, 0xe8, 0x2f, 0x44, 0x21, 0xf5, 0x35, 0xc8, 0x85, 0x6c, 0x31, 0x50,
-	0xc6, 0x0c, 0xa4, 0x29, 0x76, 0x9a, 0x84, 0x4a, 0xbf, 0x90, 0x6f, 0xea, 0xeb, 0x90, 0x96, 0xa9,
-	0x0b, 0x41, 0x6a, 0x0f, 0xbb, 0x7b, 0x1e, 0x17, 0x7b, 0x46, 0xe7, 0x00, 0x5c, 0xf3, 0x21, 0xd1,
-	0xeb, 0x47, 0x94, 0x6f, 0xb3, 0x32, 0x9f, 0xd4, 0xb2, 0x8c, 0xb2, 0xcc, 0x08, 0xea, 0x5f, 0xd3,
-	0x30, 0x23, 0x96, 0x4c, 0x0c, 0x91, 0xa5, 0xef, 0x10, 0x8a, 0x0d, 0x4c, 0x31, 0x93, 0xc7, 0x82,
-	0x8b, 0x38, 0x12, 0x4f, 0xbe, 0xa1, 0x2a, 0x14, 0xee, 0x77, 0x49, 0x97, 0x18, 0xba, 0x5f, 0x03,
-	0xe4, 0xaa, 0x8b, 0x7d, 0x99, 0x72, 0xdb, 0x9b, 0xa1, 0xe5, 0x05, 0x8f, 0x4f, 0x40, 0x5b, 0x30,
-	0x23, 0x00, 0x75, 0x97, 0x62, 0x87, 0x86, 0xc0, 0x92, 0xb1, 0x60, 0xd3, 0x82, 0xb3, 0xc6, 0x18,
-	0x03, 0xc4, 0x7b, 0x50, 0x94, 0x88, 0x0d, 0xbb, 0xdd, 0x69, 0x11, 0x1a, 0x51, 0x31, 0x15, 0x8b,
-	0x3a, 0x2b, 0xb8, 0x57, 0x3c, 0xe6, 0x00, 0xf9, 0x5d, 0x98, 0x13, 0x85, 0x66, 0x97, 0xd0, 0xc6,
-	0x5e, 0x9f, 0xc2, 0x63, 0xf1, 0xd0, 0x9c, 0xfd, 0x06, 0xe3, 0xee, 0x51, 0x1a, 0xc3, 0xf9, 0x30,
-	0xf4, 0x20, 0xcd, 0xd3, 0xb1, 0xf0, 0xcf, 0x04, 0xf0, 0x03, 0xb4, 0xbf, 0x0b, 0x67, 0x7d, 0xd7,
-	0xeb, 0xd3, 0x7d, 0x3c, 0x16, 0xfc, 0x8c, 0xcf, 0xdc, 0xa3, 0xfa, 0xfb, 0x70, 0x2e, 0xc0, 0x1d,
-	0xa4, 0x78, 0x26, 0x16, 0x7b, 0xce, 0x07, 0x18, 0xa0, 0xf7, 0x37, 0xe1, 0x9c, 0x2c, 0x36, 0xdd,
-	0x4e, 0xcb, 0xc6, 0x46, 0x9f, 0xee, 0xd9, 0x58, 0xfc, 0xa2, 0x00, 0xd8, 0xe1, 0xfc, 0x3d, 0xea,
-	0x13, 0xb8, 0x18, 0x85, 0x1f, 0xb4, 0x04, 0x88, 0x15, 0xf1, 0x6c, 0x58, 0x44, 0xff, 0x2a, 0xd4,
-	0x7f, 0x8e, 0xc1, 0x84, 0x88, 0x2c, 0x8d, 0xb8, 0xdd, 0x16, 0x45, 0x1b, 0x3d, 0x65, 0x56, 0xa4,
-	0xde, 0x4b, 0xb1, 0x19, 0x63, 0xd3, 0xaf, 0xc3, 0xd1, 0x9a, 0xfc, 0x01, 0x4c, 0x87, 0xf0, 0x74,
-	0x3f, 0x07, 0xc3, 0x90, 0x29, 0x5d, 0xe0, 0xca, 0xec, 0xa3, 0xa1, 0x00, 0x5a, 0x92, 0x5c, 0xa4,
-	0x0f, 0xac, 0xfa, 0x22, 0xc7, 0x5f, 0x19, 0x12, 0xdf, 0xcf, 0xa1, 0x83, 0xce, 0x09, 0xdf, 0x82,
-	0xb3, 0x3d, 0x02, 0x8e, 0x82, 0x75, 0xe4, 0x4e, 0xb4, 0x8e, 0x33, 0x51, 0x29, 0x47, 0xfe, 0x62,
-	0xe6, 0x20, 0x4b, 0x1e, 0x98, 0x54, 0x6f, 0xd8, 0x86, 0x48, 0xfb, 0x63, 0x5a, 0x86, 0x11, 0x56,
-	0x58, 0xde, 0x65, 0xd9, 0x92, 0x1a, 0x36, 0x3b, 0x52, 0xe2, 0x43, 0x1e, 0xd7, 0x13, 0x5a, 0x56,
-	0x50, 0x34, 0x7c, 0x88, 0xd6, 0x61, 0x52, 0x0e, 0xcb, 0x6c, 0x9f, 0x1e, 0x2d, 0xdb, 0x4f, 0x08,
-	0x6e, 0x99, 0xae, 0x85, 0x30, 0xe2, 0x38, 0x5c, 0xd8, 0xb8, 0x2f, 0x8c, 0x38, 0x4e, 0x20, 0x8c,
-	0x0d, 0x4b, 0x61, 0x99, 0xd1, 0x85, 0x11, 0xc7, 0x91, 0xc2, 0x76, 0x01, 0x05, 0xc1, 0xda, 0x96,
-	0x39, 0x5e, 0x46, 0xd0, 0x2b, 0xb1, 0x90, 0x83, 0x4b, 0x84, 0x76, 0xca, 0x9f, 0xe4, 0x91, 0x6e,
-	0xa7, 0x32, 0x4a, 0x21, 0xa1, 0xfe, 0x40, 0x01, 0x08, 0xfc, 0x95, 0x15, 0xa6, 0x0e, 0xa6, 0x7e,
-	0x61, 0x62, 0xcf, 0xff, 0xd5, 0x1a, 0xfe, 0xa9, 0x02, 0xa9, 0x6d, 0x87, 0x10, 0xf4, 0x16, 0xa4,
-	0x58, 0xaf, 0x20, 0xfb, 0x8e, 0x85, 0xe1, 0x8f, 0x3b, 0x1a, 0xe7, 0x43, 0x37, 0x20, 0xd3, 0xd8,
-	0x33, 0x5b, 0x86, 0x43, 0x2c, 0x19, 0xb7, 0xa3, 0x60, 0xf8, 0xbc, 0x6a, 0x17, 0xf2, 0x3d, 0x61,
-	0x31, 0xd0, 0x46, 0x6b, 0x90, 0xa3, 0x0e, 0x21, 0x9e, 0x03, 0x24, 0x47, 0x33, 0x14, 0x30, 0x5e,
-	0xf1, 0x7c, 0x3b, 0x95, 0x49, 0x14, 0x92, 0xea, 0xeb, 0x30, 0x19, 0x89, 0x92, 0x81, 0x42, 0x8f,
-	0x3b, 0x67, 0x5c, 0x86, 0x7c, 0xd5, 0x93, 0xb2, 0x65, 0xb7, 0xcc, 0xc6, 0x11, 0x2a, 0x42, 0xa6,
-	0xe3, 0x98, 0xb6, 0x63, 0xd2, 0x23, 0x0e, 0x31, 0xa6, 0xf9, 0xef, 0xea, 0x15, 0x40, 0x22, 0xe1,
-	0xb9, 0xbc, 0x01, 0x1a, 0x82, 0xe3, 0xbb, 0x49, 0x98, 0x92, 0x8e, 0xa6, 0x91, 0xfb, 0x5d, 0x6f,
-	0x8f, 0x2d, 0x97, 0x62, 0xab, 0x41, 0xf4, 0xd0, 0x81, 0x68, 0xc2, 0x23, 0x6e, 0xb0, 0x83, 0xd1,
-	0x02, 0x9c, 0x72, 0xf7, 0xcd, 0x8e, 0x68, 0xbd, 0xf4, 0x96, 0x6d, 0xef, 0x77, 0xc5, 0x21, 0x22,
-	0xa3, 0xe5, 0xd9, 0x00, 0x97, 0xbf, 0xce, 0xc9, 0x2c, 0xa8, 0x30, 0xf7, 0xe1, 0x93, 0x46, 0xb0,
-	0xe0, 0x96, 0x41, 0xf5, 0x0d, 0x28, 0x04, 0x41, 0xd5, 0xe1, 0x2b, 0x94, 0x05, 0xf5, 0xca, 0x90,
-	0x21, 0xe5, 0xdb, 0x52, 0xcb, 0x93, 0x1e, 0xe3, 0x12, 0x98, 0x76, 0x84, 0x01, 0xe5, 0xca, 0xa4,
-	0x00, 0x91, 0x06, 0xae, 0xc6, 0x0a, 0xe8, 0xb7, 0xbe, 0x86, 0x9c, 0x3e, 0x9a, 0xf0, 0x8c, 0xdb,
-	0xa9, 0x4c, 0xaa, 0x30, 0x76, 0x3b, 0x95, 0x19, 0x2b, 0xa4, 0xd5, 0xfb, 0x30, 0xbe, 0x6e, 0x37,
-	0x79, 0xe0, 0x06, 0x41, 0xaa, 0x9c, 0x2c, 0x48, 0x9f, 0x87, 0xa9, 0xbd, 0x6e, 0x1b, 0x5b, 0xba,
-	0x43, 0xb0, 0xc1, 0xa3, 0x34, 0xc1, 0x37, 0x66, 0x92, 0x53, 0x35, 0x49, 0x54, 0x7f, 0x98, 0xf4,
-	0x9c, 0x8b, 0x68, 0xc4, 0xed, 0xd8, 0x96, 0x4b, 0x50, 0x15, 0xd2, 0x42, 0x5d, 0x29, 0xfb, 0x72,
-	0xac, 0xec, 0x70, 0x99, 0xd5, 0x24, 0x33, 0x73, 0x21, 0x6e, 0x3e, 0x43, 0x97, 0x68, 0x42, 0x81,
-	0x09, 0x41, 0x94, 0x35, 0x79, 0x01, 0xd2, 0xe2, 0xd2, 0x42, 0xc6, 0x18, 0xf2, 0x0a, 0xbe, 0xd3,
-	0x69, 0x94, 0x6a, 0x7c, 0x44, 0x93, 0x33, 0x10, 0x86, 0x9c, 0x4b, 0x9c, 0x03, 0xe2, 0xe8, 0x2d,
-	0xbb, 0x29, 0x9a, 0xdf, 0x5c, 0xe5, 0xab, 0xc3, 0xa6, 0x50, 0x6f, 0x79, 0xa5, 0x1a, 0xc7, 0x58,
-	0xb7, 0x9b, 0x6e, 0xd5, 0xa2, 0xce, 0x91, 0x06, 0xae, 0x4f, 0x40, 0xb3, 0x30, 0xde, 0x26, 0xae,
-	0x8b, 0x9b, 0x84, 0xd7, 0xa0, 0xac, 0xe6, 0xbd, 0x16, 0x9b, 0x90, 0xef, 0x61, 0x44, 0x05, 0x48,
-	0xee, 0x93, 0x23, 0x19, 0x19, 0xec, 0x11, 0xbd, 0x15, 0x6e, 0x20, 0x73, 0x95, 0xf9, 0x58, 0xdd,
-	0xe4, 0x76, 0xcb, 0x56, 0x73, 0x31, 0xf1, 0xaa, 0xa2, 0x7e, 0x9e, 0x80, 0x59, 0xa9, 0xf2, 0xa6,
-	0x77, 0x59, 0xe4, 0xb7, 0x06, 0x3b, 0x30, 0xe6, 0x52, 0xa6, 0x1d, 0x13, 0x3a, 0x55, 0xb9, 0x3e,
-	0xec, 0xe2, 0xfb, 0x90, 0x98, 0x6d, 0x9b, 0x44, 0x13, 0x68, 0xfd, 0xc1, 0x99, 0x78, 0x92, 0xe0,
-	0x7c, 0x11, 0x90, 0x2c, 0xd6, 0x2e, 0x75, 0x08, 0x6e, 0x8b, 0x04, 0x92, 0x14, 0xd7, 0x06, 0x62,
-	0xa4, 0xc6, 0x07, 0x78, 0x12, 0x11, 0xb3, 0x59, 0xb5, 0x0d, 0xcf, 0x4e, 0xf9, 0xb3, 0x89, 0xe3,
-	0x04, 0xb3, 0xd5, 0x4d, 0x18, 0xe3, 0x9a, 0xa3, 0x1c, 0x8c, 0xef, 0x6c, 0xbc, 0xbd, 0xb1, 0xf9,
-	0xce, 0x46, 0xe1, 0xff, 0x50, 0x1e, 0x72, 0x2b, 0x4b, 0x2b, 0x6b, 0x55, 0x7d, 0x65, 0xad, 0xba,
-	0xf2, 0x76, 0x41, 0x41, 0x00, 0xe9, 0xaf, 0xed, 0x54, 0x77, 0xaa, 0xab, 0x85, 0x04, 0x9a, 0x84,
-	0x6c, 0xf5, 0x5e, 0x75, 0x65, 0x67, 0xfb, 0xd6, 0xc6, 0xcd, 0x42, 0x92, 0xbd, 0xae, 0x6c, 0xde,
-	0xd9, 0x5a, 0xaf, 0x6e, 0x57, 0x57, 0x0b, 0x29, 0x75, 0x01, 0xa6, 0xdf, 0xc1, 0x26, 0xf5, 0x93,
-	0x82, 0x97, 0x00, 0x07, 0x34, 0x82, 0xea, 0x27, 0x0a, 0xcc, 0xdc, 0x24, 0x34, 0xe2, 0xed, 0xa3,
-	0xe4, 0xcb, 0xa7, 0x6a, 0x66, 0xf5, 0x0f, 0x09, 0x38, 0xbb, 0xd3, 0x31, 0x30, 0x25, 0xff, 0x1b,
-	0x0a, 0x21, 0xcd, 0x47, 0x93, 0x01, 0x9f, 0x3c, 0x49, 0xfa, 0x90, 0x98, 0x32, 0x3f, 0x1c, 0x97,
-	0x8b, 0x53, 0x4f, 0x35, 0x17, 0xab, 0x1f, 0x2b, 0x70, 0xe6, 0x86, 0x69, 0x19, 0x77, 0x4c, 0xd7,
-	0x35, 0xad, 0xe6, 0x72, 0xcb, 0xae, 0xbb, 0x23, 0x59, 0xf2, 0x36, 0x4c, 0xd4, 0x5b, 0x76, 0x5d,
-	0xda, 0xd1, 0xeb, 0x2d, 0x86, 0x36, 0x64, 0x8e, 0x31, 0x8b, 0x67, 0x57, 0xed, 0xc2, 0x6c, 0xbf,
-	0x2e, 0x32, 0x37, 0xbf, 0x0b, 0xd3, 0x6d, 0x41, 0xd7, 0x9f, 0x44, 0x1e, 0x6a, 0x07, 0xe0, 0x9e,
-	0xd8, 0x7f, 0x2b, 0x70, 0x66, 0x19, 0xd3, 0xc6, 0x9e, 0x70, 0xaa, 0xd1, 0x6d, 0xf0, 0x1e, 0x64,
-	0x1c, 0x31, 0xdf, 0xd3, 0x27, 0x3e, 0x39, 0x1f, 0x23, 0xb0, 0x24, 0x7f, 0x35, 0x1f, 0xb1, 0xf8,
-	0x3e, 0x8c, 0x7b, 0xda, 0x3c, 0x71, 0x71, 0x44, 0x90, 0xe2, 0xa7, 0xf0, 0x04, 0x3f, 0xfa, 0xf3,
-	0x67, 0xf5, 0x5f, 0x0a, 0xcc, 0xf6, 0x6b, 0x23, 0xcd, 0xfe, 0x01, 0x64, 0x1d, 0xf9, 0xec, 0xdd,
-	0xfc, 0x2d, 0x9f, 0x60, 0x6d, 0xb2, 0x02, 0x79, 0x0f, 0x5a, 0x00, 0x5a, 0x3c, 0x84, 0x8c, 0x2f,
-	0xed, 0x89, 0xd7, 0x17, 0x54, 0xd5, 0x44, 0x5c, 0x55, 0x55, 0xbf, 0x0d, 0xa7, 0xb9, 0xa2, 0xec,
-	0x48, 0x30, 0xfa, 0x9e, 0x2f, 0xc1, 0xf8, 0x09, 0x5d, 0xd0, 0xe3, 0x53, 0xbf, 0x97, 0x80, 0x99,
-	0x5e, 0x0d, 0xa4, 0x21, 0xde, 0xef, 0x37, 0xfb, 0x90, 0x2e, 0xd5, 0x87, 0x35, 0xd0, 0xe8, 0x9f,
-	0x28, 0x4f, 0xd3, 0xea, 0x03, 0xbc, 0x6a, 0x94, 0xf3, 0x8d, 0xfa, 0x6b, 0x05, 0xa6, 0x6e, 0x12,
-	0xca, 0xfa, 0xa5, 0x91, 0xf6, 0x60, 0x0d, 0x72, 0x4f, 0xf0, 0x1d, 0x06, 0x9c, 0xe0, 0x13, 0xcc,
-	0x1c, 0x64, 0x3b, 0xb8, 0x49, 0x74, 0xd7, 0x7c, 0x28, 0x0a, 0x36, 0xeb, 0x12, 0x70, 0x93, 0xd4,
-	0xcc, 0x87, 0xbc, 0x45, 0xe7, 0x83, 0xd4, 0xde, 0x27, 0x96, 0x2c, 0xd0, 0x7c, 0xfa, 0x36, 0x23,
-	0xa8, 0x1f, 0x29, 0x90, 0xf7, 0xb5, 0x97, 0x26, 0x5d, 0x8f, 0xde, 0x75, 0x2b, 0x23, 0x37, 0x6e,
-	0x91, 0x7b, 0xee, 0x17, 0x20, 0x6f, 0x91, 0x07, 0x54, 0x0f, 0x69, 0x21, 0x1a, 0xa5, 0x49, 0x46,
-	0xde, 0xf2, 0x35, 0x79, 0x93, 0x57, 0xe9, 0x15, 0xdc, 0xc1, 0x75, 0xb3, 0x65, 0x52, 0x93, 0x8c,
-	0xe4, 0xd2, 0xea, 0xef, 0x92, 0x80, 0xc4, 0x51, 0x2f, 0x0c, 0x81, 0x30, 0x20, 0x51, 0x81, 0x1a,
-	0x21, 0xaa, 0x74, 0x95, 0xf8, 0x0f, 0x13, 0xbc, 0xd8, 0x44, 0x54, 0x3a, 0xd5, 0xe8, 0x25, 0xa1,
-	0x36, 0xcc, 0x84, 0xee, 0xf5, 0xc2, 0x62, 0xc4, 0x9e, 0x5e, 0x1b, 0xbe, 0xb7, 0x89, 0x88, 0x3a,
-	0x4d, 0x06, 0x91, 0xd1, 0x16, 0xcc, 0x18, 0xa4, 0xe3, 0x90, 0x06, 0xa6, 0xc4, 0xd0, 0x71, 0xc7,
-	0xd4, 0x0f, 0x88, 0xe3, 0x9a, 0xb6, 0xe5, 0x5f, 0x04, 0x87, 0xc5, 0xc9, 0x0f, 0x9f, 0x35, 0xd2,
-	0xbe, 0x4b, 0x1c, 0x6d, 0x3a, 0xe0, 0x5c, 0xea, 0x98, 0x77, 0x05, 0x1f, 0x5a, 0x86, 0x7c, 0xcb,
-	0x3e, 0x8c, 0x40, 0xa5, 0x62, 0xa1, 0x26, 0x5b, 0xf6, 0x61, 0x08, 0x63, 0x15, 0x0a, 0x7b, 0x66,
-	0x73, 0x2f, 0x02, 0x32, 0x16, 0x0b, 0x32, 0xc5, 0x78, 0x02, 0x14, 0xf5, 0x06, 0x9c, 0x13, 0xa7,
-	0x0a, 0x6e, 0x78, 0x91, 0x84, 0x23, 0x8b, 0x7f, 0x1e, 0xa6, 0xba, 0x9c, 0xaa, 0x13, 0x8b, 0x75,
-	0x42, 0x06, 0xdf, 0xca, 0x8c, 0x36, 0x29, 0xa8, 0x55, 0x41, 0x54, 0xff, 0xa8, 0xc0, 0xf4, 0x96,
-	0xec, 0x93, 0x23, 0xfc, 0x0d, 0x00, 0xd9, 0x3f, 0x07, 0x9e, 0xbd, 0x12, 0xff, 0x7d, 0x6a, 0x00,
-	0x94, 0x4f, 0xd4, 0xb0, 0xd5, 0x24, 0x5a, 0x08, 0xb6, 0xb8, 0x03, 0x93, 0x91, 0x41, 0x74, 0x11,
-	0x26, 0xda, 0xa6, 0xa5, 0xf7, 0x74, 0xf2, 0xb9, 0xb6, 0x69, 0x79, 0xf3, 0xf8, 0x14, 0xfc, 0x20,
-	0x98, 0x92, 0x90, 0x53, 0xf0, 0x03, 0x6f, 0x8a, 0xfa, 0xfd, 0x31, 0x38, 0xd5, 0xe7, 0x90, 0xe8,
-	0x1e, 0xe4, 0x45, 0x06, 0xd1, 0x77, 0xbb, 0x16, 0xb7, 0x1d, 0x5f, 0xd6, 0x54, 0xa5, 0x3c, 0x64,
-	0x2a, 0xb9, 0x21, 0xd9, 0xb4, 0x29, 0x23, 0xf2, 0x8e, 0x3e, 0x52, 0xe0, 0x82, 0x3c, 0x19, 0x8a,
-	0x10, 0x92, 0x96, 0x1f, 0xe0, 0xe2, 0x6f, 0x0d, 0x79, 0x58, 0x3c, 0x66, 0x5b, 0xb5, 0x73, 0xf8,
-	0xb1, 0xbb, 0xde, 0x85, 0x39, 0x79, 0x8c, 0x94, 0xb6, 0x88, 0xea, 0x20, 0xfc, 0xfe, 0xe5, 0x13,
-	0x6d, 0xa3, 0x76, 0x96, 0x23, 0x0f, 0x74, 0x96, 0x45, 0x28, 0xb2, 0x3d, 0xa9, 0xb3, 0xca, 0xa4,
-	0x53, 0x9b, 0xe2, 0x96, 0x1e, 0xfa, 0x36, 0x94, 0xe2, 0xdf, 0x86, 0x66, 0xda, 0xf8, 0x01, 0x2f,
-	0x5d, 0xdb, 0x6c, 0xbc, 0xe6, 0x7d, 0x28, 0x42, 0x9f, 0x29, 0xf0, 0xac, 0xbc, 0x92, 0xd5, 0x71,
-	0xdd, 0xb5, 0x5b, 0x5d, 0x4a, 0xf4, 0x0e, 0xa6, 0x7b, 0xac, 0x5f, 0xc2, 0x94, 0x34, 0x8f, 0x78,
-	0x78, 0x4c, 0x55, 0x36, 0x46, 0x4f, 0x42, 0xde, 0x67, 0xc0, 0x25, 0x89, 0xbb, 0x85, 0xe9, 0x5e,
-	0x4d, 0xa2, 0x6a, 0x73, 0xee, 0xf1, 0x83, 0xea, 0x4d, 0x98, 0x7b, 0x0c, 0x6f, 0xb4, 0x3b, 0x9b,
-	0x02, 0x58, 0xbd, 0x55, 0x5b, 0x5a, 0x5f, 0xdf, 0x7c, 0xa7, 0xba, 0x5a, 0x50, 0xd8, 0xa0, 0xf7,
-	0x92, 0x50, 0x3f, 0x4b, 0xc0, 0xe9, 0x81, 0x59, 0x6b, 0xb0, 0x3f, 0x2a, 0x4f, 0xc3, 0x1f, 0x2f,
-	0xc2, 0x04, 0x9b, 0xee, 0x47, 0xbe, 0xb8, 0x98, 0xc8, 0x31, 0x9a, 0x8c, 0x7b, 0xf4, 0x08, 0xce,
-	0x87, 0x2e, 0x98, 0x9e, 0xbe, 0xb3, 0x04, 0x1f, 0x70, 0x06, 0x0d, 0xab, 0x77, 0x20, 0xb7, 0x6d,
-	0xdb, 0xad, 0x55, 0x42, 0xb1, 0xd9, 0xe2, 0x57, 0xe7, 0xd4, 0xb6, 0x5b, 0xe1, 0x9a, 0x95, 0x61,
-	0x04, 0x5e, 0xfe, 0x2f, 0xc2, 0x04, 0x1f, 0xf4, 0x92, 0xa5, 0xa8, 0x89, 0x39, 0x46, 0xf3, 0xb2,
-	0xe1, 0x3f, 0x14, 0xc8, 0xcb, 0x1a, 0xe8, 0x5f, 0x25, 0x6c, 0x4a, 0x36, 0x43, 0xc8, 0x90, 0x95,
-	0x2c, 0xfe, 0xcb, 0x71, 0x48, 0x2f, 0x21, 0x24, 0xa4, 0xa4, 0x0c, 0x72, 0xd3, 0x90, 0x4a, 0x64,
-	0x04, 0xe1, 0x96, 0xc1, 0xba, 0x7c, 0x2e, 0xcd, 0xb4, 0x0e, 0xec, 0x06, 0xf6, 0x66, 0xc9, 0x3b,
-	0x01, 0x36, 0x72, 0xcb, 0x1f, 0xb8, 0x65, 0xa0, 0x45, 0x38, 0xdb, 0xb0, 0x1d, 0x87, 0xb4, 0x78,
-	0x65, 0x0a, 0x78, 0x5c, 0xc6, 0x24, 0x4e, 0x1e, 0x67, 0x82, 0x09, 0x01, 0xab, 0x7b, 0xcb, 0x58,
-	0x78, 0x03, 0xa6, 0xa2, 0xdb, 0x1f, 0x75, 0x46, 0x80, 0x74, 0x6d, 0x6d, 0xa9, 0xf2, 0xf2, 0xb5,
-	0x82, 0x82, 0x32, 0x90, 0xaa, 0xad, 0x2d, 0xbd, 0x54, 0x48, 0xa0, 0x71, 0x48, 0xde, 0x59, 0x7d,
-	0xb9, 0x90, 0xac, 0xfc, 0x2a, 0x01, 0x59, 0xdf, 0x1d, 0xd1, 0xa7, 0x0a, 0x8c, 0xcb, 0x1b, 0x14,
-	0x54, 0x1e, 0xfe, 0xa2, 0x89, 0x1b, 0xba, 0x78, 0xce, 0x3b, 0xea, 0x85, 0xfe, 0xff, 0x53, 0xf2,
-	0x2f, 0x62, 0xd4, 0x97, 0xbe, 0xf3, 0xa7, 0xbf, 0x7d, 0x96, 0xb8, 0xa4, 0xbe, 0x50, 0x3e, 0xa8,
-	0x94, 0x3f, 0x8c, 0x1c, 0x4b, 0xde, 0x5c, 0x58, 0x78, 0x54, 0x16, 0xa6, 0x73, 0x17, 0x85, 0x08,
-	0xb2, 0xa8, 0x2c, 0x5c, 0x51, 0xd0, 0x8f, 0x15, 0x98, 0x8c, 0x5c, 0x57, 0xa0, 0x78, 0xff, 0x1b,
-	0x74, 0xbd, 0x31, 0x9a, 0x72, 0x5c, 0xa7, 0xe0, 0x9f, 0x4b, 0xe5, 0x85, 0x85, 0x47, 0x8b, 0x87,
-	0x61, 0x54, 0xae, 0x5c, 0xe5, 0xcf, 0x49, 0xc8, 0x85, 0xb2, 0x33, 0xfa, 0x8b, 0x38, 0x11, 0x46,
-	0xbe, 0xc1, 0xc5, 0x7f, 0xf1, 0x18, 0x7c, 0xc1, 0x52, 0x1c, 0xed, 0x16, 0x41, 0x7d, 0x8f, 0x2f,
-	0xe0, 0x2e, 0xda, 0x7e, 0xac, 0x75, 0xe5, 0xed, 0x40, 0xf9, 0xc3, 0xc8, 0x2d, 0x48, 0x69, 0x0f,
-	0xbb, 0x7b, 0x8f, 0x7a, 0x89, 0x41, 0xc2, 0x7e, 0x84, 0x3e, 0x57, 0x00, 0xf5, 0x5f, 0xbd, 0xa0,
-	0xc5, 0x58, 0x1d, 0x8f, 0xbd, 0xaf, 0x19, 0x75, 0x7d, 0xfb, 0x7c, 0x7d, 0xa4, 0xf8, 0x85, 0xac,
-	0x6f, 0x31, 0x7a, 0x8f, 0x53, 0xf9, 0x49, 0x1a, 0xce, 0xae, 0xd8, 0x16, 0x25, 0x16, 0x5d, 0x32,
-	0x0c, 0x87, 0xb8, 0x2e, 0x4b, 0x92, 0x35, 0x6a, 0x3b, 0xb8, 0x49, 0xd0, 0x6f, 0x14, 0x28, 0xf4,
-	0xde, 0x57, 0xa0, 0x57, 0x87, 0xf8, 0x5f, 0xcc, 0xc0, 0xeb, 0x96, 0xe2, 0x6b, 0x27, 0xe0, 0x14,
-	0xed, 0x86, 0x7a, 0x95, 0x1b, 0xe5, 0xb2, 0x3a, 0x7f, 0x8c, 0x51, 0xea, 0x6c, 0xf6, 0xe2, 0x6e,
-	0xc0, 0xbe, 0xa8, 0x2c, 0x70, 0xf5, 0x7b, 0x3b, 0xf5, 0x21, 0xd4, 0x3f, 0xe6, 0xe2, 0x62, 0x08,
-	0xf5, 0x8f, 0xbb, 0x16, 0x18, 0x52, 0xfd, 0x7a, 0xc0, 0xce, 0xd4, 0xff, 0xa5, 0x02, 0x53, 0xd1,
-	0x8e, 0x17, 0x5d, 0x1b, 0xb9, 0x45, 0x16, 0xaa, 0xbf, 0x72, 0xc2, 0xd6, 0x3a, 0x36, 0x95, 0x85,
-	0x14, 0x67, 0xcc, 0x4c, 0xed, 0xdf, 0x2b, 0x30, 0x2e, 0xbb, 0xc5, 0x21, 0x32, 0x6b, 0xb4, 0x2b,
-	0x2e, 0x5e, 0x19, 0x9e, 0x41, 0x6a, 0x78, 0x8f, 0x6b, 0xa8, 0xa1, 0xad, 0xc7, 0x69, 0x58, 0xfe,
-	0x30, 0xd4, 0x46, 0x7b, 0x41, 0x12, 0x26, 0x85, 0x43, 0xa4, 0x29, 0x24, 0x5c, 0x51, 0x2a, 0xbf,
-	0x55, 0x60, 0x22, 0x72, 0x70, 0xf9, 0x85, 0xc8, 0x7b, 0x11, 0xda, 0x50, 0x79, 0x6f, 0x40, 0xcb,
-	0x5a, 0x8c, 0xbf, 0xe2, 0xec, 0xef, 0x55, 0xd5, 0x4b, 0x7c, 0xb9, 0xcf, 0xa3, 0xe7, 0x8e, 0x59,
-	0x6e, 0xf8, 0x1c, 0xb3, 0xec, 0x40, 0xdc, 0x1f, 0x61, 0x97, 0xa7, 0x35, 0x4e, 0x0c, 0xbe, 0x9c,
-	0x39, 0x36, 0xb5, 0xb7, 0x94, 0xaf, 0xe7, 0xc5, 0x64, 0x7f, 0xee, 0xcf, 0x12, 0x49, 0xad, 0x7a,
-	0xef, 0xe7, 0x89, 0xf3, 0xcb, 0x1c, 0x70, 0x99, 0x03, 0x0a, 0xde, 0xa0, 0x35, 0x2d, 0xdd, 0xad,
-	0xd4, 0xd3, 0xfc, 0xff, 0x1c, 0x57, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x7b, 0x67, 0xb6,
-	0xbb, 0x2b, 0x00, 0x00,
-}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConn
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion4
-
-// ExecutionClient is the client API for Execution service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type ExecutionClient interface {
-	// Execute an action remotely.
-	//
-	// In order to execute an action, the client must first upload all of the
-	// inputs, the
-	// [Command][build.bazel.remote.execution.v2.Command] to run, and the
-	// [Action][build.bazel.remote.execution.v2.Action] into the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	// It then calls `Execute` with an `action_digest` referring to them. The
-	// server will run the action and eventually return the result.
-	//
-	// The input `Action`'s fields MUST meet the various canonicalization
-	// requirements specified in the documentation for their types so that it has
-	// the same digest as other logically equivalent `Action`s. The server MAY
-	// enforce the requirements and return errors if a non-canonical input is
-	// received. It MAY also proceed without verifying some or all of the
-	// requirements, such as for performance reasons. If the server does not
-	// verify the requirement, then it will treat the `Action` as distinct from
-	// another logically equivalent action if they hash differently.
-	//
-	// Returns a stream of
-	// [google.longrunning.Operation][google.longrunning.Operation] messages
-	// describing the resulting execution, with eventual `response`
-	// [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
-	// `metadata` on the operation is of type
-	// [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
-	//
-	// If the client remains connected after the first response is returned after
-	// the server, then updates are streamed as if the client had called
-	// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
-	// until the execution completes or the request reaches an error. The
-	// operation can also be queried using [Operations
-	// API][google.longrunning.Operations.GetOperation].
-	//
-	// The server NEED NOT implement other methods or functionality of the
-	// Operations API.
-	//
-	// Errors discovered during creation of the `Operation` will be reported
-	// as gRPC Status errors, while errors that occurred while running the
-	// action will be reported in the `status` field of the `ExecuteResponse`. The
-	// server MUST NOT set the `error` field of the `Operation` proto.
-	// The possible errors include:
-	//
-	// * `INVALID_ARGUMENT`: One or more arguments are invalid.
-	// * `FAILED_PRECONDITION`: One or more errors occurred in setting up the
-	//   action requested, such as a missing input or command or no worker being
-	//   available. The client may be able to fix the errors and retry.
-	// * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
-	//   the action.
-	// * `UNAVAILABLE`: Due to a transient condition, such as all workers being
-	//   occupied (and the server does not support a queue), the action could not
-	//   be started. The client should retry.
-	// * `INTERNAL`: An internal error occurred in the execution engine or the
-	//   worker.
-	// * `DEADLINE_EXCEEDED`: The execution timed out.
-	// * `CANCELLED`: The operation was cancelled by the client. This status is
-	//   only possible if the server implements the Operations API CancelOperation
-	//   method, and it was called for the current execution.
-	//
-	// In the case of a missing input or command, the server SHOULD additionally
-	// send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
-	// where, for each requested blob not present in the CAS, there is a
-	// `Violation` with a `type` of `MISSING` and a `subject` of
-	// `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
-	Execute(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (Execution_ExecuteClient, error)
-	// Wait for an execution operation to complete. When the client initially
-	// makes the request, the server immediately responds with the current status
-	// of the execution. The server will leave the request stream open until the
-	// operation completes, and then respond with the completed operation. The
-	// server MAY choose to stream additional updates as execution progresses,
-	// such as to provide an update as to the state of the execution.
-	WaitExecution(ctx context.Context, in *WaitExecutionRequest, opts ...grpc.CallOption) (Execution_WaitExecutionClient, error)
-}
-
-type executionClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewExecutionClient(cc *grpc.ClientConn) ExecutionClient {
-	return &executionClient{cc}
-}
-
-func (c *executionClient) Execute(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (Execution_ExecuteClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_Execution_serviceDesc.Streams[0], "/build.bazel.remote.execution.v2.Execution/Execute", opts...)
-	if err != nil {
-		return nil, err
-	}
-	x := &executionExecuteClient{stream}
-	if err := x.ClientStream.SendMsg(in); err != nil {
-		return nil, err
-	}
-	if err := x.ClientStream.CloseSend(); err != nil {
-		return nil, err
-	}
-	return x, nil
-}
-
-type Execution_ExecuteClient interface {
-	Recv() (*longrunning.Operation, error)
-	grpc.ClientStream
-}
-
-type executionExecuteClient struct {
-	grpc.ClientStream
-}
-
-func (x *executionExecuteClient) Recv() (*longrunning.Operation, error) {
-	m := new(longrunning.Operation)
-	if err := x.ClientStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-func (c *executionClient) WaitExecution(ctx context.Context, in *WaitExecutionRequest, opts ...grpc.CallOption) (Execution_WaitExecutionClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_Execution_serviceDesc.Streams[1], "/build.bazel.remote.execution.v2.Execution/WaitExecution", opts...)
-	if err != nil {
-		return nil, err
-	}
-	x := &executionWaitExecutionClient{stream}
-	if err := x.ClientStream.SendMsg(in); err != nil {
-		return nil, err
-	}
-	if err := x.ClientStream.CloseSend(); err != nil {
-		return nil, err
-	}
-	return x, nil
-}
-
-type Execution_WaitExecutionClient interface {
-	Recv() (*longrunning.Operation, error)
-	grpc.ClientStream
-}
-
-type executionWaitExecutionClient struct {
-	grpc.ClientStream
-}
-
-func (x *executionWaitExecutionClient) Recv() (*longrunning.Operation, error) {
-	m := new(longrunning.Operation)
-	if err := x.ClientStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-// ExecutionServer is the server API for Execution service.
-type ExecutionServer interface {
-	// Execute an action remotely.
-	//
-	// In order to execute an action, the client must first upload all of the
-	// inputs, the
-	// [Command][build.bazel.remote.execution.v2.Command] to run, and the
-	// [Action][build.bazel.remote.execution.v2.Action] into the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-	// It then calls `Execute` with an `action_digest` referring to them. The
-	// server will run the action and eventually return the result.
-	//
-	// The input `Action`'s fields MUST meet the various canonicalization
-	// requirements specified in the documentation for their types so that it has
-	// the same digest as other logically equivalent `Action`s. The server MAY
-	// enforce the requirements and return errors if a non-canonical input is
-	// received. It MAY also proceed without verifying some or all of the
-	// requirements, such as for performance reasons. If the server does not
-	// verify the requirement, then it will treat the `Action` as distinct from
-	// another logically equivalent action if they hash differently.
-	//
-	// Returns a stream of
-	// [google.longrunning.Operation][google.longrunning.Operation] messages
-	// describing the resulting execution, with eventual `response`
-	// [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
-	// `metadata` on the operation is of type
-	// [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
-	//
-	// If the client remains connected after the first response is returned after
-	// the server, then updates are streamed as if the client had called
-	// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
-	// until the execution completes or the request reaches an error. The
-	// operation can also be queried using [Operations
-	// API][google.longrunning.Operations.GetOperation].
-	//
-	// The server NEED NOT implement other methods or functionality of the
-	// Operations API.
-	//
-	// Errors discovered during creation of the `Operation` will be reported
-	// as gRPC Status errors, while errors that occurred while running the
-	// action will be reported in the `status` field of the `ExecuteResponse`. The
-	// server MUST NOT set the `error` field of the `Operation` proto.
-	// The possible errors include:
-	//
-	// * `INVALID_ARGUMENT`: One or more arguments are invalid.
-	// * `FAILED_PRECONDITION`: One or more errors occurred in setting up the
-	//   action requested, such as a missing input or command or no worker being
-	//   available. The client may be able to fix the errors and retry.
-	// * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
-	//   the action.
-	// * `UNAVAILABLE`: Due to a transient condition, such as all workers being
-	//   occupied (and the server does not support a queue), the action could not
-	//   be started. The client should retry.
-	// * `INTERNAL`: An internal error occurred in the execution engine or the
-	//   worker.
-	// * `DEADLINE_EXCEEDED`: The execution timed out.
-	// * `CANCELLED`: The operation was cancelled by the client. This status is
-	//   only possible if the server implements the Operations API CancelOperation
-	//   method, and it was called for the current execution.
-	//
-	// In the case of a missing input or command, the server SHOULD additionally
-	// send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
-	// where, for each requested blob not present in the CAS, there is a
-	// `Violation` with a `type` of `MISSING` and a `subject` of
-	// `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
-	Execute(*ExecuteRequest, Execution_ExecuteServer) error
-	// Wait for an execution operation to complete. When the client initially
-	// makes the request, the server immediately responds with the current status
-	// of the execution. The server will leave the request stream open until the
-	// operation completes, and then respond with the completed operation. The
-	// server MAY choose to stream additional updates as execution progresses,
-	// such as to provide an update as to the state of the execution.
-	WaitExecution(*WaitExecutionRequest, Execution_WaitExecutionServer) error
-}
-
-func RegisterExecutionServer(s *grpc.Server, srv ExecutionServer) {
-	s.RegisterService(&_Execution_serviceDesc, srv)
-}
-
-func _Execution_Execute_Handler(srv interface{}, stream grpc.ServerStream) error {
-	m := new(ExecuteRequest)
-	if err := stream.RecvMsg(m); err != nil {
-		return err
-	}
-	return srv.(ExecutionServer).Execute(m, &executionExecuteServer{stream})
-}
-
-type Execution_ExecuteServer interface {
-	Send(*longrunning.Operation) error
-	grpc.ServerStream
-}
-
-type executionExecuteServer struct {
-	grpc.ServerStream
-}
-
-func (x *executionExecuteServer) Send(m *longrunning.Operation) error {
-	return x.ServerStream.SendMsg(m)
-}
-
-func _Execution_WaitExecution_Handler(srv interface{}, stream grpc.ServerStream) error {
-	m := new(WaitExecutionRequest)
-	if err := stream.RecvMsg(m); err != nil {
-		return err
-	}
-	return srv.(ExecutionServer).WaitExecution(m, &executionWaitExecutionServer{stream})
-}
-
-type Execution_WaitExecutionServer interface {
-	Send(*longrunning.Operation) error
-	grpc.ServerStream
-}
-
-type executionWaitExecutionServer struct {
-	grpc.ServerStream
-}
-
-func (x *executionWaitExecutionServer) Send(m *longrunning.Operation) error {
-	return x.ServerStream.SendMsg(m)
-}
-
-var _Execution_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "build.bazel.remote.execution.v2.Execution",
-	HandlerType: (*ExecutionServer)(nil),
-	Methods:     []grpc.MethodDesc{},
-	Streams: []grpc.StreamDesc{
-		{
-			StreamName:    "Execute",
-			Handler:       _Execution_Execute_Handler,
-			ServerStreams: true,
-		},
-		{
-			StreamName:    "WaitExecution",
-			Handler:       _Execution_WaitExecution_Handler,
-			ServerStreams: true,
-		},
-	},
-	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
-}
-
-// ActionCacheClient is the client API for ActionCache service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type ActionCacheClient interface {
-	// Retrieve a cached execution result.
-	//
-	// Errors:
-	//
-	// * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
-	GetActionResult(ctx context.Context, in *GetActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error)
-	// Upload a new execution result.
-	//
-	// In order to allow the server to perform access control based on the type of
-	// action, and to assist with client debugging, the client MUST first upload
-	// the [Action][build.bazel.remote.execution.v2.Execution] that produced the
-	// result, along with its
-	// [Command][build.bazel.remote.execution.v2.Command], into the
-	// `ContentAddressableStorage`.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: One or more arguments are invalid.
-	// * `FAILED_PRECONDITION`: One or more errors occurred in updating the
-	//   action result, such as a missing command or action.
-	// * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
-	//   entry to the cache.
-	UpdateActionResult(ctx context.Context, in *UpdateActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error)
-}
-
-type actionCacheClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewActionCacheClient(cc *grpc.ClientConn) ActionCacheClient {
-	return &actionCacheClient{cc}
-}
-
-func (c *actionCacheClient) GetActionResult(ctx context.Context, in *GetActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) {
-	out := new(ActionResult)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ActionCache/GetActionResult", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *actionCacheClient) UpdateActionResult(ctx context.Context, in *UpdateActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) {
-	out := new(ActionResult)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// ActionCacheServer is the server API for ActionCache service.
-type ActionCacheServer interface {
-	// Retrieve a cached execution result.
-	//
-	// Errors:
-	//
-	// * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
-	GetActionResult(context.Context, *GetActionResultRequest) (*ActionResult, error)
-	// Upload a new execution result.
-	//
-	// In order to allow the server to perform access control based on the type of
-	// action, and to assist with client debugging, the client MUST first upload
-	// the [Action][build.bazel.remote.execution.v2.Execution] that produced the
-	// result, along with its
-	// [Command][build.bazel.remote.execution.v2.Command], into the
-	// `ContentAddressableStorage`.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: One or more arguments are invalid.
-	// * `FAILED_PRECONDITION`: One or more errors occurred in updating the
-	//   action result, such as a missing command or action.
-	// * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
-	//   entry to the cache.
-	UpdateActionResult(context.Context, *UpdateActionResultRequest) (*ActionResult, error)
-}
-
-func RegisterActionCacheServer(s *grpc.Server, srv ActionCacheServer) {
-	s.RegisterService(&_ActionCache_serviceDesc, srv)
-}
-
-func _ActionCache_GetActionResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetActionResultRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ActionCacheServer).GetActionResult(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ActionCache/GetActionResult",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ActionCacheServer).GetActionResult(ctx, req.(*GetActionResultRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ActionCache_UpdateActionResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(UpdateActionResultRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ActionCacheServer).UpdateActionResult(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ActionCacheServer).UpdateActionResult(ctx, req.(*UpdateActionResultRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _ActionCache_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "build.bazel.remote.execution.v2.ActionCache",
-	HandlerType: (*ActionCacheServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "GetActionResult",
-			Handler:    _ActionCache_GetActionResult_Handler,
-		},
-		{
-			MethodName: "UpdateActionResult",
-			Handler:    _ActionCache_UpdateActionResult_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
-}
-
-// ContentAddressableStorageClient is the client API for ContentAddressableStorage service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type ContentAddressableStorageClient interface {
-	// Determine if blobs are present in the CAS.
-	//
-	// Clients can use this API before uploading blobs to determine which ones are
-	// already present in the CAS and do not need to be uploaded again.
-	//
-	// There are no method-specific errors.
-	FindMissingBlobs(ctx context.Context, in *FindMissingBlobsRequest, opts ...grpc.CallOption) (*FindMissingBlobsResponse, error)
-	// Upload many blobs at once.
-	//
-	// The server may enforce a limit of the combined total size of blobs
-	// to be uploaded using this API. This limit may be obtained using the
-	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-	// Requests exceeding the limit should either be split into smaller
-	// chunks or uploaded using the
-	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
-	//
-	// This request is equivalent to calling a Bytestream `Write` request
-	// on each individual blob, in parallel. The requests may succeed or fail
-	// independently.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: The client attempted to upload more than the
-	//   server supported limit.
-	//
-	// Individual requests may return the following errors, additionally:
-	//
-	// * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
-	// * `INVALID_ARGUMENT`: The
-	// [Digest][build.bazel.remote.execution.v2.Digest] does not match the
-	// provided data.
-	BatchUpdateBlobs(ctx context.Context, in *BatchUpdateBlobsRequest, opts ...grpc.CallOption) (*BatchUpdateBlobsResponse, error)
-	// Download many blobs at once.
-	//
-	// The server may enforce a limit of the combined total size of blobs
-	// to be downloaded using this API. This limit may be obtained using the
-	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-	// Requests exceeding the limit should either be split into smaller
-	// chunks or downloaded using the
-	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
-	//
-	// This request is equivalent to calling a Bytestream `Read` request
-	// on each individual blob, in parallel. The requests may succeed or fail
-	// independently.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: The client attempted to read more than the
-	//   server supported limit.
-	//
-	// Every error on individual read will be returned in the corresponding digest
-	// status.
-	BatchReadBlobs(ctx context.Context, in *BatchReadBlobsRequest, opts ...grpc.CallOption) (*BatchReadBlobsResponse, error)
-	// Fetch the entire directory tree rooted at a node.
-	//
-	// This request must be targeted at a
-	// [Directory][build.bazel.remote.execution.v2.Directory] stored in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-	// (CAS). The server will enumerate the `Directory` tree recursively and
-	// return every node descended from the root.
-	//
-	// The GetTreeRequest.page_token parameter can be used to skip ahead in
-	// the stream (e.g. when retrying a partially completed and aborted request),
-	// by setting it to a value taken from GetTreeResponse.next_page_token of the
-	// last successfully processed GetTreeResponse).
-	//
-	// The exact traversal order is unspecified and, unless retrieving subsequent
-	// pages from an earlier request, is not guaranteed to be stable across
-	// multiple invocations of `GetTree`.
-	//
-	// If part of the tree is missing from the CAS, the server will return the
-	// portion present and omit the rest.
-	//
-	// * `NOT_FOUND`: The requested tree root is not present in the CAS.
-	GetTree(ctx context.Context, in *GetTreeRequest, opts ...grpc.CallOption) (ContentAddressableStorage_GetTreeClient, error)
-}
-
-type contentAddressableStorageClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewContentAddressableStorageClient(cc *grpc.ClientConn) ContentAddressableStorageClient {
-	return &contentAddressableStorageClient{cc}
-}
-
-func (c *contentAddressableStorageClient) FindMissingBlobs(ctx context.Context, in *FindMissingBlobsRequest, opts ...grpc.CallOption) (*FindMissingBlobsResponse, error) {
-	out := new(FindMissingBlobsResponse)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *contentAddressableStorageClient) BatchUpdateBlobs(ctx context.Context, in *BatchUpdateBlobsRequest, opts ...grpc.CallOption) (*BatchUpdateBlobsResponse, error) {
-	out := new(BatchUpdateBlobsResponse)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *contentAddressableStorageClient) BatchReadBlobs(ctx context.Context, in *BatchReadBlobsRequest, opts ...grpc.CallOption) (*BatchReadBlobsResponse, error) {
-	out := new(BatchReadBlobsResponse)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *contentAddressableStorageClient) GetTree(ctx context.Context, in *GetTreeRequest, opts ...grpc.CallOption) (ContentAddressableStorage_GetTreeClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_ContentAddressableStorage_serviceDesc.Streams[0], "/build.bazel.remote.execution.v2.ContentAddressableStorage/GetTree", opts...)
-	if err != nil {
-		return nil, err
-	}
-	x := &contentAddressableStorageGetTreeClient{stream}
-	if err := x.ClientStream.SendMsg(in); err != nil {
-		return nil, err
-	}
-	if err := x.ClientStream.CloseSend(); err != nil {
-		return nil, err
-	}
-	return x, nil
-}
-
-type ContentAddressableStorage_GetTreeClient interface {
-	Recv() (*GetTreeResponse, error)
-	grpc.ClientStream
-}
-
-type contentAddressableStorageGetTreeClient struct {
-	grpc.ClientStream
-}
-
-func (x *contentAddressableStorageGetTreeClient) Recv() (*GetTreeResponse, error) {
-	m := new(GetTreeResponse)
-	if err := x.ClientStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-// ContentAddressableStorageServer is the server API for ContentAddressableStorage service.
-type ContentAddressableStorageServer interface {
-	// Determine if blobs are present in the CAS.
-	//
-	// Clients can use this API before uploading blobs to determine which ones are
-	// already present in the CAS and do not need to be uploaded again.
-	//
-	// There are no method-specific errors.
-	FindMissingBlobs(context.Context, *FindMissingBlobsRequest) (*FindMissingBlobsResponse, error)
-	// Upload many blobs at once.
-	//
-	// The server may enforce a limit of the combined total size of blobs
-	// to be uploaded using this API. This limit may be obtained using the
-	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-	// Requests exceeding the limit should either be split into smaller
-	// chunks or uploaded using the
-	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
-	//
-	// This request is equivalent to calling a Bytestream `Write` request
-	// on each individual blob, in parallel. The requests may succeed or fail
-	// independently.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: The client attempted to upload more than the
-	//   server supported limit.
-	//
-	// Individual requests may return the following errors, additionally:
-	//
-	// * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
-	// * `INVALID_ARGUMENT`: The
-	// [Digest][build.bazel.remote.execution.v2.Digest] does not match the
-	// provided data.
-	BatchUpdateBlobs(context.Context, *BatchUpdateBlobsRequest) (*BatchUpdateBlobsResponse, error)
-	// Download many blobs at once.
-	//
-	// The server may enforce a limit of the combined total size of blobs
-	// to be downloaded using this API. This limit may be obtained using the
-	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-	// Requests exceeding the limit should either be split into smaller
-	// chunks or downloaded using the
-	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
-	//
-	// This request is equivalent to calling a Bytestream `Read` request
-	// on each individual blob, in parallel. The requests may succeed or fail
-	// independently.
-	//
-	// Errors:
-	//
-	// * `INVALID_ARGUMENT`: The client attempted to read more than the
-	//   server supported limit.
-	//
-	// Every error on individual read will be returned in the corresponding digest
-	// status.
-	BatchReadBlobs(context.Context, *BatchReadBlobsRequest) (*BatchReadBlobsResponse, error)
-	// Fetch the entire directory tree rooted at a node.
-	//
-	// This request must be targeted at a
-	// [Directory][build.bazel.remote.execution.v2.Directory] stored in the
-	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-	// (CAS). The server will enumerate the `Directory` tree recursively and
-	// return every node descended from the root.
-	//
-	// The GetTreeRequest.page_token parameter can be used to skip ahead in
-	// the stream (e.g. when retrying a partially completed and aborted request),
-	// by setting it to a value taken from GetTreeResponse.next_page_token of the
-	// last successfully processed GetTreeResponse).
-	//
-	// The exact traversal order is unspecified and, unless retrieving subsequent
-	// pages from an earlier request, is not guaranteed to be stable across
-	// multiple invocations of `GetTree`.
-	//
-	// If part of the tree is missing from the CAS, the server will return the
-	// portion present and omit the rest.
-	//
-	// * `NOT_FOUND`: The requested tree root is not present in the CAS.
-	GetTree(*GetTreeRequest, ContentAddressableStorage_GetTreeServer) error
-}
-
-func RegisterContentAddressableStorageServer(s *grpc.Server, srv ContentAddressableStorageServer) {
-	s.RegisterService(&_ContentAddressableStorage_serviceDesc, srv)
-}
-
-func _ContentAddressableStorage_FindMissingBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(FindMissingBlobsRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ContentAddressableStorageServer).FindMissingBlobs(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ContentAddressableStorageServer).FindMissingBlobs(ctx, req.(*FindMissingBlobsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ContentAddressableStorage_BatchUpdateBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(BatchUpdateBlobsRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ContentAddressableStorageServer).BatchUpdateBlobs(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ContentAddressableStorageServer).BatchUpdateBlobs(ctx, req.(*BatchUpdateBlobsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ContentAddressableStorage_BatchReadBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(BatchReadBlobsRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ContentAddressableStorageServer).BatchReadBlobs(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ContentAddressableStorageServer).BatchReadBlobs(ctx, req.(*BatchReadBlobsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ContentAddressableStorage_GetTree_Handler(srv interface{}, stream grpc.ServerStream) error {
-	m := new(GetTreeRequest)
-	if err := stream.RecvMsg(m); err != nil {
-		return err
-	}
-	return srv.(ContentAddressableStorageServer).GetTree(m, &contentAddressableStorageGetTreeServer{stream})
-}
-
-type ContentAddressableStorage_GetTreeServer interface {
-	Send(*GetTreeResponse) error
-	grpc.ServerStream
-}
-
-type contentAddressableStorageGetTreeServer struct {
-	grpc.ServerStream
-}
-
-func (x *contentAddressableStorageGetTreeServer) Send(m *GetTreeResponse) error {
-	return x.ServerStream.SendMsg(m)
-}
-
-var _ContentAddressableStorage_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "build.bazel.remote.execution.v2.ContentAddressableStorage",
-	HandlerType: (*ContentAddressableStorageServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "FindMissingBlobs",
-			Handler:    _ContentAddressableStorage_FindMissingBlobs_Handler,
-		},
-		{
-			MethodName: "BatchUpdateBlobs",
-			Handler:    _ContentAddressableStorage_BatchUpdateBlobs_Handler,
-		},
-		{
-			MethodName: "BatchReadBlobs",
-			Handler:    _ContentAddressableStorage_BatchReadBlobs_Handler,
-		},
-	},
-	Streams: []grpc.StreamDesc{
-		{
-			StreamName:    "GetTree",
-			Handler:       _ContentAddressableStorage_GetTree_Handler,
-			ServerStreams: true,
-		},
-	},
-	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
-}
-
-// CapabilitiesClient is the client API for Capabilities service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type CapabilitiesClient interface {
-	// GetCapabilities returns the server capabilities configuration.
-	GetCapabilities(ctx context.Context, in *GetCapabilitiesRequest, opts ...grpc.CallOption) (*ServerCapabilities, error)
-}
-
-type capabilitiesClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewCapabilitiesClient(cc *grpc.ClientConn) CapabilitiesClient {
-	return &capabilitiesClient{cc}
-}
-
-func (c *capabilitiesClient) GetCapabilities(ctx context.Context, in *GetCapabilitiesRequest, opts ...grpc.CallOption) (*ServerCapabilities, error) {
-	out := new(ServerCapabilities)
-	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.Capabilities/GetCapabilities", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// CapabilitiesServer is the server API for Capabilities service.
-type CapabilitiesServer interface {
-	// GetCapabilities returns the server capabilities configuration.
-	GetCapabilities(context.Context, *GetCapabilitiesRequest) (*ServerCapabilities, error)
-}
-
-func RegisterCapabilitiesServer(s *grpc.Server, srv CapabilitiesServer) {
-	s.RegisterService(&_Capabilities_serviceDesc, srv)
-}
-
-func _Capabilities_GetCapabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetCapabilitiesRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(CapabilitiesServer).GetCapabilities(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/build.bazel.remote.execution.v2.Capabilities/GetCapabilities",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CapabilitiesServer).GetCapabilities(ctx, req.(*GetCapabilitiesRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Capabilities_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "build.bazel.remote.execution.v2.Capabilities",
-	HandlerType: (*CapabilitiesServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "GetCapabilities",
-			Handler:    _Capabilities_GetCapabilities_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
-}
diff --git a/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.proto b/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.proto
deleted file mode 100644
index ca96a34..0000000
--- a/proto/remote-apis/build/bazel/remote/execution/v2/remote_execution.proto
+++ /dev/null
@@ -1,1433 +0,0 @@
-// Copyright 2018 The Bazel Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto3";
-
-package build.bazel.remote.execution.v2;
-
-import "build/bazel/semver/semver.proto";
-import "google/api/annotations.proto";
-import "google/longrunning/operations.proto";
-import "google/protobuf/duration.proto";
-import "google/protobuf/timestamp.proto";
-import "google/rpc/status.proto";
-
-option csharp_namespace = "Build.Bazel.Remote.Execution.V2";
-option go_package = "remoteexecution";
-option java_multiple_files = true;
-option java_outer_classname = "RemoteExecutionProto";
-option java_package = "build.bazel.remote.execution.v2";
-option objc_class_prefix = "REX";
-
-
-// The Remote Execution API is used to execute an
-// [Action][build.bazel.remote.execution.v2.Action] on the remote
-// workers.
-//
-// As with other services in the Remote Execution API, any call may return an
-// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-// information about when the client should retry the request; clients SHOULD
-// respect the information provided.
-service Execution {
-  // Execute an action remotely.
-  //
-  // In order to execute an action, the client must first upload all of the
-  // inputs, the
-  // [Command][build.bazel.remote.execution.v2.Command] to run, and the
-  // [Action][build.bazel.remote.execution.v2.Action] into the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  // It then calls `Execute` with an `action_digest` referring to them. The
-  // server will run the action and eventually return the result.
-  //
-  // The input `Action`'s fields MUST meet the various canonicalization
-  // requirements specified in the documentation for their types so that it has
-  // the same digest as other logically equivalent `Action`s. The server MAY
-  // enforce the requirements and return errors if a non-canonical input is
-  // received. It MAY also proceed without verifying some or all of the
-  // requirements, such as for performance reasons. If the server does not
-  // verify the requirement, then it will treat the `Action` as distinct from
-  // another logically equivalent action if they hash differently.
-  //
-  // Returns a stream of
-  // [google.longrunning.Operation][google.longrunning.Operation] messages
-  // describing the resulting execution, with eventual `response`
-  // [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
-  // `metadata` on the operation is of type
-  // [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
-  //
-  // If the client remains connected after the first response is returned after
-  // the server, then updates are streamed as if the client had called
-  // [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
-  // until the execution completes or the request reaches an error. The
-  // operation can also be queried using [Operations
-  // API][google.longrunning.Operations.GetOperation].
-  //
-  // The server NEED NOT implement other methods or functionality of the
-  // Operations API.
-  //
-  // Errors discovered during creation of the `Operation` will be reported
-  // as gRPC Status errors, while errors that occurred while running the
-  // action will be reported in the `status` field of the `ExecuteResponse`. The
-  // server MUST NOT set the `error` field of the `Operation` proto.
-  // The possible errors include:
-  //
-  // * `INVALID_ARGUMENT`: One or more arguments are invalid.
-  // * `FAILED_PRECONDITION`: One or more errors occurred in setting up the
-  //   action requested, such as a missing input or command or no worker being
-  //   available. The client may be able to fix the errors and retry.
-  // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
-  //   the action.
-  // * `UNAVAILABLE`: Due to a transient condition, such as all workers being
-  //   occupied (and the server does not support a queue), the action could not
-  //   be started. The client should retry.
-  // * `INTERNAL`: An internal error occurred in the execution engine or the
-  //   worker.
-  // * `DEADLINE_EXCEEDED`: The execution timed out.
-  // * `CANCELLED`: The operation was cancelled by the client. This status is
-  //   only possible if the server implements the Operations API CancelOperation
-  //   method, and it was called for the current execution.
-  //
-  // In the case of a missing input or command, the server SHOULD additionally
-  // send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
-  // where, for each requested blob not present in the CAS, there is a
-  // `Violation` with a `type` of `MISSING` and a `subject` of
-  // `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
-  rpc Execute(ExecuteRequest) returns (stream google.longrunning.Operation) {
-    option (google.api.http) = { post: "/v2/{instance_name=**}/actions:execute" body: "*" };
-  }
-
-  // Wait for an execution operation to complete. When the client initially
-  // makes the request, the server immediately responds with the current status
-  // of the execution. The server will leave the request stream open until the
-  // operation completes, and then respond with the completed operation. The
-  // server MAY choose to stream additional updates as execution progresses,
-  // such as to provide an update as to the state of the execution.
-  rpc WaitExecution(WaitExecutionRequest) returns (stream google.longrunning.Operation) {
-    option (google.api.http) = { post: "/v2/{name=operations/**}:waitExecution" body: "*" };
-  }
-}
-
-// The action cache API is used to query whether a given action has already been
-// performed and, if so, retrieve its result. Unlike the
-// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage],
-// which addresses blobs by their own content, the action cache addresses the
-// [ActionResult][build.bazel.remote.execution.v2.ActionResult] by a
-// digest of the encoded [Action][build.bazel.remote.execution.v2.Action]
-// which produced them.
-//
-// The lifetime of entries in the action cache is implementation-specific, but
-// the server SHOULD assume that more recently used entries are more likely to
-// be used again. Additionally, action cache implementations SHOULD ensure that
-// any blobs referenced in the
-// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-// are still valid when returning a result.
-//
-// As with other services in the Remote Execution API, any call may return an
-// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-// information about when the client should retry the request; clients SHOULD
-// respect the information provided.
-service ActionCache {
-  // Retrieve a cached execution result.
-  //
-  // Errors:
-  //
-  // * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
-  rpc GetActionResult(GetActionResultRequest) returns (ActionResult) {
-    option (google.api.http) = { get: "/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}" };
-  }
-
-  // Upload a new execution result.
-  //
-  // In order to allow the server to perform access control based on the type of
-  // action, and to assist with client debugging, the client MUST first upload
-  // the [Action][build.bazel.remote.execution.v2.Execution] that produced the
-  // result, along with its
-  // [Command][build.bazel.remote.execution.v2.Command], into the
-  // `ContentAddressableStorage`.
-  //
-  // Errors:
-  //
-  // * `INVALID_ARGUMENT`: One or more arguments are invalid.
-  // * `FAILED_PRECONDITION`: One or more errors occurred in updating the
-  //   action result, such as a missing command or action.
-  // * `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
-  //   entry to the cache.
-  rpc UpdateActionResult(UpdateActionResultRequest) returns (ActionResult) {
-    option (google.api.http) = { put: "/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}" body: "action_result" };
-  }
-}
-
-// The CAS (content-addressable storage) is used to store the inputs to and
-// outputs from the execution service. Each piece of content is addressed by the
-// digest of its binary data.
-//
-// Most of the binary data stored in the CAS is opaque to the execution engine,
-// and is only used as a communication medium. In order to build an
-// [Action][build.bazel.remote.execution.v2.Action],
-// however, the client will need to also upload the
-// [Command][build.bazel.remote.execution.v2.Command] and input root
-// [Directory][build.bazel.remote.execution.v2.Directory] for the Action.
-// The Command and Directory messages must be marshalled to wire format and then
-// uploaded under the hash as with any other piece of content. In practice, the
-// input root directory is likely to refer to other Directories in its
-// hierarchy, which must also each be uploaded on their own.
-//
-// For small file uploads the client should group them together and call
-// [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-// For large uploads, the client must use the
-// [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. The
-// `resource_name` is `{instance_name}/uploads/{uuid}/blobs/{hash}/{size}`,
-// where `instance_name` is as described in the next paragraph, `uuid` is a
-// version 4 UUID generated by the client, and `hash` and `size` are the
-// [Digest][build.bazel.remote.execution.v2.Digest] of the blob. The
-// `uuid` is used only to avoid collisions when multiple clients try to upload
-// the same file (or the same client tries to upload the file multiple times at
-// once on different threads), so the client MAY reuse the `uuid` for uploading
-// different blobs. The `resource_name` may optionally have a trailing filename
-// (or other metadata) for a client to use if it is storing URLs, as in
-// `{instance}/uploads/{uuid}/blobs/{hash}/{size}/foo/bar/baz.cc`. Anything
-// after the `size` is ignored.
-//
-// A single server MAY support multiple instances of the execution system, each
-// with their own workers, storage, cache, etc. The exact relationship between
-// instances is up to the server. If the server does, then the `instance_name`
-// is an identifier, possibly containing multiple path segments, used to
-// distinguish between the various instances on the server, in a manner defined
-// by the server. For servers which do not support multiple instances, then the
-// `instance_name` is the empty path and the leading slash is omitted, so that
-// the `resource_name` becomes `uploads/{uuid}/blobs/{hash}/{size}`.
-// To simplify parsing, a path segment cannot equal any of the following
-// keywords: `blobs`, `uploads`, `actions`, `actionResults`, `operations` and
-// `capabilities`.
-//
-// When attempting an upload, if another client has already completed the upload
-// (which may occur in the middle of a single upload if another client uploads
-// the same blob concurrently), the request will terminate immediately with
-// a response whose `committed_size` is the full size of the uploaded file
-// (regardless of how much data was transmitted by the client). If the client
-// completes the upload but the
-// [Digest][build.bazel.remote.execution.v2.Digest] does not match, an
-// `INVALID_ARGUMENT` error will be returned. In either case, the client should
-// not attempt to retry the upload.
-//
-// For downloading blobs, the client must use the
-// [Read method][google.bytestream.ByteStream.Read] of the ByteStream API, with
-// a `resource_name` of `"{instance_name}/blobs/{hash}/{size}"`, where
-// `instance_name` is the instance name (see above), and `hash` and `size` are
-// the [Digest][build.bazel.remote.execution.v2.Digest] of the blob.
-//
-// The lifetime of entries in the CAS is implementation specific, but it SHOULD
-// be long enough to allow for newly-added and recently looked-up entries to be
-// used in subsequent calls (e.g. to
-// [Execute][build.bazel.remote.execution.v2.Execution.Execute]).
-//
-// As with other services in the Remote Execution API, any call may return an
-// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
-// information about when the client should retry the request; clients SHOULD
-// respect the information provided.
-service ContentAddressableStorage {
-  // Determine if blobs are present in the CAS.
-  //
-  // Clients can use this API before uploading blobs to determine which ones are
-  // already present in the CAS and do not need to be uploaded again.
-  //
-  // There are no method-specific errors.
-  rpc FindMissingBlobs(FindMissingBlobsRequest) returns (FindMissingBlobsResponse) {
-    option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:findMissing" body: "*" };
-  }
-
-  // Upload many blobs at once.
-  //
-  // The server may enforce a limit of the combined total size of blobs
-  // to be uploaded using this API. This limit may be obtained using the
-  // [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-  // Requests exceeding the limit should either be split into smaller
-  // chunks or uploaded using the
-  // [ByteStream API][google.bytestream.ByteStream], as appropriate.
-  //
-  // This request is equivalent to calling a Bytestream `Write` request
-  // on each individual blob, in parallel. The requests may succeed or fail
-  // independently.
-  //
-  // Errors:
-  //
-  // * `INVALID_ARGUMENT`: The client attempted to upload more than the
-  //   server supported limit.
-  //
-  // Individual requests may return the following errors, additionally:
-  //
-  // * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
-  // * `INVALID_ARGUMENT`: The
-  // [Digest][build.bazel.remote.execution.v2.Digest] does not match the
-  // provided data.
-  rpc BatchUpdateBlobs(BatchUpdateBlobsRequest) returns (BatchUpdateBlobsResponse) {
-    option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:batchUpdate" body: "*" };
-  }
-
-  // Download many blobs at once.
-  //
-  // The server may enforce a limit of the combined total size of blobs
-  // to be downloaded using this API. This limit may be obtained using the
-  // [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
-  // Requests exceeding the limit should either be split into smaller
-  // chunks or downloaded using the
-  // [ByteStream API][google.bytestream.ByteStream], as appropriate.
-  //
-  // This request is equivalent to calling a Bytestream `Read` request
-  // on each individual blob, in parallel. The requests may succeed or fail
-  // independently.
-  //
-  // Errors:
-  //
-  // * `INVALID_ARGUMENT`: The client attempted to read more than the
-  //   server supported limit.
-  //
-  // Every error on individual read will be returned in the corresponding digest
-  // status.
-  rpc BatchReadBlobs(BatchReadBlobsRequest) returns (BatchReadBlobsResponse) {
-    option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:batchRead" body: "*" };
-  }
-
-  // Fetch the entire directory tree rooted at a node.
-  //
-  // This request must be targeted at a
-  // [Directory][build.bazel.remote.execution.v2.Directory] stored in the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-  // (CAS). The server will enumerate the `Directory` tree recursively and
-  // return every node descended from the root.
-  //
-  // The GetTreeRequest.page_token parameter can be used to skip ahead in
-  // the stream (e.g. when retrying a partially completed and aborted request),
-  // by setting it to a value taken from GetTreeResponse.next_page_token of the
-  // last successfully processed GetTreeResponse).
-  //
-  // The exact traversal order is unspecified and, unless retrieving subsequent
-  // pages from an earlier request, is not guaranteed to be stable across
-  // multiple invocations of `GetTree`.
-  //
-  // If part of the tree is missing from the CAS, the server will return the
-  // portion present and omit the rest.
-  //
-  // * `NOT_FOUND`: The requested tree root is not present in the CAS.
-  rpc GetTree(GetTreeRequest) returns (stream GetTreeResponse) {
-    option (google.api.http) = { get: "/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree" };
-  }
-}
-
-// The Capabilities service may be used by remote execution clients to query
-// various server properties, in order to self-configure or return meaningful
-// error messages.
-//
-// The query may include a particular `instance_name`, in which case the values
-// returned will pertain to that instance.
-service Capabilities {
-  // GetCapabilities returns the server capabilities configuration.
-  rpc GetCapabilities(GetCapabilitiesRequest) returns (ServerCapabilities) {
-    option (google.api.http) = {
-      get: "/v2/{instance_name=**}/capabilities"
-    };
-  }
-}
-
-// An `Action` captures all the information about an execution which is required
-// to reproduce it.
-//
-// `Action`s are the core component of the [Execution] service. A single
-// `Action` represents a repeatable action that can be performed by the
-// execution service. `Action`s can be succinctly identified by the digest of
-// their wire format encoding and, once an `Action` has been executed, will be
-// cached in the action cache. Future requests can then use the cached result
-// rather than needing to run afresh.
-//
-// When a server completes execution of an
-// [Action][build.bazel.remote.execution.v2.Action], it MAY choose to
-// cache the [result][build.bazel.remote.execution.v2.ActionResult] in
-// the [ActionCache][build.bazel.remote.execution.v2.ActionCache] unless
-// `do_not_cache` is `true`. Clients SHOULD expect the server to do so. By
-// default, future calls to
-// [Execute][build.bazel.remote.execution.v2.Execution.Execute] the same
-// `Action` will also serve their results from the cache. Clients must take care
-// to understand the caching behaviour. Ideally, all `Action`s will be
-// reproducible so that serving a result from cache is always desirable and
-// correct.
-message Action {
-  // The digest of the [Command][build.bazel.remote.execution.v2.Command]
-  // to run, which MUST be present in the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  Digest command_digest = 1;
-
-  // The digest of the root
-  // [Directory][build.bazel.remote.execution.v2.Directory] for the input
-  // files. The files in the directory tree are available in the correct
-  // location on the build machine before the command is executed. The root
-  // directory, as well as every subdirectory and content blob referred to, MUST
-  // be in the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  Digest input_root_digest = 2;
-
-  reserved 3 to 5; // Used for fields moved to [Command][build.bazel.remote.execution.v2.Command].
-
-  // A timeout after which the execution should be killed. If the timeout is
-  // absent, then the client is specifying that the execution should continue
-  // as long as the server will let it. The server SHOULD impose a timeout if
-  // the client does not specify one, however, if the client does specify a
-  // timeout that is longer than the server's maximum timeout, the server MUST
-  // reject the request.
-  //
-  // The timeout is a part of the
-  // [Action][build.bazel.remote.execution.v2.Action] message, and
-  // therefore two `Actions` with different timeouts are different, even if they
-  // are otherwise identical. This is because, if they were not, running an
-  // `Action` with a lower timeout than is required might result in a cache hit
-  // from an execution run with a longer timeout, hiding the fact that the
-  // timeout is too short. By encoding it directly in the `Action`, a lower
-  // timeout will result in a cache miss and the execution timeout will fail
-  // immediately, rather than whenever the cache entry gets evicted.
-  google.protobuf.Duration timeout = 6;
-
-  // If true, then the `Action`'s result cannot be cached, and in-flight
-  // requests for the same `Action` may not be merged.
-  bool do_not_cache = 7;
-}
-
-// A `Command` is the actual command executed by a worker running an
-// [Action][build.bazel.remote.execution.v2.Action] and specifications of its
-// environment.
-//
-// Except as otherwise required, the environment (such as which system
-// libraries or binaries are available, and what filesystems are mounted where)
-// is defined by and specific to the implementation of the remote execution API.
-message Command {
-  // An `EnvironmentVariable` is one variable to set in the running program's
-  // environment.
-  message EnvironmentVariable {
-    // The variable name.
-    string name = 1;
-
-    // The variable value.
-    string value = 2;
-  }
-
-  // The arguments to the command. The first argument must be the path to the
-  // executable, which must be either a relative path, in which case it is
-  // evaluated with respect to the input root, or an absolute path.
-  repeated string arguments = 1;
-
-  // The environment variables to set when running the program. The worker may
-  // provide its own default environment variables; these defaults can be
-  // overridden using this field. Additional variables can also be specified.
-  //
-  // In order to ensure that equivalent
-  // [Command][build.bazel.remote.execution.v2.Command]s always hash to the same
-  // value, the environment variables MUST be lexicographically sorted by name.
-  // Sorting of strings is done by code point, equivalently, by the UTF-8 bytes.
-  repeated EnvironmentVariable environment_variables = 2;
-
-  // A list of the output files that the client expects to retrieve from the
-  // action. Only the listed files, as well as directories listed in
-  // `output_directories`, will be returned to the client as output.
-  // Other files or directories that may be created during command execution
-  // are discarded.
-  //
-  // The paths are relative to the working directory of the action execution.
-  // The paths are specified using a single forward slash (`/`) as a path
-  // separator, even if the execution platform natively uses a different
-  // separator. The path MUST NOT include a trailing slash, nor a leading slash,
-  // being a relative path.
-  //
-  // In order to ensure consistent hashing of the same Action, the output paths
-  // MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
-  // bytes).
-  //
-  // An output file cannot be duplicated, be a parent of another output file, or
-  // have the same path as any of the listed output directories.
-  //
-  // Directories leading up to the output files are created by the worker prior
-  // to execution, even if they are not explicitly part of the input root.
-  repeated string output_files = 3;
-
-  // A list of the output directories that the client expects to retrieve from
-  // the action. Only the listed directories will be returned (an entire
-  // directory structure will be returned as a
-  // [Tree][build.bazel.remote.execution.v2.Tree] message digest, see
-  // [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory]), as
-  // well as files listed in `output_files`. Other files or directories that
-  // may be created during command execution are discarded.
-  //
-  // The paths are relative to the working directory of the action execution.
-  // The paths are specified using a single forward slash (`/`) as a path
-  // separator, even if the execution platform natively uses a different
-  // separator. The path MUST NOT include a trailing slash, nor a leading slash,
-  // being a relative path. The special value of empty string is allowed,
-  // although not recommended, and can be used to capture the entire working
-  // directory tree, including inputs.
-  //
-  // In order to ensure consistent hashing of the same Action, the output paths
-  // MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
-  // bytes).
-  //
-  // An output directory cannot be duplicated or have the same path as any of
-  // the listed output files.
-  //
-  // Directories leading up to the output directories (but not the output
-  // directories themselves) are created by the worker prior to execution, even
-  // if they are not explicitly part of the input root.
-  repeated string output_directories = 4;
-
-  // The platform requirements for the execution environment. The server MAY
-  // choose to execute the action on any worker satisfying the requirements, so
-  // the client SHOULD ensure that running the action on any such worker will
-  // have the same result.
-  Platform platform = 5;
-
-  // The working directory, relative to the input root, for the command to run
-  // in. It must be a directory which exists in the input tree. If it is left
-  // empty, then the action is run in the input root.
-  string working_directory = 6;
-}
-
-// A `Platform` is a set of requirements, such as hardware, operating system, or
-// compiler toolchain, for an
-// [Action][build.bazel.remote.execution.v2.Action]'s execution
-// environment. A `Platform` is represented as a series of key-value pairs
-// representing the properties that are required of the platform.
-message Platform {
-  // A single property for the environment. The server is responsible for
-  // specifying the property `name`s that it accepts. If an unknown `name` is
-  // provided in the requirements for an
-  // [Action][build.bazel.remote.execution.v2.Action], the server SHOULD
-  // reject the execution request. If permitted by the server, the same `name`
-  // may occur multiple times.
-  //
-  // The server is also responsible for specifying the interpretation of
-  // property `value`s. For instance, a property describing how much RAM must be
-  // available may be interpreted as allowing a worker with 16GB to fulfill a
-  // request for 8GB, while a property describing the OS environment on which
-  // the action must be performed may require an exact match with the worker's
-  // OS.
-  //
-  // The server MAY use the `value` of one or more properties to determine how
-  // it sets up the execution environment, such as by making specific system
-  // files available to the worker.
-  message Property {
-    // The property name.
-    string name = 1;
-
-    // The property value.
-    string value = 2;
-  }
-
-  // The properties that make up this platform. In order to ensure that
-  // equivalent `Platform`s always hash to the same value, the properties MUST
-  // be lexicographically sorted by name, and then by value. Sorting of strings
-  // is done by code point, equivalently, by the UTF-8 bytes.
-  repeated Property properties = 1;
-}
-
-// A `Directory` represents a directory node in a file tree, containing zero or
-// more children [FileNodes][build.bazel.remote.execution.v2.FileNode],
-// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode] and
-// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode].
-// Each `Node` contains its name in the directory, either the digest of its
-// content (either a file blob or a `Directory` proto) or a symlink target, as
-// well as possibly some metadata about the file or directory.
-//
-// In order to ensure that two equivalent directory trees hash to the same
-// value, the following restrictions MUST be obeyed when constructing a
-// a `Directory`:
-//
-// * Every child in the directory must have a path of exactly one segment.
-//   Multiple levels of directory hierarchy may not be collapsed.
-// * Each child in the directory must have a unique path segment (file name).
-//   Note that while the API itself is case-sensitive, the environment where
-//   the Action is executed may or may not be case-sensitive. That is, it is
-//   legal to call the API with a Directory that has both "Foo" and "foo" as
-//   children, but the Action may be rejected by the remote system upon
-//   execution.
-// * The files, directories and symlinks in the directory must each be sorted
-//   in lexicographical order by path. The path strings must be sorted by code
-//   point, equivalently, by UTF-8 bytes.
-//
-// A `Directory` that obeys the restrictions is said to be in canonical form.
-//
-// As an example, the following could be used for a file named `bar` and a
-// directory named `foo` with an executable file named `baz` (hashes shortened
-// for readability):
-//
-// ```json
-// // (Directory proto)
-// {
-//   files: [
-//     {
-//       name: "bar",
-//       digest: {
-//         hash: "4a73bc9d03...",
-//         size: 65534
-//       }
-//     }
-//   ],
-//   directories: [
-//     {
-//       name: "foo",
-//       digest: {
-//         hash: "4cf2eda940...",
-//         size: 43
-//       }
-//     }
-//   ]
-// }
-//
-// // (Directory proto with hash "4cf2eda940..." and size 43)
-// {
-//   files: [
-//     {
-//       name: "baz",
-//       digest: {
-//         hash: "b2c941073e...",
-//         size: 1294,
-//       },
-//       is_executable: true
-//     }
-//   ]
-// }
-// ```
-message Directory {
-  // The files in the directory.
-  repeated FileNode files = 1;
-
-  // The subdirectories in the directory.
-  repeated DirectoryNode directories = 2;
-
-  // The symlinks in the directory.
-  repeated SymlinkNode symlinks = 3;
-}
-
-// A `FileNode` represents a single file and associated metadata.
-message FileNode {
-  // The name of the file.
-  string name = 1;
-
-  // The digest of the file's content.
-  Digest digest = 2;
-
-  reserved 3; // Reserved to ensure wire-compatibility with `OutputFile`.
-
-  // True if file is executable, false otherwise.
-  bool is_executable = 4;
-}
-
-// A `DirectoryNode` represents a child of a
-// [Directory][build.bazel.remote.execution.v2.Directory] which is itself
-// a `Directory` and its associated metadata.
-message DirectoryNode {
-  // The name of the directory.
-  string name = 1;
-
-  // The digest of the
-  // [Directory][build.bazel.remote.execution.v2.Directory] object
-  // represented. See [Digest][build.bazel.remote.execution.v2.Digest]
-  // for information about how to take the digest of a proto message.
-  Digest digest = 2;
-}
-
-// A `SymlinkNode` represents a symbolic link.
-message SymlinkNode {
-  // The name of the symlink.
-  string name = 1;
-
-  // The target path of the symlink. The path separator is a forward slash `/`.
-  // The target path can be relative to the parent directory of the symlink or
-  // it can be an absolute path starting with `/`. Support for absolute paths
-  // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-  // API. The canonical form forbids the substrings `/./` and `//` in the target
-  // path. `..` components are allowed anywhere in the target path.
-  string target = 2;
-}
-
-// A content digest. A digest for a given blob consists of the size of the blob
-// and its hash. The hash algorithm to use is defined by the server, but servers
-// SHOULD use SHA-256.
-//
-// The size is considered to be an integral part of the digest and cannot be
-// separated. That is, even if the `hash` field is correctly specified but
-// `size_bytes` is not, the server MUST reject the request.
-//
-// The reason for including the size in the digest is as follows: in a great
-// many cases, the server needs to know the size of the blob it is about to work
-// with prior to starting an operation with it, such as flattening Merkle tree
-// structures or streaming it to a worker. Technically, the server could
-// implement a separate metadata store, but this results in a significantly more
-// complicated implementation as opposed to having the client specify the size
-// up-front (or storing the size along with the digest in every message where
-// digests are embedded). This does mean that the API leaks some implementation
-// details of (what we consider to be) a reasonable server implementation, but
-// we consider this to be a worthwhile tradeoff.
-//
-// When a `Digest` is used to refer to a proto message, it always refers to the
-// message in binary encoded form. To ensure consistent hashing, clients and
-// servers MUST ensure that they serialize messages according to the following
-// rules, even if there are alternate valid encodings for the same message:
-//
-// * Fields are serialized in tag order.
-// * There are no unknown fields.
-// * There are no duplicate fields.
-// * Fields are serialized according to the default semantics for their type.
-//
-// Most protocol buffer implementations will always follow these rules when
-// serializing, but care should be taken to avoid shortcuts. For instance,
-// concatenating two messages to merge them may produce duplicate fields.
-message Digest {
-  // The hash. In the case of SHA-256, it will always be a lowercase hex string
-  // exactly 64 characters long.
-  string hash = 1;
-
-  // The size of the blob, in bytes.
-  int64 size_bytes = 2;
-}
-
-// ExecutedActionMetadata contains details about a completed execution.
-message ExecutedActionMetadata {
-  // The name of the worker which ran the execution.
-  string worker = 1;
-
-  // When was the action added to the queue.
-  google.protobuf.Timestamp queued_timestamp = 2;
-
-  // When the worker received the action.
-  google.protobuf.Timestamp worker_start_timestamp = 3;
-
-  // When the worker completed the action, including all stages.
-  google.protobuf.Timestamp worker_completed_timestamp = 4;
-
-  // When the worker started fetching action inputs.
-  google.protobuf.Timestamp input_fetch_start_timestamp = 5;
-
-  // When the worker finished fetching action inputs.
-  google.protobuf.Timestamp input_fetch_completed_timestamp = 6;
-
-  // When the worker started executing the action command.
-  google.protobuf.Timestamp execution_start_timestamp = 7;
-
-  // When the worker completed executing the action command.
-  google.protobuf.Timestamp execution_completed_timestamp = 8;
-
-  // When the worker started uploading action outputs.
-  google.protobuf.Timestamp output_upload_start_timestamp = 9;
-
-  // When the worker finished uploading action outputs.
-  google.protobuf.Timestamp output_upload_completed_timestamp = 10;
-}
-
-// An ActionResult represents the result of an
-// [Action][build.bazel.remote.execution.v2.Action] being run.
-message ActionResult {
-  reserved 1; // Reserved for use as the resource name.
-
-  // The output files of the action. For each output file requested in the
-  // `output_files` field of the Action, if the corresponding file existed after
-  // the action completed, a single entry will be present either in this field,
-  // or in the output_file_symlinks field, if the file was a symbolic link to
-  // another file.
-  //
-  // If the action does not produce the requested output, or produces a
-  // directory where a regular file is expected or vice versa, then that output
-  // will be omitted from the list. The server is free to arrange the output
-  // list as desired; clients MUST NOT assume that the output list is sorted.
-  repeated OutputFile output_files = 2;
-
-  // The output files of the action that are symbolic links to other files. Those
-  // may be links to other output files, or input files, or even absolute paths
-  // outside of the working directory, if the server supports
-  // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
-  // For each output file requested in the `output_files` field of the Action,
-  // if the corresponding file existed after
-  // the action completed, a single entry will be present either in this field,
-  // or in the `output_files` field, if the file was not a symbolic link.
-  //
-  // If the action does not produce the requested output, or produces a
-  // directory where a regular file is expected or vice versa, then that output
-  // will be omitted from the list. The server is free to arrange the output
-  // list as desired; clients MUST NOT assume that the output list is sorted.
-  repeated OutputSymlink output_file_symlinks = 10;
-
-  // The output directories of the action. For each output directory requested
-  // in the `output_directories` field of the Action, if the corresponding
-  // directory existed after the action completed, a single entry will be
-  // present in the output list, which will contain the digest of a
-  // [Tree][build.bazel.remote.execution.v2.Tree] message containing the
-  // directory tree, and the path equal exactly to the corresponding Action
-  // output_directories member.
-  //
-  // As an example, suppose the Action had an output directory `a/b/dir` and the
-  // execution produced the following contents in `a/b/dir`: a file named `bar`
-  // and a directory named `foo` with an executable file named `baz`. Then,
-  // output_directory will contain (hashes shortened for readability):
-  //
-  // ```json
-  // // OutputDirectory proto:
-  // {
-  //   path: "a/b/dir"
-  //   tree_digest: {
-  //     hash: "4a73bc9d03...",
-  //     size: 55
-  //   }
-  // }
-  // // Tree proto with hash "4a73bc9d03..." and size 55:
-  // {
-  //   root: {
-  //     files: [
-  //       {
-  //         name: "bar",
-  //         digest: {
-  //           hash: "4a73bc9d03...",
-  //           size: 65534
-  //         }
-  //       }
-  //     ],
-  //     directories: [
-  //       {
-  //         name: "foo",
-  //         digest: {
-  //           hash: "4cf2eda940...",
-  //           size: 43
-  //         }
-  //       }
-  //     ]
-  //   }
-  //   children : {
-  //     // (Directory proto with hash "4cf2eda940..." and size 43)
-  //     files: [
-  //       {
-  //         name: "baz",
-  //         digest: {
-  //           hash: "b2c941073e...",
-  //           size: 1294,
-  //         },
-  //         is_executable: true
-  //       }
-  //     ]
-  //   }
-  // }
-  // ```
-  repeated OutputDirectory output_directories = 3;
-
-  // The output directories of the action that are symbolic links to other
-  // directories. Those may be links to other output directories, or input
-  // directories, or even absolute paths outside of the working directory,
-  // if the server supports
-  // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
-  // For each output directory requested in the `output_directories` field of
-  // the Action, if the directory file existed after
-  // the action completed, a single entry will be present either in this field,
-  // or in the `output_directories` field, if the directory was not a symbolic link.
-  //
-  // If the action does not produce the requested output, or produces a
-  // file where a directory is expected or vice versa, then that output
-  // will be omitted from the list. The server is free to arrange the output
-  // list as desired; clients MUST NOT assume that the output list is sorted.
-  repeated OutputSymlink output_directory_symlinks = 11;
-
-  // The exit code of the command.
-  int32 exit_code = 4;
-
-  // The standard output buffer of the action. The server will determine, based
-  // on the size of the buffer, whether to return it in raw form or to return
-  // a digest in `stdout_digest` that points to the buffer. If neither is set,
-  // then the buffer is empty. The client SHOULD NOT assume it will get one of
-  // the raw buffer or a digest on any given request and should be prepared to
-  // handle either.
-  bytes stdout_raw = 5;
-
-  // The digest for a blob containing the standard output of the action, which
-  // can be retrieved from the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  // See `stdout_raw` for when this will be set.
-  Digest stdout_digest = 6;
-
-  // The standard error buffer of the action. The server will determine, based
-  // on the size of the buffer, whether to return it in raw form or to return
-  // a digest in `stderr_digest` that points to the buffer. If neither is set,
-  // then the buffer is empty. The client SHOULD NOT assume it will get one of
-  // the raw buffer or a digest on any given request and should be prepared to
-  // handle either.
-  bytes stderr_raw = 7;
-
-  // The digest for a blob containing the standard error of the action, which
-  // can be retrieved from the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  // See `stderr_raw` for when this will be set.
-  Digest stderr_digest = 8;
-
-  // The details of the execution that originally produced this result.
-  ExecutedActionMetadata execution_metadata = 9;
-}
-
-// An `OutputFile` is similar to a
-// [FileNode][build.bazel.remote.execution.v2.FileNode], but it is used as an
-// output in an `ActionResult`. It allows a full file path rather than
-// only a name.
-//
-// `OutputFile` is binary-compatible with `FileNode`.
-message OutputFile {
-  // The full path of the file relative to the working directory, including the
-  // filename. The path separator is a forward slash `/`. Since this is a
-  // relative path, it MUST NOT begin with a leading forward slash.
-  string path = 1;
-
-  // The digest of the file's content.
-  Digest digest = 2;
-
-  reserved 3; // Used for a removed field in an earlier version of the API.
-
-  // True if file is executable, false otherwise.
-  bool is_executable = 4;
-}
-
-// A `Tree` contains all the
-// [Directory][build.bazel.remote.execution.v2.Directory] protos in a
-// single directory Merkle tree, compressed into one message.
-message Tree {
-  // The root directory in the tree.
-  Directory root = 1;
-
-  // All the child directories: the directories referred to by the root and,
-  // recursively, all its children. In order to reconstruct the directory tree,
-  // the client must take the digests of each of the child directories and then
-  // build up a tree starting from the `root`.
-  repeated Directory children = 2;
-}
-
-// An `OutputDirectory` is the output in an `ActionResult` corresponding to a
-// directory's full contents rather than a single file.
-message OutputDirectory {
-  // The full path of the directory relative to the working directory. The path
-  // separator is a forward slash `/`. Since this is a relative path, it MUST
-  // NOT begin with a leading forward slash. The empty string value is allowed,
-  // and it denotes the entire working directory.
-  string path = 1;
-
-  reserved 2; // Used for a removed field in an earlier version of the API.
-
-  // The digest of the encoded
-  // [Tree][build.bazel.remote.execution.v2.Tree] proto containing the
-  // directory's contents.
-  Digest tree_digest = 3;
-}
-
-// An `OutputSymlink` is similar to a
-// [Symlink][build.bazel.remote.execution.v2.SymlinkNode], but it is used as an
-// output in an `ActionResult`.
-//
-// `OutputSymlink` is binary-compatible with `SymlinkNode`.
-message OutputSymlink {
-  // The full path of the symlink relative to the working directory, including the
-  // filename. The path separator is a forward slash `/`. Since this is a
-  // relative path, it MUST NOT begin with a leading forward slash.
-  string path = 1;
-
-  // The target path of the symlink. The path separator is a forward slash `/`.
-  // The target path can be relative to the parent directory of the symlink or
-  // it can be an absolute path starting with `/`. Support for absolute paths
-  // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-  // API. The canonical form forbids the substrings `/./` and `//` in the target
-  // path. `..` components are allowed anywhere in the target path.
-  string target = 2;
-}
-
-// An `ExecutionPolicy` can be used to control the scheduling of the action.
-message ExecutionPolicy {
-  // The priority (relative importance) of this action. Generally, a lower value
-  // means that the action should be run sooner than actions having a greater
-  // priority value, but the interpretation of a given value is server-
-  // dependent. A priority of 0 means the *default* priority. Priorities may be
-  // positive or negative, and such actions should run later or sooner than
-  // actions having the default priority, respectively. The particular semantics
-  // of this field is up to the server. In particular, every server will have
-  // their own supported range of priorities, and will decide how these map into
-  // scheduling policy.
-  int32 priority = 1;
-}
-
-// A `ResultsCachePolicy` is used for fine-grained control over how action
-// outputs are stored in the CAS and Action Cache.
-message ResultsCachePolicy {
-  // The priority (relative importance) of this content in the overall cache.
-  // Generally, a lower value means a longer retention time or other advantage,
-  // but the interpretation of a given value is server-dependent. A priority of
-  // 0 means a *default* value, decided by the server.
-  //
-  // The particular semantics of this field is up to the server. In particular,
-  // every server will have their own supported range of priorities, and will
-  // decide how these map into retention/eviction policy.
-  int32 priority = 1;
-}
-
-// A request message for
-// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute].
-message ExecuteRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // If true, the action will be executed even if its result is already
-  // present in the [ActionCache][build.bazel.remote.execution.v2.ActionCache].
-  // The execution is still allowed to be merged with other in-flight executions
-  // of the same action, however - semantically, the service MUST only guarantee
-  // that the results of an execution with this field set were not visible
-  // before the corresponding execution request was sent.
-  // Note that actions from execution requests setting this field set are still
-  // eligible to be entered into the action cache upon completion, and services
-  // SHOULD overwrite any existing entries that may exist. This allows
-  // skip_cache_lookup requests to be used as a mechanism for replacing action
-  // cache entries that reference outputs no longer available or that are
-  // poisoned in any way.
-  // If false, the result may be served from the action cache.
-  bool skip_cache_lookup = 3;
-
-  reserved 2, 4, 5; // Used for removed fields in an earlier version of the API.
-
-  // The digest of the [Action][build.bazel.remote.execution.v2.Action] to
-  // execute.
-  Digest action_digest = 6;
-
-  // An optional policy for execution of the action.
-  // The server will have a default policy if this is not provided.
-  ExecutionPolicy execution_policy = 7;
-
-  // An optional policy for the results of this execution in the remote cache.
-  // The server will have a default policy if this is not provided.
-  // This may be applied to both the ActionResult and the associated blobs.
-  ResultsCachePolicy results_cache_policy = 8;
-}
-
-// A `LogFile` is a log stored in the CAS.
-message LogFile {
-  // The digest of the log contents.
-  Digest digest = 1;
-
-  // This is a hint as to the purpose of the log, and is set to true if the log
-  // is human-readable text that can be usefully displayed to a user, and false
-  // otherwise. For instance, if a command-line client wishes to print the
-  // server logs to the terminal for a failed action, this allows it to avoid
-  // displaying a binary file.
-  bool human_readable = 2;
-}
-
-// The response message for
-// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute],
-// which will be contained in the [response
-// field][google.longrunning.Operation.response] of the
-// [Operation][google.longrunning.Operation].
-message ExecuteResponse {
-  // The result of the action.
-  ActionResult result = 1;
-
-  // True if the result was served from cache, false if it was executed.
-  bool cached_result = 2;
-
-  // If the status has a code other than `OK`, it indicates that the action did
-  // not finish execution. For example, if the operation times out during
-  // execution, the status will have a `DEADLINE_EXCEEDED` code. Servers MUST
-  // use this field for errors in execution, rather than the error field on the
-  // `Operation` object.
-  //
-  // If the status code is other than `OK`, then the result MUST NOT be cached.
-  // For an error status, the `result` field is optional; the server may
-  // populate the output-, stdout-, and stderr-related fields if it has any
-  // information available, such as the stdout and stderr of a timed-out action.
-  google.rpc.Status status = 3;
-
-  // An optional list of additional log outputs the server wishes to provide. A
-  // server can use this to return execution-specific logs however it wishes.
-  // This is intended primarily to make it easier for users to debug issues that
-  // may be outside of the actual job execution, such as by identifying the
-  // worker executing the action or by providing logs from the worker's setup
-  // phase. The keys SHOULD be human readable so that a client can display them
-  // to a user.
-  map<string, LogFile> server_logs = 4;
-
-  // Freeform informational message with details on the execution of the action
-  // that may be displayed to the user upon failure or when requested explicitly.
-  string message = 5;
-}
-
-// Metadata about an ongoing
-// [execution][build.bazel.remote.execution.v2.Execution.Execute], which
-// will be contained in the [metadata
-// field][google.longrunning.Operation.response] of the
-// [Operation][google.longrunning.Operation].
-message ExecuteOperationMetadata {
-  // The current stage of execution.
-  enum Stage {
-    UNKNOWN = 0;
-
-    // Checking the result against the cache.
-    CACHE_CHECK = 1;
-
-    // Currently idle, awaiting a free machine to execute.
-    QUEUED = 2;
-
-    // Currently being executed by a worker.
-    EXECUTING = 3;
-
-    // Finished execution.
-    COMPLETED = 4;
-  }
-
-  Stage stage = 1;
-
-  // The digest of the [Action][build.bazel.remote.execution.v2.Action]
-  // being executed.
-  Digest action_digest = 2;
-
-  // If set, the client can use this name with
-  // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-  // standard output.
-  string stdout_stream_name = 3;
-
-  // If set, the client can use this name with
-  // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-  // standard error.
-  string stderr_stream_name = 4;
-}
-
-// A request message for
-// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution].
-message WaitExecutionRequest {
-  // The name of the [Operation][google.longrunning.Operation]
-  // returned by [Execute][build.bazel.remote.execution.v2.Execution.Execute].
-  string name = 1;
-}
-
-// A request message for
-// [ActionCache.GetActionResult][build.bazel.remote.execution.v2.ActionCache.GetActionResult].
-message GetActionResultRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The digest of the [Action][build.bazel.remote.execution.v2.Action]
-  // whose result is requested.
-  Digest action_digest = 2;
-}
-
-// A request message for
-// [ActionCache.UpdateActionResult][build.bazel.remote.execution.v2.ActionCache.UpdateActionResult].
-message UpdateActionResultRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The digest of the [Action][build.bazel.remote.execution.v2.Action]
-  // whose result is being uploaded.
-  Digest action_digest = 2;
-
-  // The [ActionResult][build.bazel.remote.execution.v2.ActionResult]
-  // to store in the cache.
-  ActionResult action_result = 3;
-
-  // An optional policy for the results of this execution in the remote cache.
-  // The server will have a default policy if this is not provided.
-  // This may be applied to both the ActionResult and the associated blobs.
-  ResultsCachePolicy results_cache_policy = 4;
-}
-
-// A request message for
-// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
-message FindMissingBlobsRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // A list of the blobs to check.
-  repeated Digest blob_digests = 2;
-}
-
-// A response message for
-// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
-message FindMissingBlobsResponse {
-  // A list of the blobs requested *not* present in the storage.
-  repeated Digest missing_blob_digests = 2;
-}
-
-// A request message for
-// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-message BatchUpdateBlobsRequest {
-  // A request corresponding to a single blob that the client wants to upload.
-  message Request {
-    // The digest of the blob. This MUST be the digest of `data`.
-    Digest digest = 1;
-
-    // The raw binary data.
-    bytes data = 2;
-  }
-
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The individual upload requests.
-  repeated Request requests = 2;
-}
-
-// A response message for
-// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-message BatchUpdateBlobsResponse {
-  // A response corresponding to a single blob that the client tried to upload.
-  message Response {
-    // The blob digest to which this response corresponds.
-    Digest digest = 1;
-
-    // The result of attempting to upload that blob.
-    google.rpc.Status status = 2;
-  }
-
-  // The responses to the requests.
-  repeated Response responses = 1;
-}
-
-// A request message for
-// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
-message BatchReadBlobsRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The individual blob digests.
-  repeated Digest digests = 2;
-}
-
-// A response message for
-// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
-message BatchReadBlobsResponse {
-  // A response corresponding to a single blob that the client tried to download.
-  message Response {
-    // The digest to which this response corresponds.
-    Digest digest = 1;
-
-    // The raw binary data.
-    bytes data = 2;
-
-    // The result of attempting to download that blob.
-    google.rpc.Status status = 3;
-  }
-
-  // The responses to the requests.
-  repeated Response responses = 1;
-}
-
-// A request message for
-// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
-message GetTreeRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-
-  // The digest of the root, which must be an encoded
-  // [Directory][build.bazel.remote.execution.v2.Directory] message
-  // stored in the
-  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  Digest root_digest = 2;
-
-  // A maximum page size to request. If present, the server will request no more
-  // than this many items. Regardless of whether a page size is specified, the
-  // server may place its own limit on the number of items to be returned and
-  // require the client to retrieve more items using a subsequent request.
-  int32 page_size = 3;
-
-  // A page token, which must be a value received in a previous
-  // [GetTreeResponse][build.bazel.remote.execution.v2.GetTreeResponse].
-  // If present, the server will use it to return the following page of results.
-  string page_token = 4;
-}
-
-// A response message for
-// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
-message GetTreeResponse {
-  // The directories descended from the requested root.
-  repeated Directory directories = 1;
-
-  // If present, signifies that there are more results which the client can
-  // retrieve by passing this as the page_token in a subsequent
-  // [request][build.bazel.remote.execution.v2.GetTreeRequest].
-  // If empty, signifies that this is the last page of results.
-  string next_page_token = 2;
-}
-
-// A request message for
-// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
-message GetCapabilitiesRequest {
-  // The instance of the execution system to operate against. A server may
-  // support multiple instances of the execution system (with their own workers,
-  // storage, caches, etc.). The server MAY require use of this field to select
-  // between them in an implementation-defined fashion, otherwise it can be
-  // omitted.
-  string instance_name = 1;
-}
-
-// A response message for
-// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
-message ServerCapabilities {
-  // Capabilities of the remote cache system.
-  CacheCapabilities cache_capabilities = 1;
-
-  // Capabilities of the remote execution system.
-  ExecutionCapabilities execution_capabilities = 2;
-
-  // Earliest RE API version supported, including deprecated versions.
-  build.bazel.semver.SemVer deprecated_api_version = 3;
-
-  // Earliest non-deprecated RE API version supported.
-  build.bazel.semver.SemVer low_api_version = 4;
-
-  // Latest RE API version supported.
-  build.bazel.semver.SemVer high_api_version = 5;
-}
-
-// The digest function used for converting values into keys for CAS and Action
-// Cache.
-enum DigestFunction {
-  // It is an error for the server to return this value.
-  UNKNOWN = 0;
-
-  // The Sha-256 digest function.
-  SHA256 = 1;
-
-  // The Sha-1 digest function.
-  SHA1 = 2;
-
-  // The MD5 digest function.
-  MD5 = 3;
-}
-
-// Describes the server/instance capabilities for updating the action cache.
-message ActionCacheUpdateCapabilities {
-  bool update_enabled = 1;
-}
-
-// Allowed values for priority in
-// [ResultsCachePolicy][google.devtools.remoteexecution.v2.ResultsCachePolicy]
-// Used for querying both cache and execution valid priority ranges.
-message PriorityCapabilities {
-  // Supported range of priorities, including boundaries.
-  message PriorityRange {
-    int32 min_priority = 1;
-    int32 max_priority = 2;
-  }
-  repeated PriorityRange priorities = 1;
-}
-
-// Capabilities of the remote cache system.
-message CacheCapabilities {
-  // Describes how the server treats absolute symlink targets.
-  enum SymlinkAbsolutePathStrategy {
-    UNKNOWN = 0;
-
-    // Server will return an `INVALID_ARGUMENT` on input symlinks with absolute
-    // targets.
-    // If an action tries to create an output symlink with an absolute target, a
-    // `FAILED_PRECONDITION` will be returned.
-    DISALLOWED = 1;
-
-    // Server will allow symlink targets to escape the input root tree, possibly
-    // resulting in non-hermetic builds.
-    ALLOWED = 2;
-  }
-
-  // All the digest functions supported by the remote cache.
-  // Remote cache may support multiple digest functions simultaneously.
-  repeated DigestFunction digest_function = 1;
-
-  // Capabilities for updating the action cache.
-  ActionCacheUpdateCapabilities action_cache_update_capabilities = 2;
-
-  // Supported cache priority range for both CAS and ActionCache.
-  PriorityCapabilities cache_priority_capabilities = 3;
-
-  // Maximum total size of blobs to be uploaded/downloaded using
-  // batch methods. A value of 0 means no limit is set, although
-  // in practice there will always be a message size limitation
-  // of the protocol in use, e.g. GRPC.
-  int64 max_batch_total_size_bytes = 4;
-
-  // Whether absolute symlink targets are supported.
-  SymlinkAbsolutePathStrategy symlink_absolute_path_strategy = 5;
-}
-
-// Capabilities of the remote execution system.
-message ExecutionCapabilities {
-  // Remote execution may only support a single digest function.
-  DigestFunction digest_function = 1;
-
-  // Whether remote execution is enabled for the particular server/instance.
-  bool exec_enabled = 2;
-
-  // Supported execution priority range.
-  PriorityCapabilities execution_priority_capabilities = 3;
-}
-
-// Details for the tool used to call the API.
-message ToolDetails {
-  // Name of the tool, e.g. bazel.
-  string tool_name = 1;
-
-  // Version of the tool used for the request, e.g. 5.0.3.
-  string tool_version = 2;
-}
-
-// An optional Metadata to attach to any RPC request to tell the server about an
-// external context of the request. The server may use this for logging or other
-// purposes. To use it, the client attaches the header to the call using the
-// canonical proto serialization:
-//
-// * name: `build.bazel.remote.execution.v2.requestmetadata-bin`
-// * contents: the base64 encoded binary `RequestMetadata` message.
-message RequestMetadata {
-  // The details for the tool invoking the requests.
-  ToolDetails tool_details = 1;
-
-  // An identifier that ties multiple requests to the same action.
-  // For example, multiple requests to the CAS, Action Cache, and Execution
-  // API are used in order to compile foo.cc.
-  string action_id = 2;
-
-  // An identifier that ties multiple actions together to a final result.
-  // For example, multiple actions are required to build and run foo_test.
-  string tool_invocation_id = 3;
-
-  // An identifier to tie multiple tool invocations together. For example,
-  // runs of foo_test, bar_test and baz_test on a post-submit of a given patch.
-  string correlated_invocations_id = 4;
-}
diff --git a/proto/remote-apis/build/bazel/semver/BUILD b/proto/remote-apis/build/bazel/semver/BUILD
deleted file mode 100644
index ee2a98c..0000000
--- a/proto/remote-apis/build/bazel/semver/BUILD
+++ /dev/null
@@ -1,13 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"])
-
-proto_library(
-    name = "semver_proto",
-    srcs = ["semver.proto"],
-)
-
-java_proto_library(
-    name = "semver_java_proto",
-    deps = [":semver_proto"],
-)
diff --git a/proto/remote-apis/build/bazel/semver/semver.pb.go b/proto/remote-apis/build/bazel/semver/semver.pb.go
deleted file mode 100644
index 1ffaca5..0000000
--- a/proto/remote-apis/build/bazel/semver/semver.pb.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: build/bazel/semver/semver.proto
-
-package semver
-
-import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	math "math"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-// The full version of a given tool.
-type SemVer struct {
-	// The major version, e.g 10 for 10.2.3.
-	Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
-	// The minor version, e.g. 2 for 10.2.3.
-	Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
-	// The patch version, e.g 3 for 10.2.3.
-	Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"`
-	// The pre-release version. Either this field or major/minor/patch fields
-	// must be filled. They are mutually exclusive. Pre-release versions are
-	// assumed to be earlier than any released versions.
-	Prerelease           string   `protobuf:"bytes,4,opt,name=prerelease,proto3" json:"prerelease,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *SemVer) Reset()         { *m = SemVer{} }
-func (m *SemVer) String() string { return proto.CompactTextString(m) }
-func (*SemVer) ProtoMessage()    {}
-func (*SemVer) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3d8602885cf21c73, []int{0}
-}
-
-func (m *SemVer) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SemVer.Unmarshal(m, b)
-}
-func (m *SemVer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SemVer.Marshal(b, m, deterministic)
-}
-func (m *SemVer) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SemVer.Merge(m, src)
-}
-func (m *SemVer) XXX_Size() int {
-	return xxx_messageInfo_SemVer.Size(m)
-}
-func (m *SemVer) XXX_DiscardUnknown() {
-	xxx_messageInfo_SemVer.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SemVer proto.InternalMessageInfo
-
-func (m *SemVer) GetMajor() int32 {
-	if m != nil {
-		return m.Major
-	}
-	return 0
-}
-
-func (m *SemVer) GetMinor() int32 {
-	if m != nil {
-		return m.Minor
-	}
-	return 0
-}
-
-func (m *SemVer) GetPatch() int32 {
-	if m != nil {
-		return m.Patch
-	}
-	return 0
-}
-
-func (m *SemVer) GetPrerelease() string {
-	if m != nil {
-		return m.Prerelease
-	}
-	return ""
-}
-
-func init() {
-	proto.RegisterType((*SemVer)(nil), "build.bazel.semver.SemVer")
-}
-
-func init() { proto.RegisterFile("build/bazel/semver/semver.proto", fileDescriptor_3d8602885cf21c73) }
-
-var fileDescriptor_3d8602885cf21c73 = []byte{
-	// 178 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0x2a, 0xcd, 0xcc,
-	0x49, 0xd1, 0x4f, 0x4a, 0xac, 0x4a, 0xcd, 0xd1, 0x2f, 0x4e, 0xcd, 0x2d, 0x4b, 0x2d, 0x82, 0x52,
-	0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x42, 0x60, 0x05, 0x7a, 0x60, 0x05, 0x7a, 0x10, 0x19,
-	0xa5, 0x2c, 0x2e, 0xb6, 0xe0, 0xd4, 0xdc, 0xb0, 0xd4, 0x22, 0x21, 0x11, 0x2e, 0xd6, 0xdc, 0xc4,
-	0xac, 0xfc, 0x22, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xd6, 0x20, 0x08, 0x07, 0x2c, 0x9a, 0x99, 0x97,
-	0x5f, 0x24, 0xc1, 0x04, 0x15, 0x05, 0x71, 0x40, 0xa2, 0x05, 0x89, 0x25, 0xc9, 0x19, 0x12, 0xcc,
-	0x10, 0x51, 0x30, 0x47, 0x48, 0x8e, 0x8b, 0xab, 0xa0, 0x28, 0xb5, 0x28, 0x35, 0x27, 0x35, 0xb1,
-	0x38, 0x55, 0x82, 0x45, 0x81, 0x51, 0x83, 0x33, 0x08, 0x49, 0xc4, 0xc9, 0x8d, 0x0b, 0x8b, 0x0b,
-	0x9c, 0xb8, 0x83, 0xc1, 0x74, 0x00, 0xc8, 0x89, 0x01, 0x8c, 0x51, 0x6c, 0x10, 0xe1, 0x45, 0x4c,
-	0xcc, 0xc1, 0xbe, 0x61, 0xab, 0x98, 0x84, 0x9c, 0xc0, 0x3a, 0x9c, 0xc0, 0x3a, 0x20, 0x2a, 0x93,
-	0xd8, 0xc0, 0xde, 0x31, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x49, 0x4e, 0xf3, 0x93, 0xf1, 0x00,
-	0x00, 0x00,
-}
diff --git a/proto/remote-apis/build/bazel/semver/semver.proto b/proto/remote-apis/build/bazel/semver/semver.proto
deleted file mode 100644
index 3b626b7..0000000
--- a/proto/remote-apis/build/bazel/semver/semver.proto
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Bazel Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto3";
-
-package build.bazel.semver;
-
-option csharp_namespace = "Build.Bazel.Semver";
-option go_package = "semver";
-option java_multiple_files = true;
-option java_outer_classname = "SemverProto";
-option java_package = "build.bazel.semver";
-option objc_class_prefix = "SMV";
-
-// The full version of a given tool.
-message SemVer {
-  // The major version, e.g 10 for 10.2.3.
-  int32 major = 1;
-
-  // The minor version, e.g. 2 for 10.2.3.
-  int32 minor = 2;
-
-  // The patch version, e.g 3 for 10.2.3.
-  int32 patch = 3;
-
-  // The pre-release version. Either this field or major/minor/patch fields
-  // must be filled. They are mutually exclusive. Pre-release versions are
-  // assumed to be earlier than any released versions.
-  string prerelease = 4;
-}
diff --git a/proto/remote-apis/doc.go b/proto/remote-apis/doc.go
deleted file mode 100644
index ad8ebba..0000000
--- a/proto/remote-apis/doc.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018 The Goma Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Package remoteapis comes from https://github.com/bazelbuild/remote-apis.
-// commit cfe8e540cbb424e3ebc649ddcbc91190f70e23a6
-package remoteapis
-
-//go:generate protoc -I.. -I. --go_out=plugins=grpc,Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,Mgoogle/longrunning/operations.proto=google.golang.org/genproto/googleapis/longrunning,Mgoogle/rpc/status.proto=google.golang.org/genproto/googleapis/rpc/status,Mbuild/bazel/semver/semver.proto=go.chromium.org/goma/server/proto/remote-apis/build/bazel/semver:. build/bazel/remote/execution/v2/remote_execution.proto
-//go:generate protoc -I. --go_out=plugins=grpc:. build/bazel/semver/semver.proto
diff --git a/remoteexec/adapter.go b/remoteexec/adapter.go
index d2de558..5be173e 100644
--- a/remoteexec/adapter.go
+++ b/remoteexec/adapter.go
@@ -10,12 +10,13 @@
 
 import (
 	"context"
+	"fmt"
 	"path"
 	"strings"
 	"sync"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 	"go.chromium.org/goma/server/server"
 
 	"github.com/golang/protobuf/proto"
@@ -259,35 +260,46 @@
 		return resp, nil
 	}
 	r.setupNewAction(ctx)
-	logger.Infof("setup %s", time.Since(t))
+
+	// Use this to collect all timestamps and then print on one line, regardless of where
+	// this function returns.
+	var timestamps []string
+	defer func() {
+		logger.Infof("%s", strings.Join(timestamps, ", "))
+	}()
+	addTimestamp := func(desc string, duration time.Duration) {
+		timestamps = append(timestamps, fmt.Sprintf("%s: %s", desc, duration))
+	}
+
+	addTimestamp("setup", time.Since(t))
 
 	eresp := &rpb.ExecuteResponse{}
 	var cached bool
 	eresp.Result, cached = r.checkCache(ctx)
-	var execStartTime time.Time
 	if !cached {
 		t = time.Now()
 		blobs := r.missingBlobs(ctx)
-		logger.Infof("check missing %s", time.Since(t))
+		addTimestamp("check missing", time.Since(t))
 		t = time.Now()
 		resp := r.uploadBlobs(ctx, blobs)
 		if resp != nil {
-			logger.Infof("fail fast for missing input: %s", time.Since(t))
+			addTimestamp("fail fast for missing input", time.Since(t))
 			return resp, nil
 		}
-		logger.Infof("upload blobs %s", time.Since(t))
+		addTimestamp("upload blobs", time.Since(t))
 
-		execStartTime = time.Now()
+		t = time.Now()
 		var err error
 		eresp, err = r.executeAction(ctx)
-		logger.Infof("execute %s: %v", time.Since(execStartTime), err)
+		addTimestamp("execute", time.Since(t))
 		if err != nil {
+			logger.Infof("execute err=%v", err)
 			return nil, err
 		}
 	}
 	t = time.Now()
 	resp, err = r.newResp(ctx, eresp, cached)
-	logger.Infof("response %s", time.Since(t))
-	logger.Infof("total %s", time.Since(t0))
+	addTimestamp("response", time.Since(t))
+	addTimestamp("total", time.Since(t0))
 	return resp, err
 }
diff --git a/remoteexec/adapter_test.go b/remoteexec/adapter_test.go
index b73275a..7ed49a9 100644
--- a/remoteexec/adapter_test.go
+++ b/remoteexec/adapter_test.go
@@ -14,16 +14,16 @@
 	"testing"
 	"time"
 
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 	"github.com/golang/protobuf/proto"
 	"github.com/google/go-cmp/cmp"
 	bpb "google.golang.org/genproto/googleapis/bytestream"
 
-	"go.chromium.org/goma/server/log"
 	gomapb "go.chromium.org/goma/server/proto/api"
 	cmdpb "go.chromium.org/goma/server/proto/command"
 	fpb "go.chromium.org/goma/server/proto/file"
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
 	"go.chromium.org/goma/server/remoteexec/cas"
+	"go.chromium.org/goma/server/remoteexec/digest"
 )
 
 func TestAdapterHandleMissingCompiler(t *testing.T) {
@@ -561,15 +561,15 @@
 }
 
 type fileState struct {
+	digest       *rpb.Digest
 	isFile       bool
 	isDir        bool
 	isExecutable bool
 }
 
 // TODO: implement this with GetTree?
-func dumpDirIter(ctx context.Context, bs bpb.ByteStreamClient, instance, dir string, d *rpb.Digest, files map[string]fileState) error {
-	logger := log.FromContext(ctx)
-	logger.Infof("dir:%s %s\n", dir, d)
+func dumpDirIter(ctx context.Context, t *testing.T, bs bpb.ByteStreamClient, instance, dir string, d *rpb.Digest, files map[string]fileState) error {
+	t.Logf("dir:%s %s", dir, d)
 
 	resname := cas.ResName(instance, d)
 	var buf bytes.Buffer
@@ -588,17 +588,18 @@
 	for _, f := range curdir.Files {
 		fname := filepath.Join(dir, f.Name)
 		files[fname] = fileState{
+			digest:       f.Digest,
 			isFile:       true,
 			isExecutable: f.IsExecutable,
 		}
-		logger.Infof("file:%s %s x:%t\n", fname, f.Digest, f.IsExecutable)
+		t.Logf("file:%s %s x:%t", fname, f.Digest, f.IsExecutable)
 	}
 	for _, subdir := range curdir.Directories {
 		dname := filepath.Join(dir, subdir.Name)
 		files[dname] = fileState{
 			isDir: true,
 		}
-		err := dumpDirIter(ctx, bs, instance, dname, subdir.Digest, files)
+		err := dumpDirIter(ctx, t, bs, instance, dname, subdir.Digest, files)
 		if err != nil {
 			return err
 		}
@@ -608,9 +609,9 @@
 
 // dumpDirs dumps file list and directory list.
 // The value of `files` means a file is executable or not.
-func dumpDir(ctx context.Context, bs bpb.ByteStreamClient, instance, dir string, d *rpb.Digest) (map[string]fileState, error) {
+func dumpDir(ctx context.Context, t *testing.T, bs bpb.ByteStreamClient, instance, dir string, d *rpb.Digest) (map[string]fileState, error) {
 	files := make(map[string]fileState)
-	err := dumpDirIter(ctx, bs, instance, dir, d, files)
+	err := dumpDirIter(ctx, t, bs, instance, dir, d, files)
 	if err != nil {
 		return nil, err
 	}
@@ -677,7 +678,7 @@
 	if action == nil {
 		t.Fatalf("gotAction is nil")
 	}
-	files, err := dumpDir(ctx, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
+	files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
 	if err != nil {
 		t.Fatalf("err %v", err)
 	}
@@ -726,7 +727,7 @@
 			"-c", "../../src/hello.c",
 			"-o", "hello.o",
 		},
-		Env: []string{},
+		Env: []string{"PWD=/b/c/w/out/Release"},
 		Cwd: proto.String("/b/c/w/out/Release"),
 		Input: []*gomapb.ExecReq_Input{
 			clangToolchainInput,
@@ -762,17 +763,40 @@
 		t.Errorf("Exec error=%v; want=%v", resp.GetError(), gomapb.ExecResp_OK)
 	}
 
+	command := cluster.rbe.gotCommand
+	if command == nil {
+		t.Fatal("gotCommand is nil")
+	}
+	wantArgs := []string{
+		"out/Release/run.sh",
+		"../../bin/clang", "-Iinclude",
+		"-c", "../../src/hello.c",
+		"-o", "hello.o",
+	}
+	if !cmp.Equal(command.Arguments, wantArgs) {
+		t.Errorf("arguments=%q; want=%q", command.Arguments, wantArgs)
+	}
+	wantEnvs := []*rpb.Command_EnvironmentVariable{
+		{
+			Name:  "WORK_DIR",
+			Value: "out/Release",
+		},
+	}
+	if !cmp.Equal(command.EnvironmentVariables, wantEnvs, cmp.Comparer(proto.Equal)) {
+		t.Errorf("environment_variables=%s; want=%s", command.EnvironmentVariables, wantEnvs)
+	}
+
 	action := cluster.rbe.gotAction
 	if action == nil {
 		t.Fatalf("gotAction is nil")
 	}
-	files, err := dumpDir(ctx, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
+	files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
 	if err != nil {
 		t.Fatalf("err %v", err)
 	}
 
 	// files and executables might contain extra "out/Release/run.sh".
-	wantFiles := []string{"bin/clang", "include/hello.h", "src/hello.c"}
+	wantFiles := []string{"out/Release/run.sh", "bin/clang", "include/hello.h", "src/hello.c"}
 	wantExecutables := []string{"bin/clang"}
 
 	for _, f := range wantFiles {
@@ -785,6 +809,146 @@
 			t.Errorf("%q was not an executable file, but should: files=%v", e, files)
 		}
 	}
+
+	if got, want := files["out/Release/run.sh"].digest, digest.Bytes("cwd-agnostic-wrapper-script", []byte(cwdAgnosticWrapperScript)).Digest(); !proto.Equal(got, want) {
+		t.Errorf("digest of out/Release/run.sh: %s != %s", got, want)
+	}
+}
+
+func TestAdaptorHandleArbitraryToolchainSupportNonCwdAgnostic(t *testing.T) {
+	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+	defer cancel()
+
+	cluster := &fakeCluster{
+		rbe: newFakeRBE(),
+	}
+	err := cluster.setup(ctx, cluster.rbe.instancePrefix)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer cluster.teardown()
+
+	// Instead of adding a new compiler, register toolchain platform.
+	err = cluster.pushPlatform(ctx, "docker://grpc.io/goma-dev/container-image@sha256:yyyy", []string{"os:linux"})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	var localFiles fakeLocalFiles
+	localFiles.Add("/b/c/w/bin/clang", randomBigSize())
+	localFiles.Add("/b/c/w/include/hello.h", randomSize())
+	localFiles.Add("/b/c/w/src/hello.c", randomSize())
+
+	clangToolchainInput := localFiles.mustInput(ctx, t, cluster.adapter.GomaFile, "/b/c/w/bin/clang", "../../bin/clang")
+	clangHashKey := localFiles.mustFileHash(ctx, t, "/b/c/w/bin/clang")
+
+	req := &gomapb.ExecReq{
+		CommandSpec: &gomapb.CommandSpec{
+			Name:              proto.String("clang"),
+			Version:           proto.String("1234"),
+			Target:            proto.String("x86-64-linux-gnu"),
+			BinaryHash:        []byte(clangHashKey),
+			LocalCompilerPath: proto.String("../../bin/clang"),
+		},
+		Arg: []string{
+			"../../bin/clang", "-Iinclude",
+			"-g", "-c", "../../src/hello.c",
+			"-o", "hello.o",
+		},
+		Env: []string{"PWD=/b/c/w/out/Debug"},
+		Cwd: proto.String("/b/c/w/out/Debug"),
+		Input: []*gomapb.ExecReq_Input{
+			clangToolchainInput,
+			localFiles.mustInput(ctx, t, cluster.adapter.GomaFile, "/b/c/w/include/hello.h", "../../include/hello.h"),
+			localFiles.mustInput(ctx, t, cluster.adapter.GomaFile, "/b/c/w/src/hello.c", "../../src/hello.c"),
+		},
+		Subprogram:        []*gomapb.SubprogramSpec{},
+		ToolchainIncluded: proto.Bool(true),
+		ToolchainSpecs: []*gomapb.ToolchainSpec{
+			&gomapb.ToolchainSpec{
+				Path:         proto.String("../../bin/clang"),
+				Hash:         proto.String(clangHashKey),
+				Size:         clangToolchainInput.Content.FileSize,
+				IsExecutable: proto.Bool(true),
+			},
+		},
+		RequesterInfo: &gomapb.RequesterInfo{
+			Dimensions: []string{
+				"os:linux",
+			},
+			PathStyle: gomapb.RequesterInfo_POSIX_STYLE.Enum(),
+		},
+		ExpectedOutputFiles: []string{
+			"hello.o",
+		},
+	}
+
+	resp, err := cluster.adapter.Exec(ctx, req)
+	if err != nil {
+		t.Fatalf("Exec(ctx, req)=%v; %v; want nil error", resp, err)
+	}
+	if resp.GetError() != gomapb.ExecResp_OK {
+		t.Errorf("Exec error=%v; want=%v", resp.GetError(), gomapb.ExecResp_OK)
+	}
+
+	command := cluster.rbe.gotCommand
+	if command == nil {
+		t.Fatal("gotCommand is nil")
+	}
+	wantArgs := []string{
+		"out/Debug/run.sh",
+		"../../bin/clang", "-Iinclude",
+		"-g", "-c", "../../src/hello.c",
+		"-o", "hello.o",
+	}
+	if !cmp.Equal(command.Arguments, wantArgs) {
+		t.Errorf("arguments=%q; want=%q", command.Arguments, wantArgs)
+	}
+	wantEnvs := []*rpb.Command_EnvironmentVariable{
+		{
+			Name:  "INPUT_ROOT_DIR",
+			Value: "/b/c/w",
+		},
+		{
+			Name:  "PWD",
+			Value: "/b/c/w/out/Debug",
+		},
+		{
+			Name:  "WORK_DIR",
+			Value: "out/Debug",
+		},
+	}
+	if !cmp.Equal(command.EnvironmentVariables, wantEnvs, cmp.Comparer(proto.Equal)) {
+		t.Errorf("environment_variables=%s; want=%s", command.EnvironmentVariables, wantEnvs)
+	}
+
+	action := cluster.rbe.gotAction
+	if action == nil {
+		t.Fatalf("gotAction is nil")
+	}
+	files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
+	if err != nil {
+		t.Fatalf("err %v", err)
+	}
+
+	// files and executables might contain extra "out/Release/run.sh".
+	wantFiles := []string{"out/Debug/run.sh", "bin/clang", "include/hello.h", "src/hello.c"}
+	wantExecutables := []string{"bin/clang"}
+
+	for _, f := range wantFiles {
+		if !files[f].isFile {
+			t.Errorf("%q was not found in files, but should: files=%v", f, files)
+		}
+	}
+	for _, e := range wantExecutables {
+		if !files[e].isExecutable {
+			t.Errorf("%q was not an executable file, but should: files=%v", e, files)
+		}
+	}
+
+	if got, want := files["out/Debug/run.sh"].digest, digest.Bytes("wrapper-script", []byte(wrapperScript)).Digest(); !proto.Equal(got, want) {
+		t.Errorf("digest of out/Debug/run.sh: %s != %s", got, want)
+	}
 }
 
 func TestAdapterDockerProperties(t *testing.T) {
diff --git a/remoteexec/cas/bytestream.go b/remoteexec/cas/bytestream.go
index 51cad18..0150c39 100644
--- a/remoteexec/cas/bytestream.go
+++ b/remoteexec/cas/bytestream.go
@@ -12,7 +12,7 @@
 	"strings"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/google/uuid"
 	"go.opencensus.io/trace"
diff --git a/remoteexec/cas/cas.go b/remoteexec/cas/cas.go
index 0e5cf0d..408a89b 100644
--- a/remoteexec/cas/cas.go
+++ b/remoteexec/cas/cas.go
@@ -14,7 +14,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	bpb "google.golang.org/genproto/googleapis/bytestream"
 
diff --git a/remoteexec/client.go b/remoteexec/client.go
index 3d58fbf..9eaae09 100644
--- a/remoteexec/client.go
+++ b/remoteexec/client.go
@@ -8,7 +8,7 @@
 	"context"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/golang/protobuf/ptypes"
@@ -149,6 +149,20 @@
 	return rpb.NewCapabilitiesClient(c.ClientConn).GetCapabilities(ctx, req, c.callOptions(opts...)...)
 }
 
+func logOpMetadata(logger log.Logger, op *lpb.Operation) {
+	if op.GetMetadata() == nil {
+		logger.Infof("operation update: no metadata")
+		return
+	}
+	md := &rpb.ExecuteOperationMetadata{}
+	err := ptypes.UnmarshalAny(op.GetMetadata(), md)
+	if err != nil {
+		logger.Warnf("operation update: %s: metadata bad type %T: %v", op.GetName(), op.GetMetadata(), err)
+		return
+	}
+	logger.Infof("operation update: %s: %v", op.GetName(), md)
+}
+
 // ExecuteAndWait executes and action remotely and wait its response.
 // it returns operation name, response and error.
 func ExecuteAndWait(ctx context.Context, c Client, req *rpb.ExecuteRequest, opts ...grpc.CallOption) (string, *rpb.ExecuteResponse, error) {
@@ -199,13 +213,7 @@
 				logger.Infof("operation starts: %s", opName)
 			}
 			if !op.GetDone() {
-				md := &rpb.ExecuteOperationMetadata{}
-				err = ptypes.UnmarshalAny(op.GetMetadata(), md)
-				if err != nil {
-					logger.Warnf("operation update: %s: metadata bad type %T: %v", op.GetName(), op.GetMetadata(), err)
-				} else {
-					logger.Infof("operation update: %s: %v", op.GetName(), md)
-				}
+				logOpMetadata(logger, op)
 				waitReq = &rpb.WaitExecutionRequest{
 					Name: opName,
 				}
diff --git a/remoteexec/cmdfile.go b/remoteexec/cmdfile.go
index ca5f58e..8760248 100644
--- a/remoteexec/cmdfile.go
+++ b/remoteexec/cmdfile.go
@@ -9,7 +9,7 @@
 	"fmt"
 	"io"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	pb "go.chromium.org/goma/server/proto/command"
 	"go.chromium.org/goma/server/remoteexec/digest"
diff --git a/remoteexec/cmdfile_test.go b/remoteexec/cmdfile_test.go
index c959a59..3bc359a 100644
--- a/remoteexec/cmdfile_test.go
+++ b/remoteexec/cmdfile_test.go
@@ -10,7 +10,7 @@
 	"reflect"
 	"testing"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	pb "go.chromium.org/goma/server/proto/command"
 	"go.chromium.org/goma/server/remoteexec/digest"
diff --git a/remoteexec/digest/digest.go b/remoteexec/digest/digest.go
index ca9401d..c912ce8 100644
--- a/remoteexec/digest/digest.go
+++ b/remoteexec/digest/digest.go
@@ -11,7 +11,7 @@
 	"fmt"
 	"io"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 
diff --git a/remoteexec/digest/digest_cache.go b/remoteexec/digest/digest_cache.go
index e1e31e9..2e28afc 100644
--- a/remoteexec/digest/digest_cache.go
+++ b/remoteexec/digest/digest_cache.go
@@ -10,7 +10,7 @@
 	"sync"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 
diff --git a/remoteexec/digest/digest_store.go b/remoteexec/digest/digest_store.go
index 8bed4b9..785a24a 100644
--- a/remoteexec/digest/digest_store.go
+++ b/remoteexec/digest/digest_store.go
@@ -3,7 +3,7 @@
 package digest
 
 import (
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 )
 
 type digestKey struct {
diff --git a/remoteexec/exec.go b/remoteexec/exec.go
index 5af9be4..67eaff1 100644
--- a/remoteexec/exec.go
+++ b/remoteexec/exec.go
@@ -15,7 +15,7 @@
 	"sync"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/golang/protobuf/ptypes"
@@ -58,16 +58,20 @@
 	action       *rpb.Action
 	actionDigest *rpb.Digest
 
+	needOverlay bool
+
 	err error
 }
 
 type clientFilePath interface {
 	IsAbs(path string) bool
+	Base(path string) string
 	Dir(path string) string
 	Join(elem ...string) string
 	Rel(basepath, targpath string) (string, error)
 	Clean(path string) string
 	SplitElem(path string) []string
+	PathSep() string
 }
 
 func doNotCache(req *gomapb.ExecReq) bool {
@@ -230,7 +234,7 @@
 		r.gomaResp.ErrorMessage = append(r.gomaResp.ErrorMessage, fmt.Sprintf("bad input: %v", err))
 		return r.gomaResp
 	}
-	rootDir, err := inputRootDir(r.filepath, inputPaths)
+	rootDir, needOverlay, err := inputRootDir(r.filepath, inputPaths, false)
 	if err != nil {
 		logger.Errorf("input root detection failed: %v", err)
 		logFileList(logger, "input paths", inputPaths)
@@ -239,6 +243,7 @@
 		return r.gomaResp
 	}
 	r.tree = merkletree.New(r.filepath, rootDir, r.digestStore)
+	r.needOverlay = needOverlay
 
 	logger.Infof("new input tree cwd:%s root:%s %s", r.gomaReq.GetCwd(), r.tree.RootDir(), r.cmdConfig.GetCmdDescriptor().GetSetup().GetPathType())
 	gi := gomaInput{
@@ -581,23 +586,33 @@
 		wd = "."
 	}
 	envs := []string{fmt.Sprintf("WORK_DIR=%s", wd)}
-	var data digest.Data
-	wrapperName := ""
+
+	// The developer of this program can make multiple wrapper scripts
+	// to be used by adding wrapperDesc instances to `wrappers`.
+	// However, only the first one is called in the command line.
+	// The other scripts should be called from the first wrapper script.
+	type wrapperDesc struct {
+		name string
+		data digest.Data
+	}
+	var wrappers []wrapperDesc
+
 	args := buildArgs(ctx, cmdConfig, argv0, r.gomaReq)
 
 	pathType := cmdConfig.GetCmdDescriptor().GetSetup().GetPathType()
 	switch pathType {
 	case cmdpb.CmdDescriptor_POSIX:
+		var d digest.Data
 		err = cwdAgnosticReq(ctx, cmdConfig, r.filepath, r.gomaReq.Arg, r.gomaReq.Env)
 		if err != nil {
 			logger.Infof("non cwd agnostic: %v", err)
-			data = digest.Bytes("wrapper-script", []byte(wrapperScript))
+			d = digest.Bytes("wrapper-script", []byte(wrapperScript))
 			envs = append(envs, fmt.Sprintf("INPUT_ROOT_DIR=%s", r.tree.RootDir()))
 			envs = append(envs, r.gomaReq.Env...)
 			r.addPlatformProperty(ctx, "dockerSiblingContainers", "true")
 		} else {
 			logger.Infof("cwd agnostic")
-			data = digest.Bytes("cwd-agnostic-wrapper-script", []byte(cwdAgnosticWrapperScript))
+			d = digest.Bytes("cwd-agnostic-wrapper-script", []byte(cwdAgnosticWrapperScript))
 			for _, e := range r.gomaReq.Env {
 				if strings.HasPrefix(e, "PWD=") {
 					// PWD is usually absolute path.
@@ -608,36 +623,61 @@
 				envs = append(envs, e)
 			}
 		}
-		wrapperName = "run.sh"
+		wrappers = []wrapperDesc{
+			{
+				name: "run.sh",
+				data: d,
+			},
+		}
 
 	case cmdpb.CmdDescriptor_WINDOWS:
-		wrapperName, data, err = wrapperForWindows(ctx)
+		wn, data, err := wrapperForWindows(ctx)
+		if err != nil {
+			return err
+		}
+		wrappers = []wrapperDesc{
+			{
+				name: wn,
+				data: data,
+			},
+		}
+
+	default:
+		return fmt.Errorf("bad path type: %v", pathType)
+	}
+
+	// Only the first one is called in the command line via storing
+	// `wrapperPath` in `r.args` later.
+	wrapperPath := ""
+	for i, w := range wrappers {
+		wp, err := rootRel(r.filepath, w.name, r.gomaReq.GetCwd(), r.tree.RootDir())
 		if err != nil {
 			return err
 		}
 
-	default:
-		return fmt.Errorf("Bad path type: %v", pathType)
+		logger.Infof("wrapper (%d) %s => %v", i, wp, w.data.Digest())
+		r.tree.Set(merkletree.Entry{
+			Name:         wp,
+			Data:         w.data,
+			IsExecutable: true,
+		})
+		if wrapperPath == "" {
+			wrapperPath = wp
+		}
 	}
 
-	wrapperPath, err := rootRel(r.filepath, wrapperName, r.gomaReq.GetCwd(), r.tree.RootDir())
-	if err != nil {
-		return err
-	}
-
-	logger.Infof("wrapper %s => %v", wrapperPath, data.Digest())
-	r.tree.Set(merkletree.Entry{
-		Name:         wrapperPath,
-		Data:         data,
-		IsExecutable: true,
-	})
-
 	r.envs = envs
 
-	// if run.sh exists in cwd, `wrapper` is resolved as run.sh. However,
-	// it cannot be callable. It should be like ./run.sh
-	if wrapperPath == "run.sh" {
-		wrapperPath = "./run.sh"
+	// if a wrapper exists in cwd, `wrapper` does not have a directory name.
+	// It cannot be callable on POSIX because POSIX do not contain "." in
+	// its PATH.  Although "." is included in PATH on Windows, there can be
+	// a risk unexpected scripts with the same name would be called.
+	// Let's avoid the situation with explicitly specifying the directory
+	// name i.e. ".".
+	if r.filepath.Base(wrapperPath) == wrapperPath {
+		// Since Join omit "." and this is only the case Join must not
+		// omit ".", we need to join by ourselves here.
+		wrapperPath = "." + r.filepath.PathSep() + wrapperPath
 	}
 	r.args = append([]string{wrapperPath}, args...)
 	return nil
diff --git a/remoteexec/fake_cluster_for_test.go b/remoteexec/fake_cluster_for_test.go
index 1e8f49e..fa7803e 100644
--- a/remoteexec/fake_cluster_for_test.go
+++ b/remoteexec/fake_cluster_for_test.go
@@ -15,7 +15,7 @@
 	"testing"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"google.golang.org/grpc"
diff --git a/remoteexec/fake_rbe_for_test.go b/remoteexec/fake_rbe_for_test.go
index 555f2a7..af95f4a 100644
--- a/remoteexec/fake_rbe_for_test.go
+++ b/remoteexec/fake_rbe_for_test.go
@@ -15,8 +15,8 @@
 	"strings"
 	"sync"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
-	sempb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/semver"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
+	sempb "github.com/bazelbuild/remote-apis/build/bazel/semver"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/golang/protobuf/ptypes"
diff --git a/remoteexec/fake_rbe_test.go b/remoteexec/fake_rbe_test.go
index 1f547c7..325a621 100644
--- a/remoteexec/fake_rbe_test.go
+++ b/remoteexec/fake_rbe_test.go
@@ -15,7 +15,7 @@
 	"testing"
 	"time"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/go-cmp/cmp"
diff --git a/remoteexec/gomaoutput.go b/remoteexec/gomaoutput.go
index 81eb070..cd177b9 100644
--- a/remoteexec/gomaoutput.go
+++ b/remoteexec/gomaoutput.go
@@ -12,7 +12,7 @@
 	"io"
 	"os"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"go.opencensus.io/trace"
diff --git a/remoteexec/gomaoutput_test.go b/remoteexec/gomaoutput_test.go
index 69a8260..4dc4681 100644
--- a/remoteexec/gomaoutput_test.go
+++ b/remoteexec/gomaoutput_test.go
@@ -9,7 +9,7 @@
 	"path"
 	"testing"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/go-cmp/cmp"
diff --git a/remoteexec/inputroot.go b/remoteexec/inputroot.go
index ac72955..1130fc4 100644
--- a/remoteexec/inputroot.go
+++ b/remoteexec/inputroot.go
@@ -28,7 +28,7 @@
 
 func commonDir(filepath clientFilePath, paths []string) string {
 	if len(paths) == 0 {
-		return "/"
+		return ""
 	}
 	path := filepath.SplitElem(paths[0])
 	for _, p := range paths[1:] {
@@ -73,24 +73,59 @@
 	return paths, nil
 }
 
-func inputRootDir(filepath clientFilePath, paths []string) (string, error) {
-	root := commonDir(filepath, paths)
-	err := checkInputRootDir(filepath, root)
-	if err != nil {
-		return "", err
-	}
-	return root, nil
-}
-
-func checkInputRootDir(filepath clientFilePath, dir string) error {
+// validCommonDir takes a path `dir` generated by commonDir() and returns
+// true if it represents a valid common path.
+func validCommonDir(filepath clientFilePath, dir string) bool {
 	if dir == "" {
-		return errors.New("no common paths in inputs")
+		return false
 	}
 	switch filepath.(type) {
 	case posixpath.FilePath:
 		if dir == "/" {
-			return errors.New("no common paths in inputs")
+			return false
 		}
+	case winpath.FilePath:
+		// TODO: check for win path.
+		return true
+
+	default:
+		// unknown filepath?
+		return true
+	}
+
+	return true
+}
+
+// needOverlay returns true if overlayfs is needed to run the task with
+// given common `dir`
+func needOverlay(filepath clientFilePath, dir string) bool {
+	return !validCommonDir(filepath, dir)
+}
+
+// getPathsWithNoCommonDir returns two or more paths from the input paths that
+// don't have a common dir above the root directory. If there is a common dir,
+// then returns an empty array. Does not guarantee any kind of order.
+func getPathsWithNoCommonDir(filepath clientFilePath, paths []string) []string {
+	if len(paths) < 2 {
+		return nil
+	}
+
+	p0 := paths[0]
+	// If there are any pairs of paths in `paths` that have no common directories,
+	// then there should be a mismatch between paths[0] and paths[i] for some i > 0.
+	for _, p1 := range paths[1:] {
+		pair := []string{p0, p1}
+		dir := commonDir(filepath, pair)
+		if !validCommonDir(filepath, dir) {
+			return pair
+		}
+	}
+	return nil
+}
+
+func checkInputRootDir(filepath clientFilePath, dir string) error {
+	switch filepath.(type) {
+	case posixpath.FilePath:
 		// if dir covers these paths, command (e.g. clang) won't
 		// work because required *.so etc would not be accessible.
 		for _, p := range []string{
@@ -114,6 +149,33 @@
 	}
 }
 
+// inputRootDir returns common root of paths.
+// If second return value is true, overlayfs must be used.  It become true only
+// if `allowOverlay` is true and common input root is "/".
+func inputRootDir(filepath clientFilePath, paths []string, allowOverlay bool) (string, bool, error) {
+	root := commonDir(filepath, paths)
+	if needOverlay(filepath, root) && allowOverlay {
+		switch filepath.(type) {
+		// TODO: support non-posix platform
+		case posixpath.FilePath:
+			err := verifyPathsForOverlay(paths)
+			if err != nil {
+				return "", false, err
+			}
+			return "/", true, nil
+		}
+	}
+	if !validCommonDir(filepath, root) {
+		pair := getPathsWithNoCommonDir(filepath, paths)
+		return "", false, fmt.Errorf("no common paths in inputs: %v", pair)
+	}
+	err := checkInputRootDir(filepath, root)
+	if err != nil {
+		return "", false, err
+	}
+	return root, false, nil
+}
+
 var errOutOfRoot = errors.New("out of root")
 
 // rootRel returns relative path from rootDir for fname,
@@ -147,3 +209,42 @@
 	}
 	return relname, nil
 }
+
+// hasPrefixDir returns true if p has prefix as a directory name.
+// Note: it is case sensitive.
+// TODO: support non-posix platforms.
+func hasPrefixDir(p, prefix string) bool {
+	prefix = strings.TrimRight(prefix, "/")
+	if !strings.HasPrefix(p, prefix) {
+		return false
+	}
+	if len(p) == len(prefix) {
+		return true
+	}
+	return p[len(prefix)] == '/'
+}
+
+// verifyPathsForOverlay verifies paths won't overwrite files including libs
+// used by docker or internal work directory.
+// It returns nil for success, and error for failure.
+// TODO: support non-posix platforms.
+func verifyPathsForOverlay(paths []string) error {
+	blacklist := []string{
+		// for docker
+		"/bin",
+		"/sbin",
+		"/lib",
+		"/lib64",
+		"/dev",
+		// for internal work directory.
+		"/workdir",
+	}
+	for _, p := range paths {
+		for _, b := range blacklist {
+			if hasPrefixDir(p, b) {
+				return fmt.Errorf("%s contains blacklisted dir: %s", p, b)
+			}
+		}
+	}
+	return nil
+}
diff --git a/remoteexec/inputroot_test.go b/remoteexec/inputroot_test.go
index c415ba7..9821526 100644
--- a/remoteexec/inputroot_test.go
+++ b/remoteexec/inputroot_test.go
@@ -5,6 +5,7 @@
 package remoteexec
 
 import (
+	"reflect"
 	"testing"
 
 	"github.com/golang/protobuf/proto"
@@ -13,14 +14,90 @@
 	gomapb "go.chromium.org/goma/server/proto/api"
 )
 
+func TestGetPathsWithNoCommonDir(t *testing.T) {
+	for _, tc := range []struct {
+		desc  string
+		paths []string
+		want  []string
+	}{
+		{
+			desc: "empty",
+			// paths: nil,
+			// want:  nil,
+		},
+		{
+			desc:  "single",
+			paths: []string{"/foo"},
+			// want:  nil,
+		},
+		{
+			desc: "has common dir",
+			paths: []string{
+				"/foo/bar1",
+				"/foo/local/bar2",
+				"/foo/bar3",
+			},
+			// want: nil,
+		},
+		{
+			desc: "no common dir #0",
+			paths: []string{
+				"/foo",
+				"/goo/local/baz",
+				"/goo/",
+				"/foo/local/bar2",
+				"/foo/bar3",
+			},
+			want: []string{
+				"/foo",
+				"/goo/local/baz",
+			},
+		},
+		{
+			desc: "no common dir #1",
+			paths: []string{
+				"/foo/local/bar2",
+				"/foo",
+				"/goo/",
+				"/goo/local/baz",
+				"/foo/bar3",
+			},
+			want: []string{
+				"/foo/local/bar2",
+				"/goo/",
+			},
+		},
+		{
+			desc: "no common dir #2",
+			paths: []string{
+				"/goo",
+				"/bar",
+				"/baz/",
+				"/foo",
+			},
+			want: []string{
+				"/goo",
+				"/bar",
+			},
+		},
+	} {
+		got := getPathsWithNoCommonDir(posixpath.FilePath{}, tc.paths)
+		if !reflect.DeepEqual(got, tc.want) {
+			t.Errorf("test case %s: getPathsWithNoCommonDir(paths=%v)=%v; want %v", tc.desc, tc.paths, got, tc.want)
+		}
+	}
+}
+
 func TestInputRootDir(t *testing.T) {
 	for _, tc := range []struct {
-		desc        string
-		req         *gomapb.ExecReq
-		argv0       string
-		want        string
-		wantPathErr bool
-		wantRootErr bool
+		desc         string
+		req          *gomapb.ExecReq
+		argv0        string
+		allowOverlay bool
+		want         string
+		wantOverlay  bool
+		wantPathErr  bool
+		wantRootErr  bool
 	}{
 		{
 			desc: "basic",
@@ -174,6 +251,21 @@
 			argv0:       "../../third_party/llvm-build/Release+Asserts/bin/clang++",
 			wantRootErr: true,
 		},
+		{
+			desc: "wantOverlay for /usr",
+			req: &gomapb.ExecReq{
+				Cwd: proto.String("/home/foo/src/out/Release"),
+				Input: []*gomapb.ExecReq_Input{
+					&gomapb.ExecReq_Input{
+						Filename: proto.String("/usr/include/config.h"),
+					},
+				},
+			},
+			argv0:        "../../third_party/llvm-build/Release+Asserts/bin/clang++",
+			want:         "/",
+			allowOverlay: true,
+			wantOverlay:  true,
+		},
 	} {
 		t.Logf("test case: %s", tc.desc)
 		paths, err := inputPaths(posixpath.FilePath{}, tc.req, tc.argv0)
@@ -186,15 +278,15 @@
 		if err != nil {
 			t.Errorf("inputPaths(req, %q)=%v, %v; want nil error", tc.argv0, paths, err)
 		}
-		got, err := inputRootDir(posixpath.FilePath{}, paths)
+		got, overlay, err := inputRootDir(posixpath.FilePath{}, paths, tc.allowOverlay)
 		if tc.wantRootErr {
 			if err == nil {
-				t.Errorf("inputRootDir(files)=%v, nil; want err", got)
+				t.Errorf("inputRootDir(files)=%v, %t, nil; want err", got, overlay)
 			}
 			continue
 		}
-		if err != nil || got != tc.want {
-			t.Errorf("inputRootDir(files)=%v, %v; want %v, nil", got, err, tc.want)
+		if err != nil || got != tc.want || overlay != tc.wantOverlay {
+			t.Errorf("inputRootDir(files)=%v, %t, %v; want %v, %t, nil", got, overlay, err, tc.want, tc.wantOverlay)
 		}
 	}
 }
@@ -272,3 +364,122 @@
 		}
 	}
 }
+
+func TestHasPrefixDir(t *testing.T) {
+	for _, tc := range []struct {
+		p, prefix string
+		want      bool
+	}{
+		{
+			p:      "/home/foo/bar",
+			prefix: "/home/foo",
+			want:   true,
+		},
+		{
+			p:      "/home/foo",
+			prefix: "/home/foo",
+			want:   true,
+		},
+		{
+			p:      "/home/foo/",
+			prefix: "/home/foo",
+			want:   true,
+		},
+		// hasPrefixDir trim "/" in `prefix`
+		{
+			p:      "/home/foo",
+			prefix: "/home/foo////////////////",
+			want:   true,
+		},
+		{
+			p:      "/foo",
+			prefix: "/bar",
+			want:   false,
+		},
+		{
+			p:      "/foo/bar",
+			prefix: "/bar",
+			want:   false,
+		},
+		{
+			p:      "/foo",
+			prefix: "/bar/baz",
+			want:   false,
+		},
+		{
+			p:      "/foo",
+			prefix: "/foo/bar",
+			want:   false,
+		},
+		{
+			p:      "/home/foobar",
+			prefix: "/home/foo",
+			want:   false,
+		},
+
+		{
+			p:      "home/foo",
+			prefix: "home/foo",
+			want:   true,
+		},
+		{
+			p:      "home/foo/bar",
+			prefix: "home/foo",
+			want:   true,
+		},
+	} {
+		got := hasPrefixDir(tc.p, tc.prefix)
+		if got != tc.want {
+			t.Errorf("hasPrefixDir(%s,%s) = %t; want %t", tc.p, tc.prefix, got, tc.want)
+		}
+	}
+}
+
+func TestVerifyPathsForOverlay(t *testing.T) {
+	for _, tc := range []struct {
+		paths     []string
+		wantError bool
+	}{
+		{
+			paths:     []string{"/home/foo/"},
+			wantError: false,
+		},
+		{
+			paths:     []string{"/bin/sh"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/sbin/shutdown"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/lib/libc.so.6"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/lib64/ld-linux-x86-64.so.2"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/dev/urandom"},
+			wantError: true,
+		},
+		{
+			paths:     []string{"/workdir"},
+			wantError: true,
+		},
+		// has non-blacklist and blacklist.
+		{
+			paths:     []string{"/home", "/workdir"},
+			wantError: true,
+		},
+	} {
+		err := verifyPathsForOverlay(tc.paths)
+		if err == nil && tc.wantError {
+			t.Errorf("verifyPathsForOverlay(%q) = nil; want error", tc.paths)
+		}
+		if err != nil && !tc.wantError {
+			t.Errorf("verifyPathsForOverlay(%q) = %v; want nil", tc.paths, err)
+		}
+	}
+}
diff --git a/remoteexec/merkletree/merkletree.go b/remoteexec/merkletree/merkletree.go
index 3911715..773ef6d 100644
--- a/remoteexec/merkletree/merkletree.go
+++ b/remoteexec/merkletree/merkletree.go
@@ -18,7 +18,7 @@
 	"go.chromium.org/goma/server/log"
 	"go.chromium.org/goma/server/remoteexec/digest"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 )
 
 // MerkleTree represents a merkle tree.
diff --git a/remoteexec/merkletree/merkletree_test.go b/remoteexec/merkletree/merkletree_test.go
index 50b42df..0dde61a 100644
--- a/remoteexec/merkletree/merkletree_test.go
+++ b/remoteexec/merkletree/merkletree_test.go
@@ -12,7 +12,7 @@
 	"strings"
 	"testing"
 
-	rpb "go.chromium.org/goma/server/proto/remote-apis/build/bazel/remote/execution/v2"
+	rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
 
 	"github.com/golang/protobuf/proto"