internal/gomote,cmd/gomote: implements GRPC add bootstrap

This change adds the implementation for GRPC putbootstrap command to the
gomote client. It also adds the gomote server implementation of the
AddBootstrap endpoint. This endpoint adds the bootstrap Go version to
an existing client.

Updates golang/go#48737
Updates golang/go#48742
For golang/go#47521

Change-Id: Ib0807a13e85a0e350485c8300ac2e180456bd0fc
Reviewed-on: https://go-review.googlesource.com/c/build/+/410818
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Carlos Amedee <carlos@golang.org>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Auto-Submit: Carlos Amedee <carlos@golang.org>
Reviewed-by: Alex Rakoczy <alex@golang.org>
diff --git a/cmd/gomote/gomote.go b/cmd/gomote/gomote.go
index 684b635..1c8dcf6 100644
--- a/cmd/gomote/gomote.go
+++ b/cmd/gomote/gomote.go
@@ -216,17 +216,19 @@
 // version2 manages how version 2 subcommands are called.
 func version2(args []string) error {
 	cm := map[string]subCommand{
-		"create":  create,
-		"destroy": destroy,
-		"list":    list,
-		"ls":      ls,
-		"run":     run,
-		"ping":    ping,
-		"ssh":     ssh,
-		"rm":      rm,
-		"gettar":  getTar,
-		"put":     put,
-		"puttar":  putTar,
+
+		"create":       create,
+		"destroy":      destroy,
+		"list":         list,
+		"ls":           ls,
+		"run":          run,
+		"ping":         ping,
+		"ssh":          ssh,
+		"rm":           rm,
+		"gettar":       getTar,
+		"put":          put,
+		"puttar":       putTar,
+		"putbootstrap": putBootstrap,
 	}
 	if len(args) == 0 {
 		usage()
diff --git a/cmd/gomote/put.go b/cmd/gomote/put.go
index 039744c..dd27272 100644
--- a/cmd/gomote/put.go
+++ b/cmd/gomote/put.go
@@ -219,6 +219,33 @@
 	return bc.PutTarFromURL(ctx, u, "go1.4")
 }
 
+// putBootstrap places the bootstrap version of go in the workdir
+func putBootstrap(args []string) error {
+	fs := flag.NewFlagSet("putbootstrap", flag.ContinueOnError)
+	fs.Usage = func() {
+		fmt.Fprintln(os.Stderr, "putbootstrap usage: gomote putbootstrap <buildlet-name>")
+		fs.PrintDefaults()
+		os.Exit(1)
+	}
+	fs.Parse(args)
+	if fs.NArg() != 1 {
+		fs.Usage()
+	}
+	name := fs.Arg(0)
+	ctx := context.Background()
+	client := gomoteServerClient(ctx)
+	resp, err := client.AddBootstrap(ctx, &protos.AddBootstrapRequest{
+		GomoteId: name,
+	})
+	if err != nil {
+		return fmt.Errorf("unable to add bootstrap version of Go to instance: %s", statusFromError(err))
+	}
+	if resp.GetBootstrapGoUrl() == "" {
+		fmt.Printf("No GoBootstrapURL defined for %q; ignoring. (may be baked into image)\n", name)
+	}
+	return nil
+}
+
 // legacyPut single file
 func legacyPut(args []string) error {
 	fs := flag.NewFlagSet("put", flag.ContinueOnError)
diff --git a/internal/gomote/gomote.go b/internal/gomote/gomote.go
index 3dc1500..199f3ef 100644
--- a/internal/gomote/gomote.go
+++ b/internal/gomote/gomote.go
@@ -21,6 +21,7 @@
 
 	"cloud.google.com/go/storage"
 	"github.com/google/uuid"
+	"golang.org/x/build/buildenv"
 	"golang.org/x/build/buildlet"
 	"golang.org/x/build/dashboard"
 	"golang.org/x/build/internal/access"
@@ -74,6 +75,33 @@
 	}
 }
 
+// AddBootstrap adds the bootstrap version of Go to an instance and returns the URL for the bootstrap version. If no
+// bootstrap version is defined then the returned version URL will be empty.
+func (s *Server) AddBootstrap(ctx context.Context, req *protos.AddBootstrapRequest) (*protos.AddBootstrapResponse, error) {
+	creds, err := access.IAPFromContext(ctx)
+	if err != nil {
+		log.Printf("Authenticate access.IAPFromContext(ctx) = nil, %s", err)
+		return nil, status.Errorf(codes.Unauthenticated, "request does not contain the required authentication")
+	}
+	ses, bc, err := s.sessionAndClient(req.GetGomoteId(), creds.ID)
+	if err != nil {
+		// the helper function returns meaningful GRPC error.
+		return nil, err
+	}
+	bconf, ok := dashboard.Builders[ses.BuilderType]
+	if !ok {
+		return nil, status.Errorf(codes.Internal, "unknown builder type")
+	}
+	url := bconf.GoBootstrapURL(buildenv.Production)
+	if url == "" {
+		return &protos.AddBootstrapResponse{}, nil
+	}
+	if err = bc.PutTarFromURL(ctx, url, "go1.4"); err != nil {
+		return nil, status.Errorf(codes.Internal, "unable to download bootstrap Go")
+	}
+	return &protos.AddBootstrapResponse{BootstrapGoUrl: url}, nil
+}
+
 // Authenticate will allow the caller to verify that they are properly authenticated and authorized to interact with the
 // Service.
 func (s *Server) Authenticate(ctx context.Context, req *protos.AuthenticateRequest) (*protos.AuthenticateResponse, error) {
diff --git a/internal/gomote/gomote_test.go b/internal/gomote/gomote_test.go
index 809f875..28c9423 100644
--- a/internal/gomote/gomote_test.go
+++ b/internal/gomote/gomote_test.go
@@ -95,6 +95,75 @@
 	}
 }
 
+func TestAddBootstrapAlive(t *testing.T) {
+	client := setupGomoteTest(t, context.Background())
+	gomoteID := mustCreateInstance(t, client, fakeIAP())
+	req := &protos.AddBootstrapRequest{
+		GomoteId: gomoteID,
+	}
+	ctx := access.FakeContextWithOutgoingIAPAuth(context.Background(), fakeIAP())
+	got, err := client.AddBootstrap(ctx, req)
+	if err != nil {
+		t.Fatalf("client.AddBootstrap(ctx, %v) = %v, %s; want no error", req, got, err)
+	}
+}
+
+func TestAddBootstrapError(t *testing.T) {
+	// This test will create a gomote instance and attempt to call AddBootstrap.
+	// If overrideID is set to true, the test will use a different gomoteID than the
+	// the one created for the test.
+	testCases := []struct {
+		desc       string
+		ctx        context.Context
+		overrideID bool
+		gomoteID   string // Used iff overrideID is true.
+		wantCode   codes.Code
+	}{
+		{
+			desc:     "unauthenticated request",
+			ctx:      context.Background(),
+			wantCode: codes.Unauthenticated,
+		},
+		{
+			desc:       "missing gomote id",
+			ctx:        access.FakeContextWithOutgoingIAPAuth(context.Background(), fakeIAP()),
+			overrideID: true,
+			wantCode:   codes.NotFound,
+		},
+		{
+			desc:       "gomote does not exist",
+			ctx:        access.FakeContextWithOutgoingIAPAuth(context.Background(), fakeIAP()),
+			overrideID: true,
+			gomoteID:   "xyz",
+			wantCode:   codes.NotFound,
+		},
+		{
+			desc:     "gomote is not owned by caller",
+			ctx:      access.FakeContextWithOutgoingIAPAuth(context.Background(), fakeIAPWithUser("user-x", "email-y")),
+			wantCode: codes.PermissionDenied,
+		},
+	}
+	for _, tc := range testCases {
+		t.Run(tc.desc, func(t *testing.T) {
+			client := setupGomoteTest(t, context.Background())
+			gomoteID := mustCreateInstance(t, client, fakeIAP())
+			if tc.overrideID {
+				gomoteID = tc.gomoteID
+			}
+			req := &protos.AddBootstrapRequest{
+				GomoteId: gomoteID,
+			}
+			got, err := client.AddBootstrap(tc.ctx, req)
+			if err != nil && status.Code(err) != tc.wantCode {
+				t.Fatalf("unexpected error: %s; want %s", err, tc.wantCode)
+			}
+			if err == nil {
+				t.Fatalf("client.AddBootstrap(ctx, %v) = %v, nil; want error", req, got)
+			}
+		})
+	}
+}
+
 func TestCreateInstance(t *testing.T) {
 	ctx := access.FakeContextWithOutgoingIAPAuth(context.Background(), fakeIAP())
 	req := &protos.CreateInstanceRequest{BuilderType: "linux-amd64"}
diff --git a/internal/gomote/protos/gomote.pb.go b/internal/gomote/protos/gomote.pb.go
index 13c8425..176d0d6 100644
--- a/internal/gomote/protos/gomote.pb.go
+++ b/internal/gomote/protos/gomote.pb.go
@@ -70,7 +70,7 @@
 
 // Deprecated: Use CreateInstanceResponse_Status.Descriptor instead.
 func (CreateInstanceResponse_Status) EnumDescriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{3, 0}
+	return file_gomote_proto_rawDescGZIP(), []int{5, 0}
 }
 
 // AuthenticateRequest specifies the data needed for an authentication request.
@@ -199,6 +199,107 @@
 	return ""
 }
 
+// AddBootstrapRequest specifies the data needed for a request to add the bootstrap version of Go
+// to the instance.
+type AddBootstrapRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The unique identifier for a gomote instance.
+	GomoteId string `protobuf:"bytes,1,opt,name=gomote_id,json=gomoteId,proto3" json:"gomote_id,omitempty"`
+}
+
+func (x *AddBootstrapRequest) Reset() {
+	*x = AddBootstrapRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gomote_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddBootstrapRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddBootstrapRequest) ProtoMessage() {}
+
+func (x *AddBootstrapRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gomote_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AddBootstrapRequest.ProtoReflect.Descriptor instead.
+func (*AddBootstrapRequest) Descriptor() ([]byte, []int) {
+	return file_gomote_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *AddBootstrapRequest) GetGomoteId() string {
+	if x != nil {
+		return x.GomoteId
+	}
+	return ""
+}
+
+// AddBootstrapResponse contains the information about the add bootstrap request.
+type AddBootstrapResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The URL for the Go version added to the work directory.
+	// If empty, the bootstrap version is undefined and has probably been included in
+	// the instance image.
+	BootstrapGoUrl string `protobuf:"bytes,1,opt,name=bootstrap_go_url,json=bootstrapGoUrl,proto3" json:"bootstrap_go_url,omitempty"`
+}
+
+func (x *AddBootstrapResponse) Reset() {
+	*x = AddBootstrapResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gomote_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddBootstrapResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddBootstrapResponse) ProtoMessage() {}
+
+func (x *AddBootstrapResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gomote_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AddBootstrapResponse.ProtoReflect.Descriptor instead.
+func (*AddBootstrapResponse) Descriptor() ([]byte, []int) {
+	return file_gomote_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *AddBootstrapResponse) GetBootstrapGoUrl() string {
+	if x != nil {
+		return x.BootstrapGoUrl
+	}
+	return ""
+}
+
 // CreateInstanceResponse contains data about a created gomote instance.
 type CreateInstanceResponse struct {
 	state         protoimpl.MessageState
@@ -217,7 +318,7 @@
 func (x *CreateInstanceResponse) Reset() {
 	*x = CreateInstanceResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[3]
+		mi := &file_gomote_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -230,7 +331,7 @@
 func (*CreateInstanceResponse) ProtoMessage() {}
 
 func (x *CreateInstanceResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[3]
+	mi := &file_gomote_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -243,7 +344,7 @@
 
 // Deprecated: Use CreateInstanceResponse.ProtoReflect.Descriptor instead.
 func (*CreateInstanceResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{3}
+	return file_gomote_proto_rawDescGZIP(), []int{5}
 }
 
 func (x *CreateInstanceResponse) GetInstance() *Instance {
@@ -280,7 +381,7 @@
 func (x *DestroyInstanceRequest) Reset() {
 	*x = DestroyInstanceRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[4]
+		mi := &file_gomote_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -293,7 +394,7 @@
 func (*DestroyInstanceRequest) ProtoMessage() {}
 
 func (x *DestroyInstanceRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[4]
+	mi := &file_gomote_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -306,7 +407,7 @@
 
 // Deprecated: Use DestroyInstanceRequest.ProtoReflect.Descriptor instead.
 func (*DestroyInstanceRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{4}
+	return file_gomote_proto_rawDescGZIP(), []int{6}
 }
 
 func (x *DestroyInstanceRequest) GetGomoteId() string {
@@ -326,7 +427,7 @@
 func (x *DestroyInstanceResponse) Reset() {
 	*x = DestroyInstanceResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[5]
+		mi := &file_gomote_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -339,7 +440,7 @@
 func (*DestroyInstanceResponse) ProtoMessage() {}
 
 func (x *DestroyInstanceResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[5]
+	mi := &file_gomote_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -352,7 +453,7 @@
 
 // Deprecated: Use DestroyInstanceResponse.ProtoReflect.Descriptor instead.
 func (*DestroyInstanceResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{5}
+	return file_gomote_proto_rawDescGZIP(), []int{7}
 }
 
 // ExecuteCommandRequest specifies the data needed to execute a command on a gomote instance.
@@ -390,7 +491,7 @@
 func (x *ExecuteCommandRequest) Reset() {
 	*x = ExecuteCommandRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[6]
+		mi := &file_gomote_proto_msgTypes[8]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -403,7 +504,7 @@
 func (*ExecuteCommandRequest) ProtoMessage() {}
 
 func (x *ExecuteCommandRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[6]
+	mi := &file_gomote_proto_msgTypes[8]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -416,7 +517,7 @@
 
 // Deprecated: Use ExecuteCommandRequest.ProtoReflect.Descriptor instead.
 func (*ExecuteCommandRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{6}
+	return file_gomote_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *ExecuteCommandRequest) GetGomoteId() string {
@@ -495,7 +596,7 @@
 func (x *ExecuteCommandResponse) Reset() {
 	*x = ExecuteCommandResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[7]
+		mi := &file_gomote_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -508,7 +609,7 @@
 func (*ExecuteCommandResponse) ProtoMessage() {}
 
 func (x *ExecuteCommandResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[7]
+	mi := &file_gomote_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -521,7 +622,7 @@
 
 // Deprecated: Use ExecuteCommandResponse.ProtoReflect.Descriptor instead.
 func (*ExecuteCommandResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{7}
+	return file_gomote_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *ExecuteCommandResponse) GetOutput() string {
@@ -551,7 +652,7 @@
 func (x *Instance) Reset() {
 	*x = Instance{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[8]
+		mi := &file_gomote_proto_msgTypes[10]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -564,7 +665,7 @@
 func (*Instance) ProtoMessage() {}
 
 func (x *Instance) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[8]
+	mi := &file_gomote_proto_msgTypes[10]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -577,7 +678,7 @@
 
 // Deprecated: Use Instance.ProtoReflect.Descriptor instead.
 func (*Instance) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{8}
+	return file_gomote_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *Instance) GetGomoteId() string {
@@ -621,7 +722,7 @@
 func (x *InstanceAliveRequest) Reset() {
 	*x = InstanceAliveRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[9]
+		mi := &file_gomote_proto_msgTypes[11]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -634,7 +735,7 @@
 func (*InstanceAliveRequest) ProtoMessage() {}
 
 func (x *InstanceAliveRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[9]
+	mi := &file_gomote_proto_msgTypes[11]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -647,7 +748,7 @@
 
 // Deprecated: Use InstanceAliveRequest.ProtoReflect.Descriptor instead.
 func (*InstanceAliveRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{9}
+	return file_gomote_proto_rawDescGZIP(), []int{11}
 }
 
 func (x *InstanceAliveRequest) GetGomoteId() string {
@@ -667,7 +768,7 @@
 func (x *InstanceAliveResponse) Reset() {
 	*x = InstanceAliveResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[10]
+		mi := &file_gomote_proto_msgTypes[12]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -680,7 +781,7 @@
 func (*InstanceAliveResponse) ProtoMessage() {}
 
 func (x *InstanceAliveResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[10]
+	mi := &file_gomote_proto_msgTypes[12]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -693,7 +794,7 @@
 
 // Deprecated: Use InstanceAliveResponse.ProtoReflect.Descriptor instead.
 func (*InstanceAliveResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{10}
+	return file_gomote_proto_rawDescGZIP(), []int{12}
 }
 
 // ListDirectoryRequest specifies the data needed to list contents of a directory from a gomote instance.
@@ -718,7 +819,7 @@
 func (x *ListDirectoryRequest) Reset() {
 	*x = ListDirectoryRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[11]
+		mi := &file_gomote_proto_msgTypes[13]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -731,7 +832,7 @@
 func (*ListDirectoryRequest) ProtoMessage() {}
 
 func (x *ListDirectoryRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[11]
+	mi := &file_gomote_proto_msgTypes[13]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -744,7 +845,7 @@
 
 // Deprecated: Use ListDirectoryRequest.ProtoReflect.Descriptor instead.
 func (*ListDirectoryRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{11}
+	return file_gomote_proto_rawDescGZIP(), []int{13}
 }
 
 func (x *ListDirectoryRequest) GetGomoteId() string {
@@ -795,7 +896,7 @@
 func (x *ListDirectoryResponse) Reset() {
 	*x = ListDirectoryResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[12]
+		mi := &file_gomote_proto_msgTypes[14]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -808,7 +909,7 @@
 func (*ListDirectoryResponse) ProtoMessage() {}
 
 func (x *ListDirectoryResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[12]
+	mi := &file_gomote_proto_msgTypes[14]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -821,7 +922,7 @@
 
 // Deprecated: Use ListDirectoryResponse.ProtoReflect.Descriptor instead.
 func (*ListDirectoryResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{12}
+	return file_gomote_proto_rawDescGZIP(), []int{14}
 }
 
 func (x *ListDirectoryResponse) GetEntries() []string {
@@ -841,7 +942,7 @@
 func (x *ListInstancesRequest) Reset() {
 	*x = ListInstancesRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[13]
+		mi := &file_gomote_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -854,7 +955,7 @@
 func (*ListInstancesRequest) ProtoMessage() {}
 
 func (x *ListInstancesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[13]
+	mi := &file_gomote_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -867,7 +968,7 @@
 
 // Deprecated: Use ListInstancesRequest.ProtoReflect.Descriptor instead.
 func (*ListInstancesRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{13}
+	return file_gomote_proto_rawDescGZIP(), []int{15}
 }
 
 // ListInstancesResponse contains the list of live gomote instances owned by the caller.
@@ -882,7 +983,7 @@
 func (x *ListInstancesResponse) Reset() {
 	*x = ListInstancesResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[14]
+		mi := &file_gomote_proto_msgTypes[16]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -895,7 +996,7 @@
 func (*ListInstancesResponse) ProtoMessage() {}
 
 func (x *ListInstancesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[14]
+	mi := &file_gomote_proto_msgTypes[16]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -908,7 +1009,7 @@
 
 // Deprecated: Use ListInstancesResponse.ProtoReflect.Descriptor instead.
 func (*ListInstancesResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{14}
+	return file_gomote_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *ListInstancesResponse) GetInstances() []*Instance {
@@ -933,7 +1034,7 @@
 func (x *ReadTGZToURLRequest) Reset() {
 	*x = ReadTGZToURLRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[15]
+		mi := &file_gomote_proto_msgTypes[17]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -946,7 +1047,7 @@
 func (*ReadTGZToURLRequest) ProtoMessage() {}
 
 func (x *ReadTGZToURLRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[15]
+	mi := &file_gomote_proto_msgTypes[17]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -959,7 +1060,7 @@
 
 // Deprecated: Use ReadTGZToURLRequest.ProtoReflect.Descriptor instead.
 func (*ReadTGZToURLRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{15}
+	return file_gomote_proto_rawDescGZIP(), []int{17}
 }
 
 func (x *ReadTGZToURLRequest) GetGomoteId() string {
@@ -989,7 +1090,7 @@
 func (x *ReadTGZToURLResponse) Reset() {
 	*x = ReadTGZToURLResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[16]
+		mi := &file_gomote_proto_msgTypes[18]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1002,7 +1103,7 @@
 func (*ReadTGZToURLResponse) ProtoMessage() {}
 
 func (x *ReadTGZToURLResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[16]
+	mi := &file_gomote_proto_msgTypes[18]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1015,7 +1116,7 @@
 
 // Deprecated: Use ReadTGZToURLResponse.ProtoReflect.Descriptor instead.
 func (*ReadTGZToURLResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{16}
+	return file_gomote_proto_rawDescGZIP(), []int{18}
 }
 
 func (x *ReadTGZToURLResponse) GetUrl() string {
@@ -1042,7 +1143,7 @@
 func (x *RemoveFilesRequest) Reset() {
 	*x = RemoveFilesRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[17]
+		mi := &file_gomote_proto_msgTypes[19]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1055,7 +1156,7 @@
 func (*RemoveFilesRequest) ProtoMessage() {}
 
 func (x *RemoveFilesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[17]
+	mi := &file_gomote_proto_msgTypes[19]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1068,7 +1169,7 @@
 
 // Deprecated: Use RemoveFilesRequest.ProtoReflect.Descriptor instead.
 func (*RemoveFilesRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{17}
+	return file_gomote_proto_rawDescGZIP(), []int{19}
 }
 
 func (x *RemoveFilesRequest) GetGomoteId() string {
@@ -1095,7 +1196,7 @@
 func (x *RemoveFilesResponse) Reset() {
 	*x = RemoveFilesResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[18]
+		mi := &file_gomote_proto_msgTypes[20]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1108,7 +1209,7 @@
 func (*RemoveFilesResponse) ProtoMessage() {}
 
 func (x *RemoveFilesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[18]
+	mi := &file_gomote_proto_msgTypes[20]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1121,7 +1222,7 @@
 
 // Deprecated: Use RemoveFilesResponse.ProtoReflect.Descriptor instead.
 func (*RemoveFilesResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{18}
+	return file_gomote_proto_rawDescGZIP(), []int{20}
 }
 
 // SignSSHKeyRequest specifies the data needed to sign a public SSH key which attaches a certificate to the key.
@@ -1139,7 +1240,7 @@
 func (x *SignSSHKeyRequest) Reset() {
 	*x = SignSSHKeyRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[19]
+		mi := &file_gomote_proto_msgTypes[21]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1152,7 +1253,7 @@
 func (*SignSSHKeyRequest) ProtoMessage() {}
 
 func (x *SignSSHKeyRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[19]
+	mi := &file_gomote_proto_msgTypes[21]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1165,7 +1266,7 @@
 
 // Deprecated: Use SignSSHKeyRequest.ProtoReflect.Descriptor instead.
 func (*SignSSHKeyRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{19}
+	return file_gomote_proto_rawDescGZIP(), []int{21}
 }
 
 func (x *SignSSHKeyRequest) GetGomoteId() string {
@@ -1196,7 +1297,7 @@
 func (x *SignSSHKeyResponse) Reset() {
 	*x = SignSSHKeyResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[20]
+		mi := &file_gomote_proto_msgTypes[22]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1209,7 +1310,7 @@
 func (*SignSSHKeyResponse) ProtoMessage() {}
 
 func (x *SignSSHKeyResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[20]
+	mi := &file_gomote_proto_msgTypes[22]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1222,7 +1323,7 @@
 
 // Deprecated: Use SignSSHKeyResponse.ProtoReflect.Descriptor instead.
 func (*SignSSHKeyResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{20}
+	return file_gomote_proto_rawDescGZIP(), []int{22}
 }
 
 func (x *SignSSHKeyResponse) GetSignedPublicSshKey() []byte {
@@ -1242,7 +1343,7 @@
 func (x *UploadFileRequest) Reset() {
 	*x = UploadFileRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[21]
+		mi := &file_gomote_proto_msgTypes[23]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1255,7 +1356,7 @@
 func (*UploadFileRequest) ProtoMessage() {}
 
 func (x *UploadFileRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[21]
+	mi := &file_gomote_proto_msgTypes[23]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1268,7 +1369,7 @@
 
 // Deprecated: Use UploadFileRequest.ProtoReflect.Descriptor instead.
 func (*UploadFileRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{21}
+	return file_gomote_proto_rawDescGZIP(), []int{23}
 }
 
 // UploadFileResponse contains the results from a request to upload an object to GCS.
@@ -1288,7 +1389,7 @@
 func (x *UploadFileResponse) Reset() {
 	*x = UploadFileResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[22]
+		mi := &file_gomote_proto_msgTypes[24]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1301,7 +1402,7 @@
 func (*UploadFileResponse) ProtoMessage() {}
 
 func (x *UploadFileResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[22]
+	mi := &file_gomote_proto_msgTypes[24]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1314,7 +1415,7 @@
 
 // Deprecated: Use UploadFileResponse.ProtoReflect.Descriptor instead.
 func (*UploadFileResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{22}
+	return file_gomote_proto_rawDescGZIP(), []int{24}
 }
 
 func (x *UploadFileResponse) GetUrl() string {
@@ -1358,7 +1459,7 @@
 func (x *WriteFileFromURLRequest) Reset() {
 	*x = WriteFileFromURLRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[23]
+		mi := &file_gomote_proto_msgTypes[25]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1371,7 +1472,7 @@
 func (*WriteFileFromURLRequest) ProtoMessage() {}
 
 func (x *WriteFileFromURLRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[23]
+	mi := &file_gomote_proto_msgTypes[25]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1384,7 +1485,7 @@
 
 // Deprecated: Use WriteFileFromURLRequest.ProtoReflect.Descriptor instead.
 func (*WriteFileFromURLRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{23}
+	return file_gomote_proto_rawDescGZIP(), []int{25}
 }
 
 func (x *WriteFileFromURLRequest) GetGomoteId() string {
@@ -1425,7 +1526,7 @@
 func (x *WriteFileFromURLResponse) Reset() {
 	*x = WriteFileFromURLResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[24]
+		mi := &file_gomote_proto_msgTypes[26]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1438,7 +1539,7 @@
 func (*WriteFileFromURLResponse) ProtoMessage() {}
 
 func (x *WriteFileFromURLResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[24]
+	mi := &file_gomote_proto_msgTypes[26]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1451,7 +1552,7 @@
 
 // Deprecated: Use WriteFileFromURLResponse.ProtoReflect.Descriptor instead.
 func (*WriteFileFromURLResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{24}
+	return file_gomote_proto_rawDescGZIP(), []int{26}
 }
 
 // WriteTGZFromURLRequest specifies the data needed to retrieve a file and expand it onto the file system of a gomote instance.
@@ -1472,7 +1573,7 @@
 func (x *WriteTGZFromURLRequest) Reset() {
 	*x = WriteTGZFromURLRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[25]
+		mi := &file_gomote_proto_msgTypes[27]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1485,7 +1586,7 @@
 func (*WriteTGZFromURLRequest) ProtoMessage() {}
 
 func (x *WriteTGZFromURLRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[25]
+	mi := &file_gomote_proto_msgTypes[27]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1498,7 +1599,7 @@
 
 // Deprecated: Use WriteTGZFromURLRequest.ProtoReflect.Descriptor instead.
 func (*WriteTGZFromURLRequest) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{25}
+	return file_gomote_proto_rawDescGZIP(), []int{27}
 }
 
 func (x *WriteTGZFromURLRequest) GetGomoteId() string {
@@ -1532,7 +1633,7 @@
 func (x *WriteTGZFromURLResponse) Reset() {
 	*x = WriteTGZFromURLResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gomote_proto_msgTypes[26]
+		mi := &file_gomote_proto_msgTypes[28]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1545,7 +1646,7 @@
 func (*WriteTGZFromURLResponse) ProtoMessage() {}
 
 func (x *WriteTGZFromURLResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gomote_proto_msgTypes[26]
+	mi := &file_gomote_proto_msgTypes[28]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1558,7 +1659,7 @@
 
 // Deprecated: Use WriteTGZFromURLResponse.ProtoReflect.Descriptor instead.
 func (*WriteTGZFromURLResponse) Descriptor() ([]byte, []int) {
-	return file_gomote_proto_rawDescGZIP(), []int{26}
+	return file_gomote_proto_rawDescGZIP(), []int{28}
 }
 
 var File_gomote_proto protoreflect.FileDescriptor
@@ -1572,205 +1673,217 @@
 	0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21,
 	0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70,
-	0x65, 0x22, 0xdc, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74,
-	0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08,
-	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
-	0x52, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x73, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
-	0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69,
-	0x74, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x68, 0x65, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
-	0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x65, 0x72, 0x73, 0x41, 0x68, 0x65, 0x61, 0x64, 0x22, 0x30,
-	0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e,
-	0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47,
-	0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02,
-	0x22, 0x35, 0x0a, 0x16, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61,
-	0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f,
-	0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67,
-	0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72,
-	0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0xa8, 0x02, 0x0a, 0x15, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f,
-	0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09,
-	0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d,
-	0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d,
-	0x61, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6c, 0x65,
-	0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65,
-	0x6d, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x12, 0x2d, 0x0a, 0x12,
-	0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
-	0x6e, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64,
-	0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70,
-	0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12,
-	0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a,
-	0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67,
-	0x73, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x6f, 0x73,
-	0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6d,
-	0x69, 0x74, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x30, 0x0a,
-	0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75,
-	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22,
-	0x81, 0x01, 0x0a, 0x08, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09,
-	0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69,
-	0x6c, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09,
-	0x68, 0x6f, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x08, 0x68, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70,
-	0x69, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69,
-	0x72, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x14, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41,
-	0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67,
+	0x65, 0x22, 0x32, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61,
+	0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f,
+	0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d,
+	0x6f, 0x74, 0x65, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x42, 0x6f, 0x6f, 0x74,
+	0x73, 0x74, 0x72, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a,
+	0x10, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x6f, 0x5f, 0x75, 0x72,
+	0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72,
+	0x61, 0x70, 0x47, 0x6f, 0x55, 0x72, 0x6c, 0x22, 0xdc, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e,
+	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x12, 0x3d, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x68, 0x65, 0x61, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x65, 0x72, 0x73, 0x41,
+	0x68, 0x65, 0x61, 0x64, 0x22, 0x30, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b,
+	0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x57,
+	0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4d, 0x50,
+	0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x16, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f,
+	0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x22, 0x19, 0x0a,
+	0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa8, 0x02, 0x0a, 0x15, 0x45, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12,
+	0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x79, 0x73,
+	0x74, 0x65, 0x6d, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05,
+	0x64, 0x65, 0x62, 0x75, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x65, 0x62,
+	0x75, 0x67, 0x12, 0x2d, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x6e, 0x76,
+	0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11,
+	0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
+	0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,
+	0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+	0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28,
+	0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x6d, 0x69, 0x74, 0x61,
+	0x74, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0f, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x54,
+	0x79, 0x70, 0x65, 0x22, 0x30, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f,
+	0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a,
+	0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f,
+	0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x08, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+	0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12,
+	0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12,
+	0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x14, 0x49, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x22, 0x17,
+	0x0a, 0x15, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74,
+	0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a,
+	0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72,
+	0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09,
+	0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b, 0x69,
+	0x70, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x73,
+	0x6b, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74,
+	0x22, 0x31, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72,
+	0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x74,
+	0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72,
+	0x69, 0x65, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x47, 0x0a, 0x15, 0x4c,
+	0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+	0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x13, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54,
+	0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67,
 	0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
-	0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x49, 0x6e, 0x73, 0x74,
-	0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0xa6, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
-	0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f,
-	0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67,
-	0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63,
-	0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65,
-	0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69,
-	0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73,
-	0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x65,
-	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6b, 0x69, 0x70, 0x46, 0x69, 0x6c,
-	0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01,
-	0x28, 0x08, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x31, 0x0a, 0x15, 0x4c, 0x69,
-	0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x0a,
-	0x14, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x47, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73,
-	0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e,
-	0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61,
-	0x6e, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x50,
-	0x0a, 0x13, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65,
+	0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65,
+	0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72,
+	0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x28, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47,
+	0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10,
+	0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c,
+	0x22, 0x47, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74,
+	0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x6d,
+	0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x56, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65,
 	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f,
 	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65,
-	0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79,
-	0x22, 0x28, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x47, 0x0a, 0x12, 0x52, 0x65,
-	0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a,
-	0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61,
-	0x74, 0x68, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c,
-	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x0a, 0x11, 0x53, 0x69,
-	0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e,
-	0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x53, 0x73, 0x68, 0x4b,
-	0x65, 0x79, 0x22, 0x47, 0x0a, 0x12, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x73, 0x69, 0x67, 0x6e,
-	0x65, 0x64, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65,
-	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x50,
-	0x75, 0x62, 0x6c, 0x69, 0x63, 0x53, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x13, 0x0a, 0x11, 0x55,
-	0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x22, 0xc2, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x69, 0x65,
-	0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72,
-	0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a,
-	0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
-	0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x46, 0x69,
-	0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
-	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x78, 0x0a, 0x17, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69,
-	0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a,
-	0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12,
-	0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d,
-	0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x07, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22,
-	0x1a, 0x0a, 0x18, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d,
-	0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x65, 0x0a, 0x16, 0x57,
-	0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f,
-	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65,
-	0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x03, 0x75, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72,
-	0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,
-	0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72,
-	0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xa0, 0x08,
-	0x0a, 0x0d, 0x47, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
-	0x4b, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12,
-	0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,
-	0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
-	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e,
-	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1d,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e,
-	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73,
-	0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30,
-	0x01, 0x12, 0x54, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74,
-	0x61, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x44, 0x65,
-	0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x44, 0x65,
-	0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75,
-	0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
-	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x0d,
-	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x1c, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41,
-	0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69,
-	0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0d,
-	0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63,
-	0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,
-	0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0d,
-	0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61,
-	0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
-	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0c,
-	0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x12, 0x1b, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55,
-	0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0b, 0x52, 0x65, 0x6d,
-	0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65,
-	0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65,
-	0x79, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x53,
-	0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0a, 0x55, 0x70,
-	0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c,
-	0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x00, 0x12, 0x57, 0x0a, 0x10, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72,
-	0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x12, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x57,
+	0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x73, 0x73, 0x68,
+	0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6c,
+	0x69, 0x63, 0x53, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x47, 0x0a, 0x12, 0x53, 0x69, 0x67, 0x6e,
+	0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31,
+	0x0a, 0x15, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f,
+	0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x73,
+	0x69, 0x67, 0x6e, 0x65, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x53, 0x73, 0x68, 0x4b, 0x65,
+	0x79, 0x22, 0x13, 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc2, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f, 0x61,
+	0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a,
+	0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12,
+	0x3e, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46,
+	0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c,
+	0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12,
+	0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65,
+	0x1a, 0x39, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
+	0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x78, 0x0a, 0x17, 0x57,
 	0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e,
-	0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0f, 0x57, 0x72,
-	0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x12, 0x1e, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46,
-	0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46,
-	0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
-	0x42, 0x2b, 0x5a, 0x29, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78,
-	0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f,
-	0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74,
+	0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d,
+	0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x07, 0x52,
+	0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69,
+	0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x65, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f,
+	0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67,
+	0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69,
+	0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64,
+	0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x72, 0x69, 0x74,
+	0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x32, 0xed, 0x08, 0x0a, 0x0d, 0x47, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,
+	0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41,
+	0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68,
+	0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72,
+	0x61, 0x70, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x42,
+	0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x42, 0x6f, 0x6f, 0x74,
+	0x73, 0x74, 0x72, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x53, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
+	0x65, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x30, 0x01, 0x12, 0x54, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49,
+	0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+	0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+	0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x45, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1d, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d,
+	0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d,
+	0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12,
+	0x4e, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65,
+	0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+	0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x4e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79,
+	0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69,
+	0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65,
+	0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x4e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73,
+	0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e,
+	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74,
+	0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x4b, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x12,
+	0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a,
+	0x54, 0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55,
+	0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0b,
+	0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+	0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53,
+	0x48, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69,
+	0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53, 0x48,
+	0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a,
+	0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e,
+	0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x10, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c,
+	0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x12, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55,
+	0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d,
+	0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a,
+	0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c,
+	0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54,
+	0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54,
+	0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72,
+	0x67, 0x2f, 0x78, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+	0x61, 0x6c, 0x2f, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1786,71 +1899,75 @@
 }
 
 var file_gomote_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_gomote_proto_msgTypes = make([]protoimpl.MessageInfo, 28)
+var file_gomote_proto_msgTypes = make([]protoimpl.MessageInfo, 30)
 var file_gomote_proto_goTypes = []interface{}{
 	(CreateInstanceResponse_Status)(0), // 0: protos.CreateInstanceResponse.Status
 	(*AuthenticateRequest)(nil),        // 1: protos.AuthenticateRequest
 	(*AuthenticateResponse)(nil),       // 2: protos.AuthenticateResponse
 	(*CreateInstanceRequest)(nil),      // 3: protos.CreateInstanceRequest
-	(*CreateInstanceResponse)(nil),     // 4: protos.CreateInstanceResponse
-	(*DestroyInstanceRequest)(nil),     // 5: protos.DestroyInstanceRequest
-	(*DestroyInstanceResponse)(nil),    // 6: protos.DestroyInstanceResponse
-	(*ExecuteCommandRequest)(nil),      // 7: protos.ExecuteCommandRequest
-	(*ExecuteCommandResponse)(nil),     // 8: protos.ExecuteCommandResponse
-	(*Instance)(nil),                   // 9: protos.Instance
-	(*InstanceAliveRequest)(nil),       // 10: protos.InstanceAliveRequest
-	(*InstanceAliveResponse)(nil),      // 11: protos.InstanceAliveResponse
-	(*ListDirectoryRequest)(nil),       // 12: protos.ListDirectoryRequest
-	(*ListDirectoryResponse)(nil),      // 13: protos.ListDirectoryResponse
-	(*ListInstancesRequest)(nil),       // 14: protos.ListInstancesRequest
-	(*ListInstancesResponse)(nil),      // 15: protos.ListInstancesResponse
-	(*ReadTGZToURLRequest)(nil),        // 16: protos.ReadTGZToURLRequest
-	(*ReadTGZToURLResponse)(nil),       // 17: protos.ReadTGZToURLResponse
-	(*RemoveFilesRequest)(nil),         // 18: protos.RemoveFilesRequest
-	(*RemoveFilesResponse)(nil),        // 19: protos.RemoveFilesResponse
-	(*SignSSHKeyRequest)(nil),          // 20: protos.SignSSHKeyRequest
-	(*SignSSHKeyResponse)(nil),         // 21: protos.SignSSHKeyResponse
-	(*UploadFileRequest)(nil),          // 22: protos.UploadFileRequest
-	(*UploadFileResponse)(nil),         // 23: protos.UploadFileResponse
-	(*WriteFileFromURLRequest)(nil),    // 24: protos.WriteFileFromURLRequest
-	(*WriteFileFromURLResponse)(nil),   // 25: protos.WriteFileFromURLResponse
-	(*WriteTGZFromURLRequest)(nil),     // 26: protos.WriteTGZFromURLRequest
-	(*WriteTGZFromURLResponse)(nil),    // 27: protos.WriteTGZFromURLResponse
-	nil,                                // 28: protos.UploadFileResponse.FieldsEntry
+	(*AddBootstrapRequest)(nil),        // 4: protos.AddBootstrapRequest
+	(*AddBootstrapResponse)(nil),       // 5: protos.AddBootstrapResponse
+	(*CreateInstanceResponse)(nil),     // 6: protos.CreateInstanceResponse
+	(*DestroyInstanceRequest)(nil),     // 7: protos.DestroyInstanceRequest
+	(*DestroyInstanceResponse)(nil),    // 8: protos.DestroyInstanceResponse
+	(*ExecuteCommandRequest)(nil),      // 9: protos.ExecuteCommandRequest
+	(*ExecuteCommandResponse)(nil),     // 10: protos.ExecuteCommandResponse
+	(*Instance)(nil),                   // 11: protos.Instance
+	(*InstanceAliveRequest)(nil),       // 12: protos.InstanceAliveRequest
+	(*InstanceAliveResponse)(nil),      // 13: protos.InstanceAliveResponse
+	(*ListDirectoryRequest)(nil),       // 14: protos.ListDirectoryRequest
+	(*ListDirectoryResponse)(nil),      // 15: protos.ListDirectoryResponse
+	(*ListInstancesRequest)(nil),       // 16: protos.ListInstancesRequest
+	(*ListInstancesResponse)(nil),      // 17: protos.ListInstancesResponse
+	(*ReadTGZToURLRequest)(nil),        // 18: protos.ReadTGZToURLRequest
+	(*ReadTGZToURLResponse)(nil),       // 19: protos.ReadTGZToURLResponse
+	(*RemoveFilesRequest)(nil),         // 20: protos.RemoveFilesRequest
+	(*RemoveFilesResponse)(nil),        // 21: protos.RemoveFilesResponse
+	(*SignSSHKeyRequest)(nil),          // 22: protos.SignSSHKeyRequest
+	(*SignSSHKeyResponse)(nil),         // 23: protos.SignSSHKeyResponse
+	(*UploadFileRequest)(nil),          // 24: protos.UploadFileRequest
+	(*UploadFileResponse)(nil),         // 25: protos.UploadFileResponse
+	(*WriteFileFromURLRequest)(nil),    // 26: protos.WriteFileFromURLRequest
+	(*WriteFileFromURLResponse)(nil),   // 27: protos.WriteFileFromURLResponse
+	(*WriteTGZFromURLRequest)(nil),     // 28: protos.WriteTGZFromURLRequest
+	(*WriteTGZFromURLResponse)(nil),    // 29: protos.WriteTGZFromURLResponse
+	nil,                                // 30: protos.UploadFileResponse.FieldsEntry
 }
 var file_gomote_proto_depIdxs = []int32{
-	9,  // 0: protos.CreateInstanceResponse.instance:type_name -> protos.Instance
+	11, // 0: protos.CreateInstanceResponse.instance:type_name -> protos.Instance
 	0,  // 1: protos.CreateInstanceResponse.status:type_name -> protos.CreateInstanceResponse.Status
-	9,  // 2: protos.ListInstancesResponse.instances:type_name -> protos.Instance
-	28, // 3: protos.UploadFileResponse.fields:type_name -> protos.UploadFileResponse.FieldsEntry
+	11, // 2: protos.ListInstancesResponse.instances:type_name -> protos.Instance
+	30, // 3: protos.UploadFileResponse.fields:type_name -> protos.UploadFileResponse.FieldsEntry
 	1,  // 4: protos.GomoteService.Authenticate:input_type -> protos.AuthenticateRequest
-	3,  // 5: protos.GomoteService.CreateInstance:input_type -> protos.CreateInstanceRequest
-	5,  // 6: protos.GomoteService.DestroyInstance:input_type -> protos.DestroyInstanceRequest
-	7,  // 7: protos.GomoteService.ExecuteCommand:input_type -> protos.ExecuteCommandRequest
-	10, // 8: protos.GomoteService.InstanceAlive:input_type -> protos.InstanceAliveRequest
-	12, // 9: protos.GomoteService.ListDirectory:input_type -> protos.ListDirectoryRequest
-	14, // 10: protos.GomoteService.ListInstances:input_type -> protos.ListInstancesRequest
-	16, // 11: protos.GomoteService.ReadTGZToURL:input_type -> protos.ReadTGZToURLRequest
-	18, // 12: protos.GomoteService.RemoveFiles:input_type -> protos.RemoveFilesRequest
-	20, // 13: protos.GomoteService.SignSSHKey:input_type -> protos.SignSSHKeyRequest
-	22, // 14: protos.GomoteService.UploadFile:input_type -> protos.UploadFileRequest
-	24, // 15: protos.GomoteService.WriteFileFromURL:input_type -> protos.WriteFileFromURLRequest
-	26, // 16: protos.GomoteService.WriteTGZFromURL:input_type -> protos.WriteTGZFromURLRequest
-	2,  // 17: protos.GomoteService.Authenticate:output_type -> protos.AuthenticateResponse
-	4,  // 18: protos.GomoteService.CreateInstance:output_type -> protos.CreateInstanceResponse
-	6,  // 19: protos.GomoteService.DestroyInstance:output_type -> protos.DestroyInstanceResponse
-	8,  // 20: protos.GomoteService.ExecuteCommand:output_type -> protos.ExecuteCommandResponse
-	11, // 21: protos.GomoteService.InstanceAlive:output_type -> protos.InstanceAliveResponse
-	13, // 22: protos.GomoteService.ListDirectory:output_type -> protos.ListDirectoryResponse
-	15, // 23: protos.GomoteService.ListInstances:output_type -> protos.ListInstancesResponse
-	17, // 24: protos.GomoteService.ReadTGZToURL:output_type -> protos.ReadTGZToURLResponse
-	19, // 25: protos.GomoteService.RemoveFiles:output_type -> protos.RemoveFilesResponse
-	21, // 26: protos.GomoteService.SignSSHKey:output_type -> protos.SignSSHKeyResponse
-	23, // 27: protos.GomoteService.UploadFile:output_type -> protos.UploadFileResponse
-	25, // 28: protos.GomoteService.WriteFileFromURL:output_type -> protos.WriteFileFromURLResponse
-	27, // 29: protos.GomoteService.WriteTGZFromURL:output_type -> protos.WriteTGZFromURLResponse
-	17, // [17:30] is the sub-list for method output_type
-	4,  // [4:17] is the sub-list for method input_type
+	4,  // 5: protos.GomoteService.AddBootstrap:input_type -> protos.AddBootstrapRequest
+	3,  // 6: protos.GomoteService.CreateInstance:input_type -> protos.CreateInstanceRequest
+	7,  // 7: protos.GomoteService.DestroyInstance:input_type -> protos.DestroyInstanceRequest
+	9,  // 8: protos.GomoteService.ExecuteCommand:input_type -> protos.ExecuteCommandRequest
+	12, // 9: protos.GomoteService.InstanceAlive:input_type -> protos.InstanceAliveRequest
+	14, // 10: protos.GomoteService.ListDirectory:input_type -> protos.ListDirectoryRequest
+	16, // 11: protos.GomoteService.ListInstances:input_type -> protos.ListInstancesRequest
+	18, // 12: protos.GomoteService.ReadTGZToURL:input_type -> protos.ReadTGZToURLRequest
+	20, // 13: protos.GomoteService.RemoveFiles:input_type -> protos.RemoveFilesRequest
+	22, // 14: protos.GomoteService.SignSSHKey:input_type -> protos.SignSSHKeyRequest
+	24, // 15: protos.GomoteService.UploadFile:input_type -> protos.UploadFileRequest
+	26, // 16: protos.GomoteService.WriteFileFromURL:input_type -> protos.WriteFileFromURLRequest
+	28, // 17: protos.GomoteService.WriteTGZFromURL:input_type -> protos.WriteTGZFromURLRequest
+	2,  // 18: protos.GomoteService.Authenticate:output_type -> protos.AuthenticateResponse
+	5,  // 19: protos.GomoteService.AddBootstrap:output_type -> protos.AddBootstrapResponse
+	6,  // 20: protos.GomoteService.CreateInstance:output_type -> protos.CreateInstanceResponse
+	8,  // 21: protos.GomoteService.DestroyInstance:output_type -> protos.DestroyInstanceResponse
+	10, // 22: protos.GomoteService.ExecuteCommand:output_type -> protos.ExecuteCommandResponse
+	13, // 23: protos.GomoteService.InstanceAlive:output_type -> protos.InstanceAliveResponse
+	15, // 24: protos.GomoteService.ListDirectory:output_type -> protos.ListDirectoryResponse
+	17, // 25: protos.GomoteService.ListInstances:output_type -> protos.ListInstancesResponse
+	19, // 26: protos.GomoteService.ReadTGZToURL:output_type -> protos.ReadTGZToURLResponse
+	21, // 27: protos.GomoteService.RemoveFiles:output_type -> protos.RemoveFilesResponse
+	23, // 28: protos.GomoteService.SignSSHKey:output_type -> protos.SignSSHKeyResponse
+	25, // 29: protos.GomoteService.UploadFile:output_type -> protos.UploadFileResponse
+	27, // 30: protos.GomoteService.WriteFileFromURL:output_type -> protos.WriteFileFromURLResponse
+	29, // 31: protos.GomoteService.WriteTGZFromURL:output_type -> protos.WriteTGZFromURLResponse
+	18, // [18:32] is the sub-list for method output_type
+	4,  // [4:18] is the sub-list for method input_type
 	4,  // [4:4] is the sub-list for extension type_name
 	4,  // [4:4] is the sub-list for extension extendee
 	0,  // [0:4] is the sub-list for field type_name
@@ -1899,7 +2016,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateInstanceResponse); i {
+			switch v := v.(*AddBootstrapRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1911,7 +2028,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DestroyInstanceRequest); i {
+			switch v := v.(*AddBootstrapResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1923,7 +2040,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DestroyInstanceResponse); i {
+			switch v := v.(*CreateInstanceResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1935,7 +2052,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ExecuteCommandRequest); i {
+			switch v := v.(*DestroyInstanceRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1947,7 +2064,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ExecuteCommandResponse); i {
+			switch v := v.(*DestroyInstanceResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1959,7 +2076,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Instance); i {
+			switch v := v.(*ExecuteCommandRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1971,7 +2088,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*InstanceAliveRequest); i {
+			switch v := v.(*ExecuteCommandResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1983,7 +2100,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*InstanceAliveResponse); i {
+			switch v := v.(*Instance); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1995,7 +2112,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListDirectoryRequest); i {
+			switch v := v.(*InstanceAliveRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2007,7 +2124,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListDirectoryResponse); i {
+			switch v := v.(*InstanceAliveResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2019,7 +2136,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListInstancesRequest); i {
+			switch v := v.(*ListDirectoryRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2031,7 +2148,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListInstancesResponse); i {
+			switch v := v.(*ListDirectoryResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2043,7 +2160,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ReadTGZToURLRequest); i {
+			switch v := v.(*ListInstancesRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2055,7 +2172,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ReadTGZToURLResponse); i {
+			switch v := v.(*ListInstancesResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2067,7 +2184,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RemoveFilesRequest); i {
+			switch v := v.(*ReadTGZToURLRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2079,7 +2196,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RemoveFilesResponse); i {
+			switch v := v.(*ReadTGZToURLResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2091,7 +2208,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SignSSHKeyRequest); i {
+			switch v := v.(*RemoveFilesRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2103,7 +2220,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SignSSHKeyResponse); i {
+			switch v := v.(*RemoveFilesResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2115,7 +2232,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UploadFileRequest); i {
+			switch v := v.(*SignSSHKeyRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2127,7 +2244,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UploadFileResponse); i {
+			switch v := v.(*SignSSHKeyResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2139,7 +2256,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*WriteFileFromURLRequest); i {
+			switch v := v.(*UploadFileRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2151,7 +2268,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*WriteFileFromURLResponse); i {
+			switch v := v.(*UploadFileResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2163,7 +2280,7 @@
 			}
 		}
 		file_gomote_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*WriteTGZFromURLRequest); i {
+			switch v := v.(*WriteFileFromURLRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2175,6 +2292,30 @@
 			}
 		}
 		file_gomote_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WriteFileFromURLResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gomote_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WriteTGZFromURLRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gomote_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*WriteTGZFromURLResponse); i {
 			case 0:
 				return &v.state
@@ -2193,7 +2334,7 @@
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_gomote_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   28,
+			NumMessages:   30,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/internal/gomote/protos/gomote.proto b/internal/gomote/protos/gomote.proto
index b370378..f93531e 100644
--- a/internal/gomote/protos/gomote.proto
+++ b/internal/gomote/protos/gomote.proto
@@ -12,6 +12,8 @@
 service GomoteService {
   // Authenticate provides authentication information without any additional action.
   rpc Authenticate (AuthenticateRequest) returns (AuthenticateResponse) {}
+  // AddBootstrap adds the bootstrap version of Go to the work directory.
+  rpc AddBootstrap (AddBootstrapRequest) returns (AddBootstrapResponse) {}
   // CreateInstance creates a gomote instance.
   rpc CreateInstance (CreateInstanceRequest) returns (stream CreateInstanceResponse) {}
   // DestroyInstance destroys a gomote instance.
@@ -51,6 +53,21 @@
   string builder_type = 1;
 }
 
+// AddBootstrapRequest specifies the data needed for a request to add the bootstrap version of Go
+// to the instance.
+message AddBootstrapRequest {
+  // The unique identifier for a gomote instance.
+  string gomote_id = 1;
+}
+
+// AddBootstrapResponse contains the information about the add bootstrap request.
+message AddBootstrapResponse {
+  // The URL for the Go version added to the work directory.
+  // If empty, the bootstrap version is undefined and has probably been included in
+  // the instance image.
+  string bootstrap_go_url = 1;
+}
+
 // CreateInstanceResponse contains data about a created gomote instance.
 message CreateInstanceResponse {
   // Instance information for the requested instance.
diff --git a/internal/gomote/protos/gomote_grpc.pb.go b/internal/gomote/protos/gomote_grpc.pb.go
index 9f14aa5..423e43f 100644
--- a/internal/gomote/protos/gomote_grpc.pb.go
+++ b/internal/gomote/protos/gomote_grpc.pb.go
@@ -20,6 +20,8 @@
 type GomoteServiceClient interface {
 	// Authenticate provides authentication information without any additional action.
 	Authenticate(ctx context.Context, in *AuthenticateRequest, opts ...grpc.CallOption) (*AuthenticateResponse, error)
+	// AddBootstrap adds the bootstrap version of Go to the work directory.
+	AddBootstrap(ctx context.Context, in *AddBootstrapRequest, opts ...grpc.CallOption) (*AddBootstrapResponse, error)
 	// CreateInstance creates a gomote instance.
 	CreateInstance(ctx context.Context, in *CreateInstanceRequest, opts ...grpc.CallOption) (GomoteService_CreateInstanceClient, error)
 	// DestroyInstance destroys a gomote instance.
@@ -65,6 +67,15 @@
 	return out, nil
 }
 
+func (c *gomoteServiceClient) AddBootstrap(ctx context.Context, in *AddBootstrapRequest, opts ...grpc.CallOption) (*AddBootstrapResponse, error) {
+	out := new(AddBootstrapResponse)
+	err := c.cc.Invoke(ctx, "/protos.GomoteService/AddBootstrap", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *gomoteServiceClient) CreateInstance(ctx context.Context, in *CreateInstanceRequest, opts ...grpc.CallOption) (GomoteService_CreateInstanceClient, error) {
 	stream, err := c.cc.NewStream(ctx, &GomoteService_ServiceDesc.Streams[0], "/protos.GomoteService/CreateInstance", opts...)
 	if err != nil {
@@ -225,6 +236,8 @@
 type GomoteServiceServer interface {
 	// Authenticate provides authentication information without any additional action.
 	Authenticate(context.Context, *AuthenticateRequest) (*AuthenticateResponse, error)
+	// AddBootstrap adds the bootstrap version of Go to the work directory.
+	AddBootstrap(context.Context, *AddBootstrapRequest) (*AddBootstrapResponse, error)
 	// CreateInstance creates a gomote instance.
 	CreateInstance(*CreateInstanceRequest, GomoteService_CreateInstanceServer) error
 	// DestroyInstance destroys a gomote instance.
@@ -261,6 +274,9 @@
 func (UnimplementedGomoteServiceServer) Authenticate(context.Context, *AuthenticateRequest) (*AuthenticateResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Authenticate not implemented")
 }
+func (UnimplementedGomoteServiceServer) AddBootstrap(context.Context, *AddBootstrapRequest) (*AddBootstrapResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method AddBootstrap not implemented")
+}
 func (UnimplementedGomoteServiceServer) CreateInstance(*CreateInstanceRequest, GomoteService_CreateInstanceServer) error {
 	return status.Errorf(codes.Unimplemented, "method CreateInstance not implemented")
 }
@@ -328,6 +344,24 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _GomoteService_AddBootstrap_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(AddBootstrapRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GomoteServiceServer).AddBootstrap(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/protos.GomoteService/AddBootstrap",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GomoteServiceServer).AddBootstrap(ctx, req.(*AddBootstrapRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _GomoteService_CreateInstance_Handler(srv interface{}, stream grpc.ServerStream) error {
 	m := new(CreateInstanceRequest)
 	if err := stream.RecvMsg(m); err != nil {
@@ -562,6 +596,10 @@
 			Handler:    _GomoteService_Authenticate_Handler,
 		},
 		{
+			MethodName: "AddBootstrap",
+			Handler:    _GomoteService_AddBootstrap_Handler,
+		},
+		{
 			MethodName: "DestroyInstance",
 			Handler:    _GomoteService_DestroyInstance_Handler,
 		},