Repository: GoogleContainerTools/skaffold
Pull request #7365 (2022-05-02 21:35:17)

ci: fix vulnerability in performance comparison script
**Description**
This PR fixes a potential vulnerability in our performance comparison script.

codecov[bot]: # [Codecov](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools) Report
> Merging [#7365](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools) (4853243) into [main](https://codecov.io/gh/GoogleContainerTools/skaffold/commit/290280e8c6c19231e9ed5b5c027f2c01d22f75be?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools) (290280e) will **decrease** coverage by `3.28%`.
> The diff coverage is `56.35%`.

```diff
@@            Coverage Diff             @@
##             main    #7365      +/-   ##
==========================================
- Coverage   70.48%   67.20%   -3.29%     
==========================================
  Files         515      556      +41     
  Lines       23150    26623    +3473     
==========================================
+ Hits        16317    17891    +1574     
- Misses       5776     7445    +1669     
- Partials     1057     1287     +230     
```


| [Impacted Files](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools) | Coverage Δ | |
|---|---|---|
| [cmd/skaffold/app/cmd/credits/export.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL2FwcC9jbWQvY3JlZGl0cy9leHBvcnQuZ28=) | `0.00% <0.00%> (ø)` | |
| [cmd/skaffold/app/cmd/deploy.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL2FwcC9jbWQvZGVwbG95Lmdv) | `50.00% <0.00%> (-3.85%)` | :arrow_down: |
| [cmd/skaffold/app/cmd/test.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL2FwcC9jbWQvdGVzdC5nbw==) | `44.44% <0.00%> (ø)` | |
| [cmd/skaffold/skaffold.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL3NrYWZmb2xkLmdv) | `0.00% <0.00%> (ø)` | |
| [cmd/skaffold/app/cmd/render.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL2FwcC9jbWQvcmVuZGVyLmdv) | `36.66% <12.50%> (-4.72%)` | :arrow_down: |
| [cmd/skaffold/app/cmd/inspect\_tests.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL2FwcC9jbWQvaW5zcGVjdF90ZXN0cy5nbw==) | `62.50% <14.28%> (-1.14%)` | :arrow_down: |
| [cmd/skaffold/app/cmd/lsp.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL2FwcC9jbWQvbHNwLmdv) | `28.12% <28.12%> (ø)` | |
| [cmd/skaffold/app/cmd/fix.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL2FwcC9jbWQvZml4Lmdv) | `54.09% <38.88%> (-22.38%)` | :arrow_down: |
| [cmd/skaffold/app/cmd/lint.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL2FwcC9jbWQvbGludC5nbw==) | `42.85% <42.85%> (ø)` | |
| [cmd/skaffold/app/cmd/find\_configs.go](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools#diff-Y21kL3NrYWZmb2xkL2FwcC9jbWQvZmluZF9jb25maWdzLmdv) | `48.88% <46.15%> (+0.24%)` | :arrow_up: |
| ... and [270 more](https://codecov.io/gh/GoogleContainerTools/skaffold/pull/7365/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools) | |

:mega: Codecov can now indicate which changes are the most critical in Pull Requests. [Learn more](https://about.codecov.io/product/feature/runtime-insights/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=GoogleContainerTools)


Patch:
diff --git a/.github/workflows/performance-comparison.yml b/.github/workflows/performance-comparison.yml
index 68c17d8fe..dc52a0907 100644
--- a/.github/workflows/performance-comparison.yml
+++ b/.github/workflows/performance-comparison.yml
@@ -106,8 +106,10 @@ jobs:
         sudo install skaffold-from-main-branch /usr/local/bin/
 
     - name: Parse Comment To Yaml Format
+      env:
+        COMMENT_BODY: ${{ github.event.comment.body }}
       run: |
-        tail -n +2 <<< '${{ github.event.comment.body }}' > yaml-input-file.yaml
+        tail -n +2 <<< "$COMMENT_BODY" > yaml-input-file.yaml
 
     - name: Run performance comparison benchmarks
       id: run-performance-comparison-benchmarks
diff --git a/cmd/skaffold/app/cmd/cmd.go b/cmd/skaffold/app/cmd/cmd.go
index deb90ae3b..5ee101ee1 100644
--- a/cmd/skaffold/app/cmd/cmd.go
+++ b/cmd/skaffold/app/cmd/cmd.go
@@ -169,6 +169,7 @@ func NewSkaffoldCommand(out, errOut io.Writer) *cobra.Command {
 				NewCmdDelete(),
 				NewCmdRender(),
 				NewCmdApply(),
+				NewCmdVerify(),
 			},
 		},
 		{
diff --git a/cmd/skaffold/app/cmd/flags.go b/cmd/skaffold/app/cmd/flags.go
index 2a96d3847..86cd10c68 100644
--- a/cmd/skaffold/app/cmd/flags.go
+++ b/cmd/skaffold/app/cmd/flags.go
@@ -122,7 +122,7 @@ var flagRegistry = []Flag{
 		Value:         &opts.DefaultRepo,
 		DefValue:      nil,
 		FlagAddMethod: "Var",
-		DefinedOn:     []string{"dev", "run", "debug", "deploy", "render", "build", "delete"},
+		DefinedOn:     []string{"dev", "run", "debug", "deploy", "render", "build", "delete", "verify"},
 	},
 	{
 		Name:          "cache-artifacts",
@@ -196,7 +196,7 @@ var flagRegistry = []Flag{
 		Value:         &opts.EventLogFile,
 		DefValue:      "",
 		FlagAddMethod: "StringVar",
-		DefinedOn:     []string{"dev", "build", "run", "debug", "deploy", "render", "test", "apply"},
+		DefinedOn:     []string{"dev", "build", "run", "debug", "deploy", "render", "test", "apply", "verify"},
 	},
 	{
 		Name:          "last-log-file",
@@ -213,7 +213,7 @@ var flagRegistry = []Flag{
 		Value:         &opts.RPCPort,
 		DefValue:      nil,
 		FlagAddMethod: "Var",
-		DefinedOn:     []string{"dev", "build", "run", "debug", "deploy", "test"},
+		DefinedOn:     []string{"dev", "build", "run", "debug", "deploy", "test", "verify"},
 	},
 	{
 		Name:          "rpc-http-port",
@@ -221,7 +221,7 @@ var flagRegistry = []Flag{
 		Value:         &opts.RPCHTTPPort,
 		DefValue:      nil,
 		FlagAddMethod: "Var",
-		DefinedOn:     []string{"dev", "build", "run", "debug", "deploy", "test"},
+		DefinedOn:     []string{"dev", "build", "run", "debug", "deploy", "test", "verify"},
 	},
 	{
 		Name:          "label",
@@ -310,7 +310,7 @@ var flagRegistry = []Flag{
 		},
 		NoOptDefVal:   "true", // uses the settings from when --port-forward was boolean
 		FlagAddMethod: "Var",
-		DefinedOn:     []string{"dev", "run", "deploy", "debug"},
+		DefinedOn:     []string{"dev", "run", "deploy", "debug", "verify"},
 		IsEnum:        true,
 	},
 	{
@@ -319,7 +319,7 @@ var flagRegistry = []Flag{
 		Value:         &opts.StatusCheck,
 		DefValue:      nil,
 		FlagAddMethod: "Var",
-		DefinedOn:     []string{"dev", "debug", "deploy", "run", "apply"},
+		DefinedOn:     []string{"dev", "debug", "deploy", "run", "apply", "verify"},
 		IsEnum:        true,
 		NoOptDefVal:   "true",
 	},
@@ -548,7 +548,7 @@ var flagRegistry = []Flag{
 		Value:         &fromBuildOutputFile,
 		DefValue:      "",
 		FlagAddMethod: "Var",
-		DefinedOn:     []string{"deploy", "render", "test"},
+		DefinedOn:     []string{"deploy", "render", "test", "verify"},
 	},
 
 	{
@@ -625,6 +625,15 @@ var flagRegistry = []Flag{
 		FlagAddMethod: "StringVar",
 		DefinedOn:     []string{"dev", "render", "run", "debug", "deploy"},
 	},
+	{
+		Name:          "docker-network",
+		Shorthand:     "",
+		Usage:         "Run verify tests in the specified docker network",
+		Value:         &opts.VerifyDockerNetwork,
+		DefValue:      "",
+		FlagAddMethod: "StringVar",
+		DefinedOn:     []string{"verify"},
+	},
 }
 
 func methodNameByType(v reflect.Value) string {
diff --git a/cmd/skaffold/app/cmd/verify.go b/cmd/skaffold/app/cmd/verify.go
new file mode 100644
index 000000000..5489729fe
--- /dev/null
+++ b/cmd/skaffold/app/cmd/verify.go
@@ -0,0 +1,55 @@
+/*
+Copyright 2019 The Skaffold Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package cmd
+
+import (
+	"context"
+	"io"
+
+	"github.com/spf13/cobra"
+
+	"github.com/GoogleContainerTools/skaffold/cmd/skaffold/app/tips"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/runner"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/util"
+)
+
+// NewCmdVerify describes the CLI command to verify artifacts.
+func NewCmdVerify() *cobra.Command {
+	return NewCmd("verify").
+		WithDescription("Run verification tests against skaffold deployments").
+		WithExample("Deploy with skaffold and then verify deployments", "deploy -q | skaffold verify").
+		WithCommonFlags().
+		WithHouseKeepingMessages().
+		NoArgs(doVerify)
+}
+
+func doVerify(ctx context.Context, out io.Writer) error {
+	return withRunner(ctx, out, func(r runner.Runner, configs []util.VersionedConfig) error {
+		var artifacts []*latest.Artifact
+		for _, cfg := range configs {
+			artifacts = append(artifacts, cfg.(*latest.SkaffoldConfig).Build.Artifacts...)
+		}
+		buildArtifacts, err := getBuildArtifactsAndSetTags(artifacts, r.ApplyDefaultRepo)
+		if err != nil {
+			tips.PrintUseRunVsDeploy(out)
+			return err
+		}
+
+		return r.VerifyAndLog(ctx, out, buildArtifacts)
+	})
+}
diff --git a/docs/content/en/docs/references/cli/_index.md b/docs/content/en/docs/references/cli/_index.md
index ebbefe786..a3221cd6c 100644
--- a/docs/content/en/docs/references/cli/_index.md
+++ b/docs/content/en/docs/references/cli/_index.md
@@ -79,6 +79,7 @@ Pipeline Building Blocks:
   delete            Delete any resources deployed by Skaffold
   render            Perform all image builds, and output rendered Kubernetes manifests
   apply             Apply hydrated manifests to a cluster
+  verify            Run verification tests against skaffold deployments
 
 Getting Started With a New Project:
   init              Generate configuration for deploying an application
@@ -1218,6 +1219,53 @@ Env vars:
 * `SKAFFOLD_SYNC_REMOTE_CACHE` (same as `--sync-remote-cache`)
 * `SKAFFOLD_WAIT_FOR_CONNECTION` (same as `--wait-for-connection`)
 
+### skaffold verify
+
+Run verification tests against skaffold deployments
+
+```
+
+
+Examples:
+  # Deploy with skaffold and then verify deployments
+  skaffold deploy -q | skaffold verify
+
+Options:
+      --assume-yes=false: If true, skaffold will skip yes/no confirmation from the user and default to yes
+  -a, --build-artifacts=: File containing build result from a previous 'skaffold build --file-output'
+  -d, --default-repo='': Default repository value (overrides global config)
+      --docker-network='': Run verify tests in the specified docker network
+  -f, --filename='skaffold.yaml': Path or URL to the Skaffold config file
+  -m, --module=[]: Filter Skaffold configs to only the provided named modules
+      --port-forward=off: Port-forward exposes service ports and container ports within pods and other resources (off, user, services, debug, pods)
+      --remote-cache-dir='': Specify the location of the git repositories cache (default $HOME/.skaffold/repos)
+      --rpc-http-port=: tcp port to expose the Skaffold API over HTTP REST
+      --rpc-port=: tcp port to expose the Skaffold API over gRPC
+      --status-check=: Wait for deployed resources to stabilize
+      --sync-remote-cache='always': Controls how Skaffold manages the remote config cache (see `remote-cache-dir`). One of `always` (default), `missing`, or `never`. `always` syncs remote repositories to latest on access. `missing` only clones remote repositories if they do not exist locally. `never` means the user takes responsibility for updating remote repositories.
+
+Usage:
+  skaffold verify [options]
+
+Use "skaffold options" for a list of global command-line options (applies to all commands).
+
+
+```
+Env vars:
+
+* `SKAFFOLD_ASSUME_YES` (same as `--assume-yes`)
+* `SKAFFOLD_BUILD_ARTIFACTS` (same as `--build-artifacts`)
+* `SKAFFOLD_DEFAULT_REPO` (same as `--default-repo`)
+* `SKAFFOLD_DOCKER_NETWORK` (same as `--docker-network`)
+* `SKAFFOLD_FILENAME` (same as `--filename`)
+* `SKAFFOLD_MODULE` (same as `--module`)
+* `SKAFFOLD_PORT_FORWARD` (same as `--port-forward`)
+* `SKAFFOLD_REMOTE_CACHE_DIR` (same as `--remote-cache-dir`)
+* `SKAFFOLD_RPC_HTTP_PORT` (same as `--rpc-http-port`)
+* `SKAFFOLD_RPC_PORT` (same as `--rpc-port`)
+* `SKAFFOLD_STATUS_CHECK` (same as `--status-check`)
+* `SKAFFOLD_SYNC_REMOTE_CACHE` (same as `--sync-remote-cache`)
+
 ### skaffold version
 
 Print the version information
diff --git a/go.mod b/go.mod
index f99de66d7..f1771f908 100644
--- a/go.mod
+++ b/go.mod
@@ -166,6 +166,7 @@ require (
 	github.com/envoyproxy/protoc-gen-validate v0.6.2 // indirect
 	github.com/evanphx/json-patch v4.9.0+incompatible // indirect
 	github.com/evanphx/json-patch/v5 v5.6.0 // indirect
+	github.com/fatih/semgroup v1.2.0 // indirect
 	github.com/form3tech-oss/jwt-go v3.2.5+incompatible // indirect
 	github.com/francoispqt/gojay v1.2.13 // indirect
 	github.com/fsnotify/fsnotify v1.5.1 // indirect
diff --git a/go.sum b/go.sum
index 2e3facef9..bece49d7d 100644
--- a/go.sum
+++ b/go.sum
@@ -772,6 +772,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/semgroup v1.2.0 h1:h/OLXwEM+3NNyAdZEpMiH1OzfplU09i2qXPVThGZvyg=
+github.com/fatih/semgroup v1.2.0/go.mod h1:1KAD4iIYfXjE4U13B48VM4z9QUwV5Tt8O4rS879kgm8=
 github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
 github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
 github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
diff --git a/hack/golangci.yml b/hack/golangci.yml
index 21fd72079..16d3702db 100644
--- a/hack/golangci.yml
+++ b/hack/golangci.yml
@@ -33,4 +33,7 @@ linters:
 
 linters-settings:
   goimports:
-    local-prefixes: github.com/GoogleContainerTools/skaffold
\ No newline at end of file
+    local-prefixes: github.com/GoogleContainerTools/skaffold
+  maligned:
+      # print struct with more effective memory layout or not, false by default
+      suggest-new: true
\ No newline at end of file
diff --git a/integration/skaffold/helper.go b/integration/skaffold/helper.go
index 40c8f98f6..cd136e106 100644
--- a/integration/skaffold/helper.go
+++ b/integration/skaffold/helper.go
@@ -77,6 +77,11 @@ func Deploy(args ...string) *RunBuilder {
 	return withDefaults("deploy", args)
 }
 
+// Verify runs `skaffold verify` with the given arguments.
+func Verify(args ...string) *RunBuilder {
+	return withDefaults("verify", args)
+}
+
 // Debug runs `skaffold debug` with the given arguments.
 func Debug(args ...string) *RunBuilder {
 	return withDefaults("debug", args)
diff --git a/pkg/skaffold/config/options.go b/pkg/skaffold/config/options.go
index e9d8df68c..c238dea87 100644
--- a/pkg/skaffold/config/options.go
+++ b/pkg/skaffold/config/options.go
@@ -81,6 +81,7 @@ type SkaffoldOptions struct {
 	MinikubeProfile       string
 	RepoCacheDir          string
 	TransformRulesFile    string
+	VerifyDockerNetwork   string
 	CustomLabels          []string
 	TargetImages          []string
 	Profiles              []string
diff --git a/pkg/skaffold/constants/constants.go b/pkg/skaffold/constants/constants.go
index f08d883e9..9c049fc51 100644
--- a/pkg/skaffold/constants/constants.go
+++ b/pkg/skaffold/constants/constants.go
@@ -28,6 +28,7 @@ const (
 	Test        = Phase("Test")
 	Render      = Phase("Render")
 	Deploy      = Phase("Deploy")
+	Verify      = Phase("Verify")
 	StatusCheck = Phase("StatusCheck")
 	PortForward = Phase("PortForward")
 	Sync        = Phase("Sync")
diff --git a/pkg/skaffold/deploy/docker/deploy.go b/pkg/skaffold/deploy/docker/deploy.go
index 06f8afef4..307a66591 100644
--- a/pkg/skaffold/deploy/docker/deploy.go
+++ b/pkg/skaffold/deploy/docker/deploy.go
@@ -30,6 +30,7 @@ import (
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/config"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/debug"
+	dockerport "github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/docker/port"
 	deployerr "github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/error"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/label"
 	dockerutil "github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker"
@@ -55,7 +56,7 @@ type Deployer struct {
 
 	cfg                *latest.DockerDeploy
 	tracker            *tracker.ContainerTracker
-	portManager        *PortManager // functions as Accessor
+	portManager        *dockerport.PortManager // functions as Accessor
 	client             dockerutil.LocalDaemon
 	network            string
 	globalConfig       string
@@ -93,7 +94,7 @@ func NewDeployer(ctx context.Context, cfg dockerutil.Config, labeller *label.Def
 		globalConfig:       cfg.GlobalConfig(),
 		insecureRegistries: cfg.GetInsecureRegistries(),
 		tracker:            tracker,
-		portManager:        NewPortManager(), // fulfills Accessor interface
+		portManager:        dockerport.NewPortManager(), // fulfills Accessor interface
 		debugger:           dbg,
 		logger:             l,
 		monitor:            &status.NoopMonitor{},
@@ -145,7 +146,7 @@ func (d *Deployer) deploy(ctx context.Context, out io.Writer, artifact graph.Art
 		if err := d.client.Delete(ctx, out, container.ID); err != nil {
 			return fmt.Errorf("failed to remove old container %s for image %s: %w", container.ID, artifact.ImageName, err)
 		}
-		d.portManager.relinquishPorts(container.Name)
+		d.portManager.RelinquishPorts(container.Name)
 	}
 	if d.cfg.UseCompose {
 		// TODO(nkubala): implement
@@ -179,13 +180,13 @@ func (d *Deployer) deploy(ctx context.Context, out io.Writer, artifact graph.Art
 		opts.Mounts = mounts
 	}
 
-	bindings, err := d.portManager.allocatePorts(artifact.ImageName, d.resources, containerCfg, debugBindings)
+	bindings, err := d.portManager.AllocatePorts(artifact.ImageName, d.resources, containerCfg, debugBindings)
 	if err != nil {
 		return err
 	}
 	opts.Bindings = bindings
 
-	id, err := d.client.Run(ctx, out, opts)
+	_, _, id, err := d.client.Run(ctx, out, opts)
 	if err != nil {
 		return errors.Wrap(err, "creating container in local docker")
 	}
@@ -225,7 +226,7 @@ func (d *Deployer) setupDebugging(ctx context.Context, out io.Writer, artifact g
 			return nil, errors.Wrap(err, "pulling init container image")
 		}
 		// create the init container
-		id, err := d.client.Run(ctx, out, dockerutil.ContainerCreateOpts{
+		_, _, id, err := d.client.Run(ctx, out, dockerutil.ContainerCreateOpts{
 			ContainerConfig: c,
 		})
 		if err != nil {
@@ -299,7 +300,7 @@ func (d *Deployer) Cleanup(ctx context.Context, out io.Writer, dryRun bool, list
 			// TODO(nkubala): replace with actionable error
 			return errors.Wrap(err, "cleaning up deployed container")
 		}
-		d.portManager.relinquishPorts(container.ID)
+		d.portManager.RelinquishPorts(container.ID)
 	}
 
 	for _, m := range d.debugger.SupportMounts() {
diff --git a/pkg/skaffold/deploy/docker/port.go b/pkg/skaffold/deploy/docker/port/port.go
similarity index 97%
rename from pkg/skaffold/deploy/docker/port.go
rename to pkg/skaffold/deploy/docker/port/port.go
index 1e78245fa..c4368af4e 100644
--- a/pkg/skaffold/deploy/docker/port.go
+++ b/pkg/skaffold/deploy/docker/port/port.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package docker
+package dockerport
 
 import (
 	"context"
@@ -81,7 +81,7 @@ func (pm *PortManager) Stop() {
 	These ports are added to the provided container configuration's port set, and the bindings
 	are returned to be passed to ContainerCreate on Deploy to expose container ports on the host.
 */
-func (pm *PortManager) allocatePorts(containerName string, pf []*latest.PortForwardResource, cfg *container.Config, debugBindings nat.PortMap) (nat.PortMap, error) {
+func (pm *PortManager) AllocatePorts(containerName string, pf []*latest.PortForwardResource, cfg *container.Config, debugBindings nat.PortMap) (nat.PortMap, error) {
 	pm.lock.Lock()
 	defer pm.lock.Unlock()
 	m := make(nat.PortMap)
@@ -150,7 +150,7 @@ func (pm *PortManager) allocatePorts(containerName string, pf []*latest.PortForw
 	return m, nil
 }
 
-func (pm *PortManager) relinquishPorts(containerName string) {
+func (pm *PortManager) RelinquishPorts(containerName string) {
 	pm.lock.Lock()
 	defer pm.lock.Unlock()
 	ports := pm.containerPorts[containerName]
diff --git a/pkg/skaffold/docker/image.go b/pkg/skaffold/docker/image.go
index 36ae38195..ab5cb28aa 100644
--- a/pkg/skaffold/docker/image.go
+++ b/pkg/skaffold/docker/image.go
@@ -71,6 +71,7 @@ type ContainerCreateOpts struct {
 	Bindings        nat.PortMap
 	Mounts          []mount.Mount
 	ContainerConfig *container.Config
+	VerifyTestName  string
 }
 
 // LocalDaemon talks to a local Docker API.
@@ -87,7 +88,7 @@ type LocalDaemon interface {
 	Push(ctx context.Context, out io.Writer, ref string) (string, error)
 	Pull(ctx context.Context, out io.Writer, ref string) error
 	Load(ctx context.Context, out io.Writer, input io.Reader, ref string) (string, error)
-	Run(ctx context.Context, out io.Writer, opts ContainerCreateOpts) (string, error)
+	Run(ctx context.Context, out io.Writer, opts ContainerCreateOpts) (<-chan container.ContainerWaitOKBody, <-chan error, string, error)
 	Delete(ctx context.Context, out io.Writer, id string) error
 	Tag(ctx context.Context, image, ref string) error
 	TagWithImageID(ctx context.Context, ref string, imageID string) (string, error)
@@ -213,9 +214,9 @@ func (l *localDaemon) Delete(ctx context.Context, out io.Writer, id string) erro
 }
 
 // Run creates a container from a given image reference, and returns then container ID.
-func (l *localDaemon) Run(ctx context.Context, out io.Writer, opts ContainerCreateOpts) (string, error) {
+func (l *localDaemon) Run(ctx context.Context, out io.Writer, opts ContainerCreateOpts) (<-chan container.ContainerWaitOKBody, <-chan error, string, error) {
 	if opts.ContainerConfig == nil {
-		return "", fmt.Errorf("cannot call Run with empty container config")
+		return nil, nil, "", fmt.Errorf("cannot call Run with empty container config")
 	}
 	hCfg := &container.HostConfig{
 		NetworkMode:  container.NetworkMode(opts.Network),
@@ -223,17 +224,19 @@ func (l *localDaemon) Run(ctx context.Context, out io.Writer, opts ContainerCrea
 		PortBindings: opts.Bindings,
 		Mounts:       opts.Mounts,
 	}
+
 	c, err := l.apiClient.ContainerCreate(ctx, opts.ContainerConfig, hCfg, nil, nil, opts.Name)
 	if err != nil {
-		return "", err
+		return nil, nil, "", err
 	}
 	if err := l.apiClient.ContainerStart(ctx, c.ID, types.ContainerStartOptions{}); err != nil {
-		return "", err
+		return nil, nil, "", err
 	}
 	if opts.Wait {
-		l.apiClient.ContainerWait(ctx, c.ID, container.WaitConditionNotRunning)
+		statusCh, errCh := l.apiClient.ContainerWait(ctx, c.ID, container.WaitConditionNotRunning)
+		return statusCh, errCh, c.ID, nil
 	}
-	return c.ID, nil
+	return nil, nil, c.ID, nil
 }
 
 func (l *localDaemon) NetworkCreate(ctx context.Context, name string) error {
diff --git a/pkg/skaffold/docker/logger/log.go b/pkg/skaffold/docker/logger/log.go
index e2db4dffe..e9b2f15fa 100644
--- a/pkg/skaffold/docker/logger/log.go
+++ b/pkg/skaffold/docker/logger/log.go
@@ -18,11 +18,14 @@ package logger
 
 import (
 	"context"
+	"fmt"
 	"io"
+	"sync"
 	"sync/atomic"
 	"time"
 
 	"github.com/ahmetb/dlog"
+	"k8s.io/apimachinery/pkg/util/wait"
 
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker/tracker"
@@ -33,11 +36,27 @@ import (
 )
 
 type Logger struct {
-	out         io.Writer
-	tracker     *tracker.ContainerTracker
-	colorPicker output.ColorPicker
-	client      docker.LocalDaemon
-	muted       int32
+	out                 io.Writer
+	tracker             *tracker.ContainerTracker
+	colorPicker         output.ColorPicker
+	client              docker.LocalDaemon
+	hadLogsOutput       sync.Map
+	childThreadEmitLogs AtomicBool
+	muted               int32
+}
+
+type AtomicBool struct{ flag int32 }
+
+func (b *AtomicBool) Set(value bool) {
+	var i int32 = 0
+	if value {
+		i = 1
+	}
+	atomic.StoreInt32(&(b.flag), i)
+}
+
+func (b *AtomicBool) Get() bool {
+	return atomic.LoadInt32(&(b.flag)) != 0
 }
 
 func NewLogger(ctx context.Context, tracker *tracker.ContainerTracker, cfg docker.Config) (*Logger, error) {
@@ -45,10 +64,13 @@ func NewLogger(ctx context.Context, tracker *tracker.ContainerTracker, cfg docke
 	if err != nil {
 		return nil, err
 	}
+	childThreadEmitLogs := AtomicBool{}
+	childThreadEmitLogs.Set(true)
 	return &Logger{
-		tracker:     tracker,
-		client:      cli,
-		colorPicker: output.NewColorPicker(),
+		tracker:             tracker,
+		client:              cli,
+		colorPicker:         output.NewColorPicker(),
+		childThreadEmitLogs: childThreadEmitLogs,
 	}, nil
 }
 
@@ -71,18 +93,59 @@ func (l *Logger) Start(ctx context.Context, out io.Writer) error {
 			case <-ctx.Done():
 				return
 			case id := <-l.tracker.Notifier():
-				go l.streamLogsFromContainer(ctx, id)
+				l.hadLogsOutput.Store(id, false)
+				fmt.Printf("aprindle-3 - here\n")
+				go l.streamLogsFromContainer(ctx, id, false)
 			}
 		}
 	}()
 	return nil
 }
 
-func (l *Logger) streamLogsFromContainer(ctx context.Context, id string) {
+const (
+
+	// RetryDelay is the time to wait in between polling the status of the cloud build
+	RetryDelay = 1 * time.Second
+
+	// BackoffFactor is the exponent for exponential backoff during build status polling
+	BackoffFactor = 1.5
+
+	// BackoffSteps is the number of times we increase the backoff time during exponential backoff
+	BackoffSteps = 10
+
+	// RetryTimeout is the max amount of time to retry getting the status of the build before erroring
+	RetryTimeout = 3 * time.Minute
+)
+
+func NewStatusBackoff() *wait.Backoff {
+	return &wait.Backoff{
+		Duration: RetryDelay,
+		Factor:   float64(BackoffFactor),
+		Steps:    BackoffSteps,
+		Cap:      60 * time.Second,
+	}
+}
+
+func (l *Logger) streamLogsFromContainer(ctx context.Context, id string, force bool) {
 	tr, tw := io.Pipe()
 	go func() {
-		err := l.client.ContainerLogs(ctx, tw, id)
-		if err != nil {
+		var err error
+		backoff := NewStatusBackoff()
+		if waitErr := wait.Poll(backoff.Duration, RetryTimeout, func() (bool, error) {
+			time.Sleep(backoff.Step())
+
+			if !force {
+				if !l.childThreadEmitLogs.Get() {
+					return true, nil
+				}
+			}
+
+			if err = l.client.ContainerLogs(ctx, tw, id); err != nil {
+				return false, nil
+			}
+			l.hadLogsOutput.Store(id, true)
+			return true, nil
+		}); waitErr != nil {
 			// Don't print errors if the user interrupted the logs
 			// or if the logs were interrupted because of a configuration change
 			// TODO(nkubala)[07/23/21]: if container is lost, emit API event and attempt to reattach
@@ -93,7 +156,6 @@ func (l *Logger) streamLogsFromContainer(ctx context.Context, id string) {
 		}
 		_ = tw.Close()
 	}()
-
 	dr := dlog.NewReader(tr) // https://ahmet.im/blog/docker-logs-api-binary-format-explained/
 	formatter := NewDockerLogFormatter(l.colorPicker, l.tracker, l.IsMuted, id)
 	if err := logstream.StreamRequest(ctx, l.out, formatter, dr); err != nil {
@@ -105,6 +167,15 @@ func (l *Logger) Stop() {
 	if l == nil {
 		return
 	}
+	l.childThreadEmitLogs.Set(false)
+
+	l.hadLogsOutput.Range(func(key, value interface{}) bool {
+		if !value.(bool) {
+			fmt.Printf("aprindle-4 - here\n")
+			l.streamLogsFromContainer(context.TODO(), key.(string), true)
+		}
+		return true
+	})
 
 	l.tracker.Reset()
 }
diff --git a/pkg/skaffold/event/v2/event.go b/pkg/skaffold/event/v2/event.go
index 1424f9cb9..88d86ab5d 100644
--- a/pkg/skaffold/event/v2/event.go
+++ b/pkg/skaffold/event/v2/event.go
@@ -255,6 +255,11 @@ func (ev *eventHandler) handleExec(event *proto.Event) {
 		ev.stateLock.Lock()
 		ev.state.RenderState.Status = te.Status
 		ev.stateLock.Unlock()
+	case *proto.Event_VerifyEvent:
+		te := e.VerifyEvent
+		ev.stateLock.Lock()
+		ev.state.VerifyState.Status = te.Status
+		ev.stateLock.Unlock()
 	case *proto.Event_DeploySubtaskEvent:
 		de := e.DeploySubtaskEvent
 		ev.stateLock.Lock()
diff --git a/pkg/skaffold/event/v2/state.go b/pkg/skaffold/event/v2/state.go
index c839046fc..c8ace2560 100644
--- a/pkg/skaffold/event/v2/state.go
+++ b/pkg/skaffold/event/v2/state.go
@@ -82,6 +82,10 @@ func emptyStateWithArtifacts(builds map[string]string, metadata *proto.Metadata,
 			AutoTrigger: autoDeploy,
 			StatusCode:  proto.StatusCode_OK,
 		},
+		VerifyState: &proto.VerifyState{
+			Status:     NotStarted,
+			StatusCode: proto.StatusCode_OK,
+		},
 		StatusCheckState: emptyStatusCheckState(),
 		ForwardedPorts:   make(map[int32]*proto.PortForwardEvent),
 		FileSyncState: &proto.FileSyncState{
diff --git a/pkg/skaffold/event/v2/verify.go b/pkg/skaffold/event/v2/verify.go
new file mode 100644
index 000000000..bfa408951
--- /dev/null
+++ b/pkg/skaffold/event/v2/verify.go
@@ -0,0 +1,61 @@
+/*
+Copyright 2021 The Skaffold Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v2
+
+import (
+	"fmt"
+
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/constants"
+	sErrors "github.com/GoogleContainerTools/skaffold/pkg/skaffold/errors"
+	proto "github.com/GoogleContainerTools/skaffold/proto/v2"
+)
+
+// VerifyInProgress adds an event to mark a render process starts.
+func VerifyInProgress(name string) {
+	handler.handleVerifySubtaskEvent(&proto.VerifySubtaskEvent{
+		Id:     name,
+		TaskId: fmt.Sprintf("%s-%d", constants.Verify, handler.iteration),
+		Status: InProgress,
+	})
+}
+
+// VerifyFailed adds an event to mark a render process has been failed.
+func VerifyFailed(name string, err error) {
+	handler.handleVerifySubtaskEvent(&proto.VerifySubtaskEvent{
+		Id:            name,
+		TaskId:        fmt.Sprintf("%s-%d", constants.Verify, handler.iteration),
+		Status:        Failed,
+		ActionableErr: sErrors.ActionableErrV2(handler.cfg, constants.Verify, err),
+	})
+}
+
+// VerifySucceeded adds an event to mark a render process has been succeeded.
+func VerifySucceeded(name string) {
+	handler.handleVerifySubtaskEvent(&proto.VerifySubtaskEvent{
+		Id:     name,
+		TaskId: fmt.Sprintf("%s-%d", constants.Verify, handler.iteration),
+		Status: Succeeded,
+	})
+}
+
+func (ev *eventHandler) handleVerifySubtaskEvent(e *proto.VerifySubtaskEvent) {
+	ev.handle(&proto.Event{
+		EventType: &proto.Event_VerifyEvent{
+			VerifyEvent: e,
+		},
+	})
+}
diff --git a/pkg/skaffold/runner/runcontext/v2/context.go b/pkg/skaffold/runner/runcontext/v2/context.go
index 672f9a589..f900b0df1 100644
--- a/pkg/skaffold/runner/runcontext/v2/context.go
+++ b/pkg/skaffold/runner/runcontext/v2/context.go
@@ -255,6 +255,7 @@ func (rc *RunContext) RPCPort() *int                                 { return rc
 func (rc *RunContext) RPCHTTPPort() *int                             { return rc.Opts.RPCHTTPPort.Value() }
 func (rc *RunContext) PushImages() config.BoolOrUndefined            { return rc.Opts.PushImages }
 func (rc *RunContext) TransformRulesFile() string                    { return rc.Opts.TransformRulesFile }
+func (rc *RunContext) VerifyDockerNetwork() string                   { return rc.Opts.VerifyDockerNetwork }
 func (rc *RunContext) JSONParseConfig() latest.JSONParseConfig {
 	return rc.DefaultPipeline().Deploy.Logs.JSONParse
 }
diff --git a/pkg/skaffold/runner/runner.go b/pkg/skaffold/runner/runner.go
index 3a10586f6..c773c8264 100644
--- a/pkg/skaffold/runner/runner.go
+++ b/pkg/skaffold/runner/runner.go
@@ -48,4 +48,6 @@ type Runner interface {
 	// "output" arg is only used in Render v1.
 	Render(ctx context.Context, out io.Writer, builds []graph.Artifact, offline bool, output string) (manifest.ManifestList, error)
 	Test(context.Context, io.Writer, []graph.Artifact) error
+	Verify(context.Context, io.Writer, []graph.Artifact) error
+	VerifyAndLog(context.Context, io.Writer, []graph.Artifact) error
 }
diff --git a/pkg/skaffold/runner/v2/new.go b/pkg/skaffold/runner/v2/new.go
index 130592378..4c34a2208 100644
--- a/pkg/skaffold/runner/v2/new.go
+++ b/pkg/skaffold/runner/v2/new.go
@@ -40,6 +40,7 @@ import (
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/tag"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/test"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/trigger"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/verify"
 )
 
 // NewForConfig returns a new SkaffoldRunner for a SkaffoldConfig
@@ -97,6 +98,14 @@ func NewForConfig(ctx context.Context, runCtx *runcontext.RunContext) (*Skaffold
 		endTrace(instrumentation.TraceEndError(err))
 		return nil, fmt.Errorf("getting target platforms: %w", err)
 	}
+
+	var verifier verify.Verifier
+	verifier, err = runner.GetVerifier(ctx, runCtx, labeller)
+	if err != nil {
+		endTrace(instrumentation.TraceEndError(err))
+		return nil, fmt.Errorf("creating verifier: %w", err)
+	}
+
 	// The Builder must be instantiated AFTER the Deployer, because the Deploy target influences
 	// the Cluster object on the RunContext, which in turn influences whether or not we will push images.
 	var builder build.Builder
@@ -162,6 +171,7 @@ func NewForConfig(ctx context.Context, runCtx *runcontext.RunContext) (*Skaffold
 		runCtx:             runCtx,
 		intents:            intents,
 		isLocalImage:       isLocalImage,
+		verifier:           verifier,
 	}, nil
 }
 
diff --git a/pkg/skaffold/runner/v2/runner.go b/pkg/skaffold/runner/v2/runner.go
index abfa2e5c8..5cd7b7ce8 100644
--- a/pkg/skaffold/runner/v2/runner.go
+++ b/pkg/skaffold/runner/v2/runner.go
@@ -27,6 +27,7 @@ import (
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/runner"
 	runcontext "github.com/GoogleContainerTools/skaffold/pkg/skaffold/runner/runcontext/v2"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/test"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/verify"
 )
 
 // SkaffoldRunner is responsible for running the skaffold build, test and deploy config.
@@ -37,6 +38,7 @@ type SkaffoldRunner struct {
 
 	renderer renderer.Renderer
 	deployer deploy.Deployer
+	verifier verify.Verifier
 	monitor  filemon.Monitor
 	listener runner.Listener
 
diff --git a/pkg/skaffold/runner/v2/verify.go b/pkg/skaffold/runner/v2/verify.go
new file mode 100644
index 000000000..2a1ceefac
--- /dev/null
+++ b/pkg/skaffold/runner/v2/verify.go
@@ -0,0 +1,122 @@
+/*
+Copyright 2019 The Skaffold Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v2
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"time"
+
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/constants"
+	deployutil "github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/util"
+	eventV2 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/event/v2"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/instrumentation"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/output"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/output/log"
+)
+
+// VerifyAndLog deploys a list of already built artifacts and optionally show the logs.
+func (r *SkaffoldRunner) VerifyAndLog(ctx context.Context, out io.Writer, artifacts []graph.Artifact) error {
+	defer r.verifier.GetLogger().Stop()
+
+	// Logs should be retrieved up to just before the deploys
+	r.verifier.GetLogger().SetSince(time.Now())
+
+	// Start logger immediately as it needs to be running to get test logs immediately
+	if err := r.verifier.GetLogger().Start(ctx, out); err != nil {
+		return fmt.Errorf("starting logger: %w", err)
+	}
+
+	// Run verify
+	if err := r.Verify(ctx, out, artifacts); err != nil {
+		return err
+	}
+
+	defer r.verifier.GetAccessor().Stop()
+
+	if err := r.verifier.GetAccessor().Start(ctx, out); err != nil {
+		log.Entry(ctx).Warn("Error starting port forwarding:", err)
+	}
+
+	return nil
+}
+
+func (r *SkaffoldRunner) Verify(ctx context.Context, out io.Writer, artifacts []graph.Artifact) error {
+	defer r.verifier.GetStatusMonitor().Reset()
+
+	out, ctx = output.WithEventContext(ctx, out, constants.Verify, constants.SubtaskIDNone)
+
+	output.Default.Fprintln(out, "Tags used in verification:")
+
+	for _, artifact := range artifacts {
+		output.Default.Fprintf(out, " - %s -> ", artifact.ImageName)
+		fmt.Fprintln(out, artifact.Tag)
+	}
+
+	var localImages []graph.Artifact
+	for _, a := range artifacts {
+		if isLocal, err := r.isLocalImage(a.ImageName); err != nil {
+			return err
+		} else if isLocal {
+			localImages = append(localImages, a)
+		}
+	}
+
+	if len(localImages) > 0 {
+		log.Entry(ctx).Debug(`Local images can't be referenced by digest.
+They are tagged and referenced by a unique, local only, tag instead.
+See https://skaffold.dev/docs/pipeline-stages/taggers/#how-tagging-works`)
+	}
+
+	deployOut, postDeployFn, err := deployutil.WithLogFile(time.Now().Format(deployutil.TimeFormat)+".log", out, r.runCtx.Muted())
+	if err != nil {
+		return err
+	}
+
+	eventV2.TaskInProgress(constants.Verify, "Running verification test(s) locally")
+	ctx, endTrace := instrumentation.StartTrace(ctx, "Verify_Verifying")
+	defer endTrace()
+
+	// we only want to register images that are local AND were built by this runner OR forced to load via flag
+	var localAndBuiltImages []graph.Artifact
+	for _, image := range localImages {
+		if r.runCtx.ForceLoadImages() || r.wasBuilt(image.Tag) {
+			localAndBuiltImages = append(localAndBuiltImages, image)
+		}
+	}
+
+	r.verifier.RegisterLocalImages(localAndBuiltImages)
+	err = r.verifier.Verify(ctx, deployOut, artifacts)
+	r.hasDeployed = true // set even if deploy may have failed, because we want to cleanup any partially created resources
+	postDeployFn()
+	if err != nil {
+		eventV2.TaskFailed(constants.Verify, err)
+		endTrace(instrumentation.TraceEndError(err))
+		return err
+	}
+
+	_, postStatusCheckFn, err := deployutil.WithStatusCheckLogFile(time.Now().Format(deployutil.TimeFormat)+".log", out, r.runCtx.Muted())
+	defer postStatusCheckFn()
+	if err != nil {
+		endTrace(instrumentation.TraceEndError(err))
+		return err
+	}
+	eventV2.TaskSucceeded(constants.Verify)
+	return nil
+}
diff --git a/pkg/skaffold/runner/verifier.go b/pkg/skaffold/runner/verifier.go
new file mode 100644
index 000000000..d793c2c01
--- /dev/null
+++ b/pkg/skaffold/runner/verifier.go
@@ -0,0 +1,50 @@
+/*
+Copyright 2021 The Skaffold Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package runner
+
+import (
+	"context"
+	"errors"
+
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/label"
+	runcontext "github.com/GoogleContainerTools/skaffold/pkg/skaffold/runner/runcontext/v2"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/verify"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/verify/docker"
+)
+
+// GetVerifier creates a verifier from a given RunContext and deploy pipeline definitions.
+func GetVerifier(ctx context.Context, runCtx *runcontext.RunContext, labeller *label.DefaultLabeller) (verify.Verifier, error) {
+	localDeploy := false
+	remoteDeploy := false
+
+	var deployers []verify.Verifier
+	localDeploy = true
+
+	if localDeploy && remoteDeploy {
+		return nil, errors.New("docker deployment not supported alongside cluster deployments")
+	}
+
+	for _, p := range runCtx.GetPipelines() {
+		d, err := docker.NewVerifier(ctx, runCtx, labeller, p.Verify, runCtx.PortForwardResources(), runCtx.VerifyDockerNetwork())
+		if err != nil {
+			return nil, err
+		}
+		deployers = append(deployers, d)
+	}
+
+	return verify.NewVerifierMux(deployers, runCtx.IterativeStatusCheck()), nil
+}
diff --git a/pkg/skaffold/schema/validation/validation.go b/pkg/skaffold/schema/validation/validation.go
index eac210a62..76516249c 100644
--- a/pkg/skaffold/schema/validation/validation.go
+++ b/pkg/skaffold/schema/validation/validation.go
@@ -85,6 +85,7 @@ func ProcessToErrorWithLocation(configs parser.SkaffoldConfigSet, validateConfig
 		errs = append(errs, validateTaggingPolicy(config, config.Build)...)
 		errs = append(errs, validateCustomTest(config, config.Test)...)
 		errs = append(errs, validateGCBConfig(config, config.Build)...)
+		errs = append(errs, validateVerifyTests(config, config.Verify)...)
 	}
 	errs = append(errs, validateArtifactDependencies(configs)...)
 	if validateConfig.CheckDeploySource {
@@ -660,6 +661,24 @@ func validateLogPrefix(cfg *parser.SkaffoldConfigEntry, lc latest.LogsConfig) []
 	return nil
 }
 
+// validateVerifyTests
+// - makes sure that each test name is unique
+func validateVerifyTests(cfg *parser.SkaffoldConfigEntry, tcs []*latest.VerifyTestCase) (cfgErrs []ErrorWithLocation) {
+	seen := map[string]bool{}
+	for i, tc := range tcs {
+		if _, ok := seen[tc.Name]; ok {
+			return []ErrorWithLocation{
+				{
+					Error:    fmt.Errorf("found duplicate name '%s' in 'verify' test cases. 'verify' test case names must be unique", tc.Name),
+					Location: cfg.YAMLInfos.Locate(&cfg.Verify[i]),
+				},
+			}
+		}
+		seen[tc.Name] = true
+	}
+	return nil
+}
+
 // validateCustomTest
 // - makes sure that command is not empty
 // - makes sure that dependencies.ignore is only used in conjunction with dependencies.paths
diff --git a/pkg/skaffold/verify/docker/verify.go b/pkg/skaffold/verify/docker/verify.go
new file mode 100644
index 000000000..755f4b3de
--- /dev/null
+++ b/pkg/skaffold/verify/docker/verify.go
@@ -0,0 +1,313 @@
+/*
+Copyright 2021 The Skaffold Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package docker
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"math"
+	"os"
+	"strings"
+	"sync"
+	"time"
+
+	"github.com/docker/docker/api/types/container"
+	"github.com/docker/go-connections/nat"
+	"github.com/fatih/semgroup"
+	"github.com/pkg/errors"
+
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/constants"
+	dockerport "github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/docker/port"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/label"
+	dockerutil "github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker/logger"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker/tracker"
+	eventV2 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/event/v2"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/output"
+	olog "github.com/GoogleContainerTools/skaffold/pkg/skaffold/output/log"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/status"
+	pkgsync "github.com/GoogleContainerTools/skaffold/pkg/skaffold/sync"
+)
+
+type Verifier struct {
+	logger  log.Logger
+	monitor status.Monitor
+	syncer  pkgsync.Syncer
+
+	cfg                []*latest.VerifyTestCase
+	tracker            *tracker.ContainerTracker
+	portManager        *dockerport.PortManager // functions as Accessor
+	client             dockerutil.LocalDaemon
+	network            string
+	globalConfig       string
+	insecureRegistries map[string]bool
+	resources          []*latest.PortForwardResource
+	once               sync.Once
+	testTimeout        time.Duration
+}
+
+func NewVerifier(ctx context.Context, cfg dockerutil.Config, labeller *label.DefaultLabeller, testCases []*latest.VerifyTestCase, resources []*latest.PortForwardResource, network string) (*Verifier, error) {
+	client, err := dockerutil.NewAPIClient(ctx, cfg)
+	if err != nil {
+		return nil, err
+	}
+
+	tracker := tracker.NewContainerTracker()
+	l, err := logger.NewLogger(ctx, tracker, cfg)
+	if err != nil {
+		return nil, err
+	}
+
+	ntwrk := fmt.Sprintf("skaffold-network-%s", labeller.GetRunID())
+	if network != "" {
+		ntwrk = network
+	}
+
+	return &Verifier{
+		cfg:                testCases,
+		client:             client,
+		network:            ntwrk,
+		resources:          resources,
+		globalConfig:       cfg.GlobalConfig(),
+		insecureRegistries: cfg.GetInsecureRegistries(),
+		tracker:            tracker,
+		portManager:        dockerport.NewPortManager(), // fulfills Accessor interface
+		logger:             l,
+		monitor:            &status.NoopMonitor{},
+		syncer:             pkgsync.NewContainerSyncer(),
+		// TODO(aaron-prindle) make testTimeout user configurable
+		testTimeout: time.Minute * 10,
+	}, nil
+}
+
+func (v *Verifier) TrackBuildArtifacts(artifacts []graph.Artifact) {
+	v.logger.RegisterArtifacts(artifacts)
+}
+
+// TrackContainerFromBuild adds an artifact and its newly-associated container
+// to the container tracker.
+func (v *Verifier) TrackContainerFromBuild(artifact graph.Artifact, container tracker.Container) {
+	v.tracker.Add(artifact, container)
+}
+
+// Verify executes specified artifacts by creating containers in the local docker daemon
+// from each specified image, executing them, and waiting for execution to complete.
+func (v *Verifier) Verify(ctx context.Context, out io.Writer, allbuilds []graph.Artifact) error {
+	var err error
+	v.once.Do(func() {
+		err = v.client.NetworkCreate(ctx, v.network)
+	})
+	if err != nil {
+		return fmt.Errorf("creating skaffold network %s: %w", v.network, err)
+	}
+
+	builds := []graph.Artifact{}
+	const maxWorkers = math.MaxInt64
+	s := semgroup.NewGroup(context.Background(), maxWorkers)
+
+	for _, tc := range v.cfg {
+		var nb graph.Artifact
+		foundArtifact := false
+		testCase := tc
+		for _, b := range allbuilds {
+			if tc.Container.Image == b.ImageName {
+				foundArtifact = true
+				nb = graph.Artifact{
+					ImageName: tc.Container.Image,
+					Tag:       b.Tag,
+				}
+				builds = append(builds, nb)
+				break
+			}
+		}
+		if !foundArtifact {
+			err = v.client.Pull(ctx, out, tc.Container.Image)
+			if err != nil {
+				return err
+			}
+			nb = graph.Artifact{
+				ImageName: tc.Container.Image,
+				Tag:       tc.Container.Image,
+			}
+			builds = append(builds, nb)
+		}
+		s.Go(func() error {
+			fmt.Printf("aprindle-1 - here\n")
+			return v.createAndRunContainer(ctx, out, nb, *testCase)
+		})
+	}
+	v.TrackBuildArtifacts(builds)
+	return s.Wait()
+}
+
+// createAndRunContainer creates and runs a container in the local docker daemon from the specified verify image.
+func (v *Verifier) createAndRunContainer(ctx context.Context, out io.Writer, artifact graph.Artifact, tc latest.VerifyTestCase) error {
+	out, ctx = output.WithEventContext(ctx, out, constants.Verify, tc.Name)
+
+	if container, found := v.tracker.ContainerForImage(artifact.ImageName); found {
+		olog.Entry(ctx).Debugf("removing old container %s for image %s", container.ID, artifact.ImageName)
+		if err := v.client.Delete(ctx, out, container.ID); err != nil {
+			return fmt.Errorf("failed to remove old container %s for image %s: %w", container.ID, artifact.ImageName, err)
+		}
+		v.portManager.RelinquishPorts(container.Name)
+	}
+	containerCfg, err := v.containerConfigFromImage(ctx, artifact.Tag)
+	if err != nil {
+		return err
+	}
+
+	// user has set the container Entrypoint, use user value
+	if len(tc.Container.Command) != 0 {
+		containerCfg.Entrypoint = tc.Container.Command
+	}
+
+	// user has set the container Cmd values, use user value
+	if len(tc.Container.Args) != 0 {
+		containerCfg.Cmd = tc.Container.Args
+	}
+	containerName := v.getContainerName(ctx, artifact.ImageName)
+	opts := dockerutil.ContainerCreateOpts{
+		Name:            containerName,
+		Network:         v.network,
+		ContainerConfig: containerCfg,
+		VerifyTestName:  tc.Name,
+	}
+
+	bindings, err := v.portManager.AllocatePorts(artifact.ImageName, v.resources, containerCfg, nat.PortMap{})
+	if err != nil {
+		return err
+	}
+	opts.Bindings = bindings
+	// verify waits for run to complete
+	opts.Wait = true
+	// verify passes through os env to container env
+	opts.ContainerConfig.Env = os.Environ()
+
+	eventV2.VerifyInProgress(opts.VerifyTestName)
+	statusCh, errCh, id, err := v.client.Run(ctx, out, opts)
+	if err != nil {
+		eventV2.VerifyFailed(tc.Name, err)
+		return errors.Wrap(err, "creating container in local docker")
+	}
+	v.TrackContainerFromBuild(artifact, tracker.Container{Name: containerName, ID: id})
+
+	fmt.Printf("aprindle-2 - here\n")
+	var containerErr error
+	select {
+	case err := <-errCh:
+		if err != nil {
+			containerErr = err
+		}
+	case status := <-statusCh:
+		if status.StatusCode != 0 {
+			containerErr = errors.New(fmt.Sprintf("%q running container image %q errored during run with status code: %d", opts.VerifyTestName, opts.ContainerConfig.Image, status.StatusCode))
+		}
+	case <-time.After(v.testTimeout):
+		// verify test timed out
+		containerErr = errors.New(fmt.Sprintf("%q running container image %q timed out after : %s", opts.VerifyTestName, opts.ContainerConfig.Image, v.testTimeout))
+		err := v.client.Delete(ctx, out, id)
+		if err != nil {
+			return errors.Wrap(containerErr, err.Error())
+		}
+	}
+
+	if containerErr != nil {
+		eventV2.VerifyFailed(tc.Name, containerErr)
+		return errors.Wrap(containerErr, "verify test failed")
+	}
+
+	eventV2.VerifySucceeded(opts.VerifyTestName)
+	return nil
+}
+
+func (v *Verifier) containerConfigFromImage(ctx context.Context, taggedImage string) (*container.Config, error) {
+	config, _, err := v.client.ImageInspectWithRaw(ctx, taggedImage)
+	if err != nil {
+		return nil, err
+	}
+	config.Config.Image = taggedImage // the client replaces this with an image ID. put back the originally provided tagged image
+	return config.Config, err
+}
+
+func (v *Verifier) getContainerName(ctx context.Context, name string) string {
+	// this is done to fix the for naming convention of non-skaffold built images which verify supports
+	name = strings.Split(name, ":")[0]
+	currentName := name
+
+	counter := 1
+	for {
+		if !v.client.ContainerExists(ctx, currentName) {
+			break
+		}
+		currentName = fmt.Sprintf("%s-%d", name, counter)
+		counter++
+	}
+
+	if currentName != name {
+		olog.Entry(ctx).Debugf("container %s already present in local daemon: using %s instead", name, currentName)
+	}
+	return currentName
+}
+
+func (v *Verifier) Dependencies() ([]string, error) {
+	// noop since there is no deploy config
+	return nil, nil
+}
+
+func (v *Verifier) Cleanup(ctx context.Context, out io.Writer, dryRun bool) error {
+	if dryRun {
+		for _, container := range v.tracker.DeployedContainers() {
+			output.Yellow.Fprintln(out, container.ID)
+		}
+		return nil
+	}
+	for _, container := range v.tracker.DeployedContainers() {
+		if err := v.client.Delete(ctx, out, container.ID); err != nil {
+			// TODO(nkubala): replace with actionable error
+			return errors.Wrap(err, "cleaning up deployed container")
+		}
+		v.portManager.RelinquishPorts(container.ID)
+	}
+
+	err := v.client.NetworkRemove(ctx, v.network)
+	return errors.Wrap(err, "cleaning up skaffold created network")
+}
+
+func (v *Verifier) GetAccessor() access.Accessor {
+	return v.portManager
+}
+
+func (v *Verifier) GetLogger() log.Logger {
+	return v.logger
+}
+
+func (v *Verifier) GetSyncer() pkgsync.Syncer {
+	return v.syncer
+}
+
+func (v *Verifier) GetStatusMonitor() status.Monitor {
+	return v.monitor
+}
+
+func (v *Verifier) RegisterLocalImages([]graph.Artifact) {
+	// all images are local, so this is a noop
+}
diff --git a/pkg/skaffold/verify/verify.go b/pkg/skaffold/verify/verify.go
new file mode 100644
index 000000000..c3b7b499e
--- /dev/null
+++ b/pkg/skaffold/verify/verify.go
@@ -0,0 +1,61 @@
+/*
+Copyright 2019 The Skaffold Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package verify
+
+import (
+	"context"
+	"io"
+
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/status"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/sync"
+)
+
+// Verifier is the Verify API of skaffold and responsible for deploying
+// the build results to a Kubernetes cluster
+type Verifier interface {
+	// Verify should ensure that the verify test is run to completion
+	Verify(context.Context, io.Writer, []graph.Artifact) error
+
+	// Dependencies returns a list of files that the deployer depends on.
+	// In dev mode, a redeploy will be triggered
+	Dependencies() ([]string, error)
+
+	// Cleanup deletes what was deployed/executed by calling Verify.
+	Cleanup(context.Context, io.Writer, bool) error
+
+	// GetLogger returns a Verifier's implementation of a Logger
+	GetLogger() log.Logger
+
+	// GetAccessor returns a Verifier's implementation of an Accessor
+	GetAccessor() access.Accessor
+
+	// TODO(aaron-prindle) check whether it makes sense to keep Syncer in the verify API
+	// GetSyncer returns a Verifier's implementation of a Syncer
+	GetSyncer() sync.Syncer
+
+	// TrackBuildArtifacts registers build artifacts to be tracked by a Verifier
+	TrackBuildArtifacts([]graph.Artifact)
+
+	// RegisterLocalImages tracks all local images to be loaded by the Verifier
+	RegisterLocalImages([]graph.Artifact)
+
+	// GetStatusMonitor returns a Verifier's implementation of a StatusMonitor
+	GetStatusMonitor() status.Monitor
+}
diff --git a/pkg/skaffold/verify/verify_mux.go b/pkg/skaffold/verify/verify_mux.go
new file mode 100644
index 000000000..37f594b57
--- /dev/null
+++ b/pkg/skaffold/verify/verify_mux.go
@@ -0,0 +1,156 @@
+/*
+Copyright 2019 The Skaffold Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package verify
+
+import (
+	"context"
+	"io"
+
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/instrumentation"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/output"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/status"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/sync"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/util/stringset"
+)
+
+// VerifierMux forwards all method calls to the verifiers it contains.
+// When encountering an error, it aborts and returns the error. Otherwise,
+// it collects the results and returns it in bulk.
+type VerifierMux struct {
+	iterativeStatusCheck bool
+	verifiers            []Verifier
+}
+
+type verifierWithHooks interface {
+	HasRunnableHooks() bool
+	PreDeployHooks(context.Context, io.Writer) error
+	PostDeployHooks(context.Context, io.Writer) error
+}
+
+func NewVerifierMux(verifiers []Verifier, iterativeStatusCheck bool) Verifier {
+	return VerifierMux{verifiers: verifiers, iterativeStatusCheck: iterativeStatusCheck}
+}
+
+func (m VerifierMux) GetVerifiers() []Verifier {
+	return m.verifiers
+}
+
+func (m VerifierMux) GetAccessor() access.Accessor {
+	var accessors access.AccessorMux
+	for _, deployer := range m.verifiers {
+		accessors = append(accessors, deployer.GetAccessor())
+	}
+	return accessors
+}
+
+func (m VerifierMux) GetLogger() log.Logger {
+	var loggers log.LoggerMux
+	for _, deployer := range m.verifiers {
+		loggers = append(loggers, deployer.GetLogger())
+	}
+	return loggers
+}
+
+func (m VerifierMux) GetStatusMonitor() status.Monitor {
+	var monitors status.MonitorMux
+	for _, deployer := range m.verifiers {
+		monitors = append(monitors, deployer.GetStatusMonitor())
+	}
+	return monitors
+}
+
+func (m VerifierMux) GetSyncer() sync.Syncer {
+	var syncers sync.SyncerMux
+	for _, deployer := range m.verifiers {
+		syncers = append(syncers, deployer.GetSyncer())
+	}
+	return syncers
+}
+
+func (m VerifierMux) RegisterLocalImages(images []graph.Artifact) {
+	for _, deployer := range m.verifiers {
+		deployer.RegisterLocalImages(images)
+	}
+}
+
+func (m VerifierMux) Verify(ctx context.Context, w io.Writer, as []graph.Artifact) error {
+	for _, deployer := range m.verifiers {
+		ctx, endTrace := instrumentation.StartTrace(ctx, "Deploy")
+		runHooks := false
+		deployHooks, ok := deployer.(verifierWithHooks)
+		if ok {
+			runHooks = deployHooks.HasRunnableHooks()
+		}
+		if runHooks {
+			if err := deployHooks.PreDeployHooks(ctx, w); err != nil {
+				return err
+			}
+		}
+		if err := deployer.Verify(ctx, w, as); err != nil {
+			endTrace(instrumentation.TraceEndError(err))
+			return err
+		}
+		// Always run iterative status check if there are deploy hooks.
+		// This is required otherwise the deploy hooks can get erreneously executed on older pods from a previous deployment.
+		if runHooks || m.iterativeStatusCheck {
+			if err := deployer.GetStatusMonitor().Check(ctx, w); err != nil {
+				endTrace(instrumentation.TraceEndError(err))
+				return err
+			}
+		}
+		if runHooks {
+			if err := deployHooks.PostDeployHooks(ctx, w); err != nil {
+				return err
+			}
+		}
+		endTrace()
+	}
+
+	return nil
+}
+
+func (m VerifierMux) Dependencies() ([]string, error) {
+	deps := stringset.New()
+	for _, deployer := range m.verifiers {
+		result, err := deployer.Dependencies()
+		if err != nil {
+			return nil, err
+		}
+		deps.Insert(result...)
+	}
+	return deps.ToList(), nil
+}
+
+func (m VerifierMux) Cleanup(ctx context.Context, w io.Writer, dryRun bool) error {
+	for _, deployer := range m.verifiers {
+		ctx, endTrace := instrumentation.StartTrace(ctx, "Cleanup")
+		if dryRun {
+			output.Yellow.Fprintln(w, "Following resources would be deleted:")
+		}
+		if err := deployer.Cleanup(ctx, w, dryRun); err != nil {
+			return err
+		}
+		endTrace()
+	}
+	return nil
+}
+
+// TrackBuildArtifacts should *only* be called on individual verifiers. This is a noop.
+func (m VerifierMux) TrackBuildArtifacts(_ []graph.Artifact) {}
diff --git a/proto/v2/skaffold.pb.go b/proto/v2/skaffold.pb.go
index 9eb0eb6f5..4a168baac 100644
--- a/proto/v2/skaffold.pb.go
+++ b/proto/v2/skaffold.pb.go
@@ -524,6 +524,7 @@ type State struct {
 	Metadata            *Metadata                   `protobuf:"bytes,7,opt,name=metadata,proto3" json:"metadata,omitempty"`
 	TestState           *TestState                  `protobuf:"bytes,8,opt,name=testState,proto3" json:"testState,omitempty"`
 	RenderState         *RenderState                `protobuf:"bytes,9,opt,name=renderState,proto3" json:"renderState,omitempty"`
+	VerifyState         *VerifyState                `protobuf:"bytes,10,opt,name=verifyState,proto3" json:"verifyState,omitempty"`
 }
 
 func (x *State) Reset() {
@@ -621,6 +622,13 @@ func (x *State) GetRenderState() *RenderState {
 	return nil
 }
 
+func (x *State) GetVerifyState() *VerifyState {
+	if x != nil {
+		return x.VerifyState
+	}
+	return nil
+}
+
 type Metadata struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1111,6 +1119,64 @@ func (x *RenderState) GetStatusCode() enums.StatusCode {
 	return enums.StatusCode_OK
 }
 
+// `VerifyState` describes the current state of the render
+type VerifyState struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Status of the current render
+	Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
+	// Verifystate status code
+	StatusCode enums.StatusCode `protobuf:"varint,2,opt,name=statusCode,proto3,enum=proto.enums.StatusCode" json:"statusCode,omitempty"`
+}
+
+func (x *VerifyState) Reset() {
+	*x = VerifyState{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2_skaffold_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VerifyState) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VerifyState) ProtoMessage() {}
+
+func (x *VerifyState) ProtoReflect() protoreflect.Message {
+	mi := &file_v2_skaffold_proto_msgTypes[12]
+	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 VerifyState.ProtoReflect.Descriptor instead.
+func (*VerifyState) Descriptor() ([]byte, []int) {
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *VerifyState) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+func (x *VerifyState) GetStatusCode() enums.StatusCode {
+	if x != nil {
+		return x.StatusCode
+	}
+	return enums.StatusCode_OK
+}
+
 // `DeployState` describes the status of the current deploy
 type DeployState struct {
 	state         protoimpl.MessageState
@@ -1125,7 +1191,7 @@ type DeployState struct {
 func (x *DeployState) Reset() {
 	*x = DeployState{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[12]
+		mi := &file_v2_skaffold_proto_msgTypes[13]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1138,7 +1204,7 @@ func (x *DeployState) String() string {
 func (*DeployState) ProtoMessage() {}
 
 func (x *DeployState) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[12]
+	mi := &file_v2_skaffold_proto_msgTypes[13]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1151,7 +1217,7 @@ func (x *DeployState) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeployState.ProtoReflect.Descriptor instead.
 func (*DeployState) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{12}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{13}
 }
 
 func (x *DeployState) GetStatus() string {
@@ -1196,7 +1262,7 @@ type StatusCheckState struct {
 func (x *StatusCheckState) Reset() {
 	*x = StatusCheckState{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[13]
+		mi := &file_v2_skaffold_proto_msgTypes[14]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1209,7 +1275,7 @@ func (x *StatusCheckState) String() string {
 func (*StatusCheckState) ProtoMessage() {}
 
 func (x *StatusCheckState) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[13]
+	mi := &file_v2_skaffold_proto_msgTypes[14]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1222,7 +1288,7 @@ func (x *StatusCheckState) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use StatusCheckState.ProtoReflect.Descriptor instead.
 func (*StatusCheckState) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{13}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{14}
 }
 
 func (x *StatusCheckState) GetStatus() string {
@@ -1259,7 +1325,7 @@ type FileSyncState struct {
 func (x *FileSyncState) Reset() {
 	*x = FileSyncState{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[14]
+		mi := &file_v2_skaffold_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1272,7 +1338,7 @@ func (x *FileSyncState) String() string {
 func (*FileSyncState) ProtoMessage() {}
 
 func (x *FileSyncState) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[14]
+	mi := &file_v2_skaffold_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1285,7 +1351,7 @@ func (x *FileSyncState) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FileSyncState.ProtoReflect.Descriptor instead.
 func (*FileSyncState) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{14}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{15}
 }
 
 func (x *FileSyncState) GetStatus() string {
@@ -1324,13 +1390,14 @@ type Event struct {
 	//	*Event_TerminationEvent
 	//	*Event_TestEvent
 	//	*Event_RenderEvent
+	//	*Event_VerifyEvent
 	EventType isEvent_EventType `protobuf_oneof:"event_type"`
 }
 
 func (x *Event) Reset() {
 	*x = Event{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[15]
+		mi := &file_v2_skaffold_proto_msgTypes[16]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1343,7 +1410,7 @@ func (x *Event) String() string {
 func (*Event) ProtoMessage() {}
 
 func (x *Event) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[15]
+	mi := &file_v2_skaffold_proto_msgTypes[16]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1356,7 +1423,7 @@ func (x *Event) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Event.ProtoReflect.Descriptor instead.
 func (*Event) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{15}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *Event) GetTimestamp() *timestamppb.Timestamp {
@@ -1464,6 +1531,13 @@ func (x *Event) GetRenderEvent() *RenderSubtaskEvent {
 	return nil
 }
 
+func (x *Event) GetVerifyEvent() *VerifySubtaskEvent {
+	if x, ok := x.GetEventType().(*Event_VerifyEvent); ok {
+		return x.VerifyEvent
+	}
+	return nil
+}
+
 type isEvent_EventType interface {
 	isEvent_EventType()
 }
@@ -1520,6 +1594,10 @@ type Event_RenderEvent struct {
 	RenderEvent *RenderSubtaskEvent `protobuf:"bytes,14,opt,name=renderEvent,proto3,oneof"` // describes if the render has started, is in progress or is complete.
 }
 
+type Event_VerifyEvent struct {
+	VerifyEvent *VerifySubtaskEvent `protobuf:"bytes,15,opt,name=verifyEvent,proto3,oneof"` // describes if the render has started, is in progress or is complete.
+}
+
 func (*Event_MetaEvent) isEvent_EventType() {}
 
 func (*Event_SkaffoldLogEvent) isEvent_EventType() {}
@@ -1546,6 +1624,8 @@ func (*Event_TestEvent) isEvent_EventType() {}
 
 func (*Event_RenderEvent) isEvent_EventType() {}
 
+func (*Event_VerifyEvent) isEvent_EventType() {}
+
 // `TerminationEvent` marks the end of the skaffold session
 type TerminationEvent struct {
 	state         protoimpl.MessageState
@@ -1559,7 +1639,7 @@ type TerminationEvent struct {
 func (x *TerminationEvent) Reset() {
 	*x = TerminationEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[16]
+		mi := &file_v2_skaffold_proto_msgTypes[17]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1572,7 +1652,7 @@ func (x *TerminationEvent) String() string {
 func (*TerminationEvent) ProtoMessage() {}
 
 func (x *TerminationEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[16]
+	mi := &file_v2_skaffold_proto_msgTypes[17]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1585,7 +1665,7 @@ func (x *TerminationEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TerminationEvent.ProtoReflect.Descriptor instead.
 func (*TerminationEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{16}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{17}
 }
 
 func (x *TerminationEvent) GetStatus() string {
@@ -1616,7 +1696,7 @@ type ActionableErr struct {
 func (x *ActionableErr) Reset() {
 	*x = ActionableErr{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[17]
+		mi := &file_v2_skaffold_proto_msgTypes[18]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1629,7 +1709,7 @@ func (x *ActionableErr) String() string {
 func (*ActionableErr) ProtoMessage() {}
 
 func (x *ActionableErr) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[17]
+	mi := &file_v2_skaffold_proto_msgTypes[18]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1642,7 +1722,7 @@ func (x *ActionableErr) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ActionableErr.ProtoReflect.Descriptor instead.
 func (*ActionableErr) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{17}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{18}
 }
 
 func (x *ActionableErr) GetErrCode() enums.StatusCode {
@@ -1679,7 +1759,7 @@ type MetaEvent struct {
 func (x *MetaEvent) Reset() {
 	*x = MetaEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[18]
+		mi := &file_v2_skaffold_proto_msgTypes[19]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1692,7 +1772,7 @@ func (x *MetaEvent) String() string {
 func (*MetaEvent) ProtoMessage() {}
 
 func (x *MetaEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[18]
+	mi := &file_v2_skaffold_proto_msgTypes[19]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1705,7 +1785,7 @@ func (x *MetaEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use MetaEvent.ProtoReflect.Descriptor instead.
 func (*MetaEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{18}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{19}
 }
 
 func (x *MetaEvent) GetEntry() string {
@@ -1738,7 +1818,7 @@ type SkaffoldLogEvent struct {
 func (x *SkaffoldLogEvent) Reset() {
 	*x = SkaffoldLogEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[19]
+		mi := &file_v2_skaffold_proto_msgTypes[20]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1751,7 +1831,7 @@ func (x *SkaffoldLogEvent) String() string {
 func (*SkaffoldLogEvent) ProtoMessage() {}
 
 func (x *SkaffoldLogEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[19]
+	mi := &file_v2_skaffold_proto_msgTypes[20]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1764,7 +1844,7 @@ func (x *SkaffoldLogEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SkaffoldLogEvent.ProtoReflect.Descriptor instead.
 func (*SkaffoldLogEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{19}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{20}
 }
 
 func (x *SkaffoldLogEvent) GetTaskId() string {
@@ -1811,7 +1891,7 @@ type ApplicationLogEvent struct {
 func (x *ApplicationLogEvent) Reset() {
 	*x = ApplicationLogEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[20]
+		mi := &file_v2_skaffold_proto_msgTypes[21]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1824,7 +1904,7 @@ func (x *ApplicationLogEvent) String() string {
 func (*ApplicationLogEvent) ProtoMessage() {}
 
 func (x *ApplicationLogEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[20]
+	mi := &file_v2_skaffold_proto_msgTypes[21]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1837,7 +1917,7 @@ func (x *ApplicationLogEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ApplicationLogEvent.ProtoReflect.Descriptor instead.
 func (*ApplicationLogEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{20}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{21}
 }
 
 func (x *ApplicationLogEvent) GetContainerName() string {
@@ -1893,7 +1973,7 @@ type TaskEvent struct {
 func (x *TaskEvent) Reset() {
 	*x = TaskEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[21]
+		mi := &file_v2_skaffold_proto_msgTypes[22]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1906,7 +1986,7 @@ func (x *TaskEvent) String() string {
 func (*TaskEvent) ProtoMessage() {}
 
 func (x *TaskEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[21]
+	mi := &file_v2_skaffold_proto_msgTypes[22]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1919,7 +1999,7 @@ func (x *TaskEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TaskEvent.ProtoReflect.Descriptor instead.
 func (*TaskEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{21}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{22}
 }
 
 func (x *TaskEvent) GetId() string {
@@ -1982,7 +2062,7 @@ type BuildSubtaskEvent struct {
 func (x *BuildSubtaskEvent) Reset() {
 	*x = BuildSubtaskEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[22]
+		mi := &file_v2_skaffold_proto_msgTypes[23]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1995,7 +2075,7 @@ func (x *BuildSubtaskEvent) String() string {
 func (*BuildSubtaskEvent) ProtoMessage() {}
 
 func (x *BuildSubtaskEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[22]
+	mi := &file_v2_skaffold_proto_msgTypes[23]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2008,7 +2088,7 @@ func (x *BuildSubtaskEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use BuildSubtaskEvent.ProtoReflect.Descriptor instead.
 func (*BuildSubtaskEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{22}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{23}
 }
 
 func (x *BuildSubtaskEvent) GetId() string {
@@ -2069,7 +2149,7 @@ type TestSubtaskEvent struct {
 func (x *TestSubtaskEvent) Reset() {
 	*x = TestSubtaskEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[23]
+		mi := &file_v2_skaffold_proto_msgTypes[24]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2082,7 +2162,7 @@ func (x *TestSubtaskEvent) String() string {
 func (*TestSubtaskEvent) ProtoMessage() {}
 
 func (x *TestSubtaskEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[23]
+	mi := &file_v2_skaffold_proto_msgTypes[24]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2095,7 +2175,7 @@ func (x *TestSubtaskEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TestSubtaskEvent.ProtoReflect.Descriptor instead.
 func (*TestSubtaskEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{23}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{24}
 }
 
 func (x *TestSubtaskEvent) GetId() string {
@@ -2142,7 +2222,7 @@ type RenderSubtaskEvent struct {
 func (x *RenderSubtaskEvent) Reset() {
 	*x = RenderSubtaskEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[24]
+		mi := &file_v2_skaffold_proto_msgTypes[25]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2155,7 +2235,7 @@ func (x *RenderSubtaskEvent) String() string {
 func (*RenderSubtaskEvent) ProtoMessage() {}
 
 func (x *RenderSubtaskEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[24]
+	mi := &file_v2_skaffold_proto_msgTypes[25]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2168,7 +2248,7 @@ func (x *RenderSubtaskEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RenderSubtaskEvent.ProtoReflect.Descriptor instead.
 func (*RenderSubtaskEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{24}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{25}
 }
 
 func (x *RenderSubtaskEvent) GetId() string {
@@ -2199,6 +2279,79 @@ func (x *RenderSubtaskEvent) GetActionableErr() *ActionableErr {
 	return nil
 }
 
+// `VerifyEvent` represents the status of a render, and is emitted by Skaffold
+// anytime a render starts or completes, successfully or not.
+type VerifySubtaskEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id            string         `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`                       // id of the subtask which will be used in SkaffoldLog
+	TaskId        string         `protobuf:"bytes,2,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` // id of the task of skaffold that this event came from
+	Status        string         `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`               // render status oneof: InProgress, Completed, Failed
+	ActionableErr *ActionableErr `protobuf:"bytes,4,opt,name=actionableErr,proto3" json:"actionableErr,omitempty"` // actionable error message
+}
+
+func (x *VerifySubtaskEvent) Reset() {
+	*x = VerifySubtaskEvent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2_skaffold_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VerifySubtaskEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VerifySubtaskEvent) ProtoMessage() {}
+
+func (x *VerifySubtaskEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_v2_skaffold_proto_msgTypes[26]
+	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 VerifySubtaskEvent.ProtoReflect.Descriptor instead.
+func (*VerifySubtaskEvent) Descriptor() ([]byte, []int) {
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *VerifySubtaskEvent) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *VerifySubtaskEvent) GetTaskId() string {
+	if x != nil {
+		return x.TaskId
+	}
+	return ""
+}
+
+func (x *VerifySubtaskEvent) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+func (x *VerifySubtaskEvent) GetActionableErr() *ActionableErr {
+	if x != nil {
+		return x.ActionableErr
+	}
+	return nil
+}
+
 // `DeploySubtaskEvent` represents the status of a deployment, and is emitted by Skaffold
 // anytime a deployment starts or completes, successfully or not.
 type DeploySubtaskEvent struct {
@@ -2215,7 +2368,7 @@ type DeploySubtaskEvent struct {
 func (x *DeploySubtaskEvent) Reset() {
 	*x = DeploySubtaskEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[25]
+		mi := &file_v2_skaffold_proto_msgTypes[27]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2228,7 +2381,7 @@ func (x *DeploySubtaskEvent) String() string {
 func (*DeploySubtaskEvent) ProtoMessage() {}
 
 func (x *DeploySubtaskEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[25]
+	mi := &file_v2_skaffold_proto_msgTypes[27]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2241,7 +2394,7 @@ func (x *DeploySubtaskEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeploySubtaskEvent.ProtoReflect.Descriptor instead.
 func (*DeploySubtaskEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{25}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{27}
 }
 
 func (x *DeploySubtaskEvent) GetId() string {
@@ -2294,7 +2447,7 @@ type StatusCheckSubtaskEvent struct {
 func (x *StatusCheckSubtaskEvent) Reset() {
 	*x = StatusCheckSubtaskEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[26]
+		mi := &file_v2_skaffold_proto_msgTypes[28]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2307,7 +2460,7 @@ func (x *StatusCheckSubtaskEvent) String() string {
 func (*StatusCheckSubtaskEvent) ProtoMessage() {}
 
 func (x *StatusCheckSubtaskEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[26]
+	mi := &file_v2_skaffold_proto_msgTypes[28]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2320,7 +2473,7 @@ func (x *StatusCheckSubtaskEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use StatusCheckSubtaskEvent.ProtoReflect.Descriptor instead.
 func (*StatusCheckSubtaskEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{26}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{28}
 }
 
 func (x *StatusCheckSubtaskEvent) GetId() string {
@@ -2394,7 +2547,7 @@ type PortForwardEvent struct {
 func (x *PortForwardEvent) Reset() {
 	*x = PortForwardEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[27]
+		mi := &file_v2_skaffold_proto_msgTypes[29]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2407,7 +2560,7 @@ func (x *PortForwardEvent) String() string {
 func (*PortForwardEvent) ProtoMessage() {}
 
 func (x *PortForwardEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[27]
+	mi := &file_v2_skaffold_proto_msgTypes[29]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2420,7 +2573,7 @@ func (x *PortForwardEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PortForwardEvent.ProtoReflect.Descriptor instead.
 func (*PortForwardEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{27}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{29}
 }
 
 func (x *PortForwardEvent) GetId() string {
@@ -2517,7 +2670,7 @@ type FileSyncEvent struct {
 func (x *FileSyncEvent) Reset() {
 	*x = FileSyncEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[28]
+		mi := &file_v2_skaffold_proto_msgTypes[30]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2530,7 +2683,7 @@ func (x *FileSyncEvent) String() string {
 func (*FileSyncEvent) ProtoMessage() {}
 
 func (x *FileSyncEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[28]
+	mi := &file_v2_skaffold_proto_msgTypes[30]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2543,7 +2696,7 @@ func (x *FileSyncEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FileSyncEvent.ProtoReflect.Descriptor instead.
 func (*FileSyncEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{28}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{30}
 }
 
 func (x *FileSyncEvent) GetId() string {
@@ -2609,7 +2762,7 @@ type DebuggingContainerEvent struct {
 func (x *DebuggingContainerEvent) Reset() {
 	*x = DebuggingContainerEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[29]
+		mi := &file_v2_skaffold_proto_msgTypes[31]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2622,7 +2775,7 @@ func (x *DebuggingContainerEvent) String() string {
 func (*DebuggingContainerEvent) ProtoMessage() {}
 
 func (x *DebuggingContainerEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[29]
+	mi := &file_v2_skaffold_proto_msgTypes[31]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2635,7 +2788,7 @@ func (x *DebuggingContainerEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DebuggingContainerEvent.ProtoReflect.Descriptor instead.
 func (*DebuggingContainerEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{29}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{31}
 }
 
 func (x *DebuggingContainerEvent) GetId() string {
@@ -2719,7 +2872,7 @@ type UserIntentRequest struct {
 func (x *UserIntentRequest) Reset() {
 	*x = UserIntentRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[30]
+		mi := &file_v2_skaffold_proto_msgTypes[32]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2732,7 +2885,7 @@ func (x *UserIntentRequest) String() string {
 func (*UserIntentRequest) ProtoMessage() {}
 
 func (x *UserIntentRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[30]
+	mi := &file_v2_skaffold_proto_msgTypes[32]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2745,7 +2898,7 @@ func (x *UserIntentRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UserIntentRequest.ProtoReflect.Descriptor instead.
 func (*UserIntentRequest) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{30}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{32}
 }
 
 func (x *UserIntentRequest) GetIntent() *Intent {
@@ -2766,7 +2919,7 @@ type TriggerRequest struct {
 func (x *TriggerRequest) Reset() {
 	*x = TriggerRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[31]
+		mi := &file_v2_skaffold_proto_msgTypes[33]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2779,7 +2932,7 @@ func (x *TriggerRequest) String() string {
 func (*TriggerRequest) ProtoMessage() {}
 
 func (x *TriggerRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[31]
+	mi := &file_v2_skaffold_proto_msgTypes[33]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2792,7 +2945,7 @@ func (x *TriggerRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TriggerRequest.ProtoReflect.Descriptor instead.
 func (*TriggerRequest) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{31}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{33}
 }
 
 func (x *TriggerRequest) GetState() *TriggerState {
@@ -2816,7 +2969,7 @@ type TriggerState struct {
 func (x *TriggerState) Reset() {
 	*x = TriggerState{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[32]
+		mi := &file_v2_skaffold_proto_msgTypes[34]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2829,7 +2982,7 @@ func (x *TriggerState) String() string {
 func (*TriggerState) ProtoMessage() {}
 
 func (x *TriggerState) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[32]
+	mi := &file_v2_skaffold_proto_msgTypes[34]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2842,7 +2995,7 @@ func (x *TriggerState) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TriggerState.ProtoReflect.Descriptor instead.
 func (*TriggerState) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{32}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{34}
 }
 
 func (m *TriggerState) GetVal() isTriggerState_Val {
@@ -2884,7 +3037,7 @@ type Intent struct {
 func (x *Intent) Reset() {
 	*x = Intent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[33]
+		mi := &file_v2_skaffold_proto_msgTypes[35]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2897,7 +3050,7 @@ func (x *Intent) String() string {
 func (*Intent) ProtoMessage() {}
 
 func (x *Intent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[33]
+	mi := &file_v2_skaffold_proto_msgTypes[35]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2910,7 +3063,7 @@ func (x *Intent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Intent.ProtoReflect.Descriptor instead.
 func (*Intent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{33}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{35}
 }
 
 func (x *Intent) GetBuild() bool {
@@ -2954,7 +3107,7 @@ type Suggestion struct {
 func (x *Suggestion) Reset() {
 	*x = Suggestion{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[34]
+		mi := &file_v2_skaffold_proto_msgTypes[36]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2967,7 +3120,7 @@ func (x *Suggestion) String() string {
 func (*Suggestion) ProtoMessage() {}
 
 func (x *Suggestion) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[34]
+	mi := &file_v2_skaffold_proto_msgTypes[36]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2980,7 +3133,7 @@ func (x *Suggestion) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Suggestion.ProtoReflect.Descriptor instead.
 func (*Suggestion) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{34}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{36}
 }
 
 func (x *Suggestion) GetSuggestionCode() enums.SuggestionCode {
@@ -3011,7 +3164,7 @@ type IntOrString struct {
 func (x *IntOrString) Reset() {
 	*x = IntOrString{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[35]
+		mi := &file_v2_skaffold_proto_msgTypes[37]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3024,7 +3177,7 @@ func (x *IntOrString) String() string {
 func (*IntOrString) ProtoMessage() {}
 
 func (x *IntOrString) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[35]
+	mi := &file_v2_skaffold_proto_msgTypes[37]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3037,7 +3190,7 @@ func (x *IntOrString) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IntOrString.ProtoReflect.Descriptor instead.
 func (*IntOrString) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{35}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{37}
 }
 
 func (x *IntOrString) GetType() int32 {
@@ -3075,7 +3228,7 @@ type BuildMetadata_Artifact struct {
 func (x *BuildMetadata_Artifact) Reset() {
 	*x = BuildMetadata_Artifact{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[38]
+		mi := &file_v2_skaffold_proto_msgTypes[40]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3088,7 +3241,7 @@ func (x *BuildMetadata_Artifact) String() string {
 func (*BuildMetadata_Artifact) ProtoMessage() {}
 
 func (x *BuildMetadata_Artifact) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[38]
+	mi := &file_v2_skaffold_proto_msgTypes[40]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3144,7 +3297,7 @@ type TestMetadata_Tester struct {
 func (x *TestMetadata_Tester) Reset() {
 	*x = TestMetadata_Tester{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[40]
+		mi := &file_v2_skaffold_proto_msgTypes[42]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3157,7 +3310,7 @@ func (x *TestMetadata_Tester) String() string {
 func (*TestMetadata_Tester) ProtoMessage() {}
 
 func (x *TestMetadata_Tester) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[40]
+	mi := &file_v2_skaffold_proto_msgTypes[42]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3199,7 +3352,7 @@ type RenderMetadata_Renderer struct {
 func (x *RenderMetadata_Renderer) Reset() {
 	*x = RenderMetadata_Renderer{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[41]
+		mi := &file_v2_skaffold_proto_msgTypes[43]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3212,7 +3365,7 @@ func (x *RenderMetadata_Renderer) String() string {
 func (*RenderMetadata_Renderer) ProtoMessage() {}
 
 func (x *RenderMetadata_Renderer) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[41]
+	mi := &file_v2_skaffold_proto_msgTypes[43]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3254,7 +3407,7 @@ type DeployMetadata_Deployer struct {
 func (x *DeployMetadata_Deployer) Reset() {
 	*x = DeployMetadata_Deployer{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[42]
+		mi := &file_v2_skaffold_proto_msgTypes[44]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3267,7 +3420,7 @@ func (x *DeployMetadata_Deployer) String() string {
 func (*DeployMetadata_Deployer) ProtoMessage() {}
 
 func (x *DeployMetadata_Deployer) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[42]
+	mi := &file_v2_skaffold_proto_msgTypes[44]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3316,7 +3469,7 @@ var file_v2_skaffold_proto_rawDesc = []byte{
 	0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d,
 	0x73, 0x67, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a,
 	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
-	0x65, 0x22, 0x9a, 0x05, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x62,
+	0x65, 0x22, 0xd3, 0x05, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x62,
 	0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
 	0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
 	0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74,
@@ -3351,279 +3504,321 @@ var file_v2_skaffold_proto_rawDesc = []byte{
 	0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72,
 	0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61,
-	0x74, 0x65, 0x52, 0x0b, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a,
-	0x5d, 0x0a, 0x13, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74,
-	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x76, 0x32, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76,
-	0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe2,
-	0x02, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x0a, 0x05, 0x62,
-	0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64,
-	0x61, 0x74, 0x61, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x64, 0x65,
-	0x70, 0x6c, 0x6f, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4d, 0x65, 0x74, 0x61,
-	0x64, 0x61, 0x74, 0x61, 0x52, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x2a, 0x0a, 0x04,
-	0x74, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
-	0x74, 0x61, 0x52, 0x04, 0x74, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x49,
-	0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x44, 0x12, 0x30,
-	0x0a, 0x06, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72,
-	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72,
-	0x12, 0x42, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x63,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e,
-	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f,
-	0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69,
-	0x6f, 0x6e, 0x61, 0x6c, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
-	0x61, 0x6c, 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, 0x8c, 0x03, 0x0a, 0x0d, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74,
-	0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63,
-	0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
-	0x61, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69,
-	0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d,
-	0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,
-	0x65, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18,
-	0x63, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
-	0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41,
-	0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a,
-	0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x1a, 0x86, 0x01, 0x0a, 0x08, 0x41,
-	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e,
-	0x75, 0x6d, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52,
-	0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c,
-	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66,
-	0x69, 0x6c, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61,
-	0x6c, 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, 0x94, 0x01, 0x0a, 0x0c, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64,
-	0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x07, 0x54, 0x65, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e,
-	0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x65, 0x73,
-	0x74, 0x65, 0x72, 0x52, 0x07, 0x54, 0x65, 0x73, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x4b, 0x0a, 0x06,
-	0x54, 0x65, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75,
-	0x6d, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74,
-	0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x52, 0x65,
-	0x6e, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x09,
-	0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65,
-	0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72,
-	0x65, 0x72, 0x52, 0x09, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x73, 0x1a, 0x4d, 0x0a,
-	0x08, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70,
-	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65,
-	0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd6, 0x01, 0x0a,
-	0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12,
-	0x3f, 0x0a, 0x09, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65,
-	0x70, 0x6c, 0x6f, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x70,
-	0x6c, 0x6f, 0x79, 0x65, 0x72, 0x52, 0x09, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x72, 0x73,
-	0x12, 0x32, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e,
-	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6c, 0x75,
-	0x73, 0x74, 0x65, 0x72, 0x1a, 0x4f, 0x0a, 0x08, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x72,
-	0x12, 0x2d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x44, 0x65, 0x70,
-	0x6c, 0x6f, 0x79, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,
+	0x74, 0x65, 0x52, 0x0b, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
+	0x37, 0x0a, 0x0b, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0a,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e,
+	0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x76, 0x65, 0x72,
+	0x69, 0x66, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x5d, 0x0a, 0x13, 0x46, 0x6f, 0x72, 0x77,
+	0x61, 0x72, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65,
+	0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x72, 0x74,
+	0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe2, 0x02, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x42,
+	0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x44,
+	0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06, 0x64,
+	0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54,
+	0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x04, 0x74, 0x65, 0x73,
+	0x74, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, 0x6e, 0x64, 0x65,
+	0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x76, 0x32, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x52, 0x06, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0a, 0x61, 0x64, 0x64,
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x63, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72,
+	0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x1a, 0x3d, 0x0a,
+	0x0f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 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, 0x8c, 0x03, 0x0a,
+	0x0d, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3e,
+	0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69,
+	0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66,
+	0x61, 0x63, 0x74, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x2a,
+	0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
+	0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x64,
+	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x63, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+	0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x61, 0x6c, 0x1a, 0x86, 0x01, 0x0a, 0x08, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
+	0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x42, 0x75, 0x69,
+	0x6c, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a,
+	0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x3d, 0x0a, 0x0f,
+	0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 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, 0x94, 0x01, 0x0a, 0x0c,
+	0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x07,
+	0x54, 0x65, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x54, 0x65,
+	0x73, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x4b, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x65, 0x72, 0x12,
+	0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74,
+	0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65,
+	0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x52, 0x09, 0x52, 0x65, 0x6e,
+	0x64, 0x65, 0x72, 0x65, 0x72, 0x73, 0x1a, 0x4d, 0x0a, 0x08, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72,
+	0x65, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x52,
+	0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,
 	0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,
-	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe8, 0x01, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53,
-	0x74, 0x61, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
-	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x41, 0x72,
-	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72,
-	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54,
-	0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x75,
-	0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f,
-	0x64, 0x65, 0x1a, 0x3c, 0x0a, 0x0e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 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, 0x5c, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a,
-	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43,
-	0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f,
-	0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x5e,
-	0x0a, 0x0b, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a,
-	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43,
-	0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f,
-	0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x80,
-	0x01, 0x0a, 0x0b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16,
-	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72,
-	0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x75, 0x74,
-	0x6f, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64,
-	0x65, 0x22, 0xea, 0x01, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63,
-	0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x47,
-	0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65,
-	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65,
-	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65,
-	0x1a, 0x3c, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 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, 0x49,
-	0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd6, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79,
+	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x09, 0x64, 0x65, 0x70, 0x6c,
+	0x6f, 0x79, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x72, 0x52, 0x09,
+	0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x63, 0x6c, 0x75,
+	0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
+	0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0x4f, 0x0a,
+	0x08, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x72, 0x54, 0x79,
+	0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe8,
+	0x01, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x41, 0x0a,
+	0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c,
+	0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73,
+	0x12, 0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67,
+	0x65, 0x72, 0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65,
+	0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52,
+	0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x3c, 0x0a, 0x0e, 0x41,
+	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 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, 0x5c, 0x0a, 0x09, 0x54, 0x65, 0x73,
+	0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37,
+	0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73,
+	0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x5e, 0x0a, 0x0b, 0x52, 0x65, 0x6e, 0x64, 0x65,
+	0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37,
+	0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73,
+	0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x5e, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66,
+	0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37,
+	0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73,
+	0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x70, 0x6c,
+	0x6f, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65,
+	0x72, 0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e,
+	0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a,
+	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xea, 0x01, 0x0a, 0x10, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
 	0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54,
-	0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x75,
-	0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0xf6, 0x07, 0x0a, 0x05, 0x45, 0x76,
-	0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
-	0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a,
-	0x09, 0x6d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x65, 0x74, 0x61,
-	0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65,
-	0x6e, 0x74, 0x12, 0x48, 0x0a, 0x10, 0x73, 0x6b, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x4c, 0x6f,
-	0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x6b, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64,
-	0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x73, 0x6b, 0x61, 0x66,
-	0x66, 0x6f, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x13,
-	0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x45, 0x76,
-	0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, 0x61, 0x70, 0x70, 0x6c,
-	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
-	0x33, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61,
-	0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45,
-	0x76, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75, 0x62,
-	0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
-	0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11,
-	0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e,
-	0x74, 0x12, 0x4e, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x75, 0x62, 0x74, 0x61,
-	0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53,
-	0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x64,
-	0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e,
-	0x74, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x08,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e,
-	0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
-	0x48, 0x00, 0x52, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5d, 0x0a,
-	0x17, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x75, 0x62, 0x74,
-	0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x47, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75,
+	0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63,
+	0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
+	0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75,
+	0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x3c, 0x0a, 0x0e, 0x52, 0x65, 0x73,
+	0x6f, 0x75, 0x72, 0x63, 0x65, 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, 0x49, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x65, 0x53,
+	0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67,
+	0x65, 0x72, 0x22, 0xb8, 0x08, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x10, 0x73,
+	0x6b, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
+	0x2e, 0x53, 0x6b, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x48, 0x00, 0x52, 0x10, 0x73, 0x6b, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x4c, 0x6f, 0x67,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x70,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x48, 0x00, 0x52, 0x13, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a,
+	0x11, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75,
+	0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x12, 0x64, 0x65,
+	0x70, 0x6c, 0x6f, 0x79, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76,
+	0x32, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x75,
+	0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x6f,
+	0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72,
+	0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x70, 0x6f, 0x72,
+	0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5d, 0x0a, 0x17, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
 	0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e,
-	0x74, 0x48, 0x00, 0x52, 0x17, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b,
-	0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x0d,
-	0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x46,
-	0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d,
-	0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5d, 0x0a,
-	0x17, 0x64, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69,
-	0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x67,
+	0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x75,
+	0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e,
+	0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e,
+	0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5d, 0x0a, 0x17, 0x64, 0x65, 0x62, 0x75, 0x67, 0x67,
 	0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e,
-	0x74, 0x48, 0x00, 0x52, 0x17, 0x64, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f,
-	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x10,
-	0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74,
-	0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76,
-	0x32, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65,
-	0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x45, 0x76,
-	0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b,
-	0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65,
-	0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e,
-	0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x76, 0x32, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b,
-	0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x45,
-	0x76, 0x65, 0x6e, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79,
-	0x70, 0x65, 0x22, 0x55, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29,
-	0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c,
-	0x65, 0x45, 0x72, 0x72, 0x52, 0x03, 0x65, 0x72, 0x72, 0x22, 0x94, 0x01, 0x0a, 0x0d, 0x41, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x12, 0x31, 0x0a, 0x07, 0x65,
-	0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18,
-	0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67,
-	0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74,
-	0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x22, 0x51, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a,
-	0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e,
-	0x74, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
-	0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
-	0x61, 0x74, 0x61, 0x22, 0x97, 0x01, 0x0a, 0x10, 0x53, 0x6b, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64,
-	0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b,
-	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49,
-	0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64,
-	0x12, 0x2b, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32,
-	0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x4c, 0x6f,
-	0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x18, 0x0a,
-	0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xbb, 0x01,
-	0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67,
-	0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
-	0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f,
-	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70,
-	0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f,
-	0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x18, 0x0a,
-	0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x72, 0x69, 0x63, 0x68, 0x46,
-	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x69, 0x63, 0x68, 0x46, 0x6f, 0x72, 0x6d, 0x61,
-	0x74, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x09,
-	0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x73,
-	0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x20, 0x0a,
-	0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12,
-	0x1c, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01,
-	0x28, 0x05, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a,
-	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61,
-	0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62,
-	0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c,
-	0x65, 0x45, 0x72, 0x72, 0x22, 0xc3, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75,
+	0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x76, 0x32, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x64, 0x65,
+	0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x10, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69,
+	0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x74,
+	0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+	0x3a, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65,
+	0x73, 0x74, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x09, 0x74, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x72,
+	0x65, 0x6e, 0x64, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x6e, 0x64,
+	0x65, 0x72, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00,
+	0x52, 0x0b, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a,
+	0x0b, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x65,
+	0x72, 0x69, 0x66, 0x79, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x48, 0x00, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42,
+	0x0c, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x55, 0x0a,
+	0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x0a, 0x03, 0x65, 0x72, 0x72,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76,
+	0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52,
+	0x03, 0x65, 0x72, 0x72, 0x22, 0x94, 0x01, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+	0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x12, 0x31, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65,
+	0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x76, 0x32, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b,
+	0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x51, 0x0a, 0x09, 0x4d,
+	0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2e,
+	0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x97,
+	0x01, 0x0a, 0x10, 0x53, 0x6b, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
+	0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x05, 0x6c,
+	0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65,
+	0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xbb, 0x01, 0x0a, 0x13, 0x41, 0x70, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x72, 0x69, 0x63, 0x68, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+	0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x14, 0x72, 0x69, 0x63, 0x68, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x09, 0x54, 0x61, 0x73, 0x6b, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63,
+	0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64,
+	0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x74,
+	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69,
+	0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x3d, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72,
+	0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72,
+	0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22,
+	0xc3, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x1a,
+	0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x74,
+	0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x12, 0x16,
+	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+	0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62,
+	0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0x92, 0x01, 0x0a, 0x10, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75,
 	0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
 	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61,
 	0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73,
-	0x6b, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12,
-	0x12, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73,
-	0x74, 0x65, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20,
+	0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20,
 	0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x61,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18, 0x04, 0x20, 0x01,
 	0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63,
 	0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0x92, 0x01, 0x0a, 0x10, 0x54,
-	0x65, 0x73, 0x74, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+	0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x52,
+	0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+	0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+	0x45, 0x72, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45,
+	0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72,
+	0x72, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x75, 0x62, 0x74,
+	0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49,
+	0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x61, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x70,
+	0x6c, 0x6f, 0x79, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
 	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
 	0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
 	0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
@@ -3632,183 +3827,164 @@ var file_v2_skaffold_proto_rawDesc = []byte{
 	0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
 	0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72,
 	0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22,
-	0x94, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73,
-	0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69,
-	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12,
-	0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-	0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61,
-	0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x70, 0x6c, 0x6f,
-	0x79, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
-	0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a,
-	0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d,
-	0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
-	0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d,
-	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0x88, 0x02,
-	0x0a, 0x17, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x75, 0x62,
-	0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73,
-	0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b,
-	0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16,
-	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
-	0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
-	0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x06,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75,
-	0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x61, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0xec, 0x02, 0x0a, 0x10, 0x50, 0x6f, 0x72,
-	0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
-	0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a,
-	0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50,
-	0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
-	0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24,
-	0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
-	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22,
-	0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x08,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79,
-	0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61,
-	0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
-	0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
-	0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
-	0x12, 0x35, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x0b,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e,
-	0x49, 0x6e, 0x74, 0x4f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x74, 0x61, 0x72,
-	0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x65,
-	0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73,
-	0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b,
-	0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74,
-	0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d,
-	0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18,
-	0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
-	0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d,
-	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0xa0, 0x03,
-	0x0a, 0x17, 0x44, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61,
-	0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73,
-	0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b,
-	0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f,
-	0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64,
-	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
-	0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e,
-	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61,
-	0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e,
-	0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69,
-	0x66, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69,
-	0x66, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18,
-	0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1e,
-	0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x18, 0x09, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x12, 0x51,
-	0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65,
-	0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
-	0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74, 0x73,
-	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74,
-	0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x44, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
-	0x22, 0x3d, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
-	0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22,
-	0x3e, 0x0a, 0x0e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x69, 0x67,
-	0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22,
-	0x31, 0x0a, 0x0c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
-	0x1a, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
-	0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x76,
-	0x61, 0x6c, 0x22, 0x64, 0x0a, 0x06, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05,
-	0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x75, 0x69,
-	0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x18,
-	0x0a, 0x07, 0x64, 0x65, 0x76, 0x6c, 0x6f, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
-	0x07, 0x64, 0x65, 0x76, 0x6c, 0x6f, 0x6f, 0x70, 0x22, 0x69, 0x0a, 0x0a, 0x53, 0x75, 0x67, 0x67,
-	0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0e, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73,
-	0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x75, 0x67,
-	0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0e, 0x73, 0x75, 0x67,
-	0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x4f, 0x72, 0x53, 0x74, 0x72, 0x69,
-	0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
-	0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x12, 0x16,
-	0x0a, 0x06, 0x73, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x73, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x32, 0xdf, 0x05, 0x0a, 0x11, 0x53, 0x6b, 0x61, 0x66, 0x66,
-	0x6f, 0x6c, 0x64, 0x56, 0x32, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x08,
-	0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
-	0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x74,
-	0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x32, 0x2f, 0x73,
-	0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76,
-	0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12,
-	0x0a, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x30, 0x01, 0x12, 0x59, 0x0a,
-	0x0f, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x73,
+	0x88, 0x02, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53,
+	0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74,
+	0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61,
+	0x73, 0x6b, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+	0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65,
+	0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52,
+	0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x61,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0xec, 0x02, 0x0a, 0x10, 0x50,
+	0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+	0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61,
+	0x6c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6c, 0x6f, 0x63,
+	0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d,
+	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d,
+	0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65,
+	0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65,
+	0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+	0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f,
+	0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74,
+	0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76,
+	0x32, 0x2e, 0x49, 0x6e, 0x74, 0x4f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x74,
+	0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x0d, 0x46, 0x69,
+	0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74,
+	0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61,
+	0x73, 0x6b, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e,
+	0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75,
+	0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x3d, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72,
+	0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72,
+	0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22,
+	0xa0, 0x03, 0x0a, 0x17, 0x44, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74,
+	0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61,
+	0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07,
+	0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70,
+	0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+	0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+	0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72,
+	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x72,
+	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d,
+	0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65,
+	0x12, 0x1e, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x18, 0x09,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72,
+	0x12, 0x51, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x0a,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e,
+	0x44, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72,
+	0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f,
+	0x72, 0x74, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x44, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74,
+	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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
+	0x38, 0x01, 0x22, 0x3d, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x76, 0x32, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x22, 0x3e, 0x0a, 0x0e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72,
+	0x69, 0x67, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x22, 0x31, 0x0a, 0x0c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74,
+	0x65, 0x12, 0x1a, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x05, 0x0a,
+	0x03, 0x76, 0x61, 0x6c, 0x22, 0x64, 0x0a, 0x06, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14,
+	0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x70, 0x6c,
+	0x6f, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79,
+	0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x6c, 0x6f, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x07, 0x64, 0x65, 0x76, 0x6c, 0x6f, 0x6f, 0x70, 0x22, 0x69, 0x0a, 0x0a, 0x53, 0x75,
+	0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0e, 0x73, 0x75, 0x67, 0x67,
+	0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53,
+	0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0e, 0x73,
+	0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a,
+	0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x4f, 0x72, 0x53, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x74, 0x56,
+	0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c,
+	0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x73, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x32, 0xdf, 0x05, 0x0a, 0x11, 0x53, 0x6b, 0x61,
+	0x66, 0x66, 0x6f, 0x6c, 0x64, 0x56, 0x32, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x46,
+	0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
+	0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x32,
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73,
 	0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
 	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x15, 0x12, 0x13, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63,
-	0x75, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x55,
-	0x73, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15,
-	0x22, 0x0b, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x3a, 0x06, 0x69,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x42, 0x75, 0x69,
-	0x6c, 0x64, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72,
-	0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
-	0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x16, 0x2f, 0x76,
-	0x32, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65,
-	0x63, 0x75, 0x74, 0x65, 0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x62, 0x0a, 0x08, 0x41,
-	0x75, 0x74, 0x6f, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x76, 0x32, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x1e, 0x1a, 0x15, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x2f, 0x61, 0x75, 0x74, 0x6f,
-	0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12,
-	0x66, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x18, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
-	0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x1a, 0x17, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x65, 0x70,
-	0x6c, 0x6f, 0x79, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65,
-	0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x48, 0x61, 0x6e, 0x64, 0x6c,
-	0x65, 0x12, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65,
-	0x6e, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93,
-	0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68,
-	0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68,
-	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x43, 0x6f, 0x6e,
-	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x73, 0x6b, 0x61, 0x66,
-	0x66, 0x6f, 0x6c, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x32, 0x50, 0x03, 0x62,
-	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02,
+	0x0c, 0x12, 0x0a, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x30, 0x01, 0x12,
+	0x59, 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f,
+	0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1b, 0x82, 0xd3, 0xe4,
+	0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x07, 0x45, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
+	0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93,
+	0x02, 0x15, 0x22, 0x0b, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x3a,
+	0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x42,
+	0x75, 0x69, 0x6c, 0x64, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e,
+	0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x16,
+	0x2f, 0x76, 0x32, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x62, 0x0a,
+	0x08, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4,
+	0x93, 0x02, 0x1e, 0x1a, 0x15, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x2f, 0x61, 0x75,
+	0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x3a, 0x05, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x12, 0x66, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12,
+	0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67,
+	0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x1a, 0x17, 0x2f, 0x76, 0x32, 0x2f, 0x64,
+	0x65, 0x70, 0x6c, 0x6f, 0x79, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x65, 0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x48, 0x61, 0x6e,
+	0x64, 0x6c, 0x65, 0x12, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3,
+	0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73,
+	0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69,
+	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x43,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x73, 0x6b,
+	0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x32, 0x50,
+	0x03, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -3823,7 +3999,7 @@ func file_v2_skaffold_proto_rawDescGZIP() []byte {
 	return file_v2_skaffold_proto_rawDescData
 }
 
-var file_v2_skaffold_proto_msgTypes = make([]protoimpl.MessageInfo, 46)
+var file_v2_skaffold_proto_msgTypes = make([]protoimpl.MessageInfo, 48)
 var file_v2_skaffold_proto_goTypes = []interface{}{
 	(*StateResponse)(nil),           // 0: proto.v2.StateResponse
 	(*Response)(nil),                // 1: proto.v2.Response
@@ -3837,140 +4013,146 @@ var file_v2_skaffold_proto_goTypes = []interface{}{
 	(*BuildState)(nil),              // 9: proto.v2.BuildState
 	(*TestState)(nil),               // 10: proto.v2.TestState
 	(*RenderState)(nil),             // 11: proto.v2.RenderState
-	(*DeployState)(nil),             // 12: proto.v2.DeployState
-	(*StatusCheckState)(nil),        // 13: proto.v2.StatusCheckState
-	(*FileSyncState)(nil),           // 14: proto.v2.FileSyncState
-	(*Event)(nil),                   // 15: proto.v2.Event
-	(*TerminationEvent)(nil),        // 16: proto.v2.TerminationEvent
-	(*ActionableErr)(nil),           // 17: proto.v2.ActionableErr
-	(*MetaEvent)(nil),               // 18: proto.v2.MetaEvent
-	(*SkaffoldLogEvent)(nil),        // 19: proto.v2.SkaffoldLogEvent
-	(*ApplicationLogEvent)(nil),     // 20: proto.v2.ApplicationLogEvent
-	(*TaskEvent)(nil),               // 21: proto.v2.TaskEvent
-	(*BuildSubtaskEvent)(nil),       // 22: proto.v2.BuildSubtaskEvent
-	(*TestSubtaskEvent)(nil),        // 23: proto.v2.TestSubtaskEvent
-	(*RenderSubtaskEvent)(nil),      // 24: proto.v2.RenderSubtaskEvent
-	(*DeploySubtaskEvent)(nil),      // 25: proto.v2.DeploySubtaskEvent
-	(*StatusCheckSubtaskEvent)(nil), // 26: proto.v2.StatusCheckSubtaskEvent
-	(*PortForwardEvent)(nil),        // 27: proto.v2.PortForwardEvent
-	(*FileSyncEvent)(nil),           // 28: proto.v2.FileSyncEvent
-	(*DebuggingContainerEvent)(nil), // 29: proto.v2.DebuggingContainerEvent
-	(*UserIntentRequest)(nil),       // 30: proto.v2.UserIntentRequest
-	(*TriggerRequest)(nil),          // 31: proto.v2.TriggerRequest
-	(*TriggerState)(nil),            // 32: proto.v2.TriggerState
-	(*Intent)(nil),                  // 33: proto.v2.Intent
-	(*Suggestion)(nil),              // 34: proto.v2.Suggestion
-	(*IntOrString)(nil),             // 35: proto.v2.IntOrString
-	nil,                             // 36: proto.v2.State.ForwardedPortsEntry
-	nil,                             // 37: proto.v2.Metadata.AdditionalEntry
-	(*BuildMetadata_Artifact)(nil),  // 38: proto.v2.BuildMetadata.Artifact
-	nil,                             // 39: proto.v2.BuildMetadata.AdditionalEntry
-	(*TestMetadata_Tester)(nil),     // 40: proto.v2.TestMetadata.Tester
-	(*RenderMetadata_Renderer)(nil), // 41: proto.v2.RenderMetadata.Renderer
-	(*DeployMetadata_Deployer)(nil), // 42: proto.v2.DeployMetadata.Deployer
-	nil,                             // 43: proto.v2.BuildState.ArtifactsEntry
-	nil,                             // 44: proto.v2.StatusCheckState.ResourcesEntry
-	nil,                             // 45: proto.v2.DebuggingContainerEvent.DebugPortsEntry
-	(enums.BuildType)(0),            // 46: proto.enums.BuildType
-	(enums.ClusterType)(0),          // 47: proto.enums.ClusterType
-	(enums.StatusCode)(0),           // 48: proto.enums.StatusCode
-	(*timestamppb.Timestamp)(nil),   // 49: google.protobuf.Timestamp
-	(enums.LogLevel)(0),             // 50: proto.enums.LogLevel
-	(enums.SuggestionCode)(0),       // 51: proto.enums.SuggestionCode
-	(enums.BuilderType)(0),          // 52: proto.enums.BuilderType
-	(enums.TesterType)(0),           // 53: proto.enums.TesterType
-	(enums.RenderType)(0),           // 54: proto.enums.RenderType
-	(enums.DeployerType)(0),         // 55: proto.enums.DeployerType
-	(*emptypb.Empty)(nil),           // 56: google.protobuf.Empty
+	(*VerifyState)(nil),             // 12: proto.v2.VerifyState
+	(*DeployState)(nil),             // 13: proto.v2.DeployState
+	(*StatusCheckState)(nil),        // 14: proto.v2.StatusCheckState
+	(*FileSyncState)(nil),           // 15: proto.v2.FileSyncState
+	(*Event)(nil),                   // 16: proto.v2.Event
+	(*TerminationEvent)(nil),        // 17: proto.v2.TerminationEvent
+	(*ActionableErr)(nil),           // 18: proto.v2.ActionableErr
+	(*MetaEvent)(nil),               // 19: proto.v2.MetaEvent
+	(*SkaffoldLogEvent)(nil),        // 20: proto.v2.SkaffoldLogEvent
+	(*ApplicationLogEvent)(nil),     // 21: proto.v2.ApplicationLogEvent
+	(*TaskEvent)(nil),               // 22: proto.v2.TaskEvent
+	(*BuildSubtaskEvent)(nil),       // 23: proto.v2.BuildSubtaskEvent
+	(*TestSubtaskEvent)(nil),        // 24: proto.v2.TestSubtaskEvent
+	(*RenderSubtaskEvent)(nil),      // 25: proto.v2.RenderSubtaskEvent
+	(*VerifySubtaskEvent)(nil),      // 26: proto.v2.VerifySubtaskEvent
+	(*DeploySubtaskEvent)(nil),      // 27: proto.v2.DeploySubtaskEvent
+	(*StatusCheckSubtaskEvent)(nil), // 28: proto.v2.StatusCheckSubtaskEvent
+	(*PortForwardEvent)(nil),        // 29: proto.v2.PortForwardEvent
+	(*FileSyncEvent)(nil),           // 30: proto.v2.FileSyncEvent
+	(*DebuggingContainerEvent)(nil), // 31: proto.v2.DebuggingContainerEvent
+	(*UserIntentRequest)(nil),       // 32: proto.v2.UserIntentRequest
+	(*TriggerRequest)(nil),          // 33: proto.v2.TriggerRequest
+	(*TriggerState)(nil),            // 34: proto.v2.TriggerState
+	(*Intent)(nil),                  // 35: proto.v2.Intent
+	(*Suggestion)(nil),              // 36: proto.v2.Suggestion
+	(*IntOrString)(nil),             // 37: proto.v2.IntOrString
+	nil,                             // 38: proto.v2.State.ForwardedPortsEntry
+	nil,                             // 39: proto.v2.Metadata.AdditionalEntry
+	(*BuildMetadata_Artifact)(nil),  // 40: proto.v2.BuildMetadata.Artifact
+	nil,                             // 41: proto.v2.BuildMetadata.AdditionalEntry
+	(*TestMetadata_Tester)(nil),     // 42: proto.v2.TestMetadata.Tester
+	(*RenderMetadata_Renderer)(nil), // 43: proto.v2.RenderMetadata.Renderer
+	(*DeployMetadata_Deployer)(nil), // 44: proto.v2.DeployMetadata.Deployer
+	nil,                             // 45: proto.v2.BuildState.ArtifactsEntry
+	nil,                             // 46: proto.v2.StatusCheckState.ResourcesEntry
+	nil,                             // 47: proto.v2.DebuggingContainerEvent.DebugPortsEntry
+	(enums.BuildType)(0),            // 48: proto.enums.BuildType
+	(enums.ClusterType)(0),          // 49: proto.enums.ClusterType
+	(enums.StatusCode)(0),           // 50: proto.enums.StatusCode
+	(*timestamppb.Timestamp)(nil),   // 51: google.protobuf.Timestamp
+	(enums.LogLevel)(0),             // 52: proto.enums.LogLevel
+	(enums.SuggestionCode)(0),       // 53: proto.enums.SuggestionCode
+	(enums.BuilderType)(0),          // 54: proto.enums.BuilderType
+	(enums.TesterType)(0),           // 55: proto.enums.TesterType
+	(enums.RenderType)(0),           // 56: proto.enums.RenderType
+	(enums.DeployerType)(0),         // 57: proto.enums.DeployerType
+	(*emptypb.Empty)(nil),           // 58: google.protobuf.Empty
 }
 var file_v2_skaffold_proto_depIdxs = []int32{
 	3,  // 0: proto.v2.StateResponse.state:type_name -> proto.v2.State
 	9,  // 1: proto.v2.State.buildState:type_name -> proto.v2.BuildState
-	12, // 2: proto.v2.State.deployState:type_name -> proto.v2.DeployState
-	36, // 3: proto.v2.State.forwardedPorts:type_name -> proto.v2.State.ForwardedPortsEntry
-	13, // 4: proto.v2.State.statusCheckState:type_name -> proto.v2.StatusCheckState
-	14, // 5: proto.v2.State.fileSyncState:type_name -> proto.v2.FileSyncState
-	29, // 6: proto.v2.State.debuggingContainers:type_name -> proto.v2.DebuggingContainerEvent
+	13, // 2: proto.v2.State.deployState:type_name -> proto.v2.DeployState
+	38, // 3: proto.v2.State.forwardedPorts:type_name -> proto.v2.State.ForwardedPortsEntry
+	14, // 4: proto.v2.State.statusCheckState:type_name -> proto.v2.StatusCheckState
+	15, // 5: proto.v2.State.fileSyncState:type_name -> proto.v2.FileSyncState
+	31, // 6: proto.v2.State.debuggingContainers:type_name -> proto.v2.DebuggingContainerEvent
 	4,  // 7: proto.v2.State.metadata:type_name -> proto.v2.Metadata
 	10, // 8: proto.v2.State.testState:type_name -> proto.v2.TestState
 	11, // 9: proto.v2.State.renderState:type_name -> proto.v2.RenderState
-	5,  // 10: proto.v2.Metadata.build:type_name -> proto.v2.BuildMetadata
-	8,  // 11: proto.v2.Metadata.deploy:type_name -> proto.v2.DeployMetadata
-	6,  // 12: proto.v2.Metadata.test:type_name -> proto.v2.TestMetadata
-	7,  // 13: proto.v2.Metadata.render:type_name -> proto.v2.RenderMetadata
-	37, // 14: proto.v2.Metadata.additional:type_name -> proto.v2.Metadata.AdditionalEntry
-	38, // 15: proto.v2.BuildMetadata.artifacts:type_name -> proto.v2.BuildMetadata.Artifact
-	46, // 16: proto.v2.BuildMetadata.type:type_name -> proto.enums.BuildType
-	39, // 17: proto.v2.BuildMetadata.additional:type_name -> proto.v2.BuildMetadata.AdditionalEntry
-	40, // 18: proto.v2.TestMetadata.Testers:type_name -> proto.v2.TestMetadata.Tester
-	41, // 19: proto.v2.RenderMetadata.Renderers:type_name -> proto.v2.RenderMetadata.Renderer
-	42, // 20: proto.v2.DeployMetadata.deployers:type_name -> proto.v2.DeployMetadata.Deployer
-	47, // 21: proto.v2.DeployMetadata.cluster:type_name -> proto.enums.ClusterType
-	43, // 22: proto.v2.BuildState.artifacts:type_name -> proto.v2.BuildState.ArtifactsEntry
-	48, // 23: proto.v2.BuildState.statusCode:type_name -> proto.enums.StatusCode
-	48, // 24: proto.v2.TestState.statusCode:type_name -> proto.enums.StatusCode
-	48, // 25: proto.v2.RenderState.statusCode:type_name -> proto.enums.StatusCode
-	48, // 26: proto.v2.DeployState.statusCode:type_name -> proto.enums.StatusCode
-	44, // 27: proto.v2.StatusCheckState.resources:type_name -> proto.v2.StatusCheckState.ResourcesEntry
-	48, // 28: proto.v2.StatusCheckState.statusCode:type_name -> proto.enums.StatusCode
-	49, // 29: proto.v2.Event.timestamp:type_name -> google.protobuf.Timestamp
-	18, // 30: proto.v2.Event.metaEvent:type_name -> proto.v2.MetaEvent
-	19, // 31: proto.v2.Event.skaffoldLogEvent:type_name -> proto.v2.SkaffoldLogEvent
-	20, // 32: proto.v2.Event.applicationLogEvent:type_name -> proto.v2.ApplicationLogEvent
-	21, // 33: proto.v2.Event.taskEvent:type_name -> proto.v2.TaskEvent
-	22, // 34: proto.v2.Event.buildSubtaskEvent:type_name -> proto.v2.BuildSubtaskEvent
-	25, // 35: proto.v2.Event.deploySubtaskEvent:type_name -> proto.v2.DeploySubtaskEvent
-	27, // 36: proto.v2.Event.portEvent:type_name -> proto.v2.PortForwardEvent
-	26, // 37: proto.v2.Event.statusCheckSubtaskEvent:type_name -> proto.v2.StatusCheckSubtaskEvent
-	28, // 38: proto.v2.Event.fileSyncEvent:type_name -> proto.v2.FileSyncEvent
-	29, // 39: proto.v2.Event.debuggingContainerEvent:type_name -> proto.v2.DebuggingContainerEvent
-	16, // 40: proto.v2.Event.terminationEvent:type_name -> proto.v2.TerminationEvent
-	23, // 41: proto.v2.Event.testEvent:type_name -> proto.v2.TestSubtaskEvent
-	24, // 42: proto.v2.Event.renderEvent:type_name -> proto.v2.RenderSubtaskEvent
-	17, // 43: proto.v2.TerminationEvent.err:type_name -> proto.v2.ActionableErr
-	48, // 44: proto.v2.ActionableErr.errCode:type_name -> proto.enums.StatusCode
-	34, // 45: proto.v2.ActionableErr.suggestions:type_name -> proto.v2.Suggestion
-	4,  // 46: proto.v2.MetaEvent.metadata:type_name -> proto.v2.Metadata
-	50, // 47: proto.v2.SkaffoldLogEvent.level:type_name -> proto.enums.LogLevel
-	17, // 48: proto.v2.TaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	17, // 49: proto.v2.BuildSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	17, // 50: proto.v2.TestSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	17, // 51: proto.v2.RenderSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	17, // 52: proto.v2.DeploySubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	48, // 53: proto.v2.StatusCheckSubtaskEvent.statusCode:type_name -> proto.enums.StatusCode
-	17, // 54: proto.v2.StatusCheckSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	35, // 55: proto.v2.PortForwardEvent.targetPort:type_name -> proto.v2.IntOrString
-	17, // 56: proto.v2.FileSyncEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	45, // 57: proto.v2.DebuggingContainerEvent.debugPorts:type_name -> proto.v2.DebuggingContainerEvent.DebugPortsEntry
-	33, // 58: proto.v2.UserIntentRequest.intent:type_name -> proto.v2.Intent
-	32, // 59: proto.v2.TriggerRequest.state:type_name -> proto.v2.TriggerState
-	51, // 60: proto.v2.Suggestion.suggestionCode:type_name -> proto.enums.SuggestionCode
-	27, // 61: proto.v2.State.ForwardedPortsEntry.value:type_name -> proto.v2.PortForwardEvent
-	52, // 62: proto.v2.BuildMetadata.Artifact.type:type_name -> proto.enums.BuilderType
-	53, // 63: proto.v2.TestMetadata.Tester.type:type_name -> proto.enums.TesterType
-	54, // 64: proto.v2.RenderMetadata.Renderer.type:type_name -> proto.enums.RenderType
-	55, // 65: proto.v2.DeployMetadata.Deployer.type:type_name -> proto.enums.DeployerType
-	56, // 66: proto.v2.SkaffoldV2Service.GetState:input_type -> google.protobuf.Empty
-	56, // 67: proto.v2.SkaffoldV2Service.Events:input_type -> google.protobuf.Empty
-	56, // 68: proto.v2.SkaffoldV2Service.ApplicationLogs:input_type -> google.protobuf.Empty
-	30, // 69: proto.v2.SkaffoldV2Service.Execute:input_type -> proto.v2.UserIntentRequest
-	31, // 70: proto.v2.SkaffoldV2Service.AutoBuild:input_type -> proto.v2.TriggerRequest
-	31, // 71: proto.v2.SkaffoldV2Service.AutoSync:input_type -> proto.v2.TriggerRequest
-	31, // 72: proto.v2.SkaffoldV2Service.AutoDeploy:input_type -> proto.v2.TriggerRequest
-	15, // 73: proto.v2.SkaffoldV2Service.Handle:input_type -> proto.v2.Event
-	3,  // 74: proto.v2.SkaffoldV2Service.GetState:output_type -> proto.v2.State
-	15, // 75: proto.v2.SkaffoldV2Service.Events:output_type -> proto.v2.Event
-	15, // 76: proto.v2.SkaffoldV2Service.ApplicationLogs:output_type -> proto.v2.Event
-	56, // 77: proto.v2.SkaffoldV2Service.Execute:output_type -> google.protobuf.Empty
-	56, // 78: proto.v2.SkaffoldV2Service.AutoBuild:output_type -> google.protobuf.Empty
-	56, // 79: proto.v2.SkaffoldV2Service.AutoSync:output_type -> google.protobuf.Empty
-	56, // 80: proto.v2.SkaffoldV2Service.AutoDeploy:output_type -> google.protobuf.Empty
-	56, // 81: proto.v2.SkaffoldV2Service.Handle:output_type -> google.protobuf.Empty
-	74, // [74:82] is the sub-list for method output_type
-	66, // [66:74] is the sub-list for method input_type
-	66, // [66:66] is the sub-list for extension type_name
-	66, // [66:66] is the sub-list for extension extendee
-	0,  // [0:66] is the sub-list for field type_name
+	12, // 10: proto.v2.State.verifyState:type_name -> proto.v2.VerifyState
+	5,  // 11: proto.v2.Metadata.build:type_name -> proto.v2.BuildMetadata
+	8,  // 12: proto.v2.Metadata.deploy:type_name -> proto.v2.DeployMetadata
+	6,  // 13: proto.v2.Metadata.test:type_name -> proto.v2.TestMetadata
+	7,  // 14: proto.v2.Metadata.render:type_name -> proto.v2.RenderMetadata
+	39, // 15: proto.v2.Metadata.additional:type_name -> proto.v2.Metadata.AdditionalEntry
+	40, // 16: proto.v2.BuildMetadata.artifacts:type_name -> proto.v2.BuildMetadata.Artifact
+	48, // 17: proto.v2.BuildMetadata.type:type_name -> proto.enums.BuildType
+	41, // 18: proto.v2.BuildMetadata.additional:type_name -> proto.v2.BuildMetadata.AdditionalEntry
+	42, // 19: proto.v2.TestMetadata.Testers:type_name -> proto.v2.TestMetadata.Tester
+	43, // 20: proto.v2.RenderMetadata.Renderers:type_name -> proto.v2.RenderMetadata.Renderer
+	44, // 21: proto.v2.DeployMetadata.deployers:type_name -> proto.v2.DeployMetadata.Deployer
+	49, // 22: proto.v2.DeployMetadata.cluster:type_name -> proto.enums.ClusterType
+	45, // 23: proto.v2.BuildState.artifacts:type_name -> proto.v2.BuildState.ArtifactsEntry
+	50, // 24: proto.v2.BuildState.statusCode:type_name -> proto.enums.StatusCode
+	50, // 25: proto.v2.TestState.statusCode:type_name -> proto.enums.StatusCode
+	50, // 26: proto.v2.RenderState.statusCode:type_name -> proto.enums.StatusCode
+	50, // 27: proto.v2.VerifyState.statusCode:type_name -> proto.enums.StatusCode
+	50, // 28: proto.v2.DeployState.statusCode:type_name -> proto.enums.StatusCode
+	46, // 29: proto.v2.StatusCheckState.resources:type_name -> proto.v2.StatusCheckState.ResourcesEntry
+	50, // 30: proto.v2.StatusCheckState.statusCode:type_name -> proto.enums.StatusCode
+	51, // 31: proto.v2.Event.timestamp:type_name -> google.protobuf.Timestamp
+	19, // 32: proto.v2.Event.metaEvent:type_name -> proto.v2.MetaEvent
+	20, // 33: proto.v2.Event.skaffoldLogEvent:type_name -> proto.v2.SkaffoldLogEvent
+	21, // 34: proto.v2.Event.applicationLogEvent:type_name -> proto.v2.ApplicationLogEvent
+	22, // 35: proto.v2.Event.taskEvent:type_name -> proto.v2.TaskEvent
+	23, // 36: proto.v2.Event.buildSubtaskEvent:type_name -> proto.v2.BuildSubtaskEvent
+	27, // 37: proto.v2.Event.deploySubtaskEvent:type_name -> proto.v2.DeploySubtaskEvent
+	29, // 38: proto.v2.Event.portEvent:type_name -> proto.v2.PortForwardEvent
+	28, // 39: proto.v2.Event.statusCheckSubtaskEvent:type_name -> proto.v2.StatusCheckSubtaskEvent
+	30, // 40: proto.v2.Event.fileSyncEvent:type_name -> proto.v2.FileSyncEvent
+	31, // 41: proto.v2.Event.debuggingContainerEvent:type_name -> proto.v2.DebuggingContainerEvent
+	17, // 42: proto.v2.Event.terminationEvent:type_name -> proto.v2.TerminationEvent
+	24, // 43: proto.v2.Event.testEvent:type_name -> proto.v2.TestSubtaskEvent
+	25, // 44: proto.v2.Event.renderEvent:type_name -> proto.v2.RenderSubtaskEvent
+	26, // 45: proto.v2.Event.verifyEvent:type_name -> proto.v2.VerifySubtaskEvent
+	18, // 46: proto.v2.TerminationEvent.err:type_name -> proto.v2.ActionableErr
+	50, // 47: proto.v2.ActionableErr.errCode:type_name -> proto.enums.StatusCode
+	36, // 48: proto.v2.ActionableErr.suggestions:type_name -> proto.v2.Suggestion
+	4,  // 49: proto.v2.MetaEvent.metadata:type_name -> proto.v2.Metadata
+	52, // 50: proto.v2.SkaffoldLogEvent.level:type_name -> proto.enums.LogLevel
+	18, // 51: proto.v2.TaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 52: proto.v2.BuildSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 53: proto.v2.TestSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 54: proto.v2.RenderSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 55: proto.v2.VerifySubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 56: proto.v2.DeploySubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	50, // 57: proto.v2.StatusCheckSubtaskEvent.statusCode:type_name -> proto.enums.StatusCode
+	18, // 58: proto.v2.StatusCheckSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	37, // 59: proto.v2.PortForwardEvent.targetPort:type_name -> proto.v2.IntOrString
+	18, // 60: proto.v2.FileSyncEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	47, // 61: proto.v2.DebuggingContainerEvent.debugPorts:type_name -> proto.v2.DebuggingContainerEvent.DebugPortsEntry
+	35, // 62: proto.v2.UserIntentRequest.intent:type_name -> proto.v2.Intent
+	34, // 63: proto.v2.TriggerRequest.state:type_name -> proto.v2.TriggerState
+	53, // 64: proto.v2.Suggestion.suggestionCode:type_name -> proto.enums.SuggestionCode
+	29, // 65: proto.v2.State.ForwardedPortsEntry.value:type_name -> proto.v2.PortForwardEvent
+	54, // 66: proto.v2.BuildMetadata.Artifact.type:type_name -> proto.enums.BuilderType
+	55, // 67: proto.v2.TestMetadata.Tester.type:type_name -> proto.enums.TesterType
+	56, // 68: proto.v2.RenderMetadata.Renderer.type:type_name -> proto.enums.RenderType
+	57, // 69: proto.v2.DeployMetadata.Deployer.type:type_name -> proto.enums.DeployerType
+	58, // 70: proto.v2.SkaffoldV2Service.GetState:input_type -> google.protobuf.Empty
+	58, // 71: proto.v2.SkaffoldV2Service.Events:input_type -> google.protobuf.Empty
+	58, // 72: proto.v2.SkaffoldV2Service.ApplicationLogs:input_type -> google.protobuf.Empty
+	32, // 73: proto.v2.SkaffoldV2Service.Execute:input_type -> proto.v2.UserIntentRequest
+	33, // 74: proto.v2.SkaffoldV2Service.AutoBuild:input_type -> proto.v2.TriggerRequest
+	33, // 75: proto.v2.SkaffoldV2Service.AutoSync:input_type -> proto.v2.TriggerRequest
+	33, // 76: proto.v2.SkaffoldV2Service.AutoDeploy:input_type -> proto.v2.TriggerRequest
+	16, // 77: proto.v2.SkaffoldV2Service.Handle:input_type -> proto.v2.Event
+	3,  // 78: proto.v2.SkaffoldV2Service.GetState:output_type -> proto.v2.State
+	16, // 79: proto.v2.SkaffoldV2Service.Events:output_type -> proto.v2.Event
+	16, // 80: proto.v2.SkaffoldV2Service.ApplicationLogs:output_type -> proto.v2.Event
+	58, // 81: proto.v2.SkaffoldV2Service.Execute:output_type -> google.protobuf.Empty
+	58, // 82: proto.v2.SkaffoldV2Service.AutoBuild:output_type -> google.protobuf.Empty
+	58, // 83: proto.v2.SkaffoldV2Service.AutoSync:output_type -> google.protobuf.Empty
+	58, // 84: proto.v2.SkaffoldV2Service.AutoDeploy:output_type -> google.protobuf.Empty
+	58, // 85: proto.v2.SkaffoldV2Service.Handle:output_type -> google.protobuf.Empty
+	78, // [78:86] is the sub-list for method output_type
+	70, // [70:78] is the sub-list for method input_type
+	70, // [70:70] is the sub-list for extension type_name
+	70, // [70:70] is the sub-list for extension extendee
+	0,  // [0:70] is the sub-list for field type_name
 }
 
 func init() { file_v2_skaffold_proto_init() }
@@ -4124,7 +4306,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeployState); i {
+			switch v := v.(*VerifyState); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4136,7 +4318,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*StatusCheckState); i {
+			switch v := v.(*DeployState); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4148,7 +4330,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*FileSyncState); i {
+			switch v := v.(*StatusCheckState); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4160,7 +4342,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Event); i {
+			switch v := v.(*FileSyncState); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4172,7 +4354,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TerminationEvent); i {
+			switch v := v.(*Event); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4184,7 +4366,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ActionableErr); i {
+			switch v := v.(*TerminationEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4196,7 +4378,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*MetaEvent); i {
+			switch v := v.(*ActionableErr); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4208,7 +4390,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SkaffoldLogEvent); i {
+			switch v := v.(*MetaEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4220,7 +4402,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ApplicationLogEvent); i {
+			switch v := v.(*SkaffoldLogEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4232,7 +4414,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TaskEvent); i {
+			switch v := v.(*ApplicationLogEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4244,7 +4426,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*BuildSubtaskEvent); i {
+			switch v := v.(*TaskEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4256,7 +4438,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TestSubtaskEvent); i {
+			switch v := v.(*BuildSubtaskEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4268,7 +4450,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RenderSubtaskEvent); i {
+			switch v := v.(*TestSubtaskEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4280,7 +4462,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeploySubtaskEvent); i {
+			switch v := v.(*RenderSubtaskEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4292,7 +4474,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*StatusCheckSubtaskEvent); i {
+			switch v := v.(*VerifySubtaskEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4304,7 +4486,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PortForwardEvent); i {
+			switch v := v.(*DeploySubtaskEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4316,7 +4498,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*FileSyncEvent); i {
+			switch v := v.(*StatusCheckSubtaskEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4328,7 +4510,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DebuggingContainerEvent); i {
+			switch v := v.(*PortForwardEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4340,7 +4522,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UserIntentRequest); i {
+			switch v := v.(*FileSyncEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4352,7 +4534,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TriggerRequest); i {
+			switch v := v.(*DebuggingContainerEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4364,7 +4546,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TriggerState); i {
+			switch v := v.(*UserIntentRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4376,7 +4558,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Intent); i {
+			switch v := v.(*TriggerRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4388,7 +4570,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Suggestion); i {
+			switch v := v.(*TriggerState); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4400,6 +4582,30 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Intent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2_skaffold_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Suggestion); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2_skaffold_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*IntOrString); i {
 			case 0:
 				return &v.state
@@ -4411,7 +4617,7 @@ func file_v2_skaffold_proto_init() {
 				return nil
 			}
 		}
-		file_v2_skaffold_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+		file_v2_skaffold_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*BuildMetadata_Artifact); i {
 			case 0:
 				return &v.state
@@ -4423,7 +4629,7 @@ func file_v2_skaffold_proto_init() {
 				return nil
 			}
 		}
-		file_v2_skaffold_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+		file_v2_skaffold_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestMetadata_Tester); i {
 			case 0:
 				return &v.state
@@ -4435,7 +4641,7 @@ func file_v2_skaffold_proto_init() {
 				return nil
 			}
 		}
-		file_v2_skaffold_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+		file_v2_skaffold_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*RenderMetadata_Renderer); i {
 			case 0:
 				return &v.state
@@ -4447,7 +4653,7 @@ func file_v2_skaffold_proto_init() {
 				return nil
 			}
 		}
-		file_v2_skaffold_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+		file_v2_skaffold_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DeployMetadata_Deployer); i {
 			case 0:
 				return &v.state
@@ -4460,7 +4666,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 	}
-	file_v2_skaffold_proto_msgTypes[15].OneofWrappers = []interface{}{
+	file_v2_skaffold_proto_msgTypes[16].OneofWrappers = []interface{}{
 		(*Event_MetaEvent)(nil),
 		(*Event_SkaffoldLogEvent)(nil),
 		(*Event_ApplicationLogEvent)(nil),
@@ -4474,8 +4680,9 @@ func file_v2_skaffold_proto_init() {
 		(*Event_TerminationEvent)(nil),
 		(*Event_TestEvent)(nil),
 		(*Event_RenderEvent)(nil),
+		(*Event_VerifyEvent)(nil),
 	}
-	file_v2_skaffold_proto_msgTypes[32].OneofWrappers = []interface{}{
+	file_v2_skaffold_proto_msgTypes[34].OneofWrappers = []interface{}{
 		(*TriggerState_Enabled)(nil),
 	}
 	type x struct{}
@@ -4484,7 +4691,7 @@ func file_v2_skaffold_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_v2_skaffold_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   46,
+			NumMessages:   48,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/v2/skaffold.proto b/proto/v2/skaffold.proto
index 6a72bddac..a85c71023 100644
--- a/proto/v2/skaffold.proto
+++ b/proto/v2/skaffold.proto
@@ -32,6 +32,7 @@ message State {
     Metadata metadata = 7;
     TestState testState = 8;
     RenderState renderState = 9;
+    VerifyState verifyState = 10;
 }
 
 message Metadata {
@@ -115,6 +116,14 @@ message RenderState {
     enums.StatusCode statusCode = 2;
 }
 
+// `VerifyState` describes the current state of the render
+message VerifyState {
+    // Status of the current render
+    string status = 1;
+    // Verifystate status code
+    enums.StatusCode statusCode = 2;
+}
+
 // `DeployState` describes the status of the current deploy
 message DeployState {
     string status = 1;
@@ -161,6 +170,7 @@ message Event {
         TerminationEvent terminationEvent = 12; // describes a skaffold termination event
         TestSubtaskEvent testEvent = 13; // describes if the test has started, is in progress or is complete.
         RenderSubtaskEvent renderEvent = 14; // describes if the render has started, is in progress or is complete.
+        VerifySubtaskEvent verifyEvent = 15; // describes if the render has started, is in progress or is complete.
     }
 }
 
@@ -242,6 +252,15 @@ message RenderSubtaskEvent {
     ActionableErr actionableErr = 4; // actionable error message
 }
 
+// `VerifyEvent` represents the status of a render, and is emitted by Skaffold
+// anytime a render starts or completes, successfully or not.
+message VerifySubtaskEvent {
+    string id = 1; // id of the subtask which will be used in SkaffoldLog
+    string task_id = 2; // id of the task of skaffold that this event came from
+    string status = 3; // render status oneof: InProgress, Completed, Failed
+    ActionableErr actionableErr = 4; // actionable error message
+}
+
 // `DeploySubtaskEvent` represents the status of a deployment, and is emitted by Skaffold
 // anytime a deployment starts or completes, successfully or not.
 message DeploySubtaskEvent {


Test patch:
diff --git a/integration/testdata/verify-fail/skaffold.yaml b/integration/testdata/verify-fail/skaffold.yaml
new file mode 100644
index 000000000..fee89ef87
--- /dev/null
+++ b/integration/testdata/verify-fail/skaffold.yaml
@@ -0,0 +1,13 @@
+apiVersion: skaffold/v3alpha1
+kind: Config
+verify:
+- name: hello-world
+  container:
+    name: hello-world:latest
+    image: hello-world
+- name: alpine
+  container:
+    name: alpine
+    image: alpine:3.15.4
+    command: ["/bin/sh"]
+    args: ["-c", "echo $FOO;exit 1"]
diff --git a/integration/testdata/verify-succeed/skaffold.yaml b/integration/testdata/verify-succeed/skaffold.yaml
new file mode 100644
index 000000000..3bae45526
--- /dev/null
+++ b/integration/testdata/verify-succeed/skaffold.yaml
@@ -0,0 +1,13 @@
+apiVersion: skaffold/v3alpha1
+kind: Config
+verify:
+- name: hello-world
+  container:
+    name: hello-world:latest
+    image: hello-world
+- name: alpine
+  container:
+    name: alpine
+    image: alpine:3.15.4
+    command: ["/bin/sh"]
+    args: ["-c", "echo $FOO; sleep 10; echo bye"]
diff --git a/integration/verify_test.go b/integration/verify_test.go
new file mode 100644
index 000000000..68d49d83a
--- /dev/null
+++ b/integration/verify_test.go
@@ -0,0 +1,85 @@
+/*
+Copyright 2019 The Skaffold Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package integration
+
+import (
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/google/uuid"
+
+	"github.com/GoogleContainerTools/skaffold/integration/skaffold"
+	"github.com/GoogleContainerTools/skaffold/testutil"
+)
+
+func TestVerifyPassingTestsWithEnvVar(t *testing.T) {
+	MarkIntegrationTest(t, CanRunWithoutGcp)
+	os.Setenv("FOO", "foo-var")
+	defer os.Unsetenv("FOO")
+	tmp := t.TempDir()
+	logFile := filepath.Join(tmp, uuid.New().String()+"logs.json")
+
+	rpcPort := randomPort()
+	// `--default-repo=` is used to cancel the default repo that is set by default.
+	out, err := skaffold.Verify("--default-repo=", "--rpc-port", rpcPort, "--event-log-file", logFile).InDir("testdata/verify-succeed").RunWithCombinedOutput(t)
+	logs := string(out)
+
+	testutil.CheckError(t, false, err)
+	testutil.CheckContains(t, "Hello from Docker!", logs)
+	testutil.CheckContains(t, "foo-var", logs)
+
+	// verify logs are in the event output as well
+	b, err := ioutil.ReadFile(logFile + ".v2")
+	if err != nil {
+		t.Fatalf("error reading %s", logFile+".v2")
+	}
+	v2EventLogs := string(b)
+	testutil.CheckContains(t, "Hello from Docker!", v2EventLogs)
+	testutil.CheckContains(t, "foo-var", v2EventLogs)
+
+	// TODO(aaron-prindle) verify that SUCCEEDED event is found where expected
+}
+
+func TestVerifyOneTestFailsWithEnvVar(t *testing.T) {
+	MarkIntegrationTest(t, CanRunWithoutGcp)
+	os.Setenv("FOO", "foo-var")
+	defer os.Unsetenv("FOO")
+	tmp := t.TempDir()
+	logFile := filepath.Join(tmp, uuid.New().String()+"logs.json")
+
+	rpcPort := randomPort()
+	// `--default-repo=` is used to cancel the default repo that is set by default.
+	out, err := skaffold.Verify("--default-repo=", "--rpc-port", rpcPort, "--event-log-file", logFile).InDir("testdata/verify-fail").RunWithCombinedOutput(t)
+	logs := string(out)
+
+	testutil.CheckError(t, true, err)
+	testutil.CheckContains(t, "Hello from Docker!", logs)
+	testutil.CheckContains(t, "foo-var", logs)
+
+	// verify logs are in the event output as well
+	b, err := ioutil.ReadFile(logFile + ".v2")
+	if err != nil {
+		t.Fatalf("error reading %s", logFile+".v2")
+	}
+	v2EventLogs := string(b)
+	testutil.CheckContains(t, "Hello from Docker!", v2EventLogs)
+	testutil.CheckContains(t, "foo-var", v2EventLogs)
+
+	// TODO(aaron-prindle) verify that FAILED event is found where expected
+}
diff --git a/pkg/skaffold/deploy/docker/deploy_test.go b/pkg/skaffold/deploy/docker/deploy_test.go
index 7b6bb16b1..806e56783 100644
--- a/pkg/skaffold/deploy/docker/deploy_test.go
+++ b/pkg/skaffold/deploy/docker/deploy_test.go
@@ -146,7 +146,7 @@ func TestDebugBindings(t *testing.T) {
 				}
 				testutil.CheckErrorAndFailNow(t, false, err)
 
-				bindings, err := d.portManager.allocatePorts(a.image, d.resources, &config, debugBindings)
+				bindings, err := d.portManager.AllocatePorts(a.image, d.resources, &config, debugBindings)
 				testutil.CheckErrorAndFailNow(t, false, err)
 
 				// CheckDeepEqual unfortunately doesn't work when the map elements are slices
diff --git a/pkg/skaffold/deploy/docker/port_test.go b/pkg/skaffold/deploy/docker/port/port_test.go
similarity index 97%
rename from pkg/skaffold/deploy/docker/port_test.go
rename to pkg/skaffold/deploy/docker/port/port_test.go
index 07e8b67a7..8473d30a3 100644
--- a/pkg/skaffold/deploy/docker/port_test.go
+++ b/pkg/skaffold/deploy/docker/port/port_test.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package docker
+package dockerport
 
 import (
 	"strconv"
@@ -79,7 +79,7 @@ func TestAllocatePorts(t *testing.T) {
 			})
 			pm := NewPortManager()
 			cfg := container.Config{}
-			m, err := pm.allocatePorts(test.name, collectResources(test.resources), &cfg, nil)
+			m, err := pm.AllocatePorts(test.name, collectResources(test.resources), &cfg, nil)
 			for containerPort := range cfg.ExposedPorts { // the image config's PortSet contains the local ports, so we grab the bindings keyed off these
 				bindings := m[containerPort]
 				t.CheckDeepEqual(len(bindings), 1) // we always have a 1-1 mapping of resource to binding
diff --git a/pkg/skaffold/event/v2/state_test.go b/pkg/skaffold/event/v2/state_test.go
index 458a91ab0..8bb6223ce 100644
--- a/pkg/skaffold/event/v2/state_test.go
+++ b/pkg/skaffold/event/v2/state_test.go
@@ -75,6 +75,7 @@ func TestResetStateOnBuild(t *testing.T) {
 		DeployState:      &proto.DeployState{Status: NotStarted},
 		StatusCheckState: &proto.StatusCheckState{Status: NotStarted, Resources: map[string]string{}},
 		FileSyncState:    &proto.FileSyncState{Status: NotStarted},
+		VerifyState:      &proto.VerifyState{Status: NotStarted},
 	}
 	testutil.CheckDeepEqual(t, expected, handler.getState(), cmpopts.EquateEmpty(), protocmp.Transform())
 }
diff --git a/pkg/skaffold/schema/latest/config.go b/pkg/skaffold/schema/latest/config.go
index ae174854c..7cbeed20c 100644
--- a/pkg/skaffold/schema/latest/config.go
+++ b/pkg/skaffold/schema/latest/config.go
@@ -86,6 +86,9 @@ type Pipeline struct {
 
 	// ResourceSelector describes user defined filters describing how skaffold should treat objects/fields during rendering.
 	ResourceSelector ResourceSelectorConfig `yaml:"resourceSelector,omitempty"`
+
+	// Verify describes how images are verified (via verification tests).
+	Verify []*VerifyTestCase `yaml:"verify,omitempty"`
 }
 
 // GitInfo contains information on the origin of skaffold configurations cloned from a git repository.
@@ -531,6 +534,14 @@ type TestCase struct {
 	StructureTestArgs []string `yaml:"structureTestsArgs,omitempty"`
 }
 
+// VerifyTestCase is a list of tests to run on images that Skaffold builds.
+type VerifyTestCase struct {
+	// Name is the name descriptor for the verify test.
+	Name string `yaml:"name" yamltags:"required"`
+	// Container is the container information for the verify test.
+	Container v1.Container `yaml:"container,omitempty" yamltags:"oneOf=verifyType"`
+}
+
 // RenderConfig contains all the configuration needed by the render steps.
 type RenderConfig struct {
 
diff --git a/pkg/skaffold/verify/verify_mux_test.go b/pkg/skaffold/verify/verify_mux_test.go
new file mode 100644
index 000000000..2cf86ac79
--- /dev/null
+++ b/pkg/skaffold/verify/verify_mux_test.go
@@ -0,0 +1,229 @@
+/*
+Copyright 2019 The Skaffold Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package verify
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"testing"
+
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/debug"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/status"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/sync"
+	"github.com/GoogleContainerTools/skaffold/testutil"
+	testEvent "github.com/GoogleContainerTools/skaffold/testutil/event"
+)
+
+func NewMockVerifier() *MockVerifier { return &MockVerifier{labels: make(map[string]string)} }
+
+type MockVerifier struct {
+	labels          map[string]string
+	deployErr       error
+	dependencies    []string
+	dependenciesErr error
+	cleanupErr      error
+	renderResult    string
+	renderErr       error
+}
+
+func (m *MockVerifier) HasRunnableHooks() bool {
+	return true
+}
+
+func (m *MockVerifier) PreDeployHooks(context.Context, io.Writer) error {
+	return nil
+}
+
+func (m *MockVerifier) PostDeployHooks(context.Context, io.Writer) error {
+	return nil
+}
+
+func (m *MockVerifier) GetAccessor() access.Accessor {
+	return &access.NoopAccessor{}
+}
+
+func (m *MockVerifier) GetDebugger() debug.Debugger {
+	return &debug.NoopDebugger{}
+}
+
+func (m *MockVerifier) GetLogger() log.Logger {
+	return &log.NoopLogger{}
+}
+
+func (m *MockVerifier) GetStatusMonitor() status.Monitor {
+	return &status.NoopMonitor{}
+}
+
+func (m *MockVerifier) GetSyncer() sync.Syncer {
+	return &sync.NoopSyncer{}
+}
+
+func (m *MockVerifier) RegisterLocalImages(_ []graph.Artifact) {}
+
+func (m *MockVerifier) TrackBuildArtifacts(_ []graph.Artifact) {}
+
+func (m *MockVerifier) Dependencies() ([]string, error) {
+	return m.dependencies, m.dependenciesErr
+}
+
+func (m *MockVerifier) Cleanup(context.Context, io.Writer, bool) error {
+	return m.cleanupErr
+}
+
+func (m *MockVerifier) WithLabel(labels map[string]string) *MockVerifier {
+	m.labels = labels
+	return m
+}
+
+func (m *MockVerifier) WithDeployErr(err error) *MockVerifier {
+	m.deployErr = err
+	return m
+}
+
+func (m *MockVerifier) WithDependenciesErr(err error) *MockVerifier {
+	m.dependenciesErr = err
+	return m
+}
+
+func (m *MockVerifier) WithCleanupErr(err error) *MockVerifier {
+	m.cleanupErr = err
+	return m
+}
+
+func (m *MockVerifier) WithRenderErr(err error) *MockVerifier {
+	m.renderErr = err
+	return m
+}
+
+func (m *MockVerifier) Verify(context.Context, io.Writer, []graph.Artifact) error {
+	return m.deployErr
+}
+
+func (m *MockVerifier) Render(_ context.Context, w io.Writer, _ []graph.Artifact, _ bool, _ string) error {
+	w.Write([]byte(m.renderResult))
+	return m.renderErr
+}
+
+func (m *MockVerifier) WithDependencies(dependencies []string) *MockVerifier {
+	m.dependencies = dependencies
+	return m
+}
+
+func (m *MockVerifier) WithRenderResult(renderResult string) *MockVerifier {
+	m.renderResult = renderResult
+	return m
+}
+
+func TestVerifierMux_Verify(t *testing.T) {
+	tests := []struct {
+		name        string
+		namespaces1 []string
+		namespaces2 []string
+		err1        error
+		err2        error
+		expectedNs  []string
+		shouldErr   bool
+	}{
+		{
+			name:      "short-circuits when first call fails",
+			err1:      fmt.Errorf("failed in first"),
+			shouldErr: true,
+		},
+		{
+			name:      "when second call fails",
+			err2:      fmt.Errorf("failed in second"),
+			shouldErr: true,
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			testEvent.InitializeState([]latest.Pipeline{{
+				Deploy: latest.DeployConfig{},
+				Build: latest.BuildConfig{
+					BuildType: latest.BuildType{
+						LocalBuild: &latest.LocalBuild{},
+					},
+				}}})
+
+			deployerMux := NewVerifierMux([]Verifier{
+				NewMockVerifier().WithDeployErr(test.err1),
+				NewMockVerifier().WithDeployErr(test.err2),
+			}, false)
+
+			err := deployerMux.Verify(context.Background(), nil, nil)
+
+			testutil.CheckError(t, test.shouldErr, err)
+		})
+	}
+}
+
+func TestVerifierMux_Dependencies(t *testing.T) {
+	tests := []struct {
+		name         string
+		deps1        []string
+		deps2        []string
+		err1         error
+		err2         error
+		expectedDeps []string
+		shouldErr    bool
+	}{
+		{
+			name:         "disjoint dependencies are combined",
+			deps1:        []string{"graph-a"},
+			deps2:        []string{"graph-b"},
+			expectedDeps: []string{"graph-a", "graph-b"},
+		},
+		{
+			name:         "repeated dependencies are not duplicated",
+			deps1:        []string{"graph-a", "graph-c"},
+			deps2:        []string{"graph-b", "graph-c"},
+			expectedDeps: []string{"graph-a", "graph-b", "graph-c"},
+		},
+		{
+			name:      "when first call fails",
+			deps1:     []string{"graph-a"},
+			err1:      fmt.Errorf("failed in first"),
+			deps2:     []string{"graph-b"},
+			shouldErr: true,
+		},
+		{
+			name:      "when second call fails",
+			deps1:     []string{"graph-a"},
+			deps2:     []string{"graph-b"},
+			err2:      fmt.Errorf("failed in second"),
+			shouldErr: true,
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			deployerMux := NewVerifierMux([]Verifier{
+				NewMockVerifier().WithDependencies(test.deps1).WithDependenciesErr(test.err1),
+				NewMockVerifier().WithDependencies(test.deps2).WithDependenciesErr(test.err2),
+			}, false)
+
+			dependencies, err := deployerMux.Dependencies()
+			testutil.CheckErrorAndDeepEqual(t, test.shouldErr, err, test.expectedDeps, dependencies)
+		})
+	}
+}