Repository: akuity/kargo

Issue:
Documentation Request: Comprehensive List of CRD Annotations
# Proposed Feature

Could you please add comprehensive documentation that:

- Lists all supported annotations for each CRD type
- Explains the purpose and effect of each annotation
- Provides examples of their usage
- Includes this information in the CRD reference documentation

This would greatly improve the discoverability of these features and make it easier for users to fully leverage Kargo's capabilities.

# Motivation

I've noticed that the Kargo documentation lacks a reference for the annotations that can be applied to Kargo CRDs. For example, I was not aware that the color annotation existed until I discovered this example:

https://github.com/akuity/kargo-simple/blob/main/kargo/stages.yaml#L6-L7

I couldn't find it documented in the official documentation. When searching for "annotation" or "annotations" in the documentation search bar, there are no results that provide a clear list of all supported annotations and their effects.

When I checked the CRD reference for Stages I found that it doesn't include a section on annotations:
https://doc.crds.dev/github.com/akuity/kargo/kargo.akuity.io/Stage/v1alpha1@v1.3.0

Hints from issue comments:
@krancour: Thanks @wzhramc. Yes. These should be documented somewhere.

fwiw, other than `kargo.akuity.io/color` you're not missing out on much. I believe that's the only annotation that isn't merely an implementation detail. i.e. All the other annotations are things that API endpoints set/modify on a resource as a signal to its controller to take some action like abort, refresh, etc.@fykaa: Just to confirm before I proceed with the docs -- from what I understand, `kargo.akuity.io/color` is currently the only annotation intended to be set by users, and the others like abort, refresh, reverify, etc. are internal signals set by the UI/CLI/API and don’t need to be included in user-facing CRD docs. Is that right?

Also, do you think it would make sense to document these internal annotations (like the ones listed in [annotations.go](https://github.com/akuity/kargo/blob/main/api/v1alpha1/annotations.go)) somewhere in the repo itself -- maybe as dev-facing docs or a new page in the user-guide? Right now they’re kind of scattered and not obvious unless you go digging in the source.

Just want to make sure I’m aligned on what’s useful to document and what’s intentionally left internal.

cc: @krancour @hiddeco: (Most of) the other annotations are still worth documenting because they allow you to control Kargo's behavior through `kubectl`.

Solution patch:
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 4559c508..d9b58f5b 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -17,7 +17,7 @@ jobs:
   test-unit:
     runs-on: ubuntu-latest
     container:
-      image: golang:1.24.2-bookworm
+      image: golang:1.24.3-bookworm
     steps:
     # Install Git from "trixie" repository to get a more recent version than
     # the one available in "stable". This can be removed once the version in
@@ -45,7 +45,7 @@ jobs:
           mv $tmp_file $report
         done
     - name: Upload coverage reports
-      uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2
+      uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
       with:
         token: ${{ secrets.CODECOV_TOKEN }}
   
@@ -80,7 +80,7 @@ jobs:
       checks: write # Used to create checks (linting comments) on PRs
     runs-on: ubuntu-latest
     container:
-      image: golang:1.24.2-bookworm
+      image: golang:1.24.3-bookworm
     steps:
     - name: Checkout code
       uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -105,7 +105,7 @@ jobs:
   lint-charts:
     runs-on: ubuntu-latest
     container:
-      image: golang:1.24.2-bookworm
+      image: golang:1.24.3-bookworm
     steps:
     - name: Checkout code
       uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -129,7 +129,7 @@ jobs:
       checks: write # Used to create checks (linting comments) on PRs
     runs-on: ubuntu-latest
     container:
-      image: golang:1.24.2-bookworm
+      image: golang:1.24.3-bookworm
     steps:
     - name: Checkout code
       uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -152,7 +152,7 @@ jobs:
   check-codegen:
     runs-on: ubuntu-latest
     container:
-      image: golang:1.24.2-bookworm
+      image: golang:1.24.3-bookworm
     steps:
     - name: Checkout code
       uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -228,7 +228,7 @@ jobs:
     needs: [test-unit, lint-go, lint-charts, lint-proto, lint-and-typecheck-ui, check-codegen]
     runs-on: ubuntu-latest
     container:
-      image: golang:1.24.2-bookworm
+      image: golang:1.24.3-bookworm
     steps:
     - name: Checkout code
       uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 03a6caa4..bfb93b50 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -36,7 +36,7 @@ jobs:
         echo "Repository is set to: $REPO"
         echo "repo=$REPO" >> $GITHUB_OUTPUT
     - name: Setup Go
-      uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0
+      uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
         go-version: '1.23.0'
     - name: Set version for unstable builds
@@ -177,7 +177,7 @@ jobs:
     if: github.event_name == 'release'
     runs-on: ubuntu-latest
     container:
-      image: golang:1.24.2-bookworm
+      image: golang:1.24.3-bookworm
     strategy:
       matrix:
         os: [linux, darwin, windows]
@@ -245,7 +245,7 @@ jobs:
     if: github.event_name != 'release'
     runs-on: ubuntu-latest
     container:
-      image: golang:1.24.2-bookworm
+      image: golang:1.24.3-bookworm
     strategy:
       matrix:
         os: [linux, darwin, windows]
diff --git a/Dockerfile b/Dockerfile
index 928dc3d3..0be7947c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -20,7 +20,7 @@ RUN NODE_ENV='production' VERSION=${VERSION} pnpm run build
 ####################################################################################################
 # back-end-builder
 ####################################################################################################
-FROM --platform=$BUILDPLATFORM golang:1.24.2-bookworm AS back-end-builder
+FROM --platform=$BUILDPLATFORM golang:1.24.3-bookworm AS back-end-builder
 
 ARG TARGETOS
 ARG TARGETARCH
diff --git a/Dockerfile.dev b/Dockerfile.dev
index 0a889e58..47326094 100644
--- a/Dockerfile.dev
+++ b/Dockerfile.dev
@@ -1,4 +1,4 @@
-FROM golang:1.24.2-bookworm
+FROM golang:1.24.3-bookworm
 
 ARG TARGETARCH
 
diff --git a/api/go.mod b/api/go.mod
index 1fdcca23..616d229c 100644
--- a/api/go.mod
+++ b/api/go.mod
@@ -7,10 +7,10 @@ require (
 	github.com/gogo/protobuf v1.3.2
 	github.com/stretchr/testify v1.10.0
 	google.golang.org/protobuf v1.36.6
-	k8s.io/api v0.32.3
-	k8s.io/apiextensions-apiserver v0.32.3
-	k8s.io/apimachinery v0.32.3
-	k8s.io/utils v0.0.0-20241210054802-24370beab758
+	k8s.io/api v0.33.0
+	k8s.io/apiextensions-apiserver v0.33.0
+	k8s.io/apimachinery v0.33.0
+	k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979
 	sigs.k8s.io/yaml v1.4.0
 )
 
@@ -18,8 +18,6 @@ require (
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/fxamacker/cbor/v2 v2.7.0 // indirect
 	github.com/go-logr/logr v1.4.2 // indirect
-	github.com/google/go-cmp v0.7.0 // indirect
-	github.com/google/gofuzz v1.2.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/kr/text v0.2.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
@@ -34,5 +32,6 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	k8s.io/klog/v2 v2.130.1 // indirect
 	sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
+	sigs.k8s.io/randfill v1.0.0 // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
 )
diff --git a/api/go.sum b/api/go.sum
index 6d58718e..79906c86 100644
--- a/api/go.sum
+++ b/api/go.sum
@@ -15,8 +15,6 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
@@ -83,19 +81,22 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls=
-k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k=
-k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY=
-k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss=
-k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U=
-k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/api v0.33.0 h1:yTgZVn1XEe6opVpP1FylmNrIFWuDqe2H0V8CT5gxfIU=
+k8s.io/api v0.33.0/go.mod h1:CTO61ECK/KU7haa3qq8sarQ0biLq2ju405IZAd9zsiM=
+k8s.io/apiextensions-apiserver v0.33.0 h1:d2qpYL7Mngbsc1taA4IjJPRJ9ilnsXIrndH+r9IimOs=
+k8s.io/apiextensions-apiserver v0.33.0/go.mod h1:VeJ8u9dEEN+tbETo+lFkwaaZPg6uFKLGj5vyNEwwSzc=
+k8s.io/apimachinery v0.33.0 h1:1a6kHrJxb2hs4t8EE5wuR/WxKDwGN1FKH3JvDtA0CIQ=
+k8s.io/apimachinery v0.33.0/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
-k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979 h1:jgJW5IePPXLGB8e/1wvd0Ich9QE97RvvF3a8J3fP/Lg=
+k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
 sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
-sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk=
-sigs.k8s.io/structured-merge-diff/v4 v4.5.0/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
+sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
+sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
+sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
+sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
+sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
 sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
diff --git a/api/service/v1alpha1/service.pb.go b/api/service/v1alpha1/service.pb.go
index 2f9153d3..760bcf44 100644
--- a/api/service/v1alpha1/service.pb.go
+++ b/api/service/v1alpha1/service.pb.go
@@ -2817,6 +2817,227 @@ func (*DeleteProjectResponse) Descriptor() ([]byte, []int) {
 	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{49}
 }
 
+type DeleteProjectConfigRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *DeleteProjectConfigRequest) Reset() {
+	*x = DeleteProjectConfigRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[50]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteProjectConfigRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteProjectConfigRequest) ProtoMessage() {}
+
+func (x *DeleteProjectConfigRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[50]
+	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 DeleteProjectConfigRequest.ProtoReflect.Descriptor instead.
+func (*DeleteProjectConfigRequest) Descriptor() ([]byte, []int) {
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{50}
+}
+
+func (x *DeleteProjectConfigRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type DeleteProjectConfigResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteProjectConfigResponse) Reset() {
+	*x = DeleteProjectConfigResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[51]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteProjectConfigResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteProjectConfigResponse) ProtoMessage() {}
+
+func (x *DeleteProjectConfigResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[51]
+	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 DeleteProjectConfigResponse.ProtoReflect.Descriptor instead.
+func (*DeleteProjectConfigResponse) Descriptor() ([]byte, []int) {
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{51}
+}
+
+type GetProjectConfigRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name   string    `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Format RawFormat `protobuf:"varint,2,opt,name=format,proto3,enum=akuity.io.kargo.service.v1alpha1.RawFormat" json:"format,omitempty"`
+}
+
+func (x *GetProjectConfigRequest) Reset() {
+	*x = GetProjectConfigRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[52]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetProjectConfigRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetProjectConfigRequest) ProtoMessage() {}
+
+func (x *GetProjectConfigRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[52]
+	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 GetProjectConfigRequest.ProtoReflect.Descriptor instead.
+func (*GetProjectConfigRequest) Descriptor() ([]byte, []int) {
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{52}
+}
+
+func (x *GetProjectConfigRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *GetProjectConfigRequest) GetFormat() RawFormat {
+	if x != nil {
+		return x.Format
+	}
+	return RawFormat_RAW_FORMAT_UNSPECIFIED
+}
+
+type GetProjectConfigResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to Result:
+	//
+	//	*GetProjectConfigResponse_ProjectConfig
+	//	*GetProjectConfigResponse_Raw
+	Result isGetProjectConfigResponse_Result `protobuf_oneof:"result"`
+}
+
+func (x *GetProjectConfigResponse) Reset() {
+	*x = GetProjectConfigResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[53]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetProjectConfigResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetProjectConfigResponse) ProtoMessage() {}
+
+func (x *GetProjectConfigResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[53]
+	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 GetProjectConfigResponse.ProtoReflect.Descriptor instead.
+func (*GetProjectConfigResponse) Descriptor() ([]byte, []int) {
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{53}
+}
+
+func (m *GetProjectConfigResponse) GetResult() isGetProjectConfigResponse_Result {
+	if m != nil {
+		return m.Result
+	}
+	return nil
+}
+
+func (x *GetProjectConfigResponse) GetProjectConfig() *v1alpha1.ProjectConfig {
+	if x, ok := x.GetResult().(*GetProjectConfigResponse_ProjectConfig); ok {
+		return x.ProjectConfig
+	}
+	return nil
+}
+
+func (x *GetProjectConfigResponse) GetRaw() []byte {
+	if x, ok := x.GetResult().(*GetProjectConfigResponse_Raw); ok {
+		return x.Raw
+	}
+	return nil
+}
+
+type isGetProjectConfigResponse_Result interface {
+	isGetProjectConfigResponse_Result()
+}
+
+type GetProjectConfigResponse_ProjectConfig struct {
+	ProjectConfig *v1alpha1.ProjectConfig `protobuf:"bytes,1,opt,name=project_config,json=projectConfig,proto3,oneof"`
+}
+
+type GetProjectConfigResponse_Raw struct {
+	Raw []byte `protobuf:"bytes,2,opt,name=raw,proto3,oneof"`
+}
+
+func (*GetProjectConfigResponse_ProjectConfig) isGetProjectConfigResponse_Result() {}
+
+func (*GetProjectConfigResponse_Raw) isGetProjectConfigResponse_Result() {}
+
 type GetProjectRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2829,7 +3050,7 @@ type GetProjectRequest struct {
 func (x *GetProjectRequest) Reset() {
 	*x = GetProjectRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[50]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[54]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2842,7 +3063,7 @@ func (x *GetProjectRequest) String() string {
 func (*GetProjectRequest) ProtoMessage() {}
 
 func (x *GetProjectRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[50]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[54]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2855,7 +3076,7 @@ func (x *GetProjectRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetProjectRequest.ProtoReflect.Descriptor instead.
 func (*GetProjectRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{50}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{54}
 }
 
 func (x *GetProjectRequest) GetName() string {
@@ -2887,7 +3108,7 @@ type GetProjectResponse struct {
 func (x *GetProjectResponse) Reset() {
 	*x = GetProjectResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[51]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[55]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2900,7 +3121,7 @@ func (x *GetProjectResponse) String() string {
 func (*GetProjectResponse) ProtoMessage() {}
 
 func (x *GetProjectResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[51]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[55]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2913,7 +3134,7 @@ func (x *GetProjectResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetProjectResponse.ProtoReflect.Descriptor instead.
 func (*GetProjectResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{51}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{55}
 }
 
 func (m *GetProjectResponse) GetResult() isGetProjectResponse_Result {
@@ -2966,7 +3187,7 @@ type ListProjectsRequest struct {
 func (x *ListProjectsRequest) Reset() {
 	*x = ListProjectsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[52]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[56]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2979,7 +3200,7 @@ func (x *ListProjectsRequest) String() string {
 func (*ListProjectsRequest) ProtoMessage() {}
 
 func (x *ListProjectsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[52]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[56]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2992,7 +3213,7 @@ func (x *ListProjectsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListProjectsRequest.ProtoReflect.Descriptor instead.
 func (*ListProjectsRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{52}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{56}
 }
 
 func (x *ListProjectsRequest) GetPageSize() int32 {
@@ -3028,7 +3249,7 @@ type ListProjectsResponse struct {
 func (x *ListProjectsResponse) Reset() {
 	*x = ListProjectsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[53]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[57]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3041,7 +3262,7 @@ func (x *ListProjectsResponse) String() string {
 func (*ListProjectsResponse) ProtoMessage() {}
 
 func (x *ListProjectsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[53]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[57]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3054,7 +3275,7 @@ func (x *ListProjectsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListProjectsResponse.ProtoReflect.Descriptor instead.
 func (*ListProjectsResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{53}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{57}
 }
 
 func (x *ListProjectsResponse) GetProjects() []*v1alpha1.Project {
@@ -3085,7 +3306,7 @@ type ApproveFreightRequest struct {
 func (x *ApproveFreightRequest) Reset() {
 	*x = ApproveFreightRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[54]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[58]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3098,7 +3319,7 @@ func (x *ApproveFreightRequest) String() string {
 func (*ApproveFreightRequest) ProtoMessage() {}
 
 func (x *ApproveFreightRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[54]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[58]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3111,7 +3332,7 @@ func (x *ApproveFreightRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ApproveFreightRequest.ProtoReflect.Descriptor instead.
 func (*ApproveFreightRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{54}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{58}
 }
 
 func (x *ApproveFreightRequest) GetProject() string {
@@ -3151,7 +3372,7 @@ type ApproveFreightResponse struct {
 func (x *ApproveFreightResponse) Reset() {
 	*x = ApproveFreightResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[55]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[59]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3164,7 +3385,7 @@ func (x *ApproveFreightResponse) String() string {
 func (*ApproveFreightResponse) ProtoMessage() {}
 
 func (x *ApproveFreightResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[55]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[59]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3177,7 +3398,7 @@ func (x *ApproveFreightResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ApproveFreightResponse.ProtoReflect.Descriptor instead.
 func (*ApproveFreightResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{55}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{59}
 }
 
 type DeleteFreightRequest struct {
@@ -3193,7 +3414,7 @@ type DeleteFreightRequest struct {
 func (x *DeleteFreightRequest) Reset() {
 	*x = DeleteFreightRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[56]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[60]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3206,7 +3427,7 @@ func (x *DeleteFreightRequest) String() string {
 func (*DeleteFreightRequest) ProtoMessage() {}
 
 func (x *DeleteFreightRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[56]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[60]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3219,7 +3440,7 @@ func (x *DeleteFreightRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteFreightRequest.ProtoReflect.Descriptor instead.
 func (*DeleteFreightRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{56}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{60}
 }
 
 func (x *DeleteFreightRequest) GetProject() string {
@@ -3252,7 +3473,7 @@ type DeleteFreightResponse struct {
 func (x *DeleteFreightResponse) Reset() {
 	*x = DeleteFreightResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[57]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[61]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3265,7 +3486,7 @@ func (x *DeleteFreightResponse) String() string {
 func (*DeleteFreightResponse) ProtoMessage() {}
 
 func (x *DeleteFreightResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[57]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[61]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3278,7 +3499,7 @@ func (x *DeleteFreightResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteFreightResponse.ProtoReflect.Descriptor instead.
 func (*DeleteFreightResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{57}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{61}
 }
 
 type GetFreightRequest struct {
@@ -3295,7 +3516,7 @@ type GetFreightRequest struct {
 func (x *GetFreightRequest) Reset() {
 	*x = GetFreightRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[58]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[62]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3308,7 +3529,7 @@ func (x *GetFreightRequest) String() string {
 func (*GetFreightRequest) ProtoMessage() {}
 
 func (x *GetFreightRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[58]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[62]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3321,7 +3542,7 @@ func (x *GetFreightRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetFreightRequest.ProtoReflect.Descriptor instead.
 func (*GetFreightRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{58}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{62}
 }
 
 func (x *GetFreightRequest) GetProject() string {
@@ -3367,7 +3588,7 @@ type GetFreightResponse struct {
 func (x *GetFreightResponse) Reset() {
 	*x = GetFreightResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[59]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[63]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3380,7 +3601,7 @@ func (x *GetFreightResponse) String() string {
 func (*GetFreightResponse) ProtoMessage() {}
 
 func (x *GetFreightResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[59]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[63]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3393,7 +3614,7 @@ func (x *GetFreightResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetFreightResponse.ProtoReflect.Descriptor instead.
 func (*GetFreightResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{59}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{63}
 }
 
 func (m *GetFreightResponse) GetResult() isGetFreightResponse_Result {
@@ -3447,7 +3668,7 @@ type PromoteToStageRequest struct {
 func (x *PromoteToStageRequest) Reset() {
 	*x = PromoteToStageRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[60]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[64]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3460,7 +3681,7 @@ func (x *PromoteToStageRequest) String() string {
 func (*PromoteToStageRequest) ProtoMessage() {}
 
 func (x *PromoteToStageRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[60]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[64]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3473,7 +3694,7 @@ func (x *PromoteToStageRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PromoteToStageRequest.ProtoReflect.Descriptor instead.
 func (*PromoteToStageRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{60}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{64}
 }
 
 func (x *PromoteToStageRequest) GetProject() string {
@@ -3515,7 +3736,7 @@ type PromoteToStageResponse struct {
 func (x *PromoteToStageResponse) Reset() {
 	*x = PromoteToStageResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[61]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[65]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3528,7 +3749,7 @@ func (x *PromoteToStageResponse) String() string {
 func (*PromoteToStageResponse) ProtoMessage() {}
 
 func (x *PromoteToStageResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[61]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[65]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3541,7 +3762,7 @@ func (x *PromoteToStageResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PromoteToStageResponse.ProtoReflect.Descriptor instead.
 func (*PromoteToStageResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{61}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{65}
 }
 
 func (x *PromoteToStageResponse) GetPromotion() *v1alpha1.Promotion {
@@ -3565,7 +3786,7 @@ type PromoteDownstreamRequest struct {
 func (x *PromoteDownstreamRequest) Reset() {
 	*x = PromoteDownstreamRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[62]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[66]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3578,7 +3799,7 @@ func (x *PromoteDownstreamRequest) String() string {
 func (*PromoteDownstreamRequest) ProtoMessage() {}
 
 func (x *PromoteDownstreamRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[62]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[66]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3591,7 +3812,7 @@ func (x *PromoteDownstreamRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PromoteDownstreamRequest.ProtoReflect.Descriptor instead.
 func (*PromoteDownstreamRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{62}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{66}
 }
 
 func (x *PromoteDownstreamRequest) GetProject() string {
@@ -3633,7 +3854,7 @@ type PromoteDownstreamResponse struct {
 func (x *PromoteDownstreamResponse) Reset() {
 	*x = PromoteDownstreamResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[63]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[67]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3646,7 +3867,7 @@ func (x *PromoteDownstreamResponse) String() string {
 func (*PromoteDownstreamResponse) ProtoMessage() {}
 
 func (x *PromoteDownstreamResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[63]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[67]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3659,7 +3880,7 @@ func (x *PromoteDownstreamResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PromoteDownstreamResponse.ProtoReflect.Descriptor instead.
 func (*PromoteDownstreamResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{63}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{67}
 }
 
 func (x *PromoteDownstreamResponse) GetPromotions() []*v1alpha1.Promotion {
@@ -3686,7 +3907,7 @@ type QueryFreightRequest struct {
 func (x *QueryFreightRequest) Reset() {
 	*x = QueryFreightRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[64]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[68]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3699,7 +3920,7 @@ func (x *QueryFreightRequest) String() string {
 func (*QueryFreightRequest) ProtoMessage() {}
 
 func (x *QueryFreightRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[64]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[68]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3712,7 +3933,7 @@ func (x *QueryFreightRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueryFreightRequest.ProtoReflect.Descriptor instead.
 func (*QueryFreightRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{64}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{68}
 }
 
 func (x *QueryFreightRequest) GetProject() string {
@@ -3775,7 +3996,7 @@ type QueryFreightResponse struct {
 func (x *QueryFreightResponse) Reset() {
 	*x = QueryFreightResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[65]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[69]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3788,7 +4009,7 @@ func (x *QueryFreightResponse) String() string {
 func (*QueryFreightResponse) ProtoMessage() {}
 
 func (x *QueryFreightResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[65]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[69]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3801,7 +4022,7 @@ func (x *QueryFreightResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueryFreightResponse.ProtoReflect.Descriptor instead.
 func (*QueryFreightResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{65}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{69}
 }
 
 func (x *QueryFreightResponse) GetGroups() map[string]*FreightList {
@@ -3822,7 +4043,7 @@ type FreightList struct {
 func (x *FreightList) Reset() {
 	*x = FreightList{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[66]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[70]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3835,7 +4056,7 @@ func (x *FreightList) String() string {
 func (*FreightList) ProtoMessage() {}
 
 func (x *FreightList) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[66]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[70]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3848,7 +4069,7 @@ func (x *FreightList) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FreightList.ProtoReflect.Descriptor instead.
 func (*FreightList) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{66}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{70}
 }
 
 func (x *FreightList) GetFreight() []*v1alpha1.Freight {
@@ -3872,7 +4093,7 @@ type UpdateFreightAliasRequest struct {
 func (x *UpdateFreightAliasRequest) Reset() {
 	*x = UpdateFreightAliasRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[67]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[71]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3885,7 +4106,7 @@ func (x *UpdateFreightAliasRequest) String() string {
 func (*UpdateFreightAliasRequest) ProtoMessage() {}
 
 func (x *UpdateFreightAliasRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[67]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[71]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3898,7 +4119,7 @@ func (x *UpdateFreightAliasRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateFreightAliasRequest.ProtoReflect.Descriptor instead.
 func (*UpdateFreightAliasRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{67}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{71}
 }
 
 func (x *UpdateFreightAliasRequest) GetProject() string {
@@ -3938,7 +4159,7 @@ type UpdateFreightAliasResponse struct {
 func (x *UpdateFreightAliasResponse) Reset() {
 	*x = UpdateFreightAliasResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[68]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[72]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3951,7 +4172,7 @@ func (x *UpdateFreightAliasResponse) String() string {
 func (*UpdateFreightAliasResponse) ProtoMessage() {}
 
 func (x *UpdateFreightAliasResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[68]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[72]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3964,7 +4185,7 @@ func (x *UpdateFreightAliasResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateFreightAliasResponse.ProtoReflect.Descriptor instead.
 func (*UpdateFreightAliasResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{68}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{72}
 }
 
 type ReverifyRequest struct {
@@ -3979,7 +4200,7 @@ type ReverifyRequest struct {
 func (x *ReverifyRequest) Reset() {
 	*x = ReverifyRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[69]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[73]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3992,7 +4213,7 @@ func (x *ReverifyRequest) String() string {
 func (*ReverifyRequest) ProtoMessage() {}
 
 func (x *ReverifyRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[69]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[73]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4005,7 +4226,7 @@ func (x *ReverifyRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ReverifyRequest.ProtoReflect.Descriptor instead.
 func (*ReverifyRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{69}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{73}
 }
 
 func (x *ReverifyRequest) GetProject() string {
@@ -4031,7 +4252,7 @@ type ReverifyResponse struct {
 func (x *ReverifyResponse) Reset() {
 	*x = ReverifyResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[70]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[74]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4044,7 +4265,7 @@ func (x *ReverifyResponse) String() string {
 func (*ReverifyResponse) ProtoMessage() {}
 
 func (x *ReverifyResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[70]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[74]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4057,7 +4278,7 @@ func (x *ReverifyResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ReverifyResponse.ProtoReflect.Descriptor instead.
 func (*ReverifyResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{70}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{74}
 }
 
 type AbortVerificationRequest struct {
@@ -4072,7 +4293,7 @@ type AbortVerificationRequest struct {
 func (x *AbortVerificationRequest) Reset() {
 	*x = AbortVerificationRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[71]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[75]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4085,7 +4306,7 @@ func (x *AbortVerificationRequest) String() string {
 func (*AbortVerificationRequest) ProtoMessage() {}
 
 func (x *AbortVerificationRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[71]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[75]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4098,7 +4319,7 @@ func (x *AbortVerificationRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AbortVerificationRequest.ProtoReflect.Descriptor instead.
 func (*AbortVerificationRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{71}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{75}
 }
 
 func (x *AbortVerificationRequest) GetProject() string {
@@ -4124,7 +4345,7 @@ type AbortVerificationResponse struct {
 func (x *AbortVerificationResponse) Reset() {
 	*x = AbortVerificationResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[72]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[76]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4137,7 +4358,7 @@ func (x *AbortVerificationResponse) String() string {
 func (*AbortVerificationResponse) ProtoMessage() {}
 
 func (x *AbortVerificationResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[72]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[76]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4150,7 +4371,7 @@ func (x *AbortVerificationResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AbortVerificationResponse.ProtoReflect.Descriptor instead.
 func (*AbortVerificationResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{72}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{76}
 }
 
 type ListWarehousesRequest struct {
@@ -4164,7 +4385,7 @@ type ListWarehousesRequest struct {
 func (x *ListWarehousesRequest) Reset() {
 	*x = ListWarehousesRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[73]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[77]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4177,7 +4398,7 @@ func (x *ListWarehousesRequest) String() string {
 func (*ListWarehousesRequest) ProtoMessage() {}
 
 func (x *ListWarehousesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[73]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[77]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4190,7 +4411,7 @@ func (x *ListWarehousesRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListWarehousesRequest.ProtoReflect.Descriptor instead.
 func (*ListWarehousesRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{73}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{77}
 }
 
 func (x *ListWarehousesRequest) GetProject() string {
@@ -4211,7 +4432,7 @@ type ListWarehousesResponse struct {
 func (x *ListWarehousesResponse) Reset() {
 	*x = ListWarehousesResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[74]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[78]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4224,7 +4445,7 @@ func (x *ListWarehousesResponse) String() string {
 func (*ListWarehousesResponse) ProtoMessage() {}
 
 func (x *ListWarehousesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[74]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[78]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4237,7 +4458,7 @@ func (x *ListWarehousesResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListWarehousesResponse.ProtoReflect.Descriptor instead.
 func (*ListWarehousesResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{74}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{78}
 }
 
 func (x *ListWarehousesResponse) GetWarehouses() []*v1alpha1.Warehouse {
@@ -4260,7 +4481,7 @@ type GetWarehouseRequest struct {
 func (x *GetWarehouseRequest) Reset() {
 	*x = GetWarehouseRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[75]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[79]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4273,7 +4494,7 @@ func (x *GetWarehouseRequest) String() string {
 func (*GetWarehouseRequest) ProtoMessage() {}
 
 func (x *GetWarehouseRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[75]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[79]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4286,7 +4507,7 @@ func (x *GetWarehouseRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetWarehouseRequest.ProtoReflect.Descriptor instead.
 func (*GetWarehouseRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{75}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{79}
 }
 
 func (x *GetWarehouseRequest) GetProject() string {
@@ -4325,7 +4546,7 @@ type GetWarehouseResponse struct {
 func (x *GetWarehouseResponse) Reset() {
 	*x = GetWarehouseResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[76]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[80]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4338,7 +4559,7 @@ func (x *GetWarehouseResponse) String() string {
 func (*GetWarehouseResponse) ProtoMessage() {}
 
 func (x *GetWarehouseResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[76]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[80]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4351,7 +4572,7 @@ func (x *GetWarehouseResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetWarehouseResponse.ProtoReflect.Descriptor instead.
 func (*GetWarehouseResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{76}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{80}
 }
 
 func (m *GetWarehouseResponse) GetResult() isGetWarehouseResponse_Result {
@@ -4403,7 +4624,7 @@ type WatchWarehousesRequest struct {
 func (x *WatchWarehousesRequest) Reset() {
 	*x = WatchWarehousesRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[77]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[81]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4416,7 +4637,7 @@ func (x *WatchWarehousesRequest) String() string {
 func (*WatchWarehousesRequest) ProtoMessage() {}
 
 func (x *WatchWarehousesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[77]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[81]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4429,7 +4650,7 @@ func (x *WatchWarehousesRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use WatchWarehousesRequest.ProtoReflect.Descriptor instead.
 func (*WatchWarehousesRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{77}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{81}
 }
 
 func (x *WatchWarehousesRequest) GetProject() string {
@@ -4458,7 +4679,7 @@ type WatchWarehousesResponse struct {
 func (x *WatchWarehousesResponse) Reset() {
 	*x = WatchWarehousesResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[78]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[82]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4471,7 +4692,7 @@ func (x *WatchWarehousesResponse) String() string {
 func (*WatchWarehousesResponse) ProtoMessage() {}
 
 func (x *WatchWarehousesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[78]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[82]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4484,7 +4705,7 @@ func (x *WatchWarehousesResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use WatchWarehousesResponse.ProtoReflect.Descriptor instead.
 func (*WatchWarehousesResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{78}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{82}
 }
 
 func (x *WatchWarehousesResponse) GetWarehouse() *v1alpha1.Warehouse {
@@ -4513,7 +4734,7 @@ type DeleteWarehouseRequest struct {
 func (x *DeleteWarehouseRequest) Reset() {
 	*x = DeleteWarehouseRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[79]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[83]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4526,7 +4747,7 @@ func (x *DeleteWarehouseRequest) String() string {
 func (*DeleteWarehouseRequest) ProtoMessage() {}
 
 func (x *DeleteWarehouseRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[79]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[83]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4539,7 +4760,7 @@ func (x *DeleteWarehouseRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteWarehouseRequest.ProtoReflect.Descriptor instead.
 func (*DeleteWarehouseRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{79}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{83}
 }
 
 func (x *DeleteWarehouseRequest) GetProject() string {
@@ -4565,7 +4786,7 @@ type DeleteWarehouseResponse struct {
 func (x *DeleteWarehouseResponse) Reset() {
 	*x = DeleteWarehouseResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[80]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[84]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4578,7 +4799,7 @@ func (x *DeleteWarehouseResponse) String() string {
 func (*DeleteWarehouseResponse) ProtoMessage() {}
 
 func (x *DeleteWarehouseResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[80]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[84]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4591,7 +4812,7 @@ func (x *DeleteWarehouseResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteWarehouseResponse.ProtoReflect.Descriptor instead.
 func (*DeleteWarehouseResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{80}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{84}
 }
 
 type RefreshWarehouseRequest struct {
@@ -4606,7 +4827,7 @@ type RefreshWarehouseRequest struct {
 func (x *RefreshWarehouseRequest) Reset() {
 	*x = RefreshWarehouseRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[81]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[85]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4619,7 +4840,7 @@ func (x *RefreshWarehouseRequest) String() string {
 func (*RefreshWarehouseRequest) ProtoMessage() {}
 
 func (x *RefreshWarehouseRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[81]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[85]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4632,7 +4853,7 @@ func (x *RefreshWarehouseRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RefreshWarehouseRequest.ProtoReflect.Descriptor instead.
 func (*RefreshWarehouseRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{81}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{85}
 }
 
 func (x *RefreshWarehouseRequest) GetProject() string {
@@ -4660,7 +4881,7 @@ type RefreshWarehouseResponse struct {
 func (x *RefreshWarehouseResponse) Reset() {
 	*x = RefreshWarehouseResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[82]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[86]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4673,7 +4894,7 @@ func (x *RefreshWarehouseResponse) String() string {
 func (*RefreshWarehouseResponse) ProtoMessage() {}
 
 func (x *RefreshWarehouseResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[82]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[86]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4686,7 +4907,7 @@ func (x *RefreshWarehouseResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RefreshWarehouseResponse.ProtoReflect.Descriptor instead.
 func (*RefreshWarehouseResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{82}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{86}
 }
 
 func (x *RefreshWarehouseResponse) GetWarehouse() *v1alpha1.Warehouse {
@@ -4707,7 +4928,7 @@ type ListProjectSecretsRequest struct {
 func (x *ListProjectSecretsRequest) Reset() {
 	*x = ListProjectSecretsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[83]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[87]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4720,7 +4941,7 @@ func (x *ListProjectSecretsRequest) String() string {
 func (*ListProjectSecretsRequest) ProtoMessage() {}
 
 func (x *ListProjectSecretsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[83]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[87]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4733,7 +4954,7 @@ func (x *ListProjectSecretsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListProjectSecretsRequest.ProtoReflect.Descriptor instead.
 func (*ListProjectSecretsRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{83}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{87}
 }
 
 func (x *ListProjectSecretsRequest) GetProject() string {
@@ -4754,7 +4975,7 @@ type ListProjectSecretsResponse struct {
 func (x *ListProjectSecretsResponse) Reset() {
 	*x = ListProjectSecretsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[84]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[88]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4767,7 +4988,7 @@ func (x *ListProjectSecretsResponse) String() string {
 func (*ListProjectSecretsResponse) ProtoMessage() {}
 
 func (x *ListProjectSecretsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[84]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[88]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4780,7 +5001,7 @@ func (x *ListProjectSecretsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListProjectSecretsResponse.ProtoReflect.Descriptor instead.
 func (*ListProjectSecretsResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{84}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{88}
 }
 
 func (x *ListProjectSecretsResponse) GetSecrets() []*v1.Secret {
@@ -4804,7 +5025,7 @@ type CreateProjectSecretRequest struct {
 func (x *CreateProjectSecretRequest) Reset() {
 	*x = CreateProjectSecretRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[85]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[89]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4817,7 +5038,7 @@ func (x *CreateProjectSecretRequest) String() string {
 func (*CreateProjectSecretRequest) ProtoMessage() {}
 
 func (x *CreateProjectSecretRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[85]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[89]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4830,7 +5051,7 @@ func (x *CreateProjectSecretRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateProjectSecretRequest.ProtoReflect.Descriptor instead.
 func (*CreateProjectSecretRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{85}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{89}
 }
 
 func (x *CreateProjectSecretRequest) GetProject() string {
@@ -4872,7 +5093,7 @@ type CreateProjectSecretResponse struct {
 func (x *CreateProjectSecretResponse) Reset() {
 	*x = CreateProjectSecretResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[86]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[90]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4885,7 +5106,7 @@ func (x *CreateProjectSecretResponse) String() string {
 func (*CreateProjectSecretResponse) ProtoMessage() {}
 
 func (x *CreateProjectSecretResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[86]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[90]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4898,7 +5119,7 @@ func (x *CreateProjectSecretResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateProjectSecretResponse.ProtoReflect.Descriptor instead.
 func (*CreateProjectSecretResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{86}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{90}
 }
 
 func (x *CreateProjectSecretResponse) GetSecret() *v1.Secret {
@@ -4922,7 +5143,7 @@ type UpdateProjectSecretRequest struct {
 func (x *UpdateProjectSecretRequest) Reset() {
 	*x = UpdateProjectSecretRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[87]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[91]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -4935,7 +5156,7 @@ func (x *UpdateProjectSecretRequest) String() string {
 func (*UpdateProjectSecretRequest) ProtoMessage() {}
 
 func (x *UpdateProjectSecretRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[87]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[91]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -4948,7 +5169,7 @@ func (x *UpdateProjectSecretRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateProjectSecretRequest.ProtoReflect.Descriptor instead.
 func (*UpdateProjectSecretRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{87}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{91}
 }
 
 func (x *UpdateProjectSecretRequest) GetProject() string {
@@ -4990,7 +5211,7 @@ type UpdateProjectSecretResponse struct {
 func (x *UpdateProjectSecretResponse) Reset() {
 	*x = UpdateProjectSecretResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[88]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[92]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5003,7 +5224,7 @@ func (x *UpdateProjectSecretResponse) String() string {
 func (*UpdateProjectSecretResponse) ProtoMessage() {}
 
 func (x *UpdateProjectSecretResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[88]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[92]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5016,7 +5237,7 @@ func (x *UpdateProjectSecretResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateProjectSecretResponse.ProtoReflect.Descriptor instead.
 func (*UpdateProjectSecretResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{88}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{92}
 }
 
 func (x *UpdateProjectSecretResponse) GetSecret() *v1.Secret {
@@ -5038,7 +5259,7 @@ type DeleteProjectSecretRequest struct {
 func (x *DeleteProjectSecretRequest) Reset() {
 	*x = DeleteProjectSecretRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[89]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[93]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5051,7 +5272,7 @@ func (x *DeleteProjectSecretRequest) String() string {
 func (*DeleteProjectSecretRequest) ProtoMessage() {}
 
 func (x *DeleteProjectSecretRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[89]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[93]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5064,7 +5285,7 @@ func (x *DeleteProjectSecretRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteProjectSecretRequest.ProtoReflect.Descriptor instead.
 func (*DeleteProjectSecretRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{89}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{93}
 }
 
 func (x *DeleteProjectSecretRequest) GetProject() string {
@@ -5090,7 +5311,7 @@ type DeleteProjectSecretResponse struct {
 func (x *DeleteProjectSecretResponse) Reset() {
 	*x = DeleteProjectSecretResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[90]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[94]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5103,7 +5324,7 @@ func (x *DeleteProjectSecretResponse) String() string {
 func (*DeleteProjectSecretResponse) ProtoMessage() {}
 
 func (x *DeleteProjectSecretResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[90]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[94]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5116,7 +5337,7 @@ func (x *DeleteProjectSecretResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteProjectSecretResponse.ProtoReflect.Descriptor instead.
 func (*DeleteProjectSecretResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{90}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{94}
 }
 
 type CreateCredentialsRequest struct {
@@ -5138,7 +5359,7 @@ type CreateCredentialsRequest struct {
 func (x *CreateCredentialsRequest) Reset() {
 	*x = CreateCredentialsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[91]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[95]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5151,7 +5372,7 @@ func (x *CreateCredentialsRequest) String() string {
 func (*CreateCredentialsRequest) ProtoMessage() {}
 
 func (x *CreateCredentialsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[91]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[95]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5164,7 +5385,7 @@ func (x *CreateCredentialsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateCredentialsRequest.ProtoReflect.Descriptor instead.
 func (*CreateCredentialsRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{91}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{95}
 }
 
 func (x *CreateCredentialsRequest) GetProject() string {
@@ -5234,7 +5455,7 @@ type CreateCredentialsResponse struct {
 func (x *CreateCredentialsResponse) Reset() {
 	*x = CreateCredentialsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[92]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[96]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5247,7 +5468,7 @@ func (x *CreateCredentialsResponse) String() string {
 func (*CreateCredentialsResponse) ProtoMessage() {}
 
 func (x *CreateCredentialsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[92]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[96]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5260,7 +5481,7 @@ func (x *CreateCredentialsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateCredentialsResponse.ProtoReflect.Descriptor instead.
 func (*CreateCredentialsResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{92}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{96}
 }
 
 func (x *CreateCredentialsResponse) GetCredentials() *v1.Secret {
@@ -5282,7 +5503,7 @@ type DeleteCredentialsRequest struct {
 func (x *DeleteCredentialsRequest) Reset() {
 	*x = DeleteCredentialsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[93]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[97]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5295,7 +5516,7 @@ func (x *DeleteCredentialsRequest) String() string {
 func (*DeleteCredentialsRequest) ProtoMessage() {}
 
 func (x *DeleteCredentialsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[93]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[97]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5308,7 +5529,7 @@ func (x *DeleteCredentialsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteCredentialsRequest.ProtoReflect.Descriptor instead.
 func (*DeleteCredentialsRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{93}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{97}
 }
 
 func (x *DeleteCredentialsRequest) GetProject() string {
@@ -5334,7 +5555,7 @@ type DeleteCredentialsResponse struct {
 func (x *DeleteCredentialsResponse) Reset() {
 	*x = DeleteCredentialsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[94]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[98]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5347,7 +5568,7 @@ func (x *DeleteCredentialsResponse) String() string {
 func (*DeleteCredentialsResponse) ProtoMessage() {}
 
 func (x *DeleteCredentialsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[94]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[98]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5360,7 +5581,7 @@ func (x *DeleteCredentialsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteCredentialsResponse.ProtoReflect.Descriptor instead.
 func (*DeleteCredentialsResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{94}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{98}
 }
 
 type GetCredentialsRequest struct {
@@ -5376,7 +5597,7 @@ type GetCredentialsRequest struct {
 func (x *GetCredentialsRequest) Reset() {
 	*x = GetCredentialsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[95]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[99]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5389,7 +5610,7 @@ func (x *GetCredentialsRequest) String() string {
 func (*GetCredentialsRequest) ProtoMessage() {}
 
 func (x *GetCredentialsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[95]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[99]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5402,7 +5623,7 @@ func (x *GetCredentialsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetCredentialsRequest.ProtoReflect.Descriptor instead.
 func (*GetCredentialsRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{95}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{99}
 }
 
 func (x *GetCredentialsRequest) GetProject() string {
@@ -5441,7 +5662,7 @@ type GetCredentialsResponse struct {
 func (x *GetCredentialsResponse) Reset() {
 	*x = GetCredentialsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[96]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[100]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5454,7 +5675,7 @@ func (x *GetCredentialsResponse) String() string {
 func (*GetCredentialsResponse) ProtoMessage() {}
 
 func (x *GetCredentialsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[96]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[100]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5467,7 +5688,7 @@ func (x *GetCredentialsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetCredentialsResponse.ProtoReflect.Descriptor instead.
 func (*GetCredentialsResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{96}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{100}
 }
 
 func (m *GetCredentialsResponse) GetResult() isGetCredentialsResponse_Result {
@@ -5518,7 +5739,7 @@ type ListCredentialsRequest struct {
 func (x *ListCredentialsRequest) Reset() {
 	*x = ListCredentialsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[97]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[101]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5531,7 +5752,7 @@ func (x *ListCredentialsRequest) String() string {
 func (*ListCredentialsRequest) ProtoMessage() {}
 
 func (x *ListCredentialsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[97]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[101]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5544,7 +5765,7 @@ func (x *ListCredentialsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListCredentialsRequest.ProtoReflect.Descriptor instead.
 func (*ListCredentialsRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{97}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{101}
 }
 
 func (x *ListCredentialsRequest) GetProject() string {
@@ -5565,7 +5786,7 @@ type ListCredentialsResponse struct {
 func (x *ListCredentialsResponse) Reset() {
 	*x = ListCredentialsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[98]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[102]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5578,7 +5799,7 @@ func (x *ListCredentialsResponse) String() string {
 func (*ListCredentialsResponse) ProtoMessage() {}
 
 func (x *ListCredentialsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[98]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[102]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5591,7 +5812,7 @@ func (x *ListCredentialsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListCredentialsResponse.ProtoReflect.Descriptor instead.
 func (*ListCredentialsResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{98}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{102}
 }
 
 func (x *ListCredentialsResponse) GetCredentials() []*v1.Secret {
@@ -5619,7 +5840,7 @@ type UpdateCredentialsRequest struct {
 func (x *UpdateCredentialsRequest) Reset() {
 	*x = UpdateCredentialsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[99]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[103]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5632,7 +5853,7 @@ func (x *UpdateCredentialsRequest) String() string {
 func (*UpdateCredentialsRequest) ProtoMessage() {}
 
 func (x *UpdateCredentialsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[99]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[103]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5645,7 +5866,7 @@ func (x *UpdateCredentialsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateCredentialsRequest.ProtoReflect.Descriptor instead.
 func (*UpdateCredentialsRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{99}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{103}
 }
 
 func (x *UpdateCredentialsRequest) GetProject() string {
@@ -5715,7 +5936,7 @@ type UpdateCredentialsResponse struct {
 func (x *UpdateCredentialsResponse) Reset() {
 	*x = UpdateCredentialsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[100]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[104]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5728,7 +5949,7 @@ func (x *UpdateCredentialsResponse) String() string {
 func (*UpdateCredentialsResponse) ProtoMessage() {}
 
 func (x *UpdateCredentialsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[100]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[104]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5741,7 +5962,7 @@ func (x *UpdateCredentialsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateCredentialsResponse.ProtoReflect.Descriptor instead.
 func (*UpdateCredentialsResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{100}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{104}
 }
 
 func (x *UpdateCredentialsResponse) GetCredentials() *v1.Secret {
@@ -5762,7 +5983,7 @@ type ListAnalysisTemplatesRequest struct {
 func (x *ListAnalysisTemplatesRequest) Reset() {
 	*x = ListAnalysisTemplatesRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[101]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[105]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5775,7 +5996,7 @@ func (x *ListAnalysisTemplatesRequest) String() string {
 func (*ListAnalysisTemplatesRequest) ProtoMessage() {}
 
 func (x *ListAnalysisTemplatesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[101]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[105]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5788,7 +6009,7 @@ func (x *ListAnalysisTemplatesRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListAnalysisTemplatesRequest.ProtoReflect.Descriptor instead.
 func (*ListAnalysisTemplatesRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{101}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{105}
 }
 
 func (x *ListAnalysisTemplatesRequest) GetProject() string {
@@ -5809,7 +6030,7 @@ type ListAnalysisTemplatesResponse struct {
 func (x *ListAnalysisTemplatesResponse) Reset() {
 	*x = ListAnalysisTemplatesResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[102]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[106]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5822,7 +6043,7 @@ func (x *ListAnalysisTemplatesResponse) String() string {
 func (*ListAnalysisTemplatesResponse) ProtoMessage() {}
 
 func (x *ListAnalysisTemplatesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[102]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[106]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5835,7 +6056,7 @@ func (x *ListAnalysisTemplatesResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListAnalysisTemplatesResponse.ProtoReflect.Descriptor instead.
 func (*ListAnalysisTemplatesResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{102}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{106}
 }
 
 func (x *ListAnalysisTemplatesResponse) GetAnalysisTemplates() []*v1alpha11.AnalysisTemplate {
@@ -5856,7 +6077,7 @@ type ListPromotionTasksRequest struct {
 func (x *ListPromotionTasksRequest) Reset() {
 	*x = ListPromotionTasksRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[103]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[107]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5869,7 +6090,7 @@ func (x *ListPromotionTasksRequest) String() string {
 func (*ListPromotionTasksRequest) ProtoMessage() {}
 
 func (x *ListPromotionTasksRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[103]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[107]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5882,7 +6103,7 @@ func (x *ListPromotionTasksRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListPromotionTasksRequest.ProtoReflect.Descriptor instead.
 func (*ListPromotionTasksRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{103}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{107}
 }
 
 func (x *ListPromotionTasksRequest) GetProject() string {
@@ -5903,7 +6124,7 @@ type ListPromotionTasksResponse struct {
 func (x *ListPromotionTasksResponse) Reset() {
 	*x = ListPromotionTasksResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[104]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[108]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5916,7 +6137,7 @@ func (x *ListPromotionTasksResponse) String() string {
 func (*ListPromotionTasksResponse) ProtoMessage() {}
 
 func (x *ListPromotionTasksResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[104]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[108]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5929,7 +6150,7 @@ func (x *ListPromotionTasksResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListPromotionTasksResponse.ProtoReflect.Descriptor instead.
 func (*ListPromotionTasksResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{104}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{108}
 }
 
 func (x *ListPromotionTasksResponse) GetPromotionTasks() []*v1alpha1.PromotionTask {
@@ -5948,7 +6169,7 @@ type ListClusterPromotionTasksRequest struct {
 func (x *ListClusterPromotionTasksRequest) Reset() {
 	*x = ListClusterPromotionTasksRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[105]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[109]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -5961,7 +6182,7 @@ func (x *ListClusterPromotionTasksRequest) String() string {
 func (*ListClusterPromotionTasksRequest) ProtoMessage() {}
 
 func (x *ListClusterPromotionTasksRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[105]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[109]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -5974,7 +6195,7 @@ func (x *ListClusterPromotionTasksRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListClusterPromotionTasksRequest.ProtoReflect.Descriptor instead.
 func (*ListClusterPromotionTasksRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{105}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{109}
 }
 
 type ListClusterPromotionTasksResponse struct {
@@ -5988,7 +6209,7 @@ type ListClusterPromotionTasksResponse struct {
 func (x *ListClusterPromotionTasksResponse) Reset() {
 	*x = ListClusterPromotionTasksResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[106]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[110]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6001,7 +6222,7 @@ func (x *ListClusterPromotionTasksResponse) String() string {
 func (*ListClusterPromotionTasksResponse) ProtoMessage() {}
 
 func (x *ListClusterPromotionTasksResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[106]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[110]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6014,7 +6235,7 @@ func (x *ListClusterPromotionTasksResponse) ProtoReflect() protoreflect.Message
 
 // Deprecated: Use ListClusterPromotionTasksResponse.ProtoReflect.Descriptor instead.
 func (*ListClusterPromotionTasksResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{106}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{110}
 }
 
 func (x *ListClusterPromotionTasksResponse) GetClusterPromotionTasks() []*v1alpha1.ClusterPromotionTask {
@@ -6037,7 +6258,7 @@ type GetAnalysisTemplateRequest struct {
 func (x *GetAnalysisTemplateRequest) Reset() {
 	*x = GetAnalysisTemplateRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[107]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[111]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6050,7 +6271,7 @@ func (x *GetAnalysisTemplateRequest) String() string {
 func (*GetAnalysisTemplateRequest) ProtoMessage() {}
 
 func (x *GetAnalysisTemplateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[107]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[111]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6063,7 +6284,7 @@ func (x *GetAnalysisTemplateRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetAnalysisTemplateRequest.ProtoReflect.Descriptor instead.
 func (*GetAnalysisTemplateRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{107}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{111}
 }
 
 func (x *GetAnalysisTemplateRequest) GetProject() string {
@@ -6102,7 +6323,7 @@ type GetAnalysisTemplateResponse struct {
 func (x *GetAnalysisTemplateResponse) Reset() {
 	*x = GetAnalysisTemplateResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[108]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[112]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6115,7 +6336,7 @@ func (x *GetAnalysisTemplateResponse) String() string {
 func (*GetAnalysisTemplateResponse) ProtoMessage() {}
 
 func (x *GetAnalysisTemplateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[108]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[112]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6128,7 +6349,7 @@ func (x *GetAnalysisTemplateResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetAnalysisTemplateResponse.ProtoReflect.Descriptor instead.
 func (*GetAnalysisTemplateResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{108}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{112}
 }
 
 func (m *GetAnalysisTemplateResponse) GetResult() isGetAnalysisTemplateResponse_Result {
@@ -6181,7 +6402,7 @@ type GetPromotionTaskRequest struct {
 func (x *GetPromotionTaskRequest) Reset() {
 	*x = GetPromotionTaskRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[109]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[113]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6194,7 +6415,7 @@ func (x *GetPromotionTaskRequest) String() string {
 func (*GetPromotionTaskRequest) ProtoMessage() {}
 
 func (x *GetPromotionTaskRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[109]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[113]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6207,7 +6428,7 @@ func (x *GetPromotionTaskRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPromotionTaskRequest.ProtoReflect.Descriptor instead.
 func (*GetPromotionTaskRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{109}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{113}
 }
 
 func (x *GetPromotionTaskRequest) GetProject() string {
@@ -6246,7 +6467,7 @@ type GetPromotionTaskResponse struct {
 func (x *GetPromotionTaskResponse) Reset() {
 	*x = GetPromotionTaskResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[110]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[114]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6259,7 +6480,7 @@ func (x *GetPromotionTaskResponse) String() string {
 func (*GetPromotionTaskResponse) ProtoMessage() {}
 
 func (x *GetPromotionTaskResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[110]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[114]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6272,7 +6493,7 @@ func (x *GetPromotionTaskResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPromotionTaskResponse.ProtoReflect.Descriptor instead.
 func (*GetPromotionTaskResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{110}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{114}
 }
 
 func (m *GetPromotionTaskResponse) GetResult() isGetPromotionTaskResponse_Result {
@@ -6324,7 +6545,7 @@ type GetClusterPromotionTaskRequest struct {
 func (x *GetClusterPromotionTaskRequest) Reset() {
 	*x = GetClusterPromotionTaskRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[111]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[115]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6337,7 +6558,7 @@ func (x *GetClusterPromotionTaskRequest) String() string {
 func (*GetClusterPromotionTaskRequest) ProtoMessage() {}
 
 func (x *GetClusterPromotionTaskRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[111]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[115]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6350,7 +6571,7 @@ func (x *GetClusterPromotionTaskRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetClusterPromotionTaskRequest.ProtoReflect.Descriptor instead.
 func (*GetClusterPromotionTaskRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{111}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{115}
 }
 
 func (x *GetClusterPromotionTaskRequest) GetName() string {
@@ -6382,7 +6603,7 @@ type GetClusterPromotionTaskResponse struct {
 func (x *GetClusterPromotionTaskResponse) Reset() {
 	*x = GetClusterPromotionTaskResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[112]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[116]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6395,7 +6616,7 @@ func (x *GetClusterPromotionTaskResponse) String() string {
 func (*GetClusterPromotionTaskResponse) ProtoMessage() {}
 
 func (x *GetClusterPromotionTaskResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[112]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[116]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6408,7 +6629,7 @@ func (x *GetClusterPromotionTaskResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetClusterPromotionTaskResponse.ProtoReflect.Descriptor instead.
 func (*GetClusterPromotionTaskResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{112}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{116}
 }
 
 func (m *GetClusterPromotionTaskResponse) GetResult() isGetClusterPromotionTaskResponse_Result {
@@ -6457,7 +6678,7 @@ type ListClusterAnalysisTemplatesRequest struct {
 func (x *ListClusterAnalysisTemplatesRequest) Reset() {
 	*x = ListClusterAnalysisTemplatesRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[113]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[117]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6470,7 +6691,7 @@ func (x *ListClusterAnalysisTemplatesRequest) String() string {
 func (*ListClusterAnalysisTemplatesRequest) ProtoMessage() {}
 
 func (x *ListClusterAnalysisTemplatesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[113]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[117]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6483,7 +6704,7 @@ func (x *ListClusterAnalysisTemplatesRequest) ProtoReflect() protoreflect.Messag
 
 // Deprecated: Use ListClusterAnalysisTemplatesRequest.ProtoReflect.Descriptor instead.
 func (*ListClusterAnalysisTemplatesRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{113}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{117}
 }
 
 type ListClusterAnalysisTemplatesResponse struct {
@@ -6497,7 +6718,7 @@ type ListClusterAnalysisTemplatesResponse struct {
 func (x *ListClusterAnalysisTemplatesResponse) Reset() {
 	*x = ListClusterAnalysisTemplatesResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[114]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[118]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6510,7 +6731,7 @@ func (x *ListClusterAnalysisTemplatesResponse) String() string {
 func (*ListClusterAnalysisTemplatesResponse) ProtoMessage() {}
 
 func (x *ListClusterAnalysisTemplatesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[114]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[118]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6523,7 +6744,7 @@ func (x *ListClusterAnalysisTemplatesResponse) ProtoReflect() protoreflect.Messa
 
 // Deprecated: Use ListClusterAnalysisTemplatesResponse.ProtoReflect.Descriptor instead.
 func (*ListClusterAnalysisTemplatesResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{114}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{118}
 }
 
 func (x *ListClusterAnalysisTemplatesResponse) GetClusterAnalysisTemplates() []*v1alpha11.ClusterAnalysisTemplate {
@@ -6545,7 +6766,7 @@ type GetClusterAnalysisTemplateRequest struct {
 func (x *GetClusterAnalysisTemplateRequest) Reset() {
 	*x = GetClusterAnalysisTemplateRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[115]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[119]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6558,7 +6779,7 @@ func (x *GetClusterAnalysisTemplateRequest) String() string {
 func (*GetClusterAnalysisTemplateRequest) ProtoMessage() {}
 
 func (x *GetClusterAnalysisTemplateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[115]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[119]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6571,7 +6792,7 @@ func (x *GetClusterAnalysisTemplateRequest) ProtoReflect() protoreflect.Message
 
 // Deprecated: Use GetClusterAnalysisTemplateRequest.ProtoReflect.Descriptor instead.
 func (*GetClusterAnalysisTemplateRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{115}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{119}
 }
 
 func (x *GetClusterAnalysisTemplateRequest) GetName() string {
@@ -6603,7 +6824,7 @@ type GetClusterAnalysisTemplateResponse struct {
 func (x *GetClusterAnalysisTemplateResponse) Reset() {
 	*x = GetClusterAnalysisTemplateResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[116]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[120]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6616,7 +6837,7 @@ func (x *GetClusterAnalysisTemplateResponse) String() string {
 func (*GetClusterAnalysisTemplateResponse) ProtoMessage() {}
 
 func (x *GetClusterAnalysisTemplateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[116]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[120]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6629,7 +6850,7 @@ func (x *GetClusterAnalysisTemplateResponse) ProtoReflect() protoreflect.Message
 
 // Deprecated: Use GetClusterAnalysisTemplateResponse.ProtoReflect.Descriptor instead.
 func (*GetClusterAnalysisTemplateResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{116}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{120}
 }
 
 func (m *GetClusterAnalysisTemplateResponse) GetResult() isGetClusterAnalysisTemplateResponse_Result {
@@ -6683,7 +6904,7 @@ type GetAnalysisRunRequest struct {
 func (x *GetAnalysisRunRequest) Reset() {
 	*x = GetAnalysisRunRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[117]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[121]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6696,7 +6917,7 @@ func (x *GetAnalysisRunRequest) String() string {
 func (*GetAnalysisRunRequest) ProtoMessage() {}
 
 func (x *GetAnalysisRunRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[117]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[121]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6709,7 +6930,7 @@ func (x *GetAnalysisRunRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetAnalysisRunRequest.ProtoReflect.Descriptor instead.
 func (*GetAnalysisRunRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{117}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{121}
 }
 
 func (x *GetAnalysisRunRequest) GetNamespace() string {
@@ -6748,7 +6969,7 @@ type GetAnalysisRunResponse struct {
 func (x *GetAnalysisRunResponse) Reset() {
 	*x = GetAnalysisRunResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[118]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[122]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6761,7 +6982,7 @@ func (x *GetAnalysisRunResponse) String() string {
 func (*GetAnalysisRunResponse) ProtoMessage() {}
 
 func (x *GetAnalysisRunResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[118]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[122]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6774,7 +6995,7 @@ func (x *GetAnalysisRunResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetAnalysisRunResponse.ProtoReflect.Descriptor instead.
 func (*GetAnalysisRunResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{118}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{122}
 }
 
 func (m *GetAnalysisRunResponse) GetResult() isGetAnalysisRunResponse_Result {
@@ -6828,7 +7049,7 @@ type GetAnalysisRunLogsRequest struct {
 func (x *GetAnalysisRunLogsRequest) Reset() {
 	*x = GetAnalysisRunLogsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[119]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[123]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6841,7 +7062,7 @@ func (x *GetAnalysisRunLogsRequest) String() string {
 func (*GetAnalysisRunLogsRequest) ProtoMessage() {}
 
 func (x *GetAnalysisRunLogsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[119]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[123]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6854,7 +7075,7 @@ func (x *GetAnalysisRunLogsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetAnalysisRunLogsRequest.ProtoReflect.Descriptor instead.
 func (*GetAnalysisRunLogsRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{119}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{123}
 }
 
 func (x *GetAnalysisRunLogsRequest) GetNamespace() string {
@@ -6896,7 +7117,7 @@ type GetAnalysisRunLogsResponse struct {
 func (x *GetAnalysisRunLogsResponse) Reset() {
 	*x = GetAnalysisRunLogsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[120]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[124]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6909,7 +7130,7 @@ func (x *GetAnalysisRunLogsResponse) String() string {
 func (*GetAnalysisRunLogsResponse) ProtoMessage() {}
 
 func (x *GetAnalysisRunLogsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[120]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[124]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6922,7 +7143,7 @@ func (x *GetAnalysisRunLogsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetAnalysisRunLogsResponse.ProtoReflect.Descriptor instead.
 func (*GetAnalysisRunLogsResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{120}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{124}
 }
 
 func (x *GetAnalysisRunLogsResponse) GetChunk() string {
@@ -6944,7 +7165,7 @@ type DeleteAnalysisTemplateRequest struct {
 func (x *DeleteAnalysisTemplateRequest) Reset() {
 	*x = DeleteAnalysisTemplateRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[121]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[125]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6957,7 +7178,7 @@ func (x *DeleteAnalysisTemplateRequest) String() string {
 func (*DeleteAnalysisTemplateRequest) ProtoMessage() {}
 
 func (x *DeleteAnalysisTemplateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[121]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[125]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6970,7 +7191,7 @@ func (x *DeleteAnalysisTemplateRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteAnalysisTemplateRequest.ProtoReflect.Descriptor instead.
 func (*DeleteAnalysisTemplateRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{121}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{125}
 }
 
 func (x *DeleteAnalysisTemplateRequest) GetProject() string {
@@ -6996,7 +7217,7 @@ type DeleteAnalysisTemplateResponse struct {
 func (x *DeleteAnalysisTemplateResponse) Reset() {
 	*x = DeleteAnalysisTemplateResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[122]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[126]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7009,7 +7230,7 @@ func (x *DeleteAnalysisTemplateResponse) String() string {
 func (*DeleteAnalysisTemplateResponse) ProtoMessage() {}
 
 func (x *DeleteAnalysisTemplateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[122]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[126]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7022,7 +7243,7 @@ func (x *DeleteAnalysisTemplateResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteAnalysisTemplateResponse.ProtoReflect.Descriptor instead.
 func (*DeleteAnalysisTemplateResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{122}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{126}
 }
 
 type DeleteClusterAnalysisTemplateRequest struct {
@@ -7036,7 +7257,7 @@ type DeleteClusterAnalysisTemplateRequest struct {
 func (x *DeleteClusterAnalysisTemplateRequest) Reset() {
 	*x = DeleteClusterAnalysisTemplateRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[123]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[127]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7049,7 +7270,7 @@ func (x *DeleteClusterAnalysisTemplateRequest) String() string {
 func (*DeleteClusterAnalysisTemplateRequest) ProtoMessage() {}
 
 func (x *DeleteClusterAnalysisTemplateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[123]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[127]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7062,7 +7283,7 @@ func (x *DeleteClusterAnalysisTemplateRequest) ProtoReflect() protoreflect.Messa
 
 // Deprecated: Use DeleteClusterAnalysisTemplateRequest.ProtoReflect.Descriptor instead.
 func (*DeleteClusterAnalysisTemplateRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{123}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{127}
 }
 
 func (x *DeleteClusterAnalysisTemplateRequest) GetName() string {
@@ -7081,7 +7302,7 @@ type DeleteClusterAnalysisTemplateResponse struct {
 func (x *DeleteClusterAnalysisTemplateResponse) Reset() {
 	*x = DeleteClusterAnalysisTemplateResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[124]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[128]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7094,7 +7315,7 @@ func (x *DeleteClusterAnalysisTemplateResponse) String() string {
 func (*DeleteClusterAnalysisTemplateResponse) ProtoMessage() {}
 
 func (x *DeleteClusterAnalysisTemplateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[124]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[128]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7107,7 +7328,7 @@ func (x *DeleteClusterAnalysisTemplateResponse) ProtoReflect() protoreflect.Mess
 
 // Deprecated: Use DeleteClusterAnalysisTemplateResponse.ProtoReflect.Descriptor instead.
 func (*DeleteClusterAnalysisTemplateResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{124}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{128}
 }
 
 type ListProjectEventsRequest struct {
@@ -7121,7 +7342,7 @@ type ListProjectEventsRequest struct {
 func (x *ListProjectEventsRequest) Reset() {
 	*x = ListProjectEventsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[125]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[129]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7134,7 +7355,7 @@ func (x *ListProjectEventsRequest) String() string {
 func (*ListProjectEventsRequest) ProtoMessage() {}
 
 func (x *ListProjectEventsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[125]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[129]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7147,7 +7368,7 @@ func (x *ListProjectEventsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListProjectEventsRequest.ProtoReflect.Descriptor instead.
 func (*ListProjectEventsRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{125}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{129}
 }
 
 func (x *ListProjectEventsRequest) GetProject() string {
@@ -7168,7 +7389,7 @@ type ListProjectEventsResponse struct {
 func (x *ListProjectEventsResponse) Reset() {
 	*x = ListProjectEventsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[126]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[130]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7181,7 +7402,7 @@ func (x *ListProjectEventsResponse) String() string {
 func (*ListProjectEventsResponse) ProtoMessage() {}
 
 func (x *ListProjectEventsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[126]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[130]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7194,7 +7415,7 @@ func (x *ListProjectEventsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListProjectEventsResponse.ProtoReflect.Descriptor instead.
 func (*ListProjectEventsResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{126}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{130}
 }
 
 func (x *ListProjectEventsResponse) GetEvents() []*v1.Event {
@@ -7215,7 +7436,7 @@ type CreateRoleRequest struct {
 func (x *CreateRoleRequest) Reset() {
 	*x = CreateRoleRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[127]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[131]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7228,7 +7449,7 @@ func (x *CreateRoleRequest) String() string {
 func (*CreateRoleRequest) ProtoMessage() {}
 
 func (x *CreateRoleRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[127]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[131]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7241,7 +7462,7 @@ func (x *CreateRoleRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateRoleRequest.ProtoReflect.Descriptor instead.
 func (*CreateRoleRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{127}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{131}
 }
 
 func (x *CreateRoleRequest) GetRole() *v1alpha12.Role {
@@ -7262,7 +7483,7 @@ type CreateRoleResponse struct {
 func (x *CreateRoleResponse) Reset() {
 	*x = CreateRoleResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[128]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[132]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7275,7 +7496,7 @@ func (x *CreateRoleResponse) String() string {
 func (*CreateRoleResponse) ProtoMessage() {}
 
 func (x *CreateRoleResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[128]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[132]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7288,7 +7509,7 @@ func (x *CreateRoleResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateRoleResponse.ProtoReflect.Descriptor instead.
 func (*CreateRoleResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{128}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{132}
 }
 
 func (x *CreateRoleResponse) GetRole() *v1alpha12.Role {
@@ -7310,7 +7531,7 @@ type DeleteRoleRequest struct {
 func (x *DeleteRoleRequest) Reset() {
 	*x = DeleteRoleRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[129]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[133]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7323,7 +7544,7 @@ func (x *DeleteRoleRequest) String() string {
 func (*DeleteRoleRequest) ProtoMessage() {}
 
 func (x *DeleteRoleRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[129]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[133]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7336,7 +7557,7 @@ func (x *DeleteRoleRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteRoleRequest.ProtoReflect.Descriptor instead.
 func (*DeleteRoleRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{129}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{133}
 }
 
 func (x *DeleteRoleRequest) GetProject() string {
@@ -7362,7 +7583,7 @@ type DeleteRoleResponse struct {
 func (x *DeleteRoleResponse) Reset() {
 	*x = DeleteRoleResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[130]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[134]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7375,7 +7596,7 @@ func (x *DeleteRoleResponse) String() string {
 func (*DeleteRoleResponse) ProtoMessage() {}
 
 func (x *DeleteRoleResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[130]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[134]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7388,7 +7609,7 @@ func (x *DeleteRoleResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteRoleResponse.ProtoReflect.Descriptor instead.
 func (*DeleteRoleResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{130}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{134}
 }
 
 type GetRoleRequest struct {
@@ -7405,7 +7626,7 @@ type GetRoleRequest struct {
 func (x *GetRoleRequest) Reset() {
 	*x = GetRoleRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[131]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[135]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7418,7 +7639,7 @@ func (x *GetRoleRequest) String() string {
 func (*GetRoleRequest) ProtoMessage() {}
 
 func (x *GetRoleRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[131]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[135]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7431,7 +7652,7 @@ func (x *GetRoleRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetRoleRequest.ProtoReflect.Descriptor instead.
 func (*GetRoleRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{131}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{135}
 }
 
 func (x *GetRoleRequest) GetProject() string {
@@ -7478,7 +7699,7 @@ type GetRoleResponse struct {
 func (x *GetRoleResponse) Reset() {
 	*x = GetRoleResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[132]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[136]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7491,7 +7712,7 @@ func (x *GetRoleResponse) String() string {
 func (*GetRoleResponse) ProtoMessage() {}
 
 func (x *GetRoleResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[132]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[136]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7504,7 +7725,7 @@ func (x *GetRoleResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetRoleResponse.ProtoReflect.Descriptor instead.
 func (*GetRoleResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{132}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{136}
 }
 
 func (m *GetRoleResponse) GetResult() isGetRoleResponse_Result {
@@ -7569,7 +7790,7 @@ type Claims struct {
 func (x *Claims) Reset() {
 	*x = Claims{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[133]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[137]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7582,7 +7803,7 @@ func (x *Claims) String() string {
 func (*Claims) ProtoMessage() {}
 
 func (x *Claims) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[133]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[137]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7595,7 +7816,7 @@ func (x *Claims) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Claims.ProtoReflect.Descriptor instead.
 func (*Claims) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{133}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{137}
 }
 
 func (x *Claims) GetClaims() []*v1alpha12.Claim {
@@ -7622,7 +7843,7 @@ type GrantRequest struct {
 func (x *GrantRequest) Reset() {
 	*x = GrantRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[134]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[138]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7635,7 +7856,7 @@ func (x *GrantRequest) String() string {
 func (*GrantRequest) ProtoMessage() {}
 
 func (x *GrantRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[134]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[138]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7648,7 +7869,7 @@ func (x *GrantRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GrantRequest.ProtoReflect.Descriptor instead.
 func (*GrantRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{134}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{138}
 }
 
 func (x *GrantRequest) GetProject() string {
@@ -7713,7 +7934,7 @@ type GrantResponse struct {
 func (x *GrantResponse) Reset() {
 	*x = GrantResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[135]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[139]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7726,7 +7947,7 @@ func (x *GrantResponse) String() string {
 func (*GrantResponse) ProtoMessage() {}
 
 func (x *GrantResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[135]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[139]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7739,7 +7960,7 @@ func (x *GrantResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GrantResponse.ProtoReflect.Descriptor instead.
 func (*GrantResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{135}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{139}
 }
 
 func (x *GrantResponse) GetRole() *v1alpha12.Role {
@@ -7761,7 +7982,7 @@ type ListRolesRequest struct {
 func (x *ListRolesRequest) Reset() {
 	*x = ListRolesRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[136]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[140]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7774,7 +7995,7 @@ func (x *ListRolesRequest) String() string {
 func (*ListRolesRequest) ProtoMessage() {}
 
 func (x *ListRolesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[136]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[140]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7787,7 +8008,7 @@ func (x *ListRolesRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListRolesRequest.ProtoReflect.Descriptor instead.
 func (*ListRolesRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{136}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{140}
 }
 
 func (x *ListRolesRequest) GetProject() string {
@@ -7817,7 +8038,7 @@ type ListRolesResponse struct {
 func (x *ListRolesResponse) Reset() {
 	*x = ListRolesResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[137]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[141]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7830,7 +8051,7 @@ func (x *ListRolesResponse) String() string {
 func (*ListRolesResponse) ProtoMessage() {}
 
 func (x *ListRolesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[137]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[141]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7843,7 +8064,7 @@ func (x *ListRolesResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListRolesResponse.ProtoReflect.Descriptor instead.
 func (*ListRolesResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{137}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{141}
 }
 
 func (x *ListRolesResponse) GetRoles() []*v1alpha12.Role {
@@ -7877,7 +8098,7 @@ type RevokeRequest struct {
 func (x *RevokeRequest) Reset() {
 	*x = RevokeRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[138]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[142]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7890,7 +8111,7 @@ func (x *RevokeRequest) String() string {
 func (*RevokeRequest) ProtoMessage() {}
 
 func (x *RevokeRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[138]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[142]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7903,7 +8124,7 @@ func (x *RevokeRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RevokeRequest.ProtoReflect.Descriptor instead.
 func (*RevokeRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{138}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{142}
 }
 
 func (x *RevokeRequest) GetProject() string {
@@ -7968,7 +8189,7 @@ type RevokeResponse struct {
 func (x *RevokeResponse) Reset() {
 	*x = RevokeResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[139]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[143]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -7981,7 +8202,7 @@ func (x *RevokeResponse) String() string {
 func (*RevokeResponse) ProtoMessage() {}
 
 func (x *RevokeResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[139]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[143]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -7994,7 +8215,7 @@ func (x *RevokeResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RevokeResponse.ProtoReflect.Descriptor instead.
 func (*RevokeResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{139}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{143}
 }
 
 func (x *RevokeResponse) GetRole() *v1alpha12.Role {
@@ -8015,7 +8236,7 @@ type UpdateRoleRequest struct {
 func (x *UpdateRoleRequest) Reset() {
 	*x = UpdateRoleRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[140]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[144]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -8028,7 +8249,7 @@ func (x *UpdateRoleRequest) String() string {
 func (*UpdateRoleRequest) ProtoMessage() {}
 
 func (x *UpdateRoleRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[140]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[144]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -8041,7 +8262,7 @@ func (x *UpdateRoleRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateRoleRequest.ProtoReflect.Descriptor instead.
 func (*UpdateRoleRequest) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{140}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{144}
 }
 
 func (x *UpdateRoleRequest) GetRole() *v1alpha12.Role {
@@ -8062,7 +8283,7 @@ type UpdateRoleResponse struct {
 func (x *UpdateRoleResponse) Reset() {
 	*x = UpdateRoleResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_service_v1alpha1_service_proto_msgTypes[141]
+		mi := &file_api_service_v1alpha1_service_proto_msgTypes[145]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -8075,7 +8296,7 @@ func (x *UpdateRoleResponse) String() string {
 func (*UpdateRoleResponse) ProtoMessage() {}
 
 func (x *UpdateRoleResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_service_v1alpha1_service_proto_msgTypes[141]
+	mi := &file_api_service_v1alpha1_service_proto_msgTypes[145]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -8088,7 +8309,7 @@ func (x *UpdateRoleResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateRoleResponse.ProtoReflect.Descriptor instead.
 func (*UpdateRoleResponse) Descriptor() ([]byte, []int) {
-	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{141}
+	return file_api_service_v1alpha1_service_proto_rawDescGZIP(), []int{145}
 }
 
 func (x *UpdateRoleResponse) GetRole() *v1alpha12.Role {
@@ -8435,1223 +8656,1263 @@ var file_api_service_v1alpha1_service_proto_rawDesc = []byte{
 	0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 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, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72,
-	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x0a,
-	0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 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, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72,
-	0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x7d, 0x0a, 0x12, 0x47,
-	0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x49, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e,
-	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
-	0x74, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x03,
-	0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77,
-	0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x13, 0x4c,
-	0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a,
-	0x65, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x05, 0x48, 0x01, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a,
-	0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52,
-	0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70,
-	0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x67,
-	0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x77, 0x0a, 0x14,
-	0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,
-	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
-	0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
-	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72,
-	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12,
-	0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,
-	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x71, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
-	0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,
-	0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05,
-	0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69,
-	0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x72,
-	0x6f, 0x76, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x5a, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69,
-	0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72,
-	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61,
-	0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x17,
-	0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x46,
-	0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
-	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,
-	0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,
-	0x73, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
-	0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06,
-	0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x7d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65,
-	0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07,
-	0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e,
-	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
-	0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x48, 0x00, 0x52, 0x07,
-	0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x12, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72,
-	0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x86, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
-	0x65, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61,
-	0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12,
-	0x18, 0x0a, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x65,
-	0x69, 0x67, 0x68, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0c, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x67,
-	0x0a, 0x16, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x67, 0x65,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6d,
-	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x0a,
+	0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 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,
+	0x1d, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x72,
+	0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 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, 0x12, 0x43, 0x0a,
+	0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e,
+	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
+	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d,
+	0x61, 0x74, 0x22, 0x96, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x5c, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0d,
+	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a,
+	0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61,
+	0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x6c, 0x0a, 0x11, 0x47,
+	0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 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, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61,
+	0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x7d, 0x0a, 0x12, 0x47, 0x65, 0x74,
+	0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x49, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b,
+	0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x48,
+	0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x03, 0x72, 0x61,
+	0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x42, 0x08,
+	0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73,
+	0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x88,
+	0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05,
+	0x48, 0x01, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66,
+	0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66,
+	0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x61, 0x67,
+	0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x42,
+	0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x77, 0x0a, 0x14, 0x4c, 0x69,
+	0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61,
+	0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x14, 0x0a,
+	0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f,
+	0x74, 0x61, 0x6c, 0x22, 0x71, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x46, 0x72,
+	0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07,
+	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c,
+	0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73,
+	0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76,
+	0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x5a, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x17, 0x0a, 0x15,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65,
+	0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69,
+	0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12,
+	0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f,
+	0x72, 0x6d, 0x61, 0x74, 0x22, 0x7d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x69, 0x67,
+	0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x66, 0x72,
+	0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69,
 	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
 	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x72,
-	0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x89, 0x01, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6d,
-	0x6f, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x14,
-	0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73,
-	0x74, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x23,
-	0x0a, 0x0d, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c,
-	0x69, 0x61, 0x73, 0x22, 0x6c, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x6f,
-	0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x4f, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
-	0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61,
-	0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d,
-	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x22, 0xc5, 0x01, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67,
-	0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f,
-	0x75, 0x70, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f,
-	0x75, 0x70, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72,
-	0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72,
-	0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65,
-	0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12,
-	0x18, 0x0a, 0x07, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09,
-	0x52, 0x07, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x73, 0x22, 0xdc, 0x01, 0x0a, 0x14, 0x51, 0x75,
-	0x65, 0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x5a, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x42, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
-	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67,
-	0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70,
-	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x1a, 0x68,
-	0x0a, 0x0b, 0x47, 0x72, 0x6f, 0x75, 0x70, 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,
-	0x43, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
-	0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76,
-	0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x56, 0x0a, 0x0b, 0x46, 0x72, 0x65, 0x69,
-	0x67, 0x68, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67,
-	0x68, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75,
-	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72,
-	0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-	0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74,
-	0x22, 0x83, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67,
-	0x68, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,
-	0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09,
-	0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x08, 0x6f, 0x6c, 0x64, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77,
-	0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65,
-	0x77, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
-	0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x0a, 0x0f, 0x52, 0x65, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
-	0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x76, 0x65, 0x72,
-	0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x0a, 0x18, 0x41,
-	0x62, 0x6f, 0x72, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
-	0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x62, 0x6f, 0x72, 0x74,
-	0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x72, 0x65,
-	0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
+	0x61, 0x31, 0x2e, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x48, 0x00, 0x52, 0x07, 0x66, 0x72,
+	0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x12, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73,
+	0x75, 0x6c, 0x74, 0x22, 0x86, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x54,
+	0x6f, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
 	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x69, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57,
-	0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x18,
-	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
-	0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
-	0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x72,
-	0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x0a, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73,
-	0x65, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f,
-	0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72,
-	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d,
-	0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
-	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46,
-	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01,
-	0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x09, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f,
-	0x75, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68,
+	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a,
+	0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x65, 0x69, 0x67,
+	0x68, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+	0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x67, 0x0a, 0x16,
+	0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
+	0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68,
 	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61,
 	0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x77, 0x61,
-	0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72,
-	0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x46, 0x0a, 0x16, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x61,
-	0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
-	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7c, 0x0a,
-	0x17, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x77, 0x61, 0x72, 0x65,
-	0x68, 0x6f, 0x75, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69,
-	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x2e, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x09, 0x77, 0x61,
-	0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x46, 0x0a, 0x16, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12,
-	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
-	0x61, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x72,
-	0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47,
-	0x0a, 0x17, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75,
-	0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x69, 0x0a, 0x18, 0x52, 0x65, 0x66, 0x72, 0x65,
-	0x73, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
+	0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6d,
+	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x89, 0x01, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
+	0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x14, 0x0a, 0x05,
+	0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61,
+	0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x23, 0x0a, 0x0d,
+	0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c, 0x69, 0x61,
+	0x73, 0x22, 0x6c, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e,
+	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f,
+	0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e,
+	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,
+	0xc5, 0x01, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70,
+	0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70,
+	0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65,
+	0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65,
+	0x72, 0x42, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x18, 0x0a,
+	0x07, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07,
+	0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x73, 0x22, 0xdc, 0x01, 0x0a, 0x14, 0x51, 0x75, 0x65, 0x72,
+	0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x5a, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x42, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x1a, 0x68, 0x0a, 0x0b,
+	0x47, 0x72, 0x6f, 0x75, 0x70, 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, 0x43, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+	0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x56, 0x0a, 0x0b, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68,
+	0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
 	0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
-	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61,
-	0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x09, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75,
-	0x73, 0x65, 0x22, 0x35, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
-	0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x52, 0x0a, 0x1a, 0x4c, 0x69, 0x73,
-	0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65,
-	0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69,
-	0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65,
-	0x63, 0x72, 0x65, 0x74, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x81, 0x02,
-	0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53,
-	0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07,
+	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x72,
+	0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x66, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x83,
+	0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74,
+	0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07,
 	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70,
 	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 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, 0x5a, 0x0a, 0x04,
-	0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65,
-	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74,
-	0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61,
-	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, 0x51, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x32, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f,
-	0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x06, 0x73, 0x65,
-	0x63, 0x72, 0x65, 0x74, 0x22, 0x81, 0x02, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50,
-	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x6c,
+	0x64, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f,
+	0x6c, 0x64, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x61,
+	0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x41,
+	0x6c, 0x69, 0x61, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x72,
+	0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x41, 0x0a, 0x0f, 0x52, 0x65, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12,
+	0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x73, 0x74, 0x61, 0x67, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x76, 0x65, 0x72, 0x69, 0x66,
+	0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x0a, 0x18, 0x41, 0x62, 0x6f,
+	0x72, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12,
+	0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x73, 0x74, 0x61, 0x67, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x56, 0x65,
+	0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x31, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f,
+	0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x69, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x72,
+	0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x4f, 0x0a, 0x0a, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70,
+	0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x72, 0x65, 0x68,
+	0x6f, 0x75, 0x73, 0x65, 0x52, 0x0a, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73,
+	0x22, 0x88, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72,
+	0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x14,
+	0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x09, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57,
+	0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x77, 0x61, 0x72, 0x65,
+	0x68, 0x6f, 0x75, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73,
+	0x75, 0x6c, 0x74, 0x22, 0x46, 0x0a, 0x16, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x61, 0x72, 0x65,
+	0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
+	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7c, 0x0a, 0x17, 0x57,
+	0x61, 0x74, 0x63, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f,
+	0x75, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0x2e, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x09, 0x77, 0x61, 0x72, 0x65,
+	0x68, 0x6f, 0x75, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x46, 0x0a, 0x16, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75,
 	0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a,
 	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
-	0x65, 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, 0x5a, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x46, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
-	0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a,
-	0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 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, 0x51, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61,
+	0x65, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x72, 0x65, 0x68,
+	0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x0a, 0x17,
+	0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x69, 0x0a, 0x18, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68,
+	0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x4d, 0x0a, 0x09, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61,
+	0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x72, 0x65,
+	0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x09, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65,
+	0x22, 0x35, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53,
+	0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
+	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x52, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e,
+	0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72,
+	0x65, 0x74, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x81, 0x02, 0x0a, 0x1a,
+	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63,
+	0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f,
+	0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 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, 0x5a, 0x0a, 0x04, 0x64, 0x61,
+	0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61,
 	0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65,
-	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f,
-	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63,
-	0x72, 0x65, 0x74, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x4a, 0x0a, 0x1a, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72,
-	0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1d, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74,
-	0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a,
-	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
-	0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x5f,
-	0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x55,
-	0x52, 0x4c, 0x12, 0x29, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x69,
-	0x73, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72,
-	0x65, 0x70, 0x6f, 0x55, 0x52, 0x4c, 0x49, 0x73, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x1a, 0x0a,
-	0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,
-	0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,
-	0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43,
-	0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,
-	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f,
-	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63,
-	0x72, 0x65, 0x74, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73,
-	0x22, 0x48, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e,
-	0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07,
-	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70,
-	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43,
-	0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 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,
+	0x51, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+	0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32,
+	0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
+	0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72,
+	0x65, 0x74, 0x22, 0x81, 0x02, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f,
+	0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 	0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01,
 	0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,
 	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
-	0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32,
-	0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	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, 0x5a, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x46, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
 	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f,
-	0x72, 0x6d, 0x61, 0x74, 0x22, 0x76, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65,
-	0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e,
-	0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61, 0x70, 0x69,
-	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x48,
-	0x00, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x12,
-	0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72,
-	0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x32, 0x0a, 0x16,
-	0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52,
+	0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+	0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x61,
+	0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a,
+	0x09, 0x44, 0x61, 0x74, 0x61, 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, 0x51, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61,
+	0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65,
+	0x74, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x4a, 0x0a, 0x1a, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1d, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43,
+	0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+	0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x75, 0x72,
+	0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x55, 0x52, 0x4c,
+	0x12, 0x29, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x69, 0x73, 0x5f,
+	0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x70,
+	0x6f, 0x55, 0x52, 0x4c, 0x49, 0x73, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x75,
+	0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75,
+	0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,
+	0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,
+	0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x3c, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61,
+	0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65,
+	0x74, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x48,
+	0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69,
+	0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f,
+	0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a,
+	0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e,
+	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
+	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d,
+	0x61, 0x74, 0x22, 0x76, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74,
+	0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0b,
+	0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x48, 0x00, 0x52,
+	0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x03,
+	0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77,
+	0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x32, 0x0a, 0x16, 0x4c, 0x69,
+	0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x57,
+	0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x63, 0x72, 0x65,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a,
+	0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64,
+	0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f,
+	0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f,
+	0x55, 0x52, 0x4c, 0x12, 0x29, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x5f,
+	0x69, 0x73, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e,
+	0x72, 0x65, 0x70, 0x6f, 0x55, 0x52, 0x4c, 0x49, 0x73, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x1a,
+	0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61,
+	0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61,
+	0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61,
+	0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69,
+	0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65,
+	0x63, 0x72, 0x65, 0x74, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,
+	0x73, 0x22, 0x38, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
+	0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x1d,
+	0x4c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70,
+	0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a,
+	0x12, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61,
+	0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2e, 0x72, 0x6f,
+	0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
+	0x52, 0x11, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
+	0x74, 0x65, 0x73, 0x22, 0x35, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f,
+	0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x7a, 0x0a, 0x1a, 0x4c, 0x69,
+	0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6d,
+	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x33, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69,
+	0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f,
+	0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x22, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c,
+	0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61,
+	0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x97, 0x01, 0x0a, 0x21, 0x4c,
+	0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
+	0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x72, 0x0a, 0x17, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6d,
+	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
+	0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x15, 0x63,
+	0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54,
+	0x61, 0x73, 0x6b, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c,
+	0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06,
+	0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xb1, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x6e,
+	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x11, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73,
+	0x69, 0x73, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x45, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+	0x73, 0x74, 0x75, 0x62, 0x73, 0x2e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
+	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x10, 0x61, 0x6e, 0x61, 0x6c,
+	0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x03,
+	0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77,
+	0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x17, 0x47,
+	0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
 	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
-	0x22, 0x57, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69,
-	0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x63,
-	0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f,
-	0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x0b, 0x63, 0x72,
-	0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x55, 0x70,
-	0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52,
+	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61,
+	0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x96, 0x01, 0x0a, 0x18, 0x47, 0x65,
+	0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
+	0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33,
+	0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54,
+	0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e,
+	0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75,
+	0x6c, 0x74, 0x22, 0x79, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
+	0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d,
+	0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xab, 0x01,
+	0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d,
+	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x6a, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74,
+	0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f,
+	0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
+	0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a,
+	0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61,
+	0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x25, 0x0a, 0x23, 0x4c,
+	0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73,
+	0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74,
+	0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
+	0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1a,
+	0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
+	0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x4c, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b,
+	0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73,
+	0x74, 0x75, 0x62, 0x73, 0x2e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e,
+	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x18,
+	0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54,
+	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x7c, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x43,
+	0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65,
+	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06,
+	0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xcf, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x43, 0x6c,
+	0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d,
+	0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01,
+	0x0a, 0x19, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73,
+	0x69, 0x73, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x4c, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+	0x73, 0x74, 0x75, 0x62, 0x73, 0x2e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41,
+	0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48,
+	0x00, 0x52, 0x17, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73,
+	0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x72, 0x61,
+	0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x42, 0x08,
+	0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x8e, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74,
+	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61,
+	0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x16, 0x47, 0x65,
+	0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x0c, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
+	0x5f, 0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x69, 0x74,
+	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b,
+	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2e, 0x72,
+	0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x48, 0x00, 0x52, 0x0b,
+	0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x12, 0x12, 0x0a, 0x03, 0x72,
+	0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x42,
+	0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x19, 0x47, 0x65,
+	0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x74,
+	0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
+	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d,
+	0x65, 0x22, 0x32, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
+	0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x4d, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41,
+	0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
 	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
 	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
-	0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65,
-	0x70, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65,
-	0x70, 0x6f, 0x55, 0x52, 0x4c, 0x12, 0x29, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x75, 0x72,
-	0x6c, 0x5f, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x55, 0x52, 0x4c, 0x49, 0x73, 0x52, 0x65, 0x67, 0x65, 0x78,
-	0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08,
-	0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
-	0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61,
-	0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74,
-	0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6b, 0x38, 0x73,
-	0x2e, 0x69, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e,
-	0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69,
-	0x61, 0x6c, 0x73, 0x22, 0x38, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79,
-	0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x95, 0x01,
-	0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65,
-	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x74, 0x0a, 0x12, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x5f, 0x74, 0x65, 0x6d, 0x70,
-	0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x69,
-	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2e,
-	0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
-	0x74, 0x65, 0x52, 0x11, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70,
-	0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x35, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f,
-	0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x7a, 0x0a, 0x1a,
-	0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73,
-	0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0f, 0x70, 0x72,
-	0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70,
-	0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f,
-	0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
-	0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x22, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74,
-	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e,
-	0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x97, 0x01, 0x0a,
-	0x21, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d,
-	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x72, 0x0a, 0x17, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x72,
-	0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70,
-	0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74,
-	0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52,
-	0x15, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f,
-	0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x6e,
+	0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6e,
 	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12,
-	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
-	0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x24, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54,
+	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x22, 0x27, 0x0a, 0x25, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73,
+	0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x18, 0x4c,
+	0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x22, 0x4e, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31,
+	0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19,
+	0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74,
+	0x73, 0x22, 0x58, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61,
+	0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x59, 0x0a, 0x12, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x43, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75,
+	0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62,
+	0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65,
+	0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x41, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0xa6, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20,
 	0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
 	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
 	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74,
-	0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xb1, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74,
-	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x11, 0x61, 0x6e, 0x61, 0x6c,
-	0x79, 0x73, 0x69, 0x73, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70,
-	0x69, 0x2e, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73,
-	0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x10, 0x61, 0x6e,
-	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x12,
-	0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72,
-	0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x8c, 0x01, 0x0a,
-	0x17, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73,
-	0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72,
-	0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x96, 0x01, 0x0a, 0x18,
-	0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6d,
-	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x33, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b,
-	0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f,
-	0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69,
-	0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65,
-	0x73, 0x75, 0x6c, 0x74, 0x22, 0x79, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74,
-	0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f,
-	0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61,
-	0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22,
-	0xab, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72,
-	0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e,
-	0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x69,
+	0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xd0, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74,
+	0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x04,
+	0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74,
+	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b,
+	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x04, 0x72,
+	0x6f, 0x6c, 0x65, 0x12, 0x58, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
+	0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
+	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
+	0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a,
+	0x03, 0x72, 0x61, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61,
+	0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x52, 0x0a, 0x06, 0x43,
+	0x6c, 0x61, 0x69, 0x6d, 0x73, 0x12, 0x48, 0x0a, 0x06, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
+	0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+	0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x06, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x22,
+	0xfd, 0x01, 0x0a, 0x0c, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f,
+	0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x4b,
+	0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x48, 0x00, 0x52,
+	0x0a, 0x75, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x72,
+	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
+	0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+	0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c,
+	0x73, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74,
+	0x61, 0x69, 0x6c, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22,
+	0x54, 0x0a, 0x0d, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x43, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f,
+	0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61,
+	0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52,
+	0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c,
+	0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f,
+	0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x73, 0x52, 0x65, 0x73,
+	0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb2, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x05,
+	0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69,
 	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
-	0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6c, 0x75, 0x73, 0x74,
-	0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12,
-	0x12, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03,
-	0x72, 0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x25, 0x0a,
-	0x23, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c,
-	0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75,
-	0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70,
-	0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01,
-	0x0a, 0x1a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73,
-	0x69, 0x73, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x6f,
+	0x6c, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
+	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
+	0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
+	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
+	0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x0d,
+	0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
+	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x0b, 0x75,
+	0x73, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x28, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x75, 0x73,
+	0x65, 0x72, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f,
+	0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e,
 	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69,
-	0x2e, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
-	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
-	0x52, 0x18, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
-	0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x7c, 0x0a, 0x21, 0x47, 0x65,
-	0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
-	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
-	0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74,
-	0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xcf, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74,
-	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54,
-	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x8a, 0x01, 0x0a, 0x19, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x6e, 0x61, 0x6c,
-	0x79, 0x73, 0x69, 0x73, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70,
-	0x69, 0x2e, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
-	0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
-	0x65, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c,
-	0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x03,
-	0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77,
-	0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x8e, 0x01, 0x0a, 0x15, 0x47,
-	0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72,
-	0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x16,
-	0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x0c, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73,
-	0x69, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67,
+	0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52,
+	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00,
+	0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c,
+	0x73, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0e,
+	0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43,
+	0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67,
 	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
-	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x75, 0x62, 0x73,
-	0x2e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x48, 0x00,
-	0x52, 0x0b, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x12, 0x12, 0x0a,
-	0x03, 0x72, 0x61, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61,
-	0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x19,
-	0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x4c, 0x6f,
-	0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d,
-	0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61,
-	0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e,
-	0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e,
-	0x61, 0x6d, 0x65, 0x22, 0x32, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73,
-	0x69, 0x73, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x4d, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
-	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x24, 0x44, 0x65, 0x6c, 0x65,
-	0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
-	0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x22, 0x27, 0x0a, 0x25, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c,
-	0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d,
-	0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x0a,
-	0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e,
-	0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x22, 0x4e, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x31, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x19, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f,
-	0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65,
-	0x6e, 0x74, 0x73, 0x22, 0x58, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72,
+	0x6f, 0x6c, 0x65, 0x22, 0x58, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c,
 	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65,
 	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
 	0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
 	0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x59, 0x0a,
-	0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
 	0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
 	0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61,
 	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e,
 	0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f,
-	0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x41, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65,
-	0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
-	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0xa6, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12,
-	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x73, 0x52, 0x65, 0x73, 0x6f,
-	0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
-	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x6f, 0x72, 0x6d,
-	0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xd0, 0x01, 0x0a, 0x0f, 0x47,
-	0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45,
-	0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67,
-	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
-	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x48, 0x00, 0x52,
-	0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x58, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75,
-	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72,
-	0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x73, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12,
-	0x12, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03,
-	0x72, 0x61, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x52, 0x0a,
-	0x06, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x12, 0x48, 0x0a, 0x06, 0x63, 0x6c, 0x61, 0x69, 0x6d,
-	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
-	0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67,
-	0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x06, 0x63, 0x6c, 0x61, 0x69, 0x6d,
-	0x73, 0x22, 0xfd, 0x01, 0x0a, 0x0c, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04,
-	0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65,
-	0x12, 0x4b, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
-	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x48,
-	0x00, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x12, 0x67, 0x0a,
-	0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c,
-	0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
-	0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67,
-	0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61,
-	0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44,
-	0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x22, 0x54, 0x0a, 0x0d, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b,
-	0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72,
-	0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c,
-	0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52,
-	0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70,
-	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72,
-	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f,
-	0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x73, 0x52,
-	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb2, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73,
-	0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45,
-	0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e,
-	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
-	0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05,
-	0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75,
-	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72,
-	0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xfe, 0x01,
-	0x0a, 0x0d, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c,
-	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x4b, 0x0a,
-	0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
-	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0a,
-	0x75, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x72, 0x65,
-	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
-	0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61,
-	0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73,
-	0x48, 0x00, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61,
-	0x69, 0x6c, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55,
-	0x0a, 0x0e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x43, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f,
-	0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69,
-	0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61,
-	0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52,
-	0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x58, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52,
-	0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x04, 0x72, 0x6f,
-	0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75,
-	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72,
-	0x67, 0x6f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22,
-	0x59, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x61, 0x70,
-	0x69, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-	0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x2a, 0x51, 0x0a, 0x09, 0x52, 0x61,
-	0x77, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x41, 0x57, 0x5f, 0x46,
-	0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
-	0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x41, 0x57, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41,
-	0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x41, 0x57, 0x5f,
-	0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x59, 0x41, 0x4d, 0x4c, 0x10, 0x02, 0x32, 0xa1, 0x45,
-	0x0a, 0x0c, 0x4b, 0x61, 0x72, 0x67, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x83,
-	0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66,
-	0x6f, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49,
-	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65,
-	0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69,
-	0x67, 0x12, 0x32, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
-	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66,
-	0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x0f, 0x47,
-	0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x38,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
-	0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69,
-	0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
-	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50,
-	0x75, 0x62, 0x6c, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x4c, 0x6f, 0x67, 0x69,
-	0x6e, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x4c,
-	0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a,
-	0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12,
+	0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x2a, 0x51, 0x0a, 0x09, 0x52, 0x61, 0x77, 0x46,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x41, 0x57, 0x5f, 0x46, 0x4f, 0x52,
+	0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
+	0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x41, 0x57, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f,
+	0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x41, 0x57, 0x5f, 0x46, 0x4f,
+	0x52, 0x4d, 0x41, 0x54, 0x5f, 0x59, 0x41, 0x4d, 0x4c, 0x10, 0x02, 0x32, 0xc2, 0x47, 0x0a, 0x0c,
+	0x4b, 0x61, 0x72, 0x67, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x83, 0x01, 0x0a,
+	0x0e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12,
 	0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
 	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66,
+	0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
 	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3f, 0x2e,
+	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x74, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
+	0x32, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74,
+	0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x38, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+	0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62,
+	0x6c, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x77, 0x0a, 0x0a, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12,
+	0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x4c, 0x6f, 0x67,
+	0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x37, 0x2e,
 	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
 	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52,
-	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
-	0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
 	0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x83, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75,
-	0x72, 0x63, 0x65, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73,
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61,
+	0x12, 0x9b, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3f, 0x2e, 0x61, 0x6b,
+	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73,
+	0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x61,
 	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
 	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69,
-	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
-	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c,
-	0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
-	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f,
-	0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a,
-	0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75,
+	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65,
+	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83,
+	0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
+	0x65, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75,
+	0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75,
 	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69,
-	0x73, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x34, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
-	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61,
-	0x67, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65,
-	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
+	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
+	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x4c, 0x69,
+	0x73, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
 	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
 	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74,
-	0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71,
-	0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x31, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65,
-	0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e,
+	0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e,
 	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
 	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x7c, 0x0a, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73,
-	0x12, 0x34, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
-	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65,
+	0x73, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
 	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53,
-	0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12,
-	0x7a, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x34,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d,
+	0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x08,
+	0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x31, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53,
+	0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x6b,
+	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47,
+	0x65, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x7c, 0x0a, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x12, 0x34,
 	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
 	0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71,
+	0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71,
 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
 	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74,
-	0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x0c, 0x52,
-	0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x35, 0x2e, 0x61, 0x6b,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61,
+	0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x7a, 0x0a,
+	0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x34, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
+	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x67,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x0c, 0x52, 0x65, 0x66,
+	0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66,
+	0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x36, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73,
+	0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x2e, 0x61, 0x6b,
 	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52,
-	0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x36, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c,
+	0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d,
+	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88,
+	0x01, 0x0a, 0x0f, 0x57, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x12, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
 	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61,
-	0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x4c,
-	0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x2e,
-	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
-	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72,
-	0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x88, 0x01, 0x0a, 0x0f, 0x57, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6d, 0x6f,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+	0x57, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x7d, 0x0a, 0x0c, 0x47, 0x65, 0x74,
+	0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74,
+	0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x36, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x0e, 0x57, 0x61, 0x74,
+	0x63, 0x68, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x2e, 0x61, 0x6b,
+	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57,
+	0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
 	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
 	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f,
-	0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
-	0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x7d, 0x0a, 0x0c, 0x47,
-	0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x61, 0x6b,
+	0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01,
+	0x12, 0x83, 0x01, 0x0a, 0x0e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6d,
+	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+	0x41, 0x62, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x36, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x47, 0x65, 0x74,
+	0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
+	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+	0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x7d, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x73, 0x12, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
+	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73,
+	0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x92, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
+	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x2e, 0x61, 0x6b,
 	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
 	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47,
-	0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x36, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
-	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x0e, 0x57,
-	0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x2e,
-	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
-	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
 	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x50,
-	0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x30, 0x01, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6d,
-	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f,
+	0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x46, 0x72,
+	0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
 	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x50, 0x72,
-	0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
+	0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38,
 	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
 	0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e,
+	0x31, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74,
 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c,
-	0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x36, 0x2e, 0x61, 0x6b, 0x75,
+	0x65, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x36, 0x2e, 0x61, 0x6b, 0x75,
 	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
 	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
 	0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
 	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x47,
-	0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69,
+	0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x47,
+	0x65, 0x74, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69,
 	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
 	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74,
-	0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34,
+	0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34,
 	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
 	0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
-	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x61, 0x6b,
-	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c,
-	0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x46,
-	0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76,
-	0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
-	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x36, 0x2e, 0x61, 0x6b,
-	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x65,
-	0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a,
-	0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65,
-	0x74, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x34, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
-	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
-	0x65, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
-	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d,
-	0x6f, 0x74, 0x65, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x6f, 0x53, 0x74,
-	0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x11,
-	0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61,
-	0x6d, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e,
-	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e,
-	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
-	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65,
-	0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x0c, 0x51, 0x75,
-	0x65, 0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x35, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75,
-	0x65, 0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x36, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x12, 0x55, 0x70,
-	0x64, 0x61, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73,
-	0x12, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
-	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68,
-	0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e,
-	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
-	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c,
-	0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x08, 0x52,
-	0x65, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
+	0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65,
+	0x54, 0x6f, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
 	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72,
-	0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65,
-	0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8c,
-	0x01, 0x0a, 0x11, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
-	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x56, 0x65, 0x72,
-	0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f,
+	0x74, 0x65, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
 	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01,
-	0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73,
-	0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x6f, 0x53, 0x74, 0x61,
+	0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x50,
+	0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
 	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73,
-	0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73,
+	0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+	0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x0c, 0x51, 0x75, 0x65,
+	0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69,
 	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
-	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73,
-	0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f,
-	0x75, 0x73, 0x65, 0x12, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f,
-	0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65,
-	0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x0f, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x61, 0x72, 0x65,
-	0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x12, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57,
-	0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x39, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65,
+	0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x36, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
 	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75,
-	0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x86, 0x01,
-	0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73,
-	0x65, 0x12, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x72, 0x65, 0x68,
-	0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x61, 0x6b,
-	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x72, 0x65,
-	0x73, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x12, 0x39, 0x2e, 0x61, 0x6b,
-	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52,
-	0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12,
+	0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74,
+	0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x61,
+	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x72, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6c, 0x69,
+	0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x08, 0x52, 0x65,
+	0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
 	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73,
-	0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65,
-	0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x69,
+	0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76,
+	0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8c, 0x01,
+	0x0a, 0x11, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x56, 0x65, 0x72, 0x69,
+	0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a,
+	0x0e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x12,
+	0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
 	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
-	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x72,
-	0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64,
+	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+	0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x7d, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75,
+	0x73, 0x65, 0x12, 0x35, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
+	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75,
+	0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74,
+	0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x88, 0x01, 0x0a, 0x0f, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68,
+	0x6f, 0x75, 0x73, 0x65, 0x73, 0x12, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x61,
+	0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x39, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73,
+	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x86, 0x01, 0x0a,
+	0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65,
+	0x12, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f,
+	0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x61, 0x6b, 0x75,
+	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73,
+	0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x12, 0x39, 0x2e, 0x61, 0x6b, 0x75,
+	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65,
+	0x66, 0x72, 0x65, 0x73, 0x68, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68,
+	0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64,
 	0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
 	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
 	0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75,
 	0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
 	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65,
 	0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x83, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69,
-	0x61, 0x6c, 0x73, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e,
-	0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61,
-	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
-	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-	0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43,
-	0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x38, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69,
-	0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
-	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64,
+	0x12, 0x8c, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65,
+	0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
+	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64,
 	0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x8c, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e,
-	0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
-	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43,
-	0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65,
-	0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f,
-	0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65,
-	0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
-	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
+	0x83, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61,
+	0x6c, 0x73, 0x12, 0x37, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
 	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
-	0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x92, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
-	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
-	0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
-	0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x3c, 0x2e,
-	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
-	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65,
-	0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x61, 0x6b,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74,
+	0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b,
 	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72,
-	0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x13, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72,
-	0x65, 0x74, 0x12, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
-	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x3d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
-	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
-	0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x98, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
-	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x3e, 0x2e, 0x61, 0x6b, 0x75, 0x69,
-	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
-	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73,
-	0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
-	0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47,
+	0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72,
+	0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69,
 	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
 	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73,
-	0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
-	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x13, 0x47,
-	0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
-	0x74, 0x65, 0x12, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
-	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
-	0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x3d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65,
+	0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8c,
+	0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74,
+	0x69, 0x61, 0x6c, 0x73, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72,
+	0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
 	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54,
-	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x9b, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73,
-	0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70,
-	0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x61, 0x6b,
-	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d,
-	0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xad, 0x01,
-	0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61,
-	0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x45,
-	0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f,
-	0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61,
-	0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e,
+	0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01,
+	0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63,
+	0x72, 0x65, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+	0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x92, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
+	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
 	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75,
-	0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70,
-	0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa7, 0x01,
-	0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c,
-	0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x43, 0x2e, 0x61,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x3c, 0x2e, 0x61,
 	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
 	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-	0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73,
-	0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x44, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63,
+	0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x61, 0x6b, 0x75,
+	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x13, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65,
+	0x74, 0x12, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
 	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41,
-	0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xb0, 0x01, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65,
-	0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
-	0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x46, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x3d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+	0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x98,
+	0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54,
+	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x3e, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x13, 0x47, 0x65,
+	0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
+	0x65, 0x12, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
+	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x3d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65,
+	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9b,
+	0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
+	0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x2e, 0x61, 0x6b, 0x75, 0x69,
 	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
 	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c,
-	0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73,
-	0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x47, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74,
-	0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
-	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x47,
-	0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x12, 0x37, 0x2e,
+	0x65, 0x74, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x61, 0x6b, 0x75,
+	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70,
+	0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xad, 0x01, 0x0a,
+	0x1c, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c,
+	0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x45, 0x2e,
 	0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e,
 	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61,
-	0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x91, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
-	0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
-	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e,
-	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
-	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79,
-	0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x30, 0x01, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69,
-	0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72,
-	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d,
-	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3b, 0x2e, 0x61, 0x6b, 0x75,
-	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69,
-	0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
-	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50,
-	0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa4, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c,
-	0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61,
-	0x73, 0x6b, 0x73, 0x12, 0x42, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
-	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74,
-	0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
-	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43,
-	0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54,
-	0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x89, 0x01, 0x0a,
-	0x10, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73,
-	0x6b, 0x12, 0x39, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f,
-	0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x61,
-	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
-	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-	0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74,
-	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e,
-	0x54, 0x61, 0x73, 0x6b, 0x12, 0x40, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c,
+	0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
 	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74,
-	0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75,
-	0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73,
-	0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x43, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
-	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
-	0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73,
+	0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c,
+	0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa7, 0x01, 0x0a,
+	0x1a, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79,
+	0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x43, 0x2e, 0x61, 0x6b,
+	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47,
+	0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
+	0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x44, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e,
+	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xb0, 0x01, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
+	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x46, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
+	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
+	0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x47, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
+	0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x47, 0x65,
+	0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x12, 0x37, 0x2e, 0x61,
 	0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73,
 	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65,
-	0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
-	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
 	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
-	0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x07, 0x47,
-	0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c,
+	0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x91, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52,
+	0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
 	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74,
-	0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52,
-	0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x05, 0x47,
-	0x72, 0x61, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
-	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
-	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c,
-	0x65, 0x73, 0x12, 0x32, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61,
+	0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73,
+	0x69, 0x73, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x30, 0x01, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3a, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73,
+	0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f,
+	0x6a, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f,
+	0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3b, 0x2e, 0x61, 0x6b, 0x75, 0x69,
+	0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73,
+	0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72,
+	0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa4, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75,
+	0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73,
+	0x6b, 0x73, 0x12, 0x42, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b,
 	0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61,
-	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
+	0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
 	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f,
-	0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x06, 0x52,
-	0x65, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x2f, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c,
+	0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61,
+	0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x10,
+	0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b,
+	0x12, 0x39, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e,
+	0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x61, 0x6b,
+	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47,
+	0x65, 0x74, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43,
+	0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54,
+	0x61, 0x73, 0x6b, 0x12, 0x40, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
+	0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
 	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
-	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73,
+	0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61,
 	0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
 	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
 	0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x6b,
 	0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x42, 0x93, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x77, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12,
+	0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67,
+	0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f,
+	0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x07, 0x47, 0x65,
+	0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79,
 	0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76,
-	0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68,
-	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2f, 0x6b, 0x61,
-	0x72, 0x67, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x73, 0x76, 0x63, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x41, 0x49, 0x4b, 0x53, 0xaa, 0x02, 0x20, 0x41, 0x6b,
-	0x75, 0x69, 0x74, 0x79, 0x2e, 0x49, 0x6f, 0x2e, 0x4b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x53, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02,
-	0x20, 0x41, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x5c, 0x49, 0x6f, 0x5c, 0x4b, 0x61, 0x72, 0x67, 0x6f,
-	0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0xe2, 0x02, 0x2c, 0x41, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x5c, 0x49, 0x6f, 0x5c, 0x4b, 0x61,
-	0x72, 0x67, 0x6f, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
-	0xea, 0x02, 0x24, 0x41, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x3a, 0x3a, 0x49, 0x6f, 0x3a, 0x3a, 0x4b,
-	0x61, 0x72, 0x67, 0x6f, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x3a, 0x56,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f,
+	0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x05, 0x47, 0x72,
+	0x61, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e,
+	0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65,
+	0x73, 0x12, 0x32, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61,
+	0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c,
+	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x06, 0x52, 0x65,
+	0x76, 0x6f, 0x6b, 0x65, 0x12, 0x2f, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f,
+	0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x33, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x69,
+	0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52,
+	0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x6b, 0x75,
+	0x69, 0x74, 0x79, 0x2e, 0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x42, 0x93, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2e,
+	0x69, 0x6f, 0x2e, 0x6b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75,
+	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x2f, 0x6b, 0x61, 0x72,
+	0x67, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x73, 0x76, 0x63, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x41, 0x49, 0x4b, 0x53, 0xaa, 0x02, 0x20, 0x41, 0x6b, 0x75,
+	0x69, 0x74, 0x79, 0x2e, 0x49, 0x6f, 0x2e, 0x4b, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x20,
+	0x41, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x5c, 0x49, 0x6f, 0x5c, 0x4b, 0x61, 0x72, 0x67, 0x6f, 0x5c,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0xe2, 0x02, 0x2c, 0x41, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x5c, 0x49, 0x6f, 0x5c, 0x4b, 0x61, 0x72,
+	0x67, 0x6f, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,
+	0x02, 0x24, 0x41, 0x6b, 0x75, 0x69, 0x74, 0x79, 0x3a, 0x3a, 0x49, 0x6f, 0x3a, 0x3a, 0x4b, 0x61,
+	0x72, 0x67, 0x6f, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x3a, 0x56, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -9667,7 +9928,7 @@ func file_api_service_v1alpha1_service_proto_rawDescGZIP() []byte {
 }
 
 var file_api_service_v1alpha1_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_api_service_v1alpha1_service_proto_msgTypes = make([]protoimpl.MessageInfo, 149)
+var file_api_service_v1alpha1_service_proto_msgTypes = make([]protoimpl.MessageInfo, 153)
 var file_api_service_v1alpha1_service_proto_goTypes = []interface{}{
 	(RawFormat)(0),                                // 0: akuity.io.kargo.service.v1alpha1.RawFormat
 	(*ComponentVersions)(nil),                     // 1: akuity.io.kargo.service.v1alpha1.ComponentVersions
@@ -9720,341 +9981,352 @@ var file_api_service_v1alpha1_service_proto_goTypes = []interface{}{
 	(*AbortPromotionResponse)(nil),                // 48: akuity.io.kargo.service.v1alpha1.AbortPromotionResponse
 	(*DeleteProjectRequest)(nil),                  // 49: akuity.io.kargo.service.v1alpha1.DeleteProjectRequest
 	(*DeleteProjectResponse)(nil),                 // 50: akuity.io.kargo.service.v1alpha1.DeleteProjectResponse
-	(*GetProjectRequest)(nil),                     // 51: akuity.io.kargo.service.v1alpha1.GetProjectRequest
-	(*GetProjectResponse)(nil),                    // 52: akuity.io.kargo.service.v1alpha1.GetProjectResponse
-	(*ListProjectsRequest)(nil),                   // 53: akuity.io.kargo.service.v1alpha1.ListProjectsRequest
-	(*ListProjectsResponse)(nil),                  // 54: akuity.io.kargo.service.v1alpha1.ListProjectsResponse
-	(*ApproveFreightRequest)(nil),                 // 55: akuity.io.kargo.service.v1alpha1.ApproveFreightRequest
-	(*ApproveFreightResponse)(nil),                // 56: akuity.io.kargo.service.v1alpha1.ApproveFreightResponse
-	(*DeleteFreightRequest)(nil),                  // 57: akuity.io.kargo.service.v1alpha1.DeleteFreightRequest
-	(*DeleteFreightResponse)(nil),                 // 58: akuity.io.kargo.service.v1alpha1.DeleteFreightResponse
-	(*GetFreightRequest)(nil),                     // 59: akuity.io.kargo.service.v1alpha1.GetFreightRequest
-	(*GetFreightResponse)(nil),                    // 60: akuity.io.kargo.service.v1alpha1.GetFreightResponse
-	(*PromoteToStageRequest)(nil),                 // 61: akuity.io.kargo.service.v1alpha1.PromoteToStageRequest
-	(*PromoteToStageResponse)(nil),                // 62: akuity.io.kargo.service.v1alpha1.PromoteToStageResponse
-	(*PromoteDownstreamRequest)(nil),              // 63: akuity.io.kargo.service.v1alpha1.PromoteDownstreamRequest
-	(*PromoteDownstreamResponse)(nil),             // 64: akuity.io.kargo.service.v1alpha1.PromoteDownstreamResponse
-	(*QueryFreightRequest)(nil),                   // 65: akuity.io.kargo.service.v1alpha1.QueryFreightRequest
-	(*QueryFreightResponse)(nil),                  // 66: akuity.io.kargo.service.v1alpha1.QueryFreightResponse
-	(*FreightList)(nil),                           // 67: akuity.io.kargo.service.v1alpha1.FreightList
-	(*UpdateFreightAliasRequest)(nil),             // 68: akuity.io.kargo.service.v1alpha1.UpdateFreightAliasRequest
-	(*UpdateFreightAliasResponse)(nil),            // 69: akuity.io.kargo.service.v1alpha1.UpdateFreightAliasResponse
-	(*ReverifyRequest)(nil),                       // 70: akuity.io.kargo.service.v1alpha1.ReverifyRequest
-	(*ReverifyResponse)(nil),                      // 71: akuity.io.kargo.service.v1alpha1.ReverifyResponse
-	(*AbortVerificationRequest)(nil),              // 72: akuity.io.kargo.service.v1alpha1.AbortVerificationRequest
-	(*AbortVerificationResponse)(nil),             // 73: akuity.io.kargo.service.v1alpha1.AbortVerificationResponse
-	(*ListWarehousesRequest)(nil),                 // 74: akuity.io.kargo.service.v1alpha1.ListWarehousesRequest
-	(*ListWarehousesResponse)(nil),                // 75: akuity.io.kargo.service.v1alpha1.ListWarehousesResponse
-	(*GetWarehouseRequest)(nil),                   // 76: akuity.io.kargo.service.v1alpha1.GetWarehouseRequest
-	(*GetWarehouseResponse)(nil),                  // 77: akuity.io.kargo.service.v1alpha1.GetWarehouseResponse
-	(*WatchWarehousesRequest)(nil),                // 78: akuity.io.kargo.service.v1alpha1.WatchWarehousesRequest
-	(*WatchWarehousesResponse)(nil),               // 79: akuity.io.kargo.service.v1alpha1.WatchWarehousesResponse
-	(*DeleteWarehouseRequest)(nil),                // 80: akuity.io.kargo.service.v1alpha1.DeleteWarehouseRequest
-	(*DeleteWarehouseResponse)(nil),               // 81: akuity.io.kargo.service.v1alpha1.DeleteWarehouseResponse
-	(*RefreshWarehouseRequest)(nil),               // 82: akuity.io.kargo.service.v1alpha1.RefreshWarehouseRequest
-	(*RefreshWarehouseResponse)(nil),              // 83: akuity.io.kargo.service.v1alpha1.RefreshWarehouseResponse
-	(*ListProjectSecretsRequest)(nil),             // 84: akuity.io.kargo.service.v1alpha1.ListProjectSecretsRequest
-	(*ListProjectSecretsResponse)(nil),            // 85: akuity.io.kargo.service.v1alpha1.ListProjectSecretsResponse
-	(*CreateProjectSecretRequest)(nil),            // 86: akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest
-	(*CreateProjectSecretResponse)(nil),           // 87: akuity.io.kargo.service.v1alpha1.CreateProjectSecretResponse
-	(*UpdateProjectSecretRequest)(nil),            // 88: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest
-	(*UpdateProjectSecretResponse)(nil),           // 89: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretResponse
-	(*DeleteProjectSecretRequest)(nil),            // 90: akuity.io.kargo.service.v1alpha1.DeleteProjectSecretRequest
-	(*DeleteProjectSecretResponse)(nil),           // 91: akuity.io.kargo.service.v1alpha1.DeleteProjectSecretResponse
-	(*CreateCredentialsRequest)(nil),              // 92: akuity.io.kargo.service.v1alpha1.CreateCredentialsRequest
-	(*CreateCredentialsResponse)(nil),             // 93: akuity.io.kargo.service.v1alpha1.CreateCredentialsResponse
-	(*DeleteCredentialsRequest)(nil),              // 94: akuity.io.kargo.service.v1alpha1.DeleteCredentialsRequest
-	(*DeleteCredentialsResponse)(nil),             // 95: akuity.io.kargo.service.v1alpha1.DeleteCredentialsResponse
-	(*GetCredentialsRequest)(nil),                 // 96: akuity.io.kargo.service.v1alpha1.GetCredentialsRequest
-	(*GetCredentialsResponse)(nil),                // 97: akuity.io.kargo.service.v1alpha1.GetCredentialsResponse
-	(*ListCredentialsRequest)(nil),                // 98: akuity.io.kargo.service.v1alpha1.ListCredentialsRequest
-	(*ListCredentialsResponse)(nil),               // 99: akuity.io.kargo.service.v1alpha1.ListCredentialsResponse
-	(*UpdateCredentialsRequest)(nil),              // 100: akuity.io.kargo.service.v1alpha1.UpdateCredentialsRequest
-	(*UpdateCredentialsResponse)(nil),             // 101: akuity.io.kargo.service.v1alpha1.UpdateCredentialsResponse
-	(*ListAnalysisTemplatesRequest)(nil),          // 102: akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesRequest
-	(*ListAnalysisTemplatesResponse)(nil),         // 103: akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesResponse
-	(*ListPromotionTasksRequest)(nil),             // 104: akuity.io.kargo.service.v1alpha1.ListPromotionTasksRequest
-	(*ListPromotionTasksResponse)(nil),            // 105: akuity.io.kargo.service.v1alpha1.ListPromotionTasksResponse
-	(*ListClusterPromotionTasksRequest)(nil),      // 106: akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksRequest
-	(*ListClusterPromotionTasksResponse)(nil),     // 107: akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksResponse
-	(*GetAnalysisTemplateRequest)(nil),            // 108: akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateRequest
-	(*GetAnalysisTemplateResponse)(nil),           // 109: akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateResponse
-	(*GetPromotionTaskRequest)(nil),               // 110: akuity.io.kargo.service.v1alpha1.GetPromotionTaskRequest
-	(*GetPromotionTaskResponse)(nil),              // 111: akuity.io.kargo.service.v1alpha1.GetPromotionTaskResponse
-	(*GetClusterPromotionTaskRequest)(nil),        // 112: akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskRequest
-	(*GetClusterPromotionTaskResponse)(nil),       // 113: akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskResponse
-	(*ListClusterAnalysisTemplatesRequest)(nil),   // 114: akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesRequest
-	(*ListClusterAnalysisTemplatesResponse)(nil),  // 115: akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesResponse
-	(*GetClusterAnalysisTemplateRequest)(nil),     // 116: akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateRequest
-	(*GetClusterAnalysisTemplateResponse)(nil),    // 117: akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateResponse
-	(*GetAnalysisRunRequest)(nil),                 // 118: akuity.io.kargo.service.v1alpha1.GetAnalysisRunRequest
-	(*GetAnalysisRunResponse)(nil),                // 119: akuity.io.kargo.service.v1alpha1.GetAnalysisRunResponse
-	(*GetAnalysisRunLogsRequest)(nil),             // 120: akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsRequest
-	(*GetAnalysisRunLogsResponse)(nil),            // 121: akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsResponse
-	(*DeleteAnalysisTemplateRequest)(nil),         // 122: akuity.io.kargo.service.v1alpha1.DeleteAnalysisTemplateRequest
-	(*DeleteAnalysisTemplateResponse)(nil),        // 123: akuity.io.kargo.service.v1alpha1.DeleteAnalysisTemplateResponse
-	(*DeleteClusterAnalysisTemplateRequest)(nil),  // 124: akuity.io.kargo.service.v1alpha1.DeleteClusterAnalysisTemplateRequest
-	(*DeleteClusterAnalysisTemplateResponse)(nil), // 125: akuity.io.kargo.service.v1alpha1.DeleteClusterAnalysisTemplateResponse
-	(*ListProjectEventsRequest)(nil),              // 126: akuity.io.kargo.service.v1alpha1.ListProjectEventsRequest
-	(*ListProjectEventsResponse)(nil),             // 127: akuity.io.kargo.service.v1alpha1.ListProjectEventsResponse
-	(*CreateRoleRequest)(nil),                     // 128: akuity.io.kargo.service.v1alpha1.CreateRoleRequest
-	(*CreateRoleResponse)(nil),                    // 129: akuity.io.kargo.service.v1alpha1.CreateRoleResponse
-	(*DeleteRoleRequest)(nil),                     // 130: akuity.io.kargo.service.v1alpha1.DeleteRoleRequest
-	(*DeleteRoleResponse)(nil),                    // 131: akuity.io.kargo.service.v1alpha1.DeleteRoleResponse
-	(*GetRoleRequest)(nil),                        // 132: akuity.io.kargo.service.v1alpha1.GetRoleRequest
-	(*GetRoleResponse)(nil),                       // 133: akuity.io.kargo.service.v1alpha1.GetRoleResponse
-	(*Claims)(nil),                                // 134: akuity.io.kargo.service.v1alpha1.Claims
-	(*GrantRequest)(nil),                          // 135: akuity.io.kargo.service.v1alpha1.GrantRequest
-	(*GrantResponse)(nil),                         // 136: akuity.io.kargo.service.v1alpha1.GrantResponse
-	(*ListRolesRequest)(nil),                      // 137: akuity.io.kargo.service.v1alpha1.ListRolesRequest
-	(*ListRolesResponse)(nil),                     // 138: akuity.io.kargo.service.v1alpha1.ListRolesResponse
-	(*RevokeRequest)(nil),                         // 139: akuity.io.kargo.service.v1alpha1.RevokeRequest
-	(*RevokeResponse)(nil),                        // 140: akuity.io.kargo.service.v1alpha1.RevokeResponse
-	(*UpdateRoleRequest)(nil),                     // 141: akuity.io.kargo.service.v1alpha1.UpdateRoleRequest
-	(*UpdateRoleResponse)(nil),                    // 142: akuity.io.kargo.service.v1alpha1.UpdateRoleResponse
-	nil,                                           // 143: akuity.io.kargo.service.v1alpha1.GetConfigResponse.ArgocdShardsEntry
-	nil,                                           // 144: akuity.io.kargo.service.v1alpha1.ListImagesResponse.ImagesEntry
-	nil,                                           // 145: akuity.io.kargo.service.v1alpha1.TagMap.TagsEntry
-	nil,                                           // 146: akuity.io.kargo.service.v1alpha1.ImageStageMap.StagesEntry
-	nil,                                           // 147: akuity.io.kargo.service.v1alpha1.QueryFreightResponse.GroupsEntry
-	nil,                                           // 148: akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest.DataEntry
-	nil,                                           // 149: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest.DataEntry
-	(*timestamppb.Timestamp)(nil),                 // 150: google.protobuf.Timestamp
-	(*v1alpha1.Stage)(nil),                        // 151: github.com.akuity.kargo.api.v1alpha1.Stage
-	(*v1alpha1.Promotion)(nil),                    // 152: github.com.akuity.kargo.api.v1alpha1.Promotion
-	(*v1alpha1.Project)(nil),                      // 153: github.com.akuity.kargo.api.v1alpha1.Project
-	(*v1alpha1.Freight)(nil),                      // 154: github.com.akuity.kargo.api.v1alpha1.Freight
-	(*v1alpha1.Warehouse)(nil),                    // 155: github.com.akuity.kargo.api.v1alpha1.Warehouse
-	(*v1.Secret)(nil),                             // 156: k8s.io.api.core.v1.Secret
-	(*v1alpha11.AnalysisTemplate)(nil),            // 157: github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisTemplate
-	(*v1alpha1.PromotionTask)(nil),                // 158: github.com.akuity.kargo.api.v1alpha1.PromotionTask
-	(*v1alpha1.ClusterPromotionTask)(nil),         // 159: github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask
-	(*v1alpha11.ClusterAnalysisTemplate)(nil),     // 160: github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.ClusterAnalysisTemplate
-	(*v1alpha11.AnalysisRun)(nil),                 // 161: github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisRun
-	(*v1.Event)(nil),                              // 162: k8s.io.api.core.v1.Event
-	(*v1alpha12.Role)(nil),                        // 163: github.com.akuity.kargo.api.rbac.v1alpha1.Role
-	(*v1alpha12.RoleResources)(nil),               // 164: github.com.akuity.kargo.api.rbac.v1alpha1.RoleResources
-	(*v1alpha12.Claim)(nil),                       // 165: github.com.akuity.kargo.api.rbac.v1alpha1.Claim
-	(*v1alpha12.ResourceDetails)(nil),             // 166: github.com.akuity.kargo.api.rbac.v1alpha1.ResourceDetails
+	(*DeleteProjectConfigRequest)(nil),            // 51: akuity.io.kargo.service.v1alpha1.DeleteProjectConfigRequest
+	(*DeleteProjectConfigResponse)(nil),           // 52: akuity.io.kargo.service.v1alpha1.DeleteProjectConfigResponse
+	(*GetProjectConfigRequest)(nil),               // 53: akuity.io.kargo.service.v1alpha1.GetProjectConfigRequest
+	(*GetProjectConfigResponse)(nil),              // 54: akuity.io.kargo.service.v1alpha1.GetProjectConfigResponse
+	(*GetProjectRequest)(nil),                     // 55: akuity.io.kargo.service.v1alpha1.GetProjectRequest
+	(*GetProjectResponse)(nil),                    // 56: akuity.io.kargo.service.v1alpha1.GetProjectResponse
+	(*ListProjectsRequest)(nil),                   // 57: akuity.io.kargo.service.v1alpha1.ListProjectsRequest
+	(*ListProjectsResponse)(nil),                  // 58: akuity.io.kargo.service.v1alpha1.ListProjectsResponse
+	(*ApproveFreightRequest)(nil),                 // 59: akuity.io.kargo.service.v1alpha1.ApproveFreightRequest
+	(*ApproveFreightResponse)(nil),                // 60: akuity.io.kargo.service.v1alpha1.ApproveFreightResponse
+	(*DeleteFreightRequest)(nil),                  // 61: akuity.io.kargo.service.v1alpha1.DeleteFreightRequest
+	(*DeleteFreightResponse)(nil),                 // 62: akuity.io.kargo.service.v1alpha1.DeleteFreightResponse
+	(*GetFreightRequest)(nil),                     // 63: akuity.io.kargo.service.v1alpha1.GetFreightRequest
+	(*GetFreightResponse)(nil),                    // 64: akuity.io.kargo.service.v1alpha1.GetFreightResponse
+	(*PromoteToStageRequest)(nil),                 // 65: akuity.io.kargo.service.v1alpha1.PromoteToStageRequest
+	(*PromoteToStageResponse)(nil),                // 66: akuity.io.kargo.service.v1alpha1.PromoteToStageResponse
+	(*PromoteDownstreamRequest)(nil),              // 67: akuity.io.kargo.service.v1alpha1.PromoteDownstreamRequest
+	(*PromoteDownstreamResponse)(nil),             // 68: akuity.io.kargo.service.v1alpha1.PromoteDownstreamResponse
+	(*QueryFreightRequest)(nil),                   // 69: akuity.io.kargo.service.v1alpha1.QueryFreightRequest
+	(*QueryFreightResponse)(nil),                  // 70: akuity.io.kargo.service.v1alpha1.QueryFreightResponse
+	(*FreightList)(nil),                           // 71: akuity.io.kargo.service.v1alpha1.FreightList
+	(*UpdateFreightAliasRequest)(nil),             // 72: akuity.io.kargo.service.v1alpha1.UpdateFreightAliasRequest
+	(*UpdateFreightAliasResponse)(nil),            // 73: akuity.io.kargo.service.v1alpha1.UpdateFreightAliasResponse
+	(*ReverifyRequest)(nil),                       // 74: akuity.io.kargo.service.v1alpha1.ReverifyRequest
+	(*ReverifyResponse)(nil),                      // 75: akuity.io.kargo.service.v1alpha1.ReverifyResponse
+	(*AbortVerificationRequest)(nil),              // 76: akuity.io.kargo.service.v1alpha1.AbortVerificationRequest
+	(*AbortVerificationResponse)(nil),             // 77: akuity.io.kargo.service.v1alpha1.AbortVerificationResponse
+	(*ListWarehousesRequest)(nil),                 // 78: akuity.io.kargo.service.v1alpha1.ListWarehousesRequest
+	(*ListWarehousesResponse)(nil),                // 79: akuity.io.kargo.service.v1alpha1.ListWarehousesResponse
+	(*GetWarehouseRequest)(nil),                   // 80: akuity.io.kargo.service.v1alpha1.GetWarehouseRequest
+	(*GetWarehouseResponse)(nil),                  // 81: akuity.io.kargo.service.v1alpha1.GetWarehouseResponse
+	(*WatchWarehousesRequest)(nil),                // 82: akuity.io.kargo.service.v1alpha1.WatchWarehousesRequest
+	(*WatchWarehousesResponse)(nil),               // 83: akuity.io.kargo.service.v1alpha1.WatchWarehousesResponse
+	(*DeleteWarehouseRequest)(nil),                // 84: akuity.io.kargo.service.v1alpha1.DeleteWarehouseRequest
+	(*DeleteWarehouseResponse)(nil),               // 85: akuity.io.kargo.service.v1alpha1.DeleteWarehouseResponse
+	(*RefreshWarehouseRequest)(nil),               // 86: akuity.io.kargo.service.v1alpha1.RefreshWarehouseRequest
+	(*RefreshWarehouseResponse)(nil),              // 87: akuity.io.kargo.service.v1alpha1.RefreshWarehouseResponse
+	(*ListProjectSecretsRequest)(nil),             // 88: akuity.io.kargo.service.v1alpha1.ListProjectSecretsRequest
+	(*ListProjectSecretsResponse)(nil),            // 89: akuity.io.kargo.service.v1alpha1.ListProjectSecretsResponse
+	(*CreateProjectSecretRequest)(nil),            // 90: akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest
+	(*CreateProjectSecretResponse)(nil),           // 91: akuity.io.kargo.service.v1alpha1.CreateProjectSecretResponse
+	(*UpdateProjectSecretRequest)(nil),            // 92: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest
+	(*UpdateProjectSecretResponse)(nil),           // 93: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretResponse
+	(*DeleteProjectSecretRequest)(nil),            // 94: akuity.io.kargo.service.v1alpha1.DeleteProjectSecretRequest
+	(*DeleteProjectSecretResponse)(nil),           // 95: akuity.io.kargo.service.v1alpha1.DeleteProjectSecretResponse
+	(*CreateCredentialsRequest)(nil),              // 96: akuity.io.kargo.service.v1alpha1.CreateCredentialsRequest
+	(*CreateCredentialsResponse)(nil),             // 97: akuity.io.kargo.service.v1alpha1.CreateCredentialsResponse
+	(*DeleteCredentialsRequest)(nil),              // 98: akuity.io.kargo.service.v1alpha1.DeleteCredentialsRequest
+	(*DeleteCredentialsResponse)(nil),             // 99: akuity.io.kargo.service.v1alpha1.DeleteCredentialsResponse
+	(*GetCredentialsRequest)(nil),                 // 100: akuity.io.kargo.service.v1alpha1.GetCredentialsRequest
+	(*GetCredentialsResponse)(nil),                // 101: akuity.io.kargo.service.v1alpha1.GetCredentialsResponse
+	(*ListCredentialsRequest)(nil),                // 102: akuity.io.kargo.service.v1alpha1.ListCredentialsRequest
+	(*ListCredentialsResponse)(nil),               // 103: akuity.io.kargo.service.v1alpha1.ListCredentialsResponse
+	(*UpdateCredentialsRequest)(nil),              // 104: akuity.io.kargo.service.v1alpha1.UpdateCredentialsRequest
+	(*UpdateCredentialsResponse)(nil),             // 105: akuity.io.kargo.service.v1alpha1.UpdateCredentialsResponse
+	(*ListAnalysisTemplatesRequest)(nil),          // 106: akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesRequest
+	(*ListAnalysisTemplatesResponse)(nil),         // 107: akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesResponse
+	(*ListPromotionTasksRequest)(nil),             // 108: akuity.io.kargo.service.v1alpha1.ListPromotionTasksRequest
+	(*ListPromotionTasksResponse)(nil),            // 109: akuity.io.kargo.service.v1alpha1.ListPromotionTasksResponse
+	(*ListClusterPromotionTasksRequest)(nil),      // 110: akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksRequest
+	(*ListClusterPromotionTasksResponse)(nil),     // 111: akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksResponse
+	(*GetAnalysisTemplateRequest)(nil),            // 112: akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateRequest
+	(*GetAnalysisTemplateResponse)(nil),           // 113: akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateResponse
+	(*GetPromotionTaskRequest)(nil),               // 114: akuity.io.kargo.service.v1alpha1.GetPromotionTaskRequest
+	(*GetPromotionTaskResponse)(nil),              // 115: akuity.io.kargo.service.v1alpha1.GetPromotionTaskResponse
+	(*GetClusterPromotionTaskRequest)(nil),        // 116: akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskRequest
+	(*GetClusterPromotionTaskResponse)(nil),       // 117: akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskResponse
+	(*ListClusterAnalysisTemplatesRequest)(nil),   // 118: akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesRequest
+	(*ListClusterAnalysisTemplatesResponse)(nil),  // 119: akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesResponse
+	(*GetClusterAnalysisTemplateRequest)(nil),     // 120: akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateRequest
+	(*GetClusterAnalysisTemplateResponse)(nil),    // 121: akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateResponse
+	(*GetAnalysisRunRequest)(nil),                 // 122: akuity.io.kargo.service.v1alpha1.GetAnalysisRunRequest
+	(*GetAnalysisRunResponse)(nil),                // 123: akuity.io.kargo.service.v1alpha1.GetAnalysisRunResponse
+	(*GetAnalysisRunLogsRequest)(nil),             // 124: akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsRequest
+	(*GetAnalysisRunLogsResponse)(nil),            // 125: akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsResponse
+	(*DeleteAnalysisTemplateRequest)(nil),         // 126: akuity.io.kargo.service.v1alpha1.DeleteAnalysisTemplateRequest
+	(*DeleteAnalysisTemplateResponse)(nil),        // 127: akuity.io.kargo.service.v1alpha1.DeleteAnalysisTemplateResponse
+	(*DeleteClusterAnalysisTemplateRequest)(nil),  // 128: akuity.io.kargo.service.v1alpha1.DeleteClusterAnalysisTemplateRequest
+	(*DeleteClusterAnalysisTemplateResponse)(nil), // 129: akuity.io.kargo.service.v1alpha1.DeleteClusterAnalysisTemplateResponse
+	(*ListProjectEventsRequest)(nil),              // 130: akuity.io.kargo.service.v1alpha1.ListProjectEventsRequest
+	(*ListProjectEventsResponse)(nil),             // 131: akuity.io.kargo.service.v1alpha1.ListProjectEventsResponse
+	(*CreateRoleRequest)(nil),                     // 132: akuity.io.kargo.service.v1alpha1.CreateRoleRequest
+	(*CreateRoleResponse)(nil),                    // 133: akuity.io.kargo.service.v1alpha1.CreateRoleResponse
+	(*DeleteRoleRequest)(nil),                     // 134: akuity.io.kargo.service.v1alpha1.DeleteRoleRequest
+	(*DeleteRoleResponse)(nil),                    // 135: akuity.io.kargo.service.v1alpha1.DeleteRoleResponse
+	(*GetRoleRequest)(nil),                        // 136: akuity.io.kargo.service.v1alpha1.GetRoleRequest
+	(*GetRoleResponse)(nil),                       // 137: akuity.io.kargo.service.v1alpha1.GetRoleResponse
+	(*Claims)(nil),                                // 138: akuity.io.kargo.service.v1alpha1.Claims
+	(*GrantRequest)(nil),                          // 139: akuity.io.kargo.service.v1alpha1.GrantRequest
+	(*GrantResponse)(nil),                         // 140: akuity.io.kargo.service.v1alpha1.GrantResponse
+	(*ListRolesRequest)(nil),                      // 141: akuity.io.kargo.service.v1alpha1.ListRolesRequest
+	(*ListRolesResponse)(nil),                     // 142: akuity.io.kargo.service.v1alpha1.ListRolesResponse
+	(*RevokeRequest)(nil),                         // 143: akuity.io.kargo.service.v1alpha1.RevokeRequest
+	(*RevokeResponse)(nil),                        // 144: akuity.io.kargo.service.v1alpha1.RevokeResponse
+	(*UpdateRoleRequest)(nil),                     // 145: akuity.io.kargo.service.v1alpha1.UpdateRoleRequest
+	(*UpdateRoleResponse)(nil),                    // 146: akuity.io.kargo.service.v1alpha1.UpdateRoleResponse
+	nil,                                           // 147: akuity.io.kargo.service.v1alpha1.GetConfigResponse.ArgocdShardsEntry
+	nil,                                           // 148: akuity.io.kargo.service.v1alpha1.ListImagesResponse.ImagesEntry
+	nil,                                           // 149: akuity.io.kargo.service.v1alpha1.TagMap.TagsEntry
+	nil,                                           // 150: akuity.io.kargo.service.v1alpha1.ImageStageMap.StagesEntry
+	nil,                                           // 151: akuity.io.kargo.service.v1alpha1.QueryFreightResponse.GroupsEntry
+	nil,                                           // 152: akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest.DataEntry
+	nil,                                           // 153: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest.DataEntry
+	(*timestamppb.Timestamp)(nil),                 // 154: google.protobuf.Timestamp
+	(*v1alpha1.Stage)(nil),                        // 155: github.com.akuity.kargo.api.v1alpha1.Stage
+	(*v1alpha1.Promotion)(nil),                    // 156: github.com.akuity.kargo.api.v1alpha1.Promotion
+	(*v1alpha1.ProjectConfig)(nil),                // 157: github.com.akuity.kargo.api.v1alpha1.ProjectConfig
+	(*v1alpha1.Project)(nil),                      // 158: github.com.akuity.kargo.api.v1alpha1.Project
+	(*v1alpha1.Freight)(nil),                      // 159: github.com.akuity.kargo.api.v1alpha1.Freight
+	(*v1alpha1.Warehouse)(nil),                    // 160: github.com.akuity.kargo.api.v1alpha1.Warehouse
+	(*v1.Secret)(nil),                             // 161: k8s.io.api.core.v1.Secret
+	(*v1alpha11.AnalysisTemplate)(nil),            // 162: github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisTemplate
+	(*v1alpha1.PromotionTask)(nil),                // 163: github.com.akuity.kargo.api.v1alpha1.PromotionTask
+	(*v1alpha1.ClusterPromotionTask)(nil),         // 164: github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask
+	(*v1alpha11.ClusterAnalysisTemplate)(nil),     // 165: github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.ClusterAnalysisTemplate
+	(*v1alpha11.AnalysisRun)(nil),                 // 166: github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisRun
+	(*v1.Event)(nil),                              // 167: k8s.io.api.core.v1.Event
+	(*v1alpha12.Role)(nil),                        // 168: github.com.akuity.kargo.api.rbac.v1alpha1.Role
+	(*v1alpha12.RoleResources)(nil),               // 169: github.com.akuity.kargo.api.rbac.v1alpha1.RoleResources
+	(*v1alpha12.Claim)(nil),                       // 170: github.com.akuity.kargo.api.rbac.v1alpha1.Claim
+	(*v1alpha12.ResourceDetails)(nil),             // 171: github.com.akuity.kargo.api.rbac.v1alpha1.ResourceDetails
 }
 var file_api_service_v1alpha1_service_proto_depIdxs = []int32{
 	2,   // 0: akuity.io.kargo.service.v1alpha1.ComponentVersions.server:type_name -> akuity.io.kargo.service.v1alpha1.VersionInfo
 	2,   // 1: akuity.io.kargo.service.v1alpha1.ComponentVersions.cli:type_name -> akuity.io.kargo.service.v1alpha1.VersionInfo
-	150, // 2: akuity.io.kargo.service.v1alpha1.VersionInfo.build_time:type_name -> google.protobuf.Timestamp
+	154, // 2: akuity.io.kargo.service.v1alpha1.VersionInfo.build_time:type_name -> google.protobuf.Timestamp
 	2,   // 3: akuity.io.kargo.service.v1alpha1.GetVersionInfoResponse.version_info:type_name -> akuity.io.kargo.service.v1alpha1.VersionInfo
-	143, // 4: akuity.io.kargo.service.v1alpha1.GetConfigResponse.argocd_shards:type_name -> akuity.io.kargo.service.v1alpha1.GetConfigResponse.ArgocdShardsEntry
+	147, // 4: akuity.io.kargo.service.v1alpha1.GetConfigResponse.argocd_shards:type_name -> akuity.io.kargo.service.v1alpha1.GetConfigResponse.ArgocdShardsEntry
 	10,  // 5: akuity.io.kargo.service.v1alpha1.GetPublicConfigResponse.oidc_config:type_name -> akuity.io.kargo.service.v1alpha1.OIDCConfig
 	14,  // 6: akuity.io.kargo.service.v1alpha1.CreateResourceResponse.results:type_name -> akuity.io.kargo.service.v1alpha1.CreateResourceResult
 	17,  // 7: akuity.io.kargo.service.v1alpha1.CreateOrUpdateResourceResponse.results:type_name -> akuity.io.kargo.service.v1alpha1.CreateOrUpdateResourceResult
 	20,  // 8: akuity.io.kargo.service.v1alpha1.UpdateResourceResponse.results:type_name -> akuity.io.kargo.service.v1alpha1.UpdateResourceResult
 	23,  // 9: akuity.io.kargo.service.v1alpha1.DeleteResourceResponse.results:type_name -> akuity.io.kargo.service.v1alpha1.DeleteResourceResult
-	151, // 10: akuity.io.kargo.service.v1alpha1.ListStagesResponse.stages:type_name -> github.com.akuity.kargo.api.v1alpha1.Stage
-	144, // 11: akuity.io.kargo.service.v1alpha1.ListImagesResponse.images:type_name -> akuity.io.kargo.service.v1alpha1.ListImagesResponse.ImagesEntry
-	145, // 12: akuity.io.kargo.service.v1alpha1.TagMap.tags:type_name -> akuity.io.kargo.service.v1alpha1.TagMap.TagsEntry
-	146, // 13: akuity.io.kargo.service.v1alpha1.ImageStageMap.stages:type_name -> akuity.io.kargo.service.v1alpha1.ImageStageMap.StagesEntry
+	155, // 10: akuity.io.kargo.service.v1alpha1.ListStagesResponse.stages:type_name -> github.com.akuity.kargo.api.v1alpha1.Stage
+	148, // 11: akuity.io.kargo.service.v1alpha1.ListImagesResponse.images:type_name -> akuity.io.kargo.service.v1alpha1.ListImagesResponse.ImagesEntry
+	149, // 12: akuity.io.kargo.service.v1alpha1.TagMap.tags:type_name -> akuity.io.kargo.service.v1alpha1.TagMap.TagsEntry
+	150, // 13: akuity.io.kargo.service.v1alpha1.ImageStageMap.stages:type_name -> akuity.io.kargo.service.v1alpha1.ImageStageMap.StagesEntry
 	0,   // 14: akuity.io.kargo.service.v1alpha1.GetStageRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	151, // 15: akuity.io.kargo.service.v1alpha1.GetStageResponse.stage:type_name -> github.com.akuity.kargo.api.v1alpha1.Stage
-	151, // 16: akuity.io.kargo.service.v1alpha1.WatchStagesResponse.stage:type_name -> github.com.akuity.kargo.api.v1alpha1.Stage
-	151, // 17: akuity.io.kargo.service.v1alpha1.RefreshStageResponse.stage:type_name -> github.com.akuity.kargo.api.v1alpha1.Stage
-	152, // 18: akuity.io.kargo.service.v1alpha1.ListPromotionsResponse.promotions:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
-	152, // 19: akuity.io.kargo.service.v1alpha1.WatchPromotionsResponse.promotion:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
+	155, // 15: akuity.io.kargo.service.v1alpha1.GetStageResponse.stage:type_name -> github.com.akuity.kargo.api.v1alpha1.Stage
+	155, // 16: akuity.io.kargo.service.v1alpha1.WatchStagesResponse.stage:type_name -> github.com.akuity.kargo.api.v1alpha1.Stage
+	155, // 17: akuity.io.kargo.service.v1alpha1.RefreshStageResponse.stage:type_name -> github.com.akuity.kargo.api.v1alpha1.Stage
+	156, // 18: akuity.io.kargo.service.v1alpha1.ListPromotionsResponse.promotions:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
+	156, // 19: akuity.io.kargo.service.v1alpha1.WatchPromotionsResponse.promotion:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
 	0,   // 20: akuity.io.kargo.service.v1alpha1.GetPromotionRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	152, // 21: akuity.io.kargo.service.v1alpha1.GetPromotionResponse.promotion:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
-	152, // 22: akuity.io.kargo.service.v1alpha1.WatchPromotionResponse.promotion:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
-	0,   // 23: akuity.io.kargo.service.v1alpha1.GetProjectRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	153, // 24: akuity.io.kargo.service.v1alpha1.GetProjectResponse.project:type_name -> github.com.akuity.kargo.api.v1alpha1.Project
-	153, // 25: akuity.io.kargo.service.v1alpha1.ListProjectsResponse.projects:type_name -> github.com.akuity.kargo.api.v1alpha1.Project
-	0,   // 26: akuity.io.kargo.service.v1alpha1.GetFreightRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	154, // 27: akuity.io.kargo.service.v1alpha1.GetFreightResponse.freight:type_name -> github.com.akuity.kargo.api.v1alpha1.Freight
-	152, // 28: akuity.io.kargo.service.v1alpha1.PromoteToStageResponse.promotion:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
-	152, // 29: akuity.io.kargo.service.v1alpha1.PromoteDownstreamResponse.promotions:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
-	147, // 30: akuity.io.kargo.service.v1alpha1.QueryFreightResponse.groups:type_name -> akuity.io.kargo.service.v1alpha1.QueryFreightResponse.GroupsEntry
-	154, // 31: akuity.io.kargo.service.v1alpha1.FreightList.freight:type_name -> github.com.akuity.kargo.api.v1alpha1.Freight
-	155, // 32: akuity.io.kargo.service.v1alpha1.ListWarehousesResponse.warehouses:type_name -> github.com.akuity.kargo.api.v1alpha1.Warehouse
-	0,   // 33: akuity.io.kargo.service.v1alpha1.GetWarehouseRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	155, // 34: akuity.io.kargo.service.v1alpha1.GetWarehouseResponse.warehouse:type_name -> github.com.akuity.kargo.api.v1alpha1.Warehouse
-	155, // 35: akuity.io.kargo.service.v1alpha1.WatchWarehousesResponse.warehouse:type_name -> github.com.akuity.kargo.api.v1alpha1.Warehouse
-	155, // 36: akuity.io.kargo.service.v1alpha1.RefreshWarehouseResponse.warehouse:type_name -> github.com.akuity.kargo.api.v1alpha1.Warehouse
-	156, // 37: akuity.io.kargo.service.v1alpha1.ListProjectSecretsResponse.secrets:type_name -> k8s.io.api.core.v1.Secret
-	148, // 38: akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest.data:type_name -> akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest.DataEntry
-	156, // 39: akuity.io.kargo.service.v1alpha1.CreateProjectSecretResponse.secret:type_name -> k8s.io.api.core.v1.Secret
-	149, // 40: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest.data:type_name -> akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest.DataEntry
-	156, // 41: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretResponse.secret:type_name -> k8s.io.api.core.v1.Secret
-	156, // 42: akuity.io.kargo.service.v1alpha1.CreateCredentialsResponse.credentials:type_name -> k8s.io.api.core.v1.Secret
-	0,   // 43: akuity.io.kargo.service.v1alpha1.GetCredentialsRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	156, // 44: akuity.io.kargo.service.v1alpha1.GetCredentialsResponse.credentials:type_name -> k8s.io.api.core.v1.Secret
-	156, // 45: akuity.io.kargo.service.v1alpha1.ListCredentialsResponse.credentials:type_name -> k8s.io.api.core.v1.Secret
-	156, // 46: akuity.io.kargo.service.v1alpha1.UpdateCredentialsResponse.credentials:type_name -> k8s.io.api.core.v1.Secret
-	157, // 47: akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesResponse.analysis_templates:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisTemplate
-	158, // 48: akuity.io.kargo.service.v1alpha1.ListPromotionTasksResponse.promotion_tasks:type_name -> github.com.akuity.kargo.api.v1alpha1.PromotionTask
-	159, // 49: akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksResponse.cluster_promotion_tasks:type_name -> github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask
-	0,   // 50: akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	157, // 51: akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateResponse.analysis_template:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisTemplate
-	0,   // 52: akuity.io.kargo.service.v1alpha1.GetPromotionTaskRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	158, // 53: akuity.io.kargo.service.v1alpha1.GetPromotionTaskResponse.promotion_task:type_name -> github.com.akuity.kargo.api.v1alpha1.PromotionTask
-	0,   // 54: akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	159, // 55: akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskResponse.promotion_task:type_name -> github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask
-	160, // 56: akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesResponse.cluster_analysis_templates:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.ClusterAnalysisTemplate
-	0,   // 57: akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	160, // 58: akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateResponse.cluster_analysis_template:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.ClusterAnalysisTemplate
-	0,   // 59: akuity.io.kargo.service.v1alpha1.GetAnalysisRunRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	161, // 60: akuity.io.kargo.service.v1alpha1.GetAnalysisRunResponse.analysis_run:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisRun
-	162, // 61: akuity.io.kargo.service.v1alpha1.ListProjectEventsResponse.events:type_name -> k8s.io.api.core.v1.Event
-	163, // 62: akuity.io.kargo.service.v1alpha1.CreateRoleRequest.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
-	163, // 63: akuity.io.kargo.service.v1alpha1.CreateRoleResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
-	0,   // 64: akuity.io.kargo.service.v1alpha1.GetRoleRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
-	163, // 65: akuity.io.kargo.service.v1alpha1.GetRoleResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
-	164, // 66: akuity.io.kargo.service.v1alpha1.GetRoleResponse.resources:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.RoleResources
-	165, // 67: akuity.io.kargo.service.v1alpha1.Claims.claims:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Claim
-	134, // 68: akuity.io.kargo.service.v1alpha1.GrantRequest.user_claims:type_name -> akuity.io.kargo.service.v1alpha1.Claims
-	166, // 69: akuity.io.kargo.service.v1alpha1.GrantRequest.resource_details:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.ResourceDetails
-	163, // 70: akuity.io.kargo.service.v1alpha1.GrantResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
-	163, // 71: akuity.io.kargo.service.v1alpha1.ListRolesResponse.roles:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
-	164, // 72: akuity.io.kargo.service.v1alpha1.ListRolesResponse.resources:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.RoleResources
-	134, // 73: akuity.io.kargo.service.v1alpha1.RevokeRequest.user_claims:type_name -> akuity.io.kargo.service.v1alpha1.Claims
-	166, // 74: akuity.io.kargo.service.v1alpha1.RevokeRequest.resource_details:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.ResourceDetails
-	163, // 75: akuity.io.kargo.service.v1alpha1.RevokeResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
-	163, // 76: akuity.io.kargo.service.v1alpha1.UpdateRoleRequest.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
-	163, // 77: akuity.io.kargo.service.v1alpha1.UpdateRoleResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
-	6,   // 78: akuity.io.kargo.service.v1alpha1.GetConfigResponse.ArgocdShardsEntry.value:type_name -> akuity.io.kargo.service.v1alpha1.ArgoCDShard
-	29,  // 79: akuity.io.kargo.service.v1alpha1.ListImagesResponse.ImagesEntry.value:type_name -> akuity.io.kargo.service.v1alpha1.TagMap
-	30,  // 80: akuity.io.kargo.service.v1alpha1.TagMap.TagsEntry.value:type_name -> akuity.io.kargo.service.v1alpha1.ImageStageMap
-	67,  // 81: akuity.io.kargo.service.v1alpha1.QueryFreightResponse.GroupsEntry.value:type_name -> akuity.io.kargo.service.v1alpha1.FreightList
-	3,   // 82: akuity.io.kargo.service.v1alpha1.KargoService.GetVersionInfo:input_type -> akuity.io.kargo.service.v1alpha1.GetVersionInfoRequest
-	5,   // 83: akuity.io.kargo.service.v1alpha1.KargoService.GetConfig:input_type -> akuity.io.kargo.service.v1alpha1.GetConfigRequest
-	8,   // 84: akuity.io.kargo.service.v1alpha1.KargoService.GetPublicConfig:input_type -> akuity.io.kargo.service.v1alpha1.GetPublicConfigRequest
-	11,  // 85: akuity.io.kargo.service.v1alpha1.KargoService.AdminLogin:input_type -> akuity.io.kargo.service.v1alpha1.AdminLoginRequest
-	13,  // 86: akuity.io.kargo.service.v1alpha1.KargoService.CreateResource:input_type -> akuity.io.kargo.service.v1alpha1.CreateResourceRequest
-	16,  // 87: akuity.io.kargo.service.v1alpha1.KargoService.CreateOrUpdateResource:input_type -> akuity.io.kargo.service.v1alpha1.CreateOrUpdateResourceRequest
-	19,  // 88: akuity.io.kargo.service.v1alpha1.KargoService.UpdateResource:input_type -> akuity.io.kargo.service.v1alpha1.UpdateResourceRequest
-	22,  // 89: akuity.io.kargo.service.v1alpha1.KargoService.DeleteResource:input_type -> akuity.io.kargo.service.v1alpha1.DeleteResourceRequest
-	25,  // 90: akuity.io.kargo.service.v1alpha1.KargoService.ListStages:input_type -> akuity.io.kargo.service.v1alpha1.ListStagesRequest
-	27,  // 91: akuity.io.kargo.service.v1alpha1.KargoService.ListImages:input_type -> akuity.io.kargo.service.v1alpha1.ListImagesRequest
-	31,  // 92: akuity.io.kargo.service.v1alpha1.KargoService.GetStage:input_type -> akuity.io.kargo.service.v1alpha1.GetStageRequest
-	33,  // 93: akuity.io.kargo.service.v1alpha1.KargoService.WatchStages:input_type -> akuity.io.kargo.service.v1alpha1.WatchStagesRequest
-	35,  // 94: akuity.io.kargo.service.v1alpha1.KargoService.DeleteStage:input_type -> akuity.io.kargo.service.v1alpha1.DeleteStageRequest
-	37,  // 95: akuity.io.kargo.service.v1alpha1.KargoService.RefreshStage:input_type -> akuity.io.kargo.service.v1alpha1.RefreshStageRequest
-	39,  // 96: akuity.io.kargo.service.v1alpha1.KargoService.ListPromotions:input_type -> akuity.io.kargo.service.v1alpha1.ListPromotionsRequest
-	41,  // 97: akuity.io.kargo.service.v1alpha1.KargoService.WatchPromotions:input_type -> akuity.io.kargo.service.v1alpha1.WatchPromotionsRequest
-	43,  // 98: akuity.io.kargo.service.v1alpha1.KargoService.GetPromotion:input_type -> akuity.io.kargo.service.v1alpha1.GetPromotionRequest
-	45,  // 99: akuity.io.kargo.service.v1alpha1.KargoService.WatchPromotion:input_type -> akuity.io.kargo.service.v1alpha1.WatchPromotionRequest
-	47,  // 100: akuity.io.kargo.service.v1alpha1.KargoService.AbortPromotion:input_type -> akuity.io.kargo.service.v1alpha1.AbortPromotionRequest
-	49,  // 101: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProject:input_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectRequest
-	51,  // 102: akuity.io.kargo.service.v1alpha1.KargoService.GetProject:input_type -> akuity.io.kargo.service.v1alpha1.GetProjectRequest
-	53,  // 103: akuity.io.kargo.service.v1alpha1.KargoService.ListProjects:input_type -> akuity.io.kargo.service.v1alpha1.ListProjectsRequest
-	55,  // 104: akuity.io.kargo.service.v1alpha1.KargoService.ApproveFreight:input_type -> akuity.io.kargo.service.v1alpha1.ApproveFreightRequest
-	57,  // 105: akuity.io.kargo.service.v1alpha1.KargoService.DeleteFreight:input_type -> akuity.io.kargo.service.v1alpha1.DeleteFreightRequest
-	59,  // 106: akuity.io.kargo.service.v1alpha1.KargoService.GetFreight:input_type -> akuity.io.kargo.service.v1alpha1.GetFreightRequest
-	61,  // 107: akuity.io.kargo.service.v1alpha1.KargoService.PromoteToStage:input_type -> akuity.io.kargo.service.v1alpha1.PromoteToStageRequest
-	63,  // 108: akuity.io.kargo.service.v1alpha1.KargoService.PromoteDownstream:input_type -> akuity.io.kargo.service.v1alpha1.PromoteDownstreamRequest
-	65,  // 109: akuity.io.kargo.service.v1alpha1.KargoService.QueryFreight:input_type -> akuity.io.kargo.service.v1alpha1.QueryFreightRequest
-	68,  // 110: akuity.io.kargo.service.v1alpha1.KargoService.UpdateFreightAlias:input_type -> akuity.io.kargo.service.v1alpha1.UpdateFreightAliasRequest
-	70,  // 111: akuity.io.kargo.service.v1alpha1.KargoService.Reverify:input_type -> akuity.io.kargo.service.v1alpha1.ReverifyRequest
-	72,  // 112: akuity.io.kargo.service.v1alpha1.KargoService.AbortVerification:input_type -> akuity.io.kargo.service.v1alpha1.AbortVerificationRequest
-	74,  // 113: akuity.io.kargo.service.v1alpha1.KargoService.ListWarehouses:input_type -> akuity.io.kargo.service.v1alpha1.ListWarehousesRequest
-	76,  // 114: akuity.io.kargo.service.v1alpha1.KargoService.GetWarehouse:input_type -> akuity.io.kargo.service.v1alpha1.GetWarehouseRequest
-	78,  // 115: akuity.io.kargo.service.v1alpha1.KargoService.WatchWarehouses:input_type -> akuity.io.kargo.service.v1alpha1.WatchWarehousesRequest
-	80,  // 116: akuity.io.kargo.service.v1alpha1.KargoService.DeleteWarehouse:input_type -> akuity.io.kargo.service.v1alpha1.DeleteWarehouseRequest
-	82,  // 117: akuity.io.kargo.service.v1alpha1.KargoService.RefreshWarehouse:input_type -> akuity.io.kargo.service.v1alpha1.RefreshWarehouseRequest
-	92,  // 118: akuity.io.kargo.service.v1alpha1.KargoService.CreateCredentials:input_type -> akuity.io.kargo.service.v1alpha1.CreateCredentialsRequest
-	94,  // 119: akuity.io.kargo.service.v1alpha1.KargoService.DeleteCredentials:input_type -> akuity.io.kargo.service.v1alpha1.DeleteCredentialsRequest
-	96,  // 120: akuity.io.kargo.service.v1alpha1.KargoService.GetCredentials:input_type -> akuity.io.kargo.service.v1alpha1.GetCredentialsRequest
-	98,  // 121: akuity.io.kargo.service.v1alpha1.KargoService.ListCredentials:input_type -> akuity.io.kargo.service.v1alpha1.ListCredentialsRequest
-	100, // 122: akuity.io.kargo.service.v1alpha1.KargoService.UpdateCredentials:input_type -> akuity.io.kargo.service.v1alpha1.UpdateCredentialsRequest
-	84,  // 123: akuity.io.kargo.service.v1alpha1.KargoService.ListProjectSecrets:input_type -> akuity.io.kargo.service.v1alpha1.ListProjectSecretsRequest
-	86,  // 124: akuity.io.kargo.service.v1alpha1.KargoService.CreateProjectSecret:input_type -> akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest
-	88,  // 125: akuity.io.kargo.service.v1alpha1.KargoService.UpdateProjectSecret:input_type -> akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest
-	90,  // 126: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectSecret:input_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectSecretRequest
-	102, // 127: akuity.io.kargo.service.v1alpha1.KargoService.ListAnalysisTemplates:input_type -> akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesRequest
-	108, // 128: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisTemplate:input_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateRequest
-	122, // 129: akuity.io.kargo.service.v1alpha1.KargoService.DeleteAnalysisTemplate:input_type -> akuity.io.kargo.service.v1alpha1.DeleteAnalysisTemplateRequest
-	114, // 130: akuity.io.kargo.service.v1alpha1.KargoService.ListClusterAnalysisTemplates:input_type -> akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesRequest
-	116, // 131: akuity.io.kargo.service.v1alpha1.KargoService.GetClusterAnalysisTemplate:input_type -> akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateRequest
-	124, // 132: akuity.io.kargo.service.v1alpha1.KargoService.DeleteClusterAnalysisTemplate:input_type -> akuity.io.kargo.service.v1alpha1.DeleteClusterAnalysisTemplateRequest
-	118, // 133: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisRun:input_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisRunRequest
-	120, // 134: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisRunLogs:input_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsRequest
-	126, // 135: akuity.io.kargo.service.v1alpha1.KargoService.ListProjectEvents:input_type -> akuity.io.kargo.service.v1alpha1.ListProjectEventsRequest
-	104, // 136: akuity.io.kargo.service.v1alpha1.KargoService.ListPromotionTasks:input_type -> akuity.io.kargo.service.v1alpha1.ListPromotionTasksRequest
-	106, // 137: akuity.io.kargo.service.v1alpha1.KargoService.ListClusterPromotionTasks:input_type -> akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksRequest
-	110, // 138: akuity.io.kargo.service.v1alpha1.KargoService.GetPromotionTask:input_type -> akuity.io.kargo.service.v1alpha1.GetPromotionTaskRequest
-	112, // 139: akuity.io.kargo.service.v1alpha1.KargoService.GetClusterPromotionTask:input_type -> akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskRequest
-	128, // 140: akuity.io.kargo.service.v1alpha1.KargoService.CreateRole:input_type -> akuity.io.kargo.service.v1alpha1.CreateRoleRequest
-	130, // 141: akuity.io.kargo.service.v1alpha1.KargoService.DeleteRole:input_type -> akuity.io.kargo.service.v1alpha1.DeleteRoleRequest
-	132, // 142: akuity.io.kargo.service.v1alpha1.KargoService.GetRole:input_type -> akuity.io.kargo.service.v1alpha1.GetRoleRequest
-	135, // 143: akuity.io.kargo.service.v1alpha1.KargoService.Grant:input_type -> akuity.io.kargo.service.v1alpha1.GrantRequest
-	137, // 144: akuity.io.kargo.service.v1alpha1.KargoService.ListRoles:input_type -> akuity.io.kargo.service.v1alpha1.ListRolesRequest
-	139, // 145: akuity.io.kargo.service.v1alpha1.KargoService.Revoke:input_type -> akuity.io.kargo.service.v1alpha1.RevokeRequest
-	141, // 146: akuity.io.kargo.service.v1alpha1.KargoService.UpdateRole:input_type -> akuity.io.kargo.service.v1alpha1.UpdateRoleRequest
-	4,   // 147: akuity.io.kargo.service.v1alpha1.KargoService.GetVersionInfo:output_type -> akuity.io.kargo.service.v1alpha1.GetVersionInfoResponse
-	7,   // 148: akuity.io.kargo.service.v1alpha1.KargoService.GetConfig:output_type -> akuity.io.kargo.service.v1alpha1.GetConfigResponse
-	9,   // 149: akuity.io.kargo.service.v1alpha1.KargoService.GetPublicConfig:output_type -> akuity.io.kargo.service.v1alpha1.GetPublicConfigResponse
-	12,  // 150: akuity.io.kargo.service.v1alpha1.KargoService.AdminLogin:output_type -> akuity.io.kargo.service.v1alpha1.AdminLoginResponse
-	15,  // 151: akuity.io.kargo.service.v1alpha1.KargoService.CreateResource:output_type -> akuity.io.kargo.service.v1alpha1.CreateResourceResponse
-	18,  // 152: akuity.io.kargo.service.v1alpha1.KargoService.CreateOrUpdateResource:output_type -> akuity.io.kargo.service.v1alpha1.CreateOrUpdateResourceResponse
-	21,  // 153: akuity.io.kargo.service.v1alpha1.KargoService.UpdateResource:output_type -> akuity.io.kargo.service.v1alpha1.UpdateResourceResponse
-	24,  // 154: akuity.io.kargo.service.v1alpha1.KargoService.DeleteResource:output_type -> akuity.io.kargo.service.v1alpha1.DeleteResourceResponse
-	26,  // 155: akuity.io.kargo.service.v1alpha1.KargoService.ListStages:output_type -> akuity.io.kargo.service.v1alpha1.ListStagesResponse
-	28,  // 156: akuity.io.kargo.service.v1alpha1.KargoService.ListImages:output_type -> akuity.io.kargo.service.v1alpha1.ListImagesResponse
-	32,  // 157: akuity.io.kargo.service.v1alpha1.KargoService.GetStage:output_type -> akuity.io.kargo.service.v1alpha1.GetStageResponse
-	34,  // 158: akuity.io.kargo.service.v1alpha1.KargoService.WatchStages:output_type -> akuity.io.kargo.service.v1alpha1.WatchStagesResponse
-	36,  // 159: akuity.io.kargo.service.v1alpha1.KargoService.DeleteStage:output_type -> akuity.io.kargo.service.v1alpha1.DeleteStageResponse
-	38,  // 160: akuity.io.kargo.service.v1alpha1.KargoService.RefreshStage:output_type -> akuity.io.kargo.service.v1alpha1.RefreshStageResponse
-	40,  // 161: akuity.io.kargo.service.v1alpha1.KargoService.ListPromotions:output_type -> akuity.io.kargo.service.v1alpha1.ListPromotionsResponse
-	42,  // 162: akuity.io.kargo.service.v1alpha1.KargoService.WatchPromotions:output_type -> akuity.io.kargo.service.v1alpha1.WatchPromotionsResponse
-	44,  // 163: akuity.io.kargo.service.v1alpha1.KargoService.GetPromotion:output_type -> akuity.io.kargo.service.v1alpha1.GetPromotionResponse
-	46,  // 164: akuity.io.kargo.service.v1alpha1.KargoService.WatchPromotion:output_type -> akuity.io.kargo.service.v1alpha1.WatchPromotionResponse
-	48,  // 165: akuity.io.kargo.service.v1alpha1.KargoService.AbortPromotion:output_type -> akuity.io.kargo.service.v1alpha1.AbortPromotionResponse
-	50,  // 166: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProject:output_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectResponse
-	52,  // 167: akuity.io.kargo.service.v1alpha1.KargoService.GetProject:output_type -> akuity.io.kargo.service.v1alpha1.GetProjectResponse
-	54,  // 168: akuity.io.kargo.service.v1alpha1.KargoService.ListProjects:output_type -> akuity.io.kargo.service.v1alpha1.ListProjectsResponse
-	56,  // 169: akuity.io.kargo.service.v1alpha1.KargoService.ApproveFreight:output_type -> akuity.io.kargo.service.v1alpha1.ApproveFreightResponse
-	58,  // 170: akuity.io.kargo.service.v1alpha1.KargoService.DeleteFreight:output_type -> akuity.io.kargo.service.v1alpha1.DeleteFreightResponse
-	60,  // 171: akuity.io.kargo.service.v1alpha1.KargoService.GetFreight:output_type -> akuity.io.kargo.service.v1alpha1.GetFreightResponse
-	62,  // 172: akuity.io.kargo.service.v1alpha1.KargoService.PromoteToStage:output_type -> akuity.io.kargo.service.v1alpha1.PromoteToStageResponse
-	64,  // 173: akuity.io.kargo.service.v1alpha1.KargoService.PromoteDownstream:output_type -> akuity.io.kargo.service.v1alpha1.PromoteDownstreamResponse
-	66,  // 174: akuity.io.kargo.service.v1alpha1.KargoService.QueryFreight:output_type -> akuity.io.kargo.service.v1alpha1.QueryFreightResponse
-	69,  // 175: akuity.io.kargo.service.v1alpha1.KargoService.UpdateFreightAlias:output_type -> akuity.io.kargo.service.v1alpha1.UpdateFreightAliasResponse
-	71,  // 176: akuity.io.kargo.service.v1alpha1.KargoService.Reverify:output_type -> akuity.io.kargo.service.v1alpha1.ReverifyResponse
-	73,  // 177: akuity.io.kargo.service.v1alpha1.KargoService.AbortVerification:output_type -> akuity.io.kargo.service.v1alpha1.AbortVerificationResponse
-	75,  // 178: akuity.io.kargo.service.v1alpha1.KargoService.ListWarehouses:output_type -> akuity.io.kargo.service.v1alpha1.ListWarehousesResponse
-	77,  // 179: akuity.io.kargo.service.v1alpha1.KargoService.GetWarehouse:output_type -> akuity.io.kargo.service.v1alpha1.GetWarehouseResponse
-	79,  // 180: akuity.io.kargo.service.v1alpha1.KargoService.WatchWarehouses:output_type -> akuity.io.kargo.service.v1alpha1.WatchWarehousesResponse
-	81,  // 181: akuity.io.kargo.service.v1alpha1.KargoService.DeleteWarehouse:output_type -> akuity.io.kargo.service.v1alpha1.DeleteWarehouseResponse
-	83,  // 182: akuity.io.kargo.service.v1alpha1.KargoService.RefreshWarehouse:output_type -> akuity.io.kargo.service.v1alpha1.RefreshWarehouseResponse
-	93,  // 183: akuity.io.kargo.service.v1alpha1.KargoService.CreateCredentials:output_type -> akuity.io.kargo.service.v1alpha1.CreateCredentialsResponse
-	95,  // 184: akuity.io.kargo.service.v1alpha1.KargoService.DeleteCredentials:output_type -> akuity.io.kargo.service.v1alpha1.DeleteCredentialsResponse
-	97,  // 185: akuity.io.kargo.service.v1alpha1.KargoService.GetCredentials:output_type -> akuity.io.kargo.service.v1alpha1.GetCredentialsResponse
-	99,  // 186: akuity.io.kargo.service.v1alpha1.KargoService.ListCredentials:output_type -> akuity.io.kargo.service.v1alpha1.ListCredentialsResponse
-	101, // 187: akuity.io.kargo.service.v1alpha1.KargoService.UpdateCredentials:output_type -> akuity.io.kargo.service.v1alpha1.UpdateCredentialsResponse
-	85,  // 188: akuity.io.kargo.service.v1alpha1.KargoService.ListProjectSecrets:output_type -> akuity.io.kargo.service.v1alpha1.ListProjectSecretsResponse
-	87,  // 189: akuity.io.kargo.service.v1alpha1.KargoService.CreateProjectSecret:output_type -> akuity.io.kargo.service.v1alpha1.CreateProjectSecretResponse
-	89,  // 190: akuity.io.kargo.service.v1alpha1.KargoService.UpdateProjectSecret:output_type -> akuity.io.kargo.service.v1alpha1.UpdateProjectSecretResponse
-	91,  // 191: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectSecret:output_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectSecretResponse
-	103, // 192: akuity.io.kargo.service.v1alpha1.KargoService.ListAnalysisTemplates:output_type -> akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesResponse
-	109, // 193: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisTemplate:output_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateResponse
-	123, // 194: akuity.io.kargo.service.v1alpha1.KargoService.DeleteAnalysisTemplate:output_type -> akuity.io.kargo.service.v1alpha1.DeleteAnalysisTemplateResponse
-	115, // 195: akuity.io.kargo.service.v1alpha1.KargoService.ListClusterAnalysisTemplates:output_type -> akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesResponse
-	117, // 196: akuity.io.kargo.service.v1alpha1.KargoService.GetClusterAnalysisTemplate:output_type -> akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateResponse
-	125, // 197: akuity.io.kargo.service.v1alpha1.KargoService.DeleteClusterAnalysisTemplate:output_type -> akuity.io.kargo.service.v1alpha1.DeleteClusterAnalysisTemplateResponse
-	119, // 198: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisRun:output_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisRunResponse
-	121, // 199: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisRunLogs:output_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsResponse
-	127, // 200: akuity.io.kargo.service.v1alpha1.KargoService.ListProjectEvents:output_type -> akuity.io.kargo.service.v1alpha1.ListProjectEventsResponse
-	105, // 201: akuity.io.kargo.service.v1alpha1.KargoService.ListPromotionTasks:output_type -> akuity.io.kargo.service.v1alpha1.ListPromotionTasksResponse
-	107, // 202: akuity.io.kargo.service.v1alpha1.KargoService.ListClusterPromotionTasks:output_type -> akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksResponse
-	111, // 203: akuity.io.kargo.service.v1alpha1.KargoService.GetPromotionTask:output_type -> akuity.io.kargo.service.v1alpha1.GetPromotionTaskResponse
-	113, // 204: akuity.io.kargo.service.v1alpha1.KargoService.GetClusterPromotionTask:output_type -> akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskResponse
-	129, // 205: akuity.io.kargo.service.v1alpha1.KargoService.CreateRole:output_type -> akuity.io.kargo.service.v1alpha1.CreateRoleResponse
-	131, // 206: akuity.io.kargo.service.v1alpha1.KargoService.DeleteRole:output_type -> akuity.io.kargo.service.v1alpha1.DeleteRoleResponse
-	133, // 207: akuity.io.kargo.service.v1alpha1.KargoService.GetRole:output_type -> akuity.io.kargo.service.v1alpha1.GetRoleResponse
-	136, // 208: akuity.io.kargo.service.v1alpha1.KargoService.Grant:output_type -> akuity.io.kargo.service.v1alpha1.GrantResponse
-	138, // 209: akuity.io.kargo.service.v1alpha1.KargoService.ListRoles:output_type -> akuity.io.kargo.service.v1alpha1.ListRolesResponse
-	140, // 210: akuity.io.kargo.service.v1alpha1.KargoService.Revoke:output_type -> akuity.io.kargo.service.v1alpha1.RevokeResponse
-	142, // 211: akuity.io.kargo.service.v1alpha1.KargoService.UpdateRole:output_type -> akuity.io.kargo.service.v1alpha1.UpdateRoleResponse
-	147, // [147:212] is the sub-list for method output_type
-	82,  // [82:147] is the sub-list for method input_type
-	82,  // [82:82] is the sub-list for extension type_name
-	82,  // [82:82] is the sub-list for extension extendee
-	0,   // [0:82] is the sub-list for field type_name
+	156, // 21: akuity.io.kargo.service.v1alpha1.GetPromotionResponse.promotion:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
+	156, // 22: akuity.io.kargo.service.v1alpha1.WatchPromotionResponse.promotion:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
+	0,   // 23: akuity.io.kargo.service.v1alpha1.GetProjectConfigRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	157, // 24: akuity.io.kargo.service.v1alpha1.GetProjectConfigResponse.project_config:type_name -> github.com.akuity.kargo.api.v1alpha1.ProjectConfig
+	0,   // 25: akuity.io.kargo.service.v1alpha1.GetProjectRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	158, // 26: akuity.io.kargo.service.v1alpha1.GetProjectResponse.project:type_name -> github.com.akuity.kargo.api.v1alpha1.Project
+	158, // 27: akuity.io.kargo.service.v1alpha1.ListProjectsResponse.projects:type_name -> github.com.akuity.kargo.api.v1alpha1.Project
+	0,   // 28: akuity.io.kargo.service.v1alpha1.GetFreightRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	159, // 29: akuity.io.kargo.service.v1alpha1.GetFreightResponse.freight:type_name -> github.com.akuity.kargo.api.v1alpha1.Freight
+	156, // 30: akuity.io.kargo.service.v1alpha1.PromoteToStageResponse.promotion:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
+	156, // 31: akuity.io.kargo.service.v1alpha1.PromoteDownstreamResponse.promotions:type_name -> github.com.akuity.kargo.api.v1alpha1.Promotion
+	151, // 32: akuity.io.kargo.service.v1alpha1.QueryFreightResponse.groups:type_name -> akuity.io.kargo.service.v1alpha1.QueryFreightResponse.GroupsEntry
+	159, // 33: akuity.io.kargo.service.v1alpha1.FreightList.freight:type_name -> github.com.akuity.kargo.api.v1alpha1.Freight
+	160, // 34: akuity.io.kargo.service.v1alpha1.ListWarehousesResponse.warehouses:type_name -> github.com.akuity.kargo.api.v1alpha1.Warehouse
+	0,   // 35: akuity.io.kargo.service.v1alpha1.GetWarehouseRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	160, // 36: akuity.io.kargo.service.v1alpha1.GetWarehouseResponse.warehouse:type_name -> github.com.akuity.kargo.api.v1alpha1.Warehouse
+	160, // 37: akuity.io.kargo.service.v1alpha1.WatchWarehousesResponse.warehouse:type_name -> github.com.akuity.kargo.api.v1alpha1.Warehouse
+	160, // 38: akuity.io.kargo.service.v1alpha1.RefreshWarehouseResponse.warehouse:type_name -> github.com.akuity.kargo.api.v1alpha1.Warehouse
+	161, // 39: akuity.io.kargo.service.v1alpha1.ListProjectSecretsResponse.secrets:type_name -> k8s.io.api.core.v1.Secret
+	152, // 40: akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest.data:type_name -> akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest.DataEntry
+	161, // 41: akuity.io.kargo.service.v1alpha1.CreateProjectSecretResponse.secret:type_name -> k8s.io.api.core.v1.Secret
+	153, // 42: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest.data:type_name -> akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest.DataEntry
+	161, // 43: akuity.io.kargo.service.v1alpha1.UpdateProjectSecretResponse.secret:type_name -> k8s.io.api.core.v1.Secret
+	161, // 44: akuity.io.kargo.service.v1alpha1.CreateCredentialsResponse.credentials:type_name -> k8s.io.api.core.v1.Secret
+	0,   // 45: akuity.io.kargo.service.v1alpha1.GetCredentialsRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	161, // 46: akuity.io.kargo.service.v1alpha1.GetCredentialsResponse.credentials:type_name -> k8s.io.api.core.v1.Secret
+	161, // 47: akuity.io.kargo.service.v1alpha1.ListCredentialsResponse.credentials:type_name -> k8s.io.api.core.v1.Secret
+	161, // 48: akuity.io.kargo.service.v1alpha1.UpdateCredentialsResponse.credentials:type_name -> k8s.io.api.core.v1.Secret
+	162, // 49: akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesResponse.analysis_templates:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisTemplate
+	163, // 50: akuity.io.kargo.service.v1alpha1.ListPromotionTasksResponse.promotion_tasks:type_name -> github.com.akuity.kargo.api.v1alpha1.PromotionTask
+	164, // 51: akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksResponse.cluster_promotion_tasks:type_name -> github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask
+	0,   // 52: akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	162, // 53: akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateResponse.analysis_template:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisTemplate
+	0,   // 54: akuity.io.kargo.service.v1alpha1.GetPromotionTaskRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	163, // 55: akuity.io.kargo.service.v1alpha1.GetPromotionTaskResponse.promotion_task:type_name -> github.com.akuity.kargo.api.v1alpha1.PromotionTask
+	0,   // 56: akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	164, // 57: akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskResponse.promotion_task:type_name -> github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask
+	165, // 58: akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesResponse.cluster_analysis_templates:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.ClusterAnalysisTemplate
+	0,   // 59: akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	165, // 60: akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateResponse.cluster_analysis_template:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.ClusterAnalysisTemplate
+	0,   // 61: akuity.io.kargo.service.v1alpha1.GetAnalysisRunRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	166, // 62: akuity.io.kargo.service.v1alpha1.GetAnalysisRunResponse.analysis_run:type_name -> github.com.akuity.kargo.api.stubs.rollouts.v1alpha1.AnalysisRun
+	167, // 63: akuity.io.kargo.service.v1alpha1.ListProjectEventsResponse.events:type_name -> k8s.io.api.core.v1.Event
+	168, // 64: akuity.io.kargo.service.v1alpha1.CreateRoleRequest.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
+	168, // 65: akuity.io.kargo.service.v1alpha1.CreateRoleResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
+	0,   // 66: akuity.io.kargo.service.v1alpha1.GetRoleRequest.format:type_name -> akuity.io.kargo.service.v1alpha1.RawFormat
+	168, // 67: akuity.io.kargo.service.v1alpha1.GetRoleResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
+	169, // 68: akuity.io.kargo.service.v1alpha1.GetRoleResponse.resources:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.RoleResources
+	170, // 69: akuity.io.kargo.service.v1alpha1.Claims.claims:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Claim
+	138, // 70: akuity.io.kargo.service.v1alpha1.GrantRequest.user_claims:type_name -> akuity.io.kargo.service.v1alpha1.Claims
+	171, // 71: akuity.io.kargo.service.v1alpha1.GrantRequest.resource_details:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.ResourceDetails
+	168, // 72: akuity.io.kargo.service.v1alpha1.GrantResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
+	168, // 73: akuity.io.kargo.service.v1alpha1.ListRolesResponse.roles:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
+	169, // 74: akuity.io.kargo.service.v1alpha1.ListRolesResponse.resources:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.RoleResources
+	138, // 75: akuity.io.kargo.service.v1alpha1.RevokeRequest.user_claims:type_name -> akuity.io.kargo.service.v1alpha1.Claims
+	171, // 76: akuity.io.kargo.service.v1alpha1.RevokeRequest.resource_details:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.ResourceDetails
+	168, // 77: akuity.io.kargo.service.v1alpha1.RevokeResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
+	168, // 78: akuity.io.kargo.service.v1alpha1.UpdateRoleRequest.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
+	168, // 79: akuity.io.kargo.service.v1alpha1.UpdateRoleResponse.role:type_name -> github.com.akuity.kargo.api.rbac.v1alpha1.Role
+	6,   // 80: akuity.io.kargo.service.v1alpha1.GetConfigResponse.ArgocdShardsEntry.value:type_name -> akuity.io.kargo.service.v1alpha1.ArgoCDShard
+	29,  // 81: akuity.io.kargo.service.v1alpha1.ListImagesResponse.ImagesEntry.value:type_name -> akuity.io.kargo.service.v1alpha1.TagMap
+	30,  // 82: akuity.io.kargo.service.v1alpha1.TagMap.TagsEntry.value:type_name -> akuity.io.kargo.service.v1alpha1.ImageStageMap
+	71,  // 83: akuity.io.kargo.service.v1alpha1.QueryFreightResponse.GroupsEntry.value:type_name -> akuity.io.kargo.service.v1alpha1.FreightList
+	3,   // 84: akuity.io.kargo.service.v1alpha1.KargoService.GetVersionInfo:input_type -> akuity.io.kargo.service.v1alpha1.GetVersionInfoRequest
+	5,   // 85: akuity.io.kargo.service.v1alpha1.KargoService.GetConfig:input_type -> akuity.io.kargo.service.v1alpha1.GetConfigRequest
+	8,   // 86: akuity.io.kargo.service.v1alpha1.KargoService.GetPublicConfig:input_type -> akuity.io.kargo.service.v1alpha1.GetPublicConfigRequest
+	11,  // 87: akuity.io.kargo.service.v1alpha1.KargoService.AdminLogin:input_type -> akuity.io.kargo.service.v1alpha1.AdminLoginRequest
+	13,  // 88: akuity.io.kargo.service.v1alpha1.KargoService.CreateResource:input_type -> akuity.io.kargo.service.v1alpha1.CreateResourceRequest
+	16,  // 89: akuity.io.kargo.service.v1alpha1.KargoService.CreateOrUpdateResource:input_type -> akuity.io.kargo.service.v1alpha1.CreateOrUpdateResourceRequest
+	19,  // 90: akuity.io.kargo.service.v1alpha1.KargoService.UpdateResource:input_type -> akuity.io.kargo.service.v1alpha1.UpdateResourceRequest
+	22,  // 91: akuity.io.kargo.service.v1alpha1.KargoService.DeleteResource:input_type -> akuity.io.kargo.service.v1alpha1.DeleteResourceRequest
+	25,  // 92: akuity.io.kargo.service.v1alpha1.KargoService.ListStages:input_type -> akuity.io.kargo.service.v1alpha1.ListStagesRequest
+	27,  // 93: akuity.io.kargo.service.v1alpha1.KargoService.ListImages:input_type -> akuity.io.kargo.service.v1alpha1.ListImagesRequest
+	31,  // 94: akuity.io.kargo.service.v1alpha1.KargoService.GetStage:input_type -> akuity.io.kargo.service.v1alpha1.GetStageRequest
+	33,  // 95: akuity.io.kargo.service.v1alpha1.KargoService.WatchStages:input_type -> akuity.io.kargo.service.v1alpha1.WatchStagesRequest
+	35,  // 96: akuity.io.kargo.service.v1alpha1.KargoService.DeleteStage:input_type -> akuity.io.kargo.service.v1alpha1.DeleteStageRequest
+	37,  // 97: akuity.io.kargo.service.v1alpha1.KargoService.RefreshStage:input_type -> akuity.io.kargo.service.v1alpha1.RefreshStageRequest
+	39,  // 98: akuity.io.kargo.service.v1alpha1.KargoService.ListPromotions:input_type -> akuity.io.kargo.service.v1alpha1.ListPromotionsRequest
+	41,  // 99: akuity.io.kargo.service.v1alpha1.KargoService.WatchPromotions:input_type -> akuity.io.kargo.service.v1alpha1.WatchPromotionsRequest
+	43,  // 100: akuity.io.kargo.service.v1alpha1.KargoService.GetPromotion:input_type -> akuity.io.kargo.service.v1alpha1.GetPromotionRequest
+	45,  // 101: akuity.io.kargo.service.v1alpha1.KargoService.WatchPromotion:input_type -> akuity.io.kargo.service.v1alpha1.WatchPromotionRequest
+	47,  // 102: akuity.io.kargo.service.v1alpha1.KargoService.AbortPromotion:input_type -> akuity.io.kargo.service.v1alpha1.AbortPromotionRequest
+	49,  // 103: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProject:input_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectRequest
+	55,  // 104: akuity.io.kargo.service.v1alpha1.KargoService.GetProject:input_type -> akuity.io.kargo.service.v1alpha1.GetProjectRequest
+	57,  // 105: akuity.io.kargo.service.v1alpha1.KargoService.ListProjects:input_type -> akuity.io.kargo.service.v1alpha1.ListProjectsRequest
+	51,  // 106: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectConfig:input_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectConfigRequest
+	53,  // 107: akuity.io.kargo.service.v1alpha1.KargoService.GetProjectConfig:input_type -> akuity.io.kargo.service.v1alpha1.GetProjectConfigRequest
+	59,  // 108: akuity.io.kargo.service.v1alpha1.KargoService.ApproveFreight:input_type -> akuity.io.kargo.service.v1alpha1.ApproveFreightRequest
+	61,  // 109: akuity.io.kargo.service.v1alpha1.KargoService.DeleteFreight:input_type -> akuity.io.kargo.service.v1alpha1.DeleteFreightRequest
+	63,  // 110: akuity.io.kargo.service.v1alpha1.KargoService.GetFreight:input_type -> akuity.io.kargo.service.v1alpha1.GetFreightRequest
+	65,  // 111: akuity.io.kargo.service.v1alpha1.KargoService.PromoteToStage:input_type -> akuity.io.kargo.service.v1alpha1.PromoteToStageRequest
+	67,  // 112: akuity.io.kargo.service.v1alpha1.KargoService.PromoteDownstream:input_type -> akuity.io.kargo.service.v1alpha1.PromoteDownstreamRequest
+	69,  // 113: akuity.io.kargo.service.v1alpha1.KargoService.QueryFreight:input_type -> akuity.io.kargo.service.v1alpha1.QueryFreightRequest
+	72,  // 114: akuity.io.kargo.service.v1alpha1.KargoService.UpdateFreightAlias:input_type -> akuity.io.kargo.service.v1alpha1.UpdateFreightAliasRequest
+	74,  // 115: akuity.io.kargo.service.v1alpha1.KargoService.Reverify:input_type -> akuity.io.kargo.service.v1alpha1.ReverifyRequest
+	76,  // 116: akuity.io.kargo.service.v1alpha1.KargoService.AbortVerification:input_type -> akuity.io.kargo.service.v1alpha1.AbortVerificationRequest
+	78,  // 117: akuity.io.kargo.service.v1alpha1.KargoService.ListWarehouses:input_type -> akuity.io.kargo.service.v1alpha1.ListWarehousesRequest
+	80,  // 118: akuity.io.kargo.service.v1alpha1.KargoService.GetWarehouse:input_type -> akuity.io.kargo.service.v1alpha1.GetWarehouseRequest
+	82,  // 119: akuity.io.kargo.service.v1alpha1.KargoService.WatchWarehouses:input_type -> akuity.io.kargo.service.v1alpha1.WatchWarehousesRequest
+	84,  // 120: akuity.io.kargo.service.v1alpha1.KargoService.DeleteWarehouse:input_type -> akuity.io.kargo.service.v1alpha1.DeleteWarehouseRequest
+	86,  // 121: akuity.io.kargo.service.v1alpha1.KargoService.RefreshWarehouse:input_type -> akuity.io.kargo.service.v1alpha1.RefreshWarehouseRequest
+	96,  // 122: akuity.io.kargo.service.v1alpha1.KargoService.CreateCredentials:input_type -> akuity.io.kargo.service.v1alpha1.CreateCredentialsRequest
+	98,  // 123: akuity.io.kargo.service.v1alpha1.KargoService.DeleteCredentials:input_type -> akuity.io.kargo.service.v1alpha1.DeleteCredentialsRequest
+	100, // 124: akuity.io.kargo.service.v1alpha1.KargoService.GetCredentials:input_type -> akuity.io.kargo.service.v1alpha1.GetCredentialsRequest
+	102, // 125: akuity.io.kargo.service.v1alpha1.KargoService.ListCredentials:input_type -> akuity.io.kargo.service.v1alpha1.ListCredentialsRequest
+	104, // 126: akuity.io.kargo.service.v1alpha1.KargoService.UpdateCredentials:input_type -> akuity.io.kargo.service.v1alpha1.UpdateCredentialsRequest
+	88,  // 127: akuity.io.kargo.service.v1alpha1.KargoService.ListProjectSecrets:input_type -> akuity.io.kargo.service.v1alpha1.ListProjectSecretsRequest
+	90,  // 128: akuity.io.kargo.service.v1alpha1.KargoService.CreateProjectSecret:input_type -> akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest
+	92,  // 129: akuity.io.kargo.service.v1alpha1.KargoService.UpdateProjectSecret:input_type -> akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest
+	94,  // 130: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectSecret:input_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectSecretRequest
+	106, // 131: akuity.io.kargo.service.v1alpha1.KargoService.ListAnalysisTemplates:input_type -> akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesRequest
+	112, // 132: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisTemplate:input_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateRequest
+	126, // 133: akuity.io.kargo.service.v1alpha1.KargoService.DeleteAnalysisTemplate:input_type -> akuity.io.kargo.service.v1alpha1.DeleteAnalysisTemplateRequest
+	118, // 134: akuity.io.kargo.service.v1alpha1.KargoService.ListClusterAnalysisTemplates:input_type -> akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesRequest
+	120, // 135: akuity.io.kargo.service.v1alpha1.KargoService.GetClusterAnalysisTemplate:input_type -> akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateRequest
+	128, // 136: akuity.io.kargo.service.v1alpha1.KargoService.DeleteClusterAnalysisTemplate:input_type -> akuity.io.kargo.service.v1alpha1.DeleteClusterAnalysisTemplateRequest
+	122, // 137: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisRun:input_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisRunRequest
+	124, // 138: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisRunLogs:input_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsRequest
+	130, // 139: akuity.io.kargo.service.v1alpha1.KargoService.ListProjectEvents:input_type -> akuity.io.kargo.service.v1alpha1.ListProjectEventsRequest
+	108, // 140: akuity.io.kargo.service.v1alpha1.KargoService.ListPromotionTasks:input_type -> akuity.io.kargo.service.v1alpha1.ListPromotionTasksRequest
+	110, // 141: akuity.io.kargo.service.v1alpha1.KargoService.ListClusterPromotionTasks:input_type -> akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksRequest
+	114, // 142: akuity.io.kargo.service.v1alpha1.KargoService.GetPromotionTask:input_type -> akuity.io.kargo.service.v1alpha1.GetPromotionTaskRequest
+	116, // 143: akuity.io.kargo.service.v1alpha1.KargoService.GetClusterPromotionTask:input_type -> akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskRequest
+	132, // 144: akuity.io.kargo.service.v1alpha1.KargoService.CreateRole:input_type -> akuity.io.kargo.service.v1alpha1.CreateRoleRequest
+	134, // 145: akuity.io.kargo.service.v1alpha1.KargoService.DeleteRole:input_type -> akuity.io.kargo.service.v1alpha1.DeleteRoleRequest
+	136, // 146: akuity.io.kargo.service.v1alpha1.KargoService.GetRole:input_type -> akuity.io.kargo.service.v1alpha1.GetRoleRequest
+	139, // 147: akuity.io.kargo.service.v1alpha1.KargoService.Grant:input_type -> akuity.io.kargo.service.v1alpha1.GrantRequest
+	141, // 148: akuity.io.kargo.service.v1alpha1.KargoService.ListRoles:input_type -> akuity.io.kargo.service.v1alpha1.ListRolesRequest
+	143, // 149: akuity.io.kargo.service.v1alpha1.KargoService.Revoke:input_type -> akuity.io.kargo.service.v1alpha1.RevokeRequest
+	145, // 150: akuity.io.kargo.service.v1alpha1.KargoService.UpdateRole:input_type -> akuity.io.kargo.service.v1alpha1.UpdateRoleRequest
+	4,   // 151: akuity.io.kargo.service.v1alpha1.KargoService.GetVersionInfo:output_type -> akuity.io.kargo.service.v1alpha1.GetVersionInfoResponse
+	7,   // 152: akuity.io.kargo.service.v1alpha1.KargoService.GetConfig:output_type -> akuity.io.kargo.service.v1alpha1.GetConfigResponse
+	9,   // 153: akuity.io.kargo.service.v1alpha1.KargoService.GetPublicConfig:output_type -> akuity.io.kargo.service.v1alpha1.GetPublicConfigResponse
+	12,  // 154: akuity.io.kargo.service.v1alpha1.KargoService.AdminLogin:output_type -> akuity.io.kargo.service.v1alpha1.AdminLoginResponse
+	15,  // 155: akuity.io.kargo.service.v1alpha1.KargoService.CreateResource:output_type -> akuity.io.kargo.service.v1alpha1.CreateResourceResponse
+	18,  // 156: akuity.io.kargo.service.v1alpha1.KargoService.CreateOrUpdateResource:output_type -> akuity.io.kargo.service.v1alpha1.CreateOrUpdateResourceResponse
+	21,  // 157: akuity.io.kargo.service.v1alpha1.KargoService.UpdateResource:output_type -> akuity.io.kargo.service.v1alpha1.UpdateResourceResponse
+	24,  // 158: akuity.io.kargo.service.v1alpha1.KargoService.DeleteResource:output_type -> akuity.io.kargo.service.v1alpha1.DeleteResourceResponse
+	26,  // 159: akuity.io.kargo.service.v1alpha1.KargoService.ListStages:output_type -> akuity.io.kargo.service.v1alpha1.ListStagesResponse
+	28,  // 160: akuity.io.kargo.service.v1alpha1.KargoService.ListImages:output_type -> akuity.io.kargo.service.v1alpha1.ListImagesResponse
+	32,  // 161: akuity.io.kargo.service.v1alpha1.KargoService.GetStage:output_type -> akuity.io.kargo.service.v1alpha1.GetStageResponse
+	34,  // 162: akuity.io.kargo.service.v1alpha1.KargoService.WatchStages:output_type -> akuity.io.kargo.service.v1alpha1.WatchStagesResponse
+	36,  // 163: akuity.io.kargo.service.v1alpha1.KargoService.DeleteStage:output_type -> akuity.io.kargo.service.v1alpha1.DeleteStageResponse
+	38,  // 164: akuity.io.kargo.service.v1alpha1.KargoService.RefreshStage:output_type -> akuity.io.kargo.service.v1alpha1.RefreshStageResponse
+	40,  // 165: akuity.io.kargo.service.v1alpha1.KargoService.ListPromotions:output_type -> akuity.io.kargo.service.v1alpha1.ListPromotionsResponse
+	42,  // 166: akuity.io.kargo.service.v1alpha1.KargoService.WatchPromotions:output_type -> akuity.io.kargo.service.v1alpha1.WatchPromotionsResponse
+	44,  // 167: akuity.io.kargo.service.v1alpha1.KargoService.GetPromotion:output_type -> akuity.io.kargo.service.v1alpha1.GetPromotionResponse
+	46,  // 168: akuity.io.kargo.service.v1alpha1.KargoService.WatchPromotion:output_type -> akuity.io.kargo.service.v1alpha1.WatchPromotionResponse
+	48,  // 169: akuity.io.kargo.service.v1alpha1.KargoService.AbortPromotion:output_type -> akuity.io.kargo.service.v1alpha1.AbortPromotionResponse
+	50,  // 170: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProject:output_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectResponse
+	56,  // 171: akuity.io.kargo.service.v1alpha1.KargoService.GetProject:output_type -> akuity.io.kargo.service.v1alpha1.GetProjectResponse
+	58,  // 172: akuity.io.kargo.service.v1alpha1.KargoService.ListProjects:output_type -> akuity.io.kargo.service.v1alpha1.ListProjectsResponse
+	52,  // 173: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectConfig:output_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectConfigResponse
+	54,  // 174: akuity.io.kargo.service.v1alpha1.KargoService.GetProjectConfig:output_type -> akuity.io.kargo.service.v1alpha1.GetProjectConfigResponse
+	60,  // 175: akuity.io.kargo.service.v1alpha1.KargoService.ApproveFreight:output_type -> akuity.io.kargo.service.v1alpha1.ApproveFreightResponse
+	62,  // 176: akuity.io.kargo.service.v1alpha1.KargoService.DeleteFreight:output_type -> akuity.io.kargo.service.v1alpha1.DeleteFreightResponse
+	64,  // 177: akuity.io.kargo.service.v1alpha1.KargoService.GetFreight:output_type -> akuity.io.kargo.service.v1alpha1.GetFreightResponse
+	66,  // 178: akuity.io.kargo.service.v1alpha1.KargoService.PromoteToStage:output_type -> akuity.io.kargo.service.v1alpha1.PromoteToStageResponse
+	68,  // 179: akuity.io.kargo.service.v1alpha1.KargoService.PromoteDownstream:output_type -> akuity.io.kargo.service.v1alpha1.PromoteDownstreamResponse
+	70,  // 180: akuity.io.kargo.service.v1alpha1.KargoService.QueryFreight:output_type -> akuity.io.kargo.service.v1alpha1.QueryFreightResponse
+	73,  // 181: akuity.io.kargo.service.v1alpha1.KargoService.UpdateFreightAlias:output_type -> akuity.io.kargo.service.v1alpha1.UpdateFreightAliasResponse
+	75,  // 182: akuity.io.kargo.service.v1alpha1.KargoService.Reverify:output_type -> akuity.io.kargo.service.v1alpha1.ReverifyResponse
+	77,  // 183: akuity.io.kargo.service.v1alpha1.KargoService.AbortVerification:output_type -> akuity.io.kargo.service.v1alpha1.AbortVerificationResponse
+	79,  // 184: akuity.io.kargo.service.v1alpha1.KargoService.ListWarehouses:output_type -> akuity.io.kargo.service.v1alpha1.ListWarehousesResponse
+	81,  // 185: akuity.io.kargo.service.v1alpha1.KargoService.GetWarehouse:output_type -> akuity.io.kargo.service.v1alpha1.GetWarehouseResponse
+	83,  // 186: akuity.io.kargo.service.v1alpha1.KargoService.WatchWarehouses:output_type -> akuity.io.kargo.service.v1alpha1.WatchWarehousesResponse
+	85,  // 187: akuity.io.kargo.service.v1alpha1.KargoService.DeleteWarehouse:output_type -> akuity.io.kargo.service.v1alpha1.DeleteWarehouseResponse
+	87,  // 188: akuity.io.kargo.service.v1alpha1.KargoService.RefreshWarehouse:output_type -> akuity.io.kargo.service.v1alpha1.RefreshWarehouseResponse
+	97,  // 189: akuity.io.kargo.service.v1alpha1.KargoService.CreateCredentials:output_type -> akuity.io.kargo.service.v1alpha1.CreateCredentialsResponse
+	99,  // 190: akuity.io.kargo.service.v1alpha1.KargoService.DeleteCredentials:output_type -> akuity.io.kargo.service.v1alpha1.DeleteCredentialsResponse
+	101, // 191: akuity.io.kargo.service.v1alpha1.KargoService.GetCredentials:output_type -> akuity.io.kargo.service.v1alpha1.GetCredentialsResponse
+	103, // 192: akuity.io.kargo.service.v1alpha1.KargoService.ListCredentials:output_type -> akuity.io.kargo.service.v1alpha1.ListCredentialsResponse
+	105, // 193: akuity.io.kargo.service.v1alpha1.KargoService.UpdateCredentials:output_type -> akuity.io.kargo.service.v1alpha1.UpdateCredentialsResponse
+	89,  // 194: akuity.io.kargo.service.v1alpha1.KargoService.ListProjectSecrets:output_type -> akuity.io.kargo.service.v1alpha1.ListProjectSecretsResponse
+	91,  // 195: akuity.io.kargo.service.v1alpha1.KargoService.CreateProjectSecret:output_type -> akuity.io.kargo.service.v1alpha1.CreateProjectSecretResponse
+	93,  // 196: akuity.io.kargo.service.v1alpha1.KargoService.UpdateProjectSecret:output_type -> akuity.io.kargo.service.v1alpha1.UpdateProjectSecretResponse
+	95,  // 197: akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectSecret:output_type -> akuity.io.kargo.service.v1alpha1.DeleteProjectSecretResponse
+	107, // 198: akuity.io.kargo.service.v1alpha1.KargoService.ListAnalysisTemplates:output_type -> akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesResponse
+	113, // 199: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisTemplate:output_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateResponse
+	127, // 200: akuity.io.kargo.service.v1alpha1.KargoService.DeleteAnalysisTemplate:output_type -> akuity.io.kargo.service.v1alpha1.DeleteAnalysisTemplateResponse
+	119, // 201: akuity.io.kargo.service.v1alpha1.KargoService.ListClusterAnalysisTemplates:output_type -> akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesResponse
+	121, // 202: akuity.io.kargo.service.v1alpha1.KargoService.GetClusterAnalysisTemplate:output_type -> akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateResponse
+	129, // 203: akuity.io.kargo.service.v1alpha1.KargoService.DeleteClusterAnalysisTemplate:output_type -> akuity.io.kargo.service.v1alpha1.DeleteClusterAnalysisTemplateResponse
+	123, // 204: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisRun:output_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisRunResponse
+	125, // 205: akuity.io.kargo.service.v1alpha1.KargoService.GetAnalysisRunLogs:output_type -> akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsResponse
+	131, // 206: akuity.io.kargo.service.v1alpha1.KargoService.ListProjectEvents:output_type -> akuity.io.kargo.service.v1alpha1.ListProjectEventsResponse
+	109, // 207: akuity.io.kargo.service.v1alpha1.KargoService.ListPromotionTasks:output_type -> akuity.io.kargo.service.v1alpha1.ListPromotionTasksResponse
+	111, // 208: akuity.io.kargo.service.v1alpha1.KargoService.ListClusterPromotionTasks:output_type -> akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksResponse
+	115, // 209: akuity.io.kargo.service.v1alpha1.KargoService.GetPromotionTask:output_type -> akuity.io.kargo.service.v1alpha1.GetPromotionTaskResponse
+	117, // 210: akuity.io.kargo.service.v1alpha1.KargoService.GetClusterPromotionTask:output_type -> akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskResponse
+	133, // 211: akuity.io.kargo.service.v1alpha1.KargoService.CreateRole:output_type -> akuity.io.kargo.service.v1alpha1.CreateRoleResponse
+	135, // 212: akuity.io.kargo.service.v1alpha1.KargoService.DeleteRole:output_type -> akuity.io.kargo.service.v1alpha1.DeleteRoleResponse
+	137, // 213: akuity.io.kargo.service.v1alpha1.KargoService.GetRole:output_type -> akuity.io.kargo.service.v1alpha1.GetRoleResponse
+	140, // 214: akuity.io.kargo.service.v1alpha1.KargoService.Grant:output_type -> akuity.io.kargo.service.v1alpha1.GrantResponse
+	142, // 215: akuity.io.kargo.service.v1alpha1.KargoService.ListRoles:output_type -> akuity.io.kargo.service.v1alpha1.ListRolesResponse
+	144, // 216: akuity.io.kargo.service.v1alpha1.KargoService.Revoke:output_type -> akuity.io.kargo.service.v1alpha1.RevokeResponse
+	146, // 217: akuity.io.kargo.service.v1alpha1.KargoService.UpdateRole:output_type -> akuity.io.kargo.service.v1alpha1.UpdateRoleResponse
+	151, // [151:218] is the sub-list for method output_type
+	84,  // [84:151] is the sub-list for method input_type
+	84,  // [84:84] is the sub-list for extension type_name
+	84,  // [84:84] is the sub-list for extension extendee
+	0,   // [0:84] is the sub-list for field type_name
 }
 
 func init() { file_api_service_v1alpha1_service_proto_init() }
@@ -10664,7 +10936,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetProjectRequest); i {
+			switch v := v.(*DeleteProjectConfigRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10676,7 +10948,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetProjectResponse); i {
+			switch v := v.(*DeleteProjectConfigResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10688,7 +10960,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListProjectsRequest); i {
+			switch v := v.(*GetProjectConfigRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10700,7 +10972,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListProjectsResponse); i {
+			switch v := v.(*GetProjectConfigResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10712,7 +10984,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ApproveFreightRequest); i {
+			switch v := v.(*GetProjectRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10724,7 +10996,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ApproveFreightResponse); i {
+			switch v := v.(*GetProjectResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10736,7 +11008,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteFreightRequest); i {
+			switch v := v.(*ListProjectsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10748,7 +11020,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteFreightResponse); i {
+			switch v := v.(*ListProjectsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10760,7 +11032,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetFreightRequest); i {
+			switch v := v.(*ApproveFreightRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10772,7 +11044,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetFreightResponse); i {
+			switch v := v.(*ApproveFreightResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10784,7 +11056,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PromoteToStageRequest); i {
+			switch v := v.(*DeleteFreightRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10796,7 +11068,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PromoteToStageResponse); i {
+			switch v := v.(*DeleteFreightResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10808,7 +11080,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PromoteDownstreamRequest); i {
+			switch v := v.(*GetFreightRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10820,7 +11092,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PromoteDownstreamResponse); i {
+			switch v := v.(*GetFreightResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10832,7 +11104,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*QueryFreightRequest); i {
+			switch v := v.(*PromoteToStageRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10844,7 +11116,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*QueryFreightResponse); i {
+			switch v := v.(*PromoteToStageResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10856,7 +11128,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*FreightList); i {
+			switch v := v.(*PromoteDownstreamRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10868,7 +11140,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateFreightAliasRequest); i {
+			switch v := v.(*PromoteDownstreamResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10880,7 +11152,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateFreightAliasResponse); i {
+			switch v := v.(*QueryFreightRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10892,7 +11164,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ReverifyRequest); i {
+			switch v := v.(*QueryFreightResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10904,7 +11176,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ReverifyResponse); i {
+			switch v := v.(*FreightList); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10916,7 +11188,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*AbortVerificationRequest); i {
+			switch v := v.(*UpdateFreightAliasRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10928,7 +11200,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*AbortVerificationResponse); i {
+			switch v := v.(*UpdateFreightAliasResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10940,7 +11212,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListWarehousesRequest); i {
+			switch v := v.(*ReverifyRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10952,7 +11224,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListWarehousesResponse); i {
+			switch v := v.(*ReverifyResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10964,7 +11236,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetWarehouseRequest); i {
+			switch v := v.(*AbortVerificationRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10976,7 +11248,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetWarehouseResponse); i {
+			switch v := v.(*AbortVerificationResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -10988,7 +11260,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*WatchWarehousesRequest); i {
+			switch v := v.(*ListWarehousesRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11000,7 +11272,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*WatchWarehousesResponse); i {
+			switch v := v.(*ListWarehousesResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11012,7 +11284,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteWarehouseRequest); i {
+			switch v := v.(*GetWarehouseRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11024,7 +11296,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteWarehouseResponse); i {
+			switch v := v.(*GetWarehouseResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11036,7 +11308,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RefreshWarehouseRequest); i {
+			switch v := v.(*WatchWarehousesRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11048,7 +11320,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RefreshWarehouseResponse); i {
+			switch v := v.(*WatchWarehousesResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11060,7 +11332,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListProjectSecretsRequest); i {
+			switch v := v.(*DeleteWarehouseRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11072,7 +11344,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListProjectSecretsResponse); i {
+			switch v := v.(*DeleteWarehouseResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11084,7 +11356,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateProjectSecretRequest); i {
+			switch v := v.(*RefreshWarehouseRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11096,7 +11368,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateProjectSecretResponse); i {
+			switch v := v.(*RefreshWarehouseResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11108,7 +11380,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateProjectSecretRequest); i {
+			switch v := v.(*ListProjectSecretsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11120,7 +11392,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateProjectSecretResponse); i {
+			switch v := v.(*ListProjectSecretsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11132,7 +11404,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteProjectSecretRequest); i {
+			switch v := v.(*CreateProjectSecretRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11144,7 +11416,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteProjectSecretResponse); i {
+			switch v := v.(*CreateProjectSecretResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11156,7 +11428,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateCredentialsRequest); i {
+			switch v := v.(*UpdateProjectSecretRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11168,7 +11440,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateCredentialsResponse); i {
+			switch v := v.(*UpdateProjectSecretResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11180,7 +11452,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteCredentialsRequest); i {
+			switch v := v.(*DeleteProjectSecretRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11192,7 +11464,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteCredentialsResponse); i {
+			switch v := v.(*DeleteProjectSecretResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11204,7 +11476,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetCredentialsRequest); i {
+			switch v := v.(*CreateCredentialsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11216,7 +11488,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetCredentialsResponse); i {
+			switch v := v.(*CreateCredentialsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11228,7 +11500,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListCredentialsRequest); i {
+			switch v := v.(*DeleteCredentialsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11240,7 +11512,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListCredentialsResponse); i {
+			switch v := v.(*DeleteCredentialsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11252,7 +11524,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateCredentialsRequest); i {
+			switch v := v.(*GetCredentialsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11264,7 +11536,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateCredentialsResponse); i {
+			switch v := v.(*GetCredentialsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11276,7 +11548,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListAnalysisTemplatesRequest); i {
+			switch v := v.(*ListCredentialsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11288,7 +11560,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListAnalysisTemplatesResponse); i {
+			switch v := v.(*ListCredentialsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11300,7 +11572,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListPromotionTasksRequest); i {
+			switch v := v.(*UpdateCredentialsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11312,7 +11584,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListPromotionTasksResponse); i {
+			switch v := v.(*UpdateCredentialsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11324,7 +11596,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListClusterPromotionTasksRequest); i {
+			switch v := v.(*ListAnalysisTemplatesRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11336,7 +11608,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListClusterPromotionTasksResponse); i {
+			switch v := v.(*ListAnalysisTemplatesResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11348,7 +11620,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetAnalysisTemplateRequest); i {
+			switch v := v.(*ListPromotionTasksRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11360,7 +11632,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetAnalysisTemplateResponse); i {
+			switch v := v.(*ListPromotionTasksResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11372,7 +11644,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPromotionTaskRequest); i {
+			switch v := v.(*ListClusterPromotionTasksRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11384,7 +11656,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPromotionTaskResponse); i {
+			switch v := v.(*ListClusterPromotionTasksResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11396,7 +11668,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetClusterPromotionTaskRequest); i {
+			switch v := v.(*GetAnalysisTemplateRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11408,7 +11680,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetClusterPromotionTaskResponse); i {
+			switch v := v.(*GetAnalysisTemplateResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11420,7 +11692,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListClusterAnalysisTemplatesRequest); i {
+			switch v := v.(*GetPromotionTaskRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11432,7 +11704,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListClusterAnalysisTemplatesResponse); i {
+			switch v := v.(*GetPromotionTaskResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11444,7 +11716,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetClusterAnalysisTemplateRequest); i {
+			switch v := v.(*GetClusterPromotionTaskRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11456,7 +11728,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetClusterAnalysisTemplateResponse); i {
+			switch v := v.(*GetClusterPromotionTaskResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11468,7 +11740,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetAnalysisRunRequest); i {
+			switch v := v.(*ListClusterAnalysisTemplatesRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11480,7 +11752,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetAnalysisRunResponse); i {
+			switch v := v.(*ListClusterAnalysisTemplatesResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11492,7 +11764,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetAnalysisRunLogsRequest); i {
+			switch v := v.(*GetClusterAnalysisTemplateRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11504,7 +11776,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetAnalysisRunLogsResponse); i {
+			switch v := v.(*GetClusterAnalysisTemplateResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11516,7 +11788,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteAnalysisTemplateRequest); i {
+			switch v := v.(*GetAnalysisRunRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11528,7 +11800,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteAnalysisTemplateResponse); i {
+			switch v := v.(*GetAnalysisRunResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11540,7 +11812,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteClusterAnalysisTemplateRequest); i {
+			switch v := v.(*GetAnalysisRunLogsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11552,7 +11824,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteClusterAnalysisTemplateResponse); i {
+			switch v := v.(*GetAnalysisRunLogsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11564,7 +11836,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListProjectEventsRequest); i {
+			switch v := v.(*DeleteAnalysisTemplateRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11576,7 +11848,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListProjectEventsResponse); i {
+			switch v := v.(*DeleteAnalysisTemplateResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11588,7 +11860,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateRoleRequest); i {
+			switch v := v.(*DeleteClusterAnalysisTemplateRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11600,7 +11872,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateRoleResponse); i {
+			switch v := v.(*DeleteClusterAnalysisTemplateResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11612,7 +11884,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteRoleRequest); i {
+			switch v := v.(*ListProjectEventsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11624,7 +11896,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteRoleResponse); i {
+			switch v := v.(*ListProjectEventsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11636,7 +11908,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetRoleRequest); i {
+			switch v := v.(*CreateRoleRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11648,7 +11920,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetRoleResponse); i {
+			switch v := v.(*CreateRoleResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11660,7 +11932,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Claims); i {
+			switch v := v.(*DeleteRoleRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11672,7 +11944,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GrantRequest); i {
+			switch v := v.(*DeleteRoleResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11684,7 +11956,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GrantResponse); i {
+			switch v := v.(*GetRoleRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11696,7 +11968,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListRolesRequest); i {
+			switch v := v.(*GetRoleResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11708,7 +11980,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListRolesResponse); i {
+			switch v := v.(*Claims); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11720,7 +11992,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RevokeRequest); i {
+			switch v := v.(*GrantRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11732,7 +12004,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RevokeResponse); i {
+			switch v := v.(*GrantResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11744,7 +12016,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateRoleRequest); i {
+			switch v := v.(*ListRolesRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -11756,6 +12028,54 @@ func file_api_service_v1alpha1_service_proto_init() {
 			}
 		}
 		file_api_service_v1alpha1_service_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ListRolesResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_service_v1alpha1_service_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RevokeRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_service_v1alpha1_service_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RevokeResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_service_v1alpha1_service_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateRoleRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_service_v1alpha1_service_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*UpdateRoleResponse); i {
 			case 0:
 				return &v.state
@@ -11796,53 +12116,57 @@ func file_api_service_v1alpha1_service_proto_init() {
 		(*GetPromotionResponse_Promotion)(nil),
 		(*GetPromotionResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[51].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[53].OneofWrappers = []interface{}{
+		(*GetProjectConfigResponse_ProjectConfig)(nil),
+		(*GetProjectConfigResponse_Raw)(nil),
+	}
+	file_api_service_v1alpha1_service_proto_msgTypes[55].OneofWrappers = []interface{}{
 		(*GetProjectResponse_Project)(nil),
 		(*GetProjectResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[52].OneofWrappers = []interface{}{}
-	file_api_service_v1alpha1_service_proto_msgTypes[59].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[56].OneofWrappers = []interface{}{}
+	file_api_service_v1alpha1_service_proto_msgTypes[63].OneofWrappers = []interface{}{
 		(*GetFreightResponse_Freight)(nil),
 		(*GetFreightResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[76].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[80].OneofWrappers = []interface{}{
 		(*GetWarehouseResponse_Warehouse)(nil),
 		(*GetWarehouseResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[96].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[100].OneofWrappers = []interface{}{
 		(*GetCredentialsResponse_Credentials)(nil),
 		(*GetCredentialsResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[108].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[112].OneofWrappers = []interface{}{
 		(*GetAnalysisTemplateResponse_AnalysisTemplate)(nil),
 		(*GetAnalysisTemplateResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[110].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[114].OneofWrappers = []interface{}{
 		(*GetPromotionTaskResponse_PromotionTask)(nil),
 		(*GetPromotionTaskResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[112].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[116].OneofWrappers = []interface{}{
 		(*GetClusterPromotionTaskResponse_PromotionTask)(nil),
 		(*GetClusterPromotionTaskResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[116].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[120].OneofWrappers = []interface{}{
 		(*GetClusterAnalysisTemplateResponse_ClusterAnalysisTemplate)(nil),
 		(*GetClusterAnalysisTemplateResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[118].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[122].OneofWrappers = []interface{}{
 		(*GetAnalysisRunResponse_AnalysisRun)(nil),
 		(*GetAnalysisRunResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[132].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[136].OneofWrappers = []interface{}{
 		(*GetRoleResponse_Role)(nil),
 		(*GetRoleResponse_Resources)(nil),
 		(*GetRoleResponse_Raw)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[134].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[138].OneofWrappers = []interface{}{
 		(*GrantRequest_UserClaims)(nil),
 		(*GrantRequest_ResourceDetails)(nil),
 	}
-	file_api_service_v1alpha1_service_proto_msgTypes[138].OneofWrappers = []interface{}{
+	file_api_service_v1alpha1_service_proto_msgTypes[142].OneofWrappers = []interface{}{
 		(*RevokeRequest_UserClaims)(nil),
 		(*RevokeRequest_ResourceDetails)(nil),
 	}
@@ -11852,7 +12176,7 @@ func file_api_service_v1alpha1_service_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_api_service_v1alpha1_service_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   149,
+			NumMessages:   153,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/api/service/v1alpha1/service.proto b/api/service/v1alpha1/service.proto
index 8b0939aa..a6a4d5b0 100644
--- a/api/service/v1alpha1/service.proto
+++ b/api/service/v1alpha1/service.proto
@@ -53,6 +53,8 @@ service KargoService {
   rpc DeleteProject(DeleteProjectRequest) returns (DeleteProjectResponse);
   rpc GetProject(GetProjectRequest) returns (GetProjectResponse);
   rpc ListProjects(ListProjectsRequest) returns (ListProjectsResponse);
+  rpc DeleteProjectConfig(DeleteProjectConfigRequest) returns (DeleteProjectConfigResponse);
+  rpc GetProjectConfig(GetProjectConfigRequest) returns (GetProjectConfigResponse);
 
   /* Freight APIs */
 
@@ -369,6 +371,26 @@ message DeleteProjectResponse {
   /* explicitly empty */
 }
 
+message DeleteProjectConfigRequest {
+  string name = 1;
+}
+
+message DeleteProjectConfigResponse {
+  /* explicitly empty */
+}
+
+message GetProjectConfigRequest {
+  string name = 1;
+  RawFormat format = 2;
+}
+
+message GetProjectConfigResponse {
+  oneof result {
+    github.com.akuity.kargo.api.v1alpha1.ProjectConfig project_config = 1;
+    bytes raw = 2;
+  }
+}
+
 message GetProjectRequest {
   string name = 1;
   RawFormat format = 2;
diff --git a/api/service/v1alpha1/svcv1alpha1connect/service.connect.go b/api/service/v1alpha1/svcv1alpha1connect/service.connect.go
index aa8095bd..16f96adf 100644
--- a/api/service/v1alpha1/svcv1alpha1connect/service.connect.go
+++ b/api/service/v1alpha1/svcv1alpha1connect/service.connect.go
@@ -93,6 +93,12 @@ const (
 	// KargoServiceListProjectsProcedure is the fully-qualified name of the KargoService's ListProjects
 	// RPC.
 	KargoServiceListProjectsProcedure = "/akuity.io.kargo.service.v1alpha1.KargoService/ListProjects"
+	// KargoServiceDeleteProjectConfigProcedure is the fully-qualified name of the KargoService's
+	// DeleteProjectConfig RPC.
+	KargoServiceDeleteProjectConfigProcedure = "/akuity.io.kargo.service.v1alpha1.KargoService/DeleteProjectConfig"
+	// KargoServiceGetProjectConfigProcedure is the fully-qualified name of the KargoService's
+	// GetProjectConfig RPC.
+	KargoServiceGetProjectConfigProcedure = "/akuity.io.kargo.service.v1alpha1.KargoService/GetProjectConfig"
 	// KargoServiceApproveFreightProcedure is the fully-qualified name of the KargoService's
 	// ApproveFreight RPC.
 	KargoServiceApproveFreightProcedure = "/akuity.io.kargo.service.v1alpha1.KargoService/ApproveFreight"
@@ -240,6 +246,8 @@ var (
 	kargoServiceDeleteProjectMethodDescriptor                 = kargoServiceServiceDescriptor.Methods().ByName("DeleteProject")
 	kargoServiceGetProjectMethodDescriptor                    = kargoServiceServiceDescriptor.Methods().ByName("GetProject")
 	kargoServiceListProjectsMethodDescriptor                  = kargoServiceServiceDescriptor.Methods().ByName("ListProjects")
+	kargoServiceDeleteProjectConfigMethodDescriptor           = kargoServiceServiceDescriptor.Methods().ByName("DeleteProjectConfig")
+	kargoServiceGetProjectConfigMethodDescriptor              = kargoServiceServiceDescriptor.Methods().ByName("GetProjectConfig")
 	kargoServiceApproveFreightMethodDescriptor                = kargoServiceServiceDescriptor.Methods().ByName("ApproveFreight")
 	kargoServiceDeleteFreightMethodDescriptor                 = kargoServiceServiceDescriptor.Methods().ByName("DeleteFreight")
 	kargoServiceGetFreightMethodDescriptor                    = kargoServiceServiceDescriptor.Methods().ByName("GetFreight")
@@ -311,6 +319,8 @@ type KargoServiceClient interface {
 	DeleteProject(context.Context, *connect.Request[v1alpha1.DeleteProjectRequest]) (*connect.Response[v1alpha1.DeleteProjectResponse], error)
 	GetProject(context.Context, *connect.Request[v1alpha1.GetProjectRequest]) (*connect.Response[v1alpha1.GetProjectResponse], error)
 	ListProjects(context.Context, *connect.Request[v1alpha1.ListProjectsRequest]) (*connect.Response[v1alpha1.ListProjectsResponse], error)
+	DeleteProjectConfig(context.Context, *connect.Request[v1alpha1.DeleteProjectConfigRequest]) (*connect.Response[v1alpha1.DeleteProjectConfigResponse], error)
+	GetProjectConfig(context.Context, *connect.Request[v1alpha1.GetProjectConfigRequest]) (*connect.Response[v1alpha1.GetProjectConfigResponse], error)
 	ApproveFreight(context.Context, *connect.Request[v1alpha1.ApproveFreightRequest]) (*connect.Response[v1alpha1.ApproveFreightResponse], error)
 	DeleteFreight(context.Context, *connect.Request[v1alpha1.DeleteFreightRequest]) (*connect.Response[v1alpha1.DeleteFreightResponse], error)
 	GetFreight(context.Context, *connect.Request[v1alpha1.GetFreightRequest]) (*connect.Response[v1alpha1.GetFreightResponse], error)
@@ -498,6 +508,18 @@ func NewKargoServiceClient(httpClient connect.HTTPClient, baseURL string, opts .
 			connect.WithSchema(kargoServiceListProjectsMethodDescriptor),
 			connect.WithClientOptions(opts...),
 		),
+		deleteProjectConfig: connect.NewClient[v1alpha1.DeleteProjectConfigRequest, v1alpha1.DeleteProjectConfigResponse](
+			httpClient,
+			baseURL+KargoServiceDeleteProjectConfigProcedure,
+			connect.WithSchema(kargoServiceDeleteProjectConfigMethodDescriptor),
+			connect.WithClientOptions(opts...),
+		),
+		getProjectConfig: connect.NewClient[v1alpha1.GetProjectConfigRequest, v1alpha1.GetProjectConfigResponse](
+			httpClient,
+			baseURL+KargoServiceGetProjectConfigProcedure,
+			connect.WithSchema(kargoServiceGetProjectConfigMethodDescriptor),
+			connect.WithClientOptions(opts...),
+		),
 		approveFreight: connect.NewClient[v1alpha1.ApproveFreightRequest, v1alpha1.ApproveFreightResponse](
 			httpClient,
 			baseURL+KargoServiceApproveFreightProcedure,
@@ -783,6 +805,8 @@ type kargoServiceClient struct {
 	deleteProject                 *connect.Client[v1alpha1.DeleteProjectRequest, v1alpha1.DeleteProjectResponse]
 	getProject                    *connect.Client[v1alpha1.GetProjectRequest, v1alpha1.GetProjectResponse]
 	listProjects                  *connect.Client[v1alpha1.ListProjectsRequest, v1alpha1.ListProjectsResponse]
+	deleteProjectConfig           *connect.Client[v1alpha1.DeleteProjectConfigRequest, v1alpha1.DeleteProjectConfigResponse]
+	getProjectConfig              *connect.Client[v1alpha1.GetProjectConfigRequest, v1alpha1.GetProjectConfigResponse]
 	approveFreight                *connect.Client[v1alpha1.ApproveFreightRequest, v1alpha1.ApproveFreightResponse]
 	deleteFreight                 *connect.Client[v1alpha1.DeleteFreightRequest, v1alpha1.DeleteFreightResponse]
 	getFreight                    *connect.Client[v1alpha1.GetFreightRequest, v1alpha1.GetFreightResponse]
@@ -939,6 +963,16 @@ func (c *kargoServiceClient) ListProjects(ctx context.Context, req *connect.Requ
 	return c.listProjects.CallUnary(ctx, req)
 }
 
+// DeleteProjectConfig calls akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectConfig.
+func (c *kargoServiceClient) DeleteProjectConfig(ctx context.Context, req *connect.Request[v1alpha1.DeleteProjectConfigRequest]) (*connect.Response[v1alpha1.DeleteProjectConfigResponse], error) {
+	return c.deleteProjectConfig.CallUnary(ctx, req)
+}
+
+// GetProjectConfig calls akuity.io.kargo.service.v1alpha1.KargoService.GetProjectConfig.
+func (c *kargoServiceClient) GetProjectConfig(ctx context.Context, req *connect.Request[v1alpha1.GetProjectConfigRequest]) (*connect.Response[v1alpha1.GetProjectConfigResponse], error) {
+	return c.getProjectConfig.CallUnary(ctx, req)
+}
+
 // ApproveFreight calls akuity.io.kargo.service.v1alpha1.KargoService.ApproveFreight.
 func (c *kargoServiceClient) ApproveFreight(ctx context.Context, req *connect.Request[v1alpha1.ApproveFreightRequest]) (*connect.Response[v1alpha1.ApproveFreightResponse], error) {
 	return c.approveFreight.CallUnary(ctx, req)
@@ -1187,6 +1221,8 @@ type KargoServiceHandler interface {
 	DeleteProject(context.Context, *connect.Request[v1alpha1.DeleteProjectRequest]) (*connect.Response[v1alpha1.DeleteProjectResponse], error)
 	GetProject(context.Context, *connect.Request[v1alpha1.GetProjectRequest]) (*connect.Response[v1alpha1.GetProjectResponse], error)
 	ListProjects(context.Context, *connect.Request[v1alpha1.ListProjectsRequest]) (*connect.Response[v1alpha1.ListProjectsResponse], error)
+	DeleteProjectConfig(context.Context, *connect.Request[v1alpha1.DeleteProjectConfigRequest]) (*connect.Response[v1alpha1.DeleteProjectConfigResponse], error)
+	GetProjectConfig(context.Context, *connect.Request[v1alpha1.GetProjectConfigRequest]) (*connect.Response[v1alpha1.GetProjectConfigResponse], error)
 	ApproveFreight(context.Context, *connect.Request[v1alpha1.ApproveFreightRequest]) (*connect.Response[v1alpha1.ApproveFreightResponse], error)
 	DeleteFreight(context.Context, *connect.Request[v1alpha1.DeleteFreightRequest]) (*connect.Response[v1alpha1.DeleteFreightResponse], error)
 	GetFreight(context.Context, *connect.Request[v1alpha1.GetFreightRequest]) (*connect.Response[v1alpha1.GetFreightResponse], error)
@@ -1370,6 +1406,18 @@ func NewKargoServiceHandler(svc KargoServiceHandler, opts ...connect.HandlerOpti
 		connect.WithSchema(kargoServiceListProjectsMethodDescriptor),
 		connect.WithHandlerOptions(opts...),
 	)
+	kargoServiceDeleteProjectConfigHandler := connect.NewUnaryHandler(
+		KargoServiceDeleteProjectConfigProcedure,
+		svc.DeleteProjectConfig,
+		connect.WithSchema(kargoServiceDeleteProjectConfigMethodDescriptor),
+		connect.WithHandlerOptions(opts...),
+	)
+	kargoServiceGetProjectConfigHandler := connect.NewUnaryHandler(
+		KargoServiceGetProjectConfigProcedure,
+		svc.GetProjectConfig,
+		connect.WithSchema(kargoServiceGetProjectConfigMethodDescriptor),
+		connect.WithHandlerOptions(opts...),
+	)
 	kargoServiceApproveFreightHandler := connect.NewUnaryHandler(
 		KargoServiceApproveFreightProcedure,
 		svc.ApproveFreight,
@@ -1674,6 +1722,10 @@ func NewKargoServiceHandler(svc KargoServiceHandler, opts ...connect.HandlerOpti
 			kargoServiceGetProjectHandler.ServeHTTP(w, r)
 		case KargoServiceListProjectsProcedure:
 			kargoServiceListProjectsHandler.ServeHTTP(w, r)
+		case KargoServiceDeleteProjectConfigProcedure:
+			kargoServiceDeleteProjectConfigHandler.ServeHTTP(w, r)
+		case KargoServiceGetProjectConfigProcedure:
+			kargoServiceGetProjectConfigHandler.ServeHTTP(w, r)
 		case KargoServiceApproveFreightProcedure:
 			kargoServiceApproveFreightHandler.ServeHTTP(w, r)
 		case KargoServiceDeleteFreightProcedure:
@@ -1857,6 +1909,14 @@ func (UnimplementedKargoServiceHandler) ListProjects(context.Context, *connect.R
 	return nil, connect.NewError(connect.CodeUnimplemented, errors.New("akuity.io.kargo.service.v1alpha1.KargoService.ListProjects is not implemented"))
 }
 
+func (UnimplementedKargoServiceHandler) DeleteProjectConfig(context.Context, *connect.Request[v1alpha1.DeleteProjectConfigRequest]) (*connect.Response[v1alpha1.DeleteProjectConfigResponse], error) {
+	return nil, connect.NewError(connect.CodeUnimplemented, errors.New("akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectConfig is not implemented"))
+}
+
+func (UnimplementedKargoServiceHandler) GetProjectConfig(context.Context, *connect.Request[v1alpha1.GetProjectConfigRequest]) (*connect.Response[v1alpha1.GetProjectConfigResponse], error) {
+	return nil, connect.NewError(connect.CodeUnimplemented, errors.New("akuity.io.kargo.service.v1alpha1.KargoService.GetProjectConfig is not implemented"))
+}
+
 func (UnimplementedKargoServiceHandler) ApproveFreight(context.Context, *connect.Request[v1alpha1.ApproveFreightRequest]) (*connect.Response[v1alpha1.ApproveFreightResponse], error) {
 	return nil, connect.NewError(connect.CodeUnimplemented, errors.New("akuity.io.kargo.service.v1alpha1.KargoService.ApproveFreight is not implemented"))
 }
diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto
index 62760ccc..dd2e3a34 100644
--- a/api/v1alpha1/generated.proto
+++ b/api/v1alpha1/generated.proto
@@ -463,6 +463,14 @@ message FreightSources {
   // made available to the Stage. This field is optional. When left unspecified,
   // the field is implicitly treated as if its value were "OneOf".
   //
+  // Accepted Values:
+  //
+  // - "All": Freight must be be verified and, if applicable, soaked in all
+  //   upstream Stages to be considered available for promotion.
+  // - "OneOf": Freight must be verified and, if applicable, soaked in at least
+  //    one upstream Stage to be considered available for promotion.
+  // - "": Treated the same as "OneOf".
+  //
   // +kubebuilder:validation:Optional
   optional string availabilityStrategy = 4;
 }
@@ -516,7 +524,7 @@ message GitDiscoveryResult {
   // RepoURL is the repository URL of the GitSubscription.
   //
   // +kubebuilder:validation:MinLength=1
-  // +kubebuilder:validation:Pattern=`(?:^(https?)://(?:([\w-]+):(.+)@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
+  // +kubebuilder:validation:Pattern=`(?:^(ssh|https?)://(?:([\w-]+)(:(.+))?@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
   optional string repoURL = 1;
 
   // Commits is a list of commits discovered by the Warehouse for the
@@ -532,14 +540,32 @@ message GitSubscription {
   // URL is the repository's URL. This is a required field.
   //
   // +kubebuilder:validation:MinLength=1
-  // +kubebuilder:validation:Pattern=`(?:^(https?)://(?:([\w-]+):(.+)@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
+  // +kubebuilder:validation:Pattern=`(?:^(ssh|https?)://(?:([\w-]+)(:(.+))?@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
   optional string repoURL = 1;
 
   // CommitSelectionStrategy specifies the rules for how to identify the newest
   // commit of interest in the repository specified by the RepoURL field. This
   // field is optional. When left unspecified, the field is implicitly treated
   // as if its value were "NewestFromBranch".
-  // Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
+  //
+  // Accepted values:
+  //
+  // - "NewestFromBranch": Selects the latest commit on the branch specified
+  //   by the Branch field or the default branch if none is specified. This is
+  //   the default strategy.
+  //
+  // - "SemVer": Selects the commit referenced by the the semantically greatest
+  //   tag. The SemverConstraint field can optionally be used to narrow the set
+  //   of tags eligible for selection.
+  //
+  // - "Lexical": Selects the commit referenced by the lexicographically
+  //   greatest tag. Useful when tags embed a _leading_ date or timestamp. The
+  //   AllowTags and IgnoreTags fields can optionally be used to narrow the set
+  //   of tags eligible for selection.
+  //
+  // - "NewestTag": Selects the commit referenced by the most recently created
+  //   tag. The AllowTags and IgnoreTags fields can optionally be used to
+  //   narrow the set of tags eligible for selection.
   //
   // +kubebuilder:default=NewestFromBranch
   optional string commitSelectionStrategy = 2;
@@ -609,6 +635,7 @@ message GitSubscription {
   //   2. Glob patterns (prefix the pattern with "glob:"; ex. "glob:*.yaml")
   //   3. Regular expressions (prefix the pattern with "regex:" or "regexp:";
   //      ex. "regexp:^.*\.yaml$")
+  //
   // Paths selected by IncludePaths may be unselected by ExcludePaths. This
   // is a useful method for including a broad set of paths and then excluding a
   // subset of them.
@@ -750,7 +777,26 @@ message ImageSubscription {
   // of the image specified by the RepoURL field. This field is optional. When
   // left unspecified, the field is implicitly treated as if its value were
   // "SemVer".
-  // Accepted values: Digest, Lexical, NewestBuild, SemVer
+  //
+  // Accepted values:
+  //
+  // - "Digest": Selects the image currently referenced by the tag specified
+  //   (unintuitively) by the SemverConstraint field.
+  //
+  // - "Lexical": Selects the image referenced by the lexicographically greatest
+  //   tag. Useful when tags embed a leading date or timestamp. The AllowTags
+  //   and IgnoreTags fields can optionally be used to narrow the set of tags
+  //   eligible for selection.
+  //
+  // - "NewestBuild": Selects the image that was most recently pushed to the
+  //   repository. The AllowTags and IgnoreTags fields can optionally be used
+  //   to narrow the set of tags eligible for selection. This is the least
+  //   efficient and is likely to cause rate limiting affecting this Warehouse
+  //   and possibly others. This strategy should be avoided.
+  //
+  // - "SemVer": Selects the image with the semantically greatest tag. The
+  //   AllowTags and IgnoreTags fields can optionally be used to narrow the set
+  //   of tags eligible for selection.
   //
   // +kubebuilder:default=SemVer
   optional string imageSelectionStrategy = 3;
@@ -1505,7 +1551,12 @@ message WarehouseSpec {
   // FreightCreationPolicy describes how Freight is created by this Warehouse.
   // This field is optional. When left unspecified, the field is implicitly
   // treated as if its value were "Automatic".
-  // Accepted values: Automatic, Manual
+  //
+  // Accepted values:
+  //
+  // - "Automatic": New Freight is created automatically when any new artifact
+  //   is discovered.
+  // - "Manual": New Freight is never created automatically.
   //
   // +kubebuilder:default=Automatic
   // +kubebuilder:validation:Optional
diff --git a/api/v1alpha1/stage_types.go b/api/v1alpha1/stage_types.go
index d445988e..9ec5dddd 100644
--- a/api/v1alpha1/stage_types.go
+++ b/api/v1alpha1/stage_types.go
@@ -301,6 +301,14 @@ type FreightSources struct {
 	// made available to the Stage. This field is optional. When left unspecified,
 	// the field is implicitly treated as if its value were "OneOf".
 	//
+	// Accepted Values:
+	//
+	// - "All": Freight must be be verified and, if applicable, soaked in all
+	//   upstream Stages to be considered available for promotion.
+	// - "OneOf": Freight must be verified and, if applicable, soaked in at least
+	//    one upstream Stage to be considered available for promotion.
+	// - "": Treated the same as "OneOf".
+	//
 	// +kubebuilder:validation:Optional
 	AvailabilityStrategy FreightAvailabilityStrategy `json:"availabilityStrategy,omitempty" protobuf:"bytes,4,opt,name=availabilityStrategy"`
 }
diff --git a/api/v1alpha1/warehouse_types.go b/api/v1alpha1/warehouse_types.go
index 55c332d5..4e9925d8 100644
--- a/api/v1alpha1/warehouse_types.go
+++ b/api/v1alpha1/warehouse_types.go
@@ -67,7 +67,12 @@ type WarehouseSpec struct {
 	// FreightCreationPolicy describes how Freight is created by this Warehouse.
 	// This field is optional. When left unspecified, the field is implicitly
 	// treated as if its value were "Automatic".
-	// Accepted values: Automatic, Manual
+	//
+	// Accepted values:
+	//
+	// - "Automatic": New Freight is created automatically when any new artifact
+	//   is discovered.
+	// - "Manual": New Freight is never created automatically.
 	//
 	// +kubebuilder:default=Automatic
 	// +kubebuilder:validation:Optional
@@ -106,13 +111,31 @@ type GitSubscription struct {
 	// URL is the repository's URL. This is a required field.
 	//
 	// +kubebuilder:validation:MinLength=1
-	// +kubebuilder:validation:Pattern=`(?:^(https?)://(?:([\w-]+):(.+)@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
+	// +kubebuilder:validation:Pattern=`(?:^(ssh|https?)://(?:([\w-]+)(:(.+))?@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
 	RepoURL string `json:"repoURL" protobuf:"bytes,1,opt,name=repoURL"`
 	// CommitSelectionStrategy specifies the rules for how to identify the newest
 	// commit of interest in the repository specified by the RepoURL field. This
 	// field is optional. When left unspecified, the field is implicitly treated
 	// as if its value were "NewestFromBranch".
-	// Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
+	//
+	// Accepted values:
+	//
+	// - "NewestFromBranch": Selects the latest commit on the branch specified
+	//   by the Branch field or the default branch if none is specified. This is
+	//   the default strategy.
+	//
+	// - "SemVer": Selects the commit referenced by the the semantically greatest
+	//   tag. The SemverConstraint field can optionally be used to narrow the set
+	//   of tags eligible for selection.
+	//
+	// - "Lexical": Selects the commit referenced by the lexicographically
+	//   greatest tag. Useful when tags embed a _leading_ date or timestamp. The
+	//   AllowTags and IgnoreTags fields can optionally be used to narrow the set
+	//   of tags eligible for selection.
+	//
+	// - "NewestTag": Selects the commit referenced by the most recently created
+	//   tag. The AllowTags and IgnoreTags fields can optionally be used to
+	//   narrow the set of tags eligible for selection.
 	//
 	// +kubebuilder:default=NewestFromBranch
 	CommitSelectionStrategy CommitSelectionStrategy `json:"commitSelectionStrategy,omitempty" protobuf:"bytes,2,opt,name=commitSelectionStrategy"`
@@ -175,6 +198,7 @@ type GitSubscription struct {
 	//   2. Glob patterns (prefix the pattern with "glob:"; ex. "glob:*.yaml")
 	//   3. Regular expressions (prefix the pattern with "regex:" or "regexp:";
 	//      ex. "regexp:^.*\.yaml$")
+	//
 	// Paths selected by IncludePaths may be unselected by ExcludePaths. This
 	// is a useful method for including a broad set of paths and then excluding a
 	// subset of them.
@@ -229,7 +253,26 @@ type ImageSubscription struct {
 	// of the image specified by the RepoURL field. This field is optional. When
 	// left unspecified, the field is implicitly treated as if its value were
 	// "SemVer".
-	// Accepted values: Digest, Lexical, NewestBuild, SemVer
+	//
+	// Accepted values:
+	//
+	// - "Digest": Selects the image currently referenced by the tag specified
+	//   (unintuitively) by the SemverConstraint field.
+	//
+	// - "Lexical": Selects the image referenced by the lexicographically greatest
+	//   tag. Useful when tags embed a leading date or timestamp. The AllowTags
+	//   and IgnoreTags fields can optionally be used to narrow the set of tags
+	//   eligible for selection.
+	//
+	// - "NewestBuild": Selects the image that was most recently pushed to the
+	//   repository. The AllowTags and IgnoreTags fields can optionally be used
+	//   to narrow the set of tags eligible for selection. This is the least
+	//   efficient and is likely to cause rate limiting affecting this Warehouse
+	//   and possibly others. This strategy should be avoided.
+	//
+	// - "SemVer": Selects the image with the semantically greatest tag. The
+	//   AllowTags and IgnoreTags fields can optionally be used to narrow the set
+	//   of tags eligible for selection.
 	//
 	// +kubebuilder:default=SemVer
 	ImageSelectionStrategy ImageSelectionStrategy `json:"imageSelectionStrategy,omitempty" protobuf:"bytes,3,opt,name=imageSelectionStrategy"`
@@ -400,7 +443,7 @@ type GitDiscoveryResult struct {
 	// RepoURL is the repository URL of the GitSubscription.
 	//
 	// +kubebuilder:validation:MinLength=1
-	// +kubebuilder:validation:Pattern=`(?:^(https?)://(?:([\w-]+):(.+)@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
+	// +kubebuilder:validation:Pattern=`(?:^(ssh|https?)://(?:([\w-]+)(:(.+))?@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
 	RepoURL string `json:"repoURL" protobuf:"bytes,1,opt,name=repoURL"`
 	// Commits is a list of commits discovered by the Warehouse for the
 	// GitSubscription. An empty list indicates that the discovery operation was
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml
index d037c8f8..c118563f 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.17.3
+    controller-gen.kubebuilder.io/version: v0.18.0
   name: clusterpromotiontasks.kargo.akuity.io
 spec:
   group: kargo.akuity.io
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_freights.yaml b/charts/kargo/resources/crds/kargo.akuity.io_freights.yaml
index ef311477..6e3080d8 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_freights.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_freights.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.17.3
+    controller-gen.kubebuilder.io/version: v0.18.0
   name: freights.kargo.akuity.io
 spec:
   group: kargo.akuity.io
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_projectconfigs.yaml b/charts/kargo/resources/crds/kargo.akuity.io_projectconfigs.yaml
index eec3b043..a7103b57 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_projectconfigs.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_projectconfigs.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.17.3
+    controller-gen.kubebuilder.io/version: v0.18.0
   name: projectconfigs.kargo.akuity.io
 spec:
   group: kargo.akuity.io
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_projects.yaml b/charts/kargo/resources/crds/kargo.akuity.io_projects.yaml
index 5debfc47..c5e60102 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_projects.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_projects.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.17.3
+    controller-gen.kubebuilder.io/version: v0.18.0
   name: projects.kargo.akuity.io
 spec:
   group: kargo.akuity.io
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml
index 2d7e089b..5aa49509 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.17.3
+    controller-gen.kubebuilder.io/version: v0.18.0
   name: promotions.kargo.akuity.io
 spec:
   group: kargo.akuity.io
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml
index 440067eb..956f956f 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.17.3
+    controller-gen.kubebuilder.io/version: v0.18.0
   name: promotiontasks.kargo.akuity.io
 spec:
   group: kargo.akuity.io
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml
index e51e5e56..eecbff79 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.17.3
+    controller-gen.kubebuilder.io/version: v0.18.0
   name: stages.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -290,6 +290,14 @@ spec:
                             AvailabilityStrategy specifies the semantics for how requested Freight is
                             made available to the Stage. This field is optional. When left unspecified,
                             the field is implicitly treated as if its value were "OneOf".
+
+                            Accepted Values:
+
+                            - "All": Freight must be be verified and, if applicable, soaked in all
+                              upstream Stages to be considered available for promotion.
+                            - "OneOf": Freight must be verified and, if applicable, soaked in at least
+                               one upstream Stage to be considered available for promotion.
+                            - "": Treated the same as "OneOf".
                           enum:
                           - All
                           - OneOf
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_warehouses.yaml b/charts/kargo/resources/crds/kargo.akuity.io_warehouses.yaml
index eba019f8..10669fe9 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_warehouses.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_warehouses.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.17.3
+    controller-gen.kubebuilder.io/version: v0.18.0
   name: warehouses.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -52,7 +52,12 @@ spec:
                   FreightCreationPolicy describes how Freight is created by this Warehouse.
                   This field is optional. When left unspecified, the field is implicitly
                   treated as if its value were "Automatic".
-                  Accepted values: Automatic, Manual
+
+                  Accepted values:
+
+                  - "Automatic": New Freight is created automatically when any new artifact
+                    is discovered.
+                  - "Manual": New Freight is never created automatically.
                 enum:
                 - Automatic
                 - Manual
@@ -163,7 +168,25 @@ spec:
                             commit of interest in the repository specified by the RepoURL field. This
                             field is optional. When left unspecified, the field is implicitly treated
                             as if its value were "NewestFromBranch".
-                            Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
+
+                            Accepted values:
+
+                            - "NewestFromBranch": Selects the latest commit on the branch specified
+                              by the Branch field or the default branch if none is specified. This is
+                              the default strategy.
+
+                            - "SemVer": Selects the commit referenced by the the semantically greatest
+                              tag. The SemverConstraint field can optionally be used to narrow the set
+                              of tags eligible for selection.
+
+                            - "Lexical": Selects the commit referenced by the lexicographically
+                              greatest tag. Useful when tags embed a _leading_ date or timestamp. The
+                              AllowTags and IgnoreTags fields can optionally be used to narrow the set
+                              of tags eligible for selection.
+
+                            - "NewestTag": Selects the commit referenced by the most recently created
+                              tag. The AllowTags and IgnoreTags fields can optionally be used to
+                              narrow the set of tags eligible for selection.
                           enum:
                           - Lexical
                           - NewestFromBranch
@@ -221,6 +244,7 @@ spec:
                               2. Glob patterns (prefix the pattern with "glob:"; ex. "glob:*.yaml")
                               3. Regular expressions (prefix the pattern with "regex:" or "regexp:";
                                  ex. "regexp:^.*\.yaml$")
+
                             Paths selected by IncludePaths may be unselected by ExcludePaths. This
                             is a useful method for including a broad set of paths and then excluding a
                             subset of them.
@@ -237,7 +261,7 @@ spec:
                           description: URL is the repository's URL. This is a required
                             field.
                           minLength: 1
-                          pattern: (?:^(https?)://(?:([\w-]+):(.+)@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))
+                          pattern: (?:^(ssh|https?)://(?:([\w-]+)(:(.+))?@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))
                           type: string
                         semverConstraint:
                           description: |-
@@ -311,7 +335,26 @@ spec:
                             of the image specified by the RepoURL field. This field is optional. When
                             left unspecified, the field is implicitly treated as if its value were
                             "SemVer".
-                            Accepted values: Digest, Lexical, NewestBuild, SemVer
+
+                            Accepted values:
+
+                            - "Digest": Selects the image currently referenced by the tag specified
+                              (unintuitively) by the SemverConstraint field.
+
+                            - "Lexical": Selects the image referenced by the lexicographically greatest
+                              tag. Useful when tags embed a leading date or timestamp. The AllowTags
+                              and IgnoreTags fields can optionally be used to narrow the set of tags
+                              eligible for selection.
+
+                            - "NewestBuild": Selects the image that was most recently pushed to the
+                              repository. The AllowTags and IgnoreTags fields can optionally be used
+                              to narrow the set of tags eligible for selection. This is the least
+                              efficient and is likely to cause rate limiting affecting this Warehouse
+                              and possibly others. This strategy should be avoided.
+
+                            - "SemVer": Selects the image with the semantically greatest tag. The
+                              AllowTags and IgnoreTags fields can optionally be used to narrow the set
+                              of tags eligible for selection.
                           enum:
                           - Digest
                           - Lexical
@@ -548,7 +591,7 @@ spec:
                         repoURL:
                           description: RepoURL is the repository URL of the GitSubscription.
                           minLength: 1
-                          pattern: (?:^(https?)://(?:([\w-]+):(.+)@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))
+                          pattern: (?:^(ssh|https?)://(?:([\w-]+)(:(.+))?@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))
                           type: string
                       required:
                       - repoURL
diff --git a/charts/kargo/templates/api/cluster-role.yaml b/charts/kargo/templates/api/cluster-role.yaml
index 2f51b917..69f8e1e1 100644
--- a/charts/kargo/templates/api/cluster-role.yaml
+++ b/charts/kargo/templates/api/cluster-role.yaml
@@ -65,6 +65,7 @@ rules:
       - promotiontasks
       - stages
       - warehouses
+      - projectconfigs
     verbs:
       - "*"
   - apiGroups:
diff --git a/docs/docs/20-quickstart/index.md b/docs/docs/20-quickstart/index.md
index ce63f858..8f315915 100644
--- a/docs/docs/20-quickstart/index.md
+++ b/docs/docs/20-quickstart/index.md
@@ -350,7 +350,7 @@ the previous section.
         as: commit
         config:
           path: ./out
-          message: \${{ outputs.update.commitMessage }}
+          message: \${{ task.outputs.update.commitMessage }}
       - uses: git-push
         config:
           path: ./out
@@ -518,7 +518,7 @@ the previous section.
         as: commit
         config:
           path: ./out
-          message: \${{ outputs.update.commitMessage }}
+          message: \${{ task.outputs.update.commitMessage }}
       - uses: git-push
         config:
           path: ./out
diff --git a/docs/docs/40-operator-guide/40-security/20-openid-connect.md b/docs/docs/40-operator-guide/40-security/20-openid-connect.md
index 55b15788..267234dc 100644
--- a/docs/docs/40-operator-guide/40-security/20-openid-connect.md
+++ b/docs/docs/40-operator-guide/40-security/20-openid-connect.md
@@ -84,13 +84,10 @@ When installing Kargo with Helm, all options related to OIDC are grouped under
 
     1. Set `api.oidc.clientID` to the client ID provided by your IDP.
 
-        If you needed to register two separate clients, use the client ID
-        associated with the UI.
+        If you registered two separate separate clients for the UI and CLI with
+        your IDP, additionally specify a value for `api.oidc.cliClientID`. This
+        setting can otherwise be left alone.
 
-    1. Set `api.oidc.cliClientID` to the client secret provided by your IDP.
-
-        If you needed to register two separate clients, use the client ID
-        associated with the CLI.
 
     1. Ensure `api.oidc.dex.enabled` remains set to its default value of
        `false`.
diff --git a/docs/docs/40-operator-guide/40-security/40-managing-credentials.md b/docs/docs/40-operator-guide/40-security/40-managing-credentials.md
index ab8fec21..80ddb062 100644
--- a/docs/docs/40-operator-guide/40-security/40-managing-credentials.md
+++ b/docs/docs/40-operator-guide/40-security/40-managing-credentials.md
@@ -182,7 +182,7 @@ controllers read permissions on all `Secret`s throughout the Kargo control
 plane's cluster -- including `Secret`s having nothing to do with Kargo.__
 :::
 
-## Other Forms of Credentials
+## Ambient Credentials
 
 This section provides guidance on configuring Kargo and various cloud platforms
 to support "ambient" credentials. Kargo users are presumed not to have
@@ -249,74 +249,96 @@ project-specific IAM roles. While useful, this approach is not strictly
 recommended.
 :::
 
-Once Kargo is able to gain necessary permissions to access an ECR repository,
-it will follow a process similar to that described in the previous section to
-obtain a token that is valid for 12 hours and cached for 10.
+Tokens Kargo obtains for accessing any specific ECR repository on behalf of
+any specific Kargo project, are valid for 12 hours and cached for 10. A
+controller restart clears the cache.
 
-### Google Artifact Registry
+### Google Artifact Registry (GAR)
 
-Kargo can be configured to authenticate to Google Artifact Registry repositories
-using Workload Identity Federation.
+Kargo can be configured to authenticate to
+[Google Artifact Registry](https://cloud.google.com/artifact-registry/docs/overview)
+(GAR) repositories using
+[Workload Identity Federation](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity)
+(WIF).
 
 If Kargo locates no `Secret` resources matching a repository URL, and if Kargo
-is deployed within a GKE cluster, it will attempt to use
-[Workload Identity Federation](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity)
-to authenticate, but this relies upon some external setup. Leveraging this
-option eliminates the need to store credentials in a `Secret` resource.
+is deployed within a
+[Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview)
+(GKE) cluster with WIF enabled, it will attempt to use it to authenticate.
+Leveraging this option eliminates the need to store credentials in a `Secret`
+resource. WIF can be enabled when creating a
+[new cluster](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#enable_on_cluster)
+or can be added to an
+[existing cluster](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#enable-existing-cluster).
 
-First, follow
-[these directions](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#enable_on_cluster)
-to provision a new GKE cluster with Workload Identity Federation enabled or
-[these directions](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#enable-existing-cluster)
-to enable Workload Identity Federation on an existing GKE cluster.
+:::note
+Clusters managed by
+[GKE Autopilot](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview)
+have WIF enabled automatically.
+:::
 
-At this point, the `kargo-controller` `ServiceAccount` within the namespace in
-which Kargo is (or will be) installed will be associated with an _IAM principal
-identifier_, which takes the following form:
+With WIF enabled,
+[GCP Identity and Access Management](https://cloud.google.com/iam/docs/overview)
+(IAM) automatically understands a
+[principal](https://cloud.google.com/iam/docs/overview#principals)
+identifier of the following form to be a reference to the Kargo controller's
+_Kubernetes_ Service Account (KSA):
 
-```plaintext
+```
 principal://iam.googleapis.com/projects/<gcp project number>/locations/global/workloadIdentityPools/<gcp project name>.svc.id.goog/subject/ns/<kargo namespace>/sa/kargo-controller
 ```
 
-Although associated with this _one_ principal, the Kargo controller acts on
-behalf of multiple Kargo projects, each of which may require access to
-_different_ Google Artifact Registry repositories. To account for this, when
-Kargo attempts to access a Google Artifact Registry repository on behalf of a
-specific project, it will first attempt to
-[impersonate a Google service account](https://cloud.google.com/iam/docs/service-account-impersonation) 
-specific to that project. The name of the service account it attempts to
-impersonate will _always_ be of the form
+:::note
+There is no need to annotate the Kargo controller's KSA in any specific way to
+enable the above.
+:::
+
+Because the Kargo controller acts on behalf of multiple Kargo projects, each of
+which may require access to _different_ GAR repositories, when accessing a
+repository on behalf of a given project, it will attempt to
+[impersonate](https://cloud.google.com/iam/docs/service-account-impersonation)
+a project-specific
+[Google Service Account](https://cloud.google.com/iam/docs/service-accounts-create) 
+(GSA). The name of the GSA that the controller will attempt to impersonate will
+_always_ be of the form
 `kargo-project-<kargo project name>@<gcp project name>.iam.gserviceaccount.com`.
-It is this service account that should be granted read-only access to applicable
-Google Artifact Registry repositories.
 
 :::info
-The name of the Google service account associated with each Kargo project is
-deliberately not configurable to prevent Kargo project admins from attempting to
-coerce Kargo into impersonating arbitrary Google service accounts.
+The name of the GSA associated with each Kargo project is deliberately not
+configurable to prevent project admins from attempting to coerce Kargo into
+impersonating arbitrary GSAs.
 :::
 
-Once Kargo is able to impersonate the appropriate Google service account for a
-given project, it will follow a process similar to that described in the
-previous section to obtain a token that is valid for 60 minutes and cached for
-40.
+To enabled this, each project-specific GSA must:
+
+- Have an
+  [IAM policy](https://cloud.google.com/iam/docs/reference/rest/v1/Policy) that
+  permits the Kargo controller's KSA to impersonate the GSA by creating a token
+  (`roles/iam.serviceAccountTokenCreator`).
+
+- Be granted read-only access (`roles/artifactregistry.reader`) to the specific
+  GAR repositories with which it interacts.
 
 :::caution
 Following the principle of least privilege, the IAM principal associated with
-the `kargo-controller` `ServiceAccount` should be limited only to the ability to
-impersonate project-specific Google service accounts. Project-specific Google
-service accounts should be limited only to read-only access to the applicable
-Google Artifact Registry repositories.
+the Kargo controller's GSA should be granted no permissions beyond the
+ability to impersonate project-specific GSAs.
 :::
 
-:::info
-Like in the case of EKS Pod Identity or IRSA if project-specific credentials could
-not be assumed by the Kargo controller will fall back on on using its own 
-IAM principal directly. For organizations without strict tenancy requirements, this 
-can eliminate the need to manage a large number of project-specific IAM roles. 
-While useful, this approach is not strictly recommended.
+:::note
+Beginning with Kargo `v1.5.0`, if maintaining a separate GSA for every Kargo
+project is deemed too onerous and strict adherence to the principle of least
+privilege is not a concern, permissions may be granted directly to the Kargo 
+controller's KSA. In the event that a project-specific GSA does not exist or
+cannot be impersonated, Kargo will fall back on using the controller's KSA
+directly to access GAR repositories. While useful, this approach is not
+strictly recommended.
 :::
 
+Tokens Kargo obtains for accessing any specific GAR repository on behalf of
+any specific Kargo project, are valid for 60 minutes and cached for 40. A
+controller restart clears the cache.
+
 ### Azure Container Registry (ACR)
 
 Support for authentication to ACR repositories using workload identity is not
diff --git a/docs/docs/50-user-guide/30-patterns/index.md b/docs/docs/50-user-guide/30-patterns/index.md
index 1b957879..3783d082 100644
--- a/docs/docs/50-user-guide/30-patterns/index.md
+++ b/docs/docs/50-user-guide/30-patterns/index.md
@@ -563,9 +563,7 @@ such as Argo CD. There are a few viable options by which to approach this:
 
    :::info
    The practice of storing stage-specific configuration in dedicated branches
-   seems to have been unfairly maligned through misunderstanding of a certain
-   infamous blog post, which was actually asserting that _GitFlow_ has no place
-   in GitOps.
+   seems to have been unfairly misunderstood as being the same as _GitFlow_.
 
    Some users also object to this approach on the grounds that they don't wish
    to maintain a large number of branches. In fact (this is not GitFlow), it is
diff --git a/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/git-open-pr.md b/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/git-open-pr.md
index 80dafe37..a3d9cd11 100644
--- a/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/git-open-pr.md
+++ b/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/git-open-pr.md
@@ -24,6 +24,7 @@ GitLab pull/merge requests.
 | `targetBranch` | `string` | N | The branch to which the changes should be merged. |
 | `createTargetBranch` | `boolean` | N | Indicates whether a new, empty orphaned branch should be created and pushed to the remote if the target branch does not already exist there. Default is `false`. |
 | `title` | `string` | N | The title for the pull request. Kargo generates a title based on the commit messages if it is not explicitly specified. |
+| `description` | `string` | N | The description for the pull request. Kargo generates a title based on the commit messages if it is not explicitly specified. |
 | `labels` | `[]string` | N | Labels to add to the pull request. |
 
 ## Output
diff --git a/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/helm-template.md b/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/helm-template.md
index 4325b011..e6f4b282 100644
--- a/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/helm-template.md
+++ b/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/helm-template.md
@@ -108,5 +108,6 @@ steps:
     valuesFiles:
     - ./src/charts/my-chart/${{ ctx.stage }}-values.yaml
     outPath: ./out
+    releaseName: my-chart
 # Commit, push, etc...
 ```
diff --git a/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/http.md b/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/http.md
index dcd613c6..2a5bc1c6 100644
--- a/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/http.md
+++ b/docs/docs/50-user-guide/60-reference-docs/30-promotion-steps/http.md
@@ -12,7 +12,7 @@ with a wide variety of external services.
 
 | Name | Type | Required | Description |
 |------|------|----------|-------------|
-| `method` | `string` | Y | The HTTP method to use. |
+| `method` | `string` | N | The HTTP method to use. Defaults to `GET` |
 | `url` | `string` | Y | The URL to which the request should be made. |
 | `headers` | `[]object` | N | A list of headers to include in the request. |
 | `headers[].name` | `string` | Y | The name of the header. |
@@ -20,7 +20,7 @@ with a wide variety of external services.
 | `queryParams` | `[]object` | N | A list of query parameters to include in the request. |
 | `queryParams[].name` | `string` | Y | The name of the query parameter. |
 | `queryParams[].value` | `string` | Y | The value of the query parameter. The provided value will automatically be URL-encoded if necessary. |
-| `body` | `string` | N | The body of the request. __Note:__ As this field is a `string`, take care to utilize [`quote()`](../40-expressions.md#quote) if the body is a valid JSON `object`. Refer to the example below of posting a message to a Slack channel. |
+| `body` | `string` | N | The body of the request. __Note:__ As this field is a `string`, take care to utilize [`quote()`](../40-expressions.md#quotevalue) if the body is a valid JSON `object`. Refer to the example below of posting a message to a Slack channel. |
 | `insecureSkipTLSVerify` | `boolean` | N | Indicates whether to bypass TLS certificate verification when making the request. Setting this to `true` is highly discouraged. |
 | `timeout` | `string` | N | A string representation of the maximum time interval to wait for a request to complete. _This is the timeout for an individual HTTP request. If a request is retried, each attempt is independently subject to this timeout._ See Go's [`time` package docs](https://pkg.go.dev/time#ParseDuration) for a description of the accepted format. |
 | `successExpression` | `string` | N | An [expr-lang] expression that can evaluate the response to determine success. If this is left undefined and `failureExpression` _is_ defined, the default success criteria will be the inverse of the specified failure criteria. If both are left undefined, success is `true` when the HTTP status code is `2xx`. If `successExpression` and `failureExpression` are both defined and both evaluate to `true`, the failure takes precedence. Note that this expression should _not_ be offset by `${{` and `}}`. See examples for more details. |
diff --git a/docs/docs/50-user-guide/60-reference-docs/40-expressions.md b/docs/docs/50-user-guide/60-reference-docs/40-expressions.md
index 5877e9bb..0e7c44c3 100644
--- a/docs/docs/50-user-guide/60-reference-docs/40-expressions.md
+++ b/docs/docs/50-user-guide/60-reference-docs/40-expressions.md
@@ -145,7 +145,7 @@ Expect other useful variables to be added in the future.
 |------|------|-------------|
 | `ctx` | `object` | Contains contextual information about the promotion. See detailed structure below. |
 | `outputs` | `object` | A map of output from previous promotion steps indexed by step aliases. |
-| `secrets` | `object` | A map of maps indexed by the names of all Kubernetes `Secret`s in the `Promotion`'s `Project` and the keys within the `Data` block of each.<br/><br/>__Deprecated: Use the [`secret()` function](#secretname) instead. Will be removed in v1.7.0.__ |
+| `secrets` | `object` | A map of maps, indexed by the names of all Kubernetes `Secret`s in the `Promotion`'s `Project` that are labeled with `kargo.akuity.io/cred-type: generic`. Each inner map exposes the keys from the corresponding `Secret`'s `data` field. See [Managing Other Secrets](../50-security/40-managing-other-secrets.md) for more details about managing such `Secret`s.<br/><br/>__Deprecated: Use the [`secret()` function](#secretname) instead. Will be removed in v1.7.0.__ |
 | `vars` | `object` | A user-defined map of variable names to static values of any type. The map is derived from a `Promotion`'s `spec.promotionTemplate.spec.vars` field. Variable names must observe standard Go variable-naming rules. Variables values may, themselves, be defined using an expression. `vars` (contains previously defined variables) and `ctx` are available to expressions defining the values of variables, however, `outputs` and `secrets` are not. |
 | `task` | `object` | A map containing output from previous steps within the same PromotionTask under the `outputs` field, indexed by step aliases. Only available within `(Cluster)PromotionTask` steps. |
 
@@ -153,7 +153,7 @@ Expect other useful variables to be added in the future.
 
 The `ctx` object has the following structure:
 
-```
+```console
 ctx
 ├── project: string       # The name of the Project
 ├── stage: string         # The name of the Stage
@@ -239,7 +239,7 @@ definition of the static variables).
 
 The `ctx` object for verification has the following structure:
 
-```
+```console
 ctx
 ├── project: string  # The name of the Project
 └── stage: string    # The name of the Stage
@@ -258,14 +258,36 @@ one required argument:
 - `value` (Required): A value of any type to be converted to a string.
 
 This is useful for scenarios where an expression evaluates to a non-`string`
-JSON type, but you wish to treat it as a `string` regardless.
+JSON type, but you wish to treat it as a `string` regardless. For string inputs,
+it produces clean output without visible quotation marks.
 
 Example:
 
 ```yaml
 config:
-  numField: ${{ 40 + 2 }} # Will be treated as a number
-  strField: ${{ quote(40 + 2) }} # Will be treated as a string
+  numField: ${{ 40 + 2 }} # Will be treated as a number (42)
+  strField: ${{ quote(40 + 2) }} # Will be treated as a string ("42")
+  rawField: ${{ quote("string") }} # Will result in "string"
+```
+
+### `unsafeQuote(value)`
+
+The `unsafeQuote()` function converts any value to its string representation. It
+has one required argument:
+
+- `value` (Required): A value of any type to be converted to a string.
+
+Compared to [`quote()`](#quotevalue) this function is considered "unsafe"
+because it adds escaped quotes around input values that are already considered
+strings. For non-string values, it behaves similarly to `quote()`.
+
+Example:
+
+```yaml
+config:
+  numField: ${{ 40 + 2 }} # Will be treated as a number (42)
+  strField: ${{ unsafeQuote(40 + 2) }} # Will result in "42"
+  rawField: ${{ unsafeQuote("string") }} # Will result in "\"string\""
 ```
 
 ### `configMap(name)`
@@ -314,7 +336,7 @@ The returned `FreightOrigin` object has the following fields:
 The `FreightOrigin` object can be used as an optional argument to the
 `commitFrom()`, `imageFrom()`, or `chartFrom()` functions to disambiguate the
 desired source of an artifact when necessary. These functions return `nil` when
-relevant `Freight` is not found from the `FreightCollection`. 
+relevant `Freight` is not found from the `FreightCollection`.
 
 :::tip
 You can handle `nil` values gracefully in Expr using its
diff --git a/docs/docs/50-user-guide/60-reference-docs/70-annotations.md b/docs/docs/50-user-guide/60-reference-docs/70-annotations.md
new file mode 100644
index 00000000..521e596b
--- /dev/null
+++ b/docs/docs/50-user-guide/60-reference-docs/70-annotations.md
@@ -0,0 +1,35 @@
+---
+sidebar_label: Annotations and Labels
+description: List of Kargo-specific annotations and labels
+---
+
+# Annotations and Labels used by Kargo
+
+This page documents certain annotations and labels that are applicable to
+Kargo resource types and other Kubernetes resource types (e.g. `Secret`s or
+`ServiceAccounts`) and affect how Kargo handles those resources. The subset
+documented here are those that the maintainers have judged most likely to be of
+use to advanced users who may, for instance, be looking to interact
+programmatically with Kargo.
+
+## Annotations
+
+| Key | Target Resource(s) | Possible Values | Description |
+|-----|--------------------|-----------------|-------------|
+| `kargo.akuity.io/abort` | `Stage` | A plain string (verification ID from `.status.verifications[*].id` of the `Stage`). | Aborts an in-progress `Freight` verification. |
+| `kargo.akuity.io/authorized-stage` | `Argo CD Application` | `<project>:<stage>` | Indicates which `Stage` is authorized to manage the `Application` resource. |
+| `kargo.akuity.io/color` | `Stage` | Hex color code (e.g. `#ff8800`) | Optional cosmetic color used in the UI's pipeline view. |
+| `kargo.akuity.io/description` | Any | Any string | Optional human-readable description of the resource. May be used by the Kargo UI to display additional context or details. |
+| `kargo.akuity.io/refresh` | `Warehouse`, `Stage`, `Promotion` | A string that is unique or at least unlikely to repeat, such as a UUID or a timestamp of "now" | Triggers reconciliation of the resource when its value changes. |
+| `kargo.akuity.io/reverify` | `Stage` | Either a plain string (verification ID from `.status.verifications[*].id` of the `Stage`) or a JSON object with `id` (required), `actor`, and `controlPlane` fields. If a JSON object is provided, it is parsed as a `VerificationRequest`. | Triggers re-verification of a previously completed verification for the current `Freight`. |
+| `rbac.kargo.akuity.io/claim.<name>` | `ServiceAccount` | Any valid OIDC claim value (e.g., `sub`, `email`, or `groups`) | Maps an OIDC claim to a `ServiceAccount`, enabling user-to-ServiceAccount mappings. For more details, refer to the access control sections of the [Operator Guide](../../40-operator-guide/40-security/30-access-controls.md) and [User Guide](../50-security/20-access-controls/index.md). |
+| `rbac.kargo.akuity.io/managed` | `ServiceAccount`, `Role`, `RoleBinding` | `"true"` | Permits the UI or CLI (via the API server) to programmatically manage trios of `ServiceAccount`, `Role`, and `RoleBinding` resources via Kargo's own ["roles" abstraction](../50-security/20-access-controls/index.md#managing-mappings-and-permissions). Omit this annotation if you wish to exclusively manage these resources [declaratively](../50-security/20-access-controls/index.md#managing-kargo-roles-declaratively). |
+
+## Labels
+
+| Key | Target Resource(s) | Possible Values | Description |
+|-----|--------------------|-----------------|-------------|
+| `kargo.akuity.io/alias` | `Freight` | Any string that is unique within the project | Mutable, human-readable alias for a piece of `Freight`. This label is automatically synced from the resource's `alias` field. Users are discouraged from modifying the label directly.  The label exists primarily to enable querying for `Freight` by alias using `kubectl`. |
+| `kargo.akuity.io/cred-type` | `Secret` | `git`, `helm`, `image`, `generic` | Indicates a `Secret` represents credentials for a repository of the specified type. For more details, see the [Managing Credentials](../50-security/30-managing-credentials.md#repository-credentials-as-secret-resources). |
+| `kargo.akuity.io/project` | `Namespace` | `"true"` | Indicates that the `Namespace` is eligible for adoption by a `Project` with the same name. This label is useful when `Namespace`s are unavoidably pre-created by some other agent. For more details, see the [Working with Projects](../20-how-to-guides/20-working-with-projects.md#namespace-adoption) section. |
+| `kargo.akuity.io/shard` | `Promotion`, `Stage`, `Warehouse` | Shard ID | Indicates a specific controller instance responsible for reconciling the resource. For `Warehouse` and `Stage` resources, this label is automatically synced from the resource's `spec.shard` field. Users are discouraged from modifying the label directly. The label exists primarily to enable querying for resources by shard using `kubectl`. |
diff --git a/docs/kargo b/docs/kargo
deleted file mode 100755
index 6c8d270e..00000000
Binary files a/docs/kargo and /dev/null differ
diff --git a/go.mod b/go.mod
index 81567ffe..1bc2e5aa 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@ replace (
 )
 
 require (
-	cloud.google.com/go/compute/metadata v0.6.0
+	cloud.google.com/go/compute/metadata v0.7.0
 	code.gitea.io/sdk/gitea v0.21.0
 	connectrpc.com/connect v1.18.1
 	connectrpc.com/grpchealth v1.4.0
@@ -20,7 +20,7 @@ require (
 	github.com/aws/aws-sdk-go-v2 v1.36.3
 	github.com/aws/aws-sdk-go-v2/config v1.29.14
 	github.com/aws/aws-sdk-go-v2/credentials v1.17.67
-	github.com/aws/aws-sdk-go-v2/service/ecr v1.43.3
+	github.com/aws/aws-sdk-go-v2/service/ecr v1.44.0
 	github.com/aws/aws-sdk-go-v2/service/sts v1.33.19
 	github.com/bacongobbler/browser v1.1.0
 	github.com/bmatcuk/doublestar/v4 v4.8.1
@@ -28,9 +28,9 @@ require (
 	github.com/coreos/go-oidc/v3 v3.14.1
 	github.com/cyphar/filepath-securejoin v0.4.1
 	github.com/evanphx/json-patch/v5 v5.9.11
-	github.com/expr-lang/expr v1.17.2
+	github.com/expr-lang/expr v1.17.3
 	github.com/fatih/structtag v1.2.0
-	github.com/fluxcd/pkg/kustomize v1.16.0
+	github.com/fluxcd/pkg/kustomize v1.17.0
 	github.com/go-git/go-git/v5 v5.16.0
 	github.com/go-logr/logr v1.4.2
 	github.com/gogo/protobuf v1.3.2
@@ -42,7 +42,7 @@ require (
 	github.com/jferrl/go-githubauth v1.2.0
 	github.com/kelseyhightower/envconfig v1.4.0
 	github.com/klauspost/compress v1.18.0
-	github.com/ktrysmt/go-bitbucket v0.9.83
+	github.com/ktrysmt/go-bitbucket v0.9.85
 	github.com/microsoft/azure-devops-go-api/azuredevops/v7 v7.1.0
 	github.com/oklog/ulid/v2 v2.1.0
 	github.com/otiai10/copy v1.14.1
@@ -59,24 +59,24 @@ require (
 	github.com/xeipuuv/gojsonschema v1.2.0
 	gitlab.com/gitlab-org/api/client-go v0.128.0
 	go.uber.org/ratelimit v0.3.1
-	golang.org/x/crypto v0.37.0
-	golang.org/x/net v0.39.0
-	golang.org/x/oauth2 v0.29.0
-	golang.org/x/sync v0.13.0
-	golang.org/x/text v0.24.0
-	google.golang.org/api v0.230.0
-	google.golang.org/grpc v1.72.0
+	golang.org/x/crypto v0.38.0
+	golang.org/x/net v0.40.0
+	golang.org/x/oauth2 v0.30.0
+	golang.org/x/sync v0.14.0
+	golang.org/x/text v0.25.0
+	google.golang.org/api v0.233.0
+	google.golang.org/grpc v1.72.1
 	google.golang.org/protobuf v1.36.6
 	gopkg.in/yaml.v3 v3.0.1
 	helm.sh/helm/v3 v3.17.3
-	k8s.io/api v0.32.3
-	k8s.io/apiextensions-apiserver v0.32.3
-	k8s.io/apimachinery v0.32.3
-	k8s.io/apiserver v0.32.3
-	k8s.io/cli-runtime v0.32.3
-	k8s.io/client-go v0.32.3
+	k8s.io/api v0.33.1
+	k8s.io/apiextensions-apiserver v0.33.1
+	k8s.io/apimachinery v0.33.1
+	k8s.io/apiserver v0.33.1
+	k8s.io/cli-runtime v0.33.1
+	k8s.io/client-go v0.33.1
 	k8s.io/klog/v2 v2.130.1
-	k8s.io/utils v0.0.0-20241210054802-24370beab758
+	k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979
 	oras.land/oras-go v1.2.6
 	sigs.k8s.io/controller-runtime v0.20.4
 	sigs.k8s.io/kustomize/api v0.19.0
@@ -85,7 +85,7 @@ require (
 )
 
 require (
-	cloud.google.com/go/auth v0.16.0 // indirect
+	cloud.google.com/go/auth v0.16.1 // indirect
 	cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
 	dario.cat/mergo v1.0.1 // indirect
 	github.com/42wim/httpsig v1.2.2 // indirect
@@ -145,19 +145,17 @@ require (
 	github.com/go-openapi/swag v0.23.0 // indirect
 	github.com/gobwas/glob v0.2.3 // indirect
 	github.com/gofrs/uuid v4.0.0+incompatible // indirect
-	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/google/btree v1.1.3 // indirect
 	github.com/google/gnostic-models v0.6.9 // indirect
 	github.com/google/go-cmp v0.7.0 // indirect
 	github.com/google/go-github/v69 v69.0.0 // indirect
 	github.com/google/go-querystring v1.1.0 // indirect
-	github.com/google/gofuzz v1.2.0 // indirect
 	github.com/google/s2a-go v0.1.9 // indirect
 	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
 	github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
 	github.com/googleapis/gax-go/v2 v2.14.1 // indirect
 	github.com/gorilla/mux v1.8.1 // indirect
-	github.com/gorilla/websocket v1.5.0 // indirect
+	github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
 	github.com/gosuri/uitable v0.0.4 // indirect
 	github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
@@ -199,7 +197,7 @@ require (
 	github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
-	github.com/prometheus/client_golang v1.20.5 // indirect
+	github.com/prometheus/client_golang v1.22.0 // indirect
 	github.com/prometheus/client_model v0.6.1 // indirect
 	github.com/prometheus/common v0.62.0 // indirect
 	github.com/prometheus/procfs v0.15.1 // indirect
@@ -222,17 +220,18 @@ require (
 	go.opentelemetry.io/otel v1.35.0 // indirect
 	go.opentelemetry.io/otel/metric v1.35.0 // indirect
 	go.opentelemetry.io/otel/trace v1.35.0 // indirect
-	golang.org/x/sys v0.32.0 // indirect
-	golang.org/x/term v0.31.0 // indirect
+	golang.org/x/sys v0.33.0 // indirect
+	golang.org/x/term v0.32.0 // indirect
 	golang.org/x/time v0.11.0 // indirect
 	gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 // indirect
 	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/warnings.v0 v0.1.2 // indirect
-	k8s.io/component-base v0.32.3 // indirect
-	k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 // indirect
+	k8s.io/component-base v0.33.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
 	k8s.io/kubectl v0.32.2 // indirect
 	sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
+	sigs.k8s.io/randfill v1.0.0 // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
 )
diff --git a/go.sum b/go.sum
index 1402d548..ae3df4f0 100644
--- a/go.sum
+++ b/go.sum
@@ -1,10 +1,9 @@
-cloud.google.com/go/auth v0.16.0 h1:Pd8P1s9WkcrBE2n/PhAwKsdrR35V3Sg2II9B+ndM3CU=
-cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI=
+cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU=
+cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI=
 cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
 cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
-cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
-cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
-cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
+cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU=
+cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=
 code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4=
 code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA=
 connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw=
@@ -65,8 +64,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0io
 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
-github.com/aws/aws-sdk-go-v2/service/ecr v1.43.3 h1:YyH8Hk73bYzdbvf6S8NF5z/fb/1stpiMnFSfL6jSfRA=
-github.com/aws/aws-sdk-go-v2/service/ecr v1.43.3/go.mod h1:iQ1skgw1XRK+6Lgkb0I9ODatAP72WoTILh0zXQ5DtbU=
+github.com/aws/aws-sdk-go-v2/service/ecr v1.44.0 h1:E+UTVTDH6XTSjqxHWRuY8nB6s+05UllneWxnycplHFk=
+github.com/aws/aws-sdk-go-v2/service/ecr v1.44.0/go.mod h1:iQ1skgw1XRK+6Lgkb0I9ODatAP72WoTILh0zXQ5DtbU=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA=
 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM=
@@ -120,7 +119,6 @@ github.com/coreos/go-oidc/v3 v3.14.1/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmr
 github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
 github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
 github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
 github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
@@ -162,16 +160,16 @@ github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjT
 github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
 github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4=
 github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc=
-github.com/expr-lang/expr v1.17.2 h1:o0A99O/Px+/DTjEnQiodAgOIK9PPxL8DtXhBRKC+Iso=
-github.com/expr-lang/expr v1.17.2/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
+github.com/expr-lang/expr v1.17.3 h1:myeTTuDFz7k6eFe/JPlep/UsiIjVhG61FMHFu63U7j0=
+github.com/expr-lang/expr v1.17.3/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
 github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
 github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
 github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-github.com/fluxcd/pkg/kustomize v1.16.0 h1:UBOeIvkrC6y4owYs7vZwG5PUVFeqnRoDFN9eaNhuNPI=
-github.com/fluxcd/pkg/kustomize v1.16.0/go.mod h1:6yQkAZaG+w3nXY30LbyWRYHimjRcLRwlYkrwG0ygMSI=
+github.com/fluxcd/pkg/kustomize v1.17.0 h1:tLL8KvxHqTTZug3Q8TLvIbLC/ygEedOqdBock1r+Wiw=
+github.com/fluxcd/pkg/kustomize v1.17.0/go.mod h1:BxdXD7Fmfa63PIZRe2aP6KpDh2aXUfO7Yd/ljwhagPI=
 github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI=
 github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk=
 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
@@ -238,7 +236,6 @@ github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcb
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 github.com/google/go-containerregistry v0.20.3 h1:oNx7IdTI936V8CQRveCjaxOiegWwvM7kqkbXTpyiovI=
@@ -271,15 +268,15 @@ github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyE
 github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w=
 github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
 github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
-github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
-github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
+github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
 github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY=
 github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo=
 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
 github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -317,8 +314,6 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
-github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
@@ -329,17 +324,12 @@ github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zt
 github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/ktrysmt/go-bitbucket v0.9.83 h1:hplOLvkCLxZ3Bl+znrV+6mlm7jQkISV0SjFqlJcIUYs=
-github.com/ktrysmt/go-bitbucket v0.9.83/go.mod h1:zjenvJhOkx2wR2PAjLwRj/HS6guFu4/PlWqHEQ2gmns=
+github.com/ktrysmt/go-bitbucket v0.9.85 h1:WSKYSmpgasEmtnsr+TEhD2UtiZjCZpeTBF5T4f6/d8k=
+github.com/ktrysmt/go-bitbucket v0.9.85/go.mod h1:ZgvxUOaC6eHrNaC/DbjFvJUXaKpKeDYvfhh4U592jcs=
 github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=
@@ -410,8 +400,8 @@ github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU=
 github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
 github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg=
 github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
-github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
-github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
+github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y=
+github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
 github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
@@ -427,7 +417,6 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
 github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -439,8 +428,8 @@ github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjz
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
-github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
-github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
+github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
@@ -460,8 +449,6 @@ github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb
 github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ=
 github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY=
 github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c=
-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
 github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
 github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
@@ -487,18 +474,12 @@ github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
 github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
 github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
 github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/technosophos/moniker v0.0.0-20210218184952-3ea787d3943b h1:fo0GUa0B+vxSZ8bgnL3fpCPHReM/QPlALdak9T/Zw5Y=
@@ -547,10 +528,10 @@ go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0
 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk=
 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps=
 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0/go.mod h1:57gTHJSE5S1tqg+EKsLPlTWhpHMsWlVmer+LA926XiA=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0=
 go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w=
@@ -567,8 +548,8 @@ go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5J
 go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
 go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
 go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
-go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
-go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
+go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg=
+go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY=
 go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@@ -585,19 +566,11 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
-golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
-golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
-golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
-golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
 golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -608,30 +581,18 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
-golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
-golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
-golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
-golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98=
-golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
-golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
+golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -646,38 +607,19 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
-golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
+golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
+golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
-golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
-golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
-golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
-golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
-golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
+golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
 golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
 golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -685,9 +627,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
-golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
 golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
 golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -696,23 +635,21 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
 gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
-google.golang.org/api v0.230.0 h1:2u1hni3E+UXAXrONrrkfWpi/V6cyKVAbfGVeGtC3OxM=
-google.golang.org/api v0.230.0/go.mod h1:aqvtoMk7YkiXx+6U12arQFExiRV9D/ekvMCwCd/TksQ=
+google.golang.org/api v0.233.0 h1:iGZfjXAJiUFSSaekVB7LzXl6tRfEKhUN7FkZN++07tI=
+google.golang.org/api v0.233.0/go.mod h1:TCIVLLlcwunlMpZIhIp7Ltk77W+vUSdUKAAIlbxY44c=
 google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ=
 google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0=
 google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
-google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM=
-google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 h1:IqsN8hx+lWLqlN+Sc3DoMy/watjofWiU8sRFgQ8fhKM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
+google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA=
+google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
 google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
 google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
 gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
@@ -729,28 +666,28 @@ gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
 gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
 helm.sh/helm/v3 v3.17.3 h1:3n5rW3D0ArjFl0p4/oWO8IbY/HKaNNwJtOQFdH2AZHg=
 helm.sh/helm/v3 v3.17.3/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8=
-k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls=
-k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k=
-k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY=
-k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss=
-k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U=
-k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8=
-k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc=
-k8s.io/cli-runtime v0.32.3 h1:khLF2ivU2T6Q77H97atx3REY9tXiA3OLOjWJxUrdvss=
-k8s.io/cli-runtime v0.32.3/go.mod h1:vZT6dZq7mZAca53rwUfdFSZjdtLyfF61mkf/8q+Xjak=
-k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU=
-k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY=
-k8s.io/component-base v0.32.3 h1:98WJvvMs3QZ2LYHBzvltFSeJjEx7t5+8s71P7M74u8k=
-k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI=
+k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw=
+k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw=
+k8s.io/apiextensions-apiserver v0.33.1 h1:N7ccbSlRN6I2QBcXevB73PixX2dQNIW0ZRuguEE91zI=
+k8s.io/apiextensions-apiserver v0.33.1/go.mod h1:uNQ52z1A1Gu75QSa+pFK5bcXc4hq7lpOXbweZgi4dqA=
+k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4=
+k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/apiserver v0.33.1 h1:yLgLUPDVC6tHbNcw5uE9mo1T6ELhJj7B0geifra3Qdo=
+k8s.io/apiserver v0.33.1/go.mod h1:VMbE4ArWYLO01omz+k8hFjAdYfc3GVAYPrhP2tTKccs=
+k8s.io/cli-runtime v0.33.1 h1:TvpjEtF71ViFmPeYMj1baZMJR4iWUEplklsUQ7D3quA=
+k8s.io/cli-runtime v0.33.1/go.mod h1:9dz5Q4Uh8io4OWCLiEf/217DXwqNgiTS/IOuza99VZE=
+k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4=
+k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA=
+k8s.io/component-base v0.33.1 h1:EoJ0xA+wr77T+G8p6T3l4efT2oNwbqBVKR71E0tBIaI=
+k8s.io/component-base v0.33.1/go.mod h1:guT/w/6piyPfTgq7gfvgetyXMIh10zuXA6cRRm3rDuY=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 h1:hcha5B1kVACrLujCKLbr8XWMxCxzQx42DY8QKYJrDLg=
-k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7/go.mod h1:GewRfANuJ70iYzvn+i4lezLDAFzvjxZYK1gn1lWcfas=
+k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
+k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
 k8s.io/kubectl v0.32.2 h1:TAkag6+XfSBgkqK9I7ZvwtF0WVtUAvK8ZqTt+5zi1Us=
 k8s.io/kubectl v0.32.2/go.mod h1:+h/NQFSPxiDZYX/WZaWw9fwYezGLISP0ud8nQKg+3g8=
-k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
-k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979 h1:jgJW5IePPXLGB8e/1wvd0Ich9QE97RvvF3a8J3fP/Lg=
+k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 oras.land/oras-go v1.2.6 h1:z8cmxQXBU8yZ4mkytWqXfo6tZcamPwjsuxYU81xJ8Lk=
 oras.land/oras-go v1.2.6/go.mod h1:OVPc1PegSEe/K8YiLfosrlqlqTN9PUyFvOw5Y9gwrT8=
 sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU=
@@ -761,7 +698,10 @@ sigs.k8s.io/kustomize/api v0.19.0 h1:F+2HB2mU1MSiR9Hp1NEgoU2q9ItNOaBJl0I4Dlus5SQ
 sigs.k8s.io/kustomize/api v0.19.0/go.mod h1:/BbwnivGVcBh1r+8m3tH1VNxJmHSk1PzP5fkP6lbL1o=
 sigs.k8s.io/kustomize/kyaml v0.19.0 h1:RFge5qsO1uHhwJsu3ipV7RNolC7Uozc0jUBC/61XSlA=
 sigs.k8s.io/kustomize/kyaml v0.19.0/go.mod h1:FeKD5jEOH+FbZPpqUghBP8mrLjJ3+zD3/rf9NNu1cwY=
-sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk=
-sigs.k8s.io/structured-merge-diff/v4 v4.5.0/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
+sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
+sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
+sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
+sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
+sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
 sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
diff --git a/hack/tools/go.mod b/hack/tools/go.mod
index f1849e22..4f707027 100644
--- a/hack/tools/go.mod
+++ b/hack/tools/go.mod
@@ -3,26 +3,30 @@ module tools
 go 1.24.1
 
 require (
-	github.com/bufbuild/buf v1.53.0
+	github.com/bufbuild/buf v1.54.0
 	github.com/golangci/golangci-lint v1.64.8
-	golang.org/x/tools v0.32.0
+	golang.org/x/tools v0.33.0
 	helm.sh/helm/v3 v3.17.3
-	k8s.io/code-generator v0.33.0
-	sigs.k8s.io/controller-tools v0.17.3
+	k8s.io/code-generator v0.33.1
+	sigs.k8s.io/controller-tools v0.18.0
 )
 
 require (
 	4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
 	4d63.com/gochecknoglobals v0.2.2 // indirect
 	buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.6-20250121211742-6d880cc6cc8d.1 // indirect
-	buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250307204501-0409229c3780.1 // indirect
-	buf.build/gen/go/bufbuild/registry/connectrpc/go v1.18.1-20250408145534-f5ce355693bb.1 // indirect
-	buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.6-20250408145534-f5ce355693bb.1 // indirect
+	buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1 // indirect
+	buf.build/gen/go/bufbuild/registry/connectrpc/go v1.18.1-20250424215339-a457693b5db4.1 // indirect
+	buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.6-20250424215339-a457693b5db4.1 // indirect
 	buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.6-20241007202033-cf42259fcbfc.1 // indirect
-	buf.build/go/bufplugin v0.8.0 // indirect
-	buf.build/go/protoyaml v0.3.2 // indirect
+	buf.build/go/app v0.1.0 // indirect
+	buf.build/go/bufplugin v0.9.0 // indirect
+	buf.build/go/interrupt v1.1.0 // indirect
+	buf.build/go/protovalidate v0.12.0 // indirect
+	buf.build/go/protoyaml v0.6.0 // indirect
 	buf.build/go/spdx v0.2.0 // indirect
-	cel.dev/expr v0.23.1 // indirect
+	buf.build/go/standard v0.1.0 // indirect
+	cel.dev/expr v0.24.0 // indirect
 	connectrpc.com/connect v1.18.1 // indirect
 	connectrpc.com/otelconnect v0.7.2 // indirect
 	dario.cat/mergo v1.0.1 // indirect
@@ -64,7 +68,6 @@ require (
 	github.com/breml/errchkjson v0.4.0 // indirect
 	github.com/bufbuild/protocompile v0.14.1 // indirect
 	github.com/bufbuild/protoplugin v0.0.0-20250218205857-750e09ce93e1 // indirect
-	github.com/bufbuild/protovalidate-go v0.9.3 // indirect
 	github.com/butuzov/ireturn v0.3.1 // indirect
 	github.com/butuzov/mirror v1.3.0 // indirect
 	github.com/catenacyber/perfsprint v0.8.2 // indirect
@@ -81,7 +84,7 @@ require (
 	github.com/containerd/platforms v0.2.1 // indirect
 	github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect
 	github.com/containerd/typeurl/v2 v2.2.3 // indirect
-	github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
+	github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
 	github.com/curioswitch/go-reassign v0.3.0 // indirect
 	github.com/cyphar/filepath-securejoin v0.3.6 // indirect
 	github.com/daixiang0/gci v0.13.5 // indirect
@@ -101,7 +104,6 @@ require (
 	github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect
 	github.com/fatih/color v1.18.0 // indirect
 	github.com/fatih/structtag v1.2.0 // indirect
-	github.com/felixge/fgprof v0.9.5 // indirect
 	github.com/felixge/httpsnoop v1.0.4 // indirect
 	github.com/firefart/nonamedreturns v1.0.5 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
@@ -132,7 +134,6 @@ require (
 	github.com/gofrs/flock v0.12.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
-	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
 	github.com/golangci/go-printf-func-name v0.1.0 // indirect
 	github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
@@ -140,17 +141,17 @@ require (
 	github.com/golangci/plugin-module-register v0.1.1 // indirect
 	github.com/golangci/revgrep v0.8.0 // indirect
 	github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect
-	github.com/google/btree v1.0.1 // indirect
-	github.com/google/cel-go v0.24.1 // indirect
+	github.com/google/btree v1.1.3 // indirect
+	github.com/google/cel-go v0.25.0 // indirect
 	github.com/google/gnostic-models v0.6.9 // indirect
 	github.com/google/go-cmp v0.7.0 // indirect
 	github.com/google/go-containerregistry v0.20.3 // indirect
-	github.com/google/pprof v0.0.0-20250418163039-24c5476c6587 // indirect
+	github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
 	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
 	github.com/google/uuid v1.6.0 // indirect
 	github.com/gordonklaus/ineffassign v0.1.0 // indirect
 	github.com/gorilla/mux v1.8.1 // indirect
-	github.com/gorilla/websocket v1.5.0 // indirect
+	github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
 	github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
 	github.com/gostaticanalysis/comment v1.5.0 // indirect
 	github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
@@ -240,12 +241,11 @@ require (
 	github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
 	github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/pkg/profile v1.7.0 // indirect
 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 	github.com/polyfloyd/go-errorlint v1.7.1 // indirect
-	github.com/prometheus/client_golang v1.20.2 // indirect
+	github.com/prometheus/client_golang v1.22.0 // indirect
 	github.com/prometheus/client_model v0.6.1 // indirect
-	github.com/prometheus/common v0.55.0 // indirect
+	github.com/prometheus/common v0.62.0 // indirect
 	github.com/prometheus/procfs v0.15.1 // indirect
 	github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect
 	github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
@@ -321,24 +321,24 @@ require (
 	go.opentelemetry.io/otel/metric v1.35.0 // indirect
 	go.opentelemetry.io/otel/trace v1.35.0 // indirect
 	go.uber.org/automaxprocs v1.6.0 // indirect
-	go.uber.org/mock v0.5.1 // indirect
+	go.uber.org/mock v0.5.2 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
 	go.uber.org/zap v1.27.0 // indirect
 	go.uber.org/zap/exp v0.3.0 // indirect
-	golang.org/x/crypto v0.37.0 // indirect
-	golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
+	golang.org/x/crypto v0.38.0 // indirect
+	golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
 	golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect
 	golang.org/x/mod v0.24.0 // indirect
-	golang.org/x/net v0.39.0 // indirect
-	golang.org/x/oauth2 v0.26.0 // indirect
-	golang.org/x/sync v0.13.0 // indirect
-	golang.org/x/sys v0.32.0 // indirect
-	golang.org/x/term v0.31.0 // indirect
-	golang.org/x/text v0.24.0 // indirect
+	golang.org/x/net v0.40.0 // indirect
+	golang.org/x/oauth2 v0.27.0 // indirect
+	golang.org/x/sync v0.14.0 // indirect
+	golang.org/x/sys v0.33.0 // indirect
+	golang.org/x/term v0.32.0 // indirect
+	golang.org/x/text v0.25.0 // indirect
 	golang.org/x/time v0.10.0 // indirect
-	google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e // indirect
-	google.golang.org/grpc v1.71.0 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 // indirect
+	google.golang.org/grpc v1.72.0 // indirect
 	google.golang.org/protobuf v1.36.6 // indirect
 	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
@@ -346,13 +346,13 @@ require (
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	honnef.co/go/tools v0.6.1 // indirect
-	k8s.io/api v0.32.2 // indirect
-	k8s.io/apiextensions-apiserver v0.32.2 // indirect
-	k8s.io/apimachinery v0.33.0 // indirect
-	k8s.io/apiserver v0.32.2 // indirect
+	k8s.io/api v0.33.0 // indirect
+	k8s.io/apiextensions-apiserver v0.33.0 // indirect
+	k8s.io/apimachinery v0.33.1 // indirect
+	k8s.io/apiserver v0.33.0 // indirect
 	k8s.io/cli-runtime v0.32.2 // indirect
-	k8s.io/client-go v0.32.2 // indirect
-	k8s.io/component-base v0.32.2 // indirect
+	k8s.io/client-go v0.33.0 // indirect
+	k8s.io/component-base v0.33.0 // indirect
 	k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 // indirect
 	k8s.io/klog/v2 v2.130.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
diff --git a/hack/tools/go.sum b/hack/tools/go.sum
index bc174166..9a295e96 100644
--- a/hack/tools/go.sum
+++ b/hack/tools/go.sum
@@ -4,22 +4,30 @@
 4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0=
 buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.6-20250121211742-6d880cc6cc8d.1 h1:f6miF8tK6H+Ktad24WpnNfpHO75GRGk0rhJ1mxPXqgA=
 buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.6-20250121211742-6d880cc6cc8d.1/go.mod h1:rvbyamNtvJ4o3ExeCmaG5/6iHnu0vy0E+UQ+Ph0om8s=
-buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250307204501-0409229c3780.1 h1:zgJPqo17m28+Lf5BW4xv3PvU20BnrmTcGYrog22lLIU=
-buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250307204501-0409229c3780.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U=
-buf.build/gen/go/bufbuild/registry/connectrpc/go v1.18.1-20250408145534-f5ce355693bb.1 h1:T9SjIDu/MDc0w3Zsn2vTY2cAln9smvALy/x6hifEoB4=
-buf.build/gen/go/bufbuild/registry/connectrpc/go v1.18.1-20250408145534-f5ce355693bb.1/go.mod h1:oPjPPfT42x42QaEpI3YoHfgcVXRg9WMZ3e0qg34HT1g=
-buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.6-20250408145534-f5ce355693bb.1 h1:mduBaTj1Vc2XKmO5fRdpxk4K96cKERaV6nFPMHyLy6M=
-buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.6-20250408145534-f5ce355693bb.1/go.mod h1:ee69ieBAzwc/oY/Vde0K4r6JWvrk093q4Z/FXexPMmA=
+buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1 h1:YhMSc48s25kr7kv31Z8vf7sPUIq5YJva9z1mn/hAt0M=
+buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U=
+buf.build/gen/go/bufbuild/registry/connectrpc/go v1.18.1-20250424215339-a457693b5db4.1 h1:/xe4ZIu8EIUaWoGeqTVQYzJ/bNMgkWUi706Puwo8A5Q=
+buf.build/gen/go/bufbuild/registry/connectrpc/go v1.18.1-20250424215339-a457693b5db4.1/go.mod h1:9bOYLdeGZQKUUP21CviSP1G3U5qpgZ0k5Kn7i9Q9GfY=
+buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.6-20250424215339-a457693b5db4.1 h1:/CrSdYpZi1tRhnkUNTY00LE8ro++bHwSBjLcW+dywM8=
+buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.6-20250424215339-a457693b5db4.1/go.mod h1:bUPpZtzAkcnTA7OLfKCvkvkxEAC6dG/ZIlbnbUJicL4=
 buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.6-20241007202033-cf42259fcbfc.1 h1:trcsXBDm8exui7mvndZnvworCyBq1xuMnod2N0j79K8=
 buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.6-20241007202033-cf42259fcbfc.1/go.mod h1:OUbhXurY+VHFGn9FBxcRy8UB7HXk9NvJ2qCgifOMypQ=
-buf.build/go/bufplugin v0.8.0 h1:YgR1+CNGmzR69jt85oRWTa5FioZoX/tOrHV+JxfNnnk=
-buf.build/go/bufplugin v0.8.0/go.mod h1:rcm0Esd3P/GM2rtYTvz3+9Gf8w9zdo7rG8dKSxYHHIE=
-buf.build/go/protoyaml v0.3.2 h1:QJF3k7btMameIadLLcK3Rry81OK3gYA5nZMXirV1Bs4=
-buf.build/go/protoyaml v0.3.2/go.mod h1:rUlMqwfZeONS/BAt00wB6jV5ay/eHXUzxgiKSIyrvyc=
+buf.build/go/app v0.1.0 h1:nlqD/h0rhIN73ZoiDElprrPiO2N6JV+RmNK34K29Ihg=
+buf.build/go/app v0.1.0/go.mod h1:0XVOYemubVbxNXVY0DnsVgWeGkcbbAvjDa1fmhBC+Wo=
+buf.build/go/bufplugin v0.9.0 h1:ktZJNP3If7ldcWVqh46XKeiYJVPxHQxCfjzVQDzZ/lo=
+buf.build/go/bufplugin v0.9.0/go.mod h1:Z0CxA3sKQ6EPz/Os4kJJneeRO6CjPeidtP1ABh5jPPY=
+buf.build/go/interrupt v1.1.0 h1:olBuhgv9Sav4/9pkSLoxgiOsZDgM5VhRhvRpn3DL0lE=
+buf.build/go/interrupt v1.1.0/go.mod h1:ql56nXPG1oHlvZa6efNC7SKAQ/tUjS6z0mhJl0gyeRM=
+buf.build/go/protovalidate v0.12.0 h1:4GKJotbspQjRCcqZMGVSuC8SjwZ/FmgtSuKDpKUTZew=
+buf.build/go/protovalidate v0.12.0/go.mod h1:q3PFfbzI05LeqxSwq+begW2syjy2Z6hLxZSkP1OH/D0=
+buf.build/go/protoyaml v0.6.0 h1:Nzz1lvcXF8YgNZXk+voPPwdU8FjDPTUV4ndNTXN0n2w=
+buf.build/go/protoyaml v0.6.0/go.mod h1:RgUOsBu/GYKLDSIRgQXniXbNgFlGEZnQpRAUdLAFV2Q=
 buf.build/go/spdx v0.2.0 h1:IItqM0/cMxvFJJumcBuP8NrsIzMs/UYjp/6WSpq8LTw=
 buf.build/go/spdx v0.2.0/go.mod h1:bXdwQFem9Si3nsbNy8aJKGPoaPi5DKwdeEp5/ArZ6w8=
-cel.dev/expr v0.23.1 h1:K4KOtPCJQjVggkARsjG9RWXP6O4R73aHeJMa/dmCQQg=
-cel.dev/expr v0.23.1/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
+buf.build/go/standard v0.1.0 h1:g98T9IyvAl0vS3Pq8iVk6Cvj2ZiFvoUJRtfyGa0120U=
+buf.build/go/standard v0.1.0/go.mod h1:PiqpHz/7ZFq+kqvYhc/SK3lxFIB9N/aiH2CFC2JHIQg=
+cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
+cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
 connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw=
 connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
 connectrpc.com/otelconnect v0.7.2 h1:WlnwFzaW64dN06JXU+hREPUGeEzpz3Acz2ACOmN8cMI=
@@ -116,14 +124,12 @@ github.com/breml/errchkjson v0.4.0 h1:gftf6uWZMtIa/Is3XJgibewBm2ksAQSY/kABDNFTAd
 github.com/breml/errchkjson v0.4.0/go.mod h1:AuBOSTHyLSaaAFlWsRSuRBIroCh3eh7ZHh5YeelDIk8=
 github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70=
 github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
-github.com/bufbuild/buf v1.53.0 h1:i0OgpDkzv8yLyCokXRCgbQao/SqTnqXYtERre0Jw6Do=
-github.com/bufbuild/buf v1.53.0/go.mod h1:DylfLDMblZt5mX/SEFv2VzZMgdlePArhMGYVpk4M6N0=
+github.com/bufbuild/buf v1.54.0 h1:0kjSRNNkrDZ1wSKXjcCn05IMeRq9aCUcwrORwH24x1c=
+github.com/bufbuild/buf v1.54.0/go.mod h1:UbGzdlFMzfg1GUmGL+AZUB/4bzGn+XPeqL3ru14iwd4=
 github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw=
 github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c=
 github.com/bufbuild/protoplugin v0.0.0-20250218205857-750e09ce93e1 h1:V1xulAoqLqVg44rY97xOR+mQpD2N+GzhMHVwJ030WEU=
 github.com/bufbuild/protoplugin v0.0.0-20250218205857-750e09ce93e1/go.mod h1:c5D8gWRIZ2HLWO3gXYTtUfw/hbJyD8xikv2ooPxnklQ=
-github.com/bufbuild/protovalidate-go v0.9.3 h1:XvdtwQuppS3wjzGfpOirsqwN5ExH2+PiIuA/XZd3MTM=
-github.com/bufbuild/protovalidate-go v0.9.3/go.mod h1:2lUDP6fNd3wxznRNH3Nj64VB07+PySeslamkerwP6tE=
 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng=
 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
 github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ=
@@ -148,15 +154,6 @@ github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iy
 github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ=
 github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc=
 github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww=
-github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs=
-github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs=
-github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww=
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
 github.com/ckaznocha/intrange v0.3.0 h1:VqnxtK32pxgkhJgYQEeOArVidIPg+ahLP7WBOXZd5ZY=
 github.com/ckaznocha/intrange v0.3.0/go.mod h1:+I/o2d2A1FBHgGELbGxzIcyd3/9l9DuwjM8FsbSS3Lo=
 github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo=
@@ -177,8 +174,9 @@ github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRcc
 github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU=
 github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40=
 github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk=
-github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
 github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
+github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
 github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
@@ -220,8 +218,6 @@ github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arX
 github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
 github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
 github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
-github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=
-github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=
 github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q=
 github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A=
 github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls=
@@ -232,9 +228,6 @@ github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
 github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
 github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
-github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
-github.com/felixge/fgprof v0.9.5 h1:8+vR6yu2vvSKn08urWyEuxx75NWPEvybbkBirEpsbVY=
-github.com/felixge/fgprof v0.9.5/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM=
 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA=
@@ -309,9 +302,6 @@ github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4
 github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs=
 github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
 github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
-github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
-github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
-github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY=
 github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
 github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -342,10 +332,10 @@ github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNF
 github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ=
 github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k=
 github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
-github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
-github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
-github.com/google/cel-go v0.24.1 h1:jsBCtxG8mM5wiUJDSGUqU0K7Mtr3w7Eyv00rw4DiZxI=
-github.com/google/cel-go v0.24.1/go.mod h1:Hdf9TqOaTNSFQA1ybQaRqATVoK7m/zcf7IMhGXP5zI8=
+github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
+github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
+github.com/google/cel-go v0.25.0 h1:jsFw9Fhn+3y2kBbltZR4VEz5xKkcIFRPDnuEzAGv5GY=
+github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI=
 github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
 github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -361,12 +351,8 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
 github.com/google/go-containerregistry v0.20.3 h1:oNx7IdTI936V8CQRveCjaxOiegWwvM7kqkbXTpyiovI=
 github.com/google/go-containerregistry v0.20.3/go.mod h1:w00pIgBRDVUDFM6bq+Qx8lwNWK+cxgCuX1vd3PIBDNI=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
-github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
-github.com/google/pprof v0.0.0-20250418163039-24c5476c6587 h1:b/8HpQhvKLSNzH5oTXN2WkNcMl6YB5K3FRbb+i+Ml34=
-github.com/google/pprof v0.0.0-20250418163039-24c5476c6587/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
+github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
+github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -377,8 +363,8 @@ github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH
 github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
 github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
 github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
-github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
-github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
+github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
 github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk=
 github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc=
 github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado=
@@ -397,8 +383,8 @@ github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16
 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
 github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -421,8 +407,6 @@ github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUq
 github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
 github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
 github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
-github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
-github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw=
 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
 github.com/jdx/go-netrc v1.0.0 h1:QbLMLyCZGj0NA8glAhxUpf1zDg6cxnWgMBbjq40W0gQ=
@@ -489,7 +473,6 @@ github.com/ldez/tagliatelle v0.7.1 h1:bTgKjjc2sQcsgPiT902+aadvMjCeMHrY7ly2XKFORI
 github.com/ldez/tagliatelle v0.7.1/go.mod h1:3zjxUpsNB2aEZScWiZTHrAXOl1x25t3cRmzfK1mlo2I=
 github.com/ldez/usetesting v0.4.2 h1:J2WwbrFGk3wx4cZwSMiCQQ00kjGR0+tuuyW0Lqm4lwA=
 github.com/ldez/usetesting v0.4.2/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ=
-github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs=
 github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY=
 github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA=
 github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
@@ -596,15 +579,14 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
 github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
 github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
 github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
-github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
-github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
+github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y=
+github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
 github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
 github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
 github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8=
 github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U=
-github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
 github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
 github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
 github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w=
@@ -625,8 +607,6 @@ github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjL
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA=
-github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -639,16 +619,16 @@ github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
-github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg=
-github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
+github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
 github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
-github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
-github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
+github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
+github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
@@ -851,14 +831,14 @@ go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5J
 go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
 go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
 go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
-go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
-go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
+go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI=
+go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
 go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
 go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
-go.uber.org/mock v0.5.1 h1:ASgazW/qBmR+A32MYFDB6E2POoTgOwT509VP0CT/fjs=
-go.uber.org/mock v0.5.1/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
+go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
+go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
 go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
 go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
@@ -872,10 +852,10 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
 golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
-golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
-golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
 golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
 golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
 golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac h1:TSSpLIG4v+p0rPv1pNOQtl1I8knsO4S9trOxNMOLVP4=
@@ -910,10 +890,10 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
 golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
 golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
-golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE=
-golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
+golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
+golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -925,8 +905,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
 golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
-golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
+golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -941,10 +921,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -955,8 +933,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
-golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
+golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
@@ -965,8 +943,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
 golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
-golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
-golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
+golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -977,8 +955,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
 golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
 golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1001,18 +979,18 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
 golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
 golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
-golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
-golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
+golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
+golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e h1:UdXH7Kzbj+Vzastr5nVfccbmFsmYNygVLSPk1pEfDoY=
-google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
-google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg=
-google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec=
+google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0=
+google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 h1:IqsN8hx+lWLqlN+Sc3DoMy/watjofWiU8sRFgQ8fhKM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
+google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM=
+google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
 google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
 google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
@@ -1040,22 +1018,22 @@ helm.sh/helm/v3 v3.17.3 h1:3n5rW3D0ArjFl0p4/oWO8IbY/HKaNNwJtOQFdH2AZHg=
 helm.sh/helm/v3 v3.17.3/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8=
 honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI=
 honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4=
-k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw=
-k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y=
-k8s.io/apiextensions-apiserver v0.32.2 h1:2YMk285jWMk2188V2AERy5yDwBYrjgWYggscghPCvV4=
-k8s.io/apiextensions-apiserver v0.32.2/go.mod h1:GPwf8sph7YlJT3H6aKUWtd0E+oyShk/YHWQHf/OOgCA=
-k8s.io/apimachinery v0.33.0 h1:1a6kHrJxb2hs4t8EE5wuR/WxKDwGN1FKH3JvDtA0CIQ=
-k8s.io/apimachinery v0.33.0/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/apiserver v0.32.2 h1:WzyxAu4mvLkQxwD9hGa4ZfExo3yZZaYzoYvvVDlM6vw=
-k8s.io/apiserver v0.32.2/go.mod h1:PEwREHiHNU2oFdte7BjzA1ZyjWjuckORLIK/wLV5goM=
+k8s.io/api v0.33.0 h1:yTgZVn1XEe6opVpP1FylmNrIFWuDqe2H0V8CT5gxfIU=
+k8s.io/api v0.33.0/go.mod h1:CTO61ECK/KU7haa3qq8sarQ0biLq2ju405IZAd9zsiM=
+k8s.io/apiextensions-apiserver v0.33.0 h1:d2qpYL7Mngbsc1taA4IjJPRJ9ilnsXIrndH+r9IimOs=
+k8s.io/apiextensions-apiserver v0.33.0/go.mod h1:VeJ8u9dEEN+tbETo+lFkwaaZPg6uFKLGj5vyNEwwSzc=
+k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4=
+k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/apiserver v0.33.0 h1:QqcM6c+qEEjkOODHppFXRiw/cE2zP85704YrQ9YaBbc=
+k8s.io/apiserver v0.33.0/go.mod h1:EixYOit0YTxt8zrO2kBU7ixAtxFce9gKGq367nFmqI8=
 k8s.io/cli-runtime v0.32.2 h1:aKQR4foh9qeyckKRkNXUccP9moxzffyndZAvr+IXMks=
 k8s.io/cli-runtime v0.32.2/go.mod h1:a/JpeMztz3xDa7GCyyShcwe55p8pbcCVQxvqZnIwXN8=
-k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA=
-k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94=
-k8s.io/code-generator v0.33.0 h1:B212FVl6EFqNmlgdOZYWNi77yBv+ed3QgQsMR8YQCw4=
-k8s.io/code-generator v0.33.0/go.mod h1:KnJRokGxjvbBQkSJkbVuBbu6z4B0rC7ynkpY5Aw6m9o=
-k8s.io/component-base v0.32.2 h1:1aUL5Vdmu7qNo4ZsE+569PV5zFatM9hl+lb3dEea2zU=
-k8s.io/component-base v0.32.2/go.mod h1:PXJ61Vx9Lg+P5mS8TLd7bCIr+eMJRQTyXe8KvkrvJq0=
+k8s.io/client-go v0.33.0 h1:UASR0sAYVUzs2kYuKn/ZakZlcs2bEHaizrrHUZg0G98=
+k8s.io/client-go v0.33.0/go.mod h1:kGkd+l/gNGg8GYWAPr0xF1rRKvVWvzh9vmZAMXtaKOg=
+k8s.io/code-generator v0.33.1 h1:ZLzIRdMsh3Myfnx9BaooX6iQry29UJjVfVG+BuS+UMw=
+k8s.io/code-generator v0.33.1/go.mod h1:HUKT7Ubp6bOgIbbaPIs9lpd2Q02uqkMCMx9/GjDrWpY=
+k8s.io/component-base v0.33.0 h1:Ot4PyJI+0JAD9covDhwLp9UNkUja209OzsJ4FzScBNk=
+k8s.io/component-base v0.33.0/go.mod h1:aXYZLbw3kihdkOPMDhWbjGCO6sg+luw554KP51t8qCU=
 k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog=
 k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
@@ -1074,8 +1052,8 @@ oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo=
 oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo=
 pluginrpc.com/pluginrpc v0.5.0 h1:tOQj2D35hOmvHyPu8e7ohW2/QvAnEtKscy2IJYWQ2yo=
 pluginrpc.com/pluginrpc v0.5.0/go.mod h1:UNWZ941hcVAoOZUn8YZsMmOZBzbUjQa3XMns8RQLp9o=
-sigs.k8s.io/controller-tools v0.17.3 h1:lwFPLicpBKLgIepah+c8ikRBubFW5kOQyT88r3EwfNw=
-sigs.k8s.io/controller-tools v0.17.3/go.mod h1:1ii+oXcYZkxcBXzwv3YZBlzjt1fvkrCGjVF73blosJI=
+sigs.k8s.io/controller-tools v0.18.0 h1:rGxGZCZTV2wJreeRgqVoWab/mfcumTMmSwKzoM9xrsE=
+sigs.k8s.io/controller-tools v0.18.0/go.mod h1:gLKoiGBriyNh+x1rWtUQnakUYEujErjXs9pf+x/8n1U=
 sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
 sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
 sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
diff --git a/internal/cli/cmd/delete/delete.go b/internal/cli/cmd/delete/delete.go
index 68a5f4fd..7c67c22a 100644
--- a/internal/cli/cmd/delete/delete.go
+++ b/internal/cli/cmd/delete/delete.go
@@ -77,6 +77,7 @@ kargo delete warehouse --project=my-project my-warehouse
 	// Register subcommands.
 	cmd.AddCommand(newCredentialsCommand(cfg, streams))
 	cmd.AddCommand(newProjectCommand(cfg, streams))
+	cmd.AddCommand(newProjectConfigCommand(cfg, streams))
 	cmd.AddCommand(newRoleCommand(cfg, streams))
 	cmd.AddCommand(newStageCommand(cfg, streams))
 	cmd.AddCommand(newWarehouseCommand(cfg, streams))
diff --git a/internal/cli/cmd/delete/project_config.go b/internal/cli/cmd/delete/project_config.go
new file mode 100644
index 00000000..058d8b0a
--- /dev/null
+++ b/internal/cli/cmd/delete/project_config.go
@@ -0,0 +1,118 @@
+package delete
+
+import (
+	"context"
+	"fmt"
+
+	"connectrpc.com/connect"
+	"github.com/spf13/cobra"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/cli-runtime/pkg/genericclioptions"
+	"k8s.io/cli-runtime/pkg/genericiooptions"
+
+	v1alpha1 "github.com/akuity/kargo/api/service/v1alpha1"
+	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+	"github.com/akuity/kargo/internal/cli/client"
+	"github.com/akuity/kargo/internal/cli/config"
+	"github.com/akuity/kargo/internal/cli/io"
+	"github.com/akuity/kargo/internal/cli/kubernetes"
+	"github.com/akuity/kargo/internal/cli/option"
+	"github.com/akuity/kargo/internal/cli/templates"
+)
+
+type deleteProjectConfigOptions struct {
+	genericiooptions.IOStreams
+	*genericclioptions.PrintFlags
+
+	Config        config.CLIConfig
+	ClientOptions client.Options
+
+	Project string
+}
+
+func newProjectConfigCommand(
+	cfg config.CLIConfig,
+	streams genericiooptions.IOStreams,
+) *cobra.Command {
+	cmdOpts := &deleteProjectConfigOptions{
+		Config:    cfg,
+		IOStreams: streams,
+		PrintFlags: genericclioptions.NewPrintFlags("deleted").
+			WithTypeSetter(kubernetes.GetScheme()),
+	}
+
+	cmd := &cobra.Command{
+		Use:     "projectconfig [PROJECT]",
+		Aliases: []string{"projectconfigs"},
+		Short:   "Delete project configuration",
+		Args:    option.MaximumNArgs(1),
+		Example: templates.Example(`
+# Delete project configuration for my-project
+kargo delete projectconfig my-project
+
+# Delete project configuration for the default project
+kargo config set-project my-project
+kargo delete projectconfig
+`),
+		RunE: func(cmd *cobra.Command, args []string) error {
+			cmdOpts.complete(args)
+			return cmdOpts.run(cmd.Context())
+		},
+	}
+
+	// Register the option flags on the command.
+	cmdOpts.addFlags(cmd)
+
+	// Set the input/output streams for the command.
+	io.SetIOStreams(cmd, cmdOpts.IOStreams)
+
+	return cmd
+}
+
+// addFlags adds the flags for the delete project config options to the provided
+// command.
+func (o *deleteProjectConfigOptions) addFlags(cmd *cobra.Command) {
+	o.ClientOptions.AddFlags(cmd.PersistentFlags())
+	o.PrintFlags.AddFlags(cmd)
+}
+
+// complete sets the options from the command arguments.
+func (o *deleteProjectConfigOptions) complete(args []string) {
+	o.Project = o.Config.Project
+	if len(args) > 0 {
+		o.Project = args[0]
+	}
+}
+
+// run removes the project config from the project.
+func (o *deleteProjectConfigOptions) run(ctx context.Context) error {
+	kargoSvcCli, err := client.GetClientFromConfig(ctx, o.Config, o.ClientOptions)
+	if err != nil {
+		return fmt.Errorf("get client from config: %w", err)
+	}
+
+	printer, err := o.PrintFlags.ToPrinter()
+	if err != nil {
+		return fmt.Errorf("create printer: %w", err)
+	}
+
+	if _, err = kargoSvcCli.DeleteProjectConfig(
+		ctx,
+		connect.NewRequest(&v1alpha1.DeleteProjectConfigRequest{
+			Name: o.Project,
+		}),
+	); err != nil {
+		return fmt.Errorf("delete project configuration: %w", err)
+	}
+
+	if err = printer.PrintObj(
+		&kargoapi.ProjectConfig{
+			ObjectMeta: metav1.ObjectMeta{
+				Name: o.Project,
+			},
+		}, o.IOStreams.Out); err != nil {
+		return fmt.Errorf("print project configuration: %w", err)
+	}
+
+	return nil
+}
diff --git a/internal/cli/cmd/get/get.go b/internal/cli/cmd/get/get.go
index c6ffc10e..554cc571 100644
--- a/internal/cli/cmd/get/get.go
+++ b/internal/cli/cmd/get/get.go
@@ -46,6 +46,7 @@ kargo get promotions --project=my-project --stage=my-stage
 	// Register subcommands.
 	cmd.AddCommand(newGetCredentialsCommand(cfg, streams, cmdOpts))
 	cmd.AddCommand(newGetFreightCommand(cfg, streams, cmdOpts))
+	cmd.AddCommand(newGetProjectConfigCommand(cfg, streams, cmdOpts))
 	cmd.AddCommand(newGetProjectsCommand(cfg, streams, cmdOpts))
 	cmd.AddCommand(newGetPromotionsCommand(cfg, streams, cmdOpts))
 	cmd.AddCommand(newRolesCommand(cfg, streams, cmdOpts))
@@ -97,6 +98,8 @@ func printObjects[T runtime.Object](
 		printObj = newFreightTable(list)
 	case *kargoapi.Project:
 		printObj = newProjectTable(list)
+	case *kargoapi.ProjectConfig:
+		printObj = newProjectConfigTable(list)
 	case *kargoapi.Promotion:
 		printObj = newPromotionTable(list)
 	case *rbacapi.Role:
diff --git a/internal/cli/cmd/get/project_config.go b/internal/cli/cmd/get/project_config.go
new file mode 100644
index 00000000..183fac7f
--- /dev/null
+++ b/internal/cli/cmd/get/project_config.go
@@ -0,0 +1,140 @@
+package get
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"connectrpc.com/connect"
+	"github.com/spf13/cobra"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/duration"
+	"k8s.io/cli-runtime/pkg/genericclioptions"
+	"k8s.io/cli-runtime/pkg/genericiooptions"
+
+	v1alpha1 "github.com/akuity/kargo/api/service/v1alpha1"
+	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+	"github.com/akuity/kargo/internal/cli/client"
+	"github.com/akuity/kargo/internal/cli/config"
+	"github.com/akuity/kargo/internal/cli/io"
+	"github.com/akuity/kargo/internal/cli/kubernetes"
+	"github.com/akuity/kargo/internal/cli/templates"
+)
+
+type getProjectConfigOptions struct {
+	genericiooptions.IOStreams
+	*genericclioptions.PrintFlags
+
+	*getOptions
+
+	Config        config.CLIConfig
+	ClientOptions client.Options
+
+	Project string
+}
+
+func newGetProjectConfigCommand(
+	cfg config.CLIConfig,
+	streams genericiooptions.IOStreams,
+	getOptions *getOptions,
+) *cobra.Command {
+	cmdOpts := &getProjectConfigOptions{
+		Config:     cfg,
+		IOStreams:  streams,
+		getOptions: getOptions,
+		PrintFlags: genericclioptions.NewPrintFlags("").WithTypeSetter(kubernetes.GetScheme()),
+	}
+
+	cmd := &cobra.Command{
+		Use:     "projectconfig [PROJECT] [--no-headers]",
+		Aliases: []string{"projectconfigs"},
+		Short:   "Display project configuration",
+		Args:    cobra.MaximumNArgs(1),
+		Example: templates.Example(`
+# Get project configuration for my-project
+kargo get projectconfig my-project
+
+# Get project configuration for the default project
+kargo config set-project my-project
+kargo get projectconfig
+`),
+		RunE: func(cmd *cobra.Command, args []string) error {
+			cmdOpts.complete(args)
+			return cmdOpts.run(cmd.Context())
+		},
+	}
+
+	// Register the option flags on the command.
+	cmdOpts.addFlags(cmd)
+
+	// Set the input/output streams for the command.
+	io.SetIOStreams(cmd, cmdOpts.IOStreams)
+
+	return cmd
+}
+
+// addFlags adds the flags for the get project config options to the provided
+// command.
+func (o *getProjectConfigOptions) addFlags(cmd *cobra.Command) {
+	o.ClientOptions.AddFlags(cmd.PersistentFlags())
+	o.PrintFlags.AddFlags(cmd)
+}
+
+// complete sets the options from the command arguments.
+func (o *getProjectConfigOptions) complete(args []string) {
+	o.Project = o.Config.Project
+	if len(args) > 0 {
+		o.Project = args[0]
+	}
+}
+
+// run gets the project config from the server and prints it to the console.
+func (o *getProjectConfigOptions) run(ctx context.Context) error {
+	kargoSvcCli, err := client.GetClientFromConfig(ctx, o.Config, o.ClientOptions)
+	if err != nil {
+		return fmt.Errorf("get client from config: %w", err)
+	}
+
+	res := make([]*kargoapi.ProjectConfig, 0, 1)
+	resp, err := kargoSvcCli.GetProjectConfig(
+		ctx,
+		connect.NewRequest(
+			&v1alpha1.GetProjectConfigRequest{
+				Name: o.Project,
+			},
+		),
+	)
+	if err != nil {
+		return fmt.Errorf("get project configuration: %w", err)
+	}
+	if resp.Msg.GetProjectConfig() != nil {
+		res = append(res, resp.Msg.GetProjectConfig())
+	}
+
+	if err = printObjects(res, o.PrintFlags, o.IOStreams, o.NoHeaders); err != nil {
+		return fmt.Errorf("print project configuration: %w", err)
+	}
+	return nil
+}
+
+func newProjectConfigTable(list *metav1.List) *metav1.Table {
+	rows := make([]metav1.TableRow, len(list.Items))
+	for i, item := range list.Items {
+		cfg := item.Object.(*kargoapi.ProjectConfig) // nolint: forcetypeassert
+
+		rows[i] = metav1.TableRow{
+			Cells: []any{
+				cfg.Name,
+				duration.HumanDuration(time.Since(cfg.CreationTimestamp.Time)),
+			},
+			Object: list.Items[i],
+		}
+	}
+	return &metav1.Table{
+		ColumnDefinitions: []metav1.TableColumnDefinition{
+			{Name: "Name", Type: "string"},
+			{Name: "Age", Type: "string"},
+		},
+		Rows: rows,
+	}
+}
diff --git a/internal/controller/git/work_tree.go b/internal/controller/git/work_tree.go
index d8b1aa4d..6d1dce89 100644
--- a/internal/controller/git/work_tree.go
+++ b/internal/controller/git/work_tree.go
@@ -250,7 +250,7 @@ func (w *workTree) Commit(message string, opts *CommitOptions) error {
 
 func (w *workTree) CommitMessage(id string) (string, error) {
 	msgBytes, err := libExec.Exec(
-		w.buildGitCommand("log", "-n", "1", "--pretty=format:%s", id),
+		w.buildGitCommand("log", "-n", "1", "--pretty=format:%B", id),
 	)
 	if err != nil {
 		return "", fmt.Errorf("error obtaining commit message for commit %q: %w", id, err)
diff --git a/internal/expressions/json_templates.go b/internal/expressions/json_templates.go
index 8e639be4..823b9be3 100644
--- a/internal/expressions/json_templates.go
+++ b/internal/expressions/json_templates.go
@@ -108,22 +108,21 @@ func EvaluateTemplate(template string, env map[string]any, exprOpts ...expr.Opti
 		return template, nil
 	}
 	if exprOpts == nil {
-		exprOpts = make([]expr.Option, 0, 1)
+		exprOpts = make([]expr.Option, 0, 2)
 	}
-	exprOpts = append(exprOpts, expr.Function(
-		"quote",
-		func(a ...any) (any, error) {
-			if str, ok := a[0].(string); ok {
-				return fmt.Sprintf("%q", str), nil
-			}
-			jsonBytes, err := json.Marshal(a[0])
-			if err != nil {
-				return nil, fmt.Errorf("error applying quote() function: %w", err)
-			}
-			return fmt.Sprintf(`"%s"`, jsonBytes), nil
-		},
-		new(func(any) string),
-	))
+	exprOpts = append(
+		exprOpts,
+		expr.Function(
+			"quote",
+			quoteFunc,
+			new(func(any) string),
+		),
+		expr.Function(
+			"unsafeQuote",
+			unsafeQuoteFunc,
+			new(func(any) string),
+		),
+	)
 	t, err := fasttemplate.NewTemplate(template, "${{", "}}")
 	if err != nil {
 		return nil, fmt.Errorf("error parsing template: %w", err)
@@ -209,3 +208,24 @@ func getExpressionEvaluator(env map[string]any, exprOpts ...expr.Option) fasttem
 		return out.Write(resJSON)
 	}
 }
+
+// quoteFunc formats a value as a quoted string, with special handling for
+// string inputs. For string inputs, it produces a clean string without visible
+// quotation marks. For non-string inputs, it delegates to unsafeQuoteFunc.
+func quoteFunc(a ...any) (any, error) {
+	if str, ok := a[0].(string); ok {
+		return fmt.Sprintf("%q", str), nil
+	}
+	return unsafeQuoteFunc(a...)
+}
+
+// unsafeQuoteFunc converts any value to JSON and preserves the escape sequences.
+// Unlike quoteFunc, this function retains the literal escape sequences in the
+// output, producing a string with visible escaped quotation marks.
+func unsafeQuoteFunc(a ...any) (any, error) {
+	jsonBytes, err := json.Marshal(a[0])
+	if err != nil {
+		return nil, fmt.Errorf("error applying quote() function: %w", err)
+	}
+	return fmt.Sprintf(`"%s"`, jsonBytes), nil
+}
diff --git a/internal/image/selector.go b/internal/image/selector.go
index 34d2c8fd..6e8718cf 100644
--- a/internal/image/selector.go
+++ b/internal/image/selector.go
@@ -18,7 +18,7 @@ const (
 	// tag.
 	SelectionStrategyDigest SelectionStrategy = "Digest"
 	// SelectionStrategyLexical represents an image selection strategy that is
-	// useful for finding the the image referenced by the tag that is lexically
+	// useful for finding the image referenced by the tag that is lexically
 	// last among those matched by a regular expression and not explicitly
 	// ignored. This strategy is useful for finding the images referenced by the
 	// latest in a series of tag that are suffixed with a predictably formatted
diff --git a/internal/promotion/runner/builtin/git_pr_opener.go b/internal/promotion/runner/builtin/git_pr_opener.go
index 90901d29..ccd645c4 100644
--- a/internal/promotion/runner/builtin/git_pr_opener.go
+++ b/internal/promotion/runner/builtin/git_pr_opener.go
@@ -10,11 +10,12 @@ import (
 	"github.com/xeipuuv/gojsonschema"
 
 	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+	"github.com/akuity/kargo/pkg/promotion"
+	"github.com/akuity/kargo/pkg/x/promotion/runner/builtin"
+
 	"github.com/akuity/kargo/internal/controller/git"
 	"github.com/akuity/kargo/internal/credentials"
 	"github.com/akuity/kargo/internal/gitprovider"
-	"github.com/akuity/kargo/pkg/promotion"
-	"github.com/akuity/kargo/pkg/x/promotion/runner/builtin"
 
 	_ "github.com/akuity/kargo/internal/gitprovider/azure"     // Azure provider registration
 	_ "github.com/akuity/kargo/internal/gitprovider/bitbucket" // Bitbucket provider registration
@@ -183,13 +184,27 @@ func (g *gitPROpener) run(
 		)
 	}
 
-	var title string
-	if cfg.Title != "" {
-		title = cfg.Title
-	} else {
-		title = strings.Split(commitMsg, "\n")[0]
-	}
+	title := cfg.Title
 	description := commitMsg
+
+	if cfg.Description != "" {
+		description = cfg.Description
+	}
+
+	if title == "" {
+		parts := strings.SplitN(commitMsg, "\n", 2)
+		title = parts[0]
+
+		// Only override the description if it has not been set in the config.
+		if cfg.Description == "" {
+			if len(parts) > 1 {
+				description = parts[1]
+			} else {
+				description = "" // The commit message is just a title.
+			}
+		}
+	}
+
 	if stepCtx.UIBaseURL != "" {
 		description = fmt.Sprintf(
 			"%s\n\n[View in Kargo UI](%s/project/%s/stage/%s)",
diff --git a/internal/promotion/runner/builtin/helm_chart_updater.go b/internal/promotion/runner/builtin/helm_chart_updater.go
index 7aad0d99..87935ceb 100644
--- a/internal/promotion/runner/builtin/helm_chart_updater.go
+++ b/internal/promotion/runner/builtin/helm_chart_updater.go
@@ -102,7 +102,7 @@ func (h *helmChartUpdater) run(
 		return promotion.StepResult{Status: kargoapi.PromotionStepStatusErrored}, err
 	}
 
-	if err = intyaml.SetStringsInFile(chartFilePath, changes); err != nil {
+	if err = intyaml.SetValuesInFile(chartFilePath, changes); err != nil {
 		return promotion.StepResult{
 			Status: kargoapi.PromotionStepStatusErrored,
 		}, fmt.Errorf("failed to update chart dependencies in %q: %w", chartFilePath, err)
diff --git a/internal/promotion/runner/builtin/http_requester.go b/internal/promotion/runner/builtin/http_requester.go
index 71183011..0cf8b52b 100644
--- a/internal/promotion/runner/builtin/http_requester.go
+++ b/internal/promotion/runner/builtin/http_requester.go
@@ -195,7 +195,7 @@ func (h *httpRequester) buildExprEnv(
 		if n, err = resp.Body.Read(buf); err != nil && err != io.EOF {
 			return nil, fmt.Errorf("checking for additional content: %w", err)
 		}
-		if n > 0 || err != io.EOF {
+		if n > 0 {
 			return nil, fmt.Errorf("response body exceeds maximum size of %d bytes", maxBytes)
 		}
 	}
diff --git a/internal/promotion/runner/builtin/schemas/git-open-pr-config.json b/internal/promotion/runner/builtin/schemas/git-open-pr-config.json
index 02087e23..93833c20 100644
--- a/internal/promotion/runner/builtin/schemas/git-open-pr-config.json
+++ b/internal/promotion/runner/builtin/schemas/git-open-pr-config.json
@@ -39,6 +39,11 @@
       "description": "The title for the pull request. Kargo generates a title based on the commit messages if it is not explicitly specified.",
       "minLength": 1
     },
+    "description": {
+      "type": "string",
+      "description": "The description of the pull request. Kargo generates a description based on the commit messages if it is not explicitly specified.",
+      "minLength": 1
+    },
     "labels": {
       "type": "array",
       "description": "Labels to add to the pull request.",
diff --git a/internal/promotion/runner/builtin/schemas/yaml-update-config.json b/internal/promotion/runner/builtin/schemas/yaml-update-config.json
index a61fdeb0..ae0c250e 100644
--- a/internal/promotion/runner/builtin/schemas/yaml-update-config.json
+++ b/internal/promotion/runner/builtin/schemas/yaml-update-config.json
@@ -14,7 +14,6 @@
           "minLength": 1
         },
         "value": {
-          "type": "string",
           "description": "The new value for the specified key."
         }
       },
diff --git a/internal/promotion/runner/builtin/yaml_updater.go b/internal/promotion/runner/builtin/yaml_updater.go
index 9950a095..42e5a55d 100644
--- a/internal/promotion/runner/builtin/yaml_updater.go
+++ b/internal/promotion/runner/builtin/yaml_updater.go
@@ -9,6 +9,7 @@ import (
 	"github.com/xeipuuv/gojsonschema"
 
 	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+	"github.com/akuity/kargo/internal/yaml"
 	intyaml "github.com/akuity/kargo/internal/yaml"
 	"github.com/akuity/kargo/pkg/promotion"
 	"github.com/akuity/kargo/pkg/x/promotion/runner/builtin"
@@ -92,7 +93,7 @@ func (y *yamlUpdater) updateFile(workDir string, path string, updates []intyaml.
 	if err != nil {
 		return fmt.Errorf("error joining path %q: %w", path, err)
 	}
-	if err := intyaml.SetStringsInFile(absValuesFile, updates); err != nil {
+	if err := intyaml.SetValuesInFile(absValuesFile, updates); err != nil {
 		return fmt.Errorf("error updating image references in values file %q: %w", path, err)
 	}
 	return nil
@@ -106,7 +107,13 @@ func (y *yamlUpdater) generateCommitMessage(path string, updates []builtin.YAMLU
 	var commitMsg strings.Builder
 	_, _ = commitMsg.WriteString(fmt.Sprintf("Updated %s\n", path))
 	for _, update := range updates {
-		_, _ = commitMsg.WriteString(fmt.Sprintf("\n- %s: %q", update.Key, update.Value))
+		_, _ = commitMsg.WriteString(
+			fmt.Sprintf(
+				"\n- %s: %v",
+				update.Key,
+				yaml.QuoteIfNecessary(update.Value),
+			),
+		)
 	}
 
 	return commitMsg.String()
diff --git a/internal/server/delete_project_config_v1alpha1.go b/internal/server/delete_project_config_v1alpha1.go
new file mode 100644
index 00000000..319873e1
--- /dev/null
+++ b/internal/server/delete_project_config_v1alpha1.go
@@ -0,0 +1,38 @@
+package server
+
+import (
+	"context"
+	"fmt"
+
+	"connectrpc.com/connect"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	svcv1alpha1 "github.com/akuity/kargo/api/service/v1alpha1"
+	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+)
+
+func (s *server) DeleteProjectConfig(
+	ctx context.Context,
+	req *connect.Request[svcv1alpha1.DeleteProjectConfigRequest],
+) (*connect.Response[svcv1alpha1.DeleteProjectConfigResponse], error) {
+	name := req.Msg.GetName()
+	if err := validateFieldNotEmpty("name", name); err != nil {
+		return nil, err
+	}
+
+	if err := s.validateProjectExists(ctx, name); err != nil {
+		return nil, err
+	}
+
+	if err := s.client.Delete(
+		ctx,
+		&kargoapi.ProjectConfig{
+			ObjectMeta: metav1.ObjectMeta{
+				Name: name,
+			},
+		},
+	); err != nil {
+		return nil, fmt.Errorf("delete project config: %w", err)
+	}
+	return connect.NewResponse(&svcv1alpha1.DeleteProjectConfigResponse{}), nil
+}
diff --git a/internal/server/get_project_config_v1alpha1.go b/internal/server/get_project_config_v1alpha1.go
new file mode 100644
index 00000000..a9567668
--- /dev/null
+++ b/internal/server/get_project_config_v1alpha1.go
@@ -0,0 +1,68 @@
+package server
+
+import (
+	"context"
+	"fmt"
+
+	"connectrpc.com/connect"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+	"k8s.io/apimachinery/pkg/runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	svcv1alpha1 "github.com/akuity/kargo/api/service/v1alpha1"
+	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+)
+
+func (s *server) GetProjectConfig(
+	ctx context.Context,
+	req *connect.Request[svcv1alpha1.GetProjectConfigRequest],
+) (*connect.Response[svcv1alpha1.GetProjectConfigResponse], error) {
+	name := req.Msg.GetName()
+	if err := validateFieldNotEmpty("name", name); err != nil {
+		return nil, err
+	}
+
+	// Get the ProjectConfig from the Kubernetes API as an unstructured object.
+	// Using an unstructured object allows us to return the object _as presented
+	// by the API_ if a raw format is requested.
+	u := unstructured.Unstructured{
+		Object: map[string]any{
+			"apiVersion": kargoapi.GroupVersion.String(),
+			"kind":       "ProjectConfig",
+		},
+	}
+	if err := s.client.Get(ctx, client.ObjectKey{Name: name, Namespace: name}, &u); err != nil {
+		if client.IgnoreNotFound(err) == nil {
+			err = fmt.Errorf("ProjectConfig %q not found", name)
+			return nil, connect.NewError(connect.CodeNotFound, err)
+		}
+		return nil, err
+	}
+
+	switch req.Msg.GetFormat() {
+	case svcv1alpha1.RawFormat_RAW_FORMAT_JSON, svcv1alpha1.RawFormat_RAW_FORMAT_YAML:
+		_, raw, err := objectOrRaw(&u, req.Msg.GetFormat())
+		if err != nil {
+			return nil, connect.NewError(connect.CodeInternal, err)
+		}
+		return connect.NewResponse(&svcv1alpha1.GetProjectConfigResponse{
+			Result: &svcv1alpha1.GetProjectConfigResponse_Raw{
+				Raw: raw,
+			},
+		}), nil
+	default:
+		p := kargoapi.ProjectConfig{}
+		if err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, &p); err != nil {
+			return nil, connect.NewError(connect.CodeInternal, err)
+		}
+		obj, _, err := objectOrRaw(&p, req.Msg.GetFormat())
+		if err != nil {
+			return nil, connect.NewError(connect.CodeInternal, err)
+		}
+		return connect.NewResponse(&svcv1alpha1.GetProjectConfigResponse{
+			Result: &svcv1alpha1.GetProjectConfigResponse_ProjectConfig{
+				ProjectConfig: obj,
+			},
+		}), nil
+	}
+}
diff --git a/internal/server/rbac/policy_rules.go b/internal/server/rbac/policy_rules.go
index 79d69951..6fe00c11 100644
--- a/internal/server/rbac/policy_rules.go
+++ b/internal/server/rbac/policy_rules.go
@@ -180,11 +180,13 @@ func buildRule(
 // nolint: goconst
 func validateResourceTypeName(resource string) error {
 	switch resource {
-	case "analysisruns", "analysistemplates", "events", "freights", "freights/status", "roles",
-		"rolebindings", "promotions", "secrets", "serviceaccounts", "stages", "warehouses":
+	case "analysisruns", "analysistemplates", "events", "freights",
+		"freights/status", "projectconfigs", "promotions", "rolebindings", "roles",
+		"secrets", "serviceaccounts", "stages", "warehouses":
 		return nil
-	case "analysisrun", "analysistemplate", "event", "freight", "role",
-		"rolebinding", "promotion", "secret", "serviceaccount", "stage", "warehouse":
+	case "analysisrun", "analysistemplate", "event", "freight", "projectconfig",
+		"promotion", "role", "rolebinding", "secret", "serviceaccount", "stage",
+		"warehouse":
 		return kubeerr.NewBadRequest(
 			fmt.Sprintf(`unrecognized resource type %q; did you mean "%ss"?`, resource, resource),
 		)
diff --git a/internal/yaml/quote.go b/internal/yaml/quote.go
new file mode 100644
index 00000000..b1bccdc2
--- /dev/null
+++ b/internal/yaml/quote.go
@@ -0,0 +1,37 @@
+package yaml
+
+import (
+	"encoding/json"
+	"fmt"
+	"strconv"
+)
+
+// QuoteIfNecessary takes a value and returns it as-is if it is not a string. If
+// it is a string, it ascertains whether a YAML parser would interpret it as
+// another type. If so, it returns the string with additional quotes around it.
+// If not, it returns the string as-is.
+func QuoteIfNecessary(val any) any {
+	valStr, ok := val.(string)
+	if !ok {
+		return val
+	}
+	// If valStr is parseable as a float64, return that. float64 is used because
+	// it can represent all JSON numbers.
+	//
+	// NB: This is attempted prior to attempting to parse valStr as a boolean so
+	// that "0" and "1" will be interpreted as numbers.
+	if _, err := strconv.ParseFloat(valStr, 64); err == nil {
+		return fmt.Sprintf("%q", valStr)
+	}
+	// If valStr is parseable as a bool return that.
+	if _, err := strconv.ParseBool(valStr); err == nil {
+		return fmt.Sprintf("%q", valStr)
+	}
+	// If valStr is valid JSON, return its unmarshaled value. This could be an
+	// object, array, or null.
+	if json.Valid([]byte(valStr)) {
+		return fmt.Sprintf("%q", valStr)
+	}
+	// If we get to here, just return the string.
+	return val
+}
diff --git a/internal/yaml/yaml.go b/internal/yaml/yaml.go
index 488cf484..175b095b 100644
--- a/internal/yaml/yaml.go
+++ b/internal/yaml/yaml.go
@@ -16,16 +16,16 @@ type Update struct {
 	// Key is the dot-separated path to the field to update.
 	Key string
 	// Value is the new value to set for the field.
-	Value string
+	Value any
 }
 
-// SetStringsInFile overwrites the specified file with the changes specified by
+// SetValuesInFile overwrites the specified file with the changes specified by
 // the the list of Updates. Keys are of the form <key 0>.<key 1>...<key n>.
 // Integers may be used as keys in cases where a specific node needs to be
 // selected from a sequence. An error is returned for any attempted update to a
 // key that does not exist or does not address a scalar node. Importantly, all
 // comments and style choices in the input bytes are preserved in the output.
-func SetStringsInFile(file string, updates []Update) error {
+func SetValuesInFile(file string, updates []Update) error {
 	inBytes, err := os.ReadFile(file)
 	if err != nil {
 		return fmt.Errorf(
@@ -34,7 +34,7 @@ func SetStringsInFile(file string, updates []Update) error {
 			err,
 		)
 	}
-	outBytes, err := SetStringsInBytes(inBytes, updates)
+	outBytes, err := SetValuesInBytes(inBytes, updates)
 	if err != nil {
 		return fmt.Errorf("error mutating bytes: %w", err)
 	}
@@ -53,13 +53,13 @@ func SetStringsInFile(file string, updates []Update) error {
 	return nil
 }
 
-// SetStringsInBytes returns a copy of the provided bytes with the changes
+// SetValuesInBytes returns a copy of the provided bytes with the changes
 // specified by Updates applied. Keys are of the form <key 0>.<key 1>...<key n>.
 // Integers may be used as keys in cases where a specific node needs to be
 // selected from a sequence. An error is returned for any attempted update to a
 // key that does not exist or does not address a scalar node. Importantly, all
 // comments and style choices in the input bytes are preserved in the output.
-func SetStringsInBytes(inBytes []byte, updates []Update) ([]byte, error) {
+func SetValuesInBytes(inBytes []byte, updates []Update) ([]byte, error) {
 	doc := &yaml.Node{}
 	if err := yaml.Unmarshal(inBytes, doc); err != nil {
 		return nil, fmt.Errorf("error unmarshaling input: %w", err)
@@ -67,7 +67,7 @@ func SetStringsInBytes(inBytes []byte, updates []Update) ([]byte, error) {
 
 	type change struct {
 		col   int
-		value string
+		value any
 	}
 	changesByLine := map[int]change{}
 	for _, update := range updates {
@@ -107,7 +107,9 @@ func SetStringsInBytes(inBytes []byte, updates []Update) ([]byte, error) {
 					return nil, fmt.Errorf("%s: %w", errMsg, err)
 				}
 			}
-			if _, err := outBuf.WriteString(change.value); err != nil {
+			if _, err := outBuf.WriteString(
+				fmt.Sprintf("%v", QuoteIfNecessary(change.value)),
+			); err != nil {
 				return nil, fmt.Errorf("%s: %w", errMsg, err)
 			}
 			if _, err := outBuf.WriteString("\n"); err != nil {
diff --git a/pkg/go.mod b/pkg/go.mod
index 4c492c04..30b61179 100644
--- a/pkg/go.mod
+++ b/pkg/go.mod
@@ -7,7 +7,7 @@ replace github.com/akuity/kargo/api => ../api
 require (
 	github.com/akuity/kargo/api v0.0.0
 	github.com/stretchr/testify v1.10.0
-	k8s.io/apimachinery v0.32.3
+	k8s.io/apimachinery v0.33.0
 )
 
 require (
@@ -15,7 +15,6 @@ require (
 	github.com/fxamacker/cbor/v2 v2.7.0 // indirect
 	github.com/go-logr/logr v1.4.2 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
-	github.com/google/gofuzz v1.2.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
@@ -25,10 +24,11 @@ require (
 	golang.org/x/text v0.23.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/apiextensions-apiserver v0.32.3 // indirect
+	k8s.io/apiextensions-apiserver v0.33.0 // indirect
 	k8s.io/klog/v2 v2.130.1 // indirect
-	k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
+	k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979 // indirect
 	sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
+	sigs.k8s.io/randfill v1.0.0 // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
 	sigs.k8s.io/yaml v1.4.0 // indirect
 )
diff --git a/pkg/go.sum b/pkg/go.sum
index f7fe1351..86e15723 100644
--- a/pkg/go.sum
+++ b/pkg/go.sum
@@ -12,8 +12,6 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
@@ -71,17 +69,20 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY=
-k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss=
-k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U=
-k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/apiextensions-apiserver v0.33.0 h1:d2qpYL7Mngbsc1taA4IjJPRJ9ilnsXIrndH+r9IimOs=
+k8s.io/apiextensions-apiserver v0.33.0/go.mod h1:VeJ8u9dEEN+tbETo+lFkwaaZPg6uFKLGj5vyNEwwSzc=
+k8s.io/apimachinery v0.33.0 h1:1a6kHrJxb2hs4t8EE5wuR/WxKDwGN1FKH3JvDtA0CIQ=
+k8s.io/apimachinery v0.33.0/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
-k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979 h1:jgJW5IePPXLGB8e/1wvd0Ich9QE97RvvF3a8J3fP/Lg=
+k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
 sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
-sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk=
-sigs.k8s.io/structured-merge-diff/v4 v4.5.0/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
+sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
+sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
+sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
+sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
+sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
 sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
diff --git a/pkg/x/promotion/runner/builtin/zz_config_types.go b/pkg/x/promotion/runner/builtin/zz_config_types.go
index 3df28bd6..9331046b 100644
--- a/pkg/x/promotion/runner/builtin/zz_config_types.go
+++ b/pkg/x/promotion/runner/builtin/zz_config_types.go
@@ -174,6 +174,9 @@ type GitOpenPRConfig struct {
 	// Indicates whether a new, empty orphan branch should be created and pushed to the remote
 	// if the target branch does not already exist there. Default is false.
 	CreateTargetBranch bool `json:"createTargetBranch,omitempty"`
+	// The description of the pull request. Kargo generates a description based on the commit
+	// messages if it is not explicitly specified.
+	Description string `json:"description,omitempty"`
 	// Indicates whether to skip TLS verification when cloning the repository. Default is false.
 	InsecureSkipTLSVerify bool `json:"insecureSkipTLSVerify,omitempty"`
 	// Labels to add to the pull request.
@@ -432,7 +435,7 @@ type YAMLUpdate struct {
 	// The key whose value needs to be updated. For nested values, use a YAML dot notation path.
 	Key string `json:"key"`
 	// The new value for the specified key.
-	Value string `json:"value"`
+	Value interface{} `json:"value"`
 }
 
 // The name of the Git provider to use. Currently 'azure', 'bitbucket', 'gitea', 'github',
diff --git a/ui/package.json b/ui/package.json
index 30513e6f..14a3038c 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -17,39 +17,39 @@
     "@apidevtools/json-schema-ref-parser": "^11.9.3",
     "@eslint/compat": "^1.2.8",
     "@eslint/eslintrc": "^3.3.0",
-    "@eslint/js": "^9.22.0",
+    "@eslint/js": "^9.26.0",
     "@openapi-contrib/openapi-schema-to-json-schema": "^5.1.0",
-    "@tanstack/react-query-devtools": "^5.71.0",
-    "@types/git-url-parse": "^9.0.3",
+    "@tanstack/react-query-devtools": "^5.75.7",
+    "@types/git-url-parse": "^16.0.0",
     "@types/json-schema": "^7.0.15",
-    "@types/node": "^22.13.14",
-    "@types/react": "^19.0.12",
-    "@types/react-dom": "^19.0.4",
+    "@types/node": "^22.15.17",
+    "@types/react": "^19.1.3",
+    "@types/react-dom": "^19.1.3",
     "@types/react-infinite-scroller": "^1.2.5",
     "@types/semver": "^7.7.0",
-    "@typescript-eslint/eslint-plugin": "^8.28.0",
-    "@typescript-eslint/parser": "^8.28.0",
-    "@vitejs/plugin-react": "^4.3.4",
+    "@typescript-eslint/eslint-plugin": "^8.32.0",
+    "@typescript-eslint/parser": "^8.32.0",
+    "@vitejs/plugin-react": "^4.4.1",
     "autoprefixer": "^10.4.21",
     "cssnano": "^7.0.6",
-    "eslint": "^9.23.0",
+    "eslint": "^9.26.0",
     "eslint-config-prettier": "^10.1.2",
     "eslint-plugin-import": "^2.31.0",
-    "eslint-plugin-prettier": "^5.2.6",
+    "eslint-plugin-prettier": "^5.4.0",
     "eslint-plugin-react": "^7.37.5",
     "eslint-plugin-react-refresh": "^0.4.20",
-    "globals": "^16.0.0",
-    "json-stable-stringify": "^1.1.1",
-    "less": "^4.2.2",
+    "globals": "^16.1.0",
+    "json-stable-stringify": "^1.3.0",
+    "less": "^4.3.0",
     "postcss": "^8.5.3",
     "prettier": "^3.5.3",
     "tailwindcss": "^3.4.17",
     "typescript": "^5.8.3",
-    "vite": "^6.2.7",
+    "vite": "^6.3.5",
     "vite-plugin-compression": "^0.5.1",
     "vite-tsconfig-paths": "^5.1.4",
-    "vitest": "^3.0.9",
-    "zx": "^8.4.1"
+    "vitest": "^3.1.3",
+    "zx": "^8.5.4"
   },
   "packageManager": "pnpm@9.0.3",
   "dependencies": {
@@ -69,21 +69,21 @@
     "@rjsf/core": "^5.24.9",
     "@rjsf/utils": "^5.24.9",
     "@rjsf/validator-ajv8": "^5.24.9",
-    "@tanstack/react-query": "^5.71.0",
+    "@tanstack/react-query": "^5.75.7",
     "@types/dagre": "^0.7.52",
-    "@xyflow/react": "^12.5.1",
-    "antd": "^5.24.8",
+    "@xyflow/react": "^12.6.0",
+    "antd": "^5.25.1",
     "classnames": "^2.5.1",
     "date-fns": "^4.1.0",
-    "git-url-parse": "^16.0.1",
+    "git-url-parse": "^16.1.0",
     "moment": "^2.30.1",
     "monaco-editor": "^0.52.2",
-    "monaco-yaml": "^5.3.1",
-    "oauth4webapi": "^3.3.2",
+    "monaco-yaml": "^5.4.0",
+    "oauth4webapi": "^3.5.1",
     "react": "^19.1.0",
     "react-dom": "^19.1.0",
-    "react-hook-form": "^7.55.0",
-    "react-router-dom": "^7.4.1",
+    "react-hook-form": "^7.56.3",
+    "react-router-dom": "^7.6.0",
     "recharts": "^2.15.3",
     "semver": "^7.7.1",
     "vite-plugin-monaco-editor": "^1.1.0",
diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml
index 4a901dee..90f80e9c 100644
--- a/ui/pnpm-lock.yaml
+++ b/ui/pnpm-lock.yaml
@@ -10,7 +10,7 @@ importers:
     dependencies:
       '@ant-design/v5-patch-for-react-19':
         specifier: ^1.0.3
-        version: 1.0.3(antd@5.24.8(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+        version: 1.0.3(antd@5.25.1(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       '@bufbuild/protobuf':
         specifier: ^2.2.2
         version: 2.2.3
@@ -19,7 +19,7 @@ importers:
         version: 2.0.2(@bufbuild/protobuf@2.2.3)
       '@connectrpc/connect-query':
         specifier: 2.0.1
-        version: 2.0.1(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.2.3))(@tanstack/query-core@5.71.0)(@tanstack/react-query@5.71.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+        version: 2.0.1(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.2.3))(@tanstack/query-core@5.75.7)(@tanstack/react-query@5.75.7(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       '@connectrpc/connect-web':
         specifier: 2.0.2
         version: 2.0.2(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.2.3))
@@ -40,13 +40,13 @@ importers:
         version: 0.2.2(@fortawesome/fontawesome-svg-core@6.7.2)(react@19.1.0)
       '@hookform/resolvers':
         specifier: ^4.1.3
-        version: 4.1.3(react-hook-form@7.55.0(react@19.1.0))
+        version: 4.1.3(react-hook-form@7.56.3(react@19.1.0))
       '@monaco-editor/react':
         specifier: ^4.7.0
         version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       '@rjsf/antd':
         specifier: ^5.24.9
-        version: 5.24.9(@ant-design/icons@5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@rjsf/core@5.24.9(@rjsf/utils@5.24.9(react@19.1.0))(react@19.1.0))(@rjsf/utils@5.24.9(react@19.1.0))(antd@5.24.8(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+        version: 5.24.9(@ant-design/icons@5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@rjsf/core@5.24.9(@rjsf/utils@5.24.9(react@19.1.0))(react@19.1.0))(@rjsf/utils@5.24.9(react@19.1.0))(antd@5.25.1(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       '@rjsf/core':
         specifier: ^5.24.9
         version: 5.24.9(@rjsf/utils@5.24.9(react@19.1.0))(react@19.1.0)
@@ -57,17 +57,17 @@ importers:
         specifier: ^5.24.9
         version: 5.24.9(@rjsf/utils@5.24.9(react@19.1.0))
       '@tanstack/react-query':
-        specifier: ^5.71.0
-        version: 5.71.0(react@19.1.0)
+        specifier: ^5.75.7
+        version: 5.75.7(react@19.1.0)
       '@types/dagre':
         specifier: ^0.7.52
         version: 0.7.52
       '@xyflow/react':
-        specifier: ^12.5.1
-        version: 12.5.1(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+        specifier: ^12.6.0
+        version: 12.6.0(@types/react@19.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       antd:
-        specifier: ^5.24.8
-        version: 5.24.8(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+        specifier: ^5.25.1
+        version: 5.25.1(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames:
         specifier: ^2.5.1
         version: 2.5.1
@@ -75,8 +75,8 @@ importers:
         specifier: ^4.1.0
         version: 4.1.0
       git-url-parse:
-        specifier: ^16.0.1
-        version: 16.0.1
+        specifier: ^16.1.0
+        version: 16.1.0
       moment:
         specifier: ^2.30.1
         version: 2.30.1
@@ -84,11 +84,11 @@ importers:
         specifier: ^0.52.2
         version: 0.52.2
       monaco-yaml:
-        specifier: ^5.3.1
-        version: 5.3.1(monaco-editor@0.52.2)
+        specifier: ^5.4.0
+        version: 5.4.0(monaco-editor@0.52.2)
       oauth4webapi:
-        specifier: ^3.3.2
-        version: 3.3.2
+        specifier: ^3.5.1
+        version: 3.5.1
       react:
         specifier: ^19.1.0
         version: 19.1.0
@@ -96,11 +96,11 @@ importers:
         specifier: ^19.1.0
         version: 19.1.0(react@19.1.0)
       react-hook-form:
-        specifier: ^7.55.0
-        version: 7.55.0(react@19.1.0)
+        specifier: ^7.56.3
+        version: 7.56.3(react@19.1.0)
       react-router-dom:
-        specifier: ^7.4.1
-        version: 7.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+        specifier: ^7.6.0
+        version: 7.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       recharts:
         specifier: ^2.15.3
         version: 2.15.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -122,34 +122,34 @@ importers:
         version: 11.9.3
       '@eslint/compat':
         specifier: ^1.2.8
-        version: 1.2.8(eslint@9.23.0(jiti@1.21.7))
+        version: 1.2.8(eslint@9.26.0(jiti@1.21.7))
       '@eslint/eslintrc':
         specifier: ^3.3.0
         version: 3.3.1
       '@eslint/js':
-        specifier: ^9.22.0
-        version: 9.23.0
+        specifier: ^9.26.0
+        version: 9.26.0
       '@openapi-contrib/openapi-schema-to-json-schema':
         specifier: ^5.1.0
         version: 5.1.0
       '@tanstack/react-query-devtools':
-        specifier: ^5.71.0
-        version: 5.71.0(@tanstack/react-query@5.71.0(react@19.1.0))(react@19.1.0)
+        specifier: ^5.75.7
+        version: 5.75.7(@tanstack/react-query@5.75.7(react@19.1.0))(react@19.1.0)
       '@types/git-url-parse':
-        specifier: ^9.0.3
-        version: 9.0.3
+        specifier: ^16.0.0
+        version: 16.0.0
       '@types/json-schema':
         specifier: ^7.0.15
         version: 7.0.15
       '@types/node':
-        specifier: ^22.13.14
-        version: 22.13.14
+        specifier: ^22.15.17
+        version: 22.15.17
       '@types/react':
-        specifier: ^19.0.12
-        version: 19.0.12
+        specifier: ^19.1.3
+        version: 19.1.3
       '@types/react-dom':
-        specifier: ^19.0.4
-        version: 19.0.4(@types/react@19.0.12)
+        specifier: ^19.1.3
+        version: 19.1.3(@types/react@19.1.3)
       '@types/react-infinite-scroller':
         specifier: ^1.2.5
         version: 1.2.5
@@ -157,14 +157,14 @@ importers:
         specifier: ^7.7.0
         version: 7.7.0
       '@typescript-eslint/eslint-plugin':
-        specifier: ^8.28.0
-        version: 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)
+        specifier: ^8.32.0
+        version: 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       '@typescript-eslint/parser':
-        specifier: ^8.28.0
-        version: 8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)
+        specifier: ^8.32.0
+        version: 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       '@vitejs/plugin-react':
-        specifier: ^4.3.4
-        version: 4.3.4(vite@6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1))
+        specifier: ^4.4.1
+        version: 4.4.1(vite@6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1))
       autoprefixer:
         specifier: ^10.4.21
         version: 10.4.21(postcss@8.5.3)
@@ -172,32 +172,32 @@ importers:
         specifier: ^7.0.6
         version: 7.0.6(postcss@8.5.3)
       eslint:
-        specifier: ^9.23.0
-        version: 9.23.0(jiti@1.21.7)
+        specifier: ^9.26.0
+        version: 9.26.0(jiti@1.21.7)
       eslint-config-prettier:
         specifier: ^10.1.2
-        version: 10.1.2(eslint@9.23.0(jiti@1.21.7))
+        version: 10.1.2(eslint@9.26.0(jiti@1.21.7))
       eslint-plugin-import:
         specifier: ^2.31.0
-        version: 2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.23.0(jiti@1.21.7))
+        version: 2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))
       eslint-plugin-prettier:
-        specifier: ^5.2.6
-        version: 5.2.6(eslint-config-prettier@10.1.2(eslint@9.23.0(jiti@1.21.7)))(eslint@9.23.0(jiti@1.21.7))(prettier@3.5.3)
+        specifier: ^5.4.0
+        version: 5.4.0(eslint-config-prettier@10.1.2(eslint@9.26.0(jiti@1.21.7)))(eslint@9.26.0(jiti@1.21.7))(prettier@3.5.3)
       eslint-plugin-react:
         specifier: ^7.37.5
-        version: 7.37.5(eslint@9.23.0(jiti@1.21.7))
+        version: 7.37.5(eslint@9.26.0(jiti@1.21.7))
       eslint-plugin-react-refresh:
         specifier: ^0.4.20
-        version: 0.4.20(eslint@9.23.0(jiti@1.21.7))
+        version: 0.4.20(eslint@9.26.0(jiti@1.21.7))
       globals:
-        specifier: ^16.0.0
-        version: 16.0.0
+        specifier: ^16.1.0
+        version: 16.1.0
       json-stable-stringify:
-        specifier: ^1.1.1
-        version: 1.2.1
+        specifier: ^1.3.0
+        version: 1.3.0
       less:
-        specifier: ^4.2.2
-        version: 4.2.2
+        specifier: ^4.3.0
+        version: 4.3.0
       postcss:
         specifier: ^8.5.3
         version: 8.5.3
@@ -211,20 +211,20 @@ importers:
         specifier: ^5.8.3
         version: 5.8.3
       vite:
-        specifier: ^6.2.7
-        version: 6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)
+        specifier: ^6.3.5
+        version: 6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)
       vite-plugin-compression:
         specifier: ^0.5.1
-        version: 0.5.1(vite@6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1))
+        version: 0.5.1(vite@6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1))
       vite-tsconfig-paths:
         specifier: ^5.1.4
-        version: 5.1.4(typescript@5.8.3)(vite@6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1))
+        version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1))
       vitest:
-        specifier: ^3.0.9
-        version: 3.0.9(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)
+        specifier: ^3.1.3
+        version: 3.1.3(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)
       zx:
-        specifier: ^8.4.1
-        version: 8.4.1
+        specifier: ^8.5.4
+        version: 8.5.4
 
 packages:
 
@@ -282,87 +282,87 @@ packages:
     resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==}
     engines: {node: '>= 16'}
 
-  '@babel/code-frame@7.26.2':
-    resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+  '@babel/code-frame@7.27.1':
+    resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/compat-data@7.26.3':
-    resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==}
+  '@babel/compat-data@7.27.2':
+    resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/core@7.26.0':
-    resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
+  '@babel/core@7.27.1':
+    resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/generator@7.26.3':
-    resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==}
+  '@babel/generator@7.27.1':
+    resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-compilation-targets@7.25.9':
-    resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
+  '@babel/helper-compilation-targets@7.27.2':
+    resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-module-imports@7.25.9':
-    resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+  '@babel/helper-module-imports@7.27.1':
+    resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-module-transforms@7.26.0':
-    resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+  '@babel/helper-module-transforms@7.27.1':
+    resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/helper-plugin-utils@7.25.9':
-    resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
+  '@babel/helper-plugin-utils@7.27.1':
+    resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-string-parser@7.25.9':
-    resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+  '@babel/helper-string-parser@7.27.1':
+    resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-validator-identifier@7.25.9':
-    resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+  '@babel/helper-validator-identifier@7.27.1':
+    resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-validator-option@7.25.9':
-    resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+  '@babel/helper-validator-option@7.27.1':
+    resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helpers@7.26.0':
-    resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
+  '@babel/helpers@7.27.1':
+    resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/parser@7.26.3':
-    resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==}
+  '@babel/parser@7.27.2':
+    resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==}
     engines: {node: '>=6.0.0'}
     hasBin: true
 
-  '@babel/plugin-transform-react-jsx-self@7.25.9':
-    resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==}
+  '@babel/plugin-transform-react-jsx-self@7.27.1':
+    resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-transform-react-jsx-source@7.25.9':
-    resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==}
+  '@babel/plugin-transform-react-jsx-source@7.27.1':
+    resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/runtime@7.27.0':
-    resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==}
+  '@babel/runtime@7.27.1':
+    resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/template@7.25.9':
-    resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
+  '@babel/template@7.27.2':
+    resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/traverse@7.26.4':
-    resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==}
+  '@babel/traverse@7.27.1':
+    resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/types@7.26.3':
-    resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
+  '@babel/types@7.27.1':
+    resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==}
     engines: {node: '>=6.9.0'}
 
   '@bufbuild/protobuf@2.2.3':
@@ -408,158 +408,158 @@ packages:
   '@emotion/unitless@0.7.5':
     resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==}
 
-  '@esbuild/aix-ppc64@0.25.3':
-    resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==}
+  '@esbuild/aix-ppc64@0.25.4':
+    resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==}
     engines: {node: '>=18'}
     cpu: [ppc64]
     os: [aix]
 
-  '@esbuild/android-arm64@0.25.3':
-    resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==}
+  '@esbuild/android-arm64@0.25.4':
+    resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [android]
 
-  '@esbuild/android-arm@0.25.3':
-    resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==}
+  '@esbuild/android-arm@0.25.4':
+    resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==}
     engines: {node: '>=18'}
     cpu: [arm]
     os: [android]
 
-  '@esbuild/android-x64@0.25.3':
-    resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==}
+  '@esbuild/android-x64@0.25.4':
+    resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [android]
 
-  '@esbuild/darwin-arm64@0.25.3':
-    resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==}
+  '@esbuild/darwin-arm64@0.25.4':
+    resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [darwin]
 
-  '@esbuild/darwin-x64@0.25.3':
-    resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==}
+  '@esbuild/darwin-x64@0.25.4':
+    resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [darwin]
 
-  '@esbuild/freebsd-arm64@0.25.3':
-    resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==}
+  '@esbuild/freebsd-arm64@0.25.4':
+    resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [freebsd]
 
-  '@esbuild/freebsd-x64@0.25.3':
-    resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==}
+  '@esbuild/freebsd-x64@0.25.4':
+    resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [freebsd]
 
-  '@esbuild/linux-arm64@0.25.3':
-    resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==}
+  '@esbuild/linux-arm64@0.25.4':
+    resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [linux]
 
-  '@esbuild/linux-arm@0.25.3':
-    resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==}
+  '@esbuild/linux-arm@0.25.4':
+    resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==}
     engines: {node: '>=18'}
     cpu: [arm]
     os: [linux]
 
-  '@esbuild/linux-ia32@0.25.3':
-    resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==}
+  '@esbuild/linux-ia32@0.25.4':
+    resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==}
     engines: {node: '>=18'}
     cpu: [ia32]
     os: [linux]
 
-  '@esbuild/linux-loong64@0.25.3':
-    resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==}
+  '@esbuild/linux-loong64@0.25.4':
+    resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==}
     engines: {node: '>=18'}
     cpu: [loong64]
     os: [linux]
 
-  '@esbuild/linux-mips64el@0.25.3':
-    resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==}
+  '@esbuild/linux-mips64el@0.25.4':
+    resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==}
     engines: {node: '>=18'}
     cpu: [mips64el]
     os: [linux]
 
-  '@esbuild/linux-ppc64@0.25.3':
-    resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==}
+  '@esbuild/linux-ppc64@0.25.4':
+    resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==}
     engines: {node: '>=18'}
     cpu: [ppc64]
     os: [linux]
 
-  '@esbuild/linux-riscv64@0.25.3':
-    resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==}
+  '@esbuild/linux-riscv64@0.25.4':
+    resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==}
     engines: {node: '>=18'}
     cpu: [riscv64]
     os: [linux]
 
-  '@esbuild/linux-s390x@0.25.3':
-    resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==}
+  '@esbuild/linux-s390x@0.25.4':
+    resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==}
     engines: {node: '>=18'}
     cpu: [s390x]
     os: [linux]
 
-  '@esbuild/linux-x64@0.25.3':
-    resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==}
+  '@esbuild/linux-x64@0.25.4':
+    resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [linux]
 
-  '@esbuild/netbsd-arm64@0.25.3':
-    resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==}
+  '@esbuild/netbsd-arm64@0.25.4':
+    resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [netbsd]
 
-  '@esbuild/netbsd-x64@0.25.3':
-    resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==}
+  '@esbuild/netbsd-x64@0.25.4':
+    resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [netbsd]
 
-  '@esbuild/openbsd-arm64@0.25.3':
-    resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==}
+  '@esbuild/openbsd-arm64@0.25.4':
+    resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [openbsd]
 
-  '@esbuild/openbsd-x64@0.25.3':
-    resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==}
+  '@esbuild/openbsd-x64@0.25.4':
+    resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [openbsd]
 
-  '@esbuild/sunos-x64@0.25.3':
-    resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==}
+  '@esbuild/sunos-x64@0.25.4':
+    resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [sunos]
 
-  '@esbuild/win32-arm64@0.25.3':
-    resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==}
+  '@esbuild/win32-arm64@0.25.4':
+    resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==}
     engines: {node: '>=18'}
     cpu: [arm64]
     os: [win32]
 
-  '@esbuild/win32-ia32@0.25.3':
-    resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==}
+  '@esbuild/win32-ia32@0.25.4':
+    resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==}
     engines: {node: '>=18'}
     cpu: [ia32]
     os: [win32]
 
-  '@esbuild/win32-x64@0.25.3':
-    resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==}
+  '@esbuild/win32-x64@0.25.4':
+    resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==}
     engines: {node: '>=18'}
     cpu: [x64]
     os: [win32]
 
-  '@eslint-community/eslint-utils@4.5.1':
-    resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==}
+  '@eslint-community/eslint-utils@4.7.0':
+    resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
@@ -577,32 +577,32 @@ packages:
       eslint:
         optional: true
 
-  '@eslint/config-array@0.19.2':
-    resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==}
+  '@eslint/config-array@0.20.0':
+    resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@eslint/config-helpers@0.2.0':
-    resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==}
+  '@eslint/config-helpers@0.2.2':
+    resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@eslint/core@0.12.0':
-    resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==}
+  '@eslint/core@0.13.0':
+    resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@eslint/eslintrc@3.3.1':
     resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@eslint/js@9.23.0':
-    resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==}
+  '@eslint/js@9.26.0':
+    resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@eslint/object-schema@2.1.6':
     resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@eslint/plugin-kit@0.2.7':
-    resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==}
+  '@eslint/plugin-kit@0.2.8':
+    resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@fastify/busboy@2.1.1':
@@ -652,8 +652,8 @@ packages:
     resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
     engines: {node: '>=18.18'}
 
-  '@humanwhocodes/retry@0.4.2':
-    resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
+  '@humanwhocodes/retry@0.4.3':
+    resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
     engines: {node: '>=18.18'}
 
   '@isaacs/cliui@8.0.2':
@@ -681,6 +681,10 @@ packages:
   '@jsdevtools/ono@7.1.3':
     resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==}
 
+  '@modelcontextprotocol/sdk@1.11.1':
+    resolution: {integrity: sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==}
+    engines: {node: '>=18'}
+
   '@monaco-editor/loader@1.5.0':
     resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==}
 
@@ -801,103 +805,103 @@ packages:
     peerDependencies:
       '@rjsf/utils': ^5.24.x
 
-  '@rollup/rollup-android-arm-eabi@4.40.1':
-    resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==}
+  '@rollup/rollup-android-arm-eabi@4.40.2':
+    resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==}
     cpu: [arm]
     os: [android]
 
-  '@rollup/rollup-android-arm64@4.40.1':
-    resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==}
+  '@rollup/rollup-android-arm64@4.40.2':
+    resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==}
     cpu: [arm64]
     os: [android]
 
-  '@rollup/rollup-darwin-arm64@4.40.1':
-    resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==}
+  '@rollup/rollup-darwin-arm64@4.40.2':
+    resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==}
     cpu: [arm64]
     os: [darwin]
 
-  '@rollup/rollup-darwin-x64@4.40.1':
-    resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==}
+  '@rollup/rollup-darwin-x64@4.40.2':
+    resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==}
     cpu: [x64]
     os: [darwin]
 
-  '@rollup/rollup-freebsd-arm64@4.40.1':
-    resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==}
+  '@rollup/rollup-freebsd-arm64@4.40.2':
+    resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==}
     cpu: [arm64]
     os: [freebsd]
 
-  '@rollup/rollup-freebsd-x64@4.40.1':
-    resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==}
+  '@rollup/rollup-freebsd-x64@4.40.2':
+    resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==}
     cpu: [x64]
     os: [freebsd]
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.40.1':
-    resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==}
+  '@rollup/rollup-linux-arm-gnueabihf@4.40.2':
+    resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm-musleabihf@4.40.1':
-    resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==}
+  '@rollup/rollup-linux-arm-musleabihf@4.40.2':
+    resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-gnu@4.40.1':
-    resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==}
+  '@rollup/rollup-linux-arm64-gnu@4.40.2':
+    resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-musl@4.40.1':
-    resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==}
+  '@rollup/rollup-linux-arm64-musl@4.40.2':
+    resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-loongarch64-gnu@4.40.1':
-    resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==}
+  '@rollup/rollup-linux-loongarch64-gnu@4.40.2':
+    resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==}
     cpu: [loong64]
     os: [linux]
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.40.1':
-    resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==}
+  '@rollup/rollup-linux-powerpc64le-gnu@4.40.2':
+    resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==}
     cpu: [ppc64]
     os: [linux]
 
-  '@rollup/rollup-linux-riscv64-gnu@4.40.1':
-    resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==}
+  '@rollup/rollup-linux-riscv64-gnu@4.40.2':
+    resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==}
     cpu: [riscv64]
     os: [linux]
 
-  '@rollup/rollup-linux-riscv64-musl@4.40.1':
-    resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==}
+  '@rollup/rollup-linux-riscv64-musl@4.40.2':
+    resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==}
     cpu: [riscv64]
     os: [linux]
 
-  '@rollup/rollup-linux-s390x-gnu@4.40.1':
-    resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==}
+  '@rollup/rollup-linux-s390x-gnu@4.40.2':
+    resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==}
     cpu: [s390x]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-gnu@4.40.1':
-    resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==}
+  '@rollup/rollup-linux-x64-gnu@4.40.2':
+    resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-musl@4.40.1':
-    resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==}
+  '@rollup/rollup-linux-x64-musl@4.40.2':
+    resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-win32-arm64-msvc@4.40.1':
-    resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==}
+  '@rollup/rollup-win32-arm64-msvc@4.40.2':
+    resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==}
     cpu: [arm64]
     os: [win32]
 
-  '@rollup/rollup-win32-ia32-msvc@4.40.1':
-    resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==}
+  '@rollup/rollup-win32-ia32-msvc@4.40.2':
+    resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==}
     cpu: [ia32]
     os: [win32]
 
-  '@rollup/rollup-win32-x64-msvc@4.40.1':
-    resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==}
+  '@rollup/rollup-win32-x64-msvc@4.40.2':
+    resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==}
     cpu: [x64]
     os: [win32]
 
@@ -907,20 +911,20 @@ packages:
   '@standard-schema/utils@0.3.0':
     resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
 
-  '@tanstack/query-core@5.71.0':
-    resolution: {integrity: sha512-p4+T7CIEe1kMhii4booWiw42nuaiYI9La/bRCNzBaj1P3PDb0dEZYDhc/7oBifKJfHYN+mtS1ynW1qsmzQW7Og==}
+  '@tanstack/query-core@5.75.7':
+    resolution: {integrity: sha512-4BHu0qnxUHOSnTn3ow9fIoBKTelh0GY08yn1IO9cxjBTsGvnxz1ut42CHZqUE3Vl/8FAjcHsj8RNJMoXvjgHEA==}
 
-  '@tanstack/query-devtools@5.67.2':
-    resolution: {integrity: sha512-O4QXFFd7xqp6EX7sdvc9tsVO8nm4lpWBqwpgjpVLW5g7IeOY6VnS/xvs/YzbRhBVkKTMaJMOUGU7NhSX+YGoNg==}
+  '@tanstack/query-devtools@5.74.7':
+    resolution: {integrity: sha512-nSNlfuGdnHf4yB0S+BoNYOE1o3oAH093weAYZolIHfS2stulyA/gWfSk/9H4ZFk5mAAHb5vNqAeJOmbdcGPEQw==}
 
-  '@tanstack/react-query-devtools@5.71.0':
-    resolution: {integrity: sha512-BPyvXYlR7Bsil4g068q+9b9MplSse3Ddqu+ucbViJNSLlLo0w7i/sIRTVy0I3unTaaAmp5fw9fwYjdHE4XuEwQ==}
+  '@tanstack/react-query-devtools@5.75.7':
+    resolution: {integrity: sha512-VUzHvxcUAz7oSeX/TlVyDgNxajLAF+b12Z3OfSxCrAdWynELfWohwzCn1iT2NEjnGTb3X3ryzQxeWuWMyMwCmQ==}
     peerDependencies:
-      '@tanstack/react-query': ^5.71.0
+      '@tanstack/react-query': ^5.75.7
       react: ^18 || ^19
 
-  '@tanstack/react-query@5.71.0':
-    resolution: {integrity: sha512-Udhlz9xHwk0iB7eLDchIqvu666NZFxPZZF80KnL8sZy+5J0kMvnJkzQNYRJwF70g8Vc1nn0TSMkPJgvx6+Pn4g==}
+  '@tanstack/react-query@5.75.7':
+    resolution: {integrity: sha512-JYcH1g5pNjKXNQcvvnCU/PueaYg05uKBDHlWIyApspv7r5C0BM12n6ysa2QF2T+1tlPnNXOob8vr8o96Nx0GxQ==}
     peerDependencies:
       react: ^18 || ^19
 
@@ -931,17 +935,14 @@ packages:
   '@types/babel__core@7.20.5':
     resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
 
-  '@types/babel__generator@7.6.8':
-    resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+  '@types/babel__generator@7.27.0':
+    resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
 
   '@types/babel__template@7.4.4':
     resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
 
-  '@types/babel__traverse@7.20.6':
-    resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
-
-  '@types/cookie@0.6.0':
-    resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
+  '@types/babel__traverse@7.20.7':
+    resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==}
 
   '@types/d3-array@3.2.1':
     resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
@@ -988,8 +989,12 @@ packages:
   '@types/estree@1.0.7':
     resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
 
-  '@types/git-url-parse@9.0.3':
-    resolution: {integrity: sha512-Wrb8zeghhpKbYuqAOg203g+9YSNlrZWNZYvwxJuDF4dTmerijqpnGbI79yCuPtHSXHPEwv1pAFUB4zsSqn82Og==}
+  '@types/git-up@8.1.0':
+    resolution: {integrity: sha512-dKq6FQmhuWVxjvKkhGNgIx1ZthVWClz6RhgONzQXHuHFEVmDbTcy0vAIvdAEKRpBvGOPiHSxoWFKryTTLvgFvQ==}
+    deprecated: This is a stub types definition. git-up provides its own type definitions, so you do not need this installed.
+
+  '@types/git-url-parse@16.0.0':
+    resolution: {integrity: sha512-l1xqqjwYTk0Wz8AwEezpUvns0LhTBV7RV/DOeDfIf1rbrob8Lne4ooYa2K30wJw95s1MJGXAXzx021922rUStg==}
 
   '@types/json-schema@7.0.15':
     resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -1000,87 +1005,88 @@ packages:
   '@types/lodash@4.17.14':
     resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==}
 
-  '@types/node@20.17.28':
-    resolution: {integrity: sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==}
+  '@types/node@20.17.46':
+    resolution: {integrity: sha512-0PQHLhZPWOxGW4auogW0eOQAuNIlCYvibIpG67ja0TOJ6/sehu+1en7sfceUn+QQtx4Rk3GxbLNwPh0Cav7TWw==}
 
-  '@types/node@22.13.14':
-    resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==}
+  '@types/node@22.15.17':
+    resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==}
 
-  '@types/parse-path@7.0.3':
-    resolution: {integrity: sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==}
+  '@types/parse-path@7.1.0':
+    resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==}
+    deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed.
 
-  '@types/react-dom@19.0.4':
-    resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==}
+  '@types/react-dom@19.1.3':
+    resolution: {integrity: sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==}
     peerDependencies:
       '@types/react': ^19.0.0
 
   '@types/react-infinite-scroller@1.2.5':
     resolution: {integrity: sha512-fJU1jhMgoL6NJFrqTM0Ob7tnd2sQWGxe2ESwiU6FZWbJK/VO/Er5+AOhc+e2zbT0dk5pLygqctsulOLJ8xnSzw==}
 
-  '@types/react@19.0.12':
-    resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==}
+  '@types/react@19.1.3':
+    resolution: {integrity: sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ==}
 
   '@types/semver@7.7.0':
     resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==}
 
-  '@typescript-eslint/eslint-plugin@8.28.0':
-    resolution: {integrity: sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==}
+  '@typescript-eslint/eslint-plugin@8.32.0':
+    resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/parser@8.28.0':
-    resolution: {integrity: sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==}
+  '@typescript-eslint/parser@8.32.0':
+    resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/scope-manager@8.28.0':
-    resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==}
+  '@typescript-eslint/scope-manager@8.32.0':
+    resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/type-utils@8.28.0':
-    resolution: {integrity: sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==}
+  '@typescript-eslint/type-utils@8.32.0':
+    resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/types@8.28.0':
-    resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==}
+  '@typescript-eslint/types@8.32.0':
+    resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/typescript-estree@8.28.0':
-    resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==}
+  '@typescript-eslint/typescript-estree@8.32.0':
+    resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/utils@8.28.0':
-    resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==}
+  '@typescript-eslint/utils@8.32.0':
+    resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/visitor-keys@8.28.0':
-    resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==}
+  '@typescript-eslint/visitor-keys@8.32.0':
+    resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@vitejs/plugin-react@4.3.4':
-    resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==}
+  '@vitejs/plugin-react@4.4.1':
+    resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
       vite: ^4.2.0 || ^5.0.0 || ^6.0.0
 
-  '@vitest/expect@3.0.9':
-    resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==}
+  '@vitest/expect@3.1.3':
+    resolution: {integrity: sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==}
 
-  '@vitest/mocker@3.0.9':
-    resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==}
+  '@vitest/mocker@3.1.3':
+    resolution: {integrity: sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==}
     peerDependencies:
       msw: ^2.4.9
       vite: ^5.0.0 || ^6.0.0
@@ -1090,29 +1096,33 @@ packages:
       vite:
         optional: true
 
-  '@vitest/pretty-format@3.0.9':
-    resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==}
+  '@vitest/pretty-format@3.1.3':
+    resolution: {integrity: sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==}
 
-  '@vitest/runner@3.0.9':
-    resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==}
+  '@vitest/runner@3.1.3':
+    resolution: {integrity: sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==}
 
-  '@vitest/snapshot@3.0.9':
-    resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==}
+  '@vitest/snapshot@3.1.3':
+    resolution: {integrity: sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==}
 
-  '@vitest/spy@3.0.9':
-    resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==}
+  '@vitest/spy@3.1.3':
+    resolution: {integrity: sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==}
 
-  '@vitest/utils@3.0.9':
-    resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==}
+  '@vitest/utils@3.1.3':
+    resolution: {integrity: sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==}
 
-  '@xyflow/react@12.5.1':
-    resolution: {integrity: sha512-jMKQVqGwCz0x6pUyvxTIuCMbyehfua7CfEEWDj29zQSHigQpCy0/5d8aOmZrqK4cwur/pVHLQomT6Rm10gXfHg==}
+  '@xyflow/react@12.6.0':
+    resolution: {integrity: sha512-YzsSK4SlpC6e9Ki1g6O9B1UH7xvz/bzWF+tJ+vWDD8Am5xJmFn0jYnCEuqvzvH8dRKb1NFBmyuqEGqWN39xXsA==}
     peerDependencies:
       react: '>=17'
       react-dom: '>=17'
 
-  '@xyflow/system@0.0.53':
-    resolution: {integrity: sha512-QTWieiTtvNYyQAz1fxpzgtUGXNpnhfh6vvZa7dFWpWS2KOz6bEHODo/DTK3s07lDu0Bq0Db5lx/5M5mNjb9VDQ==}
+  '@xyflow/system@0.0.57':
+    resolution: {integrity: sha512-1YpBo0WgmZLR5wQw9Jvk3Tu0gISi/oYc4uSimrDuAsA/G2rGleulLrKkM59uuT/QU5m6DYC2VdBDAzjSNMGuBA==}
+
+  accepts@2.0.0:
+    resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
+    engines: {node: '>= 0.6'}
 
   acorn-jsx@5.3.2:
     resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
@@ -1154,8 +1164,8 @@ packages:
     resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
     engines: {node: '>=12'}
 
-  antd@5.24.8:
-    resolution: {integrity: sha512-vJcW81WSRq+ymBKTiA3NE+FddmiqTAKxdWVRZU+HnLLrRrIz896svcUxXFPa7M4mH9HqyeJ5JPOHsne4sQAC1A==}
+  antd@5.25.1:
+    resolution: {integrity: sha512-4KC7KuPCjr0z3Vuw9DsF+ceqJaPLbuUI3lOX1sY8ix25ceamp+P8yxOmk3Y2JHCD2ZAhq+5IQ/DTJRN2adWYKQ==}
     peerDependencies:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
@@ -1231,6 +1241,10 @@ packages:
     resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
     engines: {node: '>=8'}
 
+  body-parser@2.2.0:
+    resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
+    engines: {node: '>=18'}
+
   boolbase@1.0.0:
     resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
 
@@ -1249,14 +1263,19 @@ packages:
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
     hasBin: true
 
+  browserslist@4.24.5:
+    resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  bytes@3.1.2:
+    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+    engines: {node: '>= 0.8'}
+
   cac@6.7.14:
     resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
     engines: {node: '>=8'}
 
-  call-bind-apply-helpers@1.0.1:
-    resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
-    engines: {node: '>= 0.4'}
-
   call-bind-apply-helpers@1.0.2:
     resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
     engines: {node: '>= 0.4'}
@@ -1265,10 +1284,6 @@ packages:
     resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
     engines: {node: '>= 0.4'}
 
-  call-bound@1.0.3:
-    resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
-    engines: {node: '>= 0.4'}
-
   call-bound@1.0.4:
     resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
     engines: {node: '>= 0.4'}
@@ -1287,6 +1302,9 @@ packages:
   caniuse-lite@1.0.30001705:
     resolution: {integrity: sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==}
 
+  caniuse-lite@1.0.30001717:
+    resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==}
+
   chai@5.2.0:
     resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==}
     engines: {node: '>=12'}
@@ -1347,9 +1365,25 @@ packages:
   concat-map@0.0.1:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
 
+  content-disposition@1.0.0:
+    resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==}
+    engines: {node: '>= 0.6'}
+
+  content-type@1.0.5:
+    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+    engines: {node: '>= 0.6'}
+
   convert-source-map@2.0.0:
     resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
 
+  cookie-signature@1.2.2:
+    resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
+    engines: {node: '>=6.6.0'}
+
+  cookie@0.7.2:
+    resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+    engines: {node: '>= 0.6'}
+
   cookie@1.0.2:
     resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
     engines: {node: '>=18'}
@@ -1360,6 +1394,10 @@ packages:
   copy-to-clipboard@3.3.3:
     resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
 
+  cors@2.8.5:
+    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+    engines: {node: '>= 0.10'}
+
   cross-spawn@7.0.6:
     resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
     engines: {node: '>= 8'}
@@ -1538,6 +1576,10 @@ packages:
     resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
     engines: {node: '>= 0.4'}
 
+  depd@2.0.0:
+    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+    engines: {node: '>= 0.8'}
+
   didyoumean@1.2.2:
     resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
 
@@ -1574,15 +1616,25 @@ packages:
   eastasianwidth@0.2.0:
     resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
 
+  ee-first@1.1.1:
+    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
   electron-to-chromium@1.5.119:
     resolution: {integrity: sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==}
 
+  electron-to-chromium@1.5.151:
+    resolution: {integrity: sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==}
+
   emoji-regex@8.0.0:
     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
 
   emoji-regex@9.2.2:
     resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
 
+  encodeurl@2.0.0:
+    resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+    engines: {node: '>= 0.8'}
+
   entities@4.5.0:
     resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
     engines: {node: '>=0.12'}
@@ -1607,8 +1659,8 @@ packages:
     resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
     engines: {node: '>= 0.4'}
 
-  es-module-lexer@1.6.0:
-    resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
+  es-module-lexer@1.7.0:
+    resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
 
   es-object-atoms@1.0.0:
     resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
@@ -1633,8 +1685,8 @@ packages:
     resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
     engines: {node: '>= 0.4'}
 
-  esbuild@0.25.3:
-    resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==}
+  esbuild@0.25.4:
+    resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -1642,6 +1694,9 @@ packages:
     resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
     engines: {node: '>=6'}
 
+  escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
   escape-string-regexp@4.0.0:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
@@ -1686,8 +1741,8 @@ packages:
       '@typescript-eslint/parser':
         optional: true
 
-  eslint-plugin-prettier@5.2.6:
-    resolution: {integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==}
+  eslint-plugin-prettier@5.4.0:
+    resolution: {integrity: sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
       '@types/eslint': '>=8.0.0'
@@ -1723,8 +1778,8 @@ packages:
     resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  eslint@9.23.0:
-    resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==}
+  eslint@9.26.0:
+    resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     hasBin: true
     peerDependencies:
@@ -1756,13 +1811,35 @@ packages:
     resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
     engines: {node: '>=0.10.0'}
 
+  etag@1.8.1:
+    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+    engines: {node: '>= 0.6'}
+
   eventemitter3@4.0.7:
     resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
 
-  expect-type@1.2.0:
-    resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==}
+  eventsource-parser@3.0.1:
+    resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==}
+    engines: {node: '>=18.0.0'}
+
+  eventsource@3.0.7:
+    resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
+    engines: {node: '>=18.0.0'}
+
+  expect-type@1.2.1:
+    resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==}
     engines: {node: '>=12.0.0'}
 
+  express-rate-limit@7.5.0:
+    resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==}
+    engines: {node: '>= 16'}
+    peerDependencies:
+      express: ^4.11 || 5 || ^5.0.0-beta.1
+
+  express@5.1.0:
+    resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
+    engines: {node: '>= 18'}
+
   fast-deep-equal@3.1.3:
     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
 
@@ -1789,6 +1866,14 @@ packages:
   fastq@1.18.0:
     resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
 
+  fdir@6.4.4:
+    resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==}
+    peerDependencies:
+      picomatch: ^3 || ^4
+    peerDependenciesMeta:
+      picomatch:
+        optional: true
+
   file-entry-cache@8.0.0:
     resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
     engines: {node: '>=16.0.0'}
@@ -1797,6 +1882,10 @@ packages:
     resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
     engines: {node: '>=8'}
 
+  finalhandler@2.1.0:
+    resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
+    engines: {node: '>= 0.8'}
+
   find-up@5.0.0:
     resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
     engines: {node: '>=10'}
@@ -1816,9 +1905,17 @@ packages:
     resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
     engines: {node: '>=14'}
 
+  forwarded@0.2.0:
+    resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+    engines: {node: '>= 0.6'}
+
   fraction.js@4.3.7:
     resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
 
+  fresh@2.0.0:
+    resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+    engines: {node: '>= 0.8'}
+
   fs-extra@10.1.0:
     resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
     engines: {node: '>=12'}
@@ -1846,10 +1943,6 @@ packages:
     resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
     engines: {node: 6.* || 8.* || >= 10.*}
 
-  get-intrinsic@1.2.7:
-    resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
-    engines: {node: '>= 0.4'}
-
   get-intrinsic@1.3.0:
     resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
     engines: {node: '>= 0.4'}
@@ -1862,11 +1955,11 @@ packages:
     resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
     engines: {node: '>= 0.4'}
 
-  git-up@8.0.1:
-    resolution: {integrity: sha512-2XFu1uNZMSjkyetaF+8rqn6P0XqpMq/C+2ycjI6YwrIKcszZ5/WR4UubxjN0lILOKqLkLaHDaCr2B6fP1cke6g==}
+  git-up@8.1.1:
+    resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==}
 
-  git-url-parse@16.0.1:
-    resolution: {integrity: sha512-mcD36GrhAzX5JVOsIO52qNpgRyFzYWRbU1VSRFCvJt1IJvqfvH427wWw/CFqkWvjVPtdG5VTx4MKUeC5GeFPDQ==}
+  git-url-parse@16.1.0:
+    resolution: {integrity: sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==}
 
   glob-parent@5.1.2:
     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -1888,8 +1981,8 @@ packages:
     resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
     engines: {node: '>=18'}
 
-  globals@16.0.0:
-    resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==}
+  globals@16.1.0:
+    resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==}
     engines: {node: '>=18'}
 
   globalthis@1.0.4:
@@ -1939,6 +2032,10 @@ packages:
     resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
     engines: {node: '>= 0.4'}
 
+  http-errors@2.0.0:
+    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+    engines: {node: '>= 0.8'}
+
   iconv-lite@0.6.3:
     resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
     engines: {node: '>=0.10.0'}
@@ -1960,6 +2057,9 @@ packages:
     resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
     engines: {node: '>=0.8.19'}
 
+  inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
   internal-slot@1.1.0:
     resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
     engines: {node: '>= 0.4'}
@@ -1968,6 +2068,10 @@ packages:
     resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
     engines: {node: '>=12'}
 
+  ipaddr.js@1.9.1:
+    resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+    engines: {node: '>= 0.10'}
+
   is-array-buffer@3.0.5:
     resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
     engines: {node: '>= 0.4'}
@@ -2036,6 +2140,9 @@ packages:
     resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
     engines: {node: '>=0.12.0'}
 
+  is-promise@4.0.0:
+    resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
+
   is-regex@1.2.1:
     resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
     engines: {node: '>= 0.4'}
@@ -2126,8 +2233,8 @@ packages:
   json-stable-stringify-without-jsonify@1.0.1:
     resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
 
-  json-stable-stringify@1.2.1:
-    resolution: {integrity: sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA==}
+  json-stable-stringify@1.3.0:
+    resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==}
     engines: {node: '>= 0.4'}
 
   json2mq@0.2.0:
@@ -2162,9 +2269,9 @@ packages:
   keyv@4.5.4:
     resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
 
-  less@4.2.2:
-    resolution: {integrity: sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==}
-    engines: {node: '>=6'}
+  less@4.3.0:
+    resolution: {integrity: sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==}
+    engines: {node: '>=14'}
     hasBin: true
 
   levn@0.4.1:
@@ -2233,6 +2340,14 @@ packages:
   mdn-data@2.0.30:
     resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
 
+  media-typer@1.1.0:
+    resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
+    engines: {node: '>= 0.8'}
+
+  merge-descriptors@2.0.0:
+    resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
+    engines: {node: '>=18'}
+
   merge2@1.4.1:
     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
     engines: {node: '>= 8'}
@@ -2241,6 +2356,14 @@ packages:
     resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
     engines: {node: '>=8.6'}
 
+  mime-db@1.54.0:
+    resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+    engines: {node: '>= 0.6'}
+
+  mime-types@3.0.1:
+    resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
+    engines: {node: '>= 0.6'}
+
   mime@1.6.0:
     resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
     engines: {node: '>=4'}
@@ -2285,8 +2408,8 @@ packages:
     peerDependencies:
       monaco-editor: '>=0.30.0'
 
-  monaco-yaml@5.3.1:
-    resolution: {integrity: sha512-1MN8i1Tnc8d8RugQGqv5jp+Ce2xtNhrnbm0ZZbe5ceExj9C2PkKZfHJhY9kbdUS4G7xSVwKlVdMTmLlStepOtw==}
+  monaco-yaml@5.4.0:
+    resolution: {integrity: sha512-tuBVDy1KAPrgO905GHTItu8AaA5bIzF5S4X0JVRAE/D66FpRhkDUk7tKi5bwKMVTTugtpMLsXN4ewh4CgE/FtQ==}
     peerDependencies:
       monaco-editor: '>=0.36'
 
@@ -2309,6 +2432,10 @@ packages:
     engines: {node: '>= 4.4.x'}
     hasBin: true
 
+  negotiator@1.0.0:
+    resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
+    engines: {node: '>= 0.6'}
+
   node-releases@2.0.19:
     resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
 
@@ -2323,8 +2450,8 @@ packages:
   nth-check@2.1.1:
     resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
 
-  oauth4webapi@3.3.2:
-    resolution: {integrity: sha512-hCJgDQayOLpBxdDpzShK/SI3C1PVnkj4CcKLOGyQm23Lk5V+qYPH+LtQlu8YO29MswBry/FBVlwWBnWgQvaFdA==}
+  oauth4webapi@3.5.1:
+    resolution: {integrity: sha512-txg/jZQwcbaF7PMJgY7aoxc9QuCxHVFMiEkDIJ60DwDz3PbtXPQnrzo+3X4IRYGChIwWLabRBRpf1k9hO9+xrQ==}
 
   object-assign@4.1.1:
     resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
@@ -2362,6 +2489,13 @@ packages:
     resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
     engines: {node: '>= 0.4'}
 
+  on-finished@2.4.1:
+    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+    engines: {node: '>= 0.8'}
+
+  once@1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
   openapi-typescript@5.4.2:
     resolution: {integrity: sha512-tHeRv39Yh7brqJpbUntdjtUaXrTHmC4saoyTLU/0J2I8LEFQYDXRLgnmWTMiMOB2GXugJiqHa5n9sAyd6BRqiA==}
     engines: {node: '>= 14.0.0'}
@@ -2394,13 +2528,17 @@ packages:
     resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
     engines: {node: '>= 0.10'}
 
-  parse-path@7.0.1:
-    resolution: {integrity: sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg==}
+  parse-path@7.1.0:
+    resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==}
 
   parse-url@9.2.0:
     resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==}
     engines: {node: '>=14.13.0'}
 
+  parseurl@1.3.3:
+    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+    engines: {node: '>= 0.8'}
+
   path-browserify@1.0.1:
     resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
 
@@ -2419,6 +2557,10 @@ packages:
     resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
     engines: {node: '>=16 || 14 >=14.18'}
 
+  path-to-regexp@8.2.0:
+    resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
+    engines: {node: '>=16'}
+
   pathe@2.0.3:
     resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
 
@@ -2433,6 +2575,10 @@ packages:
     resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
     engines: {node: '>=8.6'}
 
+  picomatch@4.0.2:
+    resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+    engines: {node: '>=12'}
+
   pify@2.3.0:
     resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
     engines: {node: '>=0.10.0'}
@@ -2445,6 +2591,10 @@ packages:
     resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
     engines: {node: '>= 6'}
 
+  pkce-challenge@5.0.0:
+    resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==}
+    engines: {node: '>=16.20.0'}
+
   possible-typed-array-names@1.1.0:
     resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
     engines: {node: '>= 0.4'}
@@ -2676,6 +2826,10 @@ packages:
   protocols@2.0.2:
     resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==}
 
+  proxy-addr@2.0.7:
+    resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+    engines: {node: '>= 0.10'}
+
   prr@1.0.1:
     resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
 
@@ -2683,17 +2837,29 @@ packages:
     resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
     engines: {node: '>=6'}
 
+  qs@6.14.0:
+    resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
+    engines: {node: '>=0.6'}
+
   queue-microtask@1.2.3:
     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
 
+  range-parser@1.2.1:
+    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+    engines: {node: '>= 0.6'}
+
+  raw-body@3.0.0:
+    resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==}
+    engines: {node: '>= 0.8'}
+
   rc-align@4.0.15:
     resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==}
     peerDependencies:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
 
-  rc-cascader@3.33.1:
-    resolution: {integrity: sha512-Kyl4EJ7ZfCBuidmZVieegcbFw0RcU5bHHSbtEdmuLYd0fYHCAiYKZ6zon7fWAVyC6rWWOOib0XKdTSf7ElC9rg==}
+  rc-cascader@3.34.0:
+    resolution: {integrity: sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==}
     peerDependencies:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
@@ -2735,8 +2901,8 @@ packages:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
 
-  rc-image@7.11.1:
-    resolution: {integrity: sha512-XuoWx4KUXg7hNy5mRTy1i8c8p3K8boWg6UajbHpDXS5AlRVucNfTi5YxTtPBTBzegxAZpvuLfh3emXFt6ybUdA==}
+  rc-image@7.12.0:
+    resolution: {integrity: sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==}
     peerDependencies:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
@@ -2842,8 +3008,8 @@ packages:
       react: '>=16.0.0'
       react-dom: '>=16.0.0'
 
-  rc-select@14.16.6:
-    resolution: {integrity: sha512-YPMtRPqfZWOm2XGTbx5/YVr1HT0vn//8QS77At0Gjb3Lv+Lbut0IORJPKLWu1hQ3u4GsA0SrDzs7nI8JG7Zmyg==}
+  rc-select@14.16.7:
+    resolution: {integrity: sha512-lT9kO5gFHQdJzu9a0btcOtNaJHkhenSl8H5mcpgXN9VIMXP59rnkpbdHmPrteixWs1D5zFOTyoTYX3b7joADIQ==}
     engines: {node: '>=8.x'}
     peerDependencies:
       react: '*'
@@ -2876,8 +3042,8 @@ packages:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
 
-  rc-tabs@15.6.0:
-    resolution: {integrity: sha512-SQ99Yjc9ewrJCUwoWPKq0FeGL2znWsqPhfcZgsHz1R7bkA2rMNe7CPgOiJkwppdJ98wkLhzs9vPrv21QOE1RyQ==}
+  rc-tabs@15.6.1:
+    resolution: {integrity: sha512-/HzDV1VqOsUWyuC0c6AkxVYFjvx9+rFPKZ32ejxX0Uc7QCzcEjTA9/xMgv4HemPKwzBNX8KhGVbbumDjnj92aA==}
     engines: {node: '>=8.x'}
     peerDependencies:
       react: '>=16.9.0'
@@ -2915,8 +3081,8 @@ packages:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
 
-  rc-upload@4.8.1:
-    resolution: {integrity: sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==}
+  rc-upload@4.9.0:
+    resolution: {integrity: sha512-pAzlPnyiFn1GCtEybEG2m9nXNzQyWXqWV2xFYCmDxjN9HzyjS5Pz2F+pbNdYw8mMJsixLEKLG0wVy9vOGxJMJA==}
     peerDependencies:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
@@ -2927,8 +3093,8 @@ packages:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
 
-  rc-virtual-list@3.18.5:
-    resolution: {integrity: sha512-1FuxVSxhzTj3y8k5xMPbhXCB0t2TOiI3Tq+qE2Bu+GGV7f+ECVuQl4OUg6lZ2qT5fordTW7CBpr9czdzXCI7Pg==}
+  rc-virtual-list@3.18.6:
+    resolution: {integrity: sha512-TQ5SsutL3McvWmmxqQtMIbfeoE3dGjJrRSfKekgby7WQMpPIFvv4ghytp5Z0s3D8Nik9i9YNOCqHBfk86AwgAA==}
     engines: {node: '>=8.x'}
     peerDependencies:
       react: '>=16.9.0'
@@ -2939,8 +3105,8 @@ packages:
     peerDependencies:
       react: ^19.1.0
 
-  react-hook-form@7.55.0:
-    resolution: {integrity: sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==}
+  react-hook-form@7.56.3:
+    resolution: {integrity: sha512-IK18V6GVbab4TAo1/cz3kqajxbDPGofdF0w7VHdCo0Nt8PrPlOZcuuDq9YYIV1BtjcX78x0XsldbQRQnQXWXmw==}
     engines: {node: '>=18.0.0'}
     peerDependencies:
       react: ^16.8.0 || ^17 || ^18 || ^19
@@ -2951,19 +3117,19 @@ packages:
   react-is@18.3.1:
     resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
 
-  react-refresh@0.14.2:
-    resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
+  react-refresh@0.17.0:
+    resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
     engines: {node: '>=0.10.0'}
 
-  react-router-dom@7.4.1:
-    resolution: {integrity: sha512-L3/4tig0Lvs6m6THK0HRV4eHUdpx0dlJasgCxXKnavwhh4tKYgpuZk75HRYNoRKDyDWi9QgzGXsQ1oQSBlWpAA==}
+  react-router-dom@7.6.0:
+    resolution: {integrity: sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==}
     engines: {node: '>=20.0.0'}
     peerDependencies:
       react: '>=18'
       react-dom: '>=18'
 
-  react-router@7.4.1:
-    resolution: {integrity: sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg==}
+  react-router@7.6.0:
+    resolution: {integrity: sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==}
     engines: {node: '>=20.0.0'}
     peerDependencies:
       react: '>=18'
@@ -3009,9 +3175,6 @@ packages:
     resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
     engines: {node: '>= 0.4'}
 
-  regenerator-runtime@0.14.1:
-    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
-
   regexp.prototype.flags@1.5.4:
     resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
     engines: {node: '>= 0.4'}
@@ -3044,11 +3207,15 @@ packages:
     resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
     engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
 
-  rollup@4.40.1:
-    resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==}
+  rollup@4.40.2:
+    resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
 
+  router@2.2.0:
+    resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
+    engines: {node: '>= 18'}
+
   run-parallel@1.2.0:
     resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
 
@@ -3056,6 +3223,9 @@ packages:
     resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
     engines: {node: '>=0.4'}
 
+  safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
   safe-push-apply@1.0.0:
     resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
     engines: {node: '>= 0.4'}
@@ -3089,6 +3259,14 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
+  send@1.2.0:
+    resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
+    engines: {node: '>= 18'}
+
+  serve-static@2.2.0:
+    resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
+    engines: {node: '>= 18'}
+
   set-cookie-parser@2.7.1:
     resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
 
@@ -3104,6 +3282,9 @@ packages:
     resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
     engines: {node: '>= 0.4'}
 
+  setprototypeof@1.2.0:
+    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
   shallowequal@1.1.0:
     resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
 
@@ -3152,8 +3333,12 @@ packages:
   state-local@1.0.7:
     resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
 
-  std-env@3.8.1:
-    resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==}
+  statuses@2.0.1:
+    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+    engines: {node: '>= 0.8'}
+
+  std-env@3.9.0:
+    resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
 
   string-convert@0.2.1:
     resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
@@ -3260,6 +3445,10 @@ packages:
   tinyexec@0.3.2:
     resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
 
+  tinyglobby@0.2.13:
+    resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==}
+    engines: {node: '>=12.0.0'}
+
   tinypool@1.0.2:
     resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -3279,6 +3468,10 @@ packages:
   toggle-selection@1.0.6:
     resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
 
+  toidentifier@1.0.1:
+    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+    engines: {node: '>=0.6'}
+
   ts-api-utils@2.1.0:
     resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
     engines: {node: '>=18.12'}
@@ -3304,13 +3497,14 @@ packages:
   tslib@2.8.1:
     resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
 
-  turbo-stream@2.4.0:
-    resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==}
-
   type-check@0.4.0:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
     engines: {node: '>= 0.8.0'}
 
+  type-is@2.0.1:
+    resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
+    engines: {node: '>= 0.6'}
+
   typed-array-buffer@1.0.3:
     resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
     engines: {node: '>= 0.4'}
@@ -3339,8 +3533,8 @@ packages:
   undici-types@6.19.8:
     resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
 
-  undici-types@6.20.0:
-    resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+  undici-types@6.21.0:
+    resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
 
   undici@5.28.4:
     resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
@@ -3350,6 +3544,10 @@ packages:
     resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
     engines: {node: '>= 10.0.0'}
 
+  unpipe@1.0.0:
+    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+    engines: {node: '>= 0.8'}
+
   update-browserslist-db@1.1.3:
     resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
     hasBin: true
@@ -3382,11 +3580,15 @@ packages:
   validate.io-number@1.0.3:
     resolution: {integrity: sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==}
 
+  vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+
   victory-vendor@36.9.2:
     resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==}
 
-  vite-node@3.0.9:
-    resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==}
+  vite-node@3.1.3:
+    resolution: {integrity: sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
 
@@ -3408,8 +3610,8 @@ packages:
       vite:
         optional: true
 
-  vite@6.2.7:
-    resolution: {integrity: sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==}
+  vite@6.3.5:
+    resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
     peerDependencies:
@@ -3448,16 +3650,16 @@ packages:
       yaml:
         optional: true
 
-  vitest@3.0.9:
-    resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==}
+  vitest@3.1.3:
+    resolution: {integrity: sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
     peerDependencies:
       '@edge-runtime/vm': '*'
       '@types/debug': ^4.1.12
       '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
-      '@vitest/browser': 3.0.9
-      '@vitest/ui': 3.0.9
+      '@vitest/browser': 3.1.3
+      '@vitest/ui': 3.1.3
       happy-dom: '*'
       jsdom: '*'
     peerDependenciesMeta:
@@ -3530,6 +3732,9 @@ packages:
     resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
     engines: {node: '>=12'}
 
+  wrappy@1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
   y18n@5.0.8:
     resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
     engines: {node: '>=10'}
@@ -3554,6 +3759,11 @@ packages:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
 
+  zod-to-json-schema@3.24.5:
+    resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==}
+    peerDependencies:
+      zod: ^3.24.1
+
   zod@3.24.3:
     resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==}
 
@@ -3572,8 +3782,8 @@ packages:
       react:
         optional: true
 
-  zx@8.4.1:
-    resolution: {integrity: sha512-1Cb+Tfwt/daKV6wckBeDbB6h3IMauqj9KWp+EcbYzi9doeJeIHCktxp/yWspXOXRdoUzBCQSKoUgm3g8r9fz5A==}
+  zx@8.5.4:
+    resolution: {integrity: sha512-44oKea9Sa8ZnOkTnS6fRJpg3quzgnbB43nLrVfYnqE86J4sxgZMUDLezzKET/FdOAVkF4X+Alm9Bume+W+RW9Q==}
     engines: {node: '>= 12.17.0'}
     hasBin: true
 
@@ -3593,14 +3803,14 @@ snapshots:
   '@ant-design/cssinjs-utils@1.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
       '@ant-design/cssinjs': 1.23.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
   '@ant-design/cssinjs@1.23.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@emotion/hash': 0.8.0
       '@emotion/unitless': 0.7.5
       classnames: 2.5.1
@@ -3612,7 +3822,7 @@ snapshots:
 
   '@ant-design/fast-color@2.0.6':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
 
   '@ant-design/icons-svg@4.4.2': {}
 
@@ -3620,7 +3830,7 @@ snapshots:
     dependencies:
       '@ant-design/colors': 7.2.0
       '@ant-design/icons-svg': 4.4.2
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -3628,16 +3838,16 @@ snapshots:
 
   '@ant-design/react-slick@1.1.2(react@19.1.0)':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       json2mq: 0.2.0
       react: 19.1.0
       resize-observer-polyfill: 1.5.1
       throttle-debounce: 5.0.2
 
-  '@ant-design/v5-patch-for-react-19@1.0.3(antd@5.24.8(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+  '@ant-design/v5-patch-for-react-19@1.0.3(antd@5.25.1(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
-      antd: 5.24.8(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      antd: 5.25.1(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
@@ -3647,26 +3857,26 @@ snapshots:
       '@types/json-schema': 7.0.15
       js-yaml: 4.1.0
 
-  '@babel/code-frame@7.26.2':
+  '@babel/code-frame@7.27.1':
     dependencies:
-      '@babel/helper-validator-identifier': 7.25.9
+      '@babel/helper-validator-identifier': 7.27.1
       js-tokens: 4.0.0
       picocolors: 1.1.1
 
-  '@babel/compat-data@7.26.3': {}
+  '@babel/compat-data@7.27.2': {}
 
-  '@babel/core@7.26.0':
+  '@babel/core@7.27.1':
     dependencies:
       '@ampproject/remapping': 2.3.0
-      '@babel/code-frame': 7.26.2
-      '@babel/generator': 7.26.3
-      '@babel/helper-compilation-targets': 7.25.9
-      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
-      '@babel/helpers': 7.26.0
-      '@babel/parser': 7.26.3
-      '@babel/template': 7.25.9
-      '@babel/traverse': 7.26.4
-      '@babel/types': 7.26.3
+      '@babel/code-frame': 7.27.1
+      '@babel/generator': 7.27.1
+      '@babel/helper-compilation-targets': 7.27.2
+      '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
+      '@babel/helpers': 7.27.1
+      '@babel/parser': 7.27.2
+      '@babel/template': 7.27.2
+      '@babel/traverse': 7.27.1
+      '@babel/types': 7.27.1
       convert-source-map: 2.0.0
       debug: 4.4.0
       gensync: 1.0.0-beta.2
@@ -3675,106 +3885,104 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/generator@7.26.3':
+  '@babel/generator@7.27.1':
     dependencies:
-      '@babel/parser': 7.26.3
-      '@babel/types': 7.26.3
+      '@babel/parser': 7.27.2
+      '@babel/types': 7.27.1
       '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/trace-mapping': 0.3.25
       jsesc: 3.1.0
 
-  '@babel/helper-compilation-targets@7.25.9':
+  '@babel/helper-compilation-targets@7.27.2':
     dependencies:
-      '@babel/compat-data': 7.26.3
-      '@babel/helper-validator-option': 7.25.9
-      browserslist: 4.24.4
+      '@babel/compat-data': 7.27.2
+      '@babel/helper-validator-option': 7.27.1
+      browserslist: 4.24.5
       lru-cache: 5.1.1
       semver: 6.3.1
 
-  '@babel/helper-module-imports@7.25.9':
+  '@babel/helper-module-imports@7.27.1':
     dependencies:
-      '@babel/traverse': 7.26.4
-      '@babel/types': 7.26.3
+      '@babel/traverse': 7.27.1
+      '@babel/types': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
+  '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.0
-      '@babel/helper-module-imports': 7.25.9
-      '@babel/helper-validator-identifier': 7.25.9
-      '@babel/traverse': 7.26.4
+      '@babel/core': 7.27.1
+      '@babel/helper-module-imports': 7.27.1
+      '@babel/helper-validator-identifier': 7.27.1
+      '@babel/traverse': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-plugin-utils@7.25.9': {}
+  '@babel/helper-plugin-utils@7.27.1': {}
 
-  '@babel/helper-string-parser@7.25.9': {}
+  '@babel/helper-string-parser@7.27.1': {}
 
-  '@babel/helper-validator-identifier@7.25.9': {}
+  '@babel/helper-validator-identifier@7.27.1': {}
 
-  '@babel/helper-validator-option@7.25.9': {}
+  '@babel/helper-validator-option@7.27.1': {}
 
-  '@babel/helpers@7.26.0':
+  '@babel/helpers@7.27.1':
     dependencies:
-      '@babel/template': 7.25.9
-      '@babel/types': 7.26.3
+      '@babel/template': 7.27.2
+      '@babel/types': 7.27.1
 
-  '@babel/parser@7.26.3':
+  '@babel/parser@7.27.2':
     dependencies:
-      '@babel/types': 7.26.3
+      '@babel/types': 7.27.1
 
-  '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)':
+  '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.0
-      '@babel/helper-plugin-utils': 7.25.9
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)':
+  '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.1)':
     dependencies:
-      '@babel/core': 7.26.0
-      '@babel/helper-plugin-utils': 7.25.9
+      '@babel/core': 7.27.1
+      '@babel/helper-plugin-utils': 7.27.1
 
-  '@babel/runtime@7.27.0':
-    dependencies:
-      regenerator-runtime: 0.14.1
+  '@babel/runtime@7.27.1': {}
 
-  '@babel/template@7.25.9':
+  '@babel/template@7.27.2':
     dependencies:
-      '@babel/code-frame': 7.26.2
-      '@babel/parser': 7.26.3
-      '@babel/types': 7.26.3
+      '@babel/code-frame': 7.27.1
+      '@babel/parser': 7.27.2
+      '@babel/types': 7.27.1
 
-  '@babel/traverse@7.26.4':
+  '@babel/traverse@7.27.1':
     dependencies:
-      '@babel/code-frame': 7.26.2
-      '@babel/generator': 7.26.3
-      '@babel/parser': 7.26.3
-      '@babel/template': 7.25.9
-      '@babel/types': 7.26.3
+      '@babel/code-frame': 7.27.1
+      '@babel/generator': 7.27.1
+      '@babel/parser': 7.27.2
+      '@babel/template': 7.27.2
+      '@babel/types': 7.27.1
       debug: 4.4.0
       globals: 11.12.0
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/types@7.26.3':
+  '@babel/types@7.27.1':
     dependencies:
-      '@babel/helper-string-parser': 7.25.9
-      '@babel/helper-validator-identifier': 7.25.9
+      '@babel/helper-string-parser': 7.27.1
+      '@babel/helper-validator-identifier': 7.27.1
 
   '@bufbuild/protobuf@2.2.3': {}
 
-  '@connectrpc/connect-query-core@2.0.1(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.2.3))(@tanstack/query-core@5.71.0)':
+  '@connectrpc/connect-query-core@2.0.1(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.2.3))(@tanstack/query-core@5.75.7)':
     dependencies:
       '@bufbuild/protobuf': 2.2.3
       '@connectrpc/connect': 2.0.2(@bufbuild/protobuf@2.2.3)
-      '@tanstack/query-core': 5.71.0
+      '@tanstack/query-core': 5.75.7
 
-  '@connectrpc/connect-query@2.0.1(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.2.3))(@tanstack/query-core@5.71.0)(@tanstack/react-query@5.71.0(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+  '@connectrpc/connect-query@2.0.1(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.2.3))(@tanstack/query-core@5.75.7)(@tanstack/react-query@5.75.7(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
       '@bufbuild/protobuf': 2.2.3
       '@connectrpc/connect': 2.0.2(@bufbuild/protobuf@2.2.3)
-      '@connectrpc/connect-query-core': 2.0.1(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.2.3))(@tanstack/query-core@5.71.0)
-      '@tanstack/react-query': 5.71.0(react@19.1.0)
+      '@connectrpc/connect-query-core': 2.0.1(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.2.3))(@tanstack/query-core@5.75.7)
+      '@tanstack/react-query': 5.75.7(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
     transitivePeerDependencies:
@@ -3799,93 +4007,93 @@ snapshots:
 
   '@emotion/unitless@0.7.5': {}
 
-  '@esbuild/aix-ppc64@0.25.3':
+  '@esbuild/aix-ppc64@0.25.4':
     optional: true
 
-  '@esbuild/android-arm64@0.25.3':
+  '@esbuild/android-arm64@0.25.4':
     optional: true
 
-  '@esbuild/android-arm@0.25.3':
+  '@esbuild/android-arm@0.25.4':
     optional: true
 
-  '@esbuild/android-x64@0.25.3':
+  '@esbuild/android-x64@0.25.4':
     optional: true
 
-  '@esbuild/darwin-arm64@0.25.3':
+  '@esbuild/darwin-arm64@0.25.4':
     optional: true
 
-  '@esbuild/darwin-x64@0.25.3':
+  '@esbuild/darwin-x64@0.25.4':
     optional: true
 
-  '@esbuild/freebsd-arm64@0.25.3':
+  '@esbuild/freebsd-arm64@0.25.4':
     optional: true
 
-  '@esbuild/freebsd-x64@0.25.3':
+  '@esbuild/freebsd-x64@0.25.4':
     optional: true
 
-  '@esbuild/linux-arm64@0.25.3':
+  '@esbuild/linux-arm64@0.25.4':
     optional: true
 
-  '@esbuild/linux-arm@0.25.3':
+  '@esbuild/linux-arm@0.25.4':
     optional: true
 
-  '@esbuild/linux-ia32@0.25.3':
+  '@esbuild/linux-ia32@0.25.4':
     optional: true
 
-  '@esbuild/linux-loong64@0.25.3':
+  '@esbuild/linux-loong64@0.25.4':
     optional: true
 
-  '@esbuild/linux-mips64el@0.25.3':
+  '@esbuild/linux-mips64el@0.25.4':
     optional: true
 
-  '@esbuild/linux-ppc64@0.25.3':
+  '@esbuild/linux-ppc64@0.25.4':
     optional: true
 
-  '@esbuild/linux-riscv64@0.25.3':
+  '@esbuild/linux-riscv64@0.25.4':
     optional: true
 
-  '@esbuild/linux-s390x@0.25.3':
+  '@esbuild/linux-s390x@0.25.4':
     optional: true
 
-  '@esbuild/linux-x64@0.25.3':
+  '@esbuild/linux-x64@0.25.4':
     optional: true
 
-  '@esbuild/netbsd-arm64@0.25.3':
+  '@esbuild/netbsd-arm64@0.25.4':
     optional: true
 
-  '@esbuild/netbsd-x64@0.25.3':
+  '@esbuild/netbsd-x64@0.25.4':
     optional: true
 
-  '@esbuild/openbsd-arm64@0.25.3':
+  '@esbuild/openbsd-arm64@0.25.4':
     optional: true
 
-  '@esbuild/openbsd-x64@0.25.3':
+  '@esbuild/openbsd-x64@0.25.4':
     optional: true
 
-  '@esbuild/sunos-x64@0.25.3':
+  '@esbuild/sunos-x64@0.25.4':
     optional: true
 
-  '@esbuild/win32-arm64@0.25.3':
+  '@esbuild/win32-arm64@0.25.4':
     optional: true
 
-  '@esbuild/win32-ia32@0.25.3':
+  '@esbuild/win32-ia32@0.25.4':
     optional: true
 
-  '@esbuild/win32-x64@0.25.3':
+  '@esbuild/win32-x64@0.25.4':
     optional: true
 
-  '@eslint-community/eslint-utils@4.5.1(eslint@9.23.0(jiti@1.21.7))':
+  '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@1.21.7))':
     dependencies:
-      eslint: 9.23.0(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       eslint-visitor-keys: 3.4.3
 
   '@eslint-community/regexpp@4.12.1': {}
 
-  '@eslint/compat@1.2.8(eslint@9.23.0(jiti@1.21.7))':
+  '@eslint/compat@1.2.8(eslint@9.26.0(jiti@1.21.7))':
     optionalDependencies:
-      eslint: 9.23.0(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
 
-  '@eslint/config-array@0.19.2':
+  '@eslint/config-array@0.20.0':
     dependencies:
       '@eslint/object-schema': 2.1.6
       debug: 4.4.0
@@ -3893,9 +4101,9 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@eslint/config-helpers@0.2.0': {}
+  '@eslint/config-helpers@0.2.2': {}
 
-  '@eslint/core@0.12.0':
+  '@eslint/core@0.13.0':
     dependencies:
       '@types/json-schema': 7.0.15
 
@@ -3913,13 +4121,13 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@eslint/js@9.23.0': {}
+  '@eslint/js@9.26.0': {}
 
   '@eslint/object-schema@2.1.6': {}
 
-  '@eslint/plugin-kit@0.2.7':
+  '@eslint/plugin-kit@0.2.8':
     dependencies:
-      '@eslint/core': 0.12.0
+      '@eslint/core': 0.13.0
       levn: 0.4.1
 
   '@fastify/busboy@2.1.1': {}
@@ -3944,10 +4152,10 @@ snapshots:
       prop-types: 15.8.1
       react: 19.1.0
 
-  '@hookform/resolvers@4.1.3(react-hook-form@7.55.0(react@19.1.0))':
+  '@hookform/resolvers@4.1.3(react-hook-form@7.56.3(react@19.1.0))':
     dependencies:
       '@standard-schema/utils': 0.3.0
-      react-hook-form: 7.55.0(react@19.1.0)
+      react-hook-form: 7.56.3(react@19.1.0)
 
   '@humanfs/core@0.19.1': {}
 
@@ -3960,7 +4168,7 @@ snapshots:
 
   '@humanwhocodes/retry@0.3.1': {}
 
-  '@humanwhocodes/retry@0.4.2': {}
+  '@humanwhocodes/retry@0.4.3': {}
 
   '@isaacs/cliui@8.0.2':
     dependencies:
@@ -3990,6 +4198,21 @@ snapshots:
 
   '@jsdevtools/ono@7.1.3': {}
 
+  '@modelcontextprotocol/sdk@1.11.1':
+    dependencies:
+      content-type: 1.0.5
+      cors: 2.8.5
+      cross-spawn: 7.0.6
+      eventsource: 3.0.7
+      express: 5.1.0
+      express-rate-limit: 7.5.0(express@5.1.0)
+      pkce-challenge: 5.0.0
+      raw-body: 3.0.0
+      zod: 3.24.3
+      zod-to-json-schema: 3.24.5(zod@3.24.3)
+    transitivePeerDependencies:
+      - supports-color
+
   '@monaco-editor/loader@1.5.0':
     dependencies:
       state-local: 1.0.7
@@ -4017,7 +4240,7 @@ snapshots:
     dependencies:
       '@types/json-schema': 7.0.15
       '@types/lodash': 4.17.14
-      '@types/node': 20.17.28
+      '@types/node': 20.17.46
       fast-deep-equal: 3.1.3
       lodash: 4.17.21
       openapi-typescript: 5.4.2
@@ -4030,12 +4253,12 @@ snapshots:
 
   '@rc-component/async-validator@5.0.4':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
 
   '@rc-component/color-picker@2.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
       '@ant-design/fast-color': 2.0.6
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -4043,18 +4266,18 @@ snapshots:
 
   '@rc-component/context@1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
   '@rc-component/mini-decimal@1.1.0':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
 
   '@rc-component/mutate-observer@1.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -4062,7 +4285,7 @@ snapshots:
 
   '@rc-component/portal@1.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -4070,7 +4293,7 @@ snapshots:
 
   '@rc-component/qrcode@1.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -4078,7 +4301,7 @@ snapshots:
 
   '@rc-component/tour@1.15.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/portal': 1.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       '@rc-component/trigger': 2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
@@ -4088,7 +4311,7 @@ snapshots:
 
   '@rc-component/trigger@2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/portal': 1.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -4097,12 +4320,12 @@ snapshots:
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
-  '@rjsf/antd@5.24.9(@ant-design/icons@5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@rjsf/core@5.24.9(@rjsf/utils@5.24.9(react@19.1.0))(react@19.1.0))(@rjsf/utils@5.24.9(react@19.1.0))(antd@5.24.8(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+  '@rjsf/antd@5.24.9(@ant-design/icons@5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@rjsf/core@5.24.9(@rjsf/utils@5.24.9(react@19.1.0))(react@19.1.0))(@rjsf/utils@5.24.9(react@19.1.0))(antd@5.25.1(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
       '@ant-design/icons': 5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       '@rjsf/core': 5.24.9(@rjsf/utils@5.24.9(react@19.1.0))(react@19.1.0)
       '@rjsf/utils': 5.24.9(react@19.1.0)
-      antd: 5.24.8(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      antd: 5.25.1(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       dayjs: 1.11.13
       lodash: 4.17.21
@@ -4139,109 +4362,107 @@ snapshots:
       lodash: 4.17.21
       lodash-es: 4.17.21
 
-  '@rollup/rollup-android-arm-eabi@4.40.1':
+  '@rollup/rollup-android-arm-eabi@4.40.2':
     optional: true
 
-  '@rollup/rollup-android-arm64@4.40.1':
+  '@rollup/rollup-android-arm64@4.40.2':
     optional: true
 
-  '@rollup/rollup-darwin-arm64@4.40.1':
+  '@rollup/rollup-darwin-arm64@4.40.2':
     optional: true
 
-  '@rollup/rollup-darwin-x64@4.40.1':
+  '@rollup/rollup-darwin-x64@4.40.2':
     optional: true
 
-  '@rollup/rollup-freebsd-arm64@4.40.1':
+  '@rollup/rollup-freebsd-arm64@4.40.2':
     optional: true
 
-  '@rollup/rollup-freebsd-x64@4.40.1':
+  '@rollup/rollup-freebsd-x64@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.40.1':
+  '@rollup/rollup-linux-arm-gnueabihf@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-arm-musleabihf@4.40.1':
+  '@rollup/rollup-linux-arm-musleabihf@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-arm64-gnu@4.40.1':
+  '@rollup/rollup-linux-arm64-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-arm64-musl@4.40.1':
+  '@rollup/rollup-linux-arm64-musl@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-loongarch64-gnu@4.40.1':
+  '@rollup/rollup-linux-loongarch64-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.40.1':
+  '@rollup/rollup-linux-powerpc64le-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-riscv64-gnu@4.40.1':
+  '@rollup/rollup-linux-riscv64-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-riscv64-musl@4.40.1':
+  '@rollup/rollup-linux-riscv64-musl@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-s390x-gnu@4.40.1':
+  '@rollup/rollup-linux-s390x-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-x64-gnu@4.40.1':
+  '@rollup/rollup-linux-x64-gnu@4.40.2':
     optional: true
 
-  '@rollup/rollup-linux-x64-musl@4.40.1':
+  '@rollup/rollup-linux-x64-musl@4.40.2':
     optional: true
 
-  '@rollup/rollup-win32-arm64-msvc@4.40.1':
+  '@rollup/rollup-win32-arm64-msvc@4.40.2':
     optional: true
 
-  '@rollup/rollup-win32-ia32-msvc@4.40.1':
+  '@rollup/rollup-win32-ia32-msvc@4.40.2':
     optional: true
 
-  '@rollup/rollup-win32-x64-msvc@4.40.1':
+  '@rollup/rollup-win32-x64-msvc@4.40.2':
     optional: true
 
   '@rtsao/scc@1.1.0': {}
 
   '@standard-schema/utils@0.3.0': {}
 
-  '@tanstack/query-core@5.71.0': {}
+  '@tanstack/query-core@5.75.7': {}
 
-  '@tanstack/query-devtools@5.67.2': {}
+  '@tanstack/query-devtools@5.74.7': {}
 
-  '@tanstack/react-query-devtools@5.71.0(@tanstack/react-query@5.71.0(react@19.1.0))(react@19.1.0)':
+  '@tanstack/react-query-devtools@5.75.7(@tanstack/react-query@5.75.7(react@19.1.0))(react@19.1.0)':
     dependencies:
-      '@tanstack/query-devtools': 5.67.2
-      '@tanstack/react-query': 5.71.0(react@19.1.0)
+      '@tanstack/query-devtools': 5.74.7
+      '@tanstack/react-query': 5.75.7(react@19.1.0)
       react: 19.1.0
 
-  '@tanstack/react-query@5.71.0(react@19.1.0)':
+  '@tanstack/react-query@5.75.7(react@19.1.0)':
     dependencies:
-      '@tanstack/query-core': 5.71.0
+      '@tanstack/query-core': 5.75.7
       react: 19.1.0
 
   '@trysound/sax@0.2.0': {}
 
   '@types/babel__core@7.20.5':
     dependencies:
-      '@babel/parser': 7.26.3
-      '@babel/types': 7.26.3
-      '@types/babel__generator': 7.6.8
+      '@babel/parser': 7.27.2
+      '@babel/types': 7.27.1
+      '@types/babel__generator': 7.27.0
       '@types/babel__template': 7.4.4
-      '@types/babel__traverse': 7.20.6
+      '@types/babel__traverse': 7.20.7
 
-  '@types/babel__generator@7.6.8':
+  '@types/babel__generator@7.27.0':
     dependencies:
-      '@babel/types': 7.26.3
+      '@babel/types': 7.27.1
 
   '@types/babel__template@7.4.4':
     dependencies:
-      '@babel/parser': 7.26.3
-      '@babel/types': 7.26.3
+      '@babel/parser': 7.27.2
+      '@babel/types': 7.27.1
 
-  '@types/babel__traverse@7.20.6':
+  '@types/babel__traverse@7.20.7':
     dependencies:
-      '@babel/types': 7.26.3
-
-  '@types/cookie@0.6.0': {}
+      '@babel/types': 7.27.1
 
   '@types/d3-array@3.2.1': {}
 
@@ -4286,7 +4507,13 @@ snapshots:
 
   '@types/estree@1.0.7': {}
 
-  '@types/git-url-parse@9.0.3': {}
+  '@types/git-up@8.1.0':
+    dependencies:
+      git-up: 8.1.1
+
+  '@types/git-url-parse@16.0.0':
+    dependencies:
+      '@types/git-up': 8.1.0
 
   '@types/json-schema@7.0.15': {}
 
@@ -4294,39 +4521,41 @@ snapshots:
 
   '@types/lodash@4.17.14': {}
 
-  '@types/node@20.17.28':
+  '@types/node@20.17.46':
     dependencies:
       undici-types: 6.19.8
 
-  '@types/node@22.13.14':
+  '@types/node@22.15.17':
     dependencies:
-      undici-types: 6.20.0
+      undici-types: 6.21.0
 
-  '@types/parse-path@7.0.3': {}
+  '@types/parse-path@7.1.0':
+    dependencies:
+      parse-path: 7.1.0
 
-  '@types/react-dom@19.0.4(@types/react@19.0.12)':
+  '@types/react-dom@19.1.3(@types/react@19.1.3)':
     dependencies:
-      '@types/react': 19.0.12
+      '@types/react': 19.1.3
 
   '@types/react-infinite-scroller@1.2.5':
     dependencies:
-      '@types/react': 19.0.12
+      '@types/react': 19.1.3
 
-  '@types/react@19.0.12':
+  '@types/react@19.1.3':
     dependencies:
       csstype: 3.1.3
 
   '@types/semver@7.7.0': {}
 
-  '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
       '@eslint-community/regexpp': 4.12.1
-      '@typescript-eslint/parser': 8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/scope-manager': 8.28.0
-      '@typescript-eslint/type-utils': 8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)
-      '@typescript-eslint/visitor-keys': 8.28.0
-      eslint: 9.23.0(jiti@1.21.7)
+      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/scope-manager': 8.32.0
+      '@typescript-eslint/type-utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.32.0
+      eslint: 9.26.0(jiti@1.21.7)
       graphemer: 1.4.0
       ignore: 5.3.2
       natural-compare: 1.4.0
@@ -4335,40 +4564,40 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/scope-manager': 8.28.0
-      '@typescript-eslint/types': 8.28.0
-      '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.3)
-      '@typescript-eslint/visitor-keys': 8.28.0
+      '@typescript-eslint/scope-manager': 8.32.0
+      '@typescript-eslint/types': 8.32.0
+      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.32.0
       debug: 4.4.0
-      eslint: 9.23.0(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/scope-manager@8.28.0':
+  '@typescript-eslint/scope-manager@8.32.0':
     dependencies:
-      '@typescript-eslint/types': 8.28.0
-      '@typescript-eslint/visitor-keys': 8.28.0
+      '@typescript-eslint/types': 8.32.0
+      '@typescript-eslint/visitor-keys': 8.32.0
 
-  '@typescript-eslint/type-utils@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/type-utils@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
       debug: 4.4.0
-      eslint: 9.23.0(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       ts-api-utils: 2.1.0(typescript@5.8.3)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/types@8.28.0': {}
+  '@typescript-eslint/types@8.32.0': {}
 
-  '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.3)':
+  '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/types': 8.28.0
-      '@typescript-eslint/visitor-keys': 8.28.0
+      '@typescript-eslint/types': 8.32.0
+      '@typescript-eslint/visitor-keys': 8.32.0
       debug: 4.4.0
       fast-glob: 3.3.3
       is-glob: 4.0.3
@@ -4379,85 +4608,85 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)':
+  '@typescript-eslint/utils@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@1.21.7))
-      '@typescript-eslint/scope-manager': 8.28.0
-      '@typescript-eslint/types': 8.28.0
-      '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.3)
-      eslint: 9.23.0(jiti@1.21.7)
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@1.21.7))
+      '@typescript-eslint/scope-manager': 8.32.0
+      '@typescript-eslint/types': 8.32.0
+      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3)
+      eslint: 9.26.0(jiti@1.21.7)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/visitor-keys@8.28.0':
+  '@typescript-eslint/visitor-keys@8.32.0':
     dependencies:
-      '@typescript-eslint/types': 8.28.0
+      '@typescript-eslint/types': 8.32.0
       eslint-visitor-keys: 4.2.0
 
-  '@vitejs/plugin-react@4.3.4(vite@6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1))':
+  '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1))':
     dependencies:
-      '@babel/core': 7.26.0
-      '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
-      '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
+      '@babel/core': 7.27.1
+      '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1)
+      '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1)
       '@types/babel__core': 7.20.5
-      react-refresh: 0.14.2
-      vite: 6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)
+      react-refresh: 0.17.0
+      vite: 6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)
     transitivePeerDependencies:
       - supports-color
 
-  '@vitest/expect@3.0.9':
+  '@vitest/expect@3.1.3':
     dependencies:
-      '@vitest/spy': 3.0.9
-      '@vitest/utils': 3.0.9
+      '@vitest/spy': 3.1.3
+      '@vitest/utils': 3.1.3
       chai: 5.2.0
       tinyrainbow: 2.0.0
 
-  '@vitest/mocker@3.0.9(vite@6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1))':
+  '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1))':
     dependencies:
-      '@vitest/spy': 3.0.9
+      '@vitest/spy': 3.1.3
       estree-walker: 3.0.3
       magic-string: 0.30.17
     optionalDependencies:
-      vite: 6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)
 
-  '@vitest/pretty-format@3.0.9':
+  '@vitest/pretty-format@3.1.3':
     dependencies:
       tinyrainbow: 2.0.0
 
-  '@vitest/runner@3.0.9':
+  '@vitest/runner@3.1.3':
     dependencies:
-      '@vitest/utils': 3.0.9
+      '@vitest/utils': 3.1.3
       pathe: 2.0.3
 
-  '@vitest/snapshot@3.0.9':
+  '@vitest/snapshot@3.1.3':
     dependencies:
-      '@vitest/pretty-format': 3.0.9
+      '@vitest/pretty-format': 3.1.3
       magic-string: 0.30.17
       pathe: 2.0.3
 
-  '@vitest/spy@3.0.9':
+  '@vitest/spy@3.1.3':
     dependencies:
       tinyspy: 3.0.2
 
-  '@vitest/utils@3.0.9':
+  '@vitest/utils@3.1.3':
     dependencies:
-      '@vitest/pretty-format': 3.0.9
+      '@vitest/pretty-format': 3.1.3
       loupe: 3.1.3
       tinyrainbow: 2.0.0
 
-  '@xyflow/react@12.5.1(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+  '@xyflow/react@12.6.0(@types/react@19.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
     dependencies:
-      '@xyflow/system': 0.0.53
+      '@xyflow/system': 0.0.57
       classcat: 5.0.5
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
-      zustand: 4.5.6(@types/react@19.0.12)(react@19.1.0)
+      zustand: 4.5.6(@types/react@19.1.3)(react@19.1.0)
     transitivePeerDependencies:
       - '@types/react'
       - immer
 
-  '@xyflow/system@0.0.53':
+  '@xyflow/system@0.0.57':
     dependencies:
       '@types/d3-drag': 3.0.7
       '@types/d3-selection': 3.0.11
@@ -4467,6 +4696,11 @@ snapshots:
       d3-selection: 3.0.0
       d3-zoom: 3.0.0
 
+  accepts@2.0.0:
+    dependencies:
+      mime-types: 3.0.1
+      negotiator: 1.0.0
+
   acorn-jsx@5.3.2(acorn@8.14.1):
     dependencies:
       acorn: 8.14.1
@@ -4501,7 +4735,7 @@ snapshots:
 
   ansi-styles@6.2.1: {}
 
-  antd@5.24.8(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+  antd@5.25.1(date-fns@4.1.0)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
       '@ant-design/colors': 7.2.0
       '@ant-design/cssinjs': 1.23.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -4509,7 +4743,7 @@ snapshots:
       '@ant-design/fast-color': 2.0.6
       '@ant-design/icons': 5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       '@ant-design/react-slick': 1.1.2(react@19.1.0)
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/color-picker': 2.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       '@rc-component/mutate-observer': 1.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       '@rc-component/qrcode': 1.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -4518,14 +4752,14 @@ snapshots:
       classnames: 2.5.1
       copy-to-clipboard: 3.3.3
       dayjs: 1.11.13
-      rc-cascader: 3.33.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-cascader: 3.34.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-checkbox: 3.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-collapse: 3.9.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-dialog: 9.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-drawer: 7.2.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-dropdown: 4.2.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-field-form: 2.7.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-      rc-image: 7.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-image: 7.12.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-input: 1.8.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-input-number: 9.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-mentions: 2.20.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -4538,17 +4772,17 @@ snapshots:
       rc-rate: 2.13.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-resize-observer: 1.4.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-segmented: 2.7.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-      rc-select: 14.16.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-select: 14.16.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-slider: 11.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-steps: 6.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-switch: 4.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-table: 7.50.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-      rc-tabs: 15.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-tabs: 15.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-textarea: 1.10.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-tooltip: 6.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-tree: 5.13.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-tree-select: 5.27.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-      rc-upload: 4.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-upload: 4.9.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
@@ -4656,6 +4890,20 @@ snapshots:
 
   binary-extensions@2.3.0: {}
 
+  body-parser@2.2.0:
+    dependencies:
+      bytes: 3.1.2
+      content-type: 1.0.5
+      debug: 4.4.0
+      http-errors: 2.0.0
+      iconv-lite: 0.6.3
+      on-finished: 2.4.1
+      qs: 6.14.0
+      raw-body: 3.0.0
+      type-is: 2.0.1
+    transitivePeerDependencies:
+      - supports-color
+
   boolbase@1.0.0: {}
 
   brace-expansion@1.1.11:
@@ -4678,12 +4926,16 @@ snapshots:
       node-releases: 2.0.19
       update-browserslist-db: 1.1.3(browserslist@4.24.4)
 
-  cac@6.7.14: {}
-
-  call-bind-apply-helpers@1.0.1:
+  browserslist@4.24.5:
     dependencies:
-      es-errors: 1.3.0
-      function-bind: 1.1.2
+      caniuse-lite: 1.0.30001717
+      electron-to-chromium: 1.5.151
+      node-releases: 2.0.19
+      update-browserslist-db: 1.1.3(browserslist@4.24.5)
+
+  bytes@3.1.2: {}
+
+  cac@6.7.14: {}
 
   call-bind-apply-helpers@1.0.2:
     dependencies:
@@ -4692,16 +4944,11 @@ snapshots:
 
   call-bind@1.0.8:
     dependencies:
-      call-bind-apply-helpers: 1.0.1
+      call-bind-apply-helpers: 1.0.2
       es-define-property: 1.0.1
-      get-intrinsic: 1.2.7
+      get-intrinsic: 1.3.0
       set-function-length: 1.2.2
 
-  call-bound@1.0.3:
-    dependencies:
-      call-bind-apply-helpers: 1.0.1
-      get-intrinsic: 1.2.7
-
   call-bound@1.0.4:
     dependencies:
       call-bind-apply-helpers: 1.0.2
@@ -4720,6 +4967,8 @@ snapshots:
 
   caniuse-lite@1.0.30001705: {}
 
+  caniuse-lite@1.0.30001717: {}
+
   chai@5.2.0:
     dependencies:
       assertion-error: 2.0.1
@@ -4788,8 +5037,18 @@ snapshots:
 
   concat-map@0.0.1: {}
 
+  content-disposition@1.0.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  content-type@1.0.5: {}
+
   convert-source-map@2.0.0: {}
 
+  cookie-signature@1.2.2: {}
+
+  cookie@0.7.2: {}
+
   cookie@1.0.2: {}
 
   copy-anything@2.0.6:
@@ -4800,6 +5059,11 @@ snapshots:
     dependencies:
       toggle-selection: 1.0.6
 
+  cors@2.8.5:
+    dependencies:
+      object-assign: 4.1.1
+      vary: 1.1.2
+
   cross-spawn@7.0.6:
     dependencies:
       path-key: 3.1.1
@@ -4966,7 +5230,7 @@ snapshots:
 
   date-fns@2.30.0:
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
 
   date-fns@4.1.0: {}
 
@@ -4998,6 +5262,8 @@ snapshots:
       has-property-descriptors: 1.0.2
       object-keys: 1.1.1
 
+  depd@2.0.0: {}
+
   didyoumean@1.2.2: {}
 
   dlv@1.1.3: {}
@@ -5010,7 +5276,7 @@ snapshots:
 
   dom-helpers@5.2.1:
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       csstype: 3.1.3
 
   dom-serializer@2.0.0:
@@ -5039,12 +5305,18 @@ snapshots:
 
   eastasianwidth@0.2.0: {}
 
+  ee-first@1.1.1: {}
+
   electron-to-chromium@1.5.119: {}
 
+  electron-to-chromium@1.5.151: {}
+
   emoji-regex@8.0.0: {}
 
   emoji-regex@9.2.2: {}
 
+  encodeurl@2.0.0: {}
+
   entities@4.5.0: {}
 
   errno@0.1.8:
@@ -5129,7 +5401,7 @@ snapshots:
       iterator.prototype: 1.1.5
       safe-array-concat: 1.1.3
 
-  es-module-lexer@1.6.0: {}
+  es-module-lexer@1.7.0: {}
 
   es-object-atoms@1.0.0:
     dependencies:
@@ -5160,41 +5432,43 @@ snapshots:
       is-date-object: 1.1.0
       is-symbol: 1.1.1
 
-  esbuild@0.25.3:
+  esbuild@0.25.4:
     optionalDependencies:
-      '@esbuild/aix-ppc64': 0.25.3
-      '@esbuild/android-arm': 0.25.3
-      '@esbuild/android-arm64': 0.25.3
-      '@esbuild/android-x64': 0.25.3
-      '@esbuild/darwin-arm64': 0.25.3
-      '@esbuild/darwin-x64': 0.25.3
-      '@esbuild/freebsd-arm64': 0.25.3
-      '@esbuild/freebsd-x64': 0.25.3
-      '@esbuild/linux-arm': 0.25.3
-      '@esbuild/linux-arm64': 0.25.3
-      '@esbuild/linux-ia32': 0.25.3
-      '@esbuild/linux-loong64': 0.25.3
-      '@esbuild/linux-mips64el': 0.25.3
-      '@esbuild/linux-ppc64': 0.25.3
-      '@esbuild/linux-riscv64': 0.25.3
-      '@esbuild/linux-s390x': 0.25.3
-      '@esbuild/linux-x64': 0.25.3
-      '@esbuild/netbsd-arm64': 0.25.3
-      '@esbuild/netbsd-x64': 0.25.3
-      '@esbuild/openbsd-arm64': 0.25.3
-      '@esbuild/openbsd-x64': 0.25.3
-      '@esbuild/sunos-x64': 0.25.3
-      '@esbuild/win32-arm64': 0.25.3
-      '@esbuild/win32-ia32': 0.25.3
-      '@esbuild/win32-x64': 0.25.3
+      '@esbuild/aix-ppc64': 0.25.4
+      '@esbuild/android-arm': 0.25.4
+      '@esbuild/android-arm64': 0.25.4
+      '@esbuild/android-x64': 0.25.4
+      '@esbuild/darwin-arm64': 0.25.4
+      '@esbuild/darwin-x64': 0.25.4
+      '@esbuild/freebsd-arm64': 0.25.4
+      '@esbuild/freebsd-x64': 0.25.4
+      '@esbuild/linux-arm': 0.25.4
+      '@esbuild/linux-arm64': 0.25.4
+      '@esbuild/linux-ia32': 0.25.4
+      '@esbuild/linux-loong64': 0.25.4
+      '@esbuild/linux-mips64el': 0.25.4
+      '@esbuild/linux-ppc64': 0.25.4
+      '@esbuild/linux-riscv64': 0.25.4
+      '@esbuild/linux-s390x': 0.25.4
+      '@esbuild/linux-x64': 0.25.4
+      '@esbuild/netbsd-arm64': 0.25.4
+      '@esbuild/netbsd-x64': 0.25.4
+      '@esbuild/openbsd-arm64': 0.25.4
+      '@esbuild/openbsd-x64': 0.25.4
+      '@esbuild/sunos-x64': 0.25.4
+      '@esbuild/win32-arm64': 0.25.4
+      '@esbuild/win32-ia32': 0.25.4
+      '@esbuild/win32-x64': 0.25.4
 
   escalade@3.2.0: {}
 
+  escape-html@1.0.3: {}
+
   escape-string-regexp@4.0.0: {}
 
-  eslint-config-prettier@10.1.2(eslint@9.23.0(jiti@1.21.7)):
+  eslint-config-prettier@10.1.2(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
-      eslint: 9.23.0(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
 
   eslint-import-resolver-node@0.3.9:
     dependencies:
@@ -5204,17 +5478,17 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.23.0(jiti@1.21.7)):
+  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
-      '@typescript-eslint/parser': 8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)
-      eslint: 9.23.0(jiti@1.21.7)
+      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
+      eslint: 9.26.0(jiti@1.21.7)
       eslint-import-resolver-node: 0.3.9
     transitivePeerDependencies:
       - supports-color
 
-  eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.23.0(jiti@1.21.7)):
+  eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       '@rtsao/scc': 1.1.0
       array-includes: 3.1.8
@@ -5223,9 +5497,9 @@ snapshots:
       array.prototype.flatmap: 1.3.3
       debug: 3.2.7
       doctrine: 2.1.0
-      eslint: 9.23.0(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.23.0(jiti@1.21.7))
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0(jiti@1.21.7))
       hasown: 2.0.2
       is-core-module: 2.16.1
       is-glob: 4.0.3
@@ -5237,26 +5511,26 @@ snapshots:
       string.prototype.trimend: 1.0.9
       tsconfig-paths: 3.15.0
     optionalDependencies:
-      '@typescript-eslint/parser': 8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.8.3)
     transitivePeerDependencies:
       - eslint-import-resolver-typescript
       - eslint-import-resolver-webpack
       - supports-color
 
-  eslint-plugin-prettier@5.2.6(eslint-config-prettier@10.1.2(eslint@9.23.0(jiti@1.21.7)))(eslint@9.23.0(jiti@1.21.7))(prettier@3.5.3):
+  eslint-plugin-prettier@5.4.0(eslint-config-prettier@10.1.2(eslint@9.26.0(jiti@1.21.7)))(eslint@9.26.0(jiti@1.21.7))(prettier@3.5.3):
     dependencies:
-      eslint: 9.23.0(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       prettier: 3.5.3
       prettier-linter-helpers: 1.0.0
       synckit: 0.11.4
     optionalDependencies:
-      eslint-config-prettier: 10.1.2(eslint@9.23.0(jiti@1.21.7))
+      eslint-config-prettier: 10.1.2(eslint@9.26.0(jiti@1.21.7))
 
-  eslint-plugin-react-refresh@0.4.20(eslint@9.23.0(jiti@1.21.7)):
+  eslint-plugin-react-refresh@0.4.20(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
-      eslint: 9.23.0(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
 
-  eslint-plugin-react@7.37.5(eslint@9.23.0(jiti@1.21.7)):
+  eslint-plugin-react@7.37.5(eslint@9.26.0(jiti@1.21.7)):
     dependencies:
       array-includes: 3.1.8
       array.prototype.findlast: 1.2.5
@@ -5264,7 +5538,7 @@ snapshots:
       array.prototype.tosorted: 1.1.4
       doctrine: 2.1.0
       es-iterator-helpers: 1.2.1
-      eslint: 9.23.0(jiti@1.21.7)
+      eslint: 9.26.0(jiti@1.21.7)
       estraverse: 5.3.0
       hasown: 2.0.2
       jsx-ast-utils: 3.3.5
@@ -5287,19 +5561,20 @@ snapshots:
 
   eslint-visitor-keys@4.2.0: {}
 
-  eslint@9.23.0(jiti@1.21.7):
+  eslint@9.26.0(jiti@1.21.7):
     dependencies:
-      '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@1.21.7))
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@1.21.7))
       '@eslint-community/regexpp': 4.12.1
-      '@eslint/config-array': 0.19.2
-      '@eslint/config-helpers': 0.2.0
-      '@eslint/core': 0.12.0
+      '@eslint/config-array': 0.20.0
+      '@eslint/config-helpers': 0.2.2
+      '@eslint/core': 0.13.0
       '@eslint/eslintrc': 3.3.1
-      '@eslint/js': 9.23.0
-      '@eslint/plugin-kit': 0.2.7
+      '@eslint/js': 9.26.0
+      '@eslint/plugin-kit': 0.2.8
       '@humanfs/node': 0.16.6
       '@humanwhocodes/module-importer': 1.0.1
-      '@humanwhocodes/retry': 0.4.2
+      '@humanwhocodes/retry': 0.4.3
+      '@modelcontextprotocol/sdk': 1.11.1
       '@types/estree': 1.0.7
       '@types/json-schema': 7.0.15
       ajv: 6.12.6
@@ -5324,6 +5599,7 @@ snapshots:
       minimatch: 3.1.2
       natural-compare: 1.4.0
       optionator: 0.9.4
+      zod: 3.24.3
     optionalDependencies:
       jiti: 1.21.7
     transitivePeerDependencies:
@@ -5351,9 +5627,53 @@ snapshots:
 
   esutils@2.0.3: {}
 
+  etag@1.8.1: {}
+
   eventemitter3@4.0.7: {}
 
-  expect-type@1.2.0: {}
+  eventsource-parser@3.0.1: {}
+
+  eventsource@3.0.7:
+    dependencies:
+      eventsource-parser: 3.0.1
+
+  expect-type@1.2.1: {}
+
+  express-rate-limit@7.5.0(express@5.1.0):
+    dependencies:
+      express: 5.1.0
+
+  express@5.1.0:
+    dependencies:
+      accepts: 2.0.0
+      body-parser: 2.2.0
+      content-disposition: 1.0.0
+      content-type: 1.0.5
+      cookie: 0.7.2
+      cookie-signature: 1.2.2
+      debug: 4.4.0
+      encodeurl: 2.0.0
+      escape-html: 1.0.3
+      etag: 1.8.1
+      finalhandler: 2.1.0
+      fresh: 2.0.0
+      http-errors: 2.0.0
+      merge-descriptors: 2.0.0
+      mime-types: 3.0.1
+      on-finished: 2.4.1
+      once: 1.4.0
+      parseurl: 1.3.3
+      proxy-addr: 2.0.7
+      qs: 6.14.0
+      range-parser: 1.2.1
+      router: 2.2.0
+      send: 1.2.0
+      serve-static: 2.2.0
+      statuses: 2.0.1
+      type-is: 2.0.1
+      vary: 1.1.2
+    transitivePeerDependencies:
+      - supports-color
 
   fast-deep-equal@3.1.3: {}
 
@@ -5379,6 +5699,10 @@ snapshots:
     dependencies:
       reusify: 1.0.4
 
+  fdir@6.4.4(picomatch@4.0.2):
+    optionalDependencies:
+      picomatch: 4.0.2
+
   file-entry-cache@8.0.0:
     dependencies:
       flat-cache: 4.0.1
@@ -5387,6 +5711,17 @@ snapshots:
     dependencies:
       to-regex-range: 5.0.1
 
+  finalhandler@2.1.0:
+    dependencies:
+      debug: 4.4.0
+      encodeurl: 2.0.0
+      escape-html: 1.0.3
+      on-finished: 2.4.1
+      parseurl: 1.3.3
+      statuses: 2.0.1
+    transitivePeerDependencies:
+      - supports-color
+
   find-up@5.0.0:
     dependencies:
       locate-path: 6.0.0
@@ -5408,8 +5743,12 @@ snapshots:
       cross-spawn: 7.0.6
       signal-exit: 4.1.0
 
+  forwarded@0.2.0: {}
+
   fraction.js@4.3.7: {}
 
+  fresh@2.0.0: {}
+
   fs-extra@10.1.0:
     dependencies:
       graceful-fs: 4.2.11
@@ -5436,19 +5775,6 @@ snapshots:
 
   get-caller-file@2.0.5: {}
 
-  get-intrinsic@1.2.7:
-    dependencies:
-      call-bind-apply-helpers: 1.0.2
-      es-define-property: 1.0.1
-      es-errors: 1.3.0
-      es-object-atoms: 1.1.1
-      function-bind: 1.1.2
-      get-proto: 1.0.1
-      gopd: 1.2.0
-      has-symbols: 1.1.0
-      hasown: 2.0.2
-      math-intrinsics: 1.1.0
-
   get-intrinsic@1.3.0:
     dependencies:
       call-bind-apply-helpers: 1.0.2
@@ -5473,14 +5799,14 @@ snapshots:
       es-errors: 1.3.0
       get-intrinsic: 1.3.0
 
-  git-up@8.0.1:
+  git-up@8.1.1:
     dependencies:
       is-ssh: 1.4.1
       parse-url: 9.2.0
 
-  git-url-parse@16.0.1:
+  git-url-parse@16.1.0:
     dependencies:
-      git-up: 8.0.1
+      git-up: 8.1.1
 
   glob-parent@5.1.2:
     dependencies:
@@ -5503,7 +5829,7 @@ snapshots:
 
   globals@14.0.0: {}
 
-  globals@16.0.0: {}
+  globals@16.1.0: {}
 
   globalthis@1.0.4:
     dependencies:
@@ -5542,10 +5868,17 @@ snapshots:
     dependencies:
       function-bind: 1.1.2
 
+  http-errors@2.0.0:
+    dependencies:
+      depd: 2.0.0
+      inherits: 2.0.4
+      setprototypeof: 1.2.0
+      statuses: 2.0.1
+      toidentifier: 1.0.1
+
   iconv-lite@0.6.3:
     dependencies:
       safer-buffer: 2.1.2
-    optional: true
 
   ignore@5.3.2: {}
 
@@ -5559,6 +5892,8 @@ snapshots:
 
   imurmurhash@0.1.4: {}
 
+  inherits@2.0.4: {}
+
   internal-slot@1.1.0:
     dependencies:
       es-errors: 1.3.0
@@ -5567,6 +5902,8 @@ snapshots:
 
   internmap@2.0.3: {}
 
+  ipaddr.js@1.9.1: {}
+
   is-array-buffer@3.0.5:
     dependencies:
       call-bind: 1.0.8
@@ -5639,6 +5976,8 @@ snapshots:
 
   is-number@7.0.0: {}
 
+  is-promise@4.0.0: {}
+
   is-regex@1.2.1:
     dependencies:
       call-bound: 1.0.4
@@ -5731,10 +6070,10 @@ snapshots:
 
   json-stable-stringify-without-jsonify@1.0.1: {}
 
-  json-stable-stringify@1.2.1:
+  json-stable-stringify@1.3.0:
     dependencies:
       call-bind: 1.0.8
-      call-bound: 1.0.3
+      call-bound: 1.0.4
       isarray: 2.0.5
       jsonify: 0.0.1
       object-keys: 1.1.1
@@ -5772,7 +6111,7 @@ snapshots:
     dependencies:
       json-buffer: 3.0.1
 
-  less@4.2.2:
+  less@4.3.0:
     dependencies:
       copy-anything: 2.0.6
       parse-node-version: 1.0.1
@@ -5841,6 +6180,10 @@ snapshots:
 
   mdn-data@2.0.30: {}
 
+  media-typer@1.1.0: {}
+
+  merge-descriptors@2.0.0: {}
+
   merge2@1.4.1: {}
 
   micromatch@4.0.8:
@@ -5848,6 +6191,12 @@ snapshots:
       braces: 3.0.3
       picomatch: 2.3.1
 
+  mime-db@1.54.0: {}
+
+  mime-types@3.0.1:
+    dependencies:
+      mime-db: 1.54.0
+
   mime@1.6.0:
     optional: true
 
@@ -5885,7 +6234,7 @@ snapshots:
     dependencies:
       monaco-editor: 0.52.2
 
-  monaco-yaml@5.3.1(monaco-editor@0.52.2):
+  monaco-yaml@5.4.0(monaco-editor@0.52.2):
     dependencies:
       jsonc-parser: 3.3.1
       monaco-editor: 0.52.2
@@ -5918,6 +6267,8 @@ snapshots:
       sax: 1.4.1
     optional: true
 
+  negotiator@1.0.0: {}
+
   node-releases@2.0.19: {}
 
   normalize-path@3.0.0: {}
@@ -5928,7 +6279,7 @@ snapshots:
     dependencies:
       boolbase: 1.0.0
 
-  oauth4webapi@3.3.2: {}
+  oauth4webapi@3.5.1: {}
 
   object-assign@4.1.1: {}
 
@@ -5974,6 +6325,14 @@ snapshots:
       define-properties: 1.2.1
       es-object-atoms: 1.1.1
 
+  on-finished@2.4.1:
+    dependencies:
+      ee-first: 1.1.1
+
+  once@1.4.0:
+    dependencies:
+      wrappy: 1.0.2
+
   openapi-typescript@5.4.2:
     dependencies:
       js-yaml: 4.1.0
@@ -6014,14 +6373,16 @@ snapshots:
 
   parse-node-version@1.0.1: {}
 
-  parse-path@7.0.1:
+  parse-path@7.1.0:
     dependencies:
       protocols: 2.0.2
 
   parse-url@9.2.0:
     dependencies:
-      '@types/parse-path': 7.0.3
-      parse-path: 7.0.1
+      '@types/parse-path': 7.1.0
+      parse-path: 7.1.0
+
+  parseurl@1.3.3: {}
 
   path-browserify@1.0.1: {}
 
@@ -6036,6 +6397,8 @@ snapshots:
       lru-cache: 10.4.3
       minipass: 7.1.2
 
+  path-to-regexp@8.2.0: {}
+
   pathe@2.0.3: {}
 
   pathval@2.0.0: {}
@@ -6044,6 +6407,8 @@ snapshots:
 
   picomatch@2.3.1: {}
 
+  picomatch@4.0.2: {}
+
   pify@2.3.0: {}
 
   pify@4.0.1:
@@ -6051,6 +6416,8 @@ snapshots:
 
   pirates@4.0.6: {}
 
+  pkce-challenge@5.0.0: {}
+
   possible-typed-array-names@1.1.0: {}
 
   postcss-calc@10.0.2(postcss@8.5.3):
@@ -6257,16 +6624,34 @@ snapshots:
 
   protocols@2.0.2: {}
 
+  proxy-addr@2.0.7:
+    dependencies:
+      forwarded: 0.2.0
+      ipaddr.js: 1.9.1
+
   prr@1.0.1:
     optional: true
 
   punycode@2.3.1: {}
 
+  qs@6.14.0:
+    dependencies:
+      side-channel: 1.1.0
+
   queue-microtask@1.2.3: {}
 
+  range-parser@1.2.1: {}
+
+  raw-body@3.0.0:
+    dependencies:
+      bytes: 3.1.2
+      http-errors: 2.0.0
+      iconv-lite: 0.6.3
+      unpipe: 1.0.0
+
   rc-align@4.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       dom-align: 1.12.4
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6274,11 +6659,11 @@ snapshots:
       react-dom: 19.1.0(react@19.1.0)
       resize-observer-polyfill: 1.5.1
 
-  rc-cascader@3.33.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+  rc-cascader@3.34.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
-      rc-select: 14.16.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-select: 14.16.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-tree: 5.13.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6286,7 +6671,7 @@ snapshots:
 
   rc-checkbox@3.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6294,7 +6679,7 @@ snapshots:
 
   rc-collapse@3.9.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6303,7 +6688,7 @@ snapshots:
 
   rc-dialog@9.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/portal': 1.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6313,7 +6698,7 @@ snapshots:
 
   rc-drawer@7.2.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/portal': 1.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6323,7 +6708,7 @@ snapshots:
 
   rc-dropdown@4.2.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/trigger': 2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6332,15 +6717,15 @@ snapshots:
 
   rc-field-form@2.7.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/async-validator': 5.0.4
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
-  rc-image@7.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+  rc-image@7.12.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/portal': 1.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-dialog: 9.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6351,7 +6736,7 @@ snapshots:
 
   rc-input-number@9.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/mini-decimal': 1.1.0
       classnames: 2.5.1
       rc-input: 1.8.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6361,7 +6746,7 @@ snapshots:
 
   rc-input@1.8.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6369,7 +6754,7 @@ snapshots:
 
   rc-mentions@2.20.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/trigger': 2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-input: 1.8.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6381,7 +6766,7 @@ snapshots:
 
   rc-menu@9.16.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/trigger': 2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6392,7 +6777,7 @@ snapshots:
 
   rc-motion@2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6400,7 +6785,7 @@ snapshots:
 
   rc-notification@5.6.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6409,7 +6794,7 @@ snapshots:
 
   rc-overflow@1.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-resize-observer: 1.4.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6418,7 +6803,7 @@ snapshots:
 
   rc-pagination@5.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6426,7 +6811,7 @@ snapshots:
 
   rc-picker@2.7.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       date-fns: 2.30.0
       dayjs: 1.11.13
@@ -6439,7 +6824,7 @@ snapshots:
 
   rc-picker@4.11.3(date-fns@4.1.0)(dayjs@1.11.13)(moment@2.30.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/trigger': 2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-overflow: 1.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6454,7 +6839,7 @@ snapshots:
 
   rc-progress@4.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6462,7 +6847,7 @@ snapshots:
 
   rc-rate@2.13.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6470,7 +6855,7 @@ snapshots:
 
   rc-resize-observer@1.4.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6479,28 +6864,28 @@ snapshots:
 
   rc-segmented@2.7.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
-  rc-select@14.16.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+  rc-select@14.16.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/trigger': 2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-overflow: 1.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-      rc-virtual-list: 3.18.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-virtual-list: 3.18.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
   rc-slider@11.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6508,7 +6893,7 @@ snapshots:
 
   rc-steps@6.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6516,7 +6901,7 @@ snapshots:
 
   rc-switch@4.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6524,18 +6909,18 @@ snapshots:
 
   rc-table@7.50.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/context': 1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-resize-observer: 1.4.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-      rc-virtual-list: 3.18.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-virtual-list: 3.18.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
-  rc-tabs@15.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+  rc-tabs@15.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-dropdown: 4.2.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-menu: 9.16.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6547,7 +6932,7 @@ snapshots:
 
   rc-textarea@1.10.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-input: 1.8.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-resize-observer: 1.4.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6557,7 +6942,7 @@ snapshots:
 
   rc-tooltip@6.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       '@rc-component/trigger': 2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6566,9 +6951,9 @@ snapshots:
 
   rc-tree-select@5.27.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
-      rc-select: 14.16.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-select: 14.16.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-tree: 5.13.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6576,17 +6961,17 @@ snapshots:
 
   rc-tree@5.13.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-      rc-virtual-list: 3.18.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      rc-virtual-list: 3.18.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
   rc-trigger@5.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-align: 4.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-motion: 2.9.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6594,9 +6979,9 @@ snapshots:
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
 
-  rc-upload@4.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+  rc-upload@4.9.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       react: 19.1.0
@@ -6604,14 +6989,14 @@ snapshots:
 
   rc-util@5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
       react-is: 18.3.1
 
-  rc-virtual-list@3.18.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+  rc-virtual-list@3.18.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       classnames: 2.5.1
       rc-resize-observer: 1.4.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       rc-util: 5.44.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -6623,7 +7008,7 @@ snapshots:
       react: 19.1.0
       scheduler: 0.26.0
 
-  react-hook-form@7.55.0(react@19.1.0):
+  react-hook-form@7.56.3(react@19.1.0):
     dependencies:
       react: 19.1.0
 
@@ -6631,21 +7016,19 @@ snapshots:
 
   react-is@18.3.1: {}
 
-  react-refresh@0.14.2: {}
+  react-refresh@0.17.0: {}
 
-  react-router-dom@7.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+  react-router-dom@7.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
       react: 19.1.0
       react-dom: 19.1.0(react@19.1.0)
-      react-router: 7.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+      react-router: 7.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
 
-  react-router@7.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+  react-router@7.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@types/cookie': 0.6.0
       cookie: 1.0.2
       react: 19.1.0
       set-cookie-parser: 2.7.1
-      turbo-stream: 2.4.0
     optionalDependencies:
       react-dom: 19.1.0(react@19.1.0)
 
@@ -6659,7 +7042,7 @@ snapshots:
 
   react-transition-group@4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
     dependencies:
-      '@babel/runtime': 7.27.0
+      '@babel/runtime': 7.27.1
       dom-helpers: 5.2.1
       loose-envify: 1.4.0
       prop-types: 15.8.1
@@ -6704,8 +7087,6 @@ snapshots:
       get-proto: 1.0.1
       which-builtin-type: 1.2.1
 
-  regenerator-runtime@0.14.1: {}
-
   regexp.prototype.flags@1.5.4:
     dependencies:
       call-bind: 1.0.8
@@ -6737,32 +7118,42 @@ snapshots:
 
   reusify@1.0.4: {}
 
-  rollup@4.40.1:
+  rollup@4.40.2:
     dependencies:
       '@types/estree': 1.0.7
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.40.1
-      '@rollup/rollup-android-arm64': 4.40.1
-      '@rollup/rollup-darwin-arm64': 4.40.1
-      '@rollup/rollup-darwin-x64': 4.40.1
-      '@rollup/rollup-freebsd-arm64': 4.40.1
-      '@rollup/rollup-freebsd-x64': 4.40.1
-      '@rollup/rollup-linux-arm-gnueabihf': 4.40.1
-      '@rollup/rollup-linux-arm-musleabihf': 4.40.1
-      '@rollup/rollup-linux-arm64-gnu': 4.40.1
-      '@rollup/rollup-linux-arm64-musl': 4.40.1
-      '@rollup/rollup-linux-loongarch64-gnu': 4.40.1
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.40.1
-      '@rollup/rollup-linux-riscv64-gnu': 4.40.1
-      '@rollup/rollup-linux-riscv64-musl': 4.40.1
-      '@rollup/rollup-linux-s390x-gnu': 4.40.1
-      '@rollup/rollup-linux-x64-gnu': 4.40.1
-      '@rollup/rollup-linux-x64-musl': 4.40.1
-      '@rollup/rollup-win32-arm64-msvc': 4.40.1
-      '@rollup/rollup-win32-ia32-msvc': 4.40.1
-      '@rollup/rollup-win32-x64-msvc': 4.40.1
+      '@rollup/rollup-android-arm-eabi': 4.40.2
+      '@rollup/rollup-android-arm64': 4.40.2
+      '@rollup/rollup-darwin-arm64': 4.40.2
+      '@rollup/rollup-darwin-x64': 4.40.2
+      '@rollup/rollup-freebsd-arm64': 4.40.2
+      '@rollup/rollup-freebsd-x64': 4.40.2
+      '@rollup/rollup-linux-arm-gnueabihf': 4.40.2
+      '@rollup/rollup-linux-arm-musleabihf': 4.40.2
+      '@rollup/rollup-linux-arm64-gnu': 4.40.2
+      '@rollup/rollup-linux-arm64-musl': 4.40.2
+      '@rollup/rollup-linux-loongarch64-gnu': 4.40.2
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2
+      '@rollup/rollup-linux-riscv64-gnu': 4.40.2
+      '@rollup/rollup-linux-riscv64-musl': 4.40.2
+      '@rollup/rollup-linux-s390x-gnu': 4.40.2
+      '@rollup/rollup-linux-x64-gnu': 4.40.2
+      '@rollup/rollup-linux-x64-musl': 4.40.2
+      '@rollup/rollup-win32-arm64-msvc': 4.40.2
+      '@rollup/rollup-win32-ia32-msvc': 4.40.2
+      '@rollup/rollup-win32-x64-msvc': 4.40.2
       fsevents: 2.3.3
 
+  router@2.2.0:
+    dependencies:
+      debug: 4.4.0
+      depd: 2.0.0
+      is-promise: 4.0.0
+      parseurl: 1.3.3
+      path-to-regexp: 8.2.0
+    transitivePeerDependencies:
+      - supports-color
+
   run-parallel@1.2.0:
     dependencies:
       queue-microtask: 1.2.3
@@ -6775,6 +7166,8 @@ snapshots:
       has-symbols: 1.1.0
       isarray: 2.0.5
 
+  safe-buffer@5.2.1: {}
+
   safe-push-apply@1.0.0:
     dependencies:
       es-errors: 1.3.0
@@ -6786,8 +7179,7 @@ snapshots:
       es-errors: 1.3.0
       is-regex: 1.2.1
 
-  safer-buffer@2.1.2:
-    optional: true
+  safer-buffer@2.1.2: {}
 
   sax@1.4.1:
     optional: true
@@ -6805,6 +7197,31 @@ snapshots:
 
   semver@7.7.1: {}
 
+  send@1.2.0:
+    dependencies:
+      debug: 4.4.0
+      encodeurl: 2.0.0
+      escape-html: 1.0.3
+      etag: 1.8.1
+      fresh: 2.0.0
+      http-errors: 2.0.0
+      mime-types: 3.0.1
+      ms: 2.1.3
+      on-finished: 2.4.1
+      range-parser: 1.2.1
+      statuses: 2.0.1
+    transitivePeerDependencies:
+      - supports-color
+
+  serve-static@2.2.0:
+    dependencies:
+      encodeurl: 2.0.0
+      escape-html: 1.0.3
+      parseurl: 1.3.3
+      send: 1.2.0
+    transitivePeerDependencies:
+      - supports-color
+
   set-cookie-parser@2.7.1: {}
 
   set-function-length@1.2.2:
@@ -6812,7 +7229,7 @@ snapshots:
       define-data-property: 1.1.4
       es-errors: 1.3.0
       function-bind: 1.1.2
-      get-intrinsic: 1.2.7
+      get-intrinsic: 1.3.0
       gopd: 1.2.0
       has-property-descriptors: 1.0.2
 
@@ -6829,6 +7246,8 @@ snapshots:
       es-errors: 1.3.0
       es-object-atoms: 1.1.1
 
+  setprototypeof@1.2.0: {}
+
   shallowequal@1.1.0: {}
 
   shebang-command@2.0.0:
@@ -6878,7 +7297,9 @@ snapshots:
 
   state-local@1.0.7: {}
 
-  std-env@3.8.1: {}
+  statuses@2.0.1: {}
+
+  std-env@3.9.0: {}
 
   string-convert@0.2.1: {}
 
@@ -6928,7 +7349,7 @@ snapshots:
   string.prototype.trimend@1.0.9:
     dependencies:
       call-bind: 1.0.8
-      call-bound: 1.0.3
+      call-bound: 1.0.4
       define-properties: 1.2.1
       es-object-atoms: 1.0.0
 
@@ -7037,6 +7458,11 @@ snapshots:
 
   tinyexec@0.3.2: {}
 
+  tinyglobby@0.2.13:
+    dependencies:
+      fdir: 6.4.4(picomatch@4.0.2)
+      picomatch: 4.0.2
+
   tinypool@1.0.2: {}
 
   tinyrainbow@2.0.0: {}
@@ -7049,6 +7475,8 @@ snapshots:
 
   toggle-selection@1.0.6: {}
 
+  toidentifier@1.0.1: {}
+
   ts-api-utils@2.1.0(typescript@5.8.3):
     dependencies:
       typescript: 5.8.3
@@ -7068,12 +7496,16 @@ snapshots:
 
   tslib@2.8.1: {}
 
-  turbo-stream@2.4.0: {}
-
   type-check@0.4.0:
     dependencies:
       prelude-ls: 1.2.1
 
+  type-is@2.0.1:
+    dependencies:
+      content-type: 1.0.5
+      media-typer: 1.1.0
+      mime-types: 3.0.1
+
   typed-array-buffer@1.0.3:
     dependencies:
       call-bound: 1.0.4
@@ -7118,7 +7550,7 @@ snapshots:
 
   undici-types@6.19.8: {}
 
-  undici-types@6.20.0: {}
+  undici-types@6.21.0: {}
 
   undici@5.28.4:
     dependencies:
@@ -7126,12 +7558,20 @@ snapshots:
 
   universalify@2.0.1: {}
 
+  unpipe@1.0.0: {}
+
   update-browserslist-db@1.1.3(browserslist@4.24.4):
     dependencies:
       browserslist: 4.24.4
       escalade: 3.2.0
       picocolors: 1.1.1
 
+  update-browserslist-db@1.1.3(browserslist@4.24.5):
+    dependencies:
+      browserslist: 4.24.5
+      escalade: 3.2.0
+      picocolors: 1.1.1
+
   uri-js@4.4.1:
     dependencies:
       punycode: 2.3.1
@@ -7157,6 +7597,8 @@ snapshots:
 
   validate.io-number@1.0.3: {}
 
+  vary@1.1.2: {}
+
   victory-vendor@36.9.2:
     dependencies:
       '@types/d3-array': 3.2.1
@@ -7174,13 +7616,13 @@ snapshots:
       d3-time: 3.1.0
       d3-timer: 3.0.1
 
-  vite-node@3.0.9(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1):
+  vite-node@3.1.3(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1):
     dependencies:
       cac: 6.7.14
       debug: 4.4.0
-      es-module-lexer: 1.6.0
+      es-module-lexer: 1.7.0
       pathe: 2.0.3
-      vite: 6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)
     transitivePeerDependencies:
       - '@types/node'
       - jiti
@@ -7195,12 +7637,12 @@ snapshots:
       - tsx
       - yaml
 
-  vite-plugin-compression@0.5.1(vite@6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)):
+  vite-plugin-compression@0.5.1(vite@6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)):
     dependencies:
       chalk: 4.1.2
       debug: 4.4.0
       fs-extra: 10.1.0
-      vite: 6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -7208,53 +7650,57 @@ snapshots:
     dependencies:
       monaco-editor: 0.52.2
 
-  vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)):
+  vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)):
     dependencies:
       debug: 4.4.0
       globrex: 0.1.2
       tsconfck: 3.1.4(typescript@5.8.3)
     optionalDependencies:
-      vite: 6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)
     transitivePeerDependencies:
       - supports-color
       - typescript
 
-  vite@6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1):
+  vite@6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1):
     dependencies:
-      esbuild: 0.25.3
+      esbuild: 0.25.4
+      fdir: 6.4.4(picomatch@4.0.2)
+      picomatch: 4.0.2
       postcss: 8.5.3
-      rollup: 4.40.1
+      rollup: 4.40.2
+      tinyglobby: 0.2.13
     optionalDependencies:
-      '@types/node': 22.13.14
+      '@types/node': 22.15.17
       fsevents: 2.3.3
       jiti: 1.21.7
-      less: 4.2.2
+      less: 4.3.0
       yaml: 2.7.1
 
-  vitest@3.0.9(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1):
+  vitest@3.1.3(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1):
     dependencies:
-      '@vitest/expect': 3.0.9
-      '@vitest/mocker': 3.0.9(vite@6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1))
-      '@vitest/pretty-format': 3.0.9
-      '@vitest/runner': 3.0.9
-      '@vitest/snapshot': 3.0.9
-      '@vitest/spy': 3.0.9
-      '@vitest/utils': 3.0.9
+      '@vitest/expect': 3.1.3
+      '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1))
+      '@vitest/pretty-format': 3.1.3
+      '@vitest/runner': 3.1.3
+      '@vitest/snapshot': 3.1.3
+      '@vitest/spy': 3.1.3
+      '@vitest/utils': 3.1.3
       chai: 5.2.0
       debug: 4.4.0
-      expect-type: 1.2.0
+      expect-type: 1.2.1
       magic-string: 0.30.17
       pathe: 2.0.3
-      std-env: 3.8.1
+      std-env: 3.9.0
       tinybench: 2.9.0
       tinyexec: 0.3.2
+      tinyglobby: 0.2.13
       tinypool: 1.0.2
       tinyrainbow: 2.0.0
-      vite: 6.2.7(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)
-      vite-node: 3.0.9(@types/node@22.13.14)(jiti@1.21.7)(less@4.2.2)(yaml@2.7.1)
+      vite: 6.3.5(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)
+      vite-node: 3.1.3(@types/node@22.15.17)(jiti@1.21.7)(less@4.3.0)(yaml@2.7.1)
       why-is-node-running: 2.3.0
     optionalDependencies:
-      '@types/node': 22.13.14
+      '@types/node': 22.15.17
     transitivePeerDependencies:
       - jiti
       - less
@@ -7346,6 +7792,8 @@ snapshots:
       string-width: 5.1.2
       strip-ansi: 7.1.0
 
+  wrappy@1.0.2: {}
+
   y18n@5.0.8: {}
 
   yallist@3.1.1: {}
@@ -7366,13 +7814,17 @@ snapshots:
 
   yocto-queue@0.1.0: {}
 
+  zod-to-json-schema@3.24.5(zod@3.24.3):
+    dependencies:
+      zod: 3.24.3
+
   zod@3.24.3: {}
 
-  zustand@4.5.6(@types/react@19.0.12)(react@19.1.0):
+  zustand@4.5.6(@types/react@19.1.3)(react@19.1.0):
     dependencies:
       use-sync-external-store: 1.5.0(react@19.1.0)
     optionalDependencies:
-      '@types/react': 19.0.12
+      '@types/react': 19.1.3
       react: 19.1.0
 
-  zx@8.4.1: {}
+  zx@8.5.4: {}
diff --git a/ui/src/config/transport.ts b/ui/src/config/transport.ts
index 3cb56d5e..519ac315 100644
--- a/ui/src/config/transport.ts
+++ b/ui/src/config/transport.ts
@@ -65,15 +65,15 @@ export const newErrorHandler = (handler: (err: ConnectError) => void): Intercept
     });
 };
 
-const defaultErrorHandler = newErrorHandler((err) => {
+export const defaultErrorHandler = (err: ConnectError) => {
   const errorMessage = err instanceof ConnectError ? err.rawMessage : 'Unexpected API error';
   notification.error({ message: errorMessage, placement: 'bottomRight' });
-});
+};
 
 export const transport = createConnectTransport({
   baseUrl: '',
   useBinaryFormat: true,
-  interceptors: [defaultErrorHandler]
+  interceptors: [newErrorHandler(defaultErrorHandler)]
 });
 
 export const newTransportWithAuth = (errorHandler: Interceptor) =>
@@ -83,4 +83,4 @@ export const newTransportWithAuth = (errorHandler: Interceptor) =>
     interceptors: [authHandler, errorHandler]
   });
 
-export const transportWithAuth = newTransportWithAuth(defaultErrorHandler);
+export const transportWithAuth = newTransportWithAuth(newErrorHandler(defaultErrorHandler));
diff --git a/ui/src/features/assemble-freight/assemble-freight.tsx b/ui/src/features/assemble-freight/assemble-freight.tsx
index a97d2bc4..ece597f6 100644
--- a/ui/src/features/assemble-freight/assemble-freight.tsx
+++ b/ui/src/features/assemble-freight/assemble-freight.tsx
@@ -193,40 +193,6 @@ export const AssembleFreight = ({
     }
   }
 
-  const DiscoveryTable = () => {
-    if (!selected) {
-      return null;
-    }
-
-    const selectedItem = chosenItems[selected?.repoURL as string]?.info;
-
-    if ('references' in selected) {
-      return (
-        <ImageTable
-          references={(selected as ImageDiscoveryResult).references}
-          select={select}
-          selected={selectedItem as DiscoveredImageReference}
-        />
-      );
-    } else if ('commits' in selected) {
-      return (
-        <CommitTable
-          commits={(selected as GitDiscoveryResult).commits}
-          select={select}
-          selected={selectedItem as DiscoveredCommit}
-        />
-      );
-    } else if ('versions' in selected) {
-      return (
-        <ChartTable
-          versions={(selected as ChartDiscoveryResult).versions}
-          select={select}
-          selected={selectedItem as string}
-        />
-      );
-    }
-  };
-
   const commonProps = {
     onClick: setSelected,
     selected: selected
@@ -278,7 +244,7 @@ export const AssembleFreight = ({
             <ArtifactMenuGroup icon={faGitAlt} label='Git' items={git} {...commonProps} />
           </div>
           <div className='w-full p-4 overflow-auto'>
-            <DiscoveryTable />
+            <DiscoveryTable selected={selected} chosenItems={chosenItems} select={select} />
           </div>
         </div>
       ) : (
@@ -287,3 +253,49 @@ export const AssembleFreight = ({
     </div>
   );
 };
+
+const DiscoveryTable = ({
+  selected,
+  chosenItems,
+  select
+}: {
+  selected?: DiscoveryResult;
+  chosenItems: {
+    [key: string]: {
+      artifact: DiscoveryResult;
+      info: FreightInfo;
+    };
+  };
+  select: (item?: FreightInfo) => void;
+}) => {
+  if (!selected) {
+    return null;
+  }
+
+  const selectedItem = chosenItems[selected?.repoURL as string]?.info;
+
+  return (
+    <>
+      <ImageTable
+        references={(selected as ImageDiscoveryResult).references || []}
+        select={select}
+        selected={selectedItem as DiscoveredImageReference}
+        show={'references' in selected}
+      />
+
+      <CommitTable
+        commits={(selected as GitDiscoveryResult).commits || []}
+        select={select}
+        selected={selectedItem as DiscoveredCommit}
+        show={'commits' in selected}
+      />
+
+      <ChartTable
+        versions={(selected as ChartDiscoveryResult).versions || []}
+        select={select}
+        selected={selectedItem as string}
+        show={'versions' in selected}
+      />
+    </>
+  );
+};
diff --git a/ui/src/features/assemble-freight/chart-table.tsx b/ui/src/features/assemble-freight/chart-table.tsx
index dc77ff32..a5bfdc37 100644
--- a/ui/src/features/assemble-freight/chart-table.tsx
+++ b/ui/src/features/assemble-freight/chart-table.tsx
@@ -1,17 +1,27 @@
 import { Radio, Table } from 'antd';
+import { useState } from 'react';
 
 export const ChartTable = ({
   versions,
   selected,
-  select
+  select,
+  show
 }: {
   versions: string[];
   selected: string | undefined;
   select: (version?: string) => void;
+  show?: boolean;
 }) => {
+  const [page, setPage] = useState(1);
+
+  if (!show) {
+    return null;
+  }
+
   return (
     <Table
       dataSource={versions.map((version) => ({ version }))}
+      pagination={{ current: page, onChange: (page) => setPage(page) }}
       columns={[
         {
           width: '50px',
diff --git a/ui/src/features/assemble-freight/commit-table.tsx b/ui/src/features/assemble-freight/commit-table.tsx
index 1dc7cf7b..57b2c1ff 100644
--- a/ui/src/features/assemble-freight/commit-table.tsx
+++ b/ui/src/features/assemble-freight/commit-table.tsx
@@ -1,4 +1,5 @@
 import { Radio, Table } from 'antd';
+import { useState } from 'react';
 
 import { DiscoveredCommit } from '@ui/gen/api/v1alpha1/generated_pb';
 import { timestampDate } from '@ui/utils/connectrpc-utils';
@@ -8,50 +9,56 @@ import { TruncatedCopyable } from './truncated-copyable';
 export const CommitTable = ({
   commits,
   selected,
-  select
+  select,
+  show
 }: {
   commits: DiscoveredCommit[];
   selected: DiscoveredCommit | undefined;
   select: (commit?: DiscoveredCommit) => void;
+  show?: boolean;
 }) => {
+  const [page, setPage] = useState(1);
+
+  if (!show) {
+    return null;
+  }
+
   return (
-    <>
-      <Table
-        dataSource={commits}
-        columns={[
-          {
-            render: (record: DiscoveredCommit) => (
-              <Radio
-                checked={selected === record}
-                onClick={() => select(selected === record ? undefined : record)}
-              />
-            )
-          },
-          {
-            title: 'ID',
-            render: (record: DiscoveredCommit) => <TruncatedCopyable text={record?.id} />
-          },
-          {
-            title: 'Message',
-            render: (record: DiscoveredCommit) => (
-              <div style={{ maxWidth: '250px' }}>{record.subject}</div>
-            )
-          },
-          {
-            title: 'Author',
-            render: (record: DiscoveredCommit) => record.author
-          },
-          {
-            title: 'Committer',
-            render: (record: DiscoveredCommit) => record.committer
-          },
-          {
-            title: 'Date',
-            render: (record: DiscoveredCommit) =>
-              timestampDate(record.creatorDate)?.toLocaleString()
-          }
-        ]}
-      />
-    </>
+    <Table
+      dataSource={commits}
+      pagination={{ current: page, onChange: (page) => setPage(page) }}
+      columns={[
+        {
+          render: (record: DiscoveredCommit) => (
+            <Radio
+              checked={selected === record}
+              onClick={() => select(selected === record ? undefined : record)}
+            />
+          )
+        },
+        {
+          title: 'ID',
+          render: (record: DiscoveredCommit) => <TruncatedCopyable text={record?.id} />
+        },
+        {
+          title: 'Message',
+          render: (record: DiscoveredCommit) => (
+            <div style={{ maxWidth: '250px' }}>{record.subject}</div>
+          )
+        },
+        {
+          title: 'Author',
+          render: (record: DiscoveredCommit) => record.author
+        },
+        {
+          title: 'Committer',
+          render: (record: DiscoveredCommit) => record.committer
+        },
+        {
+          title: 'Date',
+          render: (record: DiscoveredCommit) => timestampDate(record.creatorDate)?.toLocaleString()
+        }
+      ]}
+    />
   );
 };
diff --git a/ui/src/features/assemble-freight/image-table.tsx b/ui/src/features/assemble-freight/image-table.tsx
index 6f561950..178ee1ad 100644
--- a/ui/src/features/assemble-freight/image-table.tsx
+++ b/ui/src/features/assemble-freight/image-table.tsx
@@ -1,6 +1,7 @@
 import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { Radio, Table } from 'antd';
+import { useState } from 'react';
 
 import { DiscoveredImageReference } from '@ui/gen/api/v1alpha1/generated_pb';
 import { timestampDate } from '@ui/utils/connectrpc-utils';
@@ -10,15 +11,24 @@ import { TruncatedCopyable } from './truncated-copyable';
 export const ImageTable = ({
   references,
   selected,
-  select
+  select,
+  show
 }: {
   references: DiscoveredImageReference[];
   selected: DiscoveredImageReference | undefined;
   select: (reference?: DiscoveredImageReference) => void;
-}) => (
-  <>
+  show?: boolean;
+}) => {
+  const [page, setPage] = useState(1);
+
+  if (!show) {
+    return null;
+  }
+
+  return (
     <Table
       dataSource={references}
+      pagination={{ current: page, onChange: (page) => setPage(page) }}
       columns={[
         {
           render: (record: DiscoveredImageReference) => (
@@ -52,5 +62,5 @@ export const ImageTable = ({
         }
       ]}
     />
-  </>
-);
+  );
+};
diff --git a/ui/src/features/common/code-editor/yaml-editor-lazy.tsx b/ui/src/features/common/code-editor/yaml-editor-lazy.tsx
index c69b5f73..d4e382de 100644
--- a/ui/src/features/common/code-editor/yaml-editor-lazy.tsx
+++ b/ui/src/features/common/code-editor/yaml-editor-lazy.tsx
@@ -184,7 +184,7 @@ const YamlEditor: FC<YamlEditorProps> = (props) => {
 
         {placeholder && (
           <p
-            className={`${styles.placeholderWrapper} font-mono`}
+            className={`${styles.placeholderWrapper} font-mono mt-9`}
             onClick={() => {
               editorRef.current?.focus?.();
             }}
diff --git a/ui/src/features/project/list/utils/project-yaml-example.ts b/ui/src/features/project/list/utils/project-yaml-example.ts
index 8d5ea78b..2cad9200 100644
--- a/ui/src/features/project/list/utils/project-yaml-example.ts
+++ b/ui/src/features/project/list/utils/project-yaml-example.ts
@@ -5,3 +5,12 @@ export const projectYAMLExample = {
     name: 'kargo-demo'
   }
 };
+
+export const projectConfigYAMLExample = {
+  apiVersion: 'kargo.akuity.io/v1alpha1',
+  kind: 'ProjectConfig',
+  metadata: {
+    name: 'kargo-demo',
+    namespace: 'kargo-demo'
+  }
+};
diff --git a/ui/src/features/project/pipelines/freight/duration-to-seconds.ts b/ui/src/features/project/pipelines/freight/duration-to-seconds.ts
new file mode 100644
index 00000000..22b1a185
--- /dev/null
+++ b/ui/src/features/project/pipelines/freight/duration-to-seconds.ts
@@ -0,0 +1,24 @@
+import { Duration } from 'date-fns';
+
+export const durationToSeconds = (duration: Duration): number => {
+  const {
+    years = 0,
+    months = 0,
+    weeks = 0,
+    days = 0,
+    hours = 0,
+    minutes = 0,
+    seconds = 0
+  } = duration;
+
+  const totalSeconds =
+    years * 365.25 * 24 * 60 * 60 +
+    months * 30.44 * 24 * 60 * 60 +
+    weeks * 7 * 24 * 60 * 60 +
+    days * 24 * 60 * 60 +
+    hours * 60 * 60 +
+    minutes * 60 +
+    seconds;
+
+  return Math.floor(totalSeconds);
+};
diff --git a/ui/src/features/project/pipelines/freight/freight-card.tsx b/ui/src/features/project/pipelines/freight/freight-card.tsx
index 64c05d9f..86b636bc 100644
--- a/ui/src/features/project/pipelines/freight/freight-card.tsx
+++ b/ui/src/features/project/pipelines/freight/freight-card.tsx
@@ -9,10 +9,10 @@ import {
   IconDefinition
 } from '@fortawesome/free-solid-svg-icons';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { Button, Divider, Dropdown, Flex, Typography } from 'antd';
+import { Button, Divider, Dropdown, Flex, Progress, Typography } from 'antd';
 import classNames from 'classnames';
-import { formatDistance } from 'date-fns';
-import { ReactNode, useMemo } from 'react';
+import { Duration, formatDistance, formatDuration } from 'date-fns';
+import { ReactNode, useEffect, useMemo, useRef } from 'react';
 import { generatePath, useNavigate } from 'react-router-dom';
 
 import { paths } from '@ui/config/paths';
@@ -25,6 +25,7 @@ import { timestampDate } from '@ui/utils/connectrpc-utils';
 
 import { DeleteFreightModal } from './delete-freight-modal';
 import { FreightArtifact } from './freight-artifact';
+import { useSoakTimeCounter, useSoakTimePercentage } from './use-soak-time-counter';
 
 type FreightCardProps = {
   freight: Freight;
@@ -38,6 +39,7 @@ type FreightCardProps = {
   promote?: boolean;
   onReviewAndPromote?(): void;
   onExpand(): void;
+  soakTime?: Duration;
 
   // count of stacked freights
   count?: number;
@@ -75,6 +77,20 @@ export const FreightCard = (props: FreightCardProps) => {
     props.viewingFreight?.metadata?.name === props.freight?.metadata?.name ||
     actionContext?.action?.freight?.metadata?.name === props.freight?.metadata?.name;
 
+  const soakTime = useSoakTimeCounter(props.soakTime);
+
+  const frozenInitialSoakTime = useRef(props.soakTime);
+
+  useEffect(() => {
+    if (!frozenInitialSoakTime.current) {
+      frozenInitialSoakTime.current = props.soakTime;
+    }
+  }, [props.soakTime]);
+
+  const soakTimePercentage = useSoakTimePercentage(frozenInitialSoakTime.current, soakTime);
+
+  const soakTimeFormatted = useMemo(() => (soakTime ? formatDuration(soakTime) : ''), [soakTime]);
+
   let CardContent: ReactNode;
 
   if (props.count) {
@@ -241,6 +257,20 @@ export const FreightCard = (props: FreightCardProps) => {
     >
       {CardContent}
 
+      {soakTimeFormatted && !props.promote && (
+        <div className='px-1 pb-1'>
+          <Button
+            disabled
+            onClick={(e) => e.stopPropagation()}
+            size='small'
+            className='text-[10px] text-center w-[230px] flex font-semibold'
+          >
+            <span className='mr-auto'>Soak: {soakTimeFormatted}</span>
+            <Progress strokeWidth={12} type='circle' size={14} percent={soakTimePercentage} />
+          </Button>
+        </div>
+      )}
+
       {props.promote && (
         <div className='px-1 pb-1'>
           <Button
diff --git a/ui/src/features/project/pipelines/freight/freight-timeline.tsx b/ui/src/features/project/pipelines/freight/freight-timeline.tsx
index 2152206e..c09dc045 100644
--- a/ui/src/features/project/pipelines/freight/freight-timeline.tsx
+++ b/ui/src/features/project/pipelines/freight/freight-timeline.tsx
@@ -1,4 +1,3 @@
-import { useQuery } from '@connectrpc/connect-query';
 import { faCaretLeft, faCaretRight } from '@fortawesome/free-solid-svg-icons';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { Divider } from 'antd';
@@ -12,7 +11,6 @@ import { BaseHeader } from '@ui/features/common/layout/base-header';
 import { IAction, useActionContext } from '@ui/features/project/pipelines/context/action-context';
 import { useDictionaryContext } from '@ui/features/project/pipelines/context/dictionary-context';
 import { useFreightTimelineControllerContext } from '@ui/features/project/pipelines/context/freight-timeline-controller-context';
-import { queryFreight } from '@ui/gen/api/service/v1alpha1/service-KargoService_connectquery';
 import { Freight } from '@ui/gen/api/v1alpha1/generated_pb';
 import { timestampDate } from '@ui/utils/connectrpc-utils';
 
@@ -21,6 +19,8 @@ import { FreightCard } from './freight-card';
 import { FreightTimelineFilters } from './freight-timeline-filters';
 import { PromotionModeHeader } from './promotion-mode-header';
 import { filterFreightBySource, filterFreightByTimerange } from './source-catalogue-utils';
+import { usePromotionEligibleFreight } from './use-promotion-eligible-freight';
+import { useSoakTime } from './use-soak-time';
 
 import './freight-timeline.less';
 
@@ -36,17 +36,10 @@ export const FreightTimeline = (props: { freights: Freight[]; project: string })
     actionContext?.action?.type === IAction.PROMOTE ||
     actionContext?.action?.type === IAction.PROMOTE_DOWNSTREAM;
 
-  const getPromotionEligibleFreightQuery = useQuery(
-    queryFreight,
-    {
-      project: props.project,
-      stage: actionContext?.action?.stage?.metadata?.name
-    },
-    { enabled: isPromotionMode }
-  );
+  const { promotionEligibleFreight, ...getPromotionEligibleFreightQuery } =
+    usePromotionEligibleFreight(props.project);
 
-  const promotionEligibleFreight =
-    getPromotionEligibleFreightQuery?.data?.groups?.['']?.freight || [];
+  const soakTime = useSoakTime(props.freights);
 
   if (!freightTimelineControllerContext) {
     throw new Error('missing context freightTimelineControllerContext');
@@ -193,9 +186,14 @@ export const FreightTimeline = (props: { freights: Freight[]; project: string })
         >
           <div className='flex gap-1 relative transition-all right-0' ref={freightListStyleRef}>
             {filteredFreights.map((freight) => {
-              const promotionEligible = Boolean(
-                promotionEligibleFreight?.find((f) => f?.metadata?.name === freight?.metadata?.name)
-              );
+              const freightSoakTime = soakTime?.[freight?.metadata?.name || ''];
+
+              const promotionEligible =
+                Boolean(
+                  promotionEligibleFreight?.find(
+                    (f) => f?.metadata?.name === freight?.metadata?.name
+                  )
+                ) && !freightSoakTime;
 
               return (
                 <FreightCard
@@ -232,6 +230,7 @@ export const FreightTimeline = (props: { freights: Freight[]; project: string })
                       hideUnusedFreights: false
                     })
                   }
+                  soakTime={freightSoakTime}
                 />
               );
             })}
diff --git a/ui/src/features/project/pipelines/freight/get-soak-time.ts b/ui/src/features/project/pipelines/freight/get-soak-time.ts
new file mode 100644
index 00000000..38cb5e83
--- /dev/null
+++ b/ui/src/features/project/pipelines/freight/get-soak-time.ts
@@ -0,0 +1,57 @@
+import { add, intervalToDuration, isBefore } from 'date-fns';
+
+import { Freight, Stage } from '@ui/gen/api/v1alpha1/generated_pb';
+import { Duration } from '@ui/gen/k8s.io/apimachinery/pkg/apis/meta/v1/generated_pb';
+import { timestampDate } from '@ui/utils/connectrpc-utils';
+
+// freight is in stage since X
+// required soak time is Y duration
+// add Y duration in X
+// if it is in past, then freight is soaked
+// if it is in future then difference between future time and current time is how much time it needs to soak
+export const getSoakTime = (payload: {
+  freight: Freight;
+  // only relevant stages
+  // for example,
+  // in normal promotion stage-A -> stage-B, soak time for stage-B is decide upon how much time stage-A contains that freight
+  // stage-B -> stage-C, stage-D, stage-E, soak time for stage-C, stage-D, stage-E is decide upon how much time stage-B contains that freight
+  freightInStage: Stage;
+  // time duration - 1h, 1h2m, 10m
+  requiredSoakTime: Duration;
+}) => {
+  if (!payload.requiredSoakTime) {
+    return '';
+  }
+
+  const sourceStageName = payload.freightInStage?.metadata?.name || '';
+
+  const inSourceStageSince = timestampDate(
+    payload.freight?.status?.currentlyIn?.[sourceStageName].since
+  );
+
+  if (!inSourceStageSince) {
+    return '';
+  }
+
+  const requiredSoakTime = durationToHMS(payload.requiredSoakTime);
+
+  const calculateSoakTimeSinceInFreight = add(inSourceStageSince, requiredSoakTime);
+
+  const now = new Date();
+
+  if (isBefore(now, calculateSoakTimeSinceInFreight)) {
+    return intervalToDuration({ start: now, end: calculateSoakTimeSinceInFreight });
+  }
+
+  return null;
+};
+
+const durationToHMS = (duration: Duration) => {
+  const totalSeconds = Number(duration.duration / 1_000_000_000n); // Convert to seconds
+
+  const hours = Math.floor(totalSeconds / 3600);
+  const minutes = Math.floor((totalSeconds % 3600) / 60);
+  const seconds = totalSeconds % 60;
+
+  return { hours, minutes, seconds };
+};
diff --git a/ui/src/features/project/pipelines/freight/short-version-utils.ts b/ui/src/features/project/pipelines/freight/short-version-utils.ts
index 6f711785..1d1829b9 100644
--- a/ui/src/features/project/pipelines/freight/short-version-utils.ts
+++ b/ui/src/features/project/pipelines/freight/short-version-utils.ts
@@ -1,9 +1,9 @@
 export const shortVersion = (version: string = '') => {
-  if (version.length <= 10) {
+  if (version.length <= 12) {
     return version;
   }
 
-  const prefix = version.slice(0, 7);
+  const prefix = version.slice(0, 6);
   const suffix = version.slice(-6);
 
   return `${prefix}...${suffix}`;
diff --git a/ui/src/features/project/pipelines/freight/use-promotion-eligible-freight.ts b/ui/src/features/project/pipelines/freight/use-promotion-eligible-freight.ts
new file mode 100644
index 00000000..412a92d1
--- /dev/null
+++ b/ui/src/features/project/pipelines/freight/use-promotion-eligible-freight.ts
@@ -0,0 +1,37 @@
+import { useQuery } from '@connectrpc/connect-query';
+
+import { IAction, useActionContext } from '@ui/features/project/pipelines/context/action-context';
+import { queryFreight } from '@ui/gen/api/service/v1alpha1/service-KargoService_connectquery';
+
+export const usePromotionEligibleFreight = (project: string) => {
+  const actionContext = useActionContext();
+
+  const isPromotionMode =
+    actionContext?.action?.type === IAction.PROMOTE ||
+    actionContext?.action?.type === IAction.PROMOTE_DOWNSTREAM;
+
+  const getPromotionEligibleFreightQuery = useQuery(
+    queryFreight,
+    {
+      project,
+      stage: actionContext?.action?.stage?.metadata?.name
+    },
+    {
+      enabled: isPromotionMode
+    }
+  );
+
+  let promotionEligibleFreight =
+    getPromotionEligibleFreightQuery?.data?.groups?.['']?.freight || [];
+
+  if (actionContext?.action?.type === IAction.PROMOTE_DOWNSTREAM) {
+    promotionEligibleFreight = promotionEligibleFreight.filter(
+      (f) => f?.status?.verifiedIn?.[actionContext?.action?.stage?.metadata?.name || '']
+    );
+  }
+
+  return {
+    ...getPromotionEligibleFreightQuery,
+    promotionEligibleFreight
+  };
+};
diff --git a/ui/src/features/project/pipelines/freight/use-soak-time-counter.ts b/ui/src/features/project/pipelines/freight/use-soak-time-counter.ts
new file mode 100644
index 00000000..60b50f6e
--- /dev/null
+++ b/ui/src/features/project/pipelines/freight/use-soak-time-counter.ts
@@ -0,0 +1,69 @@
+import { Duration } from 'date-fns';
+import { useEffect, useMemo, useState } from 'react';
+
+import { queryCache } from '@ui/features/utils/cache';
+
+import { durationToSeconds } from './duration-to-seconds';
+
+export const useSoakTimeCounter = (soakTime?: Duration) => {
+  const [counter, setCounter] = useState(soakTime);
+
+  useEffect(() => {
+    const interval = setInterval(() => {
+      setCounter((prev) => {
+        if (!prev) {
+          return prev;
+        }
+
+        const newCounter = { ...prev };
+        if (newCounter.seconds !== undefined) {
+          newCounter.seconds -= 1;
+        }
+
+        if ((newCounter?.seconds || 0) < 0) {
+          newCounter.seconds = 59;
+
+          if (newCounter.minutes !== undefined) {
+            newCounter.minutes -= 1;
+          }
+        }
+
+        if ((newCounter?.minutes || 0) < 0) {
+          newCounter.minutes = 59;
+
+          if (newCounter.hours !== undefined) {
+            newCounter.hours -= 1;
+          }
+        }
+
+        if ((prev?.seconds || 0) === 0 && (prev?.minutes || 0) === 0 && (prev?.hours || 0) === 0) {
+          clearInterval(interval);
+          queryCache.freight.refetchQueryFreight();
+          return undefined;
+        }
+
+        return newCounter;
+      });
+    }, 1000);
+
+    return () => clearInterval(interval);
+  }, []);
+
+  useEffect(() => {
+    setCounter(soakTime);
+  }, [soakTime]);
+
+  return counter;
+};
+
+export const useSoakTimePercentage = (initialSoakTime?: Duration, soakTimeLeft?: Duration) =>
+  useMemo(() => {
+    if (!initialSoakTime || !soakTimeLeft) {
+      return 0;
+    }
+
+    const initialSoakTimeSeconds = durationToSeconds(initialSoakTime);
+    const soakTimeLeftSeconds = durationToSeconds(soakTimeLeft);
+
+    return (soakTimeLeftSeconds * 100) / initialSoakTimeSeconds;
+  }, [initialSoakTime, soakTimeLeft]);
diff --git a/ui/src/features/project/pipelines/freight/use-soak-time.ts b/ui/src/features/project/pipelines/freight/use-soak-time.ts
new file mode 100644
index 00000000..f97c6fc6
--- /dev/null
+++ b/ui/src/features/project/pipelines/freight/use-soak-time.ts
@@ -0,0 +1,138 @@
+import { Duration } from 'date-fns';
+import { useMemo } from 'react';
+
+import { IAction, useActionContext } from '@ui/features/project/pipelines/context/action-context';
+import { useDictionaryContext } from '@ui/features/project/pipelines/context/dictionary-context';
+import { Freight, Stage } from '@ui/gen/api/v1alpha1/generated_pb';
+
+import { durationToSeconds } from './duration-to-seconds';
+import { getSoakTime } from './get-soak-time';
+
+/**
+ * soak time calculation:
+ *
+ * when pipeline is in promotion mode, we will calculate soak time for each freight
+ *
+ * first find if currently promoting stage has required soak time from upstream stage(s)
+ * if it is then for each promotion ineligible freight, find how much time it is in upstream stage(s) of currently promoting stage
+ * if there are multiple upstream stages then find longest time since the freight is in one of stage
+ * then compare it with currently promoting stages required soak time
+ *
+ * above process is for "promote to stage"
+ * for promote to downstream, we have to calculate for each downstream stages required soak time and pick the longest one
+ */
+
+const soakTimeForPromotingStage = (payload: {
+  stage: Stage;
+  subscribersByStage: Record<string, Set<string>>;
+  freights: Freight[];
+  stageByName: Record<string, Stage>;
+  soakTimesByFreight: Record<string, Duration>;
+}) => {
+  const currentlyPromotingStage = payload.stage;
+  const currentlyPromotingStageName = currentlyPromotingStage?.metadata?.name || '';
+  const sourcesOfCurrentlyPromotingStage: string[] = [];
+
+  for (const [source, dest] of Object.entries(payload.subscribersByStage)) {
+    if (dest.has(currentlyPromotingStageName)) {
+      sourcesOfCurrentlyPromotingStage.push(source);
+    }
+  }
+
+  for (const freight of payload.freights) {
+    const freightName = freight?.metadata?.name || '';
+    const freightOrigin = freight?.origin?.name || '';
+    const freightInStages = Object.keys(freight?.status?.currentlyIn || {});
+
+    const requireSoakTime = currentlyPromotingStage?.spec?.requestedFreight?.find(
+      (f) => f?.origin?.name === freightOrigin
+    )?.sources?.requiredSoakTime;
+
+    // there will be multiple soak times due to the fact that there are potentially multiple source
+    // in that case we just need to find longest soak time
+    const soakTimesForFreight: Duration[] = [];
+
+    for (const stage of freightInStages) {
+      if (!sourcesOfCurrentlyPromotingStage.includes(stage)) {
+        continue;
+      }
+
+      const stageDetails = payload.stageByName?.[stage];
+
+      if (stageDetails && requireSoakTime) {
+        const soakTime = getSoakTime({
+          freight,
+          freightInStage: payload.stageByName?.[stage],
+          requiredSoakTime: requireSoakTime
+        });
+
+        if (soakTime) {
+          soakTimesForFreight.push(soakTime);
+        }
+      }
+    }
+
+    if (soakTimesForFreight.length > 0) {
+      const maxSoakTime = soakTimesForFreight.reduce((max, curr) =>
+        durationToSeconds(curr) > durationToSeconds(max) ? curr : max
+      );
+
+      if (!payload.soakTimesByFreight[freightName]) {
+        payload.soakTimesByFreight[freightName] = maxSoakTime;
+      } else {
+        // if we find soak time already calculated for that freight
+        // that means we are looking for "downstream" promotion mode
+        const existingSoakTime = payload.soakTimesByFreight[freightName];
+        payload.soakTimesByFreight[freightName] =
+          durationToSeconds(existingSoakTime) > durationToSeconds(maxSoakTime)
+            ? existingSoakTime
+            : maxSoakTime;
+      }
+    }
+  }
+
+  return payload.soakTimesByFreight;
+};
+
+export const useSoakTime = (freights: Freight[]) => {
+  const actionContext = useActionContext();
+  const dictionaryContext = useDictionaryContext();
+
+  return useMemo(() => {
+    let soakTimes: Record<string, Duration> = {};
+
+    if (
+      actionContext?.action?.type !== IAction.PROMOTE &&
+      actionContext?.action?.type !== IAction.PROMOTE_DOWNSTREAM
+    ) {
+      return soakTimes;
+    }
+
+    // for normal promotion mode, currently promoting stage is selected stage
+    // for downstream, it is subscribers of the selected stage
+    const currentlyPromotingStages: string[] = [];
+
+    if (actionContext?.action?.type === IAction.PROMOTE) {
+      currentlyPromotingStages.push(actionContext?.action?.stage?.metadata?.name || '');
+    } else {
+      const subscribers =
+        dictionaryContext?.subscribersByStage?.[actionContext?.action?.stage?.metadata?.name || ''];
+
+      for (const subscriber of subscribers || []) {
+        currentlyPromotingStages.push(subscriber);
+      }
+    }
+
+    for (const currentlyPromotingStage of currentlyPromotingStages) {
+      soakTimes = soakTimeForPromotingStage({
+        stage: dictionaryContext?.stageByName?.[currentlyPromotingStage] as Stage,
+        freights,
+        soakTimesByFreight: soakTimes,
+        stageByName: dictionaryContext?.stageByName as Record<string, Stage>,
+        subscribersByStage: dictionaryContext?.subscribersByStage as Record<string, Set<string>>
+      });
+    }
+
+    return soakTimes;
+  }, [actionContext, freights, dictionaryContext]);
+};
diff --git a/ui/src/features/project/pipelines/graph/use-events-watcher.ts b/ui/src/features/project/pipelines/graph/use-events-watcher.ts
index 5de8ba7b..c563649b 100644
--- a/ui/src/features/project/pipelines/graph/use-events-watcher.ts
+++ b/ui/src/features/project/pipelines/graph/use-events-watcher.ts
@@ -2,6 +2,7 @@ import { useQueryClient } from '@tanstack/react-query';
 import { useEffect } from 'react';
 
 import { Watcher } from '@ui/features/project/pipelines/watcher';
+import { queryCache } from '@ui/features/utils/cache';
 import { Stage, Warehouse } from '@ui/gen/api/v1alpha1/generated_pb';
 import { useDocumentEvent } from '@ui/utils/document';
 
@@ -27,7 +28,8 @@ export const useEventsWatcher = (
 
     watcher.watchStages(act.onStage);
     watcher.watchWarehouses({
-      onWarehouseEvent: act.onWarehouse
+      onWarehouseEvent: act.onWarehouse,
+      refreshHook: queryCache.freight.refetchQueryFreight
     });
 
     return () => {
diff --git a/ui/src/features/project/pipelines/nodes/stage-node.tsx b/ui/src/features/project/pipelines/nodes/stage-node.tsx
index 52244a27..449bb2f8 100644
--- a/ui/src/features/project/pipelines/nodes/stage-node.tsx
+++ b/ui/src/features/project/pipelines/nodes/stage-node.tsx
@@ -1,6 +1,7 @@
 import { useMutation } from '@connectrpc/connect-query';
 import {
   faArrowUpRightFromSquare,
+  faBolt,
   faExternalLink,
   faMinus,
   faTruckArrowRight
@@ -169,10 +170,10 @@ export const StageNode = (props: { stage: Stage }) => {
       }}
       title={
         <Flex align='center'>
-          <span className='text-xs text-wrap mr-auto'>{props.stage.metadata?.name}</span>
           {autoPromotionMode && (
-            <span className='text-[9px] lowercase font-normal mr-1'>Auto Promotion</span>
+            <FontAwesomeIcon title='Auto Promotion' icon={faBolt} className='text-[10px] mr-1' />
           )}
+          <span className='text-xs text-wrap mr-auto'>{props.stage.metadata?.name}</span>
           <Space>
             <Dropdown
               trigger={['hover']}
diff --git a/ui/src/features/project/pipelines/pipelines.tsx b/ui/src/features/project/pipelines/pipelines.tsx
index da713f56..c5a6fa63 100644
--- a/ui/src/features/project/pipelines/pipelines.tsx
+++ b/ui/src/features/project/pipelines/pipelines.tsx
@@ -13,19 +13,21 @@ import { LoadingState } from '@ui/features/common';
 import { mapToNames } from '@ui/features/common/utils';
 import FreightDetails from '@ui/features/freight/freight-details';
 import WarehouseDetails from '@ui/features/project/pipelines/warehouse/warehouse-details';
+import { projectConfigTransport } from '@ui/features/project/settings/views/project-config/transport';
 import CreateStage from '@ui/features/stage/create-stage';
 import CreateWarehouse from '@ui/features/stage/create-warehouse/create-warehouse';
 import StageDetails from '@ui/features/stage/stage-details';
 import { getColors } from '@ui/features/stage/utils';
 import {
   getProject,
+  getProjectConfig,
   listImages,
   listStages,
   listWarehouses,
   queryFreight
 } from '@ui/gen/api/service/v1alpha1/service-KargoService_connectquery';
 import { FreightList } from '@ui/gen/api/service/v1alpha1/service_pb';
-import { Freight, Project } from '@ui/gen/api/v1alpha1/generated_pb';
+import { Freight, Project, ProjectConfig } from '@ui/gen/api/v1alpha1/generated_pb';
 
 import { ActionContext } from './context/action-context';
 import { DictionaryContext } from './context/dictionary-context';
@@ -48,6 +50,7 @@ import { usePersistPreferredFilter } from './use-persist-filters';
 import { useStageAutoPromotionMap } from './use-stage-auto-promotion-map';
 import { useStageByName } from './use-stage-by-name';
 import { useSubscribersByStage } from './use-subscribers-by-stage';
+import { useSyncFreight } from './use-sync-freight';
 
 import '@xyflow/react/dist/style.css';
 
@@ -56,7 +59,18 @@ export const Pipelines = (props: { creatingStage?: boolean; creatingWarehouse?:
 
   const projectQuery = useQuery(getProject, { name });
 
+  const projectConfigQuery = useQuery(
+    getProjectConfig,
+    {
+      name
+    },
+    {
+      transport: projectConfigTransport
+    }
+  );
+
   const project = projectQuery.data?.result?.value as Project;
+  const projectConfig = projectConfigQuery.data?.result?.value as ProjectConfig;
 
   const projectName = name;
 
@@ -72,6 +86,7 @@ export const Pipelines = (props: { creatingStage?: boolean; creatingWarehouse?:
 
   const loading =
     projectQuery.isLoading ||
+    projectConfigQuery.isLoading ||
     getFreightQuery.isLoading ||
     listWarehousesQuery.isLoading ||
     listStagesQuery.isLoading;
@@ -120,7 +135,7 @@ export const Pipelines = (props: { creatingStage?: boolean; creatingWarehouse?:
 
   const freightInStages = useFreightInStage(listStagesQuery.data?.stages || []);
   const freightById = useFreightById(getFreightQuery.data?.groups?.['']?.freight || []);
-  const stageAutoPromotionMap = useStageAutoPromotionMap(project);
+  const stageAutoPromotionMap = useStageAutoPromotionMap(project, projectConfig);
   const subscribersByStage = useSubscribersByStage(listStagesQuery.data?.stages || []);
   const stageByName = useStageByName(listStagesQuery.data?.stages || []);
   const warehouseDrawer = useGetWarehouse(
@@ -132,6 +147,13 @@ export const Pipelines = (props: { creatingStage?: boolean; creatingWarehouse?:
     freightName
   );
 
+  useSyncFreight({
+    freights: freightById,
+    freightInStages
+  });
+
+  const freights = getFreightQuery.data?.groups?.['']?.freight || [];
+
   if (loading) {
     return <LoadingState />;
   }
@@ -171,10 +193,7 @@ export const Pipelines = (props: { creatingStage?: boolean; creatingWarehouse?:
           }}
         >
           <ColorContext.Provider value={{ stageColorMap, warehouseColorMap }}>
-            <FreightTimeline
-              freights={getFreightQuery.data?.groups?.['']?.freight || []}
-              project={projectName || ''}
-            />
+            <FreightTimeline freights={freights} project={projectName || ''} />
 
             <div className='w-full h-full relative'>
               <Flex gap={12} className='absolute z-10 top-2 right-2 left-2'>
diff --git a/ui/src/features/project/pipelines/use-stage-auto-promotion-map.ts b/ui/src/features/project/pipelines/use-stage-auto-promotion-map.ts
index 969cd95b..99a6a6b3 100644
--- a/ui/src/features/project/pipelines/use-stage-auto-promotion-map.ts
+++ b/ui/src/features/project/pipelines/use-stage-auto-promotion-map.ts
@@ -1,16 +1,30 @@
 import { useMemo } from 'react';
 
-import { Project } from '@ui/gen/api/v1alpha1/generated_pb';
+import { Project, ProjectConfig } from '@ui/gen/api/v1alpha1/generated_pb';
 
-export const useStageAutoPromotionMap = (project: Project): Record<string, boolean> =>
+export const useStageAutoPromotionMap = (
+  project: Project,
+  projectConfig: ProjectConfig
+): Record<string, boolean> =>
   useMemo(() => {
     const map: Record<string, boolean> = {};
 
+    // deprecated
     for (const policy of project?.spec?.promotionPolicies || []) {
       if (policy.stage) {
         map[policy.stage] = policy.autoPromotionEnabled;
       }
     }
 
+    for (const policy of projectConfig?.spec?.promotionPolicies || []) {
+      if (policy.stage) {
+        map[policy.stage] = policy.autoPromotionEnabled;
+      }
+
+      if (policy.stageSelector?.name) {
+        map[policy.stageSelector?.name || ''] = policy.autoPromotionEnabled;
+      }
+    }
+
     return map;
-  }, [project]);
+  }, [project, projectConfig]);
diff --git a/ui/src/features/project/pipelines/use-sync-freight.ts b/ui/src/features/project/pipelines/use-sync-freight.ts
new file mode 100644
index 00000000..788d7488
--- /dev/null
+++ b/ui/src/features/project/pipelines/use-sync-freight.ts
@@ -0,0 +1,23 @@
+import { useEffect } from 'react';
+
+import { queryCache } from '@ui/features/utils/cache';
+import { Freight, Stage } from '@ui/gen/api/v1alpha1/generated_pb';
+
+export const useSyncFreight = (payload: {
+  freights?: Record<string, Freight>;
+  freightInStages?: Record<string, Stage[]>;
+}) => {
+  useEffect(() => {
+    if (payload.freights && payload.freightInStages) {
+      const freights = Object.keys(payload.freights || {});
+      const freightInStages = Object.keys(payload.freightInStages || {});
+
+      for (const freightInStage of freightInStages) {
+        if (!freights.find((f) => f === freightInStage)) {
+          queryCache.freight.refetchQueryFreight();
+          return;
+        }
+      }
+    }
+  }, [payload]);
+};
diff --git a/ui/src/features/project/settings/project-settings.tsx b/ui/src/features/project/settings/project-settings.tsx
index f432f328..54df5231 100644
--- a/ui/src/features/project/settings/project-settings.tsx
+++ b/ui/src/features/project/settings/project-settings.tsx
@@ -3,6 +3,7 @@ import {
   faAsterisk,
   faChartBar,
   faGear,
+  faGears,
   faPeopleGroup,
   faTasks
 } from '@fortawesome/free-solid-svg-icons';
@@ -19,6 +20,7 @@ import { useProjectBreadcrumbs } from '../project-utils';
 import { AnalysisTemplatesSettings } from './views/analysis-templates/analysis-templates';
 import { CredentialsSettings } from './views/credentials/credentials';
 import { GeneralSettings } from './views/general/general-settings';
+import { ProjectConfig } from './views/project-config/project-config';
 import { PromotionTasks } from './views/promotion-tasks/promotion-tasks';
 import { RolesSettings } from './views/roles/roles';
 
@@ -35,6 +37,12 @@ export const ProjectSettings = () => {
         path: 'general',
         component: GeneralSettings
       },
+      projectConfig: {
+        label: 'ProjectConfig',
+        icon: faGears,
+        path: 'project-config',
+        component: ProjectConfig
+      },
       analysisTemplates: {
         label: 'Analysis Templates',
         icon: faChartBar,
diff --git a/ui/src/features/project/settings/views/general/general-settings.tsx b/ui/src/features/project/settings/views/general/general-settings.tsx
index 76cd9a1d..7813a053 100644
--- a/ui/src/features/project/settings/views/general/general-settings.tsx
+++ b/ui/src/features/project/settings/views/general/general-settings.tsx
@@ -9,6 +9,7 @@ import { z } from 'zod';
 
 import { YamlEditor } from '@ui/features/common/code-editor/yaml-editor';
 import { FieldContainer } from '@ui/features/common/form/field-container';
+import { projectYAMLExample } from '@ui/features/project/list/utils/project-yaml-example';
 import {
   getProject,
   updateResource
@@ -21,7 +22,6 @@ import { zodValidators } from '@ui/utils/validators';
 const formSchema = z.object({
   value: zodValidators.requiredString
 });
-import { projectYAMLExample } from '../../../list/utils/project-yaml-example';
 
 import { DeleteProject } from './delete-project-modal';
 
diff --git a/ui/src/features/project/settings/views/project-config/project-config.tsx b/ui/src/features/project/settings/views/project-config/project-config.tsx
new file mode 100644
index 00000000..d94f4370
--- /dev/null
+++ b/ui/src/features/project/settings/views/project-config/project-config.tsx
@@ -0,0 +1,93 @@
+import { useMutation, useQuery } from '@connectrpc/connect-query';
+import { zodResolver } from '@hookform/resolvers/zod';
+import { Button, Card, Flex, message } from 'antd';
+import type { JSONSchema4 } from 'json-schema';
+import { useForm } from 'react-hook-form';
+import { useParams } from 'react-router-dom';
+import yaml from 'yaml';
+import { z } from 'zod';
+
+import { YamlEditor } from '@ui/features/common/code-editor/yaml-editor';
+import { FieldContainer } from '@ui/features/common/form/field-container';
+import { projectConfigYAMLExample } from '@ui/features/project/list/utils/project-yaml-example';
+import {
+  createOrUpdateResource,
+  getProjectConfig
+} from '@ui/gen/api/service/v1alpha1/service-KargoService_connectquery';
+import { RawFormat } from '@ui/gen/api/service/v1alpha1/service_pb';
+import projectConfigSchema from '@ui/gen/schema/projectconfigs.kargo.akuity.io_v1alpha1.json';
+import { decodeRawData } from '@ui/utils/decode-raw-data';
+import { zodValidators } from '@ui/utils/validators';
+
+import { projectConfigTransport } from './transport';
+
+const formSchema = z.object({
+  value: zodValidators.requiredString
+});
+
+export const ProjectConfig = () => {
+  const { name } = useParams();
+
+  const projectConfigQuery = useQuery(
+    getProjectConfig,
+    { name, format: RawFormat.YAML },
+    {
+      transport: projectConfigTransport
+    }
+  );
+
+  const projectConfigYAML = decodeRawData(projectConfigQuery.data);
+
+  const creation = !projectConfigYAML;
+
+  const projectConfigForm = useForm({
+    values: {
+      value: projectConfigYAML
+    },
+    resolver: zodResolver(formSchema)
+  });
+
+  const createOrUpdateMutation = useMutation(createOrUpdateResource, {
+    onSuccess: () => {
+      message.success({ content: `ProjectConfig has been ${creation ? 'created' : 'updated'}` });
+      projectConfigQuery.refetch();
+    }
+  });
+
+  const onSubmitConfig = projectConfigForm.handleSubmit(async (data) => {
+    const textEncoder = new TextEncoder();
+    await createOrUpdateMutation.mutateAsync({
+      manifest: textEncoder.encode(data.value)
+    });
+  });
+
+  return (
+    <Flex gap={16} vertical>
+      <Card title='ProjectConfig' type='inner'>
+        <FieldContainer control={projectConfigForm.control} name='value'>
+          {({ field }) => (
+            <YamlEditor
+              label='YAML'
+              isLoading={projectConfigQuery.isLoading}
+              height='500px'
+              value={field.value}
+              onChange={(e) => field.onChange(e || '')}
+              placeholder={yaml.stringify(projectConfigYAMLExample)}
+              schema={projectConfigSchema as JSONSchema4}
+              isHideManagedFieldsDisplayed
+            />
+          )}
+        </FieldContainer>
+        <Flex justify='flex-end'>
+          <Button
+            type='primary'
+            onClick={onSubmitConfig}
+            loading={createOrUpdateMutation.isPending}
+          >
+            {creation ? 'Create' : 'Update'}
+          </Button>
+        </Flex>
+      </Card>
+    </Flex>
+  );
+};
diff --git a/ui/src/features/project/settings/views/project-config/transport.ts b/ui/src/features/project/settings/views/project-config/transport.ts
new file mode 100644
index 00000000..67fe42b7
--- /dev/null
+++ b/ui/src/features/project/settings/views/project-config/transport.ts
@@ -0,0 +1,15 @@
+import { Code } from '@connectrpc/connect';
+
+import { defaultErrorHandler, newErrorHandler, newTransportWithAuth } from '@ui/config/transport';
+
+export const projectConfigTransport = newTransportWithAuth(
+  newErrorHandler((err) => {
+    if (err.code === Code.NotFound) {
+      // ignore 404 because ProjectConfig may not be created when we create a new Project
+      // and we need to ignore the error
+      return;
+    }
+
+    defaultErrorHandler(err);
+  })
+);
diff --git a/ui/src/features/stage/stage-details.tsx b/ui/src/features/stage/stage-details.tsx
index 6b0ce167..59c5ed1f 100644
--- a/ui/src/features/stage/stage-details.tsx
+++ b/ui/src/features/stage/stage-details.tsx
@@ -21,7 +21,7 @@ import {
   getStage
 } from '@ui/gen/api/service/v1alpha1/service-KargoService_connectquery';
 import { RawFormat } from '@ui/gen/api/service/v1alpha1/service_pb';
-import { Stage, VerificationInfo } from '@ui/gen/api/v1alpha1/generated_pb';
+import { Stage } from '@ui/gen/api/v1alpha1/generated_pb';
 import { timestampDate } from '@ui/utils/connectrpc-utils';
 import { decodeRawData } from '@ui/utils/decode-raw-data';
 
@@ -65,7 +65,7 @@ export const StageDetails = ({ stage }: { stage: Stage }) => {
           return {
             ...verification,
             freight
-          } as VerificationInfo;
+          };
         })
       )
       .sort((a, b) => moment(timestampDate(b.startTime)).diff(moment(timestampDate(a.startTime))));
diff --git a/ui/src/features/stage/verifications.tsx b/ui/src/features/stage/verifications.tsx
index 0e27ca24..7f559576 100644
--- a/ui/src/features/stage/verifications.tsx
+++ b/ui/src/features/stage/verifications.tsx
@@ -7,7 +7,7 @@ import { Link as ReactRouterLink } from 'react-router-dom';
 import { generatePath } from 'react-router-dom';
 
 import { paths } from '@ui/config/paths';
-import { VerificationInfo } from '@ui/gen/api/v1alpha1/generated_pb';
+import { FreightCollection, VerificationInfo } from '@ui/gen/api/v1alpha1/generated_pb';
 import { timestampDate } from '@ui/utils/connectrpc-utils';
 
 import { AnalysisModal } from '../common/analysis-modal/analysis-modal';
@@ -17,7 +17,7 @@ import { verificationPhaseIsTerminal } from './utils/verification-phase';
 import { VerificationIcon } from './verification-icon';
 
 type Props = {
-  verifications: VerificationInfo[];
+  verifications: Array<VerificationInfo & { freight: FreightCollection }>;
   images: string[];
 };
 
@@ -127,19 +127,20 @@ export const Verifications = ({ verifications, images }: Props) => {
             </Link>
           )}
         />
-        <Table.Column
+        <Table.Column<(typeof verifications)[number]>
           title='Freight'
-          render={(val) => {
-            const freights = val?.freight?.items;
+          render={(val, verification) => {
+            const freights = verification?.freight?.items;
+            const freight = Object.values(freights || {})?.[0];
 
-            const freight = Object.values(freights || {})?.[0] as {
-              name: string;
-            };
+            if (!verification?.analysisRun?.namespace || !freight?.name) {
+              return null;
+            }
 
             return (
               <ReactRouterLink
                 to={generatePath(paths.freight, {
-                  name: val?.analysisRun?.namespace,
+                  name: verification?.analysisRun?.namespace,
                   freightName: freight?.name
                 })}
               >
diff --git a/ui/src/features/utils/cache/freight.ts b/ui/src/features/utils/cache/freight.ts
index 4b744cfa..8bb47873 100644
--- a/ui/src/features/utils/cache/freight.ts
+++ b/ui/src/features/utils/cache/freight.ts
@@ -1,7 +1,10 @@
 import { createConnectQueryKey } from '@connectrpc/connect-query';
 
 import { queryClient } from '@ui/config/query-client';
-import { getFreight } from '@ui/gen/api/service/v1alpha1/service-KargoService_connectquery';
+import {
+  getFreight,
+  queryFreight
+} from '@ui/gen/api/service/v1alpha1/service-KargoService_connectquery';
 
 export default {
   refetch: () => {
@@ -11,5 +14,14 @@ export default {
         cardinality: 'finite'
       })
     });
+  },
+  refetchQueryFreight: () => {
+    queryClient.refetchQueries({
+      exact: false,
+      queryKey: createConnectQueryKey({
+        schema: queryFreight,
+        cardinality: 'finite'
+      })
+    });
   }
 };
diff --git a/ui/src/gen/api/service/v1alpha1/service-KargoService_connectquery.ts b/ui/src/gen/api/service/v1alpha1/service-KargoService_connectquery.ts
index 08c5a1f3..b0d9b8af 100644
--- a/ui/src/gen/api/service/v1alpha1/service-KargoService_connectquery.ts
+++ b/ui/src/gen/api/service/v1alpha1/service-KargoService_connectquery.ts
@@ -102,6 +102,16 @@ export const getProject = KargoService.method.getProject;
  */
 export const listProjects = KargoService.method.listProjects;
 
+/**
+ * @generated from rpc akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectConfig
+ */
+export const deleteProjectConfig = KargoService.method.deleteProjectConfig;
+
+/**
+ * @generated from rpc akuity.io.kargo.service.v1alpha1.KargoService.GetProjectConfig
+ */
+export const getProjectConfig = KargoService.method.getProjectConfig;
+
 /**
  * @generated from rpc akuity.io.kargo.service.v1alpha1.KargoService.ApproveFreight
  */
diff --git a/ui/src/gen/api/service/v1alpha1/service_pb.ts b/ui/src/gen/api/service/v1alpha1/service_pb.ts
index dccb8741..63f6562b 100644
--- a/ui/src/gen/api/service/v1alpha1/service_pb.ts
+++ b/ui/src/gen/api/service/v1alpha1/service_pb.ts
@@ -6,7 +6,7 @@ import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobu
 import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv1";
 import type { Timestamp } from "@bufbuild/protobuf/wkt";
 import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
-import type { ClusterPromotionTask, Freight, Project, Promotion, PromotionTask, Stage, Warehouse } from "../../v1alpha1/generated_pb";
+import type { ClusterPromotionTask, Freight, Project, ProjectConfig, Promotion, PromotionTask, Stage, Warehouse } from "../../v1alpha1/generated_pb";
 import { file_api_v1alpha1_generated } from "../../v1alpha1/generated_pb";
 import type { Event, Secret } from "../../../k8s.io/api/core/v1/generated_pb";
 import { file_k8s_io_api_core_v1_generated } from "../../../k8s.io/api/core/v1/generated_pb";
@@ -20,7 +20,7 @@ import type { Message } from "@bufbuild/protobuf";
  * Describes the file api/service/v1alpha1/service.proto.
  */
 export const file_api_service_v1alpha1_service: GenFile = /*@__PURE__*/
-  fileDesc("CiJhcGkvc2VydmljZS92MWFscGhhMS9zZXJ2aWNlLnByb3RvEiBha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMSKrAQoRQ29tcG9uZW50VmVyc2lvbnMSQgoGc2VydmVyGAEgASgLMi0uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVmVyc2lvbkluZm9IAIgBARI/CgNjbGkYAiABKAsyLS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5WZXJzaW9uSW5mb0gBiAEBQgkKB19zZXJ2ZXJCBgoEX2NsaSKyAQoLVmVyc2lvbkluZm8SDwoHdmVyc2lvbhgBIAEoCRISCgpnaXRfY29tbWl0GAIgASgJEhYKDmdpdF90cmVlX2RpcnR5GAMgASgIEi4KCmJ1aWxkX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCmdvX3ZlcnNpb24YBSABKAkSEAoIY29tcGlsZXIYBiABKAkSEAoIcGxhdGZvcm0YByABKAkiFwoVR2V0VmVyc2lvbkluZm9SZXF1ZXN0Il0KFkdldFZlcnNpb25JbmZvUmVzcG9uc2USQwoMdmVyc2lvbl9pbmZvGAEgASgLMi0uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVmVyc2lvbkluZm8iEgoQR2V0Q29uZmlnUmVxdWVzdCItCgtBcmdvQ0RTaGFyZBILCgN1cmwYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIvgBChFHZXRDb25maWdSZXNwb25zZRJcCg1hcmdvY2Rfc2hhcmRzGAEgAygLMkUuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0Q29uZmlnUmVzcG9uc2UuQXJnb2NkU2hhcmRzRW50cnkSIQoZc2VjcmV0X21hbmFnZW1lbnRfZW5hYmxlZBgCIAEoCBpiChFBcmdvY2RTaGFyZHNFbnRyeRILCgNrZXkYASABKAkSPAoFdmFsdWUYAiABKAsyLS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BcmdvQ0RTaGFyZDoCOAEiGAoWR2V0UHVibGljQ29uZmlnUmVxdWVzdCKOAQoXR2V0UHVibGljQ29uZmlnUmVzcG9uc2USQQoLb2lkY19jb25maWcYASABKAsyLC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5PSURDQ29uZmlnEh0KFWFkbWluX2FjY291bnRfZW5hYmxlZBgCIAEoCBIRCglza2lwX2F1dGgYAyABKAgiWgoKT0lEQ0NvbmZpZxISCgppc3N1ZXJfdXJsGAEgASgJEhEKCWNsaWVudF9pZBgCIAEoCRIOCgZzY29wZXMYAyADKAkSFQoNY2xpX2NsaWVudF9pZBgEIAEoCSIlChFBZG1pbkxvZ2luUmVxdWVzdBIQCghwYXNzd29yZBgBIAEoCSImChJBZG1pbkxvZ2luUmVzcG9uc2USEAoIaWRfdG9rZW4YASABKAkiKQoVQ3JlYXRlUmVzb3VyY2VSZXF1ZXN0EhAKCG1hbmlmZXN0GAEgASgMIlYKFENyZWF0ZVJlc291cmNlUmVzdWx0EiMKGWNyZWF0ZWRfcmVzb3VyY2VfbWFuaWZlc3QYASABKAxIABIPCgVlcnJvchgCIAEoCUgAQggKBnJlc3VsdCJhChZDcmVhdGVSZXNvdXJjZVJlc3BvbnNlEkcKB3Jlc3VsdHMYASADKAsyNi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVSZXNvdXJjZVJlc3VsdCIxCh1DcmVhdGVPclVwZGF0ZVJlc291cmNlUmVxdWVzdBIQCghtYW5pZmVzdBgBIAEoDCKDAQocQ3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlc3VsdBIjChljcmVhdGVkX3Jlc291cmNlX21hbmlmZXN0GAEgASgMSAASIwoZdXBkYXRlZF9yZXNvdXJjZV9tYW5pZmVzdBgCIAEoDEgAEg8KBWVycm9yGAMgASgJSABCCAoGcmVzdWx0InEKHkNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VSZXNwb25zZRJPCgdyZXN1bHRzGAEgAygLMj4uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlc3VsdCIpChVVcGRhdGVSZXNvdXJjZVJlcXVlc3QSEAoIbWFuaWZlc3QYASABKAwiVgoUVXBkYXRlUmVzb3VyY2VSZXN1bHQSIwoZdXBkYXRlZF9yZXNvdXJjZV9tYW5pZmVzdBgBIAEoDEgAEg8KBWVycm9yGAIgASgJSABCCAoGcmVzdWx0ImEKFlVwZGF0ZVJlc291cmNlUmVzcG9uc2USRwoHcmVzdWx0cxgBIAMoCzI2LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZVJlc291cmNlUmVzdWx0IikKFURlbGV0ZVJlc291cmNlUmVxdWVzdBIQCghtYW5pZmVzdBgBIAEoDCJWChREZWxldGVSZXNvdXJjZVJlc3VsdBIjChlkZWxldGVkX3Jlc291cmNlX21hbmlmZXN0GAEgASgMSAASDwoFZXJyb3IYAiABKAlIAEIICgZyZXN1bHQiYQoWRGVsZXRlUmVzb3VyY2VSZXNwb25zZRJHCgdyZXN1bHRzGAEgAygLMjYuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUmVzb3VyY2VSZXN1bHQiJAoRTGlzdFN0YWdlc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCSJRChJMaXN0U3RhZ2VzUmVzcG9uc2USOwoGc3RhZ2VzGAEgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlIiQKEUxpc3RJbWFnZXNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkivwEKEkxpc3RJbWFnZXNSZXNwb25zZRJQCgZpbWFnZXMYAiADKAsyQC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0SW1hZ2VzUmVzcG9uc2UuSW1hZ2VzRW50cnkaVwoLSW1hZ2VzRW50cnkSCwoDa2V5GAEgASgJEjcKBXZhbHVlGAIgASgLMiguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVGFnTWFwOgI4ASKoAQoGVGFnTWFwEkAKBHRhZ3MYASADKAsyMi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5UYWdNYXAuVGFnc0VudHJ5GlwKCVRhZ3NFbnRyeRILCgNrZXkYASABKAkSPgoFdmFsdWUYAiABKAsyLy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5JbWFnZVN0YWdlTWFwOgI4ASKLAQoNSW1hZ2VTdGFnZU1hcBJLCgZzdGFnZXMYASADKAsyOy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5JbWFnZVN0YWdlTWFwLlN0YWdlc0VudHJ5Gi0KC1N0YWdlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBToCOAEibQoPR2V0U3RhZ2VSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCRI7CgZmb3JtYXQYAyABKA4yKy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5SYXdGb3JtYXQiaQoQR2V0U3RhZ2VSZXNwb25zZRI8CgVzdGFnZRgBIAEoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZUgAEg0KA3JhdxgCIAEoDEgAQggKBnJlc3VsdCIzChJXYXRjaFN0YWdlc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJIl8KE1dhdGNoU3RhZ2VzUmVzcG9uc2USOgoFc3RhZ2UYASABKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2USDAoEdHlwZRgCIAEoCSIzChJEZWxldGVTdGFnZVJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJIhUKE0RlbGV0ZVN0YWdlUmVzcG9uc2UiNAoTUmVmcmVzaFN0YWdlUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiUgoUUmVmcmVzaFN0YWdlUmVzcG9uc2USOgoFc3RhZ2UYASABKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2UiRgoVTGlzdFByb21vdGlvbnNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSEgoFc3RhZ2UYAiABKAlIAIgBAUIICgZfc3RhZ2UiXQoWTGlzdFByb21vdGlvbnNSZXNwb25zZRJDCgpwcm9tb3Rpb25zGAEgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvbiJHChZXYXRjaFByb21vdGlvbnNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSEgoFc3RhZ2UYAiABKAlIAIgBAUIICgZfc3RhZ2UiawoXV2F0Y2hQcm9tb3Rpb25zUmVzcG9uc2USQgoJcHJvbW90aW9uGAEgASgLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvbhIMCgR0eXBlGAIgASgJInEKE0dldFByb21vdGlvblJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEjsKBmZvcm1hdBgDIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCJ1ChRHZXRQcm9tb3Rpb25SZXNwb25zZRJECglwcm9tb3Rpb24YASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uSAASDQoDcmF3GAIgASgMSABCCAoGcmVzdWx0IjYKFVdhdGNoUHJvbW90aW9uUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiagoWV2F0Y2hQcm9tb3Rpb25SZXNwb25zZRJCCglwcm9tb3Rpb24YASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uEgwKBHR5cGUYAiABKAkiNgoVQWJvcnRQcm9tb3Rpb25SZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCSIYChZBYm9ydFByb21vdGlvblJlc3BvbnNlIiQKFERlbGV0ZVByb2plY3RSZXF1ZXN0EgwKBG5hbWUYASABKAkiFwoVRGVsZXRlUHJvamVjdFJlc3BvbnNlIl4KEUdldFByb2plY3RSZXF1ZXN0EgwKBG5hbWUYASABKAkSOwoGZm9ybWF0GAIgASgOMisuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmF3Rm9ybWF0Im8KEkdldFByb2plY3RSZXNwb25zZRJACgdwcm9qZWN0GAEgASgLMi0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RIABINCgNyYXcYAiABKAxIAEIICgZyZXN1bHQidwoTTGlzdFByb2plY3RzUmVxdWVzdBIWCglwYWdlX3NpemUYASABKAVIAIgBARIRCgRwYWdlGAIgASgFSAGIAQESEwoGZmlsdGVyGAMgASgJSAKIAQFCDAoKX3BhZ2Vfc2l6ZUIHCgVfcGFnZUIJCgdfZmlsdGVyImYKFExpc3RQcm9qZWN0c1Jlc3BvbnNlEj8KCHByb2plY3RzGAEgAygLMi0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3QSDQoFdG90YWwYAiABKAUiVAoVQXBwcm92ZUZyZWlnaHRSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCRINCgVhbGlhcxgDIAEoCRINCgVzdGFnZRgEIAEoCSIYChZBcHByb3ZlRnJlaWdodFJlc3BvbnNlIkQKFERlbGV0ZUZyZWlnaHRSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCRINCgVhbGlhcxgDIAEoCSIXChVEZWxldGVGcmVpZ2h0UmVzcG9uc2UifgoRR2V0RnJlaWdodFJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBWFsaWFzGAMgASgJEjsKBmZvcm1hdBgEIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCJvChJHZXRGcmVpZ2h0UmVzcG9uc2USQAoHZnJlaWdodBgBIAEoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0SAASDQoDcmF3GAIgASgMSABCCAoGcmVzdWx0Il8KFVByb21vdGVUb1N0YWdlUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEg0KBXN0YWdlGAIgASgJEg8KB2ZyZWlnaHQYAyABKAkSFQoNZnJlaWdodF9hbGlhcxgEIAEoCSJcChZQcm9tb3RlVG9TdGFnZVJlc3BvbnNlEkIKCXByb21vdGlvbhgBIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iYgoYUHJvbW90ZURvd25zdHJlYW1SZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDQoFc3RhZ2UYAiABKAkSDwoHZnJlaWdodBgDIAEoCRIVCg1mcmVpZ2h0X2FsaWFzGAQgASgJImAKGVByb21vdGVEb3duc3RyZWFtUmVzcG9uc2USQwoKcHJvbW90aW9ucxgBIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iigEKE1F1ZXJ5RnJlaWdodFJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRINCgVzdGFnZRgCIAEoCRIQCghncm91cF9ieRgDIAEoCRINCgVncm91cBgEIAEoCRIQCghvcmRlcl9ieRgFIAEoCRIPCgdyZXZlcnNlGAYgASgIEg8KB29yaWdpbnMYByADKAkiyAEKFFF1ZXJ5RnJlaWdodFJlc3BvbnNlElIKBmdyb3VwcxgBIAMoCzJCLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlF1ZXJ5RnJlaWdodFJlc3BvbnNlLkdyb3Vwc0VudHJ5GlwKC0dyb3Vwc0VudHJ5EgsKA2tleRgBIAEoCRI8CgV2YWx1ZRgCIAEoCzItLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkZyZWlnaHRMaXN0OgI4ASJNCgtGcmVpZ2h0TGlzdBI+CgdmcmVpZ2h0GAEgAygLMi0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHQiYAoZVXBkYXRlRnJlaWdodEFsaWFzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSEQoJb2xkX2FsaWFzGAMgASgJEhEKCW5ld19hbGlhcxgEIAEoCSIcChpVcGRhdGVGcmVpZ2h0QWxpYXNSZXNwb25zZSIxCg9SZXZlcmlmeVJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRINCgVzdGFnZRgCIAEoCSISChBSZXZlcmlmeVJlc3BvbnNlIjoKGEFib3J0VmVyaWZpY2F0aW9uUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEg0KBXN0YWdlGAIgASgJIhsKGUFib3J0VmVyaWZpY2F0aW9uUmVzcG9uc2UiKAoVTGlzdFdhcmVob3VzZXNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkiXQoWTGlzdFdhcmVob3VzZXNSZXNwb25zZRJDCgp3YXJlaG91c2VzGAEgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZSJxChNHZXRXYXJlaG91c2VSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCRI7CgZmb3JtYXQYAyABKA4yKy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5SYXdGb3JtYXQidQoUR2V0V2FyZWhvdXNlUmVzcG9uc2USRAoJd2FyZWhvdXNlGAEgASgLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZUgAEg0KA3JhdxgCIAEoDEgAQggKBnJlc3VsdCI3ChZXYXRjaFdhcmVob3VzZXNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCSJrChdXYXRjaFdhcmVob3VzZXNSZXNwb25zZRJCCgl3YXJlaG91c2UYASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlEgwKBHR5cGUYAiABKAkiNwoWRGVsZXRlV2FyZWhvdXNlUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiGQoXRGVsZXRlV2FyZWhvdXNlUmVzcG9uc2UiOAoXUmVmcmVzaFdhcmVob3VzZVJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJIl4KGFJlZnJlc2hXYXJlaG91c2VSZXNwb25zZRJCCgl3YXJlaG91c2UYASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlIiwKGUxpc3RQcm9qZWN0U2VjcmV0c1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCSJJChpMaXN0UHJvamVjdFNlY3JldHNSZXNwb25zZRIrCgdzZWNyZXRzGAEgAygLMhouazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldCLTAQoaQ3JlYXRlUHJvamVjdFNlY3JldFJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJElQKBGRhdGEYBCADKAsyRi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVQcm9qZWN0U2VjcmV0UmVxdWVzdC5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiSQobQ3JlYXRlUHJvamVjdFNlY3JldFJlc3BvbnNlEioKBnNlY3JldBgBIAEoCzIaLms4cy5pby5hcGkuY29yZS52MS5TZWNyZXQi0wEKGlVwZGF0ZVByb2plY3RTZWNyZXRSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRJUCgRkYXRhGAQgAygLMkYuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVXBkYXRlUHJvamVjdFNlY3JldFJlcXVlc3QuRGF0YUVudHJ5GisKCURhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkkKG1VwZGF0ZVByb2plY3RTZWNyZXRSZXNwb25zZRIqCgZzZWNyZXQYASABKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0IjsKGkRlbGV0ZVByb2plY3RTZWNyZXRSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCSIdChtEZWxldGVQcm9qZWN0U2VjcmV0UmVzcG9uc2UixgEKGENyZWF0ZUNyZWRlbnRpYWxzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSEwoLZGVzY3JpcHRpb24YCCABKAkSDAoEdHlwZRgDIAEoCRIZCghyZXBvX3VybBgEIAEoCVIHcmVwb1VSTBIpChFyZXBvX3VybF9pc19yZWdleBgFIAEoCFIOcmVwb1VSTElzUmVnZXgSEAoIdXNlcm5hbWUYBiABKAkSEAoIcGFzc3dvcmQYByABKAkiTAoZQ3JlYXRlQ3JlZGVudGlhbHNSZXNwb25zZRIvCgtjcmVkZW50aWFscxgBIAEoCzIaLms4cy5pby5hcGkuY29yZS52MS5TZWNyZXQiOQoYRGVsZXRlQ3JlZGVudGlhbHNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCSIbChlEZWxldGVDcmVkZW50aWFsc1Jlc3BvbnNlInMKFUdldENyZWRlbnRpYWxzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSOwoGZm9ybWF0GAMgASgOMisuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmF3Rm9ybWF0ImQKFkdldENyZWRlbnRpYWxzUmVzcG9uc2USMQoLY3JlZGVudGlhbHMYASABKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0SAASDQoDcmF3GAIgASgMSABCCAoGcmVzdWx0IikKFkxpc3RDcmVkZW50aWFsc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCSJKChdMaXN0Q3JlZGVudGlhbHNSZXNwb25zZRIvCgtjcmVkZW50aWFscxgBIAMoCzIaLms4cy5pby5hcGkuY29yZS52MS5TZWNyZXQixgEKGFVwZGF0ZUNyZWRlbnRpYWxzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSEwoLZGVzY3JpcHRpb24YCCABKAkSDAoEdHlwZRgDIAEoCRIZCghyZXBvX3VybBgEIAEoCVIHcmVwb1VSTBIpChFyZXBvX3VybF9pc19yZWdleBgFIAEoCFIOcmVwb1VSTElzUmVnZXgSEAoIdXNlcm5hbWUYBiABKAkSEAoIcGFzc3dvcmQYByABKAkiTAoZVXBkYXRlQ3JlZGVudGlhbHNSZXNwb25zZRIvCgtjcmVkZW50aWFscxgBIAEoCzIaLms4cy5pby5hcGkuY29yZS52MS5TZWNyZXQiLwocTGlzdEFuYWx5c2lzVGVtcGxhdGVzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJIoIBCh1MaXN0QW5hbHlzaXNUZW1wbGF0ZXNSZXNwb25zZRJhChJhbmFseXNpc190ZW1wbGF0ZXMYASADKAsyRS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkuc3R1YnMucm9sbG91dHMudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZSIsChlMaXN0UHJvbW90aW9uVGFza3NSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkiagoaTGlzdFByb21vdGlvblRhc2tzUmVzcG9uc2USTAoPcHJvbW90aW9uX3Rhc2tzGAEgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2siIgogTGlzdENsdXN0ZXJQcm9tb3Rpb25UYXNrc1JlcXVlc3QigAEKIUxpc3RDbHVzdGVyUHJvbW90aW9uVGFza3NSZXNwb25zZRJbChdjbHVzdGVyX3Byb21vdGlvbl90YXNrcxgBIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DbHVzdGVyUHJvbW90aW9uVGFzayJ4ChpHZXRBbmFseXNpc1RlbXBsYXRlUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSOwoGZm9ybWF0GAMgASgOMisuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmF3Rm9ybWF0IpoBChtHZXRBbmFseXNpc1RlbXBsYXRlUmVzcG9uc2USYgoRYW5hbHlzaXNfdGVtcGxhdGUYASABKAsyRS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkuc3R1YnMucm9sbG91dHMudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZUgAEg0KA3JhdxgCIAEoDEgAQggKBnJlc3VsdCJ1ChdHZXRQcm9tb3Rpb25UYXNrUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSOwoGZm9ybWF0GAMgASgOMisuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmF3Rm9ybWF0IoIBChhHZXRQcm9tb3Rpb25UYXNrUmVzcG9uc2USTQoOcHJvbW90aW9uX3Rhc2sYASABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0gAEg0KA3JhdxgCIAEoDEgAQggKBnJlc3VsdCJrCh5HZXRDbHVzdGVyUHJvbW90aW9uVGFza1JlcXVlc3QSDAoEbmFtZRgCIAEoCRI7CgZmb3JtYXQYAyABKA4yKy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5SYXdGb3JtYXQipgEKH0dldENsdXN0ZXJQcm9tb3Rpb25UYXNrUmVzcG9uc2USagoOcHJvbW90aW9uX3Rhc2sYASABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2x1c3RlclByb21vdGlvblRhc2tIAFIUY2x1c3RlclByb21vdGlvblRhc2sSDQoDcmF3GAIgASgMSABCCAoGcmVzdWx0IiUKI0xpc3RDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZXNSZXF1ZXN0IrMBCiRMaXN0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGVzUmVzcG9uc2USigEKGmNsdXN0ZXJfYW5hbHlzaXNfdGVtcGxhdGVzGAEgAygLMkwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnN0dWJzLnJvbGxvdXRzLnYxYWxwaGExLkNsdXN0ZXJBbmFseXNpc1RlbXBsYXRlUhhjbHVzdGVyYW5hbHlzaXNUZW1wbGF0ZXMibgohR2V0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGVSZXF1ZXN0EgwKBG5hbWUYAiABKAkSOwoGZm9ybWF0GAMgASgOMisuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmF3Rm9ybWF0IrABCiJHZXRDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZVJlc3BvbnNlEnEKGWNsdXN0ZXJfYW5hbHlzaXNfdGVtcGxhdGUYASABKAsyTC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkuc3R1YnMucm9sbG91dHMudjFhbHBoYTEuQ2x1c3RlckFuYWx5c2lzVGVtcGxhdGVIABINCgNyYXcYAiABKAxIAEIICgZyZXN1bHQidQoVR2V0QW5hbHlzaXNSdW5SZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEjsKBmZvcm1hdBgDIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCKLAQoWR2V0QW5hbHlzaXNSdW5SZXNwb25zZRJYCgxhbmFseXNpc19ydW4YASABKAsyQC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkuc3R1YnMucm9sbG91dHMudjFhbHBoYTEuQW5hbHlzaXNSdW5IABINCgNyYXcYAiABKAxIAEIICgZyZXN1bHQiaQoZR2V0QW5hbHlzaXNSdW5Mb2dzUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRITCgttZXRyaWNfbmFtZRgDIAEoCRIWCg5jb250YWluZXJfbmFtZRgEIAEoCSIrChpHZXRBbmFseXNpc1J1bkxvZ3NSZXNwb25zZRINCgVjaHVuaxgBIAEoCSI+Ch1EZWxldGVBbmFseXNpc1RlbXBsYXRlUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiIAoeRGVsZXRlQW5hbHlzaXNUZW1wbGF0ZVJlc3BvbnNlIjQKJERlbGV0ZUNsdXN0ZXJBbmFseXNpc1RlbXBsYXRlUmVxdWVzdBIMCgRuYW1lGAIgASgJIicKJURlbGV0ZUNsdXN0ZXJBbmFseXNpc1RlbXBsYXRlUmVzcG9uc2UiKwoYTGlzdFByb2plY3RFdmVudHNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkiRgoZTGlzdFByb2plY3RFdmVudHNSZXNwb25zZRIpCgZldmVudHMYASADKAsyGS5rOHMuaW8uYXBpLmNvcmUudjEuRXZlbnQiUgoRQ3JlYXRlUm9sZVJlcXVlc3QSPQoEcm9sZRgBIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS5yYmFjLnYxYWxwaGExLlJvbGUiUwoSQ3JlYXRlUm9sZVJlc3BvbnNlEj0KBHJvbGUYASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlIjIKEURlbGV0ZVJvbGVSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCSIUChJEZWxldGVSb2xlUmVzcG9uc2UiggEKDkdldFJvbGVSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCRIUCgxhc19yZXNvdXJjZXMYAyABKAgSOwoGZm9ybWF0GAQgASgOMisuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmF3Rm9ybWF0IroBCg9HZXRSb2xlUmVzcG9uc2USPwoEcm9sZRgBIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS5yYmFjLnYxYWxwaGExLlJvbGVIABJNCglyZXNvdXJjZXMYAiABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlUmVzb3VyY2VzSAASDQoDcmF3GAMgASgMSABCCAoGcmVzdWx0IkoKBkNsYWltcxJACgZjbGFpbXMYASADKAsyMC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5DbGFpbSLRAQoMR3JhbnRSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEcm9sZRgCIAEoCRI/Cgt1c2VyX2NsYWltcxgDIAEoCzIoLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkNsYWltc0gAElYKEHJlc291cmNlX2RldGFpbHMYBCABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5SZXNvdXJjZURldGFpbHNIAEIJCgdyZXF1ZXN0Ik4KDUdyYW50UmVzcG9uc2USPQoEcm9sZRgBIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS5yYmFjLnYxYWxwaGExLlJvbGUiOQoQTGlzdFJvbGVzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEhQKDGFzX3Jlc291cmNlcxgCIAEoCCKgAQoRTGlzdFJvbGVzUmVzcG9uc2USPgoFcm9sZXMYASADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlEksKCXJlc291cmNlcxgCIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS5yYmFjLnYxYWxwaGExLlJvbGVSZXNvdXJjZXMi0gEKDVJldm9rZVJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRyb2xlGAIgASgJEj8KC3VzZXJfY2xhaW1zGAMgASgLMiguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ2xhaW1zSAASVgoQcmVzb3VyY2VfZGV0YWlscxgEIAEoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS5yYmFjLnYxYWxwaGExLlJlc291cmNlRGV0YWlsc0gAQgkKB3JlcXVlc3QiTwoOUmV2b2tlUmVzcG9uc2USPQoEcm9sZRgBIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS5yYmFjLnYxYWxwaGExLlJvbGUiUgoRVXBkYXRlUm9sZVJlcXVlc3QSPQoEcm9sZRgBIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS5yYmFjLnYxYWxwaGExLlJvbGUiUwoSVXBkYXRlUm9sZVJlc3BvbnNlEj0KBHJvbGUYASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlKlEKCVJhd0Zvcm1hdBIaChZSQVdfRk9STUFUX1VOU1BFQ0lGSUVEEAASEwoPUkFXX0ZPUk1BVF9KU09OEAESEwoPUkFXX0ZPUk1BVF9ZQU1MEAIyoUUKDEthcmdvU2VydmljZRKDAQoOR2V0VmVyc2lvbkluZm8SNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRWZXJzaW9uSW5mb1JlcXVlc3QaOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRWZXJzaW9uSW5mb1Jlc3BvbnNlEnQKCUdldENvbmZpZxIyLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldENvbmZpZ1JlcXVlc3QaMy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRDb25maWdSZXNwb25zZRKGAQoPR2V0UHVibGljQ29uZmlnEjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0UHVibGljQ29uZmlnUmVxdWVzdBo5LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFB1YmxpY0NvbmZpZ1Jlc3BvbnNlEncKCkFkbWluTG9naW4SMy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BZG1pbkxvZ2luUmVxdWVzdBo0LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkFkbWluTG9naW5SZXNwb25zZRKDAQoOQ3JlYXRlUmVzb3VyY2USNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVSZXNvdXJjZVJlcXVlc3QaOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVSZXNvdXJjZVJlc3BvbnNlEpsBChZDcmVhdGVPclVwZGF0ZVJlc291cmNlEj8uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlcXVlc3QaQC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVPclVwZGF0ZVJlc291cmNlUmVzcG9uc2USgwEKDlVwZGF0ZVJlc291cmNlEjcuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVXBkYXRlUmVzb3VyY2VSZXF1ZXN0GjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVXBkYXRlUmVzb3VyY2VSZXNwb25zZRKDAQoORGVsZXRlUmVzb3VyY2USNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVSZXNvdXJjZVJlcXVlc3QaOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVSZXNvdXJjZVJlc3BvbnNlEncKCkxpc3RTdGFnZXMSMy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0U3RhZ2VzUmVxdWVzdBo0LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RTdGFnZXNSZXNwb25zZRJ3CgpMaXN0SW1hZ2VzEjMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdEltYWdlc1JlcXVlc3QaNC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0SW1hZ2VzUmVzcG9uc2UScQoIR2V0U3RhZ2USMS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRTdGFnZVJlcXVlc3QaMi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRTdGFnZVJlc3BvbnNlEnwKC1dhdGNoU3RhZ2VzEjQuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuV2F0Y2hTdGFnZXNSZXF1ZXN0GjUuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuV2F0Y2hTdGFnZXNSZXNwb25zZTABEnoKC0RlbGV0ZVN0YWdlEjQuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlU3RhZ2VSZXF1ZXN0GjUuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlU3RhZ2VSZXNwb25zZRJ9CgxSZWZyZXNoU3RhZ2USNS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5SZWZyZXNoU3RhZ2VSZXF1ZXN0GjYuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmVmcmVzaFN0YWdlUmVzcG9uc2USgwEKDkxpc3RQcm9tb3Rpb25zEjcuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFByb21vdGlvbnNSZXF1ZXN0GjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFByb21vdGlvbnNSZXNwb25zZRKIAQoPV2F0Y2hQcm9tb3Rpb25zEjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuV2F0Y2hQcm9tb3Rpb25zUmVxdWVzdBo5LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLldhdGNoUHJvbW90aW9uc1Jlc3BvbnNlMAESfQoMR2V0UHJvbW90aW9uEjUuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0UHJvbW90aW9uUmVxdWVzdBo2LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFByb21vdGlvblJlc3BvbnNlEoUBCg5XYXRjaFByb21vdGlvbhI3LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLldhdGNoUHJvbW90aW9uUmVxdWVzdBo4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLldhdGNoUHJvbW90aW9uUmVzcG9uc2UwARKDAQoOQWJvcnRQcm9tb3Rpb24SNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BYm9ydFByb21vdGlvblJlcXVlc3QaOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BYm9ydFByb21vdGlvblJlc3BvbnNlEoABCg1EZWxldGVQcm9qZWN0EjYuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUHJvamVjdFJlcXVlc3QaNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVQcm9qZWN0UmVzcG9uc2USdwoKR2V0UHJvamVjdBIzLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFByb2plY3RSZXF1ZXN0GjQuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0UHJvamVjdFJlc3BvbnNlEn0KDExpc3RQcm9qZWN0cxI1LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RQcm9qZWN0c1JlcXVlc3QaNi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0UHJvamVjdHNSZXNwb25zZRKDAQoOQXBwcm92ZUZyZWlnaHQSNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BcHByb3ZlRnJlaWdodFJlcXVlc3QaOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BcHByb3ZlRnJlaWdodFJlc3BvbnNlEoABCg1EZWxldGVGcmVpZ2h0EjYuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlRnJlaWdodFJlcXVlc3QaNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVGcmVpZ2h0UmVzcG9uc2USdwoKR2V0RnJlaWdodBIzLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldEZyZWlnaHRSZXF1ZXN0GjQuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0RnJlaWdodFJlc3BvbnNlEoMBCg5Qcm9tb3RlVG9TdGFnZRI3LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlByb21vdGVUb1N0YWdlUmVxdWVzdBo4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlByb21vdGVUb1N0YWdlUmVzcG9uc2USjAEKEVByb21vdGVEb3duc3RyZWFtEjouYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUHJvbW90ZURvd25zdHJlYW1SZXF1ZXN0GjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUHJvbW90ZURvd25zdHJlYW1SZXNwb25zZRJ9CgxRdWVyeUZyZWlnaHQSNS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5RdWVyeUZyZWlnaHRSZXF1ZXN0GjYuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUXVlcnlGcmVpZ2h0UmVzcG9uc2USjwEKElVwZGF0ZUZyZWlnaHRBbGlhcxI7LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZUZyZWlnaHRBbGlhc1JlcXVlc3QaPC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5VcGRhdGVGcmVpZ2h0QWxpYXNSZXNwb25zZRJxCghSZXZlcmlmeRIxLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJldmVyaWZ5UmVxdWVzdBoyLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJldmVyaWZ5UmVzcG9uc2USjAEKEUFib3J0VmVyaWZpY2F0aW9uEjouYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQWJvcnRWZXJpZmljYXRpb25SZXF1ZXN0GjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQWJvcnRWZXJpZmljYXRpb25SZXNwb25zZRKDAQoOTGlzdFdhcmVob3VzZXMSNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0V2FyZWhvdXNlc1JlcXVlc3QaOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0V2FyZWhvdXNlc1Jlc3BvbnNlEn0KDEdldFdhcmVob3VzZRI1LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFdhcmVob3VzZVJlcXVlc3QaNi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRXYXJlaG91c2VSZXNwb25zZRKIAQoPV2F0Y2hXYXJlaG91c2VzEjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuV2F0Y2hXYXJlaG91c2VzUmVxdWVzdBo5LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLldhdGNoV2FyZWhvdXNlc1Jlc3BvbnNlMAEShgEKD0RlbGV0ZVdhcmVob3VzZRI4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZVdhcmVob3VzZVJlcXVlc3QaOS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVXYXJlaG91c2VSZXNwb25zZRKJAQoQUmVmcmVzaFdhcmVob3VzZRI5LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJlZnJlc2hXYXJlaG91c2VSZXF1ZXN0GjouYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmVmcmVzaFdhcmVob3VzZVJlc3BvbnNlEowBChFDcmVhdGVDcmVkZW50aWFscxI6LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkNyZWF0ZUNyZWRlbnRpYWxzUmVxdWVzdBo7LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkNyZWF0ZUNyZWRlbnRpYWxzUmVzcG9uc2USjAEKEURlbGV0ZUNyZWRlbnRpYWxzEjouYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlQ3JlZGVudGlhbHNSZXF1ZXN0GjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlQ3JlZGVudGlhbHNSZXNwb25zZRKDAQoOR2V0Q3JlZGVudGlhbHMSNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRDcmVkZW50aWFsc1JlcXVlc3QaOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRDcmVkZW50aWFsc1Jlc3BvbnNlEoYBCg9MaXN0Q3JlZGVudGlhbHMSOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0Q3JlZGVudGlhbHNSZXF1ZXN0GjkuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdENyZWRlbnRpYWxzUmVzcG9uc2USjAEKEVVwZGF0ZUNyZWRlbnRpYWxzEjouYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVXBkYXRlQ3JlZGVudGlhbHNSZXF1ZXN0GjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVXBkYXRlQ3JlZGVudGlhbHNSZXNwb25zZRKPAQoSTGlzdFByb2plY3RTZWNyZXRzEjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFByb2plY3RTZWNyZXRzUmVxdWVzdBo8LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RQcm9qZWN0U2VjcmV0c1Jlc3BvbnNlEpIBChNDcmVhdGVQcm9qZWN0U2VjcmV0EjwuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlUHJvamVjdFNlY3JldFJlcXVlc3QaPS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVQcm9qZWN0U2VjcmV0UmVzcG9uc2USkgEKE1VwZGF0ZVByb2plY3RTZWNyZXQSPC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5VcGRhdGVQcm9qZWN0U2VjcmV0UmVxdWVzdBo9LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZVByb2plY3RTZWNyZXRSZXNwb25zZRKSAQoTRGVsZXRlUHJvamVjdFNlY3JldBI8LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZVByb2plY3RTZWNyZXRSZXF1ZXN0Gj0uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUHJvamVjdFNlY3JldFJlc3BvbnNlEpgBChVMaXN0QW5hbHlzaXNUZW1wbGF0ZXMSPi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0QW5hbHlzaXNUZW1wbGF0ZXNSZXF1ZXN0Gj8uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdEFuYWx5c2lzVGVtcGxhdGVzUmVzcG9uc2USkgEKE0dldEFuYWx5c2lzVGVtcGxhdGUSPC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRBbmFseXNpc1RlbXBsYXRlUmVxdWVzdBo9LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldEFuYWx5c2lzVGVtcGxhdGVSZXNwb25zZRKbAQoWRGVsZXRlQW5hbHlzaXNUZW1wbGF0ZRI/LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZUFuYWx5c2lzVGVtcGxhdGVSZXF1ZXN0GkAuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlQW5hbHlzaXNUZW1wbGF0ZVJlc3BvbnNlEq0BChxMaXN0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGVzEkUuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdENsdXN0ZXJBbmFseXNpc1RlbXBsYXRlc1JlcXVlc3QaRi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGVzUmVzcG9uc2USpwEKGkdldENsdXN0ZXJBbmFseXNpc1RlbXBsYXRlEkMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGVSZXF1ZXN0GkQuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGVSZXNwb25zZRKwAQodRGVsZXRlQ2x1c3RlckFuYWx5c2lzVGVtcGxhdGUSRi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZVJlcXVlc3QaRy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZVJlc3BvbnNlEoMBCg5HZXRBbmFseXNpc1J1bhI3LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldEFuYWx5c2lzUnVuUmVxdWVzdBo4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldEFuYWx5c2lzUnVuUmVzcG9uc2USkQEKEkdldEFuYWx5c2lzUnVuTG9ncxI7LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldEFuYWx5c2lzUnVuTG9nc1JlcXVlc3QaPC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRBbmFseXNpc1J1bkxvZ3NSZXNwb25zZTABEowBChFMaXN0UHJvamVjdEV2ZW50cxI6LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RQcm9qZWN0RXZlbnRzUmVxdWVzdBo7LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RQcm9qZWN0RXZlbnRzUmVzcG9uc2USjwEKEkxpc3RQcm9tb3Rpb25UYXNrcxI7LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RQcm9tb3Rpb25UYXNrc1JlcXVlc3QaPC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0UHJvbW90aW9uVGFza3NSZXNwb25zZRKkAQoZTGlzdENsdXN0ZXJQcm9tb3Rpb25UYXNrcxJCLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RDbHVzdGVyUHJvbW90aW9uVGFza3NSZXF1ZXN0GkMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdENsdXN0ZXJQcm9tb3Rpb25UYXNrc1Jlc3BvbnNlEokBChBHZXRQcm9tb3Rpb25UYXNrEjkuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0UHJvbW90aW9uVGFza1JlcXVlc3QaOi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRQcm9tb3Rpb25UYXNrUmVzcG9uc2USngEKF0dldENsdXN0ZXJQcm9tb3Rpb25UYXNrEkAuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0Q2x1c3RlclByb21vdGlvblRhc2tSZXF1ZXN0GkEuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0Q2x1c3RlclByb21vdGlvblRhc2tSZXNwb25zZRJ3CgpDcmVhdGVSb2xlEjMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlUm9sZVJlcXVlc3QaNC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVSb2xlUmVzcG9uc2USdwoKRGVsZXRlUm9sZRIzLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZVJvbGVSZXF1ZXN0GjQuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUm9sZVJlc3BvbnNlEm4KB0dldFJvbGUSMC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRSb2xlUmVxdWVzdBoxLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFJvbGVSZXNwb25zZRJoCgVHcmFudBIuLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdyYW50UmVxdWVzdBovLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdyYW50UmVzcG9uc2USdAoJTGlzdFJvbGVzEjIuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFJvbGVzUmVxdWVzdBozLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RSb2xlc1Jlc3BvbnNlEmsKBlJldm9rZRIvLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJldm9rZVJlcXVlc3QaMC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5SZXZva2VSZXNwb25zZRJ3CgpVcGRhdGVSb2xlEjMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVXBkYXRlUm9sZVJlcXVlc3QaNC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5VcGRhdGVSb2xlUmVzcG9uc2VCkwIKJGNvbS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMUIMU2VydmljZVByb3RvUAFaOGdpdGh1Yi5jb20vYWt1aXR5L2thcmdvL2FwaS9zZXJ2aWNlL3YxYWxwaGExO3N2Y3YxYWxwaGExogIEQUlLU6oCIEFrdWl0eS5Jby5LYXJnby5TZXJ2aWNlLlYxYWxwaGExygIgQWt1aXR5XElvXEthcmdvXFNlcnZpY2VcVjFhbHBoYTHiAixBa3VpdHlcSW9cS2FyZ29cU2VydmljZVxWMWFscGhhMVxHUEJNZXRhZGF0YeoCJEFrdWl0eTo6SW86OkthcmdvOjpTZXJ2aWNlOjpWMWFscGhhMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_api_v1alpha1_generated, file_k8s_io_api_core_v1_generated, file_api_stubs_rollouts_v1alpha1_generated, file_api_rbac_v1alpha1_generated]);
+  fileDesc("CiJhcGkvc2VydmljZS92MWFscGhhMS9zZXJ2aWNlLnByb3RvEiBha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMSKrAQoRQ29tcG9uZW50VmVyc2lvbnMSQgoGc2VydmVyGAEgASgLMi0uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVmVyc2lvbkluZm9IAIgBARI/CgNjbGkYAiABKAsyLS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5WZXJzaW9uSW5mb0gBiAEBQgkKB19zZXJ2ZXJCBgoEX2NsaSKyAQoLVmVyc2lvbkluZm8SDwoHdmVyc2lvbhgBIAEoCRISCgpnaXRfY29tbWl0GAIgASgJEhYKDmdpdF90cmVlX2RpcnR5GAMgASgIEi4KCmJ1aWxkX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCmdvX3ZlcnNpb24YBSABKAkSEAoIY29tcGlsZXIYBiABKAkSEAoIcGxhdGZvcm0YByABKAkiFwoVR2V0VmVyc2lvbkluZm9SZXF1ZXN0Il0KFkdldFZlcnNpb25JbmZvUmVzcG9uc2USQwoMdmVyc2lvbl9pbmZvGAEgASgLMi0uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVmVyc2lvbkluZm8iEgoQR2V0Q29uZmlnUmVxdWVzdCItCgtBcmdvQ0RTaGFyZBILCgN1cmwYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIvgBChFHZXRDb25maWdSZXNwb25zZRJcCg1hcmdvY2Rfc2hhcmRzGAEgAygLMkUuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0Q29uZmlnUmVzcG9uc2UuQXJnb2NkU2hhcmRzRW50cnkSIQoZc2VjcmV0X21hbmFnZW1lbnRfZW5hYmxlZBgCIAEoCBpiChFBcmdvY2RTaGFyZHNFbnRyeRILCgNrZXkYASABKAkSPAoFdmFsdWUYAiABKAsyLS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BcmdvQ0RTaGFyZDoCOAEiGAoWR2V0UHVibGljQ29uZmlnUmVxdWVzdCKOAQoXR2V0UHVibGljQ29uZmlnUmVzcG9uc2USQQoLb2lkY19jb25maWcYASABKAsyLC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5PSURDQ29uZmlnEh0KFWFkbWluX2FjY291bnRfZW5hYmxlZBgCIAEoCBIRCglza2lwX2F1dGgYAyABKAgiWgoKT0lEQ0NvbmZpZxISCgppc3N1ZXJfdXJsGAEgASgJEhEKCWNsaWVudF9pZBgCIAEoCRIOCgZzY29wZXMYAyADKAkSFQoNY2xpX2NsaWVudF9pZBgEIAEoCSIlChFBZG1pbkxvZ2luUmVxdWVzdBIQCghwYXNzd29yZBgBIAEoCSImChJBZG1pbkxvZ2luUmVzcG9uc2USEAoIaWRfdG9rZW4YASABKAkiKQoVQ3JlYXRlUmVzb3VyY2VSZXF1ZXN0EhAKCG1hbmlmZXN0GAEgASgMIlYKFENyZWF0ZVJlc291cmNlUmVzdWx0EiMKGWNyZWF0ZWRfcmVzb3VyY2VfbWFuaWZlc3QYASABKAxIABIPCgVlcnJvchgCIAEoCUgAQggKBnJlc3VsdCJhChZDcmVhdGVSZXNvdXJjZVJlc3BvbnNlEkcKB3Jlc3VsdHMYASADKAsyNi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVSZXNvdXJjZVJlc3VsdCIxCh1DcmVhdGVPclVwZGF0ZVJlc291cmNlUmVxdWVzdBIQCghtYW5pZmVzdBgBIAEoDCKDAQocQ3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlc3VsdBIjChljcmVhdGVkX3Jlc291cmNlX21hbmlmZXN0GAEgASgMSAASIwoZdXBkYXRlZF9yZXNvdXJjZV9tYW5pZmVzdBgCIAEoDEgAEg8KBWVycm9yGAMgASgJSABCCAoGcmVzdWx0InEKHkNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VSZXNwb25zZRJPCgdyZXN1bHRzGAEgAygLMj4uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlc3VsdCIpChVVcGRhdGVSZXNvdXJjZVJlcXVlc3QSEAoIbWFuaWZlc3QYASABKAwiVgoUVXBkYXRlUmVzb3VyY2VSZXN1bHQSIwoZdXBkYXRlZF9yZXNvdXJjZV9tYW5pZmVzdBgBIAEoDEgAEg8KBWVycm9yGAIgASgJSABCCAoGcmVzdWx0ImEKFlVwZGF0ZVJlc291cmNlUmVzcG9uc2USRwoHcmVzdWx0cxgBIAMoCzI2LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZVJlc291cmNlUmVzdWx0IikKFURlbGV0ZVJlc291cmNlUmVxdWVzdBIQCghtYW5pZmVzdBgBIAEoDCJWChREZWxldGVSZXNvdXJjZVJlc3VsdBIjChlkZWxldGVkX3Jlc291cmNlX21hbmlmZXN0GAEgASgMSAASDwoFZXJyb3IYAiABKAlIAEIICgZyZXN1bHQiYQoWRGVsZXRlUmVzb3VyY2VSZXNwb25zZRJHCgdyZXN1bHRzGAEgAygLMjYuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUmVzb3VyY2VSZXN1bHQiJAoRTGlzdFN0YWdlc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCSJRChJMaXN0U3RhZ2VzUmVzcG9uc2USOwoGc3RhZ2VzGAEgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlIiQKEUxpc3RJbWFnZXNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkivwEKEkxpc3RJbWFnZXNSZXNwb25zZRJQCgZpbWFnZXMYAiADKAsyQC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0SW1hZ2VzUmVzcG9uc2UuSW1hZ2VzRW50cnkaVwoLSW1hZ2VzRW50cnkSCwoDa2V5GAEgASgJEjcKBXZhbHVlGAIgASgLMiguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVGFnTWFwOgI4ASKoAQoGVGFnTWFwEkAKBHRhZ3MYASADKAsyMi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5UYWdNYXAuVGFnc0VudHJ5GlwKCVRhZ3NFbnRyeRILCgNrZXkYASABKAkSPgoFdmFsdWUYAiABKAsyLy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5JbWFnZVN0YWdlTWFwOgI4ASKLAQoNSW1hZ2VTdGFnZU1hcBJLCgZzdGFnZXMYASADKAsyOy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5JbWFnZVN0YWdlTWFwLlN0YWdlc0VudHJ5Gi0KC1N0YWdlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBToCOAEibQoPR2V0U3RhZ2VSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCRI7CgZmb3JtYXQYAyABKA4yKy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5SYXdGb3JtYXQiaQoQR2V0U3RhZ2VSZXNwb25zZRI8CgVzdGFnZRgBIAEoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZUgAEg0KA3JhdxgCIAEoDEgAQggKBnJlc3VsdCIzChJXYXRjaFN0YWdlc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJIl8KE1dhdGNoU3RhZ2VzUmVzcG9uc2USOgoFc3RhZ2UYASABKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2USDAoEdHlwZRgCIAEoCSIzChJEZWxldGVTdGFnZVJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJIhUKE0RlbGV0ZVN0YWdlUmVzcG9uc2UiNAoTUmVmcmVzaFN0YWdlUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiUgoUUmVmcmVzaFN0YWdlUmVzcG9uc2USOgoFc3RhZ2UYASABKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2UiRgoVTGlzdFByb21vdGlvbnNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSEgoFc3RhZ2UYAiABKAlIAIgBAUIICgZfc3RhZ2UiXQoWTGlzdFByb21vdGlvbnNSZXNwb25zZRJDCgpwcm9tb3Rpb25zGAEgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvbiJHChZXYXRjaFByb21vdGlvbnNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSEgoFc3RhZ2UYAiABKAlIAIgBAUIICgZfc3RhZ2UiawoXV2F0Y2hQcm9tb3Rpb25zUmVzcG9uc2USQgoJcHJvbW90aW9uGAEgASgLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvbhIMCgR0eXBlGAIgASgJInEKE0dldFByb21vdGlvblJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEjsKBmZvcm1hdBgDIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCJ1ChRHZXRQcm9tb3Rpb25SZXNwb25zZRJECglwcm9tb3Rpb24YASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uSAASDQoDcmF3GAIgASgMSABCCAoGcmVzdWx0IjYKFVdhdGNoUHJvbW90aW9uUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiagoWV2F0Y2hQcm9tb3Rpb25SZXNwb25zZRJCCglwcm9tb3Rpb24YASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uEgwKBHR5cGUYAiABKAkiNgoVQWJvcnRQcm9tb3Rpb25SZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCSIYChZBYm9ydFByb21vdGlvblJlc3BvbnNlIiQKFERlbGV0ZVByb2plY3RSZXF1ZXN0EgwKBG5hbWUYASABKAkiFwoVRGVsZXRlUHJvamVjdFJlc3BvbnNlIioKGkRlbGV0ZVByb2plY3RDb25maWdSZXF1ZXN0EgwKBG5hbWUYASABKAkiHQobRGVsZXRlUHJvamVjdENvbmZpZ1Jlc3BvbnNlImQKF0dldFByb2plY3RDb25maWdSZXF1ZXN0EgwKBG5hbWUYASABKAkSOwoGZm9ybWF0GAIgASgOMisuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmF3Rm9ybWF0IoIBChhHZXRQcm9qZWN0Q29uZmlnUmVzcG9uc2USTQoOcHJvamVjdF9jb25maWcYASABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdENvbmZpZ0gAEg0KA3JhdxgCIAEoDEgAQggKBnJlc3VsdCJeChFHZXRQcm9qZWN0UmVxdWVzdBIMCgRuYW1lGAEgASgJEjsKBmZvcm1hdBgCIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCJvChJHZXRQcm9qZWN0UmVzcG9uc2USQAoHcHJvamVjdBgBIAEoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0SAASDQoDcmF3GAIgASgMSABCCAoGcmVzdWx0IncKE0xpc3RQcm9qZWN0c1JlcXVlc3QSFgoJcGFnZV9zaXplGAEgASgFSACIAQESEQoEcGFnZRgCIAEoBUgBiAEBEhMKBmZpbHRlchgDIAEoCUgCiAEBQgwKCl9wYWdlX3NpemVCBwoFX3BhZ2VCCQoHX2ZpbHRlciJmChRMaXN0UHJvamVjdHNSZXNwb25zZRI/Cghwcm9qZWN0cxgBIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0Eg0KBXRvdGFsGAIgASgFIlQKFUFwcHJvdmVGcmVpZ2h0UmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSDQoFYWxpYXMYAyABKAkSDQoFc3RhZ2UYBCABKAkiGAoWQXBwcm92ZUZyZWlnaHRSZXNwb25zZSJEChREZWxldGVGcmVpZ2h0UmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSDQoFYWxpYXMYAyABKAkiFwoVRGVsZXRlRnJlaWdodFJlc3BvbnNlIn4KEUdldEZyZWlnaHRSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCRINCgVhbGlhcxgDIAEoCRI7CgZmb3JtYXQYBCABKA4yKy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5SYXdGb3JtYXQibwoSR2V0RnJlaWdodFJlc3BvbnNlEkAKB2ZyZWlnaHQYASABKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodEgAEg0KA3JhdxgCIAEoDEgAQggKBnJlc3VsdCJfChVQcm9tb3RlVG9TdGFnZVJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRINCgVzdGFnZRgCIAEoCRIPCgdmcmVpZ2h0GAMgASgJEhUKDWZyZWlnaHRfYWxpYXMYBCABKAkiXAoWUHJvbW90ZVRvU3RhZ2VSZXNwb25zZRJCCglwcm9tb3Rpb24YASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uImIKGFByb21vdGVEb3duc3RyZWFtUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEg0KBXN0YWdlGAIgASgJEg8KB2ZyZWlnaHQYAyABKAkSFQoNZnJlaWdodF9hbGlhcxgEIAEoCSJgChlQcm9tb3RlRG93bnN0cmVhbVJlc3BvbnNlEkMKCnByb21vdGlvbnMYASADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uIooBChNRdWVyeUZyZWlnaHRSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDQoFc3RhZ2UYAiABKAkSEAoIZ3JvdXBfYnkYAyABKAkSDQoFZ3JvdXAYBCABKAkSEAoIb3JkZXJfYnkYBSABKAkSDwoHcmV2ZXJzZRgGIAEoCBIPCgdvcmlnaW5zGAcgAygJIsgBChRRdWVyeUZyZWlnaHRSZXNwb25zZRJSCgZncm91cHMYASADKAsyQi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5RdWVyeUZyZWlnaHRSZXNwb25zZS5Hcm91cHNFbnRyeRpcCgtHcm91cHNFbnRyeRILCgNrZXkYASABKAkSPAoFdmFsdWUYAiABKAsyLS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5GcmVpZ2h0TGlzdDoCOAEiTQoLRnJlaWdodExpc3QSPgoHZnJlaWdodBgBIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0ImAKGVVwZGF0ZUZyZWlnaHRBbGlhc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCW9sZF9hbGlhcxgDIAEoCRIRCgluZXdfYWxpYXMYBCABKAkiHAoaVXBkYXRlRnJlaWdodEFsaWFzUmVzcG9uc2UiMQoPUmV2ZXJpZnlSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDQoFc3RhZ2UYAiABKAkiEgoQUmV2ZXJpZnlSZXNwb25zZSI6ChhBYm9ydFZlcmlmaWNhdGlvblJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRINCgVzdGFnZRgCIAEoCSIbChlBYm9ydFZlcmlmaWNhdGlvblJlc3BvbnNlIigKFUxpc3RXYXJlaG91c2VzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJIl0KFkxpc3RXYXJlaG91c2VzUmVzcG9uc2USQwoKd2FyZWhvdXNlcxgBIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2UicQoTR2V0V2FyZWhvdXNlUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSOwoGZm9ybWF0GAMgASgOMisuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmF3Rm9ybWF0InUKFEdldFdhcmVob3VzZVJlc3BvbnNlEkQKCXdhcmVob3VzZRgBIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VIABINCgNyYXcYAiABKAxIAEIICgZyZXN1bHQiNwoWV2F0Y2hXYXJlaG91c2VzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiawoXV2F0Y2hXYXJlaG91c2VzUmVzcG9uc2USQgoJd2FyZWhvdXNlGAEgASgLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZRIMCgR0eXBlGAIgASgJIjcKFkRlbGV0ZVdhcmVob3VzZVJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJIhkKF0RlbGV0ZVdhcmVob3VzZVJlc3BvbnNlIjgKF1JlZnJlc2hXYXJlaG91c2VSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCSJeChhSZWZyZXNoV2FyZWhvdXNlUmVzcG9uc2USQgoJd2FyZWhvdXNlGAEgASgLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZSIsChlMaXN0UHJvamVjdFNlY3JldHNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkiSQoaTGlzdFByb2plY3RTZWNyZXRzUmVzcG9uc2USKwoHc2VjcmV0cxgBIAMoCzIaLms4cy5pby5hcGkuY29yZS52MS5TZWNyZXQi0wEKGkNyZWF0ZVByb2plY3RTZWNyZXRSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRJUCgRkYXRhGAQgAygLMkYuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlUHJvamVjdFNlY3JldFJlcXVlc3QuRGF0YUVudHJ5GisKCURhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkkKG0NyZWF0ZVByb2plY3RTZWNyZXRSZXNwb25zZRIqCgZzZWNyZXQYASABKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0ItMBChpVcGRhdGVQcm9qZWN0U2VjcmV0UmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSVAoEZGF0YRgEIAMoCzJGLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZVByb2plY3RTZWNyZXRSZXF1ZXN0LkRhdGFFbnRyeRorCglEYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJJChtVcGRhdGVQcm9qZWN0U2VjcmV0UmVzcG9uc2USKgoGc2VjcmV0GAEgASgLMhouazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldCI7ChpEZWxldGVQcm9qZWN0U2VjcmV0UmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiHQobRGVsZXRlUHJvamVjdFNlY3JldFJlc3BvbnNlIsYBChhDcmVhdGVDcmVkZW50aWFsc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAggASgJEgwKBHR5cGUYAyABKAkSGQoIcmVwb191cmwYBCABKAlSB3JlcG9VUkwSKQoRcmVwb191cmxfaXNfcmVnZXgYBSABKAhSDnJlcG9VUkxJc1JlZ2V4EhAKCHVzZXJuYW1lGAYgASgJEhAKCHBhc3N3b3JkGAcgASgJIkwKGUNyZWF0ZUNyZWRlbnRpYWxzUmVzcG9uc2USLwoLY3JlZGVudGlhbHMYASABKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0IjkKGERlbGV0ZUNyZWRlbnRpYWxzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiGwoZRGVsZXRlQ3JlZGVudGlhbHNSZXNwb25zZSJzChVHZXRDcmVkZW50aWFsc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEjsKBmZvcm1hdBgDIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCJkChZHZXRDcmVkZW50aWFsc1Jlc3BvbnNlEjEKC2NyZWRlbnRpYWxzGAEgASgLMhouazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldEgAEg0KA3JhdxgCIAEoDEgAQggKBnJlc3VsdCIpChZMaXN0Q3JlZGVudGlhbHNSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkiSgoXTGlzdENyZWRlbnRpYWxzUmVzcG9uc2USLwoLY3JlZGVudGlhbHMYASADKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0IsYBChhVcGRhdGVDcmVkZW50aWFsc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAggASgJEgwKBHR5cGUYAyABKAkSGQoIcmVwb191cmwYBCABKAlSB3JlcG9VUkwSKQoRcmVwb191cmxfaXNfcmVnZXgYBSABKAhSDnJlcG9VUkxJc1JlZ2V4EhAKCHVzZXJuYW1lGAYgASgJEhAKCHBhc3N3b3JkGAcgASgJIkwKGVVwZGF0ZUNyZWRlbnRpYWxzUmVzcG9uc2USLwoLY3JlZGVudGlhbHMYASABKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0Ii8KHExpc3RBbmFseXNpc1RlbXBsYXRlc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCSKCAQodTGlzdEFuYWx5c2lzVGVtcGxhdGVzUmVzcG9uc2USYQoSYW5hbHlzaXNfdGVtcGxhdGVzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnN0dWJzLnJvbGxvdXRzLnYxYWxwaGExLkFuYWx5c2lzVGVtcGxhdGUiLAoZTGlzdFByb21vdGlvblRhc2tzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJImoKGkxpc3RQcm9tb3Rpb25UYXNrc1Jlc3BvbnNlEkwKD3Byb21vdGlvbl90YXNrcxgBIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrIiIKIExpc3RDbHVzdGVyUHJvbW90aW9uVGFza3NSZXF1ZXN0IoABCiFMaXN0Q2x1c3RlclByb21vdGlvblRhc2tzUmVzcG9uc2USWwoXY2x1c3Rlcl9wcm9tb3Rpb25fdGFza3MYASADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2x1c3RlclByb21vdGlvblRhc2sieAoaR2V0QW5hbHlzaXNUZW1wbGF0ZVJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEjsKBmZvcm1hdBgDIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCKaAQobR2V0QW5hbHlzaXNUZW1wbGF0ZVJlc3BvbnNlEmIKEWFuYWx5c2lzX3RlbXBsYXRlGAEgASgLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnN0dWJzLnJvbGxvdXRzLnYxYWxwaGExLkFuYWx5c2lzVGVtcGxhdGVIABINCgNyYXcYAiABKAxIAEIICgZyZXN1bHQidQoXR2V0UHJvbW90aW9uVGFza1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJEjsKBmZvcm1hdBgDIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCKCAQoYR2V0UHJvbW90aW9uVGFza1Jlc3BvbnNlEk0KDnByb21vdGlvbl90YXNrGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tIABINCgNyYXcYAiABKAxIAEIICgZyZXN1bHQiawoeR2V0Q2x1c3RlclByb21vdGlvblRhc2tSZXF1ZXN0EgwKBG5hbWUYAiABKAkSOwoGZm9ybWF0GAMgASgOMisuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmF3Rm9ybWF0IqYBCh9HZXRDbHVzdGVyUHJvbW90aW9uVGFza1Jlc3BvbnNlEmoKDnByb21vdGlvbl90YXNrGAEgASgLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrSABSFGNsdXN0ZXJQcm9tb3Rpb25UYXNrEg0KA3JhdxgCIAEoDEgAQggKBnJlc3VsdCIlCiNMaXN0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGVzUmVxdWVzdCKzAQokTGlzdENsdXN0ZXJBbmFseXNpc1RlbXBsYXRlc1Jlc3BvbnNlEooBChpjbHVzdGVyX2FuYWx5c2lzX3RlbXBsYXRlcxgBIAMoCzJMLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS5zdHVicy5yb2xsb3V0cy52MWFscGhhMS5DbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZVIYY2x1c3RlcmFuYWx5c2lzVGVtcGxhdGVzIm4KIUdldENsdXN0ZXJBbmFseXNpc1RlbXBsYXRlUmVxdWVzdBIMCgRuYW1lGAIgASgJEjsKBmZvcm1hdBgDIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCKwAQoiR2V0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGVSZXNwb25zZRJxChljbHVzdGVyX2FuYWx5c2lzX3RlbXBsYXRlGAEgASgLMkwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnN0dWJzLnJvbGxvdXRzLnYxYWxwaGExLkNsdXN0ZXJBbmFseXNpc1RlbXBsYXRlSAASDQoDcmF3GAIgASgMSABCCAoGcmVzdWx0InUKFUdldEFuYWx5c2lzUnVuUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRI7CgZmb3JtYXQYAyABKA4yKy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5SYXdGb3JtYXQiiwEKFkdldEFuYWx5c2lzUnVuUmVzcG9uc2USWAoMYW5hbHlzaXNfcnVuGAEgASgLMkAuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnN0dWJzLnJvbGxvdXRzLnYxYWxwaGExLkFuYWx5c2lzUnVuSAASDQoDcmF3GAIgASgMSABCCAoGcmVzdWx0ImkKGUdldEFuYWx5c2lzUnVuTG9nc1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEgwKBG5hbWUYAiABKAkSEwoLbWV0cmljX25hbWUYAyABKAkSFgoOY29udGFpbmVyX25hbWUYBCABKAkiKwoaR2V0QW5hbHlzaXNSdW5Mb2dzUmVzcG9uc2USDQoFY2h1bmsYASABKAkiPgodRGVsZXRlQW5hbHlzaXNUZW1wbGF0ZVJlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIMCgRuYW1lGAIgASgJIiAKHkRlbGV0ZUFuYWx5c2lzVGVtcGxhdGVSZXNwb25zZSI0CiREZWxldGVDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZVJlcXVlc3QSDAoEbmFtZRgCIAEoCSInCiVEZWxldGVDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZVJlc3BvbnNlIisKGExpc3RQcm9qZWN0RXZlbnRzUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJIkYKGUxpc3RQcm9qZWN0RXZlbnRzUmVzcG9uc2USKQoGZXZlbnRzGAEgAygLMhkuazhzLmlvLmFwaS5jb3JlLnYxLkV2ZW50IlIKEUNyZWF0ZVJvbGVSZXF1ZXN0Ej0KBHJvbGUYASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlIlMKEkNyZWF0ZVJvbGVSZXNwb25zZRI9CgRyb2xlGAEgASgLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnJiYWMudjFhbHBoYTEuUm9sZSIyChFEZWxldGVSb2xlUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkiFAoSRGVsZXRlUm9sZVJlc3BvbnNlIoIBCg5HZXRSb2xlUmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBG5hbWUYAiABKAkSFAoMYXNfcmVzb3VyY2VzGAMgASgIEjsKBmZvcm1hdBgEIAEoDjIrLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJhd0Zvcm1hdCK6AQoPR2V0Um9sZVJlc3BvbnNlEj8KBHJvbGUYASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlSAASTQoJcmVzb3VyY2VzGAIgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnJiYWMudjFhbHBoYTEuUm9sZVJlc291cmNlc0gAEg0KA3JhdxgDIAEoDEgAQggKBnJlc3VsdCJKCgZDbGFpbXMSQAoGY2xhaW1zGAEgAygLMjAuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnJiYWMudjFhbHBoYTEuQ2xhaW0i0QEKDEdyYW50UmVxdWVzdBIPCgdwcm9qZWN0GAEgASgJEgwKBHJvbGUYAiABKAkSPwoLdXNlcl9jbGFpbXMYAyABKAsyKC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DbGFpbXNIABJWChByZXNvdXJjZV9kZXRhaWxzGAQgASgLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnJiYWMudjFhbHBoYTEuUmVzb3VyY2VEZXRhaWxzSABCCQoHcmVxdWVzdCJOCg1HcmFudFJlc3BvbnNlEj0KBHJvbGUYASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlIjkKEExpc3RSb2xlc1JlcXVlc3QSDwoHcHJvamVjdBgBIAEoCRIUCgxhc19yZXNvdXJjZXMYAiABKAgioAEKEUxpc3RSb2xlc1Jlc3BvbnNlEj4KBXJvbGVzGAEgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnJiYWMudjFhbHBoYTEuUm9sZRJLCglyZXNvdXJjZXMYAiADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlUmVzb3VyY2VzItIBCg1SZXZva2VSZXF1ZXN0Eg8KB3Byb2plY3QYASABKAkSDAoEcm9sZRgCIAEoCRI/Cgt1c2VyX2NsYWltcxgDIAEoCzIoLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkNsYWltc0gAElYKEHJlc291cmNlX2RldGFpbHMYBCABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5SZXNvdXJjZURldGFpbHNIAEIJCgdyZXF1ZXN0Ik8KDlJldm9rZVJlc3BvbnNlEj0KBHJvbGUYASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlIlIKEVVwZGF0ZVJvbGVSZXF1ZXN0Ej0KBHJvbGUYASABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkucmJhYy52MWFscGhhMS5Sb2xlIlMKElVwZGF0ZVJvbGVSZXNwb25zZRI9CgRyb2xlGAEgASgLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnJiYWMudjFhbHBoYTEuUm9sZSpRCglSYXdGb3JtYXQSGgoWUkFXX0ZPUk1BVF9VTlNQRUNJRklFRBAAEhMKD1JBV19GT1JNQVRfSlNPThABEhMKD1JBV19GT1JNQVRfWUFNTBACMsJHCgxLYXJnb1NlcnZpY2USgwEKDkdldFZlcnNpb25JbmZvEjcuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0VmVyc2lvbkluZm9SZXF1ZXN0GjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0VmVyc2lvbkluZm9SZXNwb25zZRJ0CglHZXRDb25maWcSMi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRDb25maWdSZXF1ZXN0GjMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0Q29uZmlnUmVzcG9uc2UShgEKD0dldFB1YmxpY0NvbmZpZxI4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFB1YmxpY0NvbmZpZ1JlcXVlc3QaOS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRQdWJsaWNDb25maWdSZXNwb25zZRJ3CgpBZG1pbkxvZ2luEjMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQWRtaW5Mb2dpblJlcXVlc3QaNC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BZG1pbkxvZ2luUmVzcG9uc2USgwEKDkNyZWF0ZVJlc291cmNlEjcuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlUmVzb3VyY2VSZXF1ZXN0GjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlUmVzb3VyY2VSZXNwb25zZRKbAQoWQ3JlYXRlT3JVcGRhdGVSZXNvdXJjZRI/LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VSZXF1ZXN0GkAuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlc3BvbnNlEoMBCg5VcGRhdGVSZXNvdXJjZRI3LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZVJlc291cmNlUmVxdWVzdBo4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZVJlc291cmNlUmVzcG9uc2USgwEKDkRlbGV0ZVJlc291cmNlEjcuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUmVzb3VyY2VSZXF1ZXN0GjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUmVzb3VyY2VSZXNwb25zZRJ3CgpMaXN0U3RhZ2VzEjMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFN0YWdlc1JlcXVlc3QaNC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0U3RhZ2VzUmVzcG9uc2USdwoKTGlzdEltYWdlcxIzLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RJbWFnZXNSZXF1ZXN0GjQuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdEltYWdlc1Jlc3BvbnNlEnEKCEdldFN0YWdlEjEuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0U3RhZ2VSZXF1ZXN0GjIuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0U3RhZ2VSZXNwb25zZRJ8CgtXYXRjaFN0YWdlcxI0LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLldhdGNoU3RhZ2VzUmVxdWVzdBo1LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLldhdGNoU3RhZ2VzUmVzcG9uc2UwARJ6CgtEZWxldGVTdGFnZRI0LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZVN0YWdlUmVxdWVzdBo1LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZVN0YWdlUmVzcG9uc2USfQoMUmVmcmVzaFN0YWdlEjUuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmVmcmVzaFN0YWdlUmVxdWVzdBo2LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJlZnJlc2hTdGFnZVJlc3BvbnNlEoMBCg5MaXN0UHJvbW90aW9ucxI3LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RQcm9tb3Rpb25zUmVxdWVzdBo4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RQcm9tb3Rpb25zUmVzcG9uc2USiAEKD1dhdGNoUHJvbW90aW9ucxI4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLldhdGNoUHJvbW90aW9uc1JlcXVlc3QaOS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5XYXRjaFByb21vdGlvbnNSZXNwb25zZTABEn0KDEdldFByb21vdGlvbhI1LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFByb21vdGlvblJlcXVlc3QaNi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRQcm9tb3Rpb25SZXNwb25zZRKFAQoOV2F0Y2hQcm9tb3Rpb24SNy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5XYXRjaFByb21vdGlvblJlcXVlc3QaOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5XYXRjaFByb21vdGlvblJlc3BvbnNlMAESgwEKDkFib3J0UHJvbW90aW9uEjcuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQWJvcnRQcm9tb3Rpb25SZXF1ZXN0GjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQWJvcnRQcm9tb3Rpb25SZXNwb25zZRKAAQoNRGVsZXRlUHJvamVjdBI2LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZVByb2plY3RSZXF1ZXN0GjcuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUHJvamVjdFJlc3BvbnNlEncKCkdldFByb2plY3QSMy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRQcm9qZWN0UmVxdWVzdBo0LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFByb2plY3RSZXNwb25zZRJ9CgxMaXN0UHJvamVjdHMSNS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0UHJvamVjdHNSZXF1ZXN0GjYuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFByb2plY3RzUmVzcG9uc2USkgEKE0RlbGV0ZVByb2plY3RDb25maWcSPC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVQcm9qZWN0Q29uZmlnUmVxdWVzdBo9LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZVByb2plY3RDb25maWdSZXNwb25zZRKJAQoQR2V0UHJvamVjdENvbmZpZxI5LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFByb2plY3RDb25maWdSZXF1ZXN0GjouYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0UHJvamVjdENvbmZpZ1Jlc3BvbnNlEoMBCg5BcHByb3ZlRnJlaWdodBI3LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkFwcHJvdmVGcmVpZ2h0UmVxdWVzdBo4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkFwcHJvdmVGcmVpZ2h0UmVzcG9uc2USgAEKDURlbGV0ZUZyZWlnaHQSNi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVGcmVpZ2h0UmVxdWVzdBo3LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZUZyZWlnaHRSZXNwb25zZRJ3CgpHZXRGcmVpZ2h0EjMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0RnJlaWdodFJlcXVlc3QaNC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRGcmVpZ2h0UmVzcG9uc2USgwEKDlByb21vdGVUb1N0YWdlEjcuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUHJvbW90ZVRvU3RhZ2VSZXF1ZXN0GjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUHJvbW90ZVRvU3RhZ2VSZXNwb25zZRKMAQoRUHJvbW90ZURvd25zdHJlYW0SOi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5Qcm9tb3RlRG93bnN0cmVhbVJlcXVlc3QaOy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5Qcm9tb3RlRG93bnN0cmVhbVJlc3BvbnNlEn0KDFF1ZXJ5RnJlaWdodBI1LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlF1ZXJ5RnJlaWdodFJlcXVlc3QaNi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5RdWVyeUZyZWlnaHRSZXNwb25zZRKPAQoSVXBkYXRlRnJlaWdodEFsaWFzEjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVXBkYXRlRnJlaWdodEFsaWFzUmVxdWVzdBo8LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZUZyZWlnaHRBbGlhc1Jlc3BvbnNlEnEKCFJldmVyaWZ5EjEuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmV2ZXJpZnlSZXF1ZXN0GjIuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmV2ZXJpZnlSZXNwb25zZRKMAQoRQWJvcnRWZXJpZmljYXRpb24SOi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BYm9ydFZlcmlmaWNhdGlvblJlcXVlc3QaOy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5BYm9ydFZlcmlmaWNhdGlvblJlc3BvbnNlEoMBCg5MaXN0V2FyZWhvdXNlcxI3LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RXYXJlaG91c2VzUmVxdWVzdBo4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RXYXJlaG91c2VzUmVzcG9uc2USfQoMR2V0V2FyZWhvdXNlEjUuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0V2FyZWhvdXNlUmVxdWVzdBo2LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFdhcmVob3VzZVJlc3BvbnNlEogBCg9XYXRjaFdhcmVob3VzZXMSOC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5XYXRjaFdhcmVob3VzZXNSZXF1ZXN0GjkuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuV2F0Y2hXYXJlaG91c2VzUmVzcG9uc2UwARKGAQoPRGVsZXRlV2FyZWhvdXNlEjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlV2FyZWhvdXNlUmVxdWVzdBo5LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZVdhcmVob3VzZVJlc3BvbnNlEokBChBSZWZyZXNoV2FyZWhvdXNlEjkuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmVmcmVzaFdhcmVob3VzZVJlcXVlc3QaOi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5SZWZyZXNoV2FyZWhvdXNlUmVzcG9uc2USjAEKEUNyZWF0ZUNyZWRlbnRpYWxzEjouYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlQ3JlZGVudGlhbHNSZXF1ZXN0GjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuQ3JlYXRlQ3JlZGVudGlhbHNSZXNwb25zZRKMAQoRRGVsZXRlQ3JlZGVudGlhbHMSOi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVDcmVkZW50aWFsc1JlcXVlc3QaOy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVDcmVkZW50aWFsc1Jlc3BvbnNlEoMBCg5HZXRDcmVkZW50aWFscxI3LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldENyZWRlbnRpYWxzUmVxdWVzdBo4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldENyZWRlbnRpYWxzUmVzcG9uc2UShgEKD0xpc3RDcmVkZW50aWFscxI4LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RDcmVkZW50aWFsc1JlcXVlc3QaOS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0Q3JlZGVudGlhbHNSZXNwb25zZRKMAQoRVXBkYXRlQ3JlZGVudGlhbHMSOi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5VcGRhdGVDcmVkZW50aWFsc1JlcXVlc3QaOy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5VcGRhdGVDcmVkZW50aWFsc1Jlc3BvbnNlEo8BChJMaXN0UHJvamVjdFNlY3JldHMSOy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0UHJvamVjdFNlY3JldHNSZXF1ZXN0GjwuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFByb2plY3RTZWNyZXRzUmVzcG9uc2USkgEKE0NyZWF0ZVByb2plY3RTZWNyZXQSPC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVQcm9qZWN0U2VjcmV0UmVxdWVzdBo9LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkNyZWF0ZVByb2plY3RTZWNyZXRSZXNwb25zZRKSAQoTVXBkYXRlUHJvamVjdFNlY3JldBI8LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZVByb2plY3RTZWNyZXRSZXF1ZXN0Gj0uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuVXBkYXRlUHJvamVjdFNlY3JldFJlc3BvbnNlEpIBChNEZWxldGVQcm9qZWN0U2VjcmV0EjwuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUHJvamVjdFNlY3JldFJlcXVlc3QaPS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVQcm9qZWN0U2VjcmV0UmVzcG9uc2USmAEKFUxpc3RBbmFseXNpc1RlbXBsYXRlcxI+LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RBbmFseXNpc1RlbXBsYXRlc1JlcXVlc3QaPy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0QW5hbHlzaXNUZW1wbGF0ZXNSZXNwb25zZRKSAQoTR2V0QW5hbHlzaXNUZW1wbGF0ZRI8LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldEFuYWx5c2lzVGVtcGxhdGVSZXF1ZXN0Gj0uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0QW5hbHlzaXNUZW1wbGF0ZVJlc3BvbnNlEpsBChZEZWxldGVBbmFseXNpc1RlbXBsYXRlEj8uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlQW5hbHlzaXNUZW1wbGF0ZVJlcXVlc3QaQC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVBbmFseXNpc1RlbXBsYXRlUmVzcG9uc2USrQEKHExpc3RDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZXMSRS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGVzUmVxdWVzdBpGLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZXNSZXNwb25zZRKnAQoaR2V0Q2x1c3RlckFuYWx5c2lzVGVtcGxhdGUSQy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZVJlcXVlc3QaRC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZVJlc3BvbnNlErABCh1EZWxldGVDbHVzdGVyQW5hbHlzaXNUZW1wbGF0ZRJGLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZUNsdXN0ZXJBbmFseXNpc1RlbXBsYXRlUmVxdWVzdBpHLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkRlbGV0ZUNsdXN0ZXJBbmFseXNpc1RlbXBsYXRlUmVzcG9uc2USgwEKDkdldEFuYWx5c2lzUnVuEjcuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0QW5hbHlzaXNSdW5SZXF1ZXN0GjguYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0QW5hbHlzaXNSdW5SZXNwb25zZRKRAQoSR2V0QW5hbHlzaXNSdW5Mb2dzEjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0QW5hbHlzaXNSdW5Mb2dzUmVxdWVzdBo8LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldEFuYWx5c2lzUnVuTG9nc1Jlc3BvbnNlMAESjAEKEUxpc3RQcm9qZWN0RXZlbnRzEjouYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFByb2plY3RFdmVudHNSZXF1ZXN0GjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFByb2plY3RFdmVudHNSZXNwb25zZRKPAQoSTGlzdFByb21vdGlvblRhc2tzEjsuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFByb21vdGlvblRhc2tzUmVxdWVzdBo8LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkxpc3RQcm9tb3Rpb25UYXNrc1Jlc3BvbnNlEqQBChlMaXN0Q2x1c3RlclByb21vdGlvblRhc2tzEkIuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdENsdXN0ZXJQcm9tb3Rpb25UYXNrc1JlcXVlc3QaQy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0Q2x1c3RlclByb21vdGlvblRhc2tzUmVzcG9uc2USiQEKEEdldFByb21vdGlvblRhc2sSOS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRQcm9tb3Rpb25UYXNrUmVxdWVzdBo6LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFByb21vdGlvblRhc2tSZXNwb25zZRKeAQoXR2V0Q2x1c3RlclByb21vdGlvblRhc2sSQC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRDbHVzdGVyUHJvbW90aW9uVGFza1JlcXVlc3QaQS5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5HZXRDbHVzdGVyUHJvbW90aW9uVGFza1Jlc3BvbnNlEncKCkNyZWF0ZVJvbGUSMy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5DcmVhdGVSb2xlUmVxdWVzdBo0LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkNyZWF0ZVJvbGVSZXNwb25zZRJ3CgpEZWxldGVSb2xlEjMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuRGVsZXRlUm9sZVJlcXVlc3QaNC5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5EZWxldGVSb2xlUmVzcG9uc2USbgoHR2V0Um9sZRIwLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLkdldFJvbGVSZXF1ZXN0GjEuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR2V0Um9sZVJlc3BvbnNlEmgKBUdyYW50Ei4uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR3JhbnRSZXF1ZXN0Gi8uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuR3JhbnRSZXNwb25zZRJ0CglMaXN0Um9sZXMSMi5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5MaXN0Um9sZXNSZXF1ZXN0GjMuYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuTGlzdFJvbGVzUmVzcG9uc2USawoGUmV2b2tlEi8uYWt1aXR5LmlvLmthcmdvLnNlcnZpY2UudjFhbHBoYTEuUmV2b2tlUmVxdWVzdBowLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlJldm9rZVJlc3BvbnNlEncKClVwZGF0ZVJvbGUSMy5ha3VpdHkuaW8ua2FyZ28uc2VydmljZS52MWFscGhhMS5VcGRhdGVSb2xlUmVxdWVzdBo0LmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExLlVwZGF0ZVJvbGVSZXNwb25zZUKTAgokY29tLmFrdWl0eS5pby5rYXJnby5zZXJ2aWNlLnYxYWxwaGExQgxTZXJ2aWNlUHJvdG9QAVo4Z2l0aHViLmNvbS9ha3VpdHkva2FyZ28vYXBpL3NlcnZpY2UvdjFhbHBoYTE7c3ZjdjFhbHBoYTGiAgRBSUtTqgIgQWt1aXR5LklvLkthcmdvLlNlcnZpY2UuVjFhbHBoYTHKAiBBa3VpdHlcSW9cS2FyZ29cU2VydmljZVxWMWFscGhhMeICLEFrdWl0eVxJb1xLYXJnb1xTZXJ2aWNlXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIkQWt1aXR5OjpJbzo6S2FyZ286OlNlcnZpY2U6OlYxYWxwaGExYgZwcm90bzM", [file_google_protobuf_timestamp, file_api_v1alpha1_generated, file_k8s_io_api_core_v1_generated, file_api_stubs_rollouts_v1alpha1_generated, file_api_rbac_v1alpha1_generated]);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ComponentVersions
@@ -1078,6 +1078,89 @@ export type DeleteProjectResponse = Message<"akuity.io.kargo.service.v1alpha1.De
 export const DeleteProjectResponseSchema: GenMessage<DeleteProjectResponse> = /*@__PURE__*/
   messageDesc(file_api_service_v1alpha1_service, 49);
 
+/**
+ * @generated from message akuity.io.kargo.service.v1alpha1.DeleteProjectConfigRequest
+ */
+export type DeleteProjectConfigRequest = Message<"akuity.io.kargo.service.v1alpha1.DeleteProjectConfigRequest"> & {
+  /**
+   * @generated from field: string name = 1;
+   */
+  name: string;
+};
+
+/**
+ * Describes the message akuity.io.kargo.service.v1alpha1.DeleteProjectConfigRequest.
+ * Use `create(DeleteProjectConfigRequestSchema)` to create a new message.
+ */
+export const DeleteProjectConfigRequestSchema: GenMessage<DeleteProjectConfigRequest> = /*@__PURE__*/
+  messageDesc(file_api_service_v1alpha1_service, 50);
+
+/**
+ * explicitly empty 
+ *
+ * @generated from message akuity.io.kargo.service.v1alpha1.DeleteProjectConfigResponse
+ */
+export type DeleteProjectConfigResponse = Message<"akuity.io.kargo.service.v1alpha1.DeleteProjectConfigResponse"> & {
+};
+
+/**
+ * Describes the message akuity.io.kargo.service.v1alpha1.DeleteProjectConfigResponse.
+ * Use `create(DeleteProjectConfigResponseSchema)` to create a new message.
+ */
+export const DeleteProjectConfigResponseSchema: GenMessage<DeleteProjectConfigResponse> = /*@__PURE__*/
+  messageDesc(file_api_service_v1alpha1_service, 51);
+
+/**
+ * @generated from message akuity.io.kargo.service.v1alpha1.GetProjectConfigRequest
+ */
+export type GetProjectConfigRequest = Message<"akuity.io.kargo.service.v1alpha1.GetProjectConfigRequest"> & {
+  /**
+   * @generated from field: string name = 1;
+   */
+  name: string;
+
+  /**
+   * @generated from field: akuity.io.kargo.service.v1alpha1.RawFormat format = 2;
+   */
+  format: RawFormat;
+};
+
+/**
+ * Describes the message akuity.io.kargo.service.v1alpha1.GetProjectConfigRequest.
+ * Use `create(GetProjectConfigRequestSchema)` to create a new message.
+ */
+export const GetProjectConfigRequestSchema: GenMessage<GetProjectConfigRequest> = /*@__PURE__*/
+  messageDesc(file_api_service_v1alpha1_service, 52);
+
+/**
+ * @generated from message akuity.io.kargo.service.v1alpha1.GetProjectConfigResponse
+ */
+export type GetProjectConfigResponse = Message<"akuity.io.kargo.service.v1alpha1.GetProjectConfigResponse"> & {
+  /**
+   * @generated from oneof akuity.io.kargo.service.v1alpha1.GetProjectConfigResponse.result
+   */
+  result: {
+    /**
+     * @generated from field: github.com.akuity.kargo.api.v1alpha1.ProjectConfig project_config = 1;
+     */
+    value: ProjectConfig;
+    case: "projectConfig";
+  } | {
+    /**
+     * @generated from field: bytes raw = 2;
+     */
+    value: Uint8Array;
+    case: "raw";
+  } | { case: undefined; value?: undefined };
+};
+
+/**
+ * Describes the message akuity.io.kargo.service.v1alpha1.GetProjectConfigResponse.
+ * Use `create(GetProjectConfigResponseSchema)` to create a new message.
+ */
+export const GetProjectConfigResponseSchema: GenMessage<GetProjectConfigResponse> = /*@__PURE__*/
+  messageDesc(file_api_service_v1alpha1_service, 53);
+
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetProjectRequest
  */
@@ -1098,7 +1181,7 @@ export type GetProjectRequest = Message<"akuity.io.kargo.service.v1alpha1.GetPro
  * Use `create(GetProjectRequestSchema)` to create a new message.
  */
 export const GetProjectRequestSchema: GenMessage<GetProjectRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 50);
+  messageDesc(file_api_service_v1alpha1_service, 54);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetProjectResponse
@@ -1127,7 +1210,7 @@ export type GetProjectResponse = Message<"akuity.io.kargo.service.v1alpha1.GetPr
  * Use `create(GetProjectResponseSchema)` to create a new message.
  */
 export const GetProjectResponseSchema: GenMessage<GetProjectResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 51);
+  messageDesc(file_api_service_v1alpha1_service, 55);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListProjectsRequest
@@ -1154,7 +1237,7 @@ export type ListProjectsRequest = Message<"akuity.io.kargo.service.v1alpha1.List
  * Use `create(ListProjectsRequestSchema)` to create a new message.
  */
 export const ListProjectsRequestSchema: GenMessage<ListProjectsRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 52);
+  messageDesc(file_api_service_v1alpha1_service, 56);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListProjectsResponse
@@ -1176,7 +1259,7 @@ export type ListProjectsResponse = Message<"akuity.io.kargo.service.v1alpha1.Lis
  * Use `create(ListProjectsResponseSchema)` to create a new message.
  */
 export const ListProjectsResponseSchema: GenMessage<ListProjectsResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 53);
+  messageDesc(file_api_service_v1alpha1_service, 57);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ApproveFreightRequest
@@ -1208,7 +1291,7 @@ export type ApproveFreightRequest = Message<"akuity.io.kargo.service.v1alpha1.Ap
  * Use `create(ApproveFreightRequestSchema)` to create a new message.
  */
 export const ApproveFreightRequestSchema: GenMessage<ApproveFreightRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 54);
+  messageDesc(file_api_service_v1alpha1_service, 58);
 
 /**
  * explicitly empty 
@@ -1223,7 +1306,7 @@ export type ApproveFreightResponse = Message<"akuity.io.kargo.service.v1alpha1.A
  * Use `create(ApproveFreightResponseSchema)` to create a new message.
  */
 export const ApproveFreightResponseSchema: GenMessage<ApproveFreightResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 55);
+  messageDesc(file_api_service_v1alpha1_service, 59);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.DeleteFreightRequest
@@ -1250,7 +1333,7 @@ export type DeleteFreightRequest = Message<"akuity.io.kargo.service.v1alpha1.Del
  * Use `create(DeleteFreightRequestSchema)` to create a new message.
  */
 export const DeleteFreightRequestSchema: GenMessage<DeleteFreightRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 56);
+  messageDesc(file_api_service_v1alpha1_service, 60);
 
 /**
  * explicitly empty 
@@ -1265,7 +1348,7 @@ export type DeleteFreightResponse = Message<"akuity.io.kargo.service.v1alpha1.De
  * Use `create(DeleteFreightResponseSchema)` to create a new message.
  */
 export const DeleteFreightResponseSchema: GenMessage<DeleteFreightResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 57);
+  messageDesc(file_api_service_v1alpha1_service, 61);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetFreightRequest
@@ -1297,7 +1380,7 @@ export type GetFreightRequest = Message<"akuity.io.kargo.service.v1alpha1.GetFre
  * Use `create(GetFreightRequestSchema)` to create a new message.
  */
 export const GetFreightRequestSchema: GenMessage<GetFreightRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 58);
+  messageDesc(file_api_service_v1alpha1_service, 62);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetFreightResponse
@@ -1326,7 +1409,7 @@ export type GetFreightResponse = Message<"akuity.io.kargo.service.v1alpha1.GetFr
  * Use `create(GetFreightResponseSchema)` to create a new message.
  */
 export const GetFreightResponseSchema: GenMessage<GetFreightResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 59);
+  messageDesc(file_api_service_v1alpha1_service, 63);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.PromoteToStageRequest
@@ -1358,7 +1441,7 @@ export type PromoteToStageRequest = Message<"akuity.io.kargo.service.v1alpha1.Pr
  * Use `create(PromoteToStageRequestSchema)` to create a new message.
  */
 export const PromoteToStageRequestSchema: GenMessage<PromoteToStageRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 60);
+  messageDesc(file_api_service_v1alpha1_service, 64);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.PromoteToStageResponse
@@ -1375,7 +1458,7 @@ export type PromoteToStageResponse = Message<"akuity.io.kargo.service.v1alpha1.P
  * Use `create(PromoteToStageResponseSchema)` to create a new message.
  */
 export const PromoteToStageResponseSchema: GenMessage<PromoteToStageResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 61);
+  messageDesc(file_api_service_v1alpha1_service, 65);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.PromoteDownstreamRequest
@@ -1407,7 +1490,7 @@ export type PromoteDownstreamRequest = Message<"akuity.io.kargo.service.v1alpha1
  * Use `create(PromoteDownstreamRequestSchema)` to create a new message.
  */
 export const PromoteDownstreamRequestSchema: GenMessage<PromoteDownstreamRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 62);
+  messageDesc(file_api_service_v1alpha1_service, 66);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.PromoteDownstreamResponse
@@ -1424,7 +1507,7 @@ export type PromoteDownstreamResponse = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(PromoteDownstreamResponseSchema)` to create a new message.
  */
 export const PromoteDownstreamResponseSchema: GenMessage<PromoteDownstreamResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 63);
+  messageDesc(file_api_service_v1alpha1_service, 67);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.QueryFreightRequest
@@ -1471,7 +1554,7 @@ export type QueryFreightRequest = Message<"akuity.io.kargo.service.v1alpha1.Quer
  * Use `create(QueryFreightRequestSchema)` to create a new message.
  */
 export const QueryFreightRequestSchema: GenMessage<QueryFreightRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 64);
+  messageDesc(file_api_service_v1alpha1_service, 68);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.QueryFreightResponse
@@ -1488,7 +1571,7 @@ export type QueryFreightResponse = Message<"akuity.io.kargo.service.v1alpha1.Que
  * Use `create(QueryFreightResponseSchema)` to create a new message.
  */
 export const QueryFreightResponseSchema: GenMessage<QueryFreightResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 65);
+  messageDesc(file_api_service_v1alpha1_service, 69);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.FreightList
@@ -1505,7 +1588,7 @@ export type FreightList = Message<"akuity.io.kargo.service.v1alpha1.FreightList"
  * Use `create(FreightListSchema)` to create a new message.
  */
 export const FreightListSchema: GenMessage<FreightList> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 66);
+  messageDesc(file_api_service_v1alpha1_service, 70);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.UpdateFreightAliasRequest
@@ -1537,7 +1620,7 @@ export type UpdateFreightAliasRequest = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(UpdateFreightAliasRequestSchema)` to create a new message.
  */
 export const UpdateFreightAliasRequestSchema: GenMessage<UpdateFreightAliasRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 67);
+  messageDesc(file_api_service_v1alpha1_service, 71);
 
 /**
  * explicitly empty 
@@ -1552,7 +1635,7 @@ export type UpdateFreightAliasResponse = Message<"akuity.io.kargo.service.v1alph
  * Use `create(UpdateFreightAliasResponseSchema)` to create a new message.
  */
 export const UpdateFreightAliasResponseSchema: GenMessage<UpdateFreightAliasResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 68);
+  messageDesc(file_api_service_v1alpha1_service, 72);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ReverifyRequest
@@ -1574,7 +1657,7 @@ export type ReverifyRequest = Message<"akuity.io.kargo.service.v1alpha1.Reverify
  * Use `create(ReverifyRequestSchema)` to create a new message.
  */
 export const ReverifyRequestSchema: GenMessage<ReverifyRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 69);
+  messageDesc(file_api_service_v1alpha1_service, 73);
 
 /**
  * explicitly empty 
@@ -1589,7 +1672,7 @@ export type ReverifyResponse = Message<"akuity.io.kargo.service.v1alpha1.Reverif
  * Use `create(ReverifyResponseSchema)` to create a new message.
  */
 export const ReverifyResponseSchema: GenMessage<ReverifyResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 70);
+  messageDesc(file_api_service_v1alpha1_service, 74);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.AbortVerificationRequest
@@ -1611,7 +1694,7 @@ export type AbortVerificationRequest = Message<"akuity.io.kargo.service.v1alpha1
  * Use `create(AbortVerificationRequestSchema)` to create a new message.
  */
 export const AbortVerificationRequestSchema: GenMessage<AbortVerificationRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 71);
+  messageDesc(file_api_service_v1alpha1_service, 75);
 
 /**
  * explicitly empty 
@@ -1626,7 +1709,7 @@ export type AbortVerificationResponse = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(AbortVerificationResponseSchema)` to create a new message.
  */
 export const AbortVerificationResponseSchema: GenMessage<AbortVerificationResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 72);
+  messageDesc(file_api_service_v1alpha1_service, 76);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListWarehousesRequest
@@ -1643,7 +1726,7 @@ export type ListWarehousesRequest = Message<"akuity.io.kargo.service.v1alpha1.Li
  * Use `create(ListWarehousesRequestSchema)` to create a new message.
  */
 export const ListWarehousesRequestSchema: GenMessage<ListWarehousesRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 73);
+  messageDesc(file_api_service_v1alpha1_service, 77);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListWarehousesResponse
@@ -1660,7 +1743,7 @@ export type ListWarehousesResponse = Message<"akuity.io.kargo.service.v1alpha1.L
  * Use `create(ListWarehousesResponseSchema)` to create a new message.
  */
 export const ListWarehousesResponseSchema: GenMessage<ListWarehousesResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 74);
+  messageDesc(file_api_service_v1alpha1_service, 78);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetWarehouseRequest
@@ -1687,7 +1770,7 @@ export type GetWarehouseRequest = Message<"akuity.io.kargo.service.v1alpha1.GetW
  * Use `create(GetWarehouseRequestSchema)` to create a new message.
  */
 export const GetWarehouseRequestSchema: GenMessage<GetWarehouseRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 75);
+  messageDesc(file_api_service_v1alpha1_service, 79);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetWarehouseResponse
@@ -1716,7 +1799,7 @@ export type GetWarehouseResponse = Message<"akuity.io.kargo.service.v1alpha1.Get
  * Use `create(GetWarehouseResponseSchema)` to create a new message.
  */
 export const GetWarehouseResponseSchema: GenMessage<GetWarehouseResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 76);
+  messageDesc(file_api_service_v1alpha1_service, 80);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.WatchWarehousesRequest
@@ -1738,7 +1821,7 @@ export type WatchWarehousesRequest = Message<"akuity.io.kargo.service.v1alpha1.W
  * Use `create(WatchWarehousesRequestSchema)` to create a new message.
  */
 export const WatchWarehousesRequestSchema: GenMessage<WatchWarehousesRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 77);
+  messageDesc(file_api_service_v1alpha1_service, 81);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.WatchWarehousesResponse
@@ -1760,7 +1843,7 @@ export type WatchWarehousesResponse = Message<"akuity.io.kargo.service.v1alpha1.
  * Use `create(WatchWarehousesResponseSchema)` to create a new message.
  */
 export const WatchWarehousesResponseSchema: GenMessage<WatchWarehousesResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 78);
+  messageDesc(file_api_service_v1alpha1_service, 82);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.DeleteWarehouseRequest
@@ -1782,7 +1865,7 @@ export type DeleteWarehouseRequest = Message<"akuity.io.kargo.service.v1alpha1.D
  * Use `create(DeleteWarehouseRequestSchema)` to create a new message.
  */
 export const DeleteWarehouseRequestSchema: GenMessage<DeleteWarehouseRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 79);
+  messageDesc(file_api_service_v1alpha1_service, 83);
 
 /**
  * explicitly empty 
@@ -1797,7 +1880,7 @@ export type DeleteWarehouseResponse = Message<"akuity.io.kargo.service.v1alpha1.
  * Use `create(DeleteWarehouseResponseSchema)` to create a new message.
  */
 export const DeleteWarehouseResponseSchema: GenMessage<DeleteWarehouseResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 80);
+  messageDesc(file_api_service_v1alpha1_service, 84);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.RefreshWarehouseRequest
@@ -1819,7 +1902,7 @@ export type RefreshWarehouseRequest = Message<"akuity.io.kargo.service.v1alpha1.
  * Use `create(RefreshWarehouseRequestSchema)` to create a new message.
  */
 export const RefreshWarehouseRequestSchema: GenMessage<RefreshWarehouseRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 81);
+  messageDesc(file_api_service_v1alpha1_service, 85);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.RefreshWarehouseResponse
@@ -1836,7 +1919,7 @@ export type RefreshWarehouseResponse = Message<"akuity.io.kargo.service.v1alpha1
  * Use `create(RefreshWarehouseResponseSchema)` to create a new message.
  */
 export const RefreshWarehouseResponseSchema: GenMessage<RefreshWarehouseResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 82);
+  messageDesc(file_api_service_v1alpha1_service, 86);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListProjectSecretsRequest
@@ -1853,7 +1936,7 @@ export type ListProjectSecretsRequest = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(ListProjectSecretsRequestSchema)` to create a new message.
  */
 export const ListProjectSecretsRequestSchema: GenMessage<ListProjectSecretsRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 83);
+  messageDesc(file_api_service_v1alpha1_service, 87);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListProjectSecretsResponse
@@ -1870,7 +1953,7 @@ export type ListProjectSecretsResponse = Message<"akuity.io.kargo.service.v1alph
  * Use `create(ListProjectSecretsResponseSchema)` to create a new message.
  */
 export const ListProjectSecretsResponseSchema: GenMessage<ListProjectSecretsResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 84);
+  messageDesc(file_api_service_v1alpha1_service, 88);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.CreateProjectSecretRequest
@@ -1902,7 +1985,7 @@ export type CreateProjectSecretRequest = Message<"akuity.io.kargo.service.v1alph
  * Use `create(CreateProjectSecretRequestSchema)` to create a new message.
  */
 export const CreateProjectSecretRequestSchema: GenMessage<CreateProjectSecretRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 85);
+  messageDesc(file_api_service_v1alpha1_service, 89);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.CreateProjectSecretResponse
@@ -1919,7 +2002,7 @@ export type CreateProjectSecretResponse = Message<"akuity.io.kargo.service.v1alp
  * Use `create(CreateProjectSecretResponseSchema)` to create a new message.
  */
 export const CreateProjectSecretResponseSchema: GenMessage<CreateProjectSecretResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 86);
+  messageDesc(file_api_service_v1alpha1_service, 90);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.UpdateProjectSecretRequest
@@ -1951,7 +2034,7 @@ export type UpdateProjectSecretRequest = Message<"akuity.io.kargo.service.v1alph
  * Use `create(UpdateProjectSecretRequestSchema)` to create a new message.
  */
 export const UpdateProjectSecretRequestSchema: GenMessage<UpdateProjectSecretRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 87);
+  messageDesc(file_api_service_v1alpha1_service, 91);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.UpdateProjectSecretResponse
@@ -1968,7 +2051,7 @@ export type UpdateProjectSecretResponse = Message<"akuity.io.kargo.service.v1alp
  * Use `create(UpdateProjectSecretResponseSchema)` to create a new message.
  */
 export const UpdateProjectSecretResponseSchema: GenMessage<UpdateProjectSecretResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 88);
+  messageDesc(file_api_service_v1alpha1_service, 92);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.DeleteProjectSecretRequest
@@ -1990,7 +2073,7 @@ export type DeleteProjectSecretRequest = Message<"akuity.io.kargo.service.v1alph
  * Use `create(DeleteProjectSecretRequestSchema)` to create a new message.
  */
 export const DeleteProjectSecretRequestSchema: GenMessage<DeleteProjectSecretRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 89);
+  messageDesc(file_api_service_v1alpha1_service, 93);
 
 /**
  * explicitly empty 
@@ -2005,7 +2088,7 @@ export type DeleteProjectSecretResponse = Message<"akuity.io.kargo.service.v1alp
  * Use `create(DeleteProjectSecretResponseSchema)` to create a new message.
  */
 export const DeleteProjectSecretResponseSchema: GenMessage<DeleteProjectSecretResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 90);
+  messageDesc(file_api_service_v1alpha1_service, 94);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.CreateCredentialsRequest
@@ -2059,7 +2142,7 @@ export type CreateCredentialsRequest = Message<"akuity.io.kargo.service.v1alpha1
  * Use `create(CreateCredentialsRequestSchema)` to create a new message.
  */
 export const CreateCredentialsRequestSchema: GenMessage<CreateCredentialsRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 91);
+  messageDesc(file_api_service_v1alpha1_service, 95);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.CreateCredentialsResponse
@@ -2076,7 +2159,7 @@ export type CreateCredentialsResponse = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(CreateCredentialsResponseSchema)` to create a new message.
  */
 export const CreateCredentialsResponseSchema: GenMessage<CreateCredentialsResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 92);
+  messageDesc(file_api_service_v1alpha1_service, 96);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.DeleteCredentialsRequest
@@ -2098,7 +2181,7 @@ export type DeleteCredentialsRequest = Message<"akuity.io.kargo.service.v1alpha1
  * Use `create(DeleteCredentialsRequestSchema)` to create a new message.
  */
 export const DeleteCredentialsRequestSchema: GenMessage<DeleteCredentialsRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 93);
+  messageDesc(file_api_service_v1alpha1_service, 97);
 
 /**
  * explicitly empty 
@@ -2113,7 +2196,7 @@ export type DeleteCredentialsResponse = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(DeleteCredentialsResponseSchema)` to create a new message.
  */
 export const DeleteCredentialsResponseSchema: GenMessage<DeleteCredentialsResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 94);
+  messageDesc(file_api_service_v1alpha1_service, 98);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetCredentialsRequest
@@ -2140,7 +2223,7 @@ export type GetCredentialsRequest = Message<"akuity.io.kargo.service.v1alpha1.Ge
  * Use `create(GetCredentialsRequestSchema)` to create a new message.
  */
 export const GetCredentialsRequestSchema: GenMessage<GetCredentialsRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 95);
+  messageDesc(file_api_service_v1alpha1_service, 99);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetCredentialsResponse
@@ -2169,7 +2252,7 @@ export type GetCredentialsResponse = Message<"akuity.io.kargo.service.v1alpha1.G
  * Use `create(GetCredentialsResponseSchema)` to create a new message.
  */
 export const GetCredentialsResponseSchema: GenMessage<GetCredentialsResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 96);
+  messageDesc(file_api_service_v1alpha1_service, 100);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListCredentialsRequest
@@ -2186,7 +2269,7 @@ export type ListCredentialsRequest = Message<"akuity.io.kargo.service.v1alpha1.L
  * Use `create(ListCredentialsRequestSchema)` to create a new message.
  */
 export const ListCredentialsRequestSchema: GenMessage<ListCredentialsRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 97);
+  messageDesc(file_api_service_v1alpha1_service, 101);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListCredentialsResponse
@@ -2203,7 +2286,7 @@ export type ListCredentialsResponse = Message<"akuity.io.kargo.service.v1alpha1.
  * Use `create(ListCredentialsResponseSchema)` to create a new message.
  */
 export const ListCredentialsResponseSchema: GenMessage<ListCredentialsResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 98);
+  messageDesc(file_api_service_v1alpha1_service, 102);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.UpdateCredentialsRequest
@@ -2255,7 +2338,7 @@ export type UpdateCredentialsRequest = Message<"akuity.io.kargo.service.v1alpha1
  * Use `create(UpdateCredentialsRequestSchema)` to create a new message.
  */
 export const UpdateCredentialsRequestSchema: GenMessage<UpdateCredentialsRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 99);
+  messageDesc(file_api_service_v1alpha1_service, 103);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.UpdateCredentialsResponse
@@ -2272,7 +2355,7 @@ export type UpdateCredentialsResponse = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(UpdateCredentialsResponseSchema)` to create a new message.
  */
 export const UpdateCredentialsResponseSchema: GenMessage<UpdateCredentialsResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 100);
+  messageDesc(file_api_service_v1alpha1_service, 104);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesRequest
@@ -2289,7 +2372,7 @@ export type ListAnalysisTemplatesRequest = Message<"akuity.io.kargo.service.v1al
  * Use `create(ListAnalysisTemplatesRequestSchema)` to create a new message.
  */
 export const ListAnalysisTemplatesRequestSchema: GenMessage<ListAnalysisTemplatesRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 101);
+  messageDesc(file_api_service_v1alpha1_service, 105);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListAnalysisTemplatesResponse
@@ -2306,7 +2389,7 @@ export type ListAnalysisTemplatesResponse = Message<"akuity.io.kargo.service.v1a
  * Use `create(ListAnalysisTemplatesResponseSchema)` to create a new message.
  */
 export const ListAnalysisTemplatesResponseSchema: GenMessage<ListAnalysisTemplatesResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 102);
+  messageDesc(file_api_service_v1alpha1_service, 106);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListPromotionTasksRequest
@@ -2323,7 +2406,7 @@ export type ListPromotionTasksRequest = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(ListPromotionTasksRequestSchema)` to create a new message.
  */
 export const ListPromotionTasksRequestSchema: GenMessage<ListPromotionTasksRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 103);
+  messageDesc(file_api_service_v1alpha1_service, 107);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListPromotionTasksResponse
@@ -2340,7 +2423,7 @@ export type ListPromotionTasksResponse = Message<"akuity.io.kargo.service.v1alph
  * Use `create(ListPromotionTasksResponseSchema)` to create a new message.
  */
 export const ListPromotionTasksResponseSchema: GenMessage<ListPromotionTasksResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 104);
+  messageDesc(file_api_service_v1alpha1_service, 108);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksRequest
@@ -2353,7 +2436,7 @@ export type ListClusterPromotionTasksRequest = Message<"akuity.io.kargo.service.
  * Use `create(ListClusterPromotionTasksRequestSchema)` to create a new message.
  */
 export const ListClusterPromotionTasksRequestSchema: GenMessage<ListClusterPromotionTasksRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 105);
+  messageDesc(file_api_service_v1alpha1_service, 109);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListClusterPromotionTasksResponse
@@ -2370,7 +2453,7 @@ export type ListClusterPromotionTasksResponse = Message<"akuity.io.kargo.service
  * Use `create(ListClusterPromotionTasksResponseSchema)` to create a new message.
  */
 export const ListClusterPromotionTasksResponseSchema: GenMessage<ListClusterPromotionTasksResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 106);
+  messageDesc(file_api_service_v1alpha1_service, 110);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateRequest
@@ -2397,7 +2480,7 @@ export type GetAnalysisTemplateRequest = Message<"akuity.io.kargo.service.v1alph
  * Use `create(GetAnalysisTemplateRequestSchema)` to create a new message.
  */
 export const GetAnalysisTemplateRequestSchema: GenMessage<GetAnalysisTemplateRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 107);
+  messageDesc(file_api_service_v1alpha1_service, 111);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetAnalysisTemplateResponse
@@ -2426,7 +2509,7 @@ export type GetAnalysisTemplateResponse = Message<"akuity.io.kargo.service.v1alp
  * Use `create(GetAnalysisTemplateResponseSchema)` to create a new message.
  */
 export const GetAnalysisTemplateResponseSchema: GenMessage<GetAnalysisTemplateResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 108);
+  messageDesc(file_api_service_v1alpha1_service, 112);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetPromotionTaskRequest
@@ -2453,7 +2536,7 @@ export type GetPromotionTaskRequest = Message<"akuity.io.kargo.service.v1alpha1.
  * Use `create(GetPromotionTaskRequestSchema)` to create a new message.
  */
 export const GetPromotionTaskRequestSchema: GenMessage<GetPromotionTaskRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 109);
+  messageDesc(file_api_service_v1alpha1_service, 113);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetPromotionTaskResponse
@@ -2482,7 +2565,7 @@ export type GetPromotionTaskResponse = Message<"akuity.io.kargo.service.v1alpha1
  * Use `create(GetPromotionTaskResponseSchema)` to create a new message.
  */
 export const GetPromotionTaskResponseSchema: GenMessage<GetPromotionTaskResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 110);
+  messageDesc(file_api_service_v1alpha1_service, 114);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskRequest
@@ -2504,7 +2587,7 @@ export type GetClusterPromotionTaskRequest = Message<"akuity.io.kargo.service.v1
  * Use `create(GetClusterPromotionTaskRequestSchema)` to create a new message.
  */
 export const GetClusterPromotionTaskRequestSchema: GenMessage<GetClusterPromotionTaskRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 111);
+  messageDesc(file_api_service_v1alpha1_service, 115);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetClusterPromotionTaskResponse
@@ -2533,7 +2616,7 @@ export type GetClusterPromotionTaskResponse = Message<"akuity.io.kargo.service.v
  * Use `create(GetClusterPromotionTaskResponseSchema)` to create a new message.
  */
 export const GetClusterPromotionTaskResponseSchema: GenMessage<GetClusterPromotionTaskResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 112);
+  messageDesc(file_api_service_v1alpha1_service, 116);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesRequest
@@ -2546,7 +2629,7 @@ export type ListClusterAnalysisTemplatesRequest = Message<"akuity.io.kargo.servi
  * Use `create(ListClusterAnalysisTemplatesRequestSchema)` to create a new message.
  */
 export const ListClusterAnalysisTemplatesRequestSchema: GenMessage<ListClusterAnalysisTemplatesRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 113);
+  messageDesc(file_api_service_v1alpha1_service, 117);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListClusterAnalysisTemplatesResponse
@@ -2563,7 +2646,7 @@ export type ListClusterAnalysisTemplatesResponse = Message<"akuity.io.kargo.serv
  * Use `create(ListClusterAnalysisTemplatesResponseSchema)` to create a new message.
  */
 export const ListClusterAnalysisTemplatesResponseSchema: GenMessage<ListClusterAnalysisTemplatesResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 114);
+  messageDesc(file_api_service_v1alpha1_service, 118);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateRequest
@@ -2585,7 +2668,7 @@ export type GetClusterAnalysisTemplateRequest = Message<"akuity.io.kargo.service
  * Use `create(GetClusterAnalysisTemplateRequestSchema)` to create a new message.
  */
 export const GetClusterAnalysisTemplateRequestSchema: GenMessage<GetClusterAnalysisTemplateRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 115);
+  messageDesc(file_api_service_v1alpha1_service, 119);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetClusterAnalysisTemplateResponse
@@ -2614,7 +2697,7 @@ export type GetClusterAnalysisTemplateResponse = Message<"akuity.io.kargo.servic
  * Use `create(GetClusterAnalysisTemplateResponseSchema)` to create a new message.
  */
 export const GetClusterAnalysisTemplateResponseSchema: GenMessage<GetClusterAnalysisTemplateResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 116);
+  messageDesc(file_api_service_v1alpha1_service, 120);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetAnalysisRunRequest
@@ -2641,7 +2724,7 @@ export type GetAnalysisRunRequest = Message<"akuity.io.kargo.service.v1alpha1.Ge
  * Use `create(GetAnalysisRunRequestSchema)` to create a new message.
  */
 export const GetAnalysisRunRequestSchema: GenMessage<GetAnalysisRunRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 117);
+  messageDesc(file_api_service_v1alpha1_service, 121);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetAnalysisRunResponse
@@ -2670,7 +2753,7 @@ export type GetAnalysisRunResponse = Message<"akuity.io.kargo.service.v1alpha1.G
  * Use `create(GetAnalysisRunResponseSchema)` to create a new message.
  */
 export const GetAnalysisRunResponseSchema: GenMessage<GetAnalysisRunResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 118);
+  messageDesc(file_api_service_v1alpha1_service, 122);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsRequest
@@ -2702,7 +2785,7 @@ export type GetAnalysisRunLogsRequest = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(GetAnalysisRunLogsRequestSchema)` to create a new message.
  */
 export const GetAnalysisRunLogsRequestSchema: GenMessage<GetAnalysisRunLogsRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 119);
+  messageDesc(file_api_service_v1alpha1_service, 123);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetAnalysisRunLogsResponse
@@ -2719,7 +2802,7 @@ export type GetAnalysisRunLogsResponse = Message<"akuity.io.kargo.service.v1alph
  * Use `create(GetAnalysisRunLogsResponseSchema)` to create a new message.
  */
 export const GetAnalysisRunLogsResponseSchema: GenMessage<GetAnalysisRunLogsResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 120);
+  messageDesc(file_api_service_v1alpha1_service, 124);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.DeleteAnalysisTemplateRequest
@@ -2741,7 +2824,7 @@ export type DeleteAnalysisTemplateRequest = Message<"akuity.io.kargo.service.v1a
  * Use `create(DeleteAnalysisTemplateRequestSchema)` to create a new message.
  */
 export const DeleteAnalysisTemplateRequestSchema: GenMessage<DeleteAnalysisTemplateRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 121);
+  messageDesc(file_api_service_v1alpha1_service, 125);
 
 /**
  * explicitly empty 
@@ -2756,7 +2839,7 @@ export type DeleteAnalysisTemplateResponse = Message<"akuity.io.kargo.service.v1
  * Use `create(DeleteAnalysisTemplateResponseSchema)` to create a new message.
  */
 export const DeleteAnalysisTemplateResponseSchema: GenMessage<DeleteAnalysisTemplateResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 122);
+  messageDesc(file_api_service_v1alpha1_service, 126);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.DeleteClusterAnalysisTemplateRequest
@@ -2773,7 +2856,7 @@ export type DeleteClusterAnalysisTemplateRequest = Message<"akuity.io.kargo.serv
  * Use `create(DeleteClusterAnalysisTemplateRequestSchema)` to create a new message.
  */
 export const DeleteClusterAnalysisTemplateRequestSchema: GenMessage<DeleteClusterAnalysisTemplateRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 123);
+  messageDesc(file_api_service_v1alpha1_service, 127);
 
 /**
  * explicitly empty 
@@ -2788,7 +2871,7 @@ export type DeleteClusterAnalysisTemplateResponse = Message<"akuity.io.kargo.ser
  * Use `create(DeleteClusterAnalysisTemplateResponseSchema)` to create a new message.
  */
 export const DeleteClusterAnalysisTemplateResponseSchema: GenMessage<DeleteClusterAnalysisTemplateResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 124);
+  messageDesc(file_api_service_v1alpha1_service, 128);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListProjectEventsRequest
@@ -2805,7 +2888,7 @@ export type ListProjectEventsRequest = Message<"akuity.io.kargo.service.v1alpha1
  * Use `create(ListProjectEventsRequestSchema)` to create a new message.
  */
 export const ListProjectEventsRequestSchema: GenMessage<ListProjectEventsRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 125);
+  messageDesc(file_api_service_v1alpha1_service, 129);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListProjectEventsResponse
@@ -2822,7 +2905,7 @@ export type ListProjectEventsResponse = Message<"akuity.io.kargo.service.v1alpha
  * Use `create(ListProjectEventsResponseSchema)` to create a new message.
  */
 export const ListProjectEventsResponseSchema: GenMessage<ListProjectEventsResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 126);
+  messageDesc(file_api_service_v1alpha1_service, 130);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.CreateRoleRequest
@@ -2839,7 +2922,7 @@ export type CreateRoleRequest = Message<"akuity.io.kargo.service.v1alpha1.Create
  * Use `create(CreateRoleRequestSchema)` to create a new message.
  */
 export const CreateRoleRequestSchema: GenMessage<CreateRoleRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 127);
+  messageDesc(file_api_service_v1alpha1_service, 131);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.CreateRoleResponse
@@ -2856,7 +2939,7 @@ export type CreateRoleResponse = Message<"akuity.io.kargo.service.v1alpha1.Creat
  * Use `create(CreateRoleResponseSchema)` to create a new message.
  */
 export const CreateRoleResponseSchema: GenMessage<CreateRoleResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 128);
+  messageDesc(file_api_service_v1alpha1_service, 132);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.DeleteRoleRequest
@@ -2878,7 +2961,7 @@ export type DeleteRoleRequest = Message<"akuity.io.kargo.service.v1alpha1.Delete
  * Use `create(DeleteRoleRequestSchema)` to create a new message.
  */
 export const DeleteRoleRequestSchema: GenMessage<DeleteRoleRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 129);
+  messageDesc(file_api_service_v1alpha1_service, 133);
 
 /**
  * explicitly empty 
@@ -2893,7 +2976,7 @@ export type DeleteRoleResponse = Message<"akuity.io.kargo.service.v1alpha1.Delet
  * Use `create(DeleteRoleResponseSchema)` to create a new message.
  */
 export const DeleteRoleResponseSchema: GenMessage<DeleteRoleResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 130);
+  messageDesc(file_api_service_v1alpha1_service, 134);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetRoleRequest
@@ -2925,7 +3008,7 @@ export type GetRoleRequest = Message<"akuity.io.kargo.service.v1alpha1.GetRoleRe
  * Use `create(GetRoleRequestSchema)` to create a new message.
  */
 export const GetRoleRequestSchema: GenMessage<GetRoleRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 131);
+  messageDesc(file_api_service_v1alpha1_service, 135);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GetRoleResponse
@@ -2960,7 +3043,7 @@ export type GetRoleResponse = Message<"akuity.io.kargo.service.v1alpha1.GetRoleR
  * Use `create(GetRoleResponseSchema)` to create a new message.
  */
 export const GetRoleResponseSchema: GenMessage<GetRoleResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 132);
+  messageDesc(file_api_service_v1alpha1_service, 136);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.Claims
@@ -2979,7 +3062,7 @@ export type Claims = Message<"akuity.io.kargo.service.v1alpha1.Claims"> & {
  * Use `create(ClaimsSchema)` to create a new message.
  */
 export const ClaimsSchema: GenMessage<Claims> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 133);
+  messageDesc(file_api_service_v1alpha1_service, 137);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GrantRequest
@@ -3018,7 +3101,7 @@ export type GrantRequest = Message<"akuity.io.kargo.service.v1alpha1.GrantReques
  * Use `create(GrantRequestSchema)` to create a new message.
  */
 export const GrantRequestSchema: GenMessage<GrantRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 134);
+  messageDesc(file_api_service_v1alpha1_service, 138);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.GrantResponse
@@ -3035,7 +3118,7 @@ export type GrantResponse = Message<"akuity.io.kargo.service.v1alpha1.GrantRespo
  * Use `create(GrantResponseSchema)` to create a new message.
  */
 export const GrantResponseSchema: GenMessage<GrantResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 135);
+  messageDesc(file_api_service_v1alpha1_service, 139);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListRolesRequest
@@ -3057,7 +3140,7 @@ export type ListRolesRequest = Message<"akuity.io.kargo.service.v1alpha1.ListRol
  * Use `create(ListRolesRequestSchema)` to create a new message.
  */
 export const ListRolesRequestSchema: GenMessage<ListRolesRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 136);
+  messageDesc(file_api_service_v1alpha1_service, 140);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.ListRolesResponse
@@ -3081,7 +3164,7 @@ export type ListRolesResponse = Message<"akuity.io.kargo.service.v1alpha1.ListRo
  * Use `create(ListRolesResponseSchema)` to create a new message.
  */
 export const ListRolesResponseSchema: GenMessage<ListRolesResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 137);
+  messageDesc(file_api_service_v1alpha1_service, 141);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.RevokeRequest
@@ -3120,7 +3203,7 @@ export type RevokeRequest = Message<"akuity.io.kargo.service.v1alpha1.RevokeRequ
  * Use `create(RevokeRequestSchema)` to create a new message.
  */
 export const RevokeRequestSchema: GenMessage<RevokeRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 138);
+  messageDesc(file_api_service_v1alpha1_service, 142);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.RevokeResponse
@@ -3137,7 +3220,7 @@ export type RevokeResponse = Message<"akuity.io.kargo.service.v1alpha1.RevokeRes
  * Use `create(RevokeResponseSchema)` to create a new message.
  */
 export const RevokeResponseSchema: GenMessage<RevokeResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 139);
+  messageDesc(file_api_service_v1alpha1_service, 143);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.UpdateRoleRequest
@@ -3154,7 +3237,7 @@ export type UpdateRoleRequest = Message<"akuity.io.kargo.service.v1alpha1.Update
  * Use `create(UpdateRoleRequestSchema)` to create a new message.
  */
 export const UpdateRoleRequestSchema: GenMessage<UpdateRoleRequest> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 140);
+  messageDesc(file_api_service_v1alpha1_service, 144);
 
 /**
  * @generated from message akuity.io.kargo.service.v1alpha1.UpdateRoleResponse
@@ -3171,7 +3254,7 @@ export type UpdateRoleResponse = Message<"akuity.io.kargo.service.v1alpha1.Updat
  * Use `create(UpdateRoleResponseSchema)` to create a new message.
  */
 export const UpdateRoleResponseSchema: GenMessage<UpdateRoleResponse> = /*@__PURE__*/
-  messageDesc(file_api_service_v1alpha1_service, 141);
+  messageDesc(file_api_service_v1alpha1_service, 145);
 
 /**
  * @generated from enum akuity.io.kargo.service.v1alpha1.RawFormat
@@ -3382,6 +3465,22 @@ export const KargoService: GenService<{
     input: typeof ListProjectsRequestSchema;
     output: typeof ListProjectsResponseSchema;
   },
+  /**
+   * @generated from rpc akuity.io.kargo.service.v1alpha1.KargoService.DeleteProjectConfig
+   */
+  deleteProjectConfig: {
+    methodKind: "unary";
+    input: typeof DeleteProjectConfigRequestSchema;
+    output: typeof DeleteProjectConfigResponseSchema;
+  },
+  /**
+   * @generated from rpc akuity.io.kargo.service.v1alpha1.KargoService.GetProjectConfig
+   */
+  getProjectConfig: {
+    methodKind: "unary";
+    input: typeof GetProjectConfigRequestSchema;
+    output: typeof GetProjectConfigResponseSchema;
+  },
   /**
    * @generated from rpc akuity.io.kargo.service.v1alpha1.KargoService.ApproveFreight
    */
diff --git a/ui/src/gen/api/v1alpha1/generated_pb.ts b/ui/src/gen/api/v1alpha1/generated_pb.ts
index b1ec83c2..b49c2241 100644
--- a/ui/src/gen/api/v1alpha1/generated_pb.ts
+++ b/ui/src/gen/api/v1alpha1/generated_pb.ts
@@ -1034,6 +1034,14 @@ export type FreightSources = Message<"github.com.akuity.kargo.api.v1alpha1.Freig
    * made available to the Stage. This field is optional. When left unspecified,
    * the field is implicitly treated as if its value were "OneOf".
    *
+   * Accepted Values:
+   *
+   * - "All": Freight must be be verified and, if applicable, soaked in all
+   *   upstream Stages to be considered available for promotion.
+   * - "OneOf": Freight must be verified and, if applicable, soaked in at least
+   *    one upstream Stage to be considered available for promotion.
+   * - "": Treated the same as "OneOf".
+   *
    * +kubebuilder:validation:Optional
    *
    * @generated from field: optional string availabilityStrategy = 4;
@@ -1164,7 +1172,7 @@ export type GitDiscoveryResult = Message<"github.com.akuity.kargo.api.v1alpha1.G
    * RepoURL is the repository URL of the GitSubscription.
    *
    * +kubebuilder:validation:MinLength=1
-   * +kubebuilder:validation:Pattern=`(?:^(https?)://(?:([\w-]+):(.+)@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
+   * +kubebuilder:validation:Pattern=`(?:^(ssh|https?)://(?:([\w-]+)(:(.+))?@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
    *
    * @generated from field: optional string repoURL = 1;
    */
@@ -1199,7 +1207,7 @@ export type GitSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.GitS
    * URL is the repository's URL. This is a required field.
    *
    * +kubebuilder:validation:MinLength=1
-   * +kubebuilder:validation:Pattern=`(?:^(https?)://(?:([\w-]+):(.+)@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
+   * +kubebuilder:validation:Pattern=`(?:^(ssh|https?)://(?:([\w-]+)(:(.+))?@)?([\w-]+(?:\.[\w-]+)*)(?::(\d{1,5}))?(/.*)$)|(?:^([\w-]+)@([\w+]+(?:\.[\w-]+)*):(/?.*))`
    *
    * @generated from field: optional string repoURL = 1;
    */
@@ -1210,7 +1218,25 @@ export type GitSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.GitS
    * commit of interest in the repository specified by the RepoURL field. This
    * field is optional. When left unspecified, the field is implicitly treated
    * as if its value were "NewestFromBranch".
-   * Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
+   *
+   * Accepted values:
+   *
+   * - "NewestFromBranch": Selects the latest commit on the branch specified
+   *   by the Branch field or the default branch if none is specified. This is
+   *   the default strategy.
+   *
+   * - "SemVer": Selects the commit referenced by the the semantically greatest
+   *   tag. The SemverConstraint field can optionally be used to narrow the set
+   *   of tags eligible for selection.
+   *
+   * - "Lexical": Selects the commit referenced by the lexicographically
+   *   greatest tag. Useful when tags embed a _leading_ date or timestamp. The
+   *   AllowTags and IgnoreTags fields can optionally be used to narrow the set
+   *   of tags eligible for selection.
+   *
+   * - "NewestTag": Selects the commit referenced by the most recently created
+   *   tag. The AllowTags and IgnoreTags fields can optionally be used to
+   *   narrow the set of tags eligible for selection.
    *
    * +kubebuilder:default=NewestFromBranch
    *
@@ -1308,6 +1334,7 @@ export type GitSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.GitS
    *   2. Glob patterns (prefix the pattern with "glob:"; ex. "glob:*.yaml")
    *   3. Regular expressions (prefix the pattern with "regex:" or "regexp:";
    *      ex. "regexp:^.*\.yaml$")
+   *
    * Paths selected by IncludePaths may be unselected by ExcludePaths. This
    * is a useful method for including a broad set of paths and then excluding a
    * subset of them.
@@ -1595,7 +1622,26 @@ export type ImageSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.Im
    * of the image specified by the RepoURL field. This field is optional. When
    * left unspecified, the field is implicitly treated as if its value were
    * "SemVer".
-   * Accepted values: Digest, Lexical, NewestBuild, SemVer
+   *
+   * Accepted values:
+   *
+   * - "Digest": Selects the image currently referenced by the tag specified
+   *   (unintuitively) by the SemverConstraint field.
+   *
+   * - "Lexical": Selects the image referenced by the lexicographically greatest
+   *   tag. Useful when tags embed a leading date or timestamp. The AllowTags
+   *   and IgnoreTags fields can optionally be used to narrow the set of tags
+   *   eligible for selection.
+   *
+   * - "NewestBuild": Selects the image that was most recently pushed to the
+   *   repository. The AllowTags and IgnoreTags fields can optionally be used
+   *   to narrow the set of tags eligible for selection. This is the least
+   *   efficient and is likely to cause rate limiting affecting this Warehouse
+   *   and possibly others. This strategy should be avoided.
+   *
+   * - "SemVer": Selects the image with the semantically greatest tag. The
+   *   AllowTags and IgnoreTags fields can optionally be used to narrow the set
+   *   of tags eligible for selection.
    *
    * +kubebuilder:default=SemVer
    *
@@ -3194,7 +3240,12 @@ export type WarehouseSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho
    * FreightCreationPolicy describes how Freight is created by this Warehouse.
    * This field is optional. When left unspecified, the field is implicitly
    * treated as if its value were "Automatic".
-   * Accepted values: Automatic, Manual
+   *
+   * Accepted values:
+   *
+   * - "Automatic": New Freight is created automatically when any new artifact
+   *   is discovered.
+   * - "Manual": New Freight is never created automatically.
    *
    * +kubebuilder:default=Automatic
    * +kubebuilder:validation:Optional
diff --git a/ui/src/gen/directives/git-open-pr-config.json b/ui/src/gen/directives/git-open-pr-config.json
index 772272c7..2c0f3c37 100644
--- a/ui/src/gen/directives/git-open-pr-config.json
+++ b/ui/src/gen/directives/git-open-pr-config.json
@@ -44,6 +44,11 @@
    "description": "The title for the pull request. Kargo generates a title based on the commit messages if it is not explicitly specified.",
    "minLength": 1
   },
+  "description": {
+   "type": "string",
+   "description": "The description of the pull request. Kargo generates a description based on the commit messages if it is not explicitly specified.",
+   "minLength": 1
+  },
   "labels": {
    "type": "array",
    "description": "Labels to add to the pull request.",
diff --git a/ui/src/gen/directives/yaml-update-config.json b/ui/src/gen/directives/yaml-update-config.json
index 18ef87e0..cef63d2b 100644
--- a/ui/src/gen/directives/yaml-update-config.json
+++ b/ui/src/gen/directives/yaml-update-config.json
@@ -12,7 +12,6 @@
      "minLength": 1
     },
     "value": {
-     "type": "string",
      "description": "The new value for the specified key."
     }
    }
@@ -39,7 +38,6 @@
       "minLength": 1
      },
      "value": {
-      "type": "string",
       "description": "The new value for the specified key."
      }
     }
diff --git a/ui/src/gen/k8s.io/api/batch/v1/generated_pb.ts b/ui/src/gen/k8s.io/api/batch/v1/generated_pb.ts
index 533fcd4b..9247b00a 100644
--- a/ui/src/gen/k8s.io/api/batch/v1/generated_pb.ts
+++ b/ui/src/gen/k8s.io/api/batch/v1/generated_pb.ts
@@ -434,8 +434,6 @@ export type JobSpec = Message<"k8s.io.api.batch.v1.JobSpec"> & {
    * When the field is specified, it must be immutable and works only for the Indexed Jobs.
    * Once the Job meets the SuccessPolicy, the lingering pods are terminated.
    *
-   * This field is beta-level. To use this field, you must enable the
-   * `JobSuccessPolicy` feature gate (enabled by default).
    * +optional
    *
    * @generated from field: optional k8s.io.api.batch.v1.SuccessPolicy successPolicy = 16;
@@ -458,8 +456,6 @@ export type JobSpec = Message<"k8s.io.api.batch.v1.JobSpec"> & {
    * batch.kubernetes.io/job-index-failure-count annotation. It can only
    * be set when Job's completionMode=Indexed, and the Pod's restart
    * policy is Never. The field is immutable.
-   * This field is beta-level. It can be used when the `JobBackoffLimitPerIndex`
-   * feature gate is enabled (enabled by default).
    * +optional
    *
    * @generated from field: optional int32 backoffLimitPerIndex = 12;
@@ -475,8 +471,6 @@ export type JobSpec = Message<"k8s.io.api.batch.v1.JobSpec"> & {
    * It can only be specified when backoffLimitPerIndex is set.
    * It can be null or up to completions. It is required and must be
    * less than or equal to 10^4 when is completions greater than 10^5.
-   * This field is beta-level. It can be used when the `JobBackoffLimitPerIndex`
-   * feature gate is enabled (enabled by default).
    * +optional
    *
    * @generated from field: optional int32 maxFailedIndexes = 13;
@@ -745,8 +739,6 @@ export type JobStatus = Message<"k8s.io.api.batch.v1.JobStatus"> & {
    * represented as "1,3-5,7".
    * The set of failed indexes cannot overlap with the set of completed indexes.
    *
-   * This field is beta-level. It can be used when the `JobBackoffLimitPerIndex`
-   * feature gate is enabled (enabled by default).
    * +optional
    *
    * @generated from field: optional string failedIndexes = 10;
@@ -956,8 +948,6 @@ export type PodFailurePolicyRule = Message<"k8s.io.api.batch.v1.PodFailurePolicy
    *   running pods are terminated.
    * - FailIndex: indicates that the pod's index is marked as Failed and will
    *   not be restarted.
-   *   This value is beta-level. It can be used when the
-   *   `JobBackoffLimitPerIndex` feature gate is enabled (enabled by default).
    * - Ignore: indicates that the counter towards the .backoffLimit is not
    *   incremented and a replacement pod is created.
    * - Count: indicates that the pod is handled in the default way - the
diff --git a/ui/src/gen/k8s.io/api/core/v1/generated_pb.ts b/ui/src/gen/k8s.io/api/core/v1/generated_pb.ts
index a98602ae..fc74fb06 100644
--- a/ui/src/gen/k8s.io/api/core/v1/generated_pb.ts
+++ b/ui/src/gen/k8s.io/api/core/v1/generated_pb.ts
@@ -36,7 +36,7 @@ import type { Message } from "@bufbuild/protobuf";
  * Describes the file k8s.io/api/core/v1/generated.proto.
  */
 export const file_k8s_io_api_core_v1_generated: GenFile = /*@__PURE__*/
-  fileDesc("CiJrOHMuaW8vYXBpL2NvcmUvdjEvZ2VuZXJhdGVkLnByb3RvEhJrOHMuaW8uYXBpLmNvcmUudjEiaQogQVdTRWxhc3RpY0Jsb2NrU3RvcmVWb2x1bWVTb3VyY2USEAoIdm9sdW1lSUQYASABKAkSDgoGZnNUeXBlGAIgASgJEhEKCXBhcnRpdGlvbhgDIAEoBRIQCghyZWFkT25seRgEIAEoCCK2AQoIQWZmaW5pdHkSNgoMbm9kZUFmZmluaXR5GAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVBZmZpbml0eRI0Cgtwb2RBZmZpbml0eRgCIAEoCzIfLms4cy5pby5hcGkuY29yZS52MS5Qb2RBZmZpbml0eRI8Cg9wb2RBbnRpQWZmaW5pdHkYAyABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuUG9kQW50aUFmZmluaXR5IjkKD0FwcEFybW9yUHJvZmlsZRIMCgR0eXBlGAEgASgJEhgKEGxvY2FsaG9zdFByb2ZpbGUYAiABKAkiMgoOQXR0YWNoZWRWb2x1bWUSDAoEbmFtZRgBIAEoCRISCgpkZXZpY2VQYXRoGAIgASgJIk4KCUF2b2lkUG9kcxJBCg9wcmVmZXJBdm9pZFBvZHMYASADKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuUHJlZmVyQXZvaWRQb2RzRW50cnkifwoVQXp1cmVEaXNrVm9sdW1lU291cmNlEhAKCGRpc2tOYW1lGAEgASgJEg8KB2Rpc2tVUkkYAiABKAkSEwoLY2FjaGluZ01vZGUYAyABKAkSDgoGZnNUeXBlGAQgASgJEhAKCHJlYWRPbmx5GAUgASgIEgwKBGtpbmQYBiABKAkicwofQXp1cmVGaWxlUGVyc2lzdGVudFZvbHVtZVNvdXJjZRISCgpzZWNyZXROYW1lGAEgASgJEhEKCXNoYXJlTmFtZRgCIAEoCRIQCghyZWFkT25seRgDIAEoCBIXCg9zZWNyZXROYW1lc3BhY2UYBCABKAkiUAoVQXp1cmVGaWxlVm9sdW1lU291cmNlEhIKCnNlY3JldE5hbWUYASABKAkSEQoJc2hhcmVOYW1lGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIIoIBCgdCaW5kaW5nEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESMwoGdGFyZ2V0GAIgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLk9iamVjdFJlZmVyZW5jZSLSBAoZQ1NJUGVyc2lzdGVudFZvbHVtZVNvdXJjZRIOCgZkcml2ZXIYASABKAkSFAoMdm9sdW1lSGFuZGxlGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIEg4KBmZzVHlwZRgEIAEoCRJdChB2b2x1bWVBdHRyaWJ1dGVzGAUgAygLMkMuazhzLmlvLmFwaS5jb3JlLnYxLkNTSVBlcnNpc3RlbnRWb2x1bWVTb3VyY2UuVm9sdW1lQXR0cmlidXRlc0VudHJ5EkcKGmNvbnRyb2xsZXJQdWJsaXNoU2VjcmV0UmVmGAYgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRI/ChJub2RlU3RhZ2VTZWNyZXRSZWYYByABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlEkEKFG5vZGVQdWJsaXNoU2VjcmV0UmVmGAggASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRJGChljb250cm9sbGVyRXhwYW5kU2VjcmV0UmVmGAkgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRJAChNub2RlRXhwYW5kU2VjcmV0UmVmGAogASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRo3ChVWb2x1bWVBdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKZAgoPQ1NJVm9sdW1lU291cmNlEg4KBmRyaXZlchgBIAEoCRIQCghyZWFkT25seRgCIAEoCBIOCgZmc1R5cGUYAyABKAkSUwoQdm9sdW1lQXR0cmlidXRlcxgEIAMoCzI5Lms4cy5pby5hcGkuY29yZS52MS5DU0lWb2x1bWVTb3VyY2UuVm9sdW1lQXR0cmlidXRlc0VudHJ5EkYKFG5vZGVQdWJsaXNoU2VjcmV0UmVmGAUgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlGjcKFVZvbHVtZUF0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIikKDENhcGFiaWxpdGllcxILCgNhZGQYASADKAkSDAoEZHJvcBgCIAMoCSKqAQocQ2VwaEZTUGVyc2lzdGVudFZvbHVtZVNvdXJjZRIQCghtb25pdG9ycxgBIAMoCRIMCgRwYXRoGAIgASgJEgwKBHVzZXIYAyABKAkSEgoKc2VjcmV0RmlsZRgEIAEoCRI2CglzZWNyZXRSZWYYBSABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlEhAKCHJlYWRPbmx5GAYgASgIIqUBChJDZXBoRlNWb2x1bWVTb3VyY2USEAoIbW9uaXRvcnMYASADKAkSDAoEcGF0aBgCIAEoCRIMCgR1c2VyGAMgASgJEhIKCnNlY3JldEZpbGUYBCABKAkSOwoJc2VjcmV0UmVmGAUgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEhAKCHJlYWRPbmx5GAYgASgIIooBChxDaW5kZXJQZXJzaXN0ZW50Vm9sdW1lU291cmNlEhAKCHZvbHVtZUlEGAEgASgJEg4KBmZzVHlwZRgCIAEoCRIQCghyZWFkT25seRgDIAEoCBI2CglzZWNyZXRSZWYYBCABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlIoUBChJDaW5kZXJWb2x1bWVTb3VyY2USEAoIdm9sdW1lSUQYASABKAkSDgoGZnNUeXBlGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIEjsKCXNlY3JldFJlZhgEIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZSIoCg5DbGllbnRJUENvbmZpZxIWCg50aW1lb3V0U2Vjb25kcxgBIAEoBSKsAQocQ2x1c3RlclRydXN0QnVuZGxlUHJvamVjdGlvbhIMCgRuYW1lGAEgASgJEhIKCnNpZ25lck5hbWUYAiABKAkSSgoNbGFiZWxTZWxlY3RvchgDIAEoCzIzLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MYWJlbFNlbGVjdG9yEhAKCG9wdGlvbmFsGAUgASgIEgwKBHBhdGgYBCABKAkiUgoSQ29tcG9uZW50Q29uZGl0aW9uEgwKBHR5cGUYASABKAkSDgoGc3RhdHVzGAIgASgJEg8KB21lc3NhZ2UYAyABKAkSDQoFZXJyb3IYBCABKAkikQEKD0NvbXBvbmVudFN0YXR1cxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjoKCmNvbmRpdGlvbnMYAiADKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuQ29tcG9uZW50Q29uZGl0aW9uIosBChNDb21wb25lbnRTdGF0dXNMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjIKBWl0ZW1zGAIgAygLMiMuazhzLmlvLmFwaS5jb3JlLnYxLkNvbXBvbmVudFN0YXR1cyK8AgoJQ29uZmlnTWFwEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESEQoJaW1tdXRhYmxlGAQgASgIEjUKBGRhdGEYAiADKAsyJy5rOHMuaW8uYXBpLmNvcmUudjEuQ29uZmlnTWFwLkRhdGFFbnRyeRJBCgpiaW5hcnlEYXRhGAMgAygLMi0uazhzLmlvLmFwaS5jb3JlLnYxLkNvbmZpZ01hcC5CaW5hcnlEYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMQoPQmluYXJ5RGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoDDoCOAEibgoSQ29uZmlnTWFwRW52U291cmNlEkYKFGxvY2FsT2JqZWN0UmVmZXJlbmNlGAEgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEhAKCG9wdGlvbmFsGAIgASgIIn0KFENvbmZpZ01hcEtleVNlbGVjdG9yEkYKFGxvY2FsT2JqZWN0UmVmZXJlbmNlGAEgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEgsKA2tleRgCIAEoCRIQCghvcHRpb25hbBgDIAEoCCJ/Cg1Db25maWdNYXBMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEiwKBWl0ZW1zGAIgAygLMh0uazhzLmlvLmFwaS5jb3JlLnYxLkNvbmZpZ01hcCJ8ChlDb25maWdNYXBOb2RlQ29uZmlnU291cmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEgsKA3VpZBgDIAEoCRIXCg9yZXNvdXJjZVZlcnNpb24YBCABKAkSGAoQa3ViZWxldENvbmZpZ0tleRgFIAEoCSKdAQoTQ29uZmlnTWFwUHJvamVjdGlvbhJGChRsb2NhbE9iamVjdFJlZmVyZW5jZRgBIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZRIsCgVpdGVtcxgCIAMoCzIdLms4cy5pby5hcGkuY29yZS52MS5LZXlUb1BhdGgSEAoIb3B0aW9uYWwYBCABKAgitAEKFUNvbmZpZ01hcFZvbHVtZVNvdXJjZRJGChRsb2NhbE9iamVjdFJlZmVyZW5jZRgBIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZRIsCgVpdGVtcxgCIAMoCzIdLms4cy5pby5hcGkuY29yZS52MS5LZXlUb1BhdGgSEwoLZGVmYXVsdE1vZGUYAyABKAUSEAoIb3B0aW9uYWwYBCABKAgi/wYKCUNvbnRhaW5lchIMCgRuYW1lGAEgASgJEg0KBWltYWdlGAIgASgJEg8KB2NvbW1hbmQYAyADKAkSDAoEYXJncxgEIAMoCRISCgp3b3JraW5nRGlyGAUgASgJEjAKBXBvcnRzGAYgAygLMiEuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclBvcnQSMgoHZW52RnJvbRgTIAMoCzIhLms4cy5pby5hcGkuY29yZS52MS5FbnZGcm9tU291cmNlEicKA2VudhgHIAMoCzIaLms4cy5pby5hcGkuY29yZS52MS5FbnZWYXISOwoJcmVzb3VyY2VzGAggASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUmVxdWlyZW1lbnRzEj8KDHJlc2l6ZVBvbGljeRgXIAMoCzIpLms4cy5pby5hcGkuY29yZS52MS5Db250YWluZXJSZXNpemVQb2xpY3kSFQoNcmVzdGFydFBvbGljeRgYIAEoCRI1Cgx2b2x1bWVNb3VudHMYCSADKAsyHy5rOHMuaW8uYXBpLmNvcmUudjEuVm9sdW1lTW91bnQSNwoNdm9sdW1lRGV2aWNlcxgVIAMoCzIgLms4cy5pby5hcGkuY29yZS52MS5Wb2x1bWVEZXZpY2USMAoNbGl2ZW5lc3NQcm9iZRgKIAEoCzIZLms4cy5pby5hcGkuY29yZS52MS5Qcm9iZRIxCg5yZWFkaW5lc3NQcm9iZRgLIAEoCzIZLms4cy5pby5hcGkuY29yZS52MS5Qcm9iZRIvCgxzdGFydHVwUHJvYmUYFiABKAsyGS5rOHMuaW8uYXBpLmNvcmUudjEuUHJvYmUSMAoJbGlmZWN5Y2xlGAwgASgLMh0uazhzLmlvLmFwaS5jb3JlLnYxLkxpZmVjeWNsZRIeChZ0ZXJtaW5hdGlvbk1lc3NhZ2VQYXRoGA0gASgJEiAKGHRlcm1pbmF0aW9uTWVzc2FnZVBvbGljeRgUIAEoCRIXCg9pbWFnZVB1bGxQb2xpY3kYDiABKAkSPAoPc2VjdXJpdHlDb250ZXh0GA8gASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3VyaXR5Q29udGV4dBINCgVzdGRpbhgQIAEoCBIRCglzdGRpbk9uY2UYESABKAgSCwoDdHR5GBIgASgIIjIKDkNvbnRhaW5lckltYWdlEg0KBW5hbWVzGAEgAygJEhEKCXNpemVCeXRlcxgCIAEoAyJoCg1Db250YWluZXJQb3J0EgwKBG5hbWUYASABKAkSEAoIaG9zdFBvcnQYAiABKAUSFQoNY29udGFpbmVyUG9ydBgDIAEoBRIQCghwcm90b2NvbBgEIAEoCRIOCgZob3N0SVAYBSABKAkiRAoVQ29udGFpbmVyUmVzaXplUG9saWN5EhQKDHJlc291cmNlTmFtZRgBIAEoCRIVCg1yZXN0YXJ0UG9saWN5GAIgASgJIsoBCg5Db250YWluZXJTdGF0ZRI6Cgd3YWl0aW5nGAEgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXRlV2FpdGluZxI6CgdydW5uaW5nGAIgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXRlUnVubmluZxJACgp0ZXJtaW5hdGVkGAMgASgLMiwuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXRlVGVybWluYXRlZCJWChVDb250YWluZXJTdGF0ZVJ1bm5pbmcSPQoJc3RhcnRlZEF0GAEgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUi8QEKGENvbnRhaW5lclN0YXRlVGVybWluYXRlZBIQCghleGl0Q29kZRgBIAEoBRIOCgZzaWduYWwYAiABKAUSDgoGcmVhc29uGAMgASgJEg8KB21lc3NhZ2UYBCABKAkSPQoJc3RhcnRlZEF0GAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSPgoKZmluaXNoZWRBdBgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhMKC2NvbnRhaW5lcklEGAcgASgJIjgKFUNvbnRhaW5lclN0YXRlV2FpdGluZxIOCgZyZWFzb24YASABKAkSDwoHbWVzc2FnZRgCIAEoCSKpBQoPQ29udGFpbmVyU3RhdHVzEgwKBG5hbWUYASABKAkSMQoFc3RhdGUYAiABKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuQ29udGFpbmVyU3RhdGUSNQoJbGFzdFN0YXRlGAMgASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXRlEg0KBXJlYWR5GAQgASgIEhQKDHJlc3RhcnRDb3VudBgFIAEoBRINCgVpbWFnZRgGIAEoCRIPCgdpbWFnZUlEGAcgASgJEhMKC2NvbnRhaW5lcklEGAggASgJEg8KB3N0YXJ0ZWQYCSABKAgSVwoSYWxsb2NhdGVkUmVzb3VyY2VzGAogAygLMjsuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXR1cy5BbGxvY2F0ZWRSZXNvdXJjZXNFbnRyeRI7CglyZXNvdXJjZXMYCyABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VSZXF1aXJlbWVudHMSOwoMdm9sdW1lTW91bnRzGAwgAygLMiUuazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZU1vdW50U3RhdHVzEi8KBHVzZXIYDSABKAsyIS5rOHMuaW8uYXBpLmNvcmUudjEuQ29udGFpbmVyVXNlchJEChhhbGxvY2F0ZWRSZXNvdXJjZXNTdGF0dXMYDiADKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VTdGF0dXMaaQoXQWxsb2NhdGVkUmVzb3VyY2VzRW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ASJGCg1Db250YWluZXJVc2VyEjUKBWxpbnV4GAEgASgLMiYuazhzLmlvLmFwaS5jb3JlLnYxLkxpbnV4Q29udGFpbmVyVXNlciIeCg5EYWVtb25FbmRwb2ludBIMCgRQb3J0GAEgASgFIlEKFURvd253YXJkQVBJUHJvamVjdGlvbhI4CgVpdGVtcxgBIAMoCzIpLms4cy5pby5hcGkuY29yZS52MS5Eb3dud2FyZEFQSVZvbHVtZUZpbGUiswEKFURvd253YXJkQVBJVm9sdW1lRmlsZRIMCgRwYXRoGAEgASgJEjkKCGZpZWxkUmVmGAIgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLk9iamVjdEZpZWxkU2VsZWN0b3ISQwoQcmVzb3VyY2VGaWVsZFJlZhgDIAEoCzIpLms4cy5pby5hcGkuY29yZS52MS5SZXNvdXJjZUZpZWxkU2VsZWN0b3ISDAoEbW9kZRgEIAEoBSJoChdEb3dud2FyZEFQSVZvbHVtZVNvdXJjZRI4CgVpdGVtcxgBIAMoCzIpLms4cy5pby5hcGkuY29yZS52MS5Eb3dud2FyZEFQSVZvbHVtZUZpbGUSEwoLZGVmYXVsdE1vZGUYAiABKAUiaQoURW1wdHlEaXJWb2x1bWVTb3VyY2USDgoGbWVkaXVtGAEgASgJEkEKCXNpemVMaW1pdBgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eSJ5Cg9FbmRwb2ludEFkZHJlc3MSCgoCaXAYASABKAkSEAoIaG9zdG5hbWUYAyABKAkSEAoIbm9kZU5hbWUYBCABKAkSNgoJdGFyZ2V0UmVmGAIgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLk9iamVjdFJlZmVyZW5jZSJRCgxFbmRwb2ludFBvcnQSDAoEbmFtZRgBIAEoCRIMCgRwb3J0GAIgASgFEhAKCHByb3RvY29sGAMgASgJEhMKC2FwcFByb3RvY29sGAQgASgJIrkBCg5FbmRwb2ludFN1YnNldBI2CglhZGRyZXNzZXMYASADKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuRW5kcG9pbnRBZGRyZXNzEj4KEW5vdFJlYWR5QWRkcmVzc2VzGAIgAygLMiMuazhzLmlvLmFwaS5jb3JlLnYxLkVuZHBvaW50QWRkcmVzcxIvCgVwb3J0cxgDIAMoCzIgLms4cy5pby5hcGkuY29yZS52MS5FbmRwb2ludFBvcnQihAEKCUVuZHBvaW50cxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjMKB3N1YnNldHMYAiADKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuRW5kcG9pbnRTdWJzZXQifwoNRW5kcG9pbnRzTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRIsCgVpdGVtcxgCIAMoCzIdLms4cy5pby5hcGkuY29yZS52MS5FbmRwb2ludHMilQEKDUVudkZyb21Tb3VyY2USDgoGcHJlZml4GAEgASgJEjwKDGNvbmZpZ01hcFJlZhgCIAEoCzImLms4cy5pby5hcGkuY29yZS52MS5Db25maWdNYXBFbnZTb3VyY2USNgoJc2VjcmV0UmVmGAMgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldEVudlNvdXJjZSJaCgZFbnZWYXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIzCgl2YWx1ZUZyb20YAyABKAsyIC5rOHMuaW8uYXBpLmNvcmUudjEuRW52VmFyU291cmNlIo4CCgxFbnZWYXJTb3VyY2USOQoIZmllbGRSZWYYASABKAsyJy5rOHMuaW8uYXBpLmNvcmUudjEuT2JqZWN0RmllbGRTZWxlY3RvchJDChByZXNvdXJjZUZpZWxkUmVmGAIgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlRmllbGRTZWxlY3RvchJBCg9jb25maWdNYXBLZXlSZWYYAyABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuQ29uZmlnTWFwS2V5U2VsZWN0b3ISOwoMc2VjcmV0S2V5UmVmGAQgASgLMiUuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldEtleVNlbGVjdG9yIoEBChJFcGhlbWVyYWxDb250YWluZXISTgoYZXBoZW1lcmFsQ29udGFpbmVyQ29tbW9uGAEgASgLMiwuazhzLmlvLmFwaS5jb3JlLnYxLkVwaGVtZXJhbENvbnRhaW5lckNvbW1vbhIbChN0YXJnZXRDb250YWluZXJOYW1lGAIgASgJIo4HChhFcGhlbWVyYWxDb250YWluZXJDb21tb24SDAoEbmFtZRgBIAEoCRINCgVpbWFnZRgCIAEoCRIPCgdjb21tYW5kGAMgAygJEgwKBGFyZ3MYBCADKAkSEgoKd29ya2luZ0RpchgFIAEoCRIwCgVwb3J0cxgGIAMoCzIhLms4cy5pby5hcGkuY29yZS52MS5Db250YWluZXJQb3J0EjIKB2VudkZyb20YEyADKAsyIS5rOHMuaW8uYXBpLmNvcmUudjEuRW52RnJvbVNvdXJjZRInCgNlbnYYByADKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuRW52VmFyEjsKCXJlc291cmNlcxgIIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5SZXNvdXJjZVJlcXVpcmVtZW50cxI/CgxyZXNpemVQb2xpY3kYFyADKAsyKS5rOHMuaW8uYXBpLmNvcmUudjEuQ29udGFpbmVyUmVzaXplUG9saWN5EhUKDXJlc3RhcnRQb2xpY3kYGCABKAkSNQoMdm9sdW1lTW91bnRzGAkgAygLMh8uazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZU1vdW50EjcKDXZvbHVtZURldmljZXMYFSADKAsyIC5rOHMuaW8uYXBpLmNvcmUudjEuVm9sdW1lRGV2aWNlEjAKDWxpdmVuZXNzUHJvYmUYCiABKAsyGS5rOHMuaW8uYXBpLmNvcmUudjEuUHJvYmUSMQoOcmVhZGluZXNzUHJvYmUYCyABKAsyGS5rOHMuaW8uYXBpLmNvcmUudjEuUHJvYmUSLwoMc3RhcnR1cFByb2JlGBYgASgLMhkuazhzLmlvLmFwaS5jb3JlLnYxLlByb2JlEjAKCWxpZmVjeWNsZRgMIAEoCzIdLms4cy5pby5hcGkuY29yZS52MS5MaWZlY3ljbGUSHgoWdGVybWluYXRpb25NZXNzYWdlUGF0aBgNIAEoCRIgChh0ZXJtaW5hdGlvbk1lc3NhZ2VQb2xpY3kYFCABKAkSFwoPaW1hZ2VQdWxsUG9saWN5GA4gASgJEjwKD3NlY3VyaXR5Q29udGV4dBgPIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5TZWN1cml0eUNvbnRleHQSDQoFc3RkaW4YECABKAgSEQoJc3RkaW5PbmNlGBEgASgIEgsKA3R0eRgSIAEoCCJnChVFcGhlbWVyYWxWb2x1bWVTb3VyY2USTgoTdm9sdW1lQ2xhaW1UZW1wbGF0ZRgBIAEoCzIxLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1UZW1wbGF0ZSLwBAoFRXZlbnQSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRI7Cg5pbnZvbHZlZE9iamVjdBgCIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5PYmplY3RSZWZlcmVuY2USDgoGcmVhc29uGAMgASgJEg8KB21lc3NhZ2UYBCABKAkSLwoGc291cmNlGAUgASgLMh8uazhzLmlvLmFwaS5jb3JlLnYxLkV2ZW50U291cmNlEkIKDmZpcnN0VGltZXN0YW1wGAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSQQoNbGFzdFRpbWVzdGFtcBgHIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg0KBWNvdW50GAggASgFEgwKBHR5cGUYCSABKAkSQgoJZXZlbnRUaW1lGAogASgLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk1pY3JvVGltZRIvCgZzZXJpZXMYCyABKAsyHy5rOHMuaW8uYXBpLmNvcmUudjEuRXZlbnRTZXJpZXMSDgoGYWN0aW9uGAwgASgJEjQKB3JlbGF0ZWQYDSABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuT2JqZWN0UmVmZXJlbmNlEhoKEnJlcG9ydGluZ0NvbXBvbmVudBgOIAEoCRIZChFyZXBvcnRpbmdJbnN0YW5jZRgPIAEoCSJ3CglFdmVudExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESKAoFaXRlbXMYAiADKAsyGS5rOHMuaW8uYXBpLmNvcmUudjEuRXZlbnQiZwoLRXZlbnRTZXJpZXMSDQoFY291bnQYASABKAUSSQoQbGFzdE9ic2VydmVkVGltZRgCIAEoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5NaWNyb1RpbWUiLgoLRXZlbnRTb3VyY2USEQoJY29tcG9uZW50GAEgASgJEgwKBGhvc3QYAiABKAkiHQoKRXhlY0FjdGlvbhIPCgdjb21tYW5kGAEgAygJImIKDkZDVm9sdW1lU291cmNlEhIKCnRhcmdldFdXTnMYASADKAkSCwoDbHVuGAIgASgFEg4KBmZzVHlwZRgDIAEoCRIQCghyZWFkT25seRgEIAEoCBINCgV3d2lkcxgFIAMoCSKEAgoaRmxleFBlcnNpc3RlbnRWb2x1bWVTb3VyY2USDgoGZHJpdmVyGAEgASgJEg4KBmZzVHlwZRgCIAEoCRI2CglzZWNyZXRSZWYYAyABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlEhAKCHJlYWRPbmx5GAQgASgIEkwKB29wdGlvbnMYBSADKAsyOy5rOHMuaW8uYXBpLmNvcmUudjEuRmxleFBlcnNpc3RlbnRWb2x1bWVTb3VyY2UuT3B0aW9uc0VudHJ5Gi4KDE9wdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIvUBChBGbGV4Vm9sdW1lU291cmNlEg4KBmRyaXZlchgBIAEoCRIOCgZmc1R5cGUYAiABKAkSOwoJc2VjcmV0UmVmGAMgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEhAKCHJlYWRPbmx5GAQgASgIEkIKB29wdGlvbnMYBSADKAsyMS5rOHMuaW8uYXBpLmNvcmUudjEuRmxleFZvbHVtZVNvdXJjZS5PcHRpb25zRW50cnkaLgoMT3B0aW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiPwoTRmxvY2tlclZvbHVtZVNvdXJjZRITCgtkYXRhc2V0TmFtZRgBIAEoCRITCgtkYXRhc2V0VVVJRBgCIAEoCSJkCh1HQ0VQZXJzaXN0ZW50RGlza1ZvbHVtZVNvdXJjZRIOCgZwZE5hbWUYASABKAkSDgoGZnNUeXBlGAIgASgJEhEKCXBhcnRpdGlvbhgDIAEoBRIQCghyZWFkT25seRgEIAEoCCIrCgpHUlBDQWN0aW9uEgwKBHBvcnQYASABKAUSDwoHc2VydmljZRgCIAEoCSJOChNHaXRSZXBvVm9sdW1lU291cmNlEhIKCnJlcG9zaXRvcnkYASABKAkSEAoIcmV2aXNpb24YAiABKAkSEQoJZGlyZWN0b3J5GAMgASgJInAKH0dsdXN0ZXJmc1BlcnNpc3RlbnRWb2x1bWVTb3VyY2USEQoJZW5kcG9pbnRzGAEgASgJEgwKBHBhdGgYAiABKAkSEAoIcmVhZE9ubHkYAyABKAgSGgoSZW5kcG9pbnRzTmFtZXNwYWNlGAQgASgJIkoKFUdsdXN0ZXJmc1ZvbHVtZVNvdXJjZRIRCgllbmRwb2ludHMYASABKAkSDAoEcGF0aBgCIAEoCRIQCghyZWFkT25seRgDIAEoCCKwAQoNSFRUUEdldEFjdGlvbhIMCgRwYXRoGAEgASgJEj4KBHBvcnQYAiABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy51dGlsLmludHN0ci5JbnRPclN0cmluZxIMCgRob3N0GAMgASgJEg4KBnNjaGVtZRgEIAEoCRIzCgtodHRwSGVhZGVycxgFIAMoCzIeLms4cy5pby5hcGkuY29yZS52MS5IVFRQSGVhZGVyIikKCkhUVFBIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSIqCglIb3N0QWxpYXMSCgoCaXAYASABKAkSEQoJaG9zdG5hbWVzGAIgAygJIhQKBkhvc3RJUBIKCgJpcBgBIAEoCSIyChRIb3N0UGF0aFZvbHVtZVNvdXJjZRIMCgRwYXRoGAEgASgJEgwKBHR5cGUYAiABKAkimwIKG0lTQ1NJUGVyc2lzdGVudFZvbHVtZVNvdXJjZRIUCgx0YXJnZXRQb3J0YWwYASABKAkSCwoDaXFuGAIgASgJEgsKA2x1bhgDIAEoBRIWCg5pc2NzaUludGVyZmFjZRgEIAEoCRIOCgZmc1R5cGUYBSABKAkSEAoIcmVhZE9ubHkYBiABKAgSDwoHcG9ydGFscxgHIAMoCRIZChFjaGFwQXV0aERpc2NvdmVyeRgIIAEoCBIXCg9jaGFwQXV0aFNlc3Npb24YCyABKAgSNgoJc2VjcmV0UmVmGAogASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRIVCg1pbml0aWF0b3JOYW1lGAwgASgJIpYCChFJU0NTSVZvbHVtZVNvdXJjZRIUCgx0YXJnZXRQb3J0YWwYASABKAkSCwoDaXFuGAIgASgJEgsKA2x1bhgDIAEoBRIWCg5pc2NzaUludGVyZmFjZRgEIAEoCRIOCgZmc1R5cGUYBSABKAkSEAoIcmVhZE9ubHkYBiABKAgSDwoHcG9ydGFscxgHIAMoCRIZChFjaGFwQXV0aERpc2NvdmVyeRgIIAEoCBIXCg9jaGFwQXV0aFNlc3Npb24YCyABKAgSOwoJc2VjcmV0UmVmGAogASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEhUKDWluaXRpYXRvck5hbWUYDCABKAkiOgoRSW1hZ2VWb2x1bWVTb3VyY2USEQoJcmVmZXJlbmNlGAEgASgJEhIKCnB1bGxQb2xpY3kYAiABKAkiNAoJS2V5VG9QYXRoEgsKA2tleRgBIAEoCRIMCgRwYXRoGAIgASgJEgwKBG1vZGUYAyABKAUiewoJTGlmZWN5Y2xlEjcKCXBvc3RTdGFydBgBIAEoCzIkLms4cy5pby5hcGkuY29yZS52MS5MaWZlY3ljbGVIYW5kbGVyEjUKB3ByZVN0b3AYAiABKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuTGlmZWN5Y2xlSGFuZGxlciLcAQoQTGlmZWN5Y2xlSGFuZGxlchIsCgRleGVjGAEgASgLMh4uazhzLmlvLmFwaS5jb3JlLnYxLkV4ZWNBY3Rpb24SMgoHaHR0cEdldBgCIAEoCzIhLms4cy5pby5hcGkuY29yZS52MS5IVFRQR2V0QWN0aW9uEjYKCXRjcFNvY2tldBgDIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5UQ1BTb2NrZXRBY3Rpb24SLgoFc2xlZXAYBCABKAsyHy5rOHMuaW8uYXBpLmNvcmUudjEuU2xlZXBBY3Rpb24iggEKCkxpbWl0UmFuZ2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRIwCgRzcGVjGAIgASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkxpbWl0UmFuZ2VTcGVjIuwGCg5MaW1pdFJhbmdlSXRlbRIMCgR0eXBlGAEgASgJEjgKA21heBgCIAMoCzIrLms4cy5pby5hcGkuY29yZS52MS5MaW1pdFJhbmdlSXRlbS5NYXhFbnRyeRI4CgNtaW4YAyADKAsyKy5rOHMuaW8uYXBpLmNvcmUudjEuTGltaXRSYW5nZUl0ZW0uTWluRW50cnkSQAoHZGVmYXVsdBgEIAMoCzIvLms4cy5pby5hcGkuY29yZS52MS5MaW1pdFJhbmdlSXRlbS5EZWZhdWx0RW50cnkSTgoOZGVmYXVsdFJlcXVlc3QYBSADKAsyNi5rOHMuaW8uYXBpLmNvcmUudjEuTGltaXRSYW5nZUl0ZW0uRGVmYXVsdFJlcXVlc3RFbnRyeRJaChRtYXhMaW1pdFJlcXVlc3RSYXRpbxgGIAMoCzI8Lms4cy5pby5hcGkuY29yZS52MS5MaW1pdFJhbmdlSXRlbS5NYXhMaW1pdFJlcXVlc3RSYXRpb0VudHJ5GloKCE1heEVudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEaWgoITWluRW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ARpeCgxEZWZhdWx0RW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ARplChNEZWZhdWx0UmVxdWVzdEVudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEaawoZTWF4TGltaXRSZXF1ZXN0UmF0aW9FbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBIoEBCg5MaW1pdFJhbmdlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRItCgVpdGVtcxgCIAMoCzIeLms4cy5pby5hcGkuY29yZS52MS5MaW1pdFJhbmdlIkQKDkxpbWl0UmFuZ2VTcGVjEjIKBmxpbWl0cxgBIAMoCzIiLms4cy5pby5hcGkuY29yZS52MS5MaW1pdFJhbmdlSXRlbSJKChJMaW51eENvbnRhaW5lclVzZXISCwoDdWlkGAEgASgDEgsKA2dpZBgCIAEoAxIaChJzdXBwbGVtZW50YWxHcm91cHMYAyADKAMihgEKBExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5ydW50aW1lLlJhd0V4dGVuc2lvbiJyChNMb2FkQmFsYW5jZXJJbmdyZXNzEgoKAmlwGAEgASgJEhAKCGhvc3RuYW1lGAIgASgJEg4KBmlwTW9kZRgDIAEoCRItCgVwb3J0cxgEIAMoCzIeLms4cy5pby5hcGkuY29yZS52MS5Qb3J0U3RhdHVzIk4KEkxvYWRCYWxhbmNlclN0YXR1cxI4CgdpbmdyZXNzGAEgAygLMicuazhzLmlvLmFwaS5jb3JlLnYxLkxvYWRCYWxhbmNlckluZ3Jlc3MiJAoUTG9jYWxPYmplY3RSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSIxChFMb2NhbFZvbHVtZVNvdXJjZRIMCgRwYXRoGAEgASgJEg4KBmZzVHlwZRgCIAEoCSJNChJNb2RpZnlWb2x1bWVTdGF0dXMSJwofdGFyZ2V0Vm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZRgBIAEoCRIOCgZzdGF0dXMYAiABKAkiQQoPTkZTVm9sdW1lU291cmNlEg4KBnNlcnZlchgBIAEoCRIMCgRwYXRoGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIIrUBCglOYW1lc3BhY2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRIvCgRzcGVjGAIgASgLMiEuazhzLmlvLmFwaS5jb3JlLnYxLk5hbWVzcGFjZVNwZWMSMwoGc3RhdHVzGAMgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLk5hbWVzcGFjZVN0YXR1cyKbAQoSTmFtZXNwYWNlQ29uZGl0aW9uEgwKBHR5cGUYASABKAkSDgoGc3RhdHVzGAIgASgJEkYKEmxhc3RUcmFuc2l0aW9uVGltZRgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg4KBnJlYXNvbhgFIAEoCRIPCgdtZXNzYWdlGAYgASgJIn8KDU5hbWVzcGFjZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESLAoFaXRlbXMYAiADKAsyHS5rOHMuaW8uYXBpLmNvcmUudjEuTmFtZXNwYWNlIiMKDU5hbWVzcGFjZVNwZWMSEgoKZmluYWxpemVycxgBIAMoCSJcCg9OYW1lc3BhY2VTdGF0dXMSDQoFcGhhc2UYASABKAkSOgoKY29uZGl0aW9ucxgCIAMoCzImLms4cy5pby5hcGkuY29yZS52MS5OYW1lc3BhY2VDb25kaXRpb24ipgEKBE5vZGUSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRIqCgRzcGVjGAIgASgLMhwuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVTcGVjEi4KBnN0YXR1cxgDIAEoCzIeLms4cy5pby5hcGkuY29yZS52MS5Ob2RlU3RhdHVzIiwKC05vZGVBZGRyZXNzEgwKBHR5cGUYASABKAkSDwoHYWRkcmVzcxgCIAEoCSLOAQoMTm9kZUFmZmluaXR5ElgKLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24YASABKAsyIC5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZVNlbGVjdG9yEmQKL3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uGAIgAygLMisuazhzLmlvLmFwaS5jb3JlLnYxLlByZWZlcnJlZFNjaGVkdWxpbmdUZXJtIt0BCg1Ob2RlQ29uZGl0aW9uEgwKBHR5cGUYASABKAkSDgoGc3RhdHVzGAIgASgJEkUKEWxhc3RIZWFydGJlYXRUaW1lGAMgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSRgoSbGFzdFRyYW5zaXRpb25UaW1lGAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDgoGcmVhc29uGAUgASgJEg8KB21lc3NhZ2UYBiABKAkiVAoQTm9kZUNvbmZpZ1NvdXJjZRJACgljb25maWdNYXAYAiABKAsyLS5rOHMuaW8uYXBpLmNvcmUudjEuQ29uZmlnTWFwTm9kZUNvbmZpZ1NvdXJjZSLMAQoQTm9kZUNvbmZpZ1N0YXR1cxI2Cghhc3NpZ25lZBgBIAEoCzIkLms4cy5pby5hcGkuY29yZS52MS5Ob2RlQ29uZmlnU291cmNlEjQKBmFjdGl2ZRgCIAEoCzIkLms4cy5pby5hcGkuY29yZS52MS5Ob2RlQ29uZmlnU291cmNlEjsKDWxhc3RLbm93bkdvb2QYAyABKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZUNvbmZpZ1NvdXJjZRINCgVlcnJvchgEIAEoCSJSChNOb2RlRGFlbW9uRW5kcG9pbnRzEjsKD2t1YmVsZXRFbmRwb2ludBgBIAEoCzIiLms4cy5pby5hcGkuY29yZS52MS5EYWVtb25FbmRwb2ludCIwCgxOb2RlRmVhdHVyZXMSIAoYc3VwcGxlbWVudGFsR3JvdXBzUG9saWN5GAEgASgIInUKCE5vZGVMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEicKBWl0ZW1zGAIgAygLMhguazhzLmlvLmFwaS5jb3JlLnYxLk5vZGUiIAoQTm9kZVByb3h5T3B0aW9ucxIMCgRwYXRoGAEgASgJImQKEk5vZGVSdW50aW1lSGFuZGxlchIMCgRuYW1lGAEgASgJEkAKCGZlYXR1cmVzGAIgASgLMi4uazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVSdW50aW1lSGFuZGxlckZlYXR1cmVzIlUKGk5vZGVSdW50aW1lSGFuZGxlckZlYXR1cmVzEh8KF3JlY3Vyc2l2ZVJlYWRPbmx5TW91bnRzGAEgASgIEhYKDnVzZXJOYW1lc3BhY2VzGAIgASgIIk8KDE5vZGVTZWxlY3RvchI/ChFub2RlU2VsZWN0b3JUZXJtcxgBIAMoCzIkLms4cy5pby5hcGkuY29yZS52MS5Ob2RlU2VsZWN0b3JUZXJtIkgKF05vZGVTZWxlY3RvclJlcXVpcmVtZW50EgsKA2tleRgBIAEoCRIQCghvcGVyYXRvchgCIAEoCRIOCgZ2YWx1ZXMYAyADKAkimwEKEE5vZGVTZWxlY3RvclRlcm0SRQoQbWF0Y2hFeHByZXNzaW9ucxgBIAMoCzIrLms4cy5pby5hcGkuY29yZS52MS5Ob2RlU2VsZWN0b3JSZXF1aXJlbWVudBJACgttYXRjaEZpZWxkcxgCIAMoCzIrLms4cy5pby5hcGkuY29yZS52MS5Ob2RlU2VsZWN0b3JSZXF1aXJlbWVudCLTAQoITm9kZVNwZWMSDwoHcG9kQ0lEUhgBIAEoCRIQCghwb2RDSURScxgHIAMoCRISCgpwcm92aWRlcklEGAMgASgJEhUKDXVuc2NoZWR1bGFibGUYBCABKAgSKQoGdGFpbnRzGAUgAygLMhkuazhzLmlvLmFwaS5jb3JlLnYxLlRhaW50EjoKDGNvbmZpZ1NvdXJjZRgGIAEoCzIkLms4cy5pby5hcGkuY29yZS52MS5Ob2RlQ29uZmlnU291cmNlEhIKCmV4dGVybmFsSUQYAiABKAki+wYKCk5vZGVTdGF0dXMSPgoIY2FwYWNpdHkYASADKAsyLC5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZVN0YXR1cy5DYXBhY2l0eUVudHJ5EkQKC2FsbG9jYXRhYmxlGAIgAygLMi8uazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVTdGF0dXMuQWxsb2NhdGFibGVFbnRyeRINCgVwaGFzZRgDIAEoCRI1Cgpjb25kaXRpb25zGAQgAygLMiEuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVDb25kaXRpb24SMgoJYWRkcmVzc2VzGAUgAygLMh8uazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVBZGRyZXNzEkAKD2RhZW1vbkVuZHBvaW50cxgGIAEoCzInLms4cy5pby5hcGkuY29yZS52MS5Ob2RlRGFlbW9uRW5kcG9pbnRzEjQKCG5vZGVJbmZvGAcgASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVTeXN0ZW1JbmZvEjIKBmltYWdlcxgIIAMoCzIiLms4cy5pby5hcGkuY29yZS52MS5Db250YWluZXJJbWFnZRIUCgx2b2x1bWVzSW5Vc2UYCSADKAkSOwoPdm9sdW1lc0F0dGFjaGVkGAogAygLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkF0dGFjaGVkVm9sdW1lEjQKBmNvbmZpZxgLIAEoCzIkLms4cy5pby5hcGkuY29yZS52MS5Ob2RlQ29uZmlnU3RhdHVzEj8KD3J1bnRpbWVIYW5kbGVycxgMIAMoCzImLms4cy5pby5hcGkuY29yZS52MS5Ob2RlUnVudGltZUhhbmRsZXISMgoIZmVhdHVyZXMYDSABKAsyIC5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZUZlYXR1cmVzGl8KDUNhcGFjaXR5RW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ARpiChBBbGxvY2F0YWJsZUVudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEi8QEKDk5vZGVTeXN0ZW1JbmZvEhEKCW1hY2hpbmVJRBgBIAEoCRISCgpzeXN0ZW1VVUlEGAIgASgJEg4KBmJvb3RJRBgDIAEoCRIVCg1rZXJuZWxWZXJzaW9uGAQgASgJEg8KB29zSW1hZ2UYBSABKAkSHwoXY29udGFpbmVyUnVudGltZVZlcnNpb24YBiABKAkSFgoOa3ViZWxldFZlcnNpb24YByABKAkSGAoQa3ViZVByb3h5VmVyc2lvbhgIIAEoCRIXCg9vcGVyYXRpbmdTeXN0ZW0YCSABKAkSFAoMYXJjaGl0ZWN0dXJlGAogASgJIjwKE09iamVjdEZpZWxkU2VsZWN0b3ISEgoKYXBpVmVyc2lvbhgBIAEoCRIRCglmaWVsZFBhdGgYAiABKAkijQEKD09iamVjdFJlZmVyZW5jZRIMCgRraW5kGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIMCgRuYW1lGAMgASgJEgsKA3VpZBgEIAEoCRISCgphcGlWZXJzaW9uGAUgASgJEhcKD3Jlc291cmNlVmVyc2lvbhgGIAEoCRIRCglmaWVsZFBhdGgYByABKAkiygEKEFBlcnNpc3RlbnRWb2x1bWUSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRI2CgRzcGVjGAIgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVTcGVjEjoKBnN0YXR1cxgDIAEoCzIqLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lU3RhdHVzItkBChVQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRI7CgRzcGVjGAIgASgLMi0uazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVDbGFpbVNwZWMSPwoGc3RhdHVzGAMgASgLMi8uazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVDbGFpbVN0YXR1cyLqAQoeUGVyc2lzdGVudFZvbHVtZUNsYWltQ29uZGl0aW9uEgwKBHR5cGUYASABKAkSDgoGc3RhdHVzGAIgASgJEkEKDWxhc3RQcm9iZVRpbWUYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJGChJsYXN0VHJhbnNpdGlvblRpbWUYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRIOCgZyZWFzb24YBSABKAkSDwoHbWVzc2FnZRgGIAEoCSKXAQoZUGVyc2lzdGVudFZvbHVtZUNsYWltTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI4CgVpdGVtcxgCIAMoCzIpLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW0iowMKGVBlcnNpc3RlbnRWb2x1bWVDbGFpbVNwZWMSEwoLYWNjZXNzTW9kZXMYASADKAkSRQoIc2VsZWN0b3IYBCABKAsyMy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGFiZWxTZWxlY3RvchJBCglyZXNvdXJjZXMYAiABKAsyLi5rOHMuaW8uYXBpLmNvcmUudjEuVm9sdW1lUmVzb3VyY2VSZXF1aXJlbWVudHMSEgoKdm9sdW1lTmFtZRgDIAEoCRIYChBzdG9yYWdlQ2xhc3NOYW1lGAUgASgJEhIKCnZvbHVtZU1vZGUYBiABKAkSQQoKZGF0YVNvdXJjZRgHIAEoCzItLms4cy5pby5hcGkuY29yZS52MS5UeXBlZExvY2FsT2JqZWN0UmVmZXJlbmNlEj8KDWRhdGFTb3VyY2VSZWYYCCABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuVHlwZWRPYmplY3RSZWZlcmVuY2USIQoZdm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZRgJIAEoCSKuBgobUGVyc2lzdGVudFZvbHVtZUNsYWltU3RhdHVzEg0KBXBoYXNlGAEgASgJEhMKC2FjY2Vzc01vZGVzGAIgAygJEk8KCGNhcGFjaXR5GAMgAygLMj0uazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVDbGFpbVN0YXR1cy5DYXBhY2l0eUVudHJ5EkYKCmNvbmRpdGlvbnMYBCADKAsyMi5rOHMuaW8uYXBpLmNvcmUudjEuUGVyc2lzdGVudFZvbHVtZUNsYWltQ29uZGl0aW9uEmMKEmFsbG9jYXRlZFJlc291cmNlcxgFIAMoCzJHLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1TdGF0dXMuQWxsb2NhdGVkUmVzb3VyY2VzRW50cnkScQoZYWxsb2NhdGVkUmVzb3VyY2VTdGF0dXNlcxgHIAMoCzJOLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1TdGF0dXMuQWxsb2NhdGVkUmVzb3VyY2VTdGF0dXNlc0VudHJ5EigKIGN1cnJlbnRWb2x1bWVBdHRyaWJ1dGVzQ2xhc3NOYW1lGAggASgJEkIKEm1vZGlmeVZvbHVtZVN0YXR1cxgJIAEoCzImLms4cy5pby5hcGkuY29yZS52MS5Nb2RpZnlWb2x1bWVTdGF0dXMaXwoNQ2FwYWNpdHlFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBGmkKF0FsbG9jYXRlZFJlc291cmNlc0VudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEaQAoeQWxsb2NhdGVkUmVzb3VyY2VTdGF0dXNlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEioAEKHVBlcnNpc3RlbnRWb2x1bWVDbGFpbVRlbXBsYXRlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESOwoEc3BlYxgCIAEoCzItLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1TcGVjIkgKIVBlcnNpc3RlbnRWb2x1bWVDbGFpbVZvbHVtZVNvdXJjZRIRCgljbGFpbU5hbWUYASABKAkSEAoIcmVhZE9ubHkYAiABKAgijQEKFFBlcnNpc3RlbnRWb2x1bWVMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjMKBWl0ZW1zGAIgAygLMiQuazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWUivQsKFlBlcnNpc3RlbnRWb2x1bWVTb3VyY2USTAoRZ2NlUGVyc2lzdGVudERpc2sYASABKAsyMS5rOHMuaW8uYXBpLmNvcmUudjEuR0NFUGVyc2lzdGVudERpc2tWb2x1bWVTb3VyY2USUgoUYXdzRWxhc3RpY0Jsb2NrU3RvcmUYAiABKAsyNC5rOHMuaW8uYXBpLmNvcmUudjEuQVdTRWxhc3RpY0Jsb2NrU3RvcmVWb2x1bWVTb3VyY2USOgoIaG9zdFBhdGgYAyABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuSG9zdFBhdGhWb2x1bWVTb3VyY2USRgoJZ2x1c3RlcmZzGAQgASgLMjMuazhzLmlvLmFwaS5jb3JlLnYxLkdsdXN0ZXJmc1BlcnNpc3RlbnRWb2x1bWVTb3VyY2USMAoDbmZzGAUgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLk5GU1ZvbHVtZVNvdXJjZRI6CgNyYmQYBiABKAsyLS5rOHMuaW8uYXBpLmNvcmUudjEuUkJEUGVyc2lzdGVudFZvbHVtZVNvdXJjZRI+CgVpc2NzaRgHIAEoCzIvLms4cy5pby5hcGkuY29yZS52MS5JU0NTSVBlcnNpc3RlbnRWb2x1bWVTb3VyY2USQAoGY2luZGVyGAggASgLMjAuazhzLmlvLmFwaS5jb3JlLnYxLkNpbmRlclBlcnNpc3RlbnRWb2x1bWVTb3VyY2USQAoGY2VwaGZzGAkgASgLMjAuazhzLmlvLmFwaS5jb3JlLnYxLkNlcGhGU1BlcnNpc3RlbnRWb2x1bWVTb3VyY2USLgoCZmMYCiABKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuRkNWb2x1bWVTb3VyY2USOAoHZmxvY2tlchgLIAEoCzInLms4cy5pby5hcGkuY29yZS52MS5GbG9ja2VyVm9sdW1lU291cmNlEkIKCmZsZXhWb2x1bWUYDCABKAsyLi5rOHMuaW8uYXBpLmNvcmUudjEuRmxleFBlcnNpc3RlbnRWb2x1bWVTb3VyY2USRgoJYXp1cmVGaWxlGA0gASgLMjMuazhzLmlvLmFwaS5jb3JlLnYxLkF6dXJlRmlsZVBlcnNpc3RlbnRWb2x1bWVTb3VyY2USSQoNdnNwaGVyZVZvbHVtZRgOIAEoCzIyLms4cy5pby5hcGkuY29yZS52MS5Wc3BoZXJlVmlydHVhbERpc2tWb2x1bWVTb3VyY2USOAoHcXVvYnl0ZRgPIAEoCzInLms4cy5pby5hcGkuY29yZS52MS5RdW9ieXRlVm9sdW1lU291cmNlEjwKCWF6dXJlRGlzaxgQIAEoCzIpLms4cy5pby5hcGkuY29yZS52MS5BenVyZURpc2tWb2x1bWVTb3VyY2USUgoUcGhvdG9uUGVyc2lzdGVudERpc2sYESABKAsyNC5rOHMuaW8uYXBpLmNvcmUudjEuUGhvdG9uUGVyc2lzdGVudERpc2tWb2x1bWVTb3VyY2USQAoOcG9ydHdvcnhWb2x1bWUYEiABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuUG9ydHdvcnhWb2x1bWVTb3VyY2USQgoHc2NhbGVJTxgTIAEoCzIxLms4cy5pby5hcGkuY29yZS52MS5TY2FsZUlPUGVyc2lzdGVudFZvbHVtZVNvdXJjZRI0CgVsb2NhbBgUIAEoCzIlLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbFZvbHVtZVNvdXJjZRJGCglzdG9yYWdlb3MYFSABKAsyMy5rOHMuaW8uYXBpLmNvcmUudjEuU3RvcmFnZU9TUGVyc2lzdGVudFZvbHVtZVNvdXJjZRI6CgNjc2kYFiABKAsyLS5rOHMuaW8uYXBpLmNvcmUudjEuQ1NJUGVyc2lzdGVudFZvbHVtZVNvdXJjZSKlBAoUUGVyc2lzdGVudFZvbHVtZVNwZWMSSAoIY2FwYWNpdHkYASADKAsyNi5rOHMuaW8uYXBpLmNvcmUudjEuUGVyc2lzdGVudFZvbHVtZVNwZWMuQ2FwYWNpdHlFbnRyeRJKChZwZXJzaXN0ZW50Vm9sdW1lU291cmNlGAIgASgLMiouazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVTb3VyY2USEwoLYWNjZXNzTW9kZXMYAyADKAkSNQoIY2xhaW1SZWYYBCABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuT2JqZWN0UmVmZXJlbmNlEiUKHXBlcnNpc3RlbnRWb2x1bWVSZWNsYWltUG9saWN5GAUgASgJEhgKEHN0b3JhZ2VDbGFzc05hbWUYBiABKAkSFAoMbW91bnRPcHRpb25zGAcgAygJEhIKCnZvbHVtZU1vZGUYCCABKAkSPAoMbm9kZUFmZmluaXR5GAkgASgLMiYuazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZU5vZGVBZmZpbml0eRIhChl2b2x1bWVBdHRyaWJ1dGVzQ2xhc3NOYW1lGAogASgJGl8KDUNhcGFjaXR5RW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ASKVAQoWUGVyc2lzdGVudFZvbHVtZVN0YXR1cxINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEg4KBnJlYXNvbhgDIAEoCRJLChdsYXN0UGhhc2VUcmFuc2l0aW9uVGltZRgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIkAKIFBob3RvblBlcnNpc3RlbnREaXNrVm9sdW1lU291cmNlEgwKBHBkSUQYASABKAkSDgoGZnNUeXBlGAIgASgJIqMBCgNQb2QSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRIpCgRzcGVjGAIgASgLMhsuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFNwZWMSLQoGc3RhdHVzGAMgASgLMh0uazhzLmlvLmFwaS5jb3JlLnYxLlBvZFN0YXR1cyLQAQoLUG9kQWZmaW5pdHkSWwoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbhgBIAMoCzIjLms4cy5pby5hcGkuY29yZS52MS5Qb2RBZmZpbml0eVRlcm0SZAovcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24YAiADKAsyKy5rOHMuaW8uYXBpLmNvcmUudjEuV2VpZ2h0ZWRQb2RBZmZpbml0eVRlcm0iiQIKD1BvZEFmZmluaXR5VGVybRJKCg1sYWJlbFNlbGVjdG9yGAEgASgLMjMuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxhYmVsU2VsZWN0b3ISEgoKbmFtZXNwYWNlcxgCIAMoCRITCgt0b3BvbG9neUtleRgDIAEoCRJOChFuYW1lc3BhY2VTZWxlY3RvchgEIAEoCzIzLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MYWJlbFNlbGVjdG9yEhYKDm1hdGNoTGFiZWxLZXlzGAUgAygJEhkKEW1pc21hdGNoTGFiZWxLZXlzGAYgAygJItQBCg9Qb2RBbnRpQWZmaW5pdHkSWwoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbhgBIAMoCzIjLms4cy5pby5hcGkuY29yZS52MS5Qb2RBZmZpbml0eVRlcm0SZAovcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24YAiADKAsyKy5rOHMuaW8uYXBpLmNvcmUudjEuV2VpZ2h0ZWRQb2RBZmZpbml0eVRlcm0iYQoQUG9kQXR0YWNoT3B0aW9ucxINCgVzdGRpbhgBIAEoCBIOCgZzdGRvdXQYAiABKAgSDgoGc3RkZXJyGAMgASgIEgsKA3R0eRgEIAEoCBIRCgljb250YWluZXIYBSABKAki2AEKDFBvZENvbmRpdGlvbhIMCgR0eXBlGAEgASgJEg4KBnN0YXR1cxgCIAEoCRJBCg1sYXN0UHJvYmVUaW1lGAMgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSRgoSbGFzdFRyYW5zaXRpb25UaW1lGAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDgoGcmVhc29uGAUgASgJEg8KB21lc3NhZ2UYBiABKAkibgoMUG9kRE5TQ29uZmlnEhMKC25hbWVzZXJ2ZXJzGAEgAygJEhAKCHNlYXJjaGVzGAIgAygJEjcKB29wdGlvbnMYAyADKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuUG9kRE5TQ29uZmlnT3B0aW9uIjEKElBvZEROU0NvbmZpZ09wdGlvbhIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJInAKDlBvZEV4ZWNPcHRpb25zEg0KBXN0ZGluGAEgASgIEg4KBnN0ZG91dBgCIAEoCBIOCgZzdGRlcnIYAyABKAgSCwoDdHR5GAQgASgIEhEKCWNvbnRhaW5lchgFIAEoCRIPCgdjb21tYW5kGAYgAygJIhMKBVBvZElQEgoKAmlwGAEgASgJInMKB1BvZExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESJgoFaXRlbXMYAiADKAsyFy5rOHMuaW8uYXBpLmNvcmUudjEuUG9kIooCCg1Qb2RMb2dPcHRpb25zEhEKCWNvbnRhaW5lchgBIAEoCRIOCgZmb2xsb3cYAiABKAgSEAoIcHJldmlvdXMYAyABKAgSFAoMc2luY2VTZWNvbmRzGAQgASgDEj0KCXNpbmNlVGltZRgFIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhIKCnRpbWVzdGFtcHMYBiABKAgSEQoJdGFpbExpbmVzGAcgASgDEhIKCmxpbWl0Qnl0ZXMYCCABKAMSJAocaW5zZWN1cmVTa2lwVExTVmVyaWZ5QmFja2VuZBgJIAEoCBIOCgZzdHJlYW0YCiABKAkiFQoFUG9kT1MSDAoEbmFtZRgBIAEoCSImChVQb2RQb3J0Rm9yd2FyZE9wdGlvbnMSDQoFcG9ydHMYASADKAUiHwoPUG9kUHJveHlPcHRpb25zEgwKBHBhdGgYASABKAkiKQoQUG9kUmVhZGluZXNzR2F0ZRIVCg1jb25kaXRpb25UeXBlGAEgASgJIl4KEFBvZFJlc291cmNlQ2xhaW0SDAoEbmFtZRgBIAEoCRIZChFyZXNvdXJjZUNsYWltTmFtZRgDIAEoCRIhChlyZXNvdXJjZUNsYWltVGVtcGxhdGVOYW1lGAQgASgJIkEKFlBvZFJlc291cmNlQ2xhaW1TdGF0dXMSDAoEbmFtZRgBIAEoCRIZChFyZXNvdXJjZUNsYWltTmFtZRgCIAEoCSIhChFQb2RTY2hlZHVsaW5nR2F0ZRIMCgRuYW1lGAEgASgJIogEChJQb2RTZWN1cml0eUNvbnRleHQSOgoOc2VMaW51eE9wdGlvbnMYASABKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuU0VMaW51eE9wdGlvbnMSSQoOd2luZG93c09wdGlvbnMYCCABKAsyMS5rOHMuaW8uYXBpLmNvcmUudjEuV2luZG93c1NlY3VyaXR5Q29udGV4dE9wdGlvbnMSEQoJcnVuQXNVc2VyGAIgASgDEhIKCnJ1bkFzR3JvdXAYBiABKAMSFAoMcnVuQXNOb25Sb290GAMgASgIEhoKEnN1cHBsZW1lbnRhbEdyb3VwcxgEIAMoAxIgChhzdXBwbGVtZW50YWxHcm91cHNQb2xpY3kYDCABKAkSDwoHZnNHcm91cBgFIAEoAxIrCgdzeXNjdGxzGAcgAygLMhouazhzLmlvLmFwaS5jb3JlLnYxLlN5c2N0bBIbChNmc0dyb3VwQ2hhbmdlUG9saWN5GAkgASgJEjoKDnNlY2NvbXBQcm9maWxlGAogASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLlNlY2NvbXBQcm9maWxlEjwKD2FwcEFybW9yUHJvZmlsZRgLIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5BcHBBcm1vclByb2ZpbGUSGwoTc2VMaW51eENoYW5nZVBvbGljeRgNIAEoCSJbCgxQb2RTaWduYXR1cmUSSwoNcG9kQ29udHJvbGxlchgBIAEoCzI0Lms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Pd25lclJlZmVyZW5jZSLaDQoHUG9kU3BlYxIrCgd2b2x1bWVzGAEgAygLMhouazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZRI1Cg5pbml0Q29udGFpbmVycxgUIAMoCzIdLms4cy5pby5hcGkuY29yZS52MS5Db250YWluZXISMQoKY29udGFpbmVycxgCIAMoCzIdLms4cy5pby5hcGkuY29yZS52MS5Db250YWluZXISQwoTZXBoZW1lcmFsQ29udGFpbmVycxgiIAMoCzImLms4cy5pby5hcGkuY29yZS52MS5FcGhlbWVyYWxDb250YWluZXISFQoNcmVzdGFydFBvbGljeRgDIAEoCRIlCh10ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcxgEIAEoAxIdChVhY3RpdmVEZWFkbGluZVNlY29uZHMYBSABKAMSEQoJZG5zUG9saWN5GAYgASgJEkMKDG5vZGVTZWxlY3RvchgHIAMoCzItLms4cy5pby5hcGkuY29yZS52MS5Qb2RTcGVjLk5vZGVTZWxlY3RvckVudHJ5EhoKEnNlcnZpY2VBY2NvdW50TmFtZRgIIAEoCRIWCg5zZXJ2aWNlQWNjb3VudBgJIAEoCRIkChxhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuGBUgASgIEhAKCG5vZGVOYW1lGAogASgJEhMKC2hvc3ROZXR3b3JrGAsgASgIEg8KB2hvc3RQSUQYDCABKAgSDwoHaG9zdElQQxgNIAEoCBIdChVzaGFyZVByb2Nlc3NOYW1lc3BhY2UYGyABKAgSPwoPc2VjdXJpdHlDb250ZXh0GA4gASgLMiYuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFNlY3VyaXR5Q29udGV4dBJCChBpbWFnZVB1bGxTZWNyZXRzGA8gAygLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEhAKCGhvc3RuYW1lGBAgASgJEhEKCXN1YmRvbWFpbhgRIAEoCRIuCghhZmZpbml0eRgSIAEoCzIcLms4cy5pby5hcGkuY29yZS52MS5BZmZpbml0eRIVCg1zY2hlZHVsZXJOYW1lGBMgASgJEjMKC3RvbGVyYXRpb25zGBYgAygLMh4uazhzLmlvLmFwaS5jb3JlLnYxLlRvbGVyYXRpb24SMgoLaG9zdEFsaWFzZXMYFyADKAsyHS5rOHMuaW8uYXBpLmNvcmUudjEuSG9zdEFsaWFzEhkKEXByaW9yaXR5Q2xhc3NOYW1lGBggASgJEhAKCHByaW9yaXR5GBkgASgFEjMKCWRuc0NvbmZpZxgaIAEoCzIgLms4cy5pby5hcGkuY29yZS52MS5Qb2RETlNDb25maWcSPAoOcmVhZGluZXNzR2F0ZXMYHCADKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuUG9kUmVhZGluZXNzR2F0ZRIYChBydW50aW1lQ2xhc3NOYW1lGB0gASgJEhoKEmVuYWJsZVNlcnZpY2VMaW5rcxgeIAEoCBIYChBwcmVlbXB0aW9uUG9saWN5GB8gASgJEjsKCG92ZXJoZWFkGCAgAygLMikuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFNwZWMuT3ZlcmhlYWRFbnRyeRJPChl0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzGCEgAygLMiwuazhzLmlvLmFwaS5jb3JlLnYxLlRvcG9sb2d5U3ByZWFkQ29uc3RyYWludBIZChFzZXRIb3N0bmFtZUFzRlFEThgjIAEoCBIlCgJvcxgkIAEoCzIZLms4cy5pby5hcGkuY29yZS52MS5Qb2RPUxIRCglob3N0VXNlcnMYJSABKAgSPgoPc2NoZWR1bGluZ0dhdGVzGCYgAygLMiUuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFNjaGVkdWxpbmdHYXRlEjwKDnJlc291cmNlQ2xhaW1zGCcgAygLMiQuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFJlc291cmNlQ2xhaW0SOwoJcmVzb3VyY2VzGCggASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUmVxdWlyZW1lbnRzGjMKEU5vZGVTZWxlY3RvckVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaXwoNT3ZlcmhlYWRFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBIvwECglQb2RTdGF0dXMSDQoFcGhhc2UYASABKAkSNAoKY29uZGl0aW9ucxgCIAMoCzIgLms4cy5pby5hcGkuY29yZS52MS5Qb2RDb25kaXRpb24SDwoHbWVzc2FnZRgDIAEoCRIOCgZyZWFzb24YBCABKAkSGQoRbm9taW5hdGVkTm9kZU5hbWUYCyABKAkSDgoGaG9zdElQGAUgASgJEisKB2hvc3RJUHMYECADKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuSG9zdElQEg0KBXBvZElQGAYgASgJEikKBnBvZElQcxgMIAMoCzIZLms4cy5pby5hcGkuY29yZS52MS5Qb2RJUBI9CglzdGFydFRpbWUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJCChVpbml0Q29udGFpbmVyU3RhdHVzZXMYCiADKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuQ29udGFpbmVyU3RhdHVzEj4KEWNvbnRhaW5lclN0YXR1c2VzGAggAygLMiMuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXR1cxIQCghxb3NDbGFzcxgJIAEoCRJHChplcGhlbWVyYWxDb250YWluZXJTdGF0dXNlcxgNIAMoCzIjLms4cy5pby5hcGkuY29yZS52MS5Db250YWluZXJTdGF0dXMSDgoGcmVzaXplGA4gASgJEkkKFXJlc291cmNlQ2xhaW1TdGF0dXNlcxgPIAMoCzIqLms4cy5pby5hcGkuY29yZS52MS5Qb2RSZXNvdXJjZUNsYWltU3RhdHVzIoQBCg9Qb2RTdGF0dXNSZXN1bHQSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRItCgZzdGF0dXMYAiABKAsyHS5rOHMuaW8uYXBpLmNvcmUudjEuUG9kU3RhdHVzIogBCgtQb2RUZW1wbGF0ZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjUKCHRlbXBsYXRlGAIgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFRlbXBsYXRlU3BlYyKDAQoPUG9kVGVtcGxhdGVMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEi4KBWl0ZW1zGAIgAygLMh8uazhzLmlvLmFwaS5jb3JlLnYxLlBvZFRlbXBsYXRlIoABCg9Qb2RUZW1wbGF0ZVNwZWMSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRIpCgRzcGVjGAIgASgLMhsuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFNwZWMiOwoKUG9ydFN0YXR1cxIMCgRwb3J0GAEgASgFEhAKCHByb3RvY29sGAIgASgJEg0KBWVycm9yGAMgASgJIkoKFFBvcnR3b3J4Vm9sdW1lU291cmNlEhAKCHZvbHVtZUlEGAEgASgJEg4KBmZzVHlwZRgCIAEoCRIQCghyZWFkT25seRgDIAEoCCIcCg1QcmVjb25kaXRpb25zEgsKA3VpZBgBIAEoCSKxAQoUUHJlZmVyQXZvaWRQb2RzRW50cnkSNgoMcG9kU2lnbmF0dXJlGAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFNpZ25hdHVyZRJACgxldmljdGlvblRpbWUYAiABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRIOCgZyZWFzb24YAyABKAkSDwoHbWVzc2FnZRgEIAEoCSJjChdQcmVmZXJyZWRTY2hlZHVsaW5nVGVybRIOCgZ3ZWlnaHQYASABKAUSOAoKcHJlZmVyZW5jZRgCIAEoCzIkLms4cy5pby5hcGkuY29yZS52MS5Ob2RlU2VsZWN0b3JUZXJtIuEBCgVQcm9iZRIxCgdoYW5kbGVyGAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLlByb2JlSGFuZGxlchIbChNpbml0aWFsRGVsYXlTZWNvbmRzGAIgASgFEhYKDnRpbWVvdXRTZWNvbmRzGAMgASgFEhUKDXBlcmlvZFNlY29uZHMYBCABKAUSGAoQc3VjY2Vzc1RocmVzaG9sZBgFIAEoBRIYChBmYWlsdXJlVGhyZXNob2xkGAYgASgFEiUKHXRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzGAcgASgDItYBCgxQcm9iZUhhbmRsZXISLAoEZXhlYxgBIAEoCzIeLms4cy5pby5hcGkuY29yZS52MS5FeGVjQWN0aW9uEjIKB2h0dHBHZXQYAiABKAsyIS5rOHMuaW8uYXBpLmNvcmUudjEuSFRUUEdldEFjdGlvbhI2Cgl0Y3BTb2NrZXQYAyABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuVENQU29ja2V0QWN0aW9uEiwKBGdycGMYBCABKAsyHi5rOHMuaW8uYXBpLmNvcmUudjEuR1JQQ0FjdGlvbiJjChVQcm9qZWN0ZWRWb2x1bWVTb3VyY2USNQoHc291cmNlcxgBIAMoCzIkLms4cy5pby5hcGkuY29yZS52MS5Wb2x1bWVQcm9qZWN0aW9uEhMKC2RlZmF1bHRNb2RlGAIgASgFInYKE1F1b2J5dGVWb2x1bWVTb3VyY2USEAoIcmVnaXN0cnkYASABKAkSDgoGdm9sdW1lGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIEgwKBHVzZXIYBCABKAkSDQoFZ3JvdXAYBSABKAkSDgoGdGVuYW50GAYgASgJIsMBChlSQkRQZXJzaXN0ZW50Vm9sdW1lU291cmNlEhAKCG1vbml0b3JzGAEgAygJEg0KBWltYWdlGAIgASgJEg4KBmZzVHlwZRgDIAEoCRIMCgRwb29sGAQgASgJEgwKBHVzZXIYBSABKAkSDwoHa2V5cmluZxgGIAEoCRI2CglzZWNyZXRSZWYYByABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlEhAKCHJlYWRPbmx5GAggASgIIr4BCg9SQkRWb2x1bWVTb3VyY2USEAoIbW9uaXRvcnMYASADKAkSDQoFaW1hZ2UYAiABKAkSDgoGZnNUeXBlGAMgASgJEgwKBHBvb2wYBCABKAkSDAoEdXNlchgFIAEoCRIPCgdrZXlyaW5nGAYgASgJEjsKCXNlY3JldFJlZhgHIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZRIQCghyZWFkT25seRgIIAEoCCJyCg9SYW5nZUFsbG9jYXRpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRINCgVyYW5nZRgCIAEoCRIMCgRkYXRhGAMgASgMItkBChVSZXBsaWNhdGlvbkNvbnRyb2xsZXISQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRI7CgRzcGVjGAIgASgLMi0uazhzLmlvLmFwaS5jb3JlLnYxLlJlcGxpY2F0aW9uQ29udHJvbGxlclNwZWMSPwoGc3RhdHVzGAMgASgLMi8uazhzLmlvLmFwaS5jb3JlLnYxLlJlcGxpY2F0aW9uQ29udHJvbGxlclN0YXR1cyKnAQoeUmVwbGljYXRpb25Db250cm9sbGVyQ29uZGl0aW9uEgwKBHR5cGUYASABKAkSDgoGc3RhdHVzGAIgASgJEkYKEmxhc3RUcmFuc2l0aW9uVGltZRgDIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg4KBnJlYXNvbhgEIAEoCRIPCgdtZXNzYWdlGAUgASgJIpcBChlSZXBsaWNhdGlvbkNvbnRyb2xsZXJMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjgKBWl0ZW1zGAIgAygLMikuazhzLmlvLmFwaS5jb3JlLnYxLlJlcGxpY2F0aW9uQ29udHJvbGxlciL9AQoZUmVwbGljYXRpb25Db250cm9sbGVyU3BlYxIQCghyZXBsaWNhcxgBIAEoBRIXCg9taW5SZWFkeVNlY29uZHMYBCABKAUSTQoIc2VsZWN0b3IYAiADKAsyOy5rOHMuaW8uYXBpLmNvcmUudjEuUmVwbGljYXRpb25Db250cm9sbGVyU3BlYy5TZWxlY3RvckVudHJ5EjUKCHRlbXBsYXRlGAMgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFRlbXBsYXRlU3BlYxovCg1TZWxlY3RvckVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEi4wEKG1JlcGxpY2F0aW9uQ29udHJvbGxlclN0YXR1cxIQCghyZXBsaWNhcxgBIAEoBRIcChRmdWxseUxhYmVsZWRSZXBsaWNhcxgCIAEoBRIVCg1yZWFkeVJlcGxpY2FzGAQgASgFEhkKEWF2YWlsYWJsZVJlcGxpY2FzGAUgASgFEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgDIAEoAxJGCgpjb25kaXRpb25zGAYgAygLMjIuazhzLmlvLmFwaS5jb3JlLnYxLlJlcGxpY2F0aW9uQ29udHJvbGxlckNvbmRpdGlvbiIuCg1SZXNvdXJjZUNsYWltEgwKBG5hbWUYASABKAkSDwoHcmVxdWVzdBgCIAEoCSKBAQoVUmVzb3VyY2VGaWVsZFNlbGVjdG9yEhUKDWNvbnRhaW5lck5hbWUYASABKAkSEAoIcmVzb3VyY2UYAiABKAkSPwoHZGl2aXNvchgDIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eSI0Cg5SZXNvdXJjZUhlYWx0aBISCgpyZXNvdXJjZUlEGAEgASgJEg4KBmhlYWx0aBgCIAEoCSLBAQoNUmVzb3VyY2VRdW90YRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjMKBHNwZWMYAiABKAsyJS5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VRdW90YVNwZWMSNwoGc3RhdHVzGAMgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUXVvdGFTdGF0dXMihwEKEVJlc291cmNlUXVvdGFMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjAKBWl0ZW1zGAIgAygLMiEuazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUXVvdGEi+QEKEVJlc291cmNlUXVvdGFTcGVjEj0KBGhhcmQYASADKAsyLy5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VRdW90YVNwZWMuSGFyZEVudHJ5Eg4KBnNjb3BlcxgCIAMoCRI4Cg1zY29wZVNlbGVjdG9yGAMgASgLMiEuazhzLmlvLmFwaS5jb3JlLnYxLlNjb3BlU2VsZWN0b3IaWwoJSGFyZEVudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEi0QIKE1Jlc291cmNlUXVvdGFTdGF0dXMSPwoEaGFyZBgBIAMoCzIxLms4cy5pby5hcGkuY29yZS52MS5SZXNvdXJjZVF1b3RhU3RhdHVzLkhhcmRFbnRyeRI/CgR1c2VkGAIgAygLMjEuazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUXVvdGFTdGF0dXMuVXNlZEVudHJ5GlsKCUhhcmRFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBGlsKCVVzZWRFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBIpkDChRSZXNvdXJjZVJlcXVpcmVtZW50cxJECgZsaW1pdHMYASADKAsyNC5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VSZXF1aXJlbWVudHMuTGltaXRzRW50cnkSSAoIcmVxdWVzdHMYAiADKAsyNi5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VSZXF1aXJlbWVudHMuUmVxdWVzdHNFbnRyeRIxCgZjbGFpbXMYAyADKAsyIS5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VDbGFpbRpdCgtMaW1pdHNFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBGl8KDVJlcXVlc3RzRW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ASJVCg5SZXNvdXJjZVN0YXR1cxIMCgRuYW1lGAEgASgJEjUKCXJlc291cmNlcxgCIAMoCzIiLms4cy5pby5hcGkuY29yZS52MS5SZXNvdXJjZUhlYWx0aCJJCg5TRUxpbnV4T3B0aW9ucxIMCgR1c2VyGAEgASgJEgwKBHJvbGUYAiABKAkSDAoEdHlwZRgDIAEoCRINCgVsZXZlbBgEIAEoCSKGAgodU2NhbGVJT1BlcnNpc3RlbnRWb2x1bWVTb3VyY2USDwoHZ2F0ZXdheRgBIAEoCRIOCgZzeXN0ZW0YAiABKAkSNgoJc2VjcmV0UmVmGAMgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRISCgpzc2xFbmFibGVkGAQgASgIEhgKEHByb3RlY3Rpb25Eb21haW4YBSABKAkSEwoLc3RvcmFnZVBvb2wYBiABKAkSEwoLc3RvcmFnZU1vZGUYByABKAkSEgoKdm9sdW1lTmFtZRgIIAEoCRIOCgZmc1R5cGUYCSABKAkSEAoIcmVhZE9ubHkYCiABKAgigQIKE1NjYWxlSU9Wb2x1bWVTb3VyY2USDwoHZ2F0ZXdheRgBIAEoCRIOCgZzeXN0ZW0YAiABKAkSOwoJc2VjcmV0UmVmGAMgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEhIKCnNzbEVuYWJsZWQYBCABKAgSGAoQcHJvdGVjdGlvbkRvbWFpbhgFIAEoCRITCgtzdG9yYWdlUG9vbBgGIAEoCRITCgtzdG9yYWdlTW9kZRgHIAEoCRISCgp2b2x1bWVOYW1lGAggASgJEg4KBmZzVHlwZRgJIAEoCRIQCghyZWFkT25seRgKIAEoCCJgCg1TY29wZVNlbGVjdG9yEk8KEG1hdGNoRXhwcmVzc2lvbnMYASADKAsyNS5rOHMuaW8uYXBpLmNvcmUudjEuU2NvcGVkUmVzb3VyY2VTZWxlY3RvclJlcXVpcmVtZW50IlgKIVNjb3BlZFJlc291cmNlU2VsZWN0b3JSZXF1aXJlbWVudBIRCglzY29wZU5hbWUYASABKAkSEAoIb3BlcmF0b3IYAiABKAkSDgoGdmFsdWVzGAMgAygJIjgKDlNlY2NvbXBQcm9maWxlEgwKBHR5cGUYASABKAkSGAoQbG9jYWxob3N0UHJvZmlsZRgCIAEoCSLBAgoGU2VjcmV0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESEQoJaW1tdXRhYmxlGAUgASgIEjIKBGRhdGEYAiADKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0LkRhdGFFbnRyeRI+CgpzdHJpbmdEYXRhGAQgAygLMiouazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldC5TdHJpbmdEYXRhRW50cnkSDAoEdHlwZRgDIAEoCRorCglEYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgMOgI4ARoxCg9TdHJpbmdEYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJrCg9TZWNyZXRFbnZTb3VyY2USRgoUbG9jYWxPYmplY3RSZWZlcmVuY2UYASABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2USEAoIb3B0aW9uYWwYAiABKAgiegoRU2VjcmV0S2V5U2VsZWN0b3ISRgoUbG9jYWxPYmplY3RSZWZlcmVuY2UYASABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2USCwoDa2V5GAIgASgJEhAKCG9wdGlvbmFsGAMgASgIInkKClNlY3JldExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESKQoFaXRlbXMYAiADKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0IpoBChBTZWNyZXRQcm9qZWN0aW9uEkYKFGxvY2FsT2JqZWN0UmVmZXJlbmNlGAEgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEiwKBWl0ZW1zGAIgAygLMh0uazhzLmlvLmFwaS5jb3JlLnYxLktleVRvUGF0aBIQCghvcHRpb25hbBgEIAEoCCIyCg9TZWNyZXRSZWZlcmVuY2USDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkifQoSU2VjcmV0Vm9sdW1lU291cmNlEhIKCnNlY3JldE5hbWUYASABKAkSLAoFaXRlbXMYAiADKAsyHS5rOHMuaW8uYXBpLmNvcmUudjEuS2V5VG9QYXRoEhMKC2RlZmF1bHRNb2RlGAMgASgFEhAKCG9wdGlvbmFsGAQgASgIIvADCg9TZWN1cml0eUNvbnRleHQSNgoMY2FwYWJpbGl0aWVzGAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLkNhcGFiaWxpdGllcxISCgpwcml2aWxlZ2VkGAIgASgIEjoKDnNlTGludXhPcHRpb25zGAMgASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLlNFTGludXhPcHRpb25zEkkKDndpbmRvd3NPcHRpb25zGAogASgLMjEuazhzLmlvLmFwaS5jb3JlLnYxLldpbmRvd3NTZWN1cml0eUNvbnRleHRPcHRpb25zEhEKCXJ1bkFzVXNlchgEIAEoAxISCgpydW5Bc0dyb3VwGAggASgDEhQKDHJ1bkFzTm9uUm9vdBgFIAEoCBIeChZyZWFkT25seVJvb3RGaWxlc3lzdGVtGAYgASgIEiAKGGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbhgHIAEoCBIRCglwcm9jTW91bnQYCSABKAkSOgoOc2VjY29tcFByb2ZpbGUYCyABKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjY29tcFByb2ZpbGUSPAoPYXBwQXJtb3JQcm9maWxlGAwgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLkFwcEFybW9yUHJvZmlsZSJNChNTZXJpYWxpemVkUmVmZXJlbmNlEjYKCXJlZmVyZW5jZRgBIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5PYmplY3RSZWZlcmVuY2UirwEKB1NlcnZpY2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRItCgRzcGVjGAIgASgLMh8uazhzLmlvLmFwaS5jb3JlLnYxLlNlcnZpY2VTcGVjEjEKBnN0YXR1cxgDIAEoCzIhLms4cy5pby5hcGkuY29yZS52MS5TZXJ2aWNlU3RhdHVzIvQBCg5TZXJ2aWNlQWNjb3VudBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjQKB3NlY3JldHMYAiADKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuT2JqZWN0UmVmZXJlbmNlEkIKEGltYWdlUHVsbFNlY3JldHMYAyADKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2USJAocYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlbhgEIAEoCCKJAQoSU2VydmljZUFjY291bnRMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjEKBWl0ZW1zGAIgAygLMiIuazhzLmlvLmFwaS5jb3JlLnYxLlNlcnZpY2VBY2NvdW50IloKHVNlcnZpY2VBY2NvdW50VG9rZW5Qcm9qZWN0aW9uEhAKCGF1ZGllbmNlGAEgASgJEhkKEWV4cGlyYXRpb25TZWNvbmRzGAIgASgDEgwKBHBhdGgYAyABKAkiewoLU2VydmljZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESKgoFaXRlbXMYAiADKAsyGy5rOHMuaW8uYXBpLmNvcmUudjEuU2VydmljZSKoAQoLU2VydmljZVBvcnQSDAoEbmFtZRgBIAEoCRIQCghwcm90b2NvbBgCIAEoCRITCgthcHBQcm90b2NvbBgGIAEoCRIMCgRwb3J0GAMgASgFEkQKCnRhcmdldFBvcnQYBCABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy51dGlsLmludHN0ci5JbnRPclN0cmluZxIQCghub2RlUG9ydBgFIAEoBSIjChNTZXJ2aWNlUHJveHlPcHRpb25zEgwKBHBhdGgYASABKAkitAUKC1NlcnZpY2VTcGVjEi4KBXBvcnRzGAEgAygLMh8uazhzLmlvLmFwaS5jb3JlLnYxLlNlcnZpY2VQb3J0Ej8KCHNlbGVjdG9yGAIgAygLMi0uazhzLmlvLmFwaS5jb3JlLnYxLlNlcnZpY2VTcGVjLlNlbGVjdG9yRW50cnkSEQoJY2x1c3RlcklQGAMgASgJEhIKCmNsdXN0ZXJJUHMYEiADKAkSDAoEdHlwZRgEIAEoCRITCgtleHRlcm5hbElQcxgFIAMoCRIXCg9zZXNzaW9uQWZmaW5pdHkYByABKAkSFgoObG9hZEJhbGFuY2VySVAYCCABKAkSIAoYbG9hZEJhbGFuY2VyU291cmNlUmFuZ2VzGAkgAygJEhQKDGV4dGVybmFsTmFtZRgKIAEoCRIdChVleHRlcm5hbFRyYWZmaWNQb2xpY3kYCyABKAkSGwoTaGVhbHRoQ2hlY2tOb2RlUG9ydBgMIAEoBRIgChhwdWJsaXNoTm90UmVhZHlBZGRyZXNzZXMYDSABKAgSSAoVc2Vzc2lvbkFmZmluaXR5Q29uZmlnGA4gASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLlNlc3Npb25BZmZpbml0eUNvbmZpZxISCgppcEZhbWlsaWVzGBMgAygJEhYKDmlwRmFtaWx5UG9saWN5GBEgASgJEiUKHWFsbG9jYXRlTG9hZEJhbGFuY2VyTm9kZVBvcnRzGBQgASgIEhkKEWxvYWRCYWxhbmNlckNsYXNzGBUgASgJEh0KFWludGVybmFsVHJhZmZpY1BvbGljeRgWIAEoCRIbChN0cmFmZmljRGlzdHJpYnV0aW9uGBcgASgJGi8KDVNlbGVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKSAQoNU2VydmljZVN0YXR1cxI8Cgxsb2FkQmFsYW5jZXIYASABKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuTG9hZEJhbGFuY2VyU3RhdHVzEkMKCmNvbmRpdGlvbnMYAiADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uIk0KFVNlc3Npb25BZmZpbml0eUNvbmZpZxI0CghjbGllbnRJUBgBIAEoCzIiLms4cy5pby5hcGkuY29yZS52MS5DbGllbnRJUENvbmZpZyIeCgtTbGVlcEFjdGlvbhIPCgdzZWNvbmRzGAEgASgDIqgBCh9TdG9yYWdlT1NQZXJzaXN0ZW50Vm9sdW1lU291cmNlEhIKCnZvbHVtZU5hbWUYASABKAkSFwoPdm9sdW1lTmFtZXNwYWNlGAIgASgJEg4KBmZzVHlwZRgDIAEoCRIQCghyZWFkT25seRgEIAEoCBI2CglzZWNyZXRSZWYYBSABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuT2JqZWN0UmVmZXJlbmNlIqMBChVTdG9yYWdlT1NWb2x1bWVTb3VyY2USEgoKdm9sdW1lTmFtZRgBIAEoCRIXCg92b2x1bWVOYW1lc3BhY2UYAiABKAkSDgoGZnNUeXBlGAMgASgJEhAKCHJlYWRPbmx5GAQgASgIEjsKCXNlY3JldFJlZhgFIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZSIlCgZTeXNjdGwSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSJfCg9UQ1BTb2NrZXRBY3Rpb24SPgoEcG9ydBgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLnV0aWwuaW50c3RyLkludE9yU3RyaW5nEgwKBGhvc3QYAiABKAkicgoFVGFpbnQSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJEg4KBmVmZmVjdBgDIAEoCRI9Cgl0aW1lQWRkZWQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSJlCgpUb2xlcmF0aW9uEgsKA2tleRgBIAEoCRIQCghvcGVyYXRvchgCIAEoCRINCgV2YWx1ZRgDIAEoCRIOCgZlZmZlY3QYBCABKAkSGQoRdG9sZXJhdGlvblNlY29uZHMYBSABKAMiPwogVG9wb2xvZ3lTZWxlY3RvckxhYmVsUmVxdWlyZW1lbnQSCwoDa2V5GAEgASgJEg4KBnZhbHVlcxgCIAMoCSJrChRUb3BvbG9neVNlbGVjdG9yVGVybRJTChVtYXRjaExhYmVsRXhwcmVzc2lvbnMYASADKAsyNC5rOHMuaW8uYXBpLmNvcmUudjEuVG9wb2xvZ3lTZWxlY3RvckxhYmVsUmVxdWlyZW1lbnQiiQIKGFRvcG9sb2d5U3ByZWFkQ29uc3RyYWludBIPCgdtYXhTa2V3GAEgASgFEhMKC3RvcG9sb2d5S2V5GAIgASgJEhkKEXdoZW5VbnNhdGlzZmlhYmxlGAMgASgJEkoKDWxhYmVsU2VsZWN0b3IYBCABKAsyMy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGFiZWxTZWxlY3RvchISCgptaW5Eb21haW5zGAUgASgFEhoKEm5vZGVBZmZpbml0eVBvbGljeRgGIAEoCRIYChBub2RlVGFpbnRzUG9saWN5GAcgASgJEhYKDm1hdGNoTGFiZWxLZXlzGAggAygJIkkKGVR5cGVkTG9jYWxPYmplY3RSZWZlcmVuY2USEAoIYXBpR3JvdXAYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJIlcKFFR5cGVkT2JqZWN0UmVmZXJlbmNlEhAKCGFwaUdyb3VwGAEgASgJEgwKBGtpbmQYAiABKAkSDAoEbmFtZRgDIAEoCRIRCgluYW1lc3BhY2UYBCABKAkiTgoGVm9sdW1lEgwKBG5hbWUYASABKAkSNgoMdm9sdW1lU291cmNlGAIgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZVNvdXJjZSIwCgxWb2x1bWVEZXZpY2USDAoEbmFtZRgBIAEoCRISCgpkZXZpY2VQYXRoGAIgASgJIpsBCgtWb2x1bWVNb3VudBIMCgRuYW1lGAEgASgJEhAKCHJlYWRPbmx5GAIgASgIEhkKEXJlY3Vyc2l2ZVJlYWRPbmx5GAcgASgJEhEKCW1vdW50UGF0aBgDIAEoCRIPCgdzdWJQYXRoGAQgASgJEhgKEG1vdW50UHJvcGFnYXRpb24YBSABKAkSEwoLc3ViUGF0aEV4cHIYBiABKAkiYQoRVm9sdW1lTW91bnRTdGF0dXMSDAoEbmFtZRgBIAEoCRIRCgltb3VudFBhdGgYAiABKAkSEAoIcmVhZE9ubHkYAyABKAgSGQoRcmVjdXJzaXZlUmVhZE9ubHkYBCABKAkiSAoSVm9sdW1lTm9kZUFmZmluaXR5EjIKCHJlcXVpcmVkGAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVTZWxlY3RvciLiAgoQVm9sdW1lUHJvamVjdGlvbhI0CgZzZWNyZXQYASABKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UHJvamVjdGlvbhI+Cgtkb3dud2FyZEFQSRgCIAEoCzIpLms4cy5pby5hcGkuY29yZS52MS5Eb3dud2FyZEFQSVByb2plY3Rpb24SOgoJY29uZmlnTWFwGAMgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLkNvbmZpZ01hcFByb2plY3Rpb24STgoTc2VydmljZUFjY291bnRUb2tlbhgEIAEoCzIxLms4cy5pby5hcGkuY29yZS52MS5TZXJ2aWNlQWNjb3VudFRva2VuUHJvamVjdGlvbhJMChJjbHVzdGVyVHJ1c3RCdW5kbGUYBSABKAsyMC5rOHMuaW8uYXBpLmNvcmUudjEuQ2x1c3RlclRydXN0QnVuZGxlUHJvamVjdGlvbiL4AgoaVm9sdW1lUmVzb3VyY2VSZXF1aXJlbWVudHMSSgoGbGltaXRzGAEgAygLMjouazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZVJlc291cmNlUmVxdWlyZW1lbnRzLkxpbWl0c0VudHJ5Ek4KCHJlcXVlc3RzGAIgAygLMjwuazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZVJlc291cmNlUmVxdWlyZW1lbnRzLlJlcXVlc3RzRW50cnkaXQoLTGltaXRzRW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ARpfCg1SZXF1ZXN0c0VudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEizw4KDFZvbHVtZVNvdXJjZRI6Cghob3N0UGF0aBgBIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Ib3N0UGF0aFZvbHVtZVNvdXJjZRI6CghlbXB0eURpchgCIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5FbXB0eURpclZvbHVtZVNvdXJjZRJMChFnY2VQZXJzaXN0ZW50RGlzaxgDIAEoCzIxLms4cy5pby5hcGkuY29yZS52MS5HQ0VQZXJzaXN0ZW50RGlza1ZvbHVtZVNvdXJjZRJSChRhd3NFbGFzdGljQmxvY2tTdG9yZRgEIAEoCzI0Lms4cy5pby5hcGkuY29yZS52MS5BV1NFbGFzdGljQmxvY2tTdG9yZVZvbHVtZVNvdXJjZRI4CgdnaXRSZXBvGAUgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLkdpdFJlcG9Wb2x1bWVTb3VyY2USNgoGc2VjcmV0GAYgASgLMiYuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFZvbHVtZVNvdXJjZRIwCgNuZnMYByABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuTkZTVm9sdW1lU291cmNlEjQKBWlzY3NpGAggASgLMiUuazhzLmlvLmFwaS5jb3JlLnYxLklTQ1NJVm9sdW1lU291cmNlEjwKCWdsdXN0ZXJmcxgJIAEoCzIpLms4cy5pby5hcGkuY29yZS52MS5HbHVzdGVyZnNWb2x1bWVTb3VyY2USVAoVcGVyc2lzdGVudFZvbHVtZUNsYWltGAogASgLMjUuazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVDbGFpbVZvbHVtZVNvdXJjZRIwCgNyYmQYCyABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuUkJEVm9sdW1lU291cmNlEjgKCmZsZXhWb2x1bWUYDCABKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuRmxleFZvbHVtZVNvdXJjZRI2CgZjaW5kZXIYDSABKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuQ2luZGVyVm9sdW1lU291cmNlEjYKBmNlcGhmcxgOIAEoCzImLms4cy5pby5hcGkuY29yZS52MS5DZXBoRlNWb2x1bWVTb3VyY2USOAoHZmxvY2tlchgPIAEoCzInLms4cy5pby5hcGkuY29yZS52MS5GbG9ja2VyVm9sdW1lU291cmNlEkAKC2Rvd253YXJkQVBJGBAgASgLMisuazhzLmlvLmFwaS5jb3JlLnYxLkRvd253YXJkQVBJVm9sdW1lU291cmNlEi4KAmZjGBEgASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkZDVm9sdW1lU291cmNlEjwKCWF6dXJlRmlsZRgSIAEoCzIpLms4cy5pby5hcGkuY29yZS52MS5BenVyZUZpbGVWb2x1bWVTb3VyY2USPAoJY29uZmlnTWFwGBMgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkNvbmZpZ01hcFZvbHVtZVNvdXJjZRJJCg12c3BoZXJlVm9sdW1lGBQgASgLMjIuazhzLmlvLmFwaS5jb3JlLnYxLlZzcGhlcmVWaXJ0dWFsRGlza1ZvbHVtZVNvdXJjZRI4CgdxdW9ieXRlGBUgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLlF1b2J5dGVWb2x1bWVTb3VyY2USPAoJYXp1cmVEaXNrGBYgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkF6dXJlRGlza1ZvbHVtZVNvdXJjZRJSChRwaG90b25QZXJzaXN0ZW50RGlzaxgXIAEoCzI0Lms4cy5pby5hcGkuY29yZS52MS5QaG90b25QZXJzaXN0ZW50RGlza1ZvbHVtZVNvdXJjZRI8Cglwcm9qZWN0ZWQYGiABKAsyKS5rOHMuaW8uYXBpLmNvcmUudjEuUHJvamVjdGVkVm9sdW1lU291cmNlEkAKDnBvcnR3b3J4Vm9sdW1lGBggASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLlBvcnR3b3J4Vm9sdW1lU291cmNlEjgKB3NjYWxlSU8YGSABKAsyJy5rOHMuaW8uYXBpLmNvcmUudjEuU2NhbGVJT1ZvbHVtZVNvdXJjZRI8CglzdG9yYWdlb3MYGyABKAsyKS5rOHMuaW8uYXBpLmNvcmUudjEuU3RvcmFnZU9TVm9sdW1lU291cmNlEjAKA2NzaRgcIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5DU0lWb2x1bWVTb3VyY2USPAoJZXBoZW1lcmFsGB0gASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkVwaGVtZXJhbFZvbHVtZVNvdXJjZRI0CgVpbWFnZRgeIAEoCzIlLms4cy5pby5hcGkuY29yZS52MS5JbWFnZVZvbHVtZVNvdXJjZSJ4Ch5Wc3BoZXJlVmlydHVhbERpc2tWb2x1bWVTb3VyY2USEgoKdm9sdW1lUGF0aBgBIAEoCRIOCgZmc1R5cGUYAiABKAkSGQoRc3RvcmFnZVBvbGljeU5hbWUYAyABKAkSFwoPc3RvcmFnZVBvbGljeUlEGAQgASgJImcKF1dlaWdodGVkUG9kQWZmaW5pdHlUZXJtEg4KBndlaWdodBgBIAEoBRI8Cg9wb2RBZmZpbml0eVRlcm0YAiABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuUG9kQWZmaW5pdHlUZXJtIocBCh1XaW5kb3dzU2VjdXJpdHlDb250ZXh0T3B0aW9ucxIeChZnbXNhQ3JlZGVudGlhbFNwZWNOYW1lGAEgASgJEhoKEmdtc2FDcmVkZW50aWFsU3BlYxgCIAEoCRIVCg1ydW5Bc1VzZXJOYW1lGAMgASgJEhMKC2hvc3RQcm9jZXNzGAQgASgIQqkBChZjb20uazhzLmlvLmFwaS5jb3JlLnYxQg5HZW5lcmF0ZWRQcm90b1ABWhJrOHMuaW8vYXBpL2NvcmUvdjGiAgRLSUFDqgISSzhzLklvLkFwaS5Db3JlLlYxygISSzhzXElvXEFwaVxDb3JlXFYx4gIeSzhzXElvXEFwaVxDb3JlXFYxXEdQQk1ldGFkYXRh6gIWSzhzOjpJbzo6QXBpOjpDb3JlOjpWMQ", [file_k8s_io_apimachinery_pkg_api_resource_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated, file_k8s_io_apimachinery_pkg_util_intstr_generated]);
+  fileDesc("CiJrOHMuaW8vYXBpL2NvcmUvdjEvZ2VuZXJhdGVkLnByb3RvEhJrOHMuaW8uYXBpLmNvcmUudjEiaQogQVdTRWxhc3RpY0Jsb2NrU3RvcmVWb2x1bWVTb3VyY2USEAoIdm9sdW1lSUQYASABKAkSDgoGZnNUeXBlGAIgASgJEhEKCXBhcnRpdGlvbhgDIAEoBRIQCghyZWFkT25seRgEIAEoCCK2AQoIQWZmaW5pdHkSNgoMbm9kZUFmZmluaXR5GAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVBZmZpbml0eRI0Cgtwb2RBZmZpbml0eRgCIAEoCzIfLms4cy5pby5hcGkuY29yZS52MS5Qb2RBZmZpbml0eRI8Cg9wb2RBbnRpQWZmaW5pdHkYAyABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuUG9kQW50aUFmZmluaXR5IjkKD0FwcEFybW9yUHJvZmlsZRIMCgR0eXBlGAEgASgJEhgKEGxvY2FsaG9zdFByb2ZpbGUYAiABKAkiMgoOQXR0YWNoZWRWb2x1bWUSDAoEbmFtZRgBIAEoCRISCgpkZXZpY2VQYXRoGAIgASgJIk4KCUF2b2lkUG9kcxJBCg9wcmVmZXJBdm9pZFBvZHMYASADKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuUHJlZmVyQXZvaWRQb2RzRW50cnkifwoVQXp1cmVEaXNrVm9sdW1lU291cmNlEhAKCGRpc2tOYW1lGAEgASgJEg8KB2Rpc2tVUkkYAiABKAkSEwoLY2FjaGluZ01vZGUYAyABKAkSDgoGZnNUeXBlGAQgASgJEhAKCHJlYWRPbmx5GAUgASgIEgwKBGtpbmQYBiABKAkicwofQXp1cmVGaWxlUGVyc2lzdGVudFZvbHVtZVNvdXJjZRISCgpzZWNyZXROYW1lGAEgASgJEhEKCXNoYXJlTmFtZRgCIAEoCRIQCghyZWFkT25seRgDIAEoCBIXCg9zZWNyZXROYW1lc3BhY2UYBCABKAkiUAoVQXp1cmVGaWxlVm9sdW1lU291cmNlEhIKCnNlY3JldE5hbWUYASABKAkSEQoJc2hhcmVOYW1lGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIIoIBCgdCaW5kaW5nEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESMwoGdGFyZ2V0GAIgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLk9iamVjdFJlZmVyZW5jZSLSBAoZQ1NJUGVyc2lzdGVudFZvbHVtZVNvdXJjZRIOCgZkcml2ZXIYASABKAkSFAoMdm9sdW1lSGFuZGxlGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIEg4KBmZzVHlwZRgEIAEoCRJdChB2b2x1bWVBdHRyaWJ1dGVzGAUgAygLMkMuazhzLmlvLmFwaS5jb3JlLnYxLkNTSVBlcnNpc3RlbnRWb2x1bWVTb3VyY2UuVm9sdW1lQXR0cmlidXRlc0VudHJ5EkcKGmNvbnRyb2xsZXJQdWJsaXNoU2VjcmV0UmVmGAYgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRI/ChJub2RlU3RhZ2VTZWNyZXRSZWYYByABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlEkEKFG5vZGVQdWJsaXNoU2VjcmV0UmVmGAggASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRJGChljb250cm9sbGVyRXhwYW5kU2VjcmV0UmVmGAkgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRJAChNub2RlRXhwYW5kU2VjcmV0UmVmGAogASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRo3ChVWb2x1bWVBdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKZAgoPQ1NJVm9sdW1lU291cmNlEg4KBmRyaXZlchgBIAEoCRIQCghyZWFkT25seRgCIAEoCBIOCgZmc1R5cGUYAyABKAkSUwoQdm9sdW1lQXR0cmlidXRlcxgEIAMoCzI5Lms4cy5pby5hcGkuY29yZS52MS5DU0lWb2x1bWVTb3VyY2UuVm9sdW1lQXR0cmlidXRlc0VudHJ5EkYKFG5vZGVQdWJsaXNoU2VjcmV0UmVmGAUgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlGjcKFVZvbHVtZUF0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIikKDENhcGFiaWxpdGllcxILCgNhZGQYASADKAkSDAoEZHJvcBgCIAMoCSKqAQocQ2VwaEZTUGVyc2lzdGVudFZvbHVtZVNvdXJjZRIQCghtb25pdG9ycxgBIAMoCRIMCgRwYXRoGAIgASgJEgwKBHVzZXIYAyABKAkSEgoKc2VjcmV0RmlsZRgEIAEoCRI2CglzZWNyZXRSZWYYBSABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlEhAKCHJlYWRPbmx5GAYgASgIIqUBChJDZXBoRlNWb2x1bWVTb3VyY2USEAoIbW9uaXRvcnMYASADKAkSDAoEcGF0aBgCIAEoCRIMCgR1c2VyGAMgASgJEhIKCnNlY3JldEZpbGUYBCABKAkSOwoJc2VjcmV0UmVmGAUgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEhAKCHJlYWRPbmx5GAYgASgIIooBChxDaW5kZXJQZXJzaXN0ZW50Vm9sdW1lU291cmNlEhAKCHZvbHVtZUlEGAEgASgJEg4KBmZzVHlwZRgCIAEoCRIQCghyZWFkT25seRgDIAEoCBI2CglzZWNyZXRSZWYYBCABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlIoUBChJDaW5kZXJWb2x1bWVTb3VyY2USEAoIdm9sdW1lSUQYASABKAkSDgoGZnNUeXBlGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIEjsKCXNlY3JldFJlZhgEIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZSIoCg5DbGllbnRJUENvbmZpZxIWCg50aW1lb3V0U2Vjb25kcxgBIAEoBSKsAQocQ2x1c3RlclRydXN0QnVuZGxlUHJvamVjdGlvbhIMCgRuYW1lGAEgASgJEhIKCnNpZ25lck5hbWUYAiABKAkSSgoNbGFiZWxTZWxlY3RvchgDIAEoCzIzLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MYWJlbFNlbGVjdG9yEhAKCG9wdGlvbmFsGAUgASgIEgwKBHBhdGgYBCABKAkiUgoSQ29tcG9uZW50Q29uZGl0aW9uEgwKBHR5cGUYASABKAkSDgoGc3RhdHVzGAIgASgJEg8KB21lc3NhZ2UYAyABKAkSDQoFZXJyb3IYBCABKAkikQEKD0NvbXBvbmVudFN0YXR1cxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjoKCmNvbmRpdGlvbnMYAiADKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuQ29tcG9uZW50Q29uZGl0aW9uIosBChNDb21wb25lbnRTdGF0dXNMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjIKBWl0ZW1zGAIgAygLMiMuazhzLmlvLmFwaS5jb3JlLnYxLkNvbXBvbmVudFN0YXR1cyK8AgoJQ29uZmlnTWFwEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESEQoJaW1tdXRhYmxlGAQgASgIEjUKBGRhdGEYAiADKAsyJy5rOHMuaW8uYXBpLmNvcmUudjEuQ29uZmlnTWFwLkRhdGFFbnRyeRJBCgpiaW5hcnlEYXRhGAMgAygLMi0uazhzLmlvLmFwaS5jb3JlLnYxLkNvbmZpZ01hcC5CaW5hcnlEYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMQoPQmluYXJ5RGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoDDoCOAEibgoSQ29uZmlnTWFwRW52U291cmNlEkYKFGxvY2FsT2JqZWN0UmVmZXJlbmNlGAEgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEhAKCG9wdGlvbmFsGAIgASgIIn0KFENvbmZpZ01hcEtleVNlbGVjdG9yEkYKFGxvY2FsT2JqZWN0UmVmZXJlbmNlGAEgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEgsKA2tleRgCIAEoCRIQCghvcHRpb25hbBgDIAEoCCJ/Cg1Db25maWdNYXBMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEiwKBWl0ZW1zGAIgAygLMh0uazhzLmlvLmFwaS5jb3JlLnYxLkNvbmZpZ01hcCJ8ChlDb25maWdNYXBOb2RlQ29uZmlnU291cmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEgsKA3VpZBgDIAEoCRIXCg9yZXNvdXJjZVZlcnNpb24YBCABKAkSGAoQa3ViZWxldENvbmZpZ0tleRgFIAEoCSKdAQoTQ29uZmlnTWFwUHJvamVjdGlvbhJGChRsb2NhbE9iamVjdFJlZmVyZW5jZRgBIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZRIsCgVpdGVtcxgCIAMoCzIdLms4cy5pby5hcGkuY29yZS52MS5LZXlUb1BhdGgSEAoIb3B0aW9uYWwYBCABKAgitAEKFUNvbmZpZ01hcFZvbHVtZVNvdXJjZRJGChRsb2NhbE9iamVjdFJlZmVyZW5jZRgBIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZRIsCgVpdGVtcxgCIAMoCzIdLms4cy5pby5hcGkuY29yZS52MS5LZXlUb1BhdGgSEwoLZGVmYXVsdE1vZGUYAyABKAUSEAoIb3B0aW9uYWwYBCABKAgi/wYKCUNvbnRhaW5lchIMCgRuYW1lGAEgASgJEg0KBWltYWdlGAIgASgJEg8KB2NvbW1hbmQYAyADKAkSDAoEYXJncxgEIAMoCRISCgp3b3JraW5nRGlyGAUgASgJEjAKBXBvcnRzGAYgAygLMiEuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclBvcnQSMgoHZW52RnJvbRgTIAMoCzIhLms4cy5pby5hcGkuY29yZS52MS5FbnZGcm9tU291cmNlEicKA2VudhgHIAMoCzIaLms4cy5pby5hcGkuY29yZS52MS5FbnZWYXISOwoJcmVzb3VyY2VzGAggASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUmVxdWlyZW1lbnRzEj8KDHJlc2l6ZVBvbGljeRgXIAMoCzIpLms4cy5pby5hcGkuY29yZS52MS5Db250YWluZXJSZXNpemVQb2xpY3kSFQoNcmVzdGFydFBvbGljeRgYIAEoCRI1Cgx2b2x1bWVNb3VudHMYCSADKAsyHy5rOHMuaW8uYXBpLmNvcmUudjEuVm9sdW1lTW91bnQSNwoNdm9sdW1lRGV2aWNlcxgVIAMoCzIgLms4cy5pby5hcGkuY29yZS52MS5Wb2x1bWVEZXZpY2USMAoNbGl2ZW5lc3NQcm9iZRgKIAEoCzIZLms4cy5pby5hcGkuY29yZS52MS5Qcm9iZRIxCg5yZWFkaW5lc3NQcm9iZRgLIAEoCzIZLms4cy5pby5hcGkuY29yZS52MS5Qcm9iZRIvCgxzdGFydHVwUHJvYmUYFiABKAsyGS5rOHMuaW8uYXBpLmNvcmUudjEuUHJvYmUSMAoJbGlmZWN5Y2xlGAwgASgLMh0uazhzLmlvLmFwaS5jb3JlLnYxLkxpZmVjeWNsZRIeChZ0ZXJtaW5hdGlvbk1lc3NhZ2VQYXRoGA0gASgJEiAKGHRlcm1pbmF0aW9uTWVzc2FnZVBvbGljeRgUIAEoCRIXCg9pbWFnZVB1bGxQb2xpY3kYDiABKAkSPAoPc2VjdXJpdHlDb250ZXh0GA8gASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3VyaXR5Q29udGV4dBINCgVzdGRpbhgQIAEoCBIRCglzdGRpbk9uY2UYESABKAgSCwoDdHR5GBIgASgIIjIKDkNvbnRhaW5lckltYWdlEg0KBW5hbWVzGAEgAygJEhEKCXNpemVCeXRlcxgCIAEoAyJoCg1Db250YWluZXJQb3J0EgwKBG5hbWUYASABKAkSEAoIaG9zdFBvcnQYAiABKAUSFQoNY29udGFpbmVyUG9ydBgDIAEoBRIQCghwcm90b2NvbBgEIAEoCRIOCgZob3N0SVAYBSABKAkiRAoVQ29udGFpbmVyUmVzaXplUG9saWN5EhQKDHJlc291cmNlTmFtZRgBIAEoCRIVCg1yZXN0YXJ0UG9saWN5GAIgASgJIsoBCg5Db250YWluZXJTdGF0ZRI6Cgd3YWl0aW5nGAEgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXRlV2FpdGluZxI6CgdydW5uaW5nGAIgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXRlUnVubmluZxJACgp0ZXJtaW5hdGVkGAMgASgLMiwuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXRlVGVybWluYXRlZCJWChVDb250YWluZXJTdGF0ZVJ1bm5pbmcSPQoJc3RhcnRlZEF0GAEgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUi8QEKGENvbnRhaW5lclN0YXRlVGVybWluYXRlZBIQCghleGl0Q29kZRgBIAEoBRIOCgZzaWduYWwYAiABKAUSDgoGcmVhc29uGAMgASgJEg8KB21lc3NhZ2UYBCABKAkSPQoJc3RhcnRlZEF0GAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSPgoKZmluaXNoZWRBdBgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhMKC2NvbnRhaW5lcklEGAcgASgJIjgKFUNvbnRhaW5lclN0YXRlV2FpdGluZxIOCgZyZWFzb24YASABKAkSDwoHbWVzc2FnZRgCIAEoCSK9BQoPQ29udGFpbmVyU3RhdHVzEgwKBG5hbWUYASABKAkSMQoFc3RhdGUYAiABKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuQ29udGFpbmVyU3RhdGUSNQoJbGFzdFN0YXRlGAMgASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXRlEg0KBXJlYWR5GAQgASgIEhQKDHJlc3RhcnRDb3VudBgFIAEoBRINCgVpbWFnZRgGIAEoCRIPCgdpbWFnZUlEGAcgASgJEhMKC2NvbnRhaW5lcklEGAggASgJEg8KB3N0YXJ0ZWQYCSABKAgSVwoSYWxsb2NhdGVkUmVzb3VyY2VzGAogAygLMjsuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXR1cy5BbGxvY2F0ZWRSZXNvdXJjZXNFbnRyeRI7CglyZXNvdXJjZXMYCyABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VSZXF1aXJlbWVudHMSOwoMdm9sdW1lTW91bnRzGAwgAygLMiUuazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZU1vdW50U3RhdHVzEi8KBHVzZXIYDSABKAsyIS5rOHMuaW8uYXBpLmNvcmUudjEuQ29udGFpbmVyVXNlchJEChhhbGxvY2F0ZWRSZXNvdXJjZXNTdGF0dXMYDiADKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VTdGF0dXMSEgoKc3RvcFNpZ25hbBgPIAEoCRppChdBbGxvY2F0ZWRSZXNvdXJjZXNFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBIkYKDUNvbnRhaW5lclVzZXISNQoFbGludXgYASABKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuTGludXhDb250YWluZXJVc2VyIh4KDkRhZW1vbkVuZHBvaW50EgwKBFBvcnQYASABKAUiUQoVRG93bndhcmRBUElQcm9qZWN0aW9uEjgKBWl0ZW1zGAEgAygLMikuazhzLmlvLmFwaS5jb3JlLnYxLkRvd253YXJkQVBJVm9sdW1lRmlsZSKzAQoVRG93bndhcmRBUElWb2x1bWVGaWxlEgwKBHBhdGgYASABKAkSOQoIZmllbGRSZWYYAiABKAsyJy5rOHMuaW8uYXBpLmNvcmUudjEuT2JqZWN0RmllbGRTZWxlY3RvchJDChByZXNvdXJjZUZpZWxkUmVmGAMgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlRmllbGRTZWxlY3RvchIMCgRtb2RlGAQgASgFImgKF0Rvd253YXJkQVBJVm9sdW1lU291cmNlEjgKBWl0ZW1zGAEgAygLMikuazhzLmlvLmFwaS5jb3JlLnYxLkRvd253YXJkQVBJVm9sdW1lRmlsZRITCgtkZWZhdWx0TW9kZRgCIAEoBSJpChRFbXB0eURpclZvbHVtZVNvdXJjZRIOCgZtZWRpdW0YASABKAkSQQoJc2l6ZUxpbWl0GAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5InkKD0VuZHBvaW50QWRkcmVzcxIKCgJpcBgBIAEoCRIQCghob3N0bmFtZRgDIAEoCRIQCghub2RlTmFtZRgEIAEoCRI2Cgl0YXJnZXRSZWYYAiABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuT2JqZWN0UmVmZXJlbmNlIlEKDEVuZHBvaW50UG9ydBIMCgRuYW1lGAEgASgJEgwKBHBvcnQYAiABKAUSEAoIcHJvdG9jb2wYAyABKAkSEwoLYXBwUHJvdG9jb2wYBCABKAkiuQEKDkVuZHBvaW50U3Vic2V0EjYKCWFkZHJlc3NlcxgBIAMoCzIjLms4cy5pby5hcGkuY29yZS52MS5FbmRwb2ludEFkZHJlc3MSPgoRbm90UmVhZHlBZGRyZXNzZXMYAiADKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuRW5kcG9pbnRBZGRyZXNzEi8KBXBvcnRzGAMgAygLMiAuazhzLmlvLmFwaS5jb3JlLnYxLkVuZHBvaW50UG9ydCKEAQoJRW5kcG9pbnRzEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESMwoHc3Vic2V0cxgCIAMoCzIiLms4cy5pby5hcGkuY29yZS52MS5FbmRwb2ludFN1YnNldCJ/Cg1FbmRwb2ludHNMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEiwKBWl0ZW1zGAIgAygLMh0uazhzLmlvLmFwaS5jb3JlLnYxLkVuZHBvaW50cyKVAQoNRW52RnJvbVNvdXJjZRIOCgZwcmVmaXgYASABKAkSPAoMY29uZmlnTWFwUmVmGAIgASgLMiYuazhzLmlvLmFwaS5jb3JlLnYxLkNvbmZpZ01hcEVudlNvdXJjZRI2CglzZWNyZXRSZWYYAyABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0RW52U291cmNlIloKBkVudlZhchIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJEjMKCXZhbHVlRnJvbRgDIAEoCzIgLms4cy5pby5hcGkuY29yZS52MS5FbnZWYXJTb3VyY2UijgIKDEVudlZhclNvdXJjZRI5CghmaWVsZFJlZhgBIAEoCzInLms4cy5pby5hcGkuY29yZS52MS5PYmplY3RGaWVsZFNlbGVjdG9yEkMKEHJlc291cmNlRmllbGRSZWYYAiABKAsyKS5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VGaWVsZFNlbGVjdG9yEkEKD2NvbmZpZ01hcEtleVJlZhgDIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Db25maWdNYXBLZXlTZWxlY3RvchI7CgxzZWNyZXRLZXlSZWYYBCABKAsyJS5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0S2V5U2VsZWN0b3IigQEKEkVwaGVtZXJhbENvbnRhaW5lchJOChhlcGhlbWVyYWxDb250YWluZXJDb21tb24YASABKAsyLC5rOHMuaW8uYXBpLmNvcmUudjEuRXBoZW1lcmFsQ29udGFpbmVyQ29tbW9uEhsKE3RhcmdldENvbnRhaW5lck5hbWUYAiABKAkijgcKGEVwaGVtZXJhbENvbnRhaW5lckNvbW1vbhIMCgRuYW1lGAEgASgJEg0KBWltYWdlGAIgASgJEg8KB2NvbW1hbmQYAyADKAkSDAoEYXJncxgEIAMoCRISCgp3b3JraW5nRGlyGAUgASgJEjAKBXBvcnRzGAYgAygLMiEuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclBvcnQSMgoHZW52RnJvbRgTIAMoCzIhLms4cy5pby5hcGkuY29yZS52MS5FbnZGcm9tU291cmNlEicKA2VudhgHIAMoCzIaLms4cy5pby5hcGkuY29yZS52MS5FbnZWYXISOwoJcmVzb3VyY2VzGAggASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUmVxdWlyZW1lbnRzEj8KDHJlc2l6ZVBvbGljeRgXIAMoCzIpLms4cy5pby5hcGkuY29yZS52MS5Db250YWluZXJSZXNpemVQb2xpY3kSFQoNcmVzdGFydFBvbGljeRgYIAEoCRI1Cgx2b2x1bWVNb3VudHMYCSADKAsyHy5rOHMuaW8uYXBpLmNvcmUudjEuVm9sdW1lTW91bnQSNwoNdm9sdW1lRGV2aWNlcxgVIAMoCzIgLms4cy5pby5hcGkuY29yZS52MS5Wb2x1bWVEZXZpY2USMAoNbGl2ZW5lc3NQcm9iZRgKIAEoCzIZLms4cy5pby5hcGkuY29yZS52MS5Qcm9iZRIxCg5yZWFkaW5lc3NQcm9iZRgLIAEoCzIZLms4cy5pby5hcGkuY29yZS52MS5Qcm9iZRIvCgxzdGFydHVwUHJvYmUYFiABKAsyGS5rOHMuaW8uYXBpLmNvcmUudjEuUHJvYmUSMAoJbGlmZWN5Y2xlGAwgASgLMh0uazhzLmlvLmFwaS5jb3JlLnYxLkxpZmVjeWNsZRIeChZ0ZXJtaW5hdGlvbk1lc3NhZ2VQYXRoGA0gASgJEiAKGHRlcm1pbmF0aW9uTWVzc2FnZVBvbGljeRgUIAEoCRIXCg9pbWFnZVB1bGxQb2xpY3kYDiABKAkSPAoPc2VjdXJpdHlDb250ZXh0GA8gASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3VyaXR5Q29udGV4dBINCgVzdGRpbhgQIAEoCBIRCglzdGRpbk9uY2UYESABKAgSCwoDdHR5GBIgASgIImcKFUVwaGVtZXJhbFZvbHVtZVNvdXJjZRJOChN2b2x1bWVDbGFpbVRlbXBsYXRlGAEgASgLMjEuazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVDbGFpbVRlbXBsYXRlIvAECgVFdmVudBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjsKDmludm9sdmVkT2JqZWN0GAIgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLk9iamVjdFJlZmVyZW5jZRIOCgZyZWFzb24YAyABKAkSDwoHbWVzc2FnZRgEIAEoCRIvCgZzb3VyY2UYBSABKAsyHy5rOHMuaW8uYXBpLmNvcmUudjEuRXZlbnRTb3VyY2USQgoOZmlyc3RUaW1lc3RhbXAYBiABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJBCg1sYXN0VGltZXN0YW1wGAcgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDQoFY291bnQYCCABKAUSDAoEdHlwZRgJIAEoCRJCCglldmVudFRpbWUYCiABKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTWljcm9UaW1lEi8KBnNlcmllcxgLIAEoCzIfLms4cy5pby5hcGkuY29yZS52MS5FdmVudFNlcmllcxIOCgZhY3Rpb24YDCABKAkSNAoHcmVsYXRlZBgNIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5PYmplY3RSZWZlcmVuY2USGgoScmVwb3J0aW5nQ29tcG9uZW50GA4gASgJEhkKEXJlcG9ydGluZ0luc3RhbmNlGA8gASgJIncKCUV2ZW50TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRIoCgVpdGVtcxgCIAMoCzIZLms4cy5pby5hcGkuY29yZS52MS5FdmVudCJnCgtFdmVudFNlcmllcxINCgVjb3VudBgBIAEoBRJJChBsYXN0T2JzZXJ2ZWRUaW1lGAIgASgLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk1pY3JvVGltZSIuCgtFdmVudFNvdXJjZRIRCgljb21wb25lbnQYASABKAkSDAoEaG9zdBgCIAEoCSIdCgpFeGVjQWN0aW9uEg8KB2NvbW1hbmQYASADKAkiYgoORkNWb2x1bWVTb3VyY2USEgoKdGFyZ2V0V1dOcxgBIAMoCRILCgNsdW4YAiABKAUSDgoGZnNUeXBlGAMgASgJEhAKCHJlYWRPbmx5GAQgASgIEg0KBXd3aWRzGAUgAygJIoQCChpGbGV4UGVyc2lzdGVudFZvbHVtZVNvdXJjZRIOCgZkcml2ZXIYASABKAkSDgoGZnNUeXBlGAIgASgJEjYKCXNlY3JldFJlZhgDIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5TZWNyZXRSZWZlcmVuY2USEAoIcmVhZE9ubHkYBCABKAgSTAoHb3B0aW9ucxgFIAMoCzI7Lms4cy5pby5hcGkuY29yZS52MS5GbGV4UGVyc2lzdGVudFZvbHVtZVNvdXJjZS5PcHRpb25zRW50cnkaLgoMT3B0aW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEi9QEKEEZsZXhWb2x1bWVTb3VyY2USDgoGZHJpdmVyGAEgASgJEg4KBmZzVHlwZRgCIAEoCRI7CglzZWNyZXRSZWYYAyABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2USEAoIcmVhZE9ubHkYBCABKAgSQgoHb3B0aW9ucxgFIAMoCzIxLms4cy5pby5hcGkuY29yZS52MS5GbGV4Vm9sdW1lU291cmNlLk9wdGlvbnNFbnRyeRouCgxPcHRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASI/ChNGbG9ja2VyVm9sdW1lU291cmNlEhMKC2RhdGFzZXROYW1lGAEgASgJEhMKC2RhdGFzZXRVVUlEGAIgASgJImQKHUdDRVBlcnNpc3RlbnREaXNrVm9sdW1lU291cmNlEg4KBnBkTmFtZRgBIAEoCRIOCgZmc1R5cGUYAiABKAkSEQoJcGFydGl0aW9uGAMgASgFEhAKCHJlYWRPbmx5GAQgASgIIisKCkdSUENBY3Rpb24SDAoEcG9ydBgBIAEoBRIPCgdzZXJ2aWNlGAIgASgJIk4KE0dpdFJlcG9Wb2x1bWVTb3VyY2USEgoKcmVwb3NpdG9yeRgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglkaXJlY3RvcnkYAyABKAkicAofR2x1c3RlcmZzUGVyc2lzdGVudFZvbHVtZVNvdXJjZRIRCgllbmRwb2ludHMYASABKAkSDAoEcGF0aBgCIAEoCRIQCghyZWFkT25seRgDIAEoCBIaChJlbmRwb2ludHNOYW1lc3BhY2UYBCABKAkiSgoVR2x1c3RlcmZzVm9sdW1lU291cmNlEhEKCWVuZHBvaW50cxgBIAEoCRIMCgRwYXRoGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIIrABCg1IVFRQR2V0QWN0aW9uEgwKBHBhdGgYASABKAkSPgoEcG9ydBgCIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLnV0aWwuaW50c3RyLkludE9yU3RyaW5nEgwKBGhvc3QYAyABKAkSDgoGc2NoZW1lGAQgASgJEjMKC2h0dHBIZWFkZXJzGAUgAygLMh4uazhzLmlvLmFwaS5jb3JlLnYxLkhUVFBIZWFkZXIiKQoKSFRUUEhlYWRlchIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIioKCUhvc3RBbGlhcxIKCgJpcBgBIAEoCRIRCglob3N0bmFtZXMYAiADKAkiFAoGSG9zdElQEgoKAmlwGAEgASgJIjIKFEhvc3RQYXRoVm9sdW1lU291cmNlEgwKBHBhdGgYASABKAkSDAoEdHlwZRgCIAEoCSKbAgobSVNDU0lQZXJzaXN0ZW50Vm9sdW1lU291cmNlEhQKDHRhcmdldFBvcnRhbBgBIAEoCRILCgNpcW4YAiABKAkSCwoDbHVuGAMgASgFEhYKDmlzY3NpSW50ZXJmYWNlGAQgASgJEg4KBmZzVHlwZRgFIAEoCRIQCghyZWFkT25seRgGIAEoCBIPCgdwb3J0YWxzGAcgAygJEhkKEWNoYXBBdXRoRGlzY292ZXJ5GAggASgIEhcKD2NoYXBBdXRoU2Vzc2lvbhgLIAEoCBI2CglzZWNyZXRSZWYYCiABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlEhUKDWluaXRpYXRvck5hbWUYDCABKAkilgIKEUlTQ1NJVm9sdW1lU291cmNlEhQKDHRhcmdldFBvcnRhbBgBIAEoCRILCgNpcW4YAiABKAkSCwoDbHVuGAMgASgFEhYKDmlzY3NpSW50ZXJmYWNlGAQgASgJEg4KBmZzVHlwZRgFIAEoCRIQCghyZWFkT25seRgGIAEoCBIPCgdwb3J0YWxzGAcgAygJEhkKEWNoYXBBdXRoRGlzY292ZXJ5GAggASgIEhcKD2NoYXBBdXRoU2Vzc2lvbhgLIAEoCBI7CglzZWNyZXRSZWYYCiABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2USFQoNaW5pdGlhdG9yTmFtZRgMIAEoCSI6ChFJbWFnZVZvbHVtZVNvdXJjZRIRCglyZWZlcmVuY2UYASABKAkSEgoKcHVsbFBvbGljeRgCIAEoCSI0CglLZXlUb1BhdGgSCwoDa2V5GAEgASgJEgwKBHBhdGgYAiABKAkSDAoEbW9kZRgDIAEoBSKPAQoJTGlmZWN5Y2xlEjcKCXBvc3RTdGFydBgBIAEoCzIkLms4cy5pby5hcGkuY29yZS52MS5MaWZlY3ljbGVIYW5kbGVyEjUKB3ByZVN0b3AYAiABKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuTGlmZWN5Y2xlSGFuZGxlchISCgpzdG9wU2lnbmFsGAMgASgJItwBChBMaWZlY3ljbGVIYW5kbGVyEiwKBGV4ZWMYASABKAsyHi5rOHMuaW8uYXBpLmNvcmUudjEuRXhlY0FjdGlvbhIyCgdodHRwR2V0GAIgASgLMiEuazhzLmlvLmFwaS5jb3JlLnYxLkhUVFBHZXRBY3Rpb24SNgoJdGNwU29ja2V0GAMgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlRDUFNvY2tldEFjdGlvbhIuCgVzbGVlcBgEIAEoCzIfLms4cy5pby5hcGkuY29yZS52MS5TbGVlcEFjdGlvbiKCAQoKTGltaXRSYW5nZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjAKBHNwZWMYAiABKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuTGltaXRSYW5nZVNwZWMi7AYKDkxpbWl0UmFuZ2VJdGVtEgwKBHR5cGUYASABKAkSOAoDbWF4GAIgAygLMisuazhzLmlvLmFwaS5jb3JlLnYxLkxpbWl0UmFuZ2VJdGVtLk1heEVudHJ5EjgKA21pbhgDIAMoCzIrLms4cy5pby5hcGkuY29yZS52MS5MaW1pdFJhbmdlSXRlbS5NaW5FbnRyeRJACgdkZWZhdWx0GAQgAygLMi8uazhzLmlvLmFwaS5jb3JlLnYxLkxpbWl0UmFuZ2VJdGVtLkRlZmF1bHRFbnRyeRJOCg5kZWZhdWx0UmVxdWVzdBgFIAMoCzI2Lms4cy5pby5hcGkuY29yZS52MS5MaW1pdFJhbmdlSXRlbS5EZWZhdWx0UmVxdWVzdEVudHJ5EloKFG1heExpbWl0UmVxdWVzdFJhdGlvGAYgAygLMjwuazhzLmlvLmFwaS5jb3JlLnYxLkxpbWl0UmFuZ2VJdGVtLk1heExpbWl0UmVxdWVzdFJhdGlvRW50cnkaWgoITWF4RW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ARpaCghNaW5FbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBGl4KDERlZmF1bHRFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBGmUKE0RlZmF1bHRSZXF1ZXN0RW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ARprChlNYXhMaW1pdFJlcXVlc3RSYXRpb0VudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEigQEKDkxpbWl0UmFuZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEi0KBWl0ZW1zGAIgAygLMh4uazhzLmlvLmFwaS5jb3JlLnYxLkxpbWl0UmFuZ2UiRAoOTGltaXRSYW5nZVNwZWMSMgoGbGltaXRzGAEgAygLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkxpbWl0UmFuZ2VJdGVtIkoKEkxpbnV4Q29udGFpbmVyVXNlchILCgN1aWQYASABKAMSCwoDZ2lkGAIgASgDEhoKEnN1cHBsZW1lbnRhbEdyb3VwcxgDIAMoAyKGAQoETGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLms4cy5pby5hcGltYWNoaW5lcnkucGtnLnJ1bnRpbWUuUmF3RXh0ZW5zaW9uInIKE0xvYWRCYWxhbmNlckluZ3Jlc3MSCgoCaXAYASABKAkSEAoIaG9zdG5hbWUYAiABKAkSDgoGaXBNb2RlGAMgASgJEi0KBXBvcnRzGAQgAygLMh4uazhzLmlvLmFwaS5jb3JlLnYxLlBvcnRTdGF0dXMiTgoSTG9hZEJhbGFuY2VyU3RhdHVzEjgKB2luZ3Jlc3MYASADKAsyJy5rOHMuaW8uYXBpLmNvcmUudjEuTG9hZEJhbGFuY2VySW5ncmVzcyIkChRMb2NhbE9iamVjdFJlZmVyZW5jZRIMCgRuYW1lGAEgASgJIjEKEUxvY2FsVm9sdW1lU291cmNlEgwKBHBhdGgYASABKAkSDgoGZnNUeXBlGAIgASgJIk0KEk1vZGlmeVZvbHVtZVN0YXR1cxInCh90YXJnZXRWb2x1bWVBdHRyaWJ1dGVzQ2xhc3NOYW1lGAEgASgJEg4KBnN0YXR1cxgCIAEoCSJBCg9ORlNWb2x1bWVTb3VyY2USDgoGc2VydmVyGAEgASgJEgwKBHBhdGgYAiABKAkSEAoIcmVhZE9ubHkYAyABKAgitQEKCU5hbWVzcGFjZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEi8KBHNwZWMYAiABKAsyIS5rOHMuaW8uYXBpLmNvcmUudjEuTmFtZXNwYWNlU3BlYxIzCgZzdGF0dXMYAyABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuTmFtZXNwYWNlU3RhdHVzIpsBChJOYW1lc3BhY2VDb25kaXRpb24SDAoEdHlwZRgBIAEoCRIOCgZzdGF0dXMYAiABKAkSRgoSbGFzdFRyYW5zaXRpb25UaW1lGAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDgoGcmVhc29uGAUgASgJEg8KB21lc3NhZ2UYBiABKAkifwoNTmFtZXNwYWNlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRIsCgVpdGVtcxgCIAMoCzIdLms4cy5pby5hcGkuY29yZS52MS5OYW1lc3BhY2UiIwoNTmFtZXNwYWNlU3BlYxISCgpmaW5hbGl6ZXJzGAEgAygJIlwKD05hbWVzcGFjZVN0YXR1cxINCgVwaGFzZRgBIAEoCRI6Cgpjb25kaXRpb25zGAIgAygLMiYuazhzLmlvLmFwaS5jb3JlLnYxLk5hbWVzcGFjZUNvbmRpdGlvbiKmAQoETm9kZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEioKBHNwZWMYAiABKAsyHC5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZVNwZWMSLgoGc3RhdHVzGAMgASgLMh4uazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVTdGF0dXMiLAoLTm9kZUFkZHJlc3MSDAoEdHlwZRgBIAEoCRIPCgdhZGRyZXNzGAIgASgJIs4BCgxOb2RlQWZmaW5pdHkSWAoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbhgBIAEoCzIgLms4cy5pby5hcGkuY29yZS52MS5Ob2RlU2VsZWN0b3ISZAovcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24YAiADKAsyKy5rOHMuaW8uYXBpLmNvcmUudjEuUHJlZmVycmVkU2NoZWR1bGluZ1Rlcm0i3QEKDU5vZGVDb25kaXRpb24SDAoEdHlwZRgBIAEoCRIOCgZzdGF0dXMYAiABKAkSRQoRbGFzdEhlYXJ0YmVhdFRpbWUYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJGChJsYXN0VHJhbnNpdGlvblRpbWUYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRIOCgZyZWFzb24YBSABKAkSDwoHbWVzc2FnZRgGIAEoCSJUChBOb2RlQ29uZmlnU291cmNlEkAKCWNvbmZpZ01hcBgCIAEoCzItLms4cy5pby5hcGkuY29yZS52MS5Db25maWdNYXBOb2RlQ29uZmlnU291cmNlIswBChBOb2RlQ29uZmlnU3RhdHVzEjYKCGFzc2lnbmVkGAEgASgLMiQuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVDb25maWdTb3VyY2USNAoGYWN0aXZlGAIgASgLMiQuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVDb25maWdTb3VyY2USOwoNbGFzdEtub3duR29vZBgDIAEoCzIkLms4cy5pby5hcGkuY29yZS52MS5Ob2RlQ29uZmlnU291cmNlEg0KBWVycm9yGAQgASgJIlIKE05vZGVEYWVtb25FbmRwb2ludHMSOwoPa3ViZWxldEVuZHBvaW50GAEgASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkRhZW1vbkVuZHBvaW50IjAKDE5vZGVGZWF0dXJlcxIgChhzdXBwbGVtZW50YWxHcm91cHNQb2xpY3kYASABKAgidQoITm9kZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESJwoFaXRlbXMYAiADKAsyGC5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZSIgChBOb2RlUHJveHlPcHRpb25zEgwKBHBhdGgYASABKAkiZAoSTm9kZVJ1bnRpbWVIYW5kbGVyEgwKBG5hbWUYASABKAkSQAoIZmVhdHVyZXMYAiABKAsyLi5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZVJ1bnRpbWVIYW5kbGVyRmVhdHVyZXMiVQoaTm9kZVJ1bnRpbWVIYW5kbGVyRmVhdHVyZXMSHwoXcmVjdXJzaXZlUmVhZE9ubHlNb3VudHMYASABKAgSFgoOdXNlck5hbWVzcGFjZXMYAiABKAgiTwoMTm9kZVNlbGVjdG9yEj8KEW5vZGVTZWxlY3RvclRlcm1zGAEgAygLMiQuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVTZWxlY3RvclRlcm0iSAoXTm9kZVNlbGVjdG9yUmVxdWlyZW1lbnQSCwoDa2V5GAEgASgJEhAKCG9wZXJhdG9yGAIgASgJEg4KBnZhbHVlcxgDIAMoCSKbAQoQTm9kZVNlbGVjdG9yVGVybRJFChBtYXRjaEV4cHJlc3Npb25zGAEgAygLMisuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVTZWxlY3RvclJlcXVpcmVtZW50EkAKC21hdGNoRmllbGRzGAIgAygLMisuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVTZWxlY3RvclJlcXVpcmVtZW50ItMBCghOb2RlU3BlYxIPCgdwb2RDSURSGAEgASgJEhAKCHBvZENJRFJzGAcgAygJEhIKCnByb3ZpZGVySUQYAyABKAkSFQoNdW5zY2hlZHVsYWJsZRgEIAEoCBIpCgZ0YWludHMYBSADKAsyGS5rOHMuaW8uYXBpLmNvcmUudjEuVGFpbnQSOgoMY29uZmlnU291cmNlGAYgASgLMiQuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVDb25maWdTb3VyY2USEgoKZXh0ZXJuYWxJRBgCIAEoCSL7BgoKTm9kZVN0YXR1cxI+CghjYXBhY2l0eRgBIAMoCzIsLms4cy5pby5hcGkuY29yZS52MS5Ob2RlU3RhdHVzLkNhcGFjaXR5RW50cnkSRAoLYWxsb2NhdGFibGUYAiADKAsyLy5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZVN0YXR1cy5BbGxvY2F0YWJsZUVudHJ5Eg0KBXBoYXNlGAMgASgJEjUKCmNvbmRpdGlvbnMYBCADKAsyIS5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZUNvbmRpdGlvbhIyCglhZGRyZXNzZXMYBSADKAsyHy5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZUFkZHJlc3MSQAoPZGFlbW9uRW5kcG9pbnRzGAYgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVEYWVtb25FbmRwb2ludHMSNAoIbm9kZUluZm8YByABKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuTm9kZVN5c3RlbUluZm8SMgoGaW1hZ2VzGAggAygLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lckltYWdlEhQKDHZvbHVtZXNJblVzZRgJIAMoCRI7Cg92b2x1bWVzQXR0YWNoZWQYCiADKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuQXR0YWNoZWRWb2x1bWUSNAoGY29uZmlnGAsgASgLMiQuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVDb25maWdTdGF0dXMSPwoPcnVudGltZUhhbmRsZXJzGAwgAygLMiYuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVSdW50aW1lSGFuZGxlchIyCghmZWF0dXJlcxgNIAEoCzIgLms4cy5pby5hcGkuY29yZS52MS5Ob2RlRmVhdHVyZXMaXwoNQ2FwYWNpdHlFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBGmIKEEFsbG9jYXRhYmxlRW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ASIiCg5Ob2RlU3dhcFN0YXR1cxIQCghjYXBhY2l0eRgBIAEoAyKjAgoOTm9kZVN5c3RlbUluZm8SEQoJbWFjaGluZUlEGAEgASgJEhIKCnN5c3RlbVVVSUQYAiABKAkSDgoGYm9vdElEGAMgASgJEhUKDWtlcm5lbFZlcnNpb24YBCABKAkSDwoHb3NJbWFnZRgFIAEoCRIfChdjb250YWluZXJSdW50aW1lVmVyc2lvbhgGIAEoCRIWCg5rdWJlbGV0VmVyc2lvbhgHIAEoCRIYChBrdWJlUHJveHlWZXJzaW9uGAggASgJEhcKD29wZXJhdGluZ1N5c3RlbRgJIAEoCRIUCgxhcmNoaXRlY3R1cmUYCiABKAkSMAoEc3dhcBgLIAEoCzIiLms4cy5pby5hcGkuY29yZS52MS5Ob2RlU3dhcFN0YXR1cyI8ChNPYmplY3RGaWVsZFNlbGVjdG9yEhIKCmFwaVZlcnNpb24YASABKAkSEQoJZmllbGRQYXRoGAIgASgJIo0BCg9PYmplY3RSZWZlcmVuY2USDAoEa2luZBgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDAoEbmFtZRgDIAEoCRILCgN1aWQYBCABKAkSEgoKYXBpVmVyc2lvbhgFIAEoCRIXCg9yZXNvdXJjZVZlcnNpb24YBiABKAkSEQoJZmllbGRQYXRoGAcgASgJIsoBChBQZXJzaXN0ZW50Vm9sdW1lEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESNgoEc3BlYxgCIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lU3BlYxI6CgZzdGF0dXMYAyABKAsyKi5rOHMuaW8uYXBpLmNvcmUudjEuUGVyc2lzdGVudFZvbHVtZVN0YXR1cyLZAQoVUGVyc2lzdGVudFZvbHVtZUNsYWltEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESOwoEc3BlYxgCIAEoCzItLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1TcGVjEj8KBnN0YXR1cxgDIAEoCzIvLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1TdGF0dXMi6gEKHlBlcnNpc3RlbnRWb2x1bWVDbGFpbUNvbmRpdGlvbhIMCgR0eXBlGAEgASgJEg4KBnN0YXR1cxgCIAEoCRJBCg1sYXN0UHJvYmVUaW1lGAMgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSRgoSbGFzdFRyYW5zaXRpb25UaW1lGAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDgoGcmVhc29uGAUgASgJEg8KB21lc3NhZ2UYBiABKAkilwEKGVBlcnNpc3RlbnRWb2x1bWVDbGFpbUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESOAoFaXRlbXMYAiADKAsyKS5rOHMuaW8uYXBpLmNvcmUudjEuUGVyc2lzdGVudFZvbHVtZUNsYWltIqMDChlQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1TcGVjEhMKC2FjY2Vzc01vZGVzGAEgAygJEkUKCHNlbGVjdG9yGAQgASgLMjMuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxhYmVsU2VsZWN0b3ISQQoJcmVzb3VyY2VzGAIgASgLMi4uazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZVJlc291cmNlUmVxdWlyZW1lbnRzEhIKCnZvbHVtZU5hbWUYAyABKAkSGAoQc3RvcmFnZUNsYXNzTmFtZRgFIAEoCRISCgp2b2x1bWVNb2RlGAYgASgJEkEKCmRhdGFTb3VyY2UYByABKAsyLS5rOHMuaW8uYXBpLmNvcmUudjEuVHlwZWRMb2NhbE9iamVjdFJlZmVyZW5jZRI/Cg1kYXRhU291cmNlUmVmGAggASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLlR5cGVkT2JqZWN0UmVmZXJlbmNlEiEKGXZvbHVtZUF0dHJpYnV0ZXNDbGFzc05hbWUYCSABKAkirgYKG1BlcnNpc3RlbnRWb2x1bWVDbGFpbVN0YXR1cxINCgVwaGFzZRgBIAEoCRITCgthY2Nlc3NNb2RlcxgCIAMoCRJPCghjYXBhY2l0eRgDIAMoCzI9Lms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1TdGF0dXMuQ2FwYWNpdHlFbnRyeRJGCgpjb25kaXRpb25zGAQgAygLMjIuazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVDbGFpbUNvbmRpdGlvbhJjChJhbGxvY2F0ZWRSZXNvdXJjZXMYBSADKAsyRy5rOHMuaW8uYXBpLmNvcmUudjEuUGVyc2lzdGVudFZvbHVtZUNsYWltU3RhdHVzLkFsbG9jYXRlZFJlc291cmNlc0VudHJ5EnEKGWFsbG9jYXRlZFJlc291cmNlU3RhdHVzZXMYByADKAsyTi5rOHMuaW8uYXBpLmNvcmUudjEuUGVyc2lzdGVudFZvbHVtZUNsYWltU3RhdHVzLkFsbG9jYXRlZFJlc291cmNlU3RhdHVzZXNFbnRyeRIoCiBjdXJyZW50Vm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZRgIIAEoCRJCChJtb2RpZnlWb2x1bWVTdGF0dXMYCSABKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuTW9kaWZ5Vm9sdW1lU3RhdHVzGl8KDUNhcGFjaXR5RW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ARppChdBbGxvY2F0ZWRSZXNvdXJjZXNFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBGkAKHkFsbG9jYXRlZFJlc291cmNlU3RhdHVzZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIqABCh1QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1UZW1wbGF0ZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjsKBHNwZWMYAiABKAsyLS5rOHMuaW8uYXBpLmNvcmUudjEuUGVyc2lzdGVudFZvbHVtZUNsYWltU3BlYyJICiFQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1Wb2x1bWVTb3VyY2USEQoJY2xhaW1OYW1lGAEgASgJEhAKCHJlYWRPbmx5GAIgASgIIo0BChRQZXJzaXN0ZW50Vm9sdW1lTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRIzCgVpdGVtcxgCIAMoCzIkLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lIr0LChZQZXJzaXN0ZW50Vm9sdW1lU291cmNlEkwKEWdjZVBlcnNpc3RlbnREaXNrGAEgASgLMjEuazhzLmlvLmFwaS5jb3JlLnYxLkdDRVBlcnNpc3RlbnREaXNrVm9sdW1lU291cmNlElIKFGF3c0VsYXN0aWNCbG9ja1N0b3JlGAIgASgLMjQuazhzLmlvLmFwaS5jb3JlLnYxLkFXU0VsYXN0aWNCbG9ja1N0b3JlVm9sdW1lU291cmNlEjoKCGhvc3RQYXRoGAMgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkhvc3RQYXRoVm9sdW1lU291cmNlEkYKCWdsdXN0ZXJmcxgEIAEoCzIzLms4cy5pby5hcGkuY29yZS52MS5HbHVzdGVyZnNQZXJzaXN0ZW50Vm9sdW1lU291cmNlEjAKA25mcxgFIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5ORlNWb2x1bWVTb3VyY2USOgoDcmJkGAYgASgLMi0uazhzLmlvLmFwaS5jb3JlLnYxLlJCRFBlcnNpc3RlbnRWb2x1bWVTb3VyY2USPgoFaXNjc2kYByABKAsyLy5rOHMuaW8uYXBpLmNvcmUudjEuSVNDU0lQZXJzaXN0ZW50Vm9sdW1lU291cmNlEkAKBmNpbmRlchgIIAEoCzIwLms4cy5pby5hcGkuY29yZS52MS5DaW5kZXJQZXJzaXN0ZW50Vm9sdW1lU291cmNlEkAKBmNlcGhmcxgJIAEoCzIwLms4cy5pby5hcGkuY29yZS52MS5DZXBoRlNQZXJzaXN0ZW50Vm9sdW1lU291cmNlEi4KAmZjGAogASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkZDVm9sdW1lU291cmNlEjgKB2Zsb2NrZXIYCyABKAsyJy5rOHMuaW8uYXBpLmNvcmUudjEuRmxvY2tlclZvbHVtZVNvdXJjZRJCCgpmbGV4Vm9sdW1lGAwgASgLMi4uazhzLmlvLmFwaS5jb3JlLnYxLkZsZXhQZXJzaXN0ZW50Vm9sdW1lU291cmNlEkYKCWF6dXJlRmlsZRgNIAEoCzIzLms4cy5pby5hcGkuY29yZS52MS5BenVyZUZpbGVQZXJzaXN0ZW50Vm9sdW1lU291cmNlEkkKDXZzcGhlcmVWb2x1bWUYDiABKAsyMi5rOHMuaW8uYXBpLmNvcmUudjEuVnNwaGVyZVZpcnR1YWxEaXNrVm9sdW1lU291cmNlEjgKB3F1b2J5dGUYDyABKAsyJy5rOHMuaW8uYXBpLmNvcmUudjEuUXVvYnl0ZVZvbHVtZVNvdXJjZRI8CglhenVyZURpc2sYECABKAsyKS5rOHMuaW8uYXBpLmNvcmUudjEuQXp1cmVEaXNrVm9sdW1lU291cmNlElIKFHBob3RvblBlcnNpc3RlbnREaXNrGBEgASgLMjQuazhzLmlvLmFwaS5jb3JlLnYxLlBob3RvblBlcnNpc3RlbnREaXNrVm9sdW1lU291cmNlEkAKDnBvcnR3b3J4Vm9sdW1lGBIgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLlBvcnR3b3J4Vm9sdW1lU291cmNlEkIKB3NjYWxlSU8YEyABKAsyMS5rOHMuaW8uYXBpLmNvcmUudjEuU2NhbGVJT1BlcnNpc3RlbnRWb2x1bWVTb3VyY2USNAoFbG9jYWwYFCABKAsyJS5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxWb2x1bWVTb3VyY2USRgoJc3RvcmFnZW9zGBUgASgLMjMuazhzLmlvLmFwaS5jb3JlLnYxLlN0b3JhZ2VPU1BlcnNpc3RlbnRWb2x1bWVTb3VyY2USOgoDY3NpGBYgASgLMi0uazhzLmlvLmFwaS5jb3JlLnYxLkNTSVBlcnNpc3RlbnRWb2x1bWVTb3VyY2UipQQKFFBlcnNpc3RlbnRWb2x1bWVTcGVjEkgKCGNhcGFjaXR5GAEgAygLMjYuazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVTcGVjLkNhcGFjaXR5RW50cnkSSgoWcGVyc2lzdGVudFZvbHVtZVNvdXJjZRgCIAEoCzIqLms4cy5pby5hcGkuY29yZS52MS5QZXJzaXN0ZW50Vm9sdW1lU291cmNlEhMKC2FjY2Vzc01vZGVzGAMgAygJEjUKCGNsYWltUmVmGAQgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLk9iamVjdFJlZmVyZW5jZRIlCh1wZXJzaXN0ZW50Vm9sdW1lUmVjbGFpbVBvbGljeRgFIAEoCRIYChBzdG9yYWdlQ2xhc3NOYW1lGAYgASgJEhQKDG1vdW50T3B0aW9ucxgHIAMoCRISCgp2b2x1bWVNb2RlGAggASgJEjwKDG5vZGVBZmZpbml0eRgJIAEoCzImLms4cy5pby5hcGkuY29yZS52MS5Wb2x1bWVOb2RlQWZmaW5pdHkSIQoZdm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZRgKIAEoCRpfCg1DYXBhY2l0eUVudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEilQEKFlBlcnNpc3RlbnRWb2x1bWVTdGF0dXMSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIOCgZyZWFzb24YAyABKAkSSwoXbGFzdFBoYXNlVHJhbnNpdGlvblRpbWUYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSJACiBQaG90b25QZXJzaXN0ZW50RGlza1ZvbHVtZVNvdXJjZRIMCgRwZElEGAEgASgJEg4KBmZzVHlwZRgCIAEoCSKjAQoDUG9kEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESKQoEc3BlYxgCIAEoCzIbLms4cy5pby5hcGkuY29yZS52MS5Qb2RTcGVjEi0KBnN0YXR1cxgDIAEoCzIdLms4cy5pby5hcGkuY29yZS52MS5Qb2RTdGF0dXMi0AEKC1BvZEFmZmluaXR5ElsKLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24YASADKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuUG9kQWZmaW5pdHlUZXJtEmQKL3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uGAIgAygLMisuazhzLmlvLmFwaS5jb3JlLnYxLldlaWdodGVkUG9kQWZmaW5pdHlUZXJtIokCCg9Qb2RBZmZpbml0eVRlcm0SSgoNbGFiZWxTZWxlY3RvchgBIAEoCzIzLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MYWJlbFNlbGVjdG9yEhIKCm5hbWVzcGFjZXMYAiADKAkSEwoLdG9wb2xvZ3lLZXkYAyABKAkSTgoRbmFtZXNwYWNlU2VsZWN0b3IYBCABKAsyMy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGFiZWxTZWxlY3RvchIWCg5tYXRjaExhYmVsS2V5cxgFIAMoCRIZChFtaXNtYXRjaExhYmVsS2V5cxgGIAMoCSLUAQoPUG9kQW50aUFmZmluaXR5ElsKLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24YASADKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuUG9kQWZmaW5pdHlUZXJtEmQKL3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uGAIgAygLMisuazhzLmlvLmFwaS5jb3JlLnYxLldlaWdodGVkUG9kQWZmaW5pdHlUZXJtImEKEFBvZEF0dGFjaE9wdGlvbnMSDQoFc3RkaW4YASABKAgSDgoGc3Rkb3V0GAIgASgIEg4KBnN0ZGVychgDIAEoCBILCgN0dHkYBCABKAgSEQoJY29udGFpbmVyGAUgASgJIvQBCgxQb2RDb25kaXRpb24SDAoEdHlwZRgBIAEoCRIaChJvYnNlcnZlZEdlbmVyYXRpb24YByABKAMSDgoGc3RhdHVzGAIgASgJEkEKDWxhc3RQcm9iZVRpbWUYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJGChJsYXN0VHJhbnNpdGlvblRpbWUYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRIOCgZyZWFzb24YBSABKAkSDwoHbWVzc2FnZRgGIAEoCSJuCgxQb2RETlNDb25maWcSEwoLbmFtZXNlcnZlcnMYASADKAkSEAoIc2VhcmNoZXMYAiADKAkSNwoHb3B0aW9ucxgDIAMoCzImLms4cy5pby5hcGkuY29yZS52MS5Qb2RETlNDb25maWdPcHRpb24iMQoSUG9kRE5TQ29uZmlnT3B0aW9uEgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkicAoOUG9kRXhlY09wdGlvbnMSDQoFc3RkaW4YASABKAgSDgoGc3Rkb3V0GAIgASgIEg4KBnN0ZGVychgDIAEoCBILCgN0dHkYBCABKAgSEQoJY29udGFpbmVyGAUgASgJEg8KB2NvbW1hbmQYBiADKAkiEwoFUG9kSVASCgoCaXAYASABKAkicwoHUG9kTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRImCgVpdGVtcxgCIAMoCzIXLms4cy5pby5hcGkuY29yZS52MS5Qb2QiigIKDVBvZExvZ09wdGlvbnMSEQoJY29udGFpbmVyGAEgASgJEg4KBmZvbGxvdxgCIAEoCBIQCghwcmV2aW91cxgDIAEoCBIUCgxzaW5jZVNlY29uZHMYBCABKAMSPQoJc2luY2VUaW1lGAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEgoKdGltZXN0YW1wcxgGIAEoCBIRCgl0YWlsTGluZXMYByABKAMSEgoKbGltaXRCeXRlcxgIIAEoAxIkChxpbnNlY3VyZVNraXBUTFNWZXJpZnlCYWNrZW5kGAkgASgIEg4KBnN0cmVhbRgKIAEoCSIVCgVQb2RPUxIMCgRuYW1lGAEgASgJIiYKFVBvZFBvcnRGb3J3YXJkT3B0aW9ucxINCgVwb3J0cxgBIAMoBSIfCg9Qb2RQcm94eU9wdGlvbnMSDAoEcGF0aBgBIAEoCSIpChBQb2RSZWFkaW5lc3NHYXRlEhUKDWNvbmRpdGlvblR5cGUYASABKAkiXgoQUG9kUmVzb3VyY2VDbGFpbRIMCgRuYW1lGAEgASgJEhkKEXJlc291cmNlQ2xhaW1OYW1lGAMgASgJEiEKGXJlc291cmNlQ2xhaW1UZW1wbGF0ZU5hbWUYBCABKAkiQQoWUG9kUmVzb3VyY2VDbGFpbVN0YXR1cxIMCgRuYW1lGAEgASgJEhkKEXJlc291cmNlQ2xhaW1OYW1lGAIgASgJIiEKEVBvZFNjaGVkdWxpbmdHYXRlEgwKBG5hbWUYASABKAkiiAQKElBvZFNlY3VyaXR5Q29udGV4dBI6Cg5zZUxpbnV4T3B0aW9ucxgBIAEoCzIiLms4cy5pby5hcGkuY29yZS52MS5TRUxpbnV4T3B0aW9ucxJJCg53aW5kb3dzT3B0aW9ucxgIIAEoCzIxLms4cy5pby5hcGkuY29yZS52MS5XaW5kb3dzU2VjdXJpdHlDb250ZXh0T3B0aW9ucxIRCglydW5Bc1VzZXIYAiABKAMSEgoKcnVuQXNHcm91cBgGIAEoAxIUCgxydW5Bc05vblJvb3QYAyABKAgSGgoSc3VwcGxlbWVudGFsR3JvdXBzGAQgAygDEiAKGHN1cHBsZW1lbnRhbEdyb3Vwc1BvbGljeRgMIAEoCRIPCgdmc0dyb3VwGAUgASgDEisKB3N5c2N0bHMYByADKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuU3lzY3RsEhsKE2ZzR3JvdXBDaGFuZ2VQb2xpY3kYCSABKAkSOgoOc2VjY29tcFByb2ZpbGUYCiABKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjY29tcFByb2ZpbGUSPAoPYXBwQXJtb3JQcm9maWxlGAsgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLkFwcEFybW9yUHJvZmlsZRIbChNzZUxpbnV4Q2hhbmdlUG9saWN5GA0gASgJIlsKDFBvZFNpZ25hdHVyZRJLCg1wb2RDb250cm9sbGVyGAEgASgLMjQuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk93bmVyUmVmZXJlbmNlItoNCgdQb2RTcGVjEisKB3ZvbHVtZXMYASADKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuVm9sdW1lEjUKDmluaXRDb250YWluZXJzGBQgAygLMh0uazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lchIxCgpjb250YWluZXJzGAIgAygLMh0uazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lchJDChNlcGhlbWVyYWxDb250YWluZXJzGCIgAygLMiYuazhzLmlvLmFwaS5jb3JlLnYxLkVwaGVtZXJhbENvbnRhaW5lchIVCg1yZXN0YXJ0UG9saWN5GAMgASgJEiUKHXRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzGAQgASgDEh0KFWFjdGl2ZURlYWRsaW5lU2Vjb25kcxgFIAEoAxIRCglkbnNQb2xpY3kYBiABKAkSQwoMbm9kZVNlbGVjdG9yGAcgAygLMi0uazhzLmlvLmFwaS5jb3JlLnYxLlBvZFNwZWMuTm9kZVNlbGVjdG9yRW50cnkSGgoSc2VydmljZUFjY291bnROYW1lGAggASgJEhYKDnNlcnZpY2VBY2NvdW50GAkgASgJEiQKHGF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW4YFSABKAgSEAoIbm9kZU5hbWUYCiABKAkSEwoLaG9zdE5ldHdvcmsYCyABKAgSDwoHaG9zdFBJRBgMIAEoCBIPCgdob3N0SVBDGA0gASgIEh0KFXNoYXJlUHJvY2Vzc05hbWVzcGFjZRgbIAEoCBI/Cg9zZWN1cml0eUNvbnRleHQYDiABKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuUG9kU2VjdXJpdHlDb250ZXh0EkIKEGltYWdlUHVsbFNlY3JldHMYDyADKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2USEAoIaG9zdG5hbWUYECABKAkSEQoJc3ViZG9tYWluGBEgASgJEi4KCGFmZmluaXR5GBIgASgLMhwuazhzLmlvLmFwaS5jb3JlLnYxLkFmZmluaXR5EhUKDXNjaGVkdWxlck5hbWUYEyABKAkSMwoLdG9sZXJhdGlvbnMYFiADKAsyHi5rOHMuaW8uYXBpLmNvcmUudjEuVG9sZXJhdGlvbhIyCgtob3N0QWxpYXNlcxgXIAMoCzIdLms4cy5pby5hcGkuY29yZS52MS5Ib3N0QWxpYXMSGQoRcHJpb3JpdHlDbGFzc05hbWUYGCABKAkSEAoIcHJpb3JpdHkYGSABKAUSMwoJZG5zQ29uZmlnGBogASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLlBvZEROU0NvbmZpZxI8Cg5yZWFkaW5lc3NHYXRlcxgcIAMoCzIkLms4cy5pby5hcGkuY29yZS52MS5Qb2RSZWFkaW5lc3NHYXRlEhgKEHJ1bnRpbWVDbGFzc05hbWUYHSABKAkSGgoSZW5hYmxlU2VydmljZUxpbmtzGB4gASgIEhgKEHByZWVtcHRpb25Qb2xpY3kYHyABKAkSOwoIb3ZlcmhlYWQYICADKAsyKS5rOHMuaW8uYXBpLmNvcmUudjEuUG9kU3BlYy5PdmVyaGVhZEVudHJ5Ek8KGXRvcG9sb2d5U3ByZWFkQ29uc3RyYWludHMYISADKAsyLC5rOHMuaW8uYXBpLmNvcmUudjEuVG9wb2xvZ3lTcHJlYWRDb25zdHJhaW50EhkKEXNldEhvc3RuYW1lQXNGUUROGCMgASgIEiUKAm9zGCQgASgLMhkuazhzLmlvLmFwaS5jb3JlLnYxLlBvZE9TEhEKCWhvc3RVc2VycxglIAEoCBI+Cg9zY2hlZHVsaW5nR2F0ZXMYJiADKAsyJS5rOHMuaW8uYXBpLmNvcmUudjEuUG9kU2NoZWR1bGluZ0dhdGUSPAoOcmVzb3VyY2VDbGFpbXMYJyADKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuUG9kUmVzb3VyY2VDbGFpbRI7CglyZXNvdXJjZXMYKCABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VSZXF1aXJlbWVudHMaMwoRTm9kZVNlbGVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARpfCg1PdmVyaGVhZEVudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEimAUKCVBvZFN0YXR1cxIaChJvYnNlcnZlZEdlbmVyYXRpb24YESABKAMSDQoFcGhhc2UYASABKAkSNAoKY29uZGl0aW9ucxgCIAMoCzIgLms4cy5pby5hcGkuY29yZS52MS5Qb2RDb25kaXRpb24SDwoHbWVzc2FnZRgDIAEoCRIOCgZyZWFzb24YBCABKAkSGQoRbm9taW5hdGVkTm9kZU5hbWUYCyABKAkSDgoGaG9zdElQGAUgASgJEisKB2hvc3RJUHMYECADKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuSG9zdElQEg0KBXBvZElQGAYgASgJEikKBnBvZElQcxgMIAMoCzIZLms4cy5pby5hcGkuY29yZS52MS5Qb2RJUBI9CglzdGFydFRpbWUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJCChVpbml0Q29udGFpbmVyU3RhdHVzZXMYCiADKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuQ29udGFpbmVyU3RhdHVzEj4KEWNvbnRhaW5lclN0YXR1c2VzGAggAygLMiMuazhzLmlvLmFwaS5jb3JlLnYxLkNvbnRhaW5lclN0YXR1cxIQCghxb3NDbGFzcxgJIAEoCRJHChplcGhlbWVyYWxDb250YWluZXJTdGF0dXNlcxgNIAMoCzIjLms4cy5pby5hcGkuY29yZS52MS5Db250YWluZXJTdGF0dXMSDgoGcmVzaXplGA4gASgJEkkKFXJlc291cmNlQ2xhaW1TdGF0dXNlcxgPIAMoCzIqLms4cy5pby5hcGkuY29yZS52MS5Qb2RSZXNvdXJjZUNsYWltU3RhdHVzIoQBCg9Qb2RTdGF0dXNSZXN1bHQSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRItCgZzdGF0dXMYAiABKAsyHS5rOHMuaW8uYXBpLmNvcmUudjEuUG9kU3RhdHVzIogBCgtQb2RUZW1wbGF0ZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjUKCHRlbXBsYXRlGAIgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFRlbXBsYXRlU3BlYyKDAQoPUG9kVGVtcGxhdGVMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEi4KBWl0ZW1zGAIgAygLMh8uazhzLmlvLmFwaS5jb3JlLnYxLlBvZFRlbXBsYXRlIoABCg9Qb2RUZW1wbGF0ZVNwZWMSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRIpCgRzcGVjGAIgASgLMhsuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFNwZWMiOwoKUG9ydFN0YXR1cxIMCgRwb3J0GAEgASgFEhAKCHByb3RvY29sGAIgASgJEg0KBWVycm9yGAMgASgJIkoKFFBvcnR3b3J4Vm9sdW1lU291cmNlEhAKCHZvbHVtZUlEGAEgASgJEg4KBmZzVHlwZRgCIAEoCRIQCghyZWFkT25seRgDIAEoCCIcCg1QcmVjb25kaXRpb25zEgsKA3VpZBgBIAEoCSKxAQoUUHJlZmVyQXZvaWRQb2RzRW50cnkSNgoMcG9kU2lnbmF0dXJlGAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFNpZ25hdHVyZRJACgxldmljdGlvblRpbWUYAiABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRIOCgZyZWFzb24YAyABKAkSDwoHbWVzc2FnZRgEIAEoCSJjChdQcmVmZXJyZWRTY2hlZHVsaW5nVGVybRIOCgZ3ZWlnaHQYASABKAUSOAoKcHJlZmVyZW5jZRgCIAEoCzIkLms4cy5pby5hcGkuY29yZS52MS5Ob2RlU2VsZWN0b3JUZXJtIuEBCgVQcm9iZRIxCgdoYW5kbGVyGAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLlByb2JlSGFuZGxlchIbChNpbml0aWFsRGVsYXlTZWNvbmRzGAIgASgFEhYKDnRpbWVvdXRTZWNvbmRzGAMgASgFEhUKDXBlcmlvZFNlY29uZHMYBCABKAUSGAoQc3VjY2Vzc1RocmVzaG9sZBgFIAEoBRIYChBmYWlsdXJlVGhyZXNob2xkGAYgASgFEiUKHXRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzGAcgASgDItYBCgxQcm9iZUhhbmRsZXISLAoEZXhlYxgBIAEoCzIeLms4cy5pby5hcGkuY29yZS52MS5FeGVjQWN0aW9uEjIKB2h0dHBHZXQYAiABKAsyIS5rOHMuaW8uYXBpLmNvcmUudjEuSFRUUEdldEFjdGlvbhI2Cgl0Y3BTb2NrZXQYAyABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuVENQU29ja2V0QWN0aW9uEiwKBGdycGMYBCABKAsyHi5rOHMuaW8uYXBpLmNvcmUudjEuR1JQQ0FjdGlvbiJjChVQcm9qZWN0ZWRWb2x1bWVTb3VyY2USNQoHc291cmNlcxgBIAMoCzIkLms4cy5pby5hcGkuY29yZS52MS5Wb2x1bWVQcm9qZWN0aW9uEhMKC2RlZmF1bHRNb2RlGAIgASgFInYKE1F1b2J5dGVWb2x1bWVTb3VyY2USEAoIcmVnaXN0cnkYASABKAkSDgoGdm9sdW1lGAIgASgJEhAKCHJlYWRPbmx5GAMgASgIEgwKBHVzZXIYBCABKAkSDQoFZ3JvdXAYBSABKAkSDgoGdGVuYW50GAYgASgJIsMBChlSQkRQZXJzaXN0ZW50Vm9sdW1lU291cmNlEhAKCG1vbml0b3JzGAEgAygJEg0KBWltYWdlGAIgASgJEg4KBmZzVHlwZRgDIAEoCRIMCgRwb29sGAQgASgJEgwKBHVzZXIYBSABKAkSDwoHa2V5cmluZxgGIAEoCRI2CglzZWNyZXRSZWYYByABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UmVmZXJlbmNlEhAKCHJlYWRPbmx5GAggASgIIr4BCg9SQkRWb2x1bWVTb3VyY2USEAoIbW9uaXRvcnMYASADKAkSDQoFaW1hZ2UYAiABKAkSDgoGZnNUeXBlGAMgASgJEgwKBHBvb2wYBCABKAkSDAoEdXNlchgFIAEoCRIPCgdrZXlyaW5nGAYgASgJEjsKCXNlY3JldFJlZhgHIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZRIQCghyZWFkT25seRgIIAEoCCJyCg9SYW5nZUFsbG9jYXRpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRINCgVyYW5nZRgCIAEoCRIMCgRkYXRhGAMgASgMItkBChVSZXBsaWNhdGlvbkNvbnRyb2xsZXISQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRI7CgRzcGVjGAIgASgLMi0uazhzLmlvLmFwaS5jb3JlLnYxLlJlcGxpY2F0aW9uQ29udHJvbGxlclNwZWMSPwoGc3RhdHVzGAMgASgLMi8uazhzLmlvLmFwaS5jb3JlLnYxLlJlcGxpY2F0aW9uQ29udHJvbGxlclN0YXR1cyKnAQoeUmVwbGljYXRpb25Db250cm9sbGVyQ29uZGl0aW9uEgwKBHR5cGUYASABKAkSDgoGc3RhdHVzGAIgASgJEkYKEmxhc3RUcmFuc2l0aW9uVGltZRgDIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg4KBnJlYXNvbhgEIAEoCRIPCgdtZXNzYWdlGAUgASgJIpcBChlSZXBsaWNhdGlvbkNvbnRyb2xsZXJMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjgKBWl0ZW1zGAIgAygLMikuazhzLmlvLmFwaS5jb3JlLnYxLlJlcGxpY2F0aW9uQ29udHJvbGxlciL9AQoZUmVwbGljYXRpb25Db250cm9sbGVyU3BlYxIQCghyZXBsaWNhcxgBIAEoBRIXCg9taW5SZWFkeVNlY29uZHMYBCABKAUSTQoIc2VsZWN0b3IYAiADKAsyOy5rOHMuaW8uYXBpLmNvcmUudjEuUmVwbGljYXRpb25Db250cm9sbGVyU3BlYy5TZWxlY3RvckVudHJ5EjUKCHRlbXBsYXRlGAMgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlBvZFRlbXBsYXRlU3BlYxovCg1TZWxlY3RvckVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEi4wEKG1JlcGxpY2F0aW9uQ29udHJvbGxlclN0YXR1cxIQCghyZXBsaWNhcxgBIAEoBRIcChRmdWxseUxhYmVsZWRSZXBsaWNhcxgCIAEoBRIVCg1yZWFkeVJlcGxpY2FzGAQgASgFEhkKEWF2YWlsYWJsZVJlcGxpY2FzGAUgASgFEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgDIAEoAxJGCgpjb25kaXRpb25zGAYgAygLMjIuazhzLmlvLmFwaS5jb3JlLnYxLlJlcGxpY2F0aW9uQ29udHJvbGxlckNvbmRpdGlvbiIuCg1SZXNvdXJjZUNsYWltEgwKBG5hbWUYASABKAkSDwoHcmVxdWVzdBgCIAEoCSKBAQoVUmVzb3VyY2VGaWVsZFNlbGVjdG9yEhUKDWNvbnRhaW5lck5hbWUYASABKAkSEAoIcmVzb3VyY2UYAiABKAkSPwoHZGl2aXNvchgDIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eSI0Cg5SZXNvdXJjZUhlYWx0aBISCgpyZXNvdXJjZUlEGAEgASgJEg4KBmhlYWx0aBgCIAEoCSLBAQoNUmVzb3VyY2VRdW90YRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjMKBHNwZWMYAiABKAsyJS5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VRdW90YVNwZWMSNwoGc3RhdHVzGAMgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUXVvdGFTdGF0dXMihwEKEVJlc291cmNlUXVvdGFMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjAKBWl0ZW1zGAIgAygLMiEuazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUXVvdGEi+QEKEVJlc291cmNlUXVvdGFTcGVjEj0KBGhhcmQYASADKAsyLy5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VRdW90YVNwZWMuSGFyZEVudHJ5Eg4KBnNjb3BlcxgCIAMoCRI4Cg1zY29wZVNlbGVjdG9yGAMgASgLMiEuazhzLmlvLmFwaS5jb3JlLnYxLlNjb3BlU2VsZWN0b3IaWwoJSGFyZEVudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEi0QIKE1Jlc291cmNlUXVvdGFTdGF0dXMSPwoEaGFyZBgBIAMoCzIxLms4cy5pby5hcGkuY29yZS52MS5SZXNvdXJjZVF1b3RhU3RhdHVzLkhhcmRFbnRyeRI/CgR1c2VkGAIgAygLMjEuazhzLmlvLmFwaS5jb3JlLnYxLlJlc291cmNlUXVvdGFTdGF0dXMuVXNlZEVudHJ5GlsKCUhhcmRFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBGlsKCVVzZWRFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBIpkDChRSZXNvdXJjZVJlcXVpcmVtZW50cxJECgZsaW1pdHMYASADKAsyNC5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VSZXF1aXJlbWVudHMuTGltaXRzRW50cnkSSAoIcmVxdWVzdHMYAiADKAsyNi5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VSZXF1aXJlbWVudHMuUmVxdWVzdHNFbnRyeRIxCgZjbGFpbXMYAyADKAsyIS5rOHMuaW8uYXBpLmNvcmUudjEuUmVzb3VyY2VDbGFpbRpdCgtMaW1pdHNFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGkucmVzb3VyY2UuUXVhbnRpdHk6AjgBGl8KDVJlcXVlc3RzRW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ASJVCg5SZXNvdXJjZVN0YXR1cxIMCgRuYW1lGAEgASgJEjUKCXJlc291cmNlcxgCIAMoCzIiLms4cy5pby5hcGkuY29yZS52MS5SZXNvdXJjZUhlYWx0aCJJCg5TRUxpbnV4T3B0aW9ucxIMCgR1c2VyGAEgASgJEgwKBHJvbGUYAiABKAkSDAoEdHlwZRgDIAEoCRINCgVsZXZlbBgEIAEoCSKGAgodU2NhbGVJT1BlcnNpc3RlbnRWb2x1bWVTb3VyY2USDwoHZ2F0ZXdheRgBIAEoCRIOCgZzeXN0ZW0YAiABKAkSNgoJc2VjcmV0UmVmGAMgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFJlZmVyZW5jZRISCgpzc2xFbmFibGVkGAQgASgIEhgKEHByb3RlY3Rpb25Eb21haW4YBSABKAkSEwoLc3RvcmFnZVBvb2wYBiABKAkSEwoLc3RvcmFnZU1vZGUYByABKAkSEgoKdm9sdW1lTmFtZRgIIAEoCRIOCgZmc1R5cGUYCSABKAkSEAoIcmVhZE9ubHkYCiABKAgigQIKE1NjYWxlSU9Wb2x1bWVTb3VyY2USDwoHZ2F0ZXdheRgBIAEoCRIOCgZzeXN0ZW0YAiABKAkSOwoJc2VjcmV0UmVmGAMgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEhIKCnNzbEVuYWJsZWQYBCABKAgSGAoQcHJvdGVjdGlvbkRvbWFpbhgFIAEoCRITCgtzdG9yYWdlUG9vbBgGIAEoCRITCgtzdG9yYWdlTW9kZRgHIAEoCRISCgp2b2x1bWVOYW1lGAggASgJEg4KBmZzVHlwZRgJIAEoCRIQCghyZWFkT25seRgKIAEoCCJgCg1TY29wZVNlbGVjdG9yEk8KEG1hdGNoRXhwcmVzc2lvbnMYASADKAsyNS5rOHMuaW8uYXBpLmNvcmUudjEuU2NvcGVkUmVzb3VyY2VTZWxlY3RvclJlcXVpcmVtZW50IlgKIVNjb3BlZFJlc291cmNlU2VsZWN0b3JSZXF1aXJlbWVudBIRCglzY29wZU5hbWUYASABKAkSEAoIb3BlcmF0b3IYAiABKAkSDgoGdmFsdWVzGAMgAygJIjgKDlNlY2NvbXBQcm9maWxlEgwKBHR5cGUYASABKAkSGAoQbG9jYWxob3N0UHJvZmlsZRgCIAEoCSLBAgoGU2VjcmV0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESEQoJaW1tdXRhYmxlGAUgASgIEjIKBGRhdGEYAiADKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0LkRhdGFFbnRyeRI+CgpzdHJpbmdEYXRhGAQgAygLMiouazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldC5TdHJpbmdEYXRhRW50cnkSDAoEdHlwZRgDIAEoCRorCglEYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgMOgI4ARoxCg9TdHJpbmdEYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJrCg9TZWNyZXRFbnZTb3VyY2USRgoUbG9jYWxPYmplY3RSZWZlcmVuY2UYASABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2USEAoIb3B0aW9uYWwYAiABKAgiegoRU2VjcmV0S2V5U2VsZWN0b3ISRgoUbG9jYWxPYmplY3RSZWZlcmVuY2UYASABKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2USCwoDa2V5GAIgASgJEhAKCG9wdGlvbmFsGAMgASgIInkKClNlY3JldExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESKQoFaXRlbXMYAiADKAsyGi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0IpoBChBTZWNyZXRQcm9qZWN0aW9uEkYKFGxvY2FsT2JqZWN0UmVmZXJlbmNlGAEgASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLkxvY2FsT2JqZWN0UmVmZXJlbmNlEiwKBWl0ZW1zGAIgAygLMh0uazhzLmlvLmFwaS5jb3JlLnYxLktleVRvUGF0aBIQCghvcHRpb25hbBgEIAEoCCIyCg9TZWNyZXRSZWZlcmVuY2USDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkifQoSU2VjcmV0Vm9sdW1lU291cmNlEhIKCnNlY3JldE5hbWUYASABKAkSLAoFaXRlbXMYAiADKAsyHS5rOHMuaW8uYXBpLmNvcmUudjEuS2V5VG9QYXRoEhMKC2RlZmF1bHRNb2RlGAMgASgFEhAKCG9wdGlvbmFsGAQgASgIIvADCg9TZWN1cml0eUNvbnRleHQSNgoMY2FwYWJpbGl0aWVzGAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLkNhcGFiaWxpdGllcxISCgpwcml2aWxlZ2VkGAIgASgIEjoKDnNlTGludXhPcHRpb25zGAMgASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLlNFTGludXhPcHRpb25zEkkKDndpbmRvd3NPcHRpb25zGAogASgLMjEuazhzLmlvLmFwaS5jb3JlLnYxLldpbmRvd3NTZWN1cml0eUNvbnRleHRPcHRpb25zEhEKCXJ1bkFzVXNlchgEIAEoAxISCgpydW5Bc0dyb3VwGAggASgDEhQKDHJ1bkFzTm9uUm9vdBgFIAEoCBIeChZyZWFkT25seVJvb3RGaWxlc3lzdGVtGAYgASgIEiAKGGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbhgHIAEoCBIRCglwcm9jTW91bnQYCSABKAkSOgoOc2VjY29tcFByb2ZpbGUYCyABKAsyIi5rOHMuaW8uYXBpLmNvcmUudjEuU2VjY29tcFByb2ZpbGUSPAoPYXBwQXJtb3JQcm9maWxlGAwgASgLMiMuazhzLmlvLmFwaS5jb3JlLnYxLkFwcEFybW9yUHJvZmlsZSJNChNTZXJpYWxpemVkUmVmZXJlbmNlEjYKCXJlZmVyZW5jZRgBIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5PYmplY3RSZWZlcmVuY2UirwEKB1NlcnZpY2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRItCgRzcGVjGAIgASgLMh8uazhzLmlvLmFwaS5jb3JlLnYxLlNlcnZpY2VTcGVjEjEKBnN0YXR1cxgDIAEoCzIhLms4cy5pby5hcGkuY29yZS52MS5TZXJ2aWNlU3RhdHVzIvQBCg5TZXJ2aWNlQWNjb3VudBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEjQKB3NlY3JldHMYAiADKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuT2JqZWN0UmVmZXJlbmNlEkIKEGltYWdlUHVsbFNlY3JldHMYAyADKAsyKC5rOHMuaW8uYXBpLmNvcmUudjEuTG9jYWxPYmplY3RSZWZlcmVuY2USJAocYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlbhgEIAEoCCKJAQoSU2VydmljZUFjY291bnRMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjEKBWl0ZW1zGAIgAygLMiIuazhzLmlvLmFwaS5jb3JlLnYxLlNlcnZpY2VBY2NvdW50IloKHVNlcnZpY2VBY2NvdW50VG9rZW5Qcm9qZWN0aW9uEhAKCGF1ZGllbmNlGAEgASgJEhkKEWV4cGlyYXRpb25TZWNvbmRzGAIgASgDEgwKBHBhdGgYAyABKAkiewoLU2VydmljZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESKgoFaXRlbXMYAiADKAsyGy5rOHMuaW8uYXBpLmNvcmUudjEuU2VydmljZSKoAQoLU2VydmljZVBvcnQSDAoEbmFtZRgBIAEoCRIQCghwcm90b2NvbBgCIAEoCRITCgthcHBQcm90b2NvbBgGIAEoCRIMCgRwb3J0GAMgASgFEkQKCnRhcmdldFBvcnQYBCABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy51dGlsLmludHN0ci5JbnRPclN0cmluZxIQCghub2RlUG9ydBgFIAEoBSIjChNTZXJ2aWNlUHJveHlPcHRpb25zEgwKBHBhdGgYASABKAkitAUKC1NlcnZpY2VTcGVjEi4KBXBvcnRzGAEgAygLMh8uazhzLmlvLmFwaS5jb3JlLnYxLlNlcnZpY2VQb3J0Ej8KCHNlbGVjdG9yGAIgAygLMi0uazhzLmlvLmFwaS5jb3JlLnYxLlNlcnZpY2VTcGVjLlNlbGVjdG9yRW50cnkSEQoJY2x1c3RlcklQGAMgASgJEhIKCmNsdXN0ZXJJUHMYEiADKAkSDAoEdHlwZRgEIAEoCRITCgtleHRlcm5hbElQcxgFIAMoCRIXCg9zZXNzaW9uQWZmaW5pdHkYByABKAkSFgoObG9hZEJhbGFuY2VySVAYCCABKAkSIAoYbG9hZEJhbGFuY2VyU291cmNlUmFuZ2VzGAkgAygJEhQKDGV4dGVybmFsTmFtZRgKIAEoCRIdChVleHRlcm5hbFRyYWZmaWNQb2xpY3kYCyABKAkSGwoTaGVhbHRoQ2hlY2tOb2RlUG9ydBgMIAEoBRIgChhwdWJsaXNoTm90UmVhZHlBZGRyZXNzZXMYDSABKAgSSAoVc2Vzc2lvbkFmZmluaXR5Q29uZmlnGA4gASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLlNlc3Npb25BZmZpbml0eUNvbmZpZxISCgppcEZhbWlsaWVzGBMgAygJEhYKDmlwRmFtaWx5UG9saWN5GBEgASgJEiUKHWFsbG9jYXRlTG9hZEJhbGFuY2VyTm9kZVBvcnRzGBQgASgIEhkKEWxvYWRCYWxhbmNlckNsYXNzGBUgASgJEh0KFWludGVybmFsVHJhZmZpY1BvbGljeRgWIAEoCRIbChN0cmFmZmljRGlzdHJpYnV0aW9uGBcgASgJGi8KDVNlbGVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKSAQoNU2VydmljZVN0YXR1cxI8Cgxsb2FkQmFsYW5jZXIYASABKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuTG9hZEJhbGFuY2VyU3RhdHVzEkMKCmNvbmRpdGlvbnMYAiADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uIk0KFVNlc3Npb25BZmZpbml0eUNvbmZpZxI0CghjbGllbnRJUBgBIAEoCzIiLms4cy5pby5hcGkuY29yZS52MS5DbGllbnRJUENvbmZpZyIeCgtTbGVlcEFjdGlvbhIPCgdzZWNvbmRzGAEgASgDIqgBCh9TdG9yYWdlT1NQZXJzaXN0ZW50Vm9sdW1lU291cmNlEhIKCnZvbHVtZU5hbWUYASABKAkSFwoPdm9sdW1lTmFtZXNwYWNlGAIgASgJEg4KBmZzVHlwZRgDIAEoCRIQCghyZWFkT25seRgEIAEoCBI2CglzZWNyZXRSZWYYBSABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuT2JqZWN0UmVmZXJlbmNlIqMBChVTdG9yYWdlT1NWb2x1bWVTb3VyY2USEgoKdm9sdW1lTmFtZRgBIAEoCRIXCg92b2x1bWVOYW1lc3BhY2UYAiABKAkSDgoGZnNUeXBlGAMgASgJEhAKCHJlYWRPbmx5GAQgASgIEjsKCXNlY3JldFJlZhgFIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Mb2NhbE9iamVjdFJlZmVyZW5jZSIlCgZTeXNjdGwSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSJfCg9UQ1BTb2NrZXRBY3Rpb24SPgoEcG9ydBgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLnV0aWwuaW50c3RyLkludE9yU3RyaW5nEgwKBGhvc3QYAiABKAkicgoFVGFpbnQSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJEg4KBmVmZmVjdBgDIAEoCRI9Cgl0aW1lQWRkZWQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSJlCgpUb2xlcmF0aW9uEgsKA2tleRgBIAEoCRIQCghvcGVyYXRvchgCIAEoCRINCgV2YWx1ZRgDIAEoCRIOCgZlZmZlY3QYBCABKAkSGQoRdG9sZXJhdGlvblNlY29uZHMYBSABKAMiPwogVG9wb2xvZ3lTZWxlY3RvckxhYmVsUmVxdWlyZW1lbnQSCwoDa2V5GAEgASgJEg4KBnZhbHVlcxgCIAMoCSJrChRUb3BvbG9neVNlbGVjdG9yVGVybRJTChVtYXRjaExhYmVsRXhwcmVzc2lvbnMYASADKAsyNC5rOHMuaW8uYXBpLmNvcmUudjEuVG9wb2xvZ3lTZWxlY3RvckxhYmVsUmVxdWlyZW1lbnQiiQIKGFRvcG9sb2d5U3ByZWFkQ29uc3RyYWludBIPCgdtYXhTa2V3GAEgASgFEhMKC3RvcG9sb2d5S2V5GAIgASgJEhkKEXdoZW5VbnNhdGlzZmlhYmxlGAMgASgJEkoKDWxhYmVsU2VsZWN0b3IYBCABKAsyMy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGFiZWxTZWxlY3RvchISCgptaW5Eb21haW5zGAUgASgFEhoKEm5vZGVBZmZpbml0eVBvbGljeRgGIAEoCRIYChBub2RlVGFpbnRzUG9saWN5GAcgASgJEhYKDm1hdGNoTGFiZWxLZXlzGAggAygJIkkKGVR5cGVkTG9jYWxPYmplY3RSZWZlcmVuY2USEAoIYXBpR3JvdXAYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJIlcKFFR5cGVkT2JqZWN0UmVmZXJlbmNlEhAKCGFwaUdyb3VwGAEgASgJEgwKBGtpbmQYAiABKAkSDAoEbmFtZRgDIAEoCRIRCgluYW1lc3BhY2UYBCABKAkiTgoGVm9sdW1lEgwKBG5hbWUYASABKAkSNgoMdm9sdW1lU291cmNlGAIgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZVNvdXJjZSIwCgxWb2x1bWVEZXZpY2USDAoEbmFtZRgBIAEoCRISCgpkZXZpY2VQYXRoGAIgASgJIpsBCgtWb2x1bWVNb3VudBIMCgRuYW1lGAEgASgJEhAKCHJlYWRPbmx5GAIgASgIEhkKEXJlY3Vyc2l2ZVJlYWRPbmx5GAcgASgJEhEKCW1vdW50UGF0aBgDIAEoCRIPCgdzdWJQYXRoGAQgASgJEhgKEG1vdW50UHJvcGFnYXRpb24YBSABKAkSEwoLc3ViUGF0aEV4cHIYBiABKAkiYQoRVm9sdW1lTW91bnRTdGF0dXMSDAoEbmFtZRgBIAEoCRIRCgltb3VudFBhdGgYAiABKAkSEAoIcmVhZE9ubHkYAyABKAgSGQoRcmVjdXJzaXZlUmVhZE9ubHkYBCABKAkiSAoSVm9sdW1lTm9kZUFmZmluaXR5EjIKCHJlcXVpcmVkGAEgASgLMiAuazhzLmlvLmFwaS5jb3JlLnYxLk5vZGVTZWxlY3RvciLiAgoQVm9sdW1lUHJvamVjdGlvbhI0CgZzZWNyZXQYASABKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuU2VjcmV0UHJvamVjdGlvbhI+Cgtkb3dud2FyZEFQSRgCIAEoCzIpLms4cy5pby5hcGkuY29yZS52MS5Eb3dud2FyZEFQSVByb2plY3Rpb24SOgoJY29uZmlnTWFwGAMgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLkNvbmZpZ01hcFByb2plY3Rpb24STgoTc2VydmljZUFjY291bnRUb2tlbhgEIAEoCzIxLms4cy5pby5hcGkuY29yZS52MS5TZXJ2aWNlQWNjb3VudFRva2VuUHJvamVjdGlvbhJMChJjbHVzdGVyVHJ1c3RCdW5kbGUYBSABKAsyMC5rOHMuaW8uYXBpLmNvcmUudjEuQ2x1c3RlclRydXN0QnVuZGxlUHJvamVjdGlvbiL4AgoaVm9sdW1lUmVzb3VyY2VSZXF1aXJlbWVudHMSSgoGbGltaXRzGAEgAygLMjouazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZVJlc291cmNlUmVxdWlyZW1lbnRzLkxpbWl0c0VudHJ5Ek4KCHJlcXVlc3RzGAIgAygLMjwuazhzLmlvLmFwaS5jb3JlLnYxLlZvbHVtZVJlc291cmNlUmVxdWlyZW1lbnRzLlJlcXVlc3RzRW50cnkaXQoLTGltaXRzRW50cnkSCwoDa2V5GAEgASgJEj0KBXZhbHVlGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpLnJlc291cmNlLlF1YW50aXR5OgI4ARpfCg1SZXF1ZXN0c0VudHJ5EgsKA2tleRgBIAEoCRI9CgV2YWx1ZRgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaS5yZXNvdXJjZS5RdWFudGl0eToCOAEizw4KDFZvbHVtZVNvdXJjZRI6Cghob3N0UGF0aBgBIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5Ib3N0UGF0aFZvbHVtZVNvdXJjZRI6CghlbXB0eURpchgCIAEoCzIoLms4cy5pby5hcGkuY29yZS52MS5FbXB0eURpclZvbHVtZVNvdXJjZRJMChFnY2VQZXJzaXN0ZW50RGlzaxgDIAEoCzIxLms4cy5pby5hcGkuY29yZS52MS5HQ0VQZXJzaXN0ZW50RGlza1ZvbHVtZVNvdXJjZRJSChRhd3NFbGFzdGljQmxvY2tTdG9yZRgEIAEoCzI0Lms4cy5pby5hcGkuY29yZS52MS5BV1NFbGFzdGljQmxvY2tTdG9yZVZvbHVtZVNvdXJjZRI4CgdnaXRSZXBvGAUgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLkdpdFJlcG9Wb2x1bWVTb3VyY2USNgoGc2VjcmV0GAYgASgLMiYuazhzLmlvLmFwaS5jb3JlLnYxLlNlY3JldFZvbHVtZVNvdXJjZRIwCgNuZnMYByABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuTkZTVm9sdW1lU291cmNlEjQKBWlzY3NpGAggASgLMiUuazhzLmlvLmFwaS5jb3JlLnYxLklTQ1NJVm9sdW1lU291cmNlEjwKCWdsdXN0ZXJmcxgJIAEoCzIpLms4cy5pby5hcGkuY29yZS52MS5HbHVzdGVyZnNWb2x1bWVTb3VyY2USVAoVcGVyc2lzdGVudFZvbHVtZUNsYWltGAogASgLMjUuazhzLmlvLmFwaS5jb3JlLnYxLlBlcnNpc3RlbnRWb2x1bWVDbGFpbVZvbHVtZVNvdXJjZRIwCgNyYmQYCyABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuUkJEVm9sdW1lU291cmNlEjgKCmZsZXhWb2x1bWUYDCABKAsyJC5rOHMuaW8uYXBpLmNvcmUudjEuRmxleFZvbHVtZVNvdXJjZRI2CgZjaW5kZXIYDSABKAsyJi5rOHMuaW8uYXBpLmNvcmUudjEuQ2luZGVyVm9sdW1lU291cmNlEjYKBmNlcGhmcxgOIAEoCzImLms4cy5pby5hcGkuY29yZS52MS5DZXBoRlNWb2x1bWVTb3VyY2USOAoHZmxvY2tlchgPIAEoCzInLms4cy5pby5hcGkuY29yZS52MS5GbG9ja2VyVm9sdW1lU291cmNlEkAKC2Rvd253YXJkQVBJGBAgASgLMisuazhzLmlvLmFwaS5jb3JlLnYxLkRvd253YXJkQVBJVm9sdW1lU291cmNlEi4KAmZjGBEgASgLMiIuazhzLmlvLmFwaS5jb3JlLnYxLkZDVm9sdW1lU291cmNlEjwKCWF6dXJlRmlsZRgSIAEoCzIpLms4cy5pby5hcGkuY29yZS52MS5BenVyZUZpbGVWb2x1bWVTb3VyY2USPAoJY29uZmlnTWFwGBMgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkNvbmZpZ01hcFZvbHVtZVNvdXJjZRJJCg12c3BoZXJlVm9sdW1lGBQgASgLMjIuazhzLmlvLmFwaS5jb3JlLnYxLlZzcGhlcmVWaXJ0dWFsRGlza1ZvbHVtZVNvdXJjZRI4CgdxdW9ieXRlGBUgASgLMicuazhzLmlvLmFwaS5jb3JlLnYxLlF1b2J5dGVWb2x1bWVTb3VyY2USPAoJYXp1cmVEaXNrGBYgASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkF6dXJlRGlza1ZvbHVtZVNvdXJjZRJSChRwaG90b25QZXJzaXN0ZW50RGlzaxgXIAEoCzI0Lms4cy5pby5hcGkuY29yZS52MS5QaG90b25QZXJzaXN0ZW50RGlza1ZvbHVtZVNvdXJjZRI8Cglwcm9qZWN0ZWQYGiABKAsyKS5rOHMuaW8uYXBpLmNvcmUudjEuUHJvamVjdGVkVm9sdW1lU291cmNlEkAKDnBvcnR3b3J4Vm9sdW1lGBggASgLMiguazhzLmlvLmFwaS5jb3JlLnYxLlBvcnR3b3J4Vm9sdW1lU291cmNlEjgKB3NjYWxlSU8YGSABKAsyJy5rOHMuaW8uYXBpLmNvcmUudjEuU2NhbGVJT1ZvbHVtZVNvdXJjZRI8CglzdG9yYWdlb3MYGyABKAsyKS5rOHMuaW8uYXBpLmNvcmUudjEuU3RvcmFnZU9TVm9sdW1lU291cmNlEjAKA2NzaRgcIAEoCzIjLms4cy5pby5hcGkuY29yZS52MS5DU0lWb2x1bWVTb3VyY2USPAoJZXBoZW1lcmFsGB0gASgLMikuazhzLmlvLmFwaS5jb3JlLnYxLkVwaGVtZXJhbFZvbHVtZVNvdXJjZRI0CgVpbWFnZRgeIAEoCzIlLms4cy5pby5hcGkuY29yZS52MS5JbWFnZVZvbHVtZVNvdXJjZSJ4Ch5Wc3BoZXJlVmlydHVhbERpc2tWb2x1bWVTb3VyY2USEgoKdm9sdW1lUGF0aBgBIAEoCRIOCgZmc1R5cGUYAiABKAkSGQoRc3RvcmFnZVBvbGljeU5hbWUYAyABKAkSFwoPc3RvcmFnZVBvbGljeUlEGAQgASgJImcKF1dlaWdodGVkUG9kQWZmaW5pdHlUZXJtEg4KBndlaWdodBgBIAEoBRI8Cg9wb2RBZmZpbml0eVRlcm0YAiABKAsyIy5rOHMuaW8uYXBpLmNvcmUudjEuUG9kQWZmaW5pdHlUZXJtIocBCh1XaW5kb3dzU2VjdXJpdHlDb250ZXh0T3B0aW9ucxIeChZnbXNhQ3JlZGVudGlhbFNwZWNOYW1lGAEgASgJEhoKEmdtc2FDcmVkZW50aWFsU3BlYxgCIAEoCRIVCg1ydW5Bc1VzZXJOYW1lGAMgASgJEhMKC2hvc3RQcm9jZXNzGAQgASgIQqkBChZjb20uazhzLmlvLmFwaS5jb3JlLnYxQg5HZW5lcmF0ZWRQcm90b1ABWhJrOHMuaW8vYXBpL2NvcmUvdjGiAgRLSUFDqgISSzhzLklvLkFwaS5Db3JlLlYxygISSzhzXElvXEFwaVxDb3JlXFYx4gIeSzhzXElvXEFwaVxDb3JlXFYxXEdQQk1ldGFkYXRh6gIWSzhzOjpJbzo6QXBpOjpDb3JlOjpWMQ", [file_k8s_io_apimachinery_pkg_api_resource_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated, file_k8s_io_apimachinery_pkg_util_intstr_generated]);
 
 /**
  * Represents a Persistent Disk resource in AWS.
@@ -2153,6 +2153,15 @@ export type ContainerStatus = Message<"k8s.io.api.core.v1.ContainerStatus"> & {
    * @generated from field: repeated k8s.io.api.core.v1.ResourceStatus allocatedResourcesStatus = 14;
    */
   allocatedResourcesStatus: ResourceStatus[];
+
+  /**
+   * StopSignal reports the effective stop signal for this container
+   * +featureGate=ContainerStopSignals
+   * +optional
+   *
+   * @generated from field: optional string stopSignal = 15;
+   */
+  stopSignal: string;
 };
 
 /**
@@ -2362,6 +2371,7 @@ export const EmptyDirVolumeSourceSchema: GenMessage<EmptyDirVolumeSource> = /*@_
 
 /**
  * EndpointAddress is a tuple that describes single IP address.
+ * Deprecated: This API is deprecated in v1.33+.
  * +structType=atomic
  *
  * @generated from message k8s.io.api.core.v1.EndpointAddress
@@ -2410,6 +2420,7 @@ export const EndpointAddressSchema: GenMessage<EndpointAddress> = /*@__PURE__*/
 
 /**
  * EndpointPort is a tuple that describes a single port.
+ * Deprecated: This API is deprecated in v1.33+.
  * +structType=atomic
  *
  * @generated from message k8s.io.api.core.v1.EndpointPort
@@ -2488,6 +2499,8 @@ export const EndpointPortSchema: GenMessage<EndpointPort> = /*@__PURE__*/
  * 	a: [ 10.10.1.1:8675, 10.10.2.2:8675 ],
  * 	b: [ 10.10.1.1:309, 10.10.2.2:309 ]
  *
+ * Deprecated: This API is deprecated in v1.33+.
+ *
  * @generated from message k8s.io.api.core.v1.EndpointSubset
  */
 export type EndpointSubset = Message<"k8s.io.api.core.v1.EndpointSubset"> & {
@@ -2544,6 +2557,11 @@ export const EndpointSubsetSchema: GenMessage<EndpointSubset> = /*@__PURE__*/
  * 	   },
  * 	]
  *
+ * Endpoints is a legacy API and does not contain information about all Service features.
+ * Use discoveryv1.EndpointSlice for complete information about Service endpoints.
+ *
+ * Deprecated: This API is deprecated in v1.33+. Use discoveryv1.EndpointSlice.
+ *
  * @generated from message k8s.io.api.core.v1.Endpoints
  */
 export type Endpoints = Message<"k8s.io.api.core.v1.Endpoints"> & {
@@ -2581,6 +2599,7 @@ export const EndpointsSchema: GenMessage<Endpoints> = /*@__PURE__*/
 
 /**
  * EndpointsList is a list of endpoints.
+ * Deprecated: This API is deprecated in v1.33+.
  *
  * @generated from message k8s.io.api.core.v1.EndpointsList
  */
@@ -2610,13 +2629,13 @@ export const EndpointsListSchema: GenMessage<EndpointsList> = /*@__PURE__*/
   messageDesc(file_k8s_io_api_core_v1_generated, 47);
 
 /**
- * EnvFromSource represents the source of a set of ConfigMaps
+ * EnvFromSource represents the source of a set of ConfigMaps or Secrets
  *
  * @generated from message k8s.io.api.core.v1.EnvFromSource
  */
 export type EnvFromSource = Message<"k8s.io.api.core.v1.EnvFromSource"> & {
   /**
-   * An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.
+   * Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER.
    * +optional
    *
    * @generated from field: optional string prefix = 1;
@@ -4335,6 +4354,16 @@ export type Lifecycle = Message<"k8s.io.api.core.v1.Lifecycle"> & {
    * @generated from field: optional k8s.io.api.core.v1.LifecycleHandler preStop = 2;
    */
   preStop?: LifecycleHandler;
+
+  /**
+   * StopSignal defines which signal will be sent to a container when it is being stopped.
+   * If not specified, the default is defined by the container runtime in use.
+   * StopSignal can only be set for Pods with a non-empty .spec.os.name
+   * +optional
+   *
+   * @generated from field: optional string stopSignal = 3;
+   */
+  stopSignal: string;
 };
 
 /**
@@ -5787,6 +5816,28 @@ export type NodeStatus = Message<"k8s.io.api.core.v1.NodeStatus"> & {
 export const NodeStatusSchema: GenMessage<NodeStatus> = /*@__PURE__*/
   messageDesc(file_k8s_io_api_core_v1_generated, 112);
 
+/**
+ * NodeSwapStatus represents swap memory information.
+ *
+ * @generated from message k8s.io.api.core.v1.NodeSwapStatus
+ */
+export type NodeSwapStatus = Message<"k8s.io.api.core.v1.NodeSwapStatus"> & {
+  /**
+   * Total amount of swap memory in bytes.
+   * +optional
+   *
+   * @generated from field: optional int64 capacity = 1;
+   */
+  capacity: bigint;
+};
+
+/**
+ * Describes the message k8s.io.api.core.v1.NodeSwapStatus.
+ * Use `create(NodeSwapStatusSchema)` to create a new message.
+ */
+export const NodeSwapStatusSchema: GenMessage<NodeSwapStatus> = /*@__PURE__*/
+  messageDesc(file_k8s_io_api_core_v1_generated, 113);
+
 /**
  * NodeSystemInfo is a set of ids/uuids to uniquely identify the node.
  *
@@ -5866,6 +5917,13 @@ export type NodeSystemInfo = Message<"k8s.io.api.core.v1.NodeSystemInfo"> & {
    * @generated from field: optional string architecture = 10;
    */
   architecture: string;
+
+  /**
+   * Swap Info reported by the node.
+   *
+   * @generated from field: optional k8s.io.api.core.v1.NodeSwapStatus swap = 11;
+   */
+  swap?: NodeSwapStatus;
 };
 
 /**
@@ -5873,7 +5931,7 @@ export type NodeSystemInfo = Message<"k8s.io.api.core.v1.NodeSystemInfo"> & {
  * Use `create(NodeSystemInfoSchema)` to create a new message.
  */
 export const NodeSystemInfoSchema: GenMessage<NodeSystemInfo> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 113);
+  messageDesc(file_k8s_io_api_core_v1_generated, 114);
 
 /**
  * ObjectFieldSelector selects an APIVersioned field of an object.
@@ -5903,7 +5961,7 @@ export type ObjectFieldSelector = Message<"k8s.io.api.core.v1.ObjectFieldSelecto
  * Use `create(ObjectFieldSelectorSchema)` to create a new message.
  */
 export const ObjectFieldSelectorSchema: GenMessage<ObjectFieldSelector> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 114);
+  messageDesc(file_k8s_io_api_core_v1_generated, 115);
 
 /**
  * ObjectReference contains enough information to let you inspect or modify the referred object.
@@ -6002,7 +6060,7 @@ export type ObjectReference = Message<"k8s.io.api.core.v1.ObjectReference"> & {
  * Use `create(ObjectReferenceSchema)` to create a new message.
  */
 export const ObjectReferenceSchema: GenMessage<ObjectReference> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 115);
+  messageDesc(file_k8s_io_api_core_v1_generated, 116);
 
 /**
  * PersistentVolume (PV) is a storage resource provisioned by an administrator.
@@ -6048,7 +6106,7 @@ export type PersistentVolume = Message<"k8s.io.api.core.v1.PersistentVolume"> &
  * Use `create(PersistentVolumeSchema)` to create a new message.
  */
 export const PersistentVolumeSchema: GenMessage<PersistentVolume> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 116);
+  messageDesc(file_k8s_io_api_core_v1_generated, 117);
 
 /**
  * PersistentVolumeClaim is a user's request for and claim to a persistent volume
@@ -6090,7 +6148,7 @@ export type PersistentVolumeClaim = Message<"k8s.io.api.core.v1.PersistentVolume
  * Use `create(PersistentVolumeClaimSchema)` to create a new message.
  */
 export const PersistentVolumeClaimSchema: GenMessage<PersistentVolumeClaim> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 117);
+  messageDesc(file_k8s_io_api_core_v1_generated, 118);
 
 /**
  * PersistentVolumeClaimCondition contains details about state of pvc
@@ -6155,7 +6213,7 @@ export type PersistentVolumeClaimCondition = Message<"k8s.io.api.core.v1.Persist
  * Use `create(PersistentVolumeClaimConditionSchema)` to create a new message.
  */
 export const PersistentVolumeClaimConditionSchema: GenMessage<PersistentVolumeClaimCondition> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 118);
+  messageDesc(file_k8s_io_api_core_v1_generated, 119);
 
 /**
  * PersistentVolumeClaimList is a list of PersistentVolumeClaim items.
@@ -6186,7 +6244,7 @@ export type PersistentVolumeClaimList = Message<"k8s.io.api.core.v1.PersistentVo
  * Use `create(PersistentVolumeClaimListSchema)` to create a new message.
  */
 export const PersistentVolumeClaimListSchema: GenMessage<PersistentVolumeClaimList> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 119);
+  messageDesc(file_k8s_io_api_core_v1_generated, 120);
 
 /**
  * PersistentVolumeClaimSpec describes the common attributes of storage devices
@@ -6322,7 +6380,7 @@ export type PersistentVolumeClaimSpec = Message<"k8s.io.api.core.v1.PersistentVo
  * Use `create(PersistentVolumeClaimSpecSchema)` to create a new message.
  */
 export const PersistentVolumeClaimSpecSchema: GenMessage<PersistentVolumeClaimSpec> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 120);
+  messageDesc(file_k8s_io_api_core_v1_generated, 121);
 
 /**
  * PersistentVolumeClaimStatus is the current status of a persistent volume claim.
@@ -6471,7 +6529,7 @@ export type PersistentVolumeClaimStatus = Message<"k8s.io.api.core.v1.Persistent
  * Use `create(PersistentVolumeClaimStatusSchema)` to create a new message.
  */
 export const PersistentVolumeClaimStatusSchema: GenMessage<PersistentVolumeClaimStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 121);
+  messageDesc(file_k8s_io_api_core_v1_generated, 122);
 
 /**
  * PersistentVolumeClaimTemplate is used to produce
@@ -6507,7 +6565,7 @@ export type PersistentVolumeClaimTemplate = Message<"k8s.io.api.core.v1.Persiste
  * Use `create(PersistentVolumeClaimTemplateSchema)` to create a new message.
  */
 export const PersistentVolumeClaimTemplateSchema: GenMessage<PersistentVolumeClaimTemplate> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 122);
+  messageDesc(file_k8s_io_api_core_v1_generated, 123);
 
 /**
  * PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace.
@@ -6541,7 +6599,7 @@ export type PersistentVolumeClaimVolumeSource = Message<"k8s.io.api.core.v1.Pers
  * Use `create(PersistentVolumeClaimVolumeSourceSchema)` to create a new message.
  */
 export const PersistentVolumeClaimVolumeSourceSchema: GenMessage<PersistentVolumeClaimVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 123);
+  messageDesc(file_k8s_io_api_core_v1_generated, 124);
 
 /**
  * PersistentVolumeList is a list of PersistentVolume items.
@@ -6572,7 +6630,7 @@ export type PersistentVolumeList = Message<"k8s.io.api.core.v1.PersistentVolumeL
  * Use `create(PersistentVolumeListSchema)` to create a new message.
  */
 export const PersistentVolumeListSchema: GenMessage<PersistentVolumeList> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 124);
+  messageDesc(file_k8s_io_api_core_v1_generated, 125);
 
 /**
  * PersistentVolumeSource is similar to VolumeSource but meant for the
@@ -6802,7 +6860,7 @@ export type PersistentVolumeSource = Message<"k8s.io.api.core.v1.PersistentVolum
  * Use `create(PersistentVolumeSourceSchema)` to create a new message.
  */
 export const PersistentVolumeSourceSchema: GenMessage<PersistentVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 125);
+  messageDesc(file_k8s_io_api_core_v1_generated, 126);
 
 /**
  * PersistentVolumeSpec is the specification of a persistent volume.
@@ -6919,7 +6977,7 @@ export type PersistentVolumeSpec = Message<"k8s.io.api.core.v1.PersistentVolumeS
  * Use `create(PersistentVolumeSpecSchema)` to create a new message.
  */
 export const PersistentVolumeSpecSchema: GenMessage<PersistentVolumeSpec> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 126);
+  messageDesc(file_k8s_io_api_core_v1_generated, 127);
 
 /**
  * PersistentVolumeStatus is the current status of a persistent volume.
@@ -6968,7 +7026,7 @@ export type PersistentVolumeStatus = Message<"k8s.io.api.core.v1.PersistentVolum
  * Use `create(PersistentVolumeStatusSchema)` to create a new message.
  */
 export const PersistentVolumeStatusSchema: GenMessage<PersistentVolumeStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 127);
+  messageDesc(file_k8s_io_api_core_v1_generated, 128);
 
 /**
  * Represents a Photon Controller persistent disk resource.
@@ -6998,7 +7056,7 @@ export type PhotonPersistentDiskVolumeSource = Message<"k8s.io.api.core.v1.Photo
  * Use `create(PhotonPersistentDiskVolumeSourceSchema)` to create a new message.
  */
 export const PhotonPersistentDiskVolumeSourceSchema: GenMessage<PhotonPersistentDiskVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 128);
+  messageDesc(file_k8s_io_api_core_v1_generated, 129);
 
 /**
  * Pod is a collection of containers that can run on a host. This resource is created
@@ -7043,7 +7101,7 @@ export type Pod = Message<"k8s.io.api.core.v1.Pod"> & {
  * Use `create(PodSchema)` to create a new message.
  */
 export const PodSchema: GenMessage<Pod> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 129);
+  messageDesc(file_k8s_io_api_core_v1_generated, 130);
 
 /**
  * Pod affinity is a group of inter pod affinity scheduling rules.
@@ -7089,7 +7147,7 @@ export type PodAffinity = Message<"k8s.io.api.core.v1.PodAffinity"> & {
  * Use `create(PodAffinitySchema)` to create a new message.
  */
 export const PodAffinitySchema: GenMessage<PodAffinity> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 130);
+  messageDesc(file_k8s_io_api_core_v1_generated, 131);
 
 /**
  * Defines a set of pods (namely those matching the labelSelector
@@ -7155,7 +7213,6 @@ export type PodAffinityTerm = Message<"k8s.io.api.core.v1.PodAffinityTerm"> & {
    * pod labels will be ignored. The default value is empty.
    * The same key is forbidden to exist in both matchLabelKeys and labelSelector.
    * Also, matchLabelKeys cannot be set when labelSelector isn't set.
-   * This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).
    *
    * +listType=atomic
    * +optional
@@ -7173,7 +7230,6 @@ export type PodAffinityTerm = Message<"k8s.io.api.core.v1.PodAffinityTerm"> & {
    * pod labels will be ignored. The default value is empty.
    * The same key is forbidden to exist in both mismatchLabelKeys and labelSelector.
    * Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
-   * This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).
    *
    * +listType=atomic
    * +optional
@@ -7188,7 +7244,7 @@ export type PodAffinityTerm = Message<"k8s.io.api.core.v1.PodAffinityTerm"> & {
  * Use `create(PodAffinityTermSchema)` to create a new message.
  */
 export const PodAffinityTermSchema: GenMessage<PodAffinityTerm> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 131);
+  messageDesc(file_k8s_io_api_core_v1_generated, 132);
 
 /**
  * Pod anti affinity is a group of inter pod anti affinity scheduling rules.
@@ -7234,7 +7290,7 @@ export type PodAntiAffinity = Message<"k8s.io.api.core.v1.PodAntiAffinity"> & {
  * Use `create(PodAntiAffinitySchema)` to create a new message.
  */
 export const PodAntiAffinitySchema: GenMessage<PodAntiAffinity> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 132);
+  messageDesc(file_k8s_io_api_core_v1_generated, 133);
 
 /**
  * PodAttachOptions is the query options to a Pod's remote attach call.
@@ -7298,7 +7354,7 @@ export type PodAttachOptions = Message<"k8s.io.api.core.v1.PodAttachOptions"> &
  * Use `create(PodAttachOptionsSchema)` to create a new message.
  */
 export const PodAttachOptionsSchema: GenMessage<PodAttachOptions> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 133);
+  messageDesc(file_k8s_io_api_core_v1_generated, 134);
 
 /**
  * PodCondition contains details for the current condition of this pod.
@@ -7314,6 +7370,16 @@ export type PodCondition = Message<"k8s.io.api.core.v1.PodCondition"> & {
    */
   type: string;
 
+  /**
+   * If set, this represents the .metadata.generation that the pod condition was set based upon.
+   * This is an alpha field. Enable PodObservedGenerationTracking to be able to use this field.
+   * +featureGate=PodObservedGenerationTracking
+   * +optional
+   *
+   * @generated from field: optional int64 observedGeneration = 7;
+   */
+  observedGeneration: bigint;
+
   /**
    * Status is the status of the condition.
    * Can be True, False, Unknown.
@@ -7361,7 +7427,7 @@ export type PodCondition = Message<"k8s.io.api.core.v1.PodCondition"> & {
  * Use `create(PodConditionSchema)` to create a new message.
  */
 export const PodConditionSchema: GenMessage<PodCondition> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 134);
+  messageDesc(file_k8s_io_api_core_v1_generated, 135);
 
 /**
  * PodDNSConfig defines the DNS parameters of a pod in addition to
@@ -7410,7 +7476,7 @@ export type PodDNSConfig = Message<"k8s.io.api.core.v1.PodDNSConfig"> & {
  * Use `create(PodDNSConfigSchema)` to create a new message.
  */
 export const PodDNSConfigSchema: GenMessage<PodDNSConfig> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 135);
+  messageDesc(file_k8s_io_api_core_v1_generated, 136);
 
 /**
  * PodDNSConfigOption defines DNS resolver options of a pod.
@@ -7440,7 +7506,7 @@ export type PodDNSConfigOption = Message<"k8s.io.api.core.v1.PodDNSConfigOption"
  * Use `create(PodDNSConfigOptionSchema)` to create a new message.
  */
 export const PodDNSConfigOptionSchema: GenMessage<PodDNSConfigOption> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 136);
+  messageDesc(file_k8s_io_api_core_v1_generated, 137);
 
 /**
  * PodExecOptions is the query options to a Pod's remote exec call.
@@ -7508,7 +7574,7 @@ export type PodExecOptions = Message<"k8s.io.api.core.v1.PodExecOptions"> & {
  * Use `create(PodExecOptionsSchema)` to create a new message.
  */
 export const PodExecOptionsSchema: GenMessage<PodExecOptions> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 137);
+  messageDesc(file_k8s_io_api_core_v1_generated, 138);
 
 /**
  * PodIP represents a single IP address allocated to the pod.
@@ -7530,7 +7596,7 @@ export type PodIP = Message<"k8s.io.api.core.v1.PodIP"> & {
  * Use `create(PodIPSchema)` to create a new message.
  */
 export const PodIPSchema: GenMessage<PodIP> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 138);
+  messageDesc(file_k8s_io_api_core_v1_generated, 139);
 
 /**
  * PodList is a list of Pods.
@@ -7561,7 +7627,7 @@ export type PodList = Message<"k8s.io.api.core.v1.PodList"> & {
  * Use `create(PodListSchema)` to create a new message.
  */
 export const PodListSchema: GenMessage<PodList> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 139);
+  messageDesc(file_k8s_io_api_core_v1_generated, 140);
 
 /**
  * PodLogOptions is the query options for a Pod's logs REST call.
@@ -7675,7 +7741,7 @@ export type PodLogOptions = Message<"k8s.io.api.core.v1.PodLogOptions"> & {
  * Use `create(PodLogOptionsSchema)` to create a new message.
  */
 export const PodLogOptionsSchema: GenMessage<PodLogOptions> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 140);
+  messageDesc(file_k8s_io_api_core_v1_generated, 141);
 
 /**
  * PodOS defines the OS parameters of a pod.
@@ -7699,7 +7765,7 @@ export type PodOS = Message<"k8s.io.api.core.v1.PodOS"> & {
  * Use `create(PodOSSchema)` to create a new message.
  */
 export const PodOSSchema: GenMessage<PodOS> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 141);
+  messageDesc(file_k8s_io_api_core_v1_generated, 142);
 
 /**
  * PodPortForwardOptions is the query options to a Pod's port forward call
@@ -7728,7 +7794,7 @@ export type PodPortForwardOptions = Message<"k8s.io.api.core.v1.PodPortForwardOp
  * Use `create(PodPortForwardOptionsSchema)` to create a new message.
  */
 export const PodPortForwardOptionsSchema: GenMessage<PodPortForwardOptions> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 142);
+  messageDesc(file_k8s_io_api_core_v1_generated, 143);
 
 /**
  * PodProxyOptions is the query options to a Pod's proxy call.
@@ -7750,7 +7816,7 @@ export type PodProxyOptions = Message<"k8s.io.api.core.v1.PodProxyOptions"> & {
  * Use `create(PodProxyOptionsSchema)` to create a new message.
  */
 export const PodProxyOptionsSchema: GenMessage<PodProxyOptions> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 143);
+  messageDesc(file_k8s_io_api_core_v1_generated, 144);
 
 /**
  * PodReadinessGate contains the reference to a pod condition
@@ -7771,7 +7837,7 @@ export type PodReadinessGate = Message<"k8s.io.api.core.v1.PodReadinessGate"> &
  * Use `create(PodReadinessGateSchema)` to create a new message.
  */
 export const PodReadinessGateSchema: GenMessage<PodReadinessGate> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 144);
+  messageDesc(file_k8s_io_api_core_v1_generated, 145);
 
 /**
  * PodResourceClaim references exactly one ResourceClaim, either directly
@@ -7830,7 +7896,7 @@ export type PodResourceClaim = Message<"k8s.io.api.core.v1.PodResourceClaim"> &
  * Use `create(PodResourceClaimSchema)` to create a new message.
  */
 export const PodResourceClaimSchema: GenMessage<PodResourceClaim> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 145);
+  messageDesc(file_k8s_io_api_core_v1_generated, 146);
 
 /**
  * PodResourceClaimStatus is stored in the PodStatus for each PodResourceClaim
@@ -7867,7 +7933,7 @@ export type PodResourceClaimStatus = Message<"k8s.io.api.core.v1.PodResourceClai
  * Use `create(PodResourceClaimStatusSchema)` to create a new message.
  */
 export const PodResourceClaimStatusSchema: GenMessage<PodResourceClaimStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 146);
+  messageDesc(file_k8s_io_api_core_v1_generated, 147);
 
 /**
  * PodSchedulingGate is associated to a Pod to guard its scheduling.
@@ -7889,7 +7955,7 @@ export type PodSchedulingGate = Message<"k8s.io.api.core.v1.PodSchedulingGate">
  * Use `create(PodSchedulingGateSchema)` to create a new message.
  */
 export const PodSchedulingGateSchema: GenMessage<PodSchedulingGate> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 147);
+  messageDesc(file_k8s_io_api_core_v1_generated, 148);
 
 /**
  * PodSecurityContext holds pod-level security attributes and common container settings.
@@ -8090,7 +8156,7 @@ export type PodSecurityContext = Message<"k8s.io.api.core.v1.PodSecurityContext"
  * Use `create(PodSecurityContextSchema)` to create a new message.
  */
 export const PodSecurityContextSchema: GenMessage<PodSecurityContext> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 148);
+  messageDesc(file_k8s_io_api_core_v1_generated, 149);
 
 /**
  * Describes the class of pods that should avoid this node.
@@ -8113,7 +8179,7 @@ export type PodSignature = Message<"k8s.io.api.core.v1.PodSignature"> & {
  * Use `create(PodSignatureSchema)` to create a new message.
  */
 export const PodSignatureSchema: GenMessage<PodSignature> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 149);
+  messageDesc(file_k8s_io_api_core_v1_generated, 150);
 
 /**
  * PodSpec is a description of a pod.
@@ -8143,7 +8209,7 @@ export type PodSpec = Message<"k8s.io.api.core.v1.PodSpec"> & {
    * Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes.
    * The resourceRequirements of an init container are taken into account during scheduling
    * by finding the highest request/limit for each resource type, and then using the max of
-   * of that value or the sum of the normal containers. Limits are applied to init containers
+   * that value or the sum of the normal containers. Limits are applied to init containers
    * in a similar fashion.
    * Init containers cannot currently be added or removed.
    * Cannot be updated.
@@ -8648,7 +8714,7 @@ export type PodSpec = Message<"k8s.io.api.core.v1.PodSpec"> & {
  * Use `create(PodSpecSchema)` to create a new message.
  */
 export const PodSpecSchema: GenMessage<PodSpec> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 150);
+  messageDesc(file_k8s_io_api_core_v1_generated, 151);
 
 /**
  * PodStatus represents information about the status of a pod. Status may trail the actual
@@ -8658,6 +8724,16 @@ export const PodSpecSchema: GenMessage<PodSpec> = /*@__PURE__*/
  * @generated from message k8s.io.api.core.v1.PodStatus
  */
 export type PodStatus = Message<"k8s.io.api.core.v1.PodStatus"> & {
+  /**
+   * If set, this represents the .metadata.generation that the pod status was set based upon.
+   * This is an alpha field. Enable PodObservedGenerationTracking to be able to use this field.
+   * +featureGate=PodObservedGenerationTracking
+   * +optional
+   *
+   * @generated from field: optional int64 observedGeneration = 17;
+   */
+  observedGeneration: bigint;
+
   /**
    * The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle.
    * The conditions array, the reason and message fields, and the individual container status
@@ -8846,6 +8922,9 @@ export type PodStatus = Message<"k8s.io.api.core.v1.PodStatus"> & {
    * Status of resources resize desired for pod's containers.
    * It is empty if no resources resize is pending.
    * Any changes to container resources will automatically set this to "Proposed"
+   * Deprecated: Resize status is moved to two pod conditions PodResizePending and PodResizeInProgress.
+   * PodResizePending will track states where the spec has been resized, but the Kubelet has not yet allocated the resources.
+   * PodResizeInProgress will track in-progress resizes, and should be present whenever allocated resources != acknowledged resources.
    * +featureGate=InPlacePodVerticalScaling
    * +optional
    *
@@ -8872,7 +8951,7 @@ export type PodStatus = Message<"k8s.io.api.core.v1.PodStatus"> & {
  * Use `create(PodStatusSchema)` to create a new message.
  */
 export const PodStatusSchema: GenMessage<PodStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 151);
+  messageDesc(file_k8s_io_api_core_v1_generated, 152);
 
 /**
  * PodStatusResult is a wrapper for PodStatus returned by kubelet that can be encode/decoded
@@ -8907,7 +8986,7 @@ export type PodStatusResult = Message<"k8s.io.api.core.v1.PodStatusResult"> & {
  * Use `create(PodStatusResultSchema)` to create a new message.
  */
 export const PodStatusResultSchema: GenMessage<PodStatusResult> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 152);
+  messageDesc(file_k8s_io_api_core_v1_generated, 153);
 
 /**
  * PodTemplate describes a template for creating copies of a predefined pod.
@@ -8939,7 +9018,7 @@ export type PodTemplate = Message<"k8s.io.api.core.v1.PodTemplate"> & {
  * Use `create(PodTemplateSchema)` to create a new message.
  */
 export const PodTemplateSchema: GenMessage<PodTemplate> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 153);
+  messageDesc(file_k8s_io_api_core_v1_generated, 154);
 
 /**
  * PodTemplateList is a list of PodTemplates.
@@ -8969,7 +9048,7 @@ export type PodTemplateList = Message<"k8s.io.api.core.v1.PodTemplateList"> & {
  * Use `create(PodTemplateListSchema)` to create a new message.
  */
 export const PodTemplateListSchema: GenMessage<PodTemplateList> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 154);
+  messageDesc(file_k8s_io_api_core_v1_generated, 155);
 
 /**
  * PodTemplateSpec describes the data a pod should have when created from a template
@@ -9001,7 +9080,7 @@ export type PodTemplateSpec = Message<"k8s.io.api.core.v1.PodTemplateSpec"> & {
  * Use `create(PodTemplateSpecSchema)` to create a new message.
  */
 export const PodTemplateSpecSchema: GenMessage<PodTemplateSpec> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 155);
+  messageDesc(file_k8s_io_api_core_v1_generated, 156);
 
 /**
  * PortStatus represents the error condition of a service port
@@ -9048,7 +9127,7 @@ export type PortStatus = Message<"k8s.io.api.core.v1.PortStatus"> & {
  * Use `create(PortStatusSchema)` to create a new message.
  */
 export const PortStatusSchema: GenMessage<PortStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 156);
+  messageDesc(file_k8s_io_api_core_v1_generated, 157);
 
 /**
  * PortworxVolumeSource represents a Portworx volume resource.
@@ -9087,7 +9166,7 @@ export type PortworxVolumeSource = Message<"k8s.io.api.core.v1.PortworxVolumeSou
  * Use `create(PortworxVolumeSourceSchema)` to create a new message.
  */
 export const PortworxVolumeSourceSchema: GenMessage<PortworxVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 157);
+  messageDesc(file_k8s_io_api_core_v1_generated, 158);
 
 /**
  * Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.
@@ -9110,7 +9189,7 @@ export type Preconditions = Message<"k8s.io.api.core.v1.Preconditions"> & {
  * Use `create(PreconditionsSchema)` to create a new message.
  */
 export const PreconditionsSchema: GenMessage<Preconditions> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 158);
+  messageDesc(file_k8s_io_api_core_v1_generated, 159);
 
 /**
  * Describes a class of pods that should avoid this node.
@@ -9155,7 +9234,7 @@ export type PreferAvoidPodsEntry = Message<"k8s.io.api.core.v1.PreferAvoidPodsEn
  * Use `create(PreferAvoidPodsEntrySchema)` to create a new message.
  */
 export const PreferAvoidPodsEntrySchema: GenMessage<PreferAvoidPodsEntry> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 159);
+  messageDesc(file_k8s_io_api_core_v1_generated, 160);
 
 /**
  * An empty preferred scheduling term matches all objects with implicit weight 0
@@ -9184,7 +9263,7 @@ export type PreferredSchedulingTerm = Message<"k8s.io.api.core.v1.PreferredSched
  * Use `create(PreferredSchedulingTermSchema)` to create a new message.
  */
 export const PreferredSchedulingTermSchema: GenMessage<PreferredSchedulingTerm> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 160);
+  messageDesc(file_k8s_io_api_core_v1_generated, 161);
 
 /**
  * Probe describes a health check to be performed against a container to determine whether it is
@@ -9269,7 +9348,7 @@ export type Probe = Message<"k8s.io.api.core.v1.Probe"> & {
  * Use `create(ProbeSchema)` to create a new message.
  */
 export const ProbeSchema: GenMessage<Probe> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 161);
+  messageDesc(file_k8s_io_api_core_v1_generated, 162);
 
 /**
  * ProbeHandler defines a specific action that should be taken in a probe.
@@ -9316,7 +9395,7 @@ export type ProbeHandler = Message<"k8s.io.api.core.v1.ProbeHandler"> & {
  * Use `create(ProbeHandlerSchema)` to create a new message.
  */
 export const ProbeHandlerSchema: GenMessage<ProbeHandler> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 162);
+  messageDesc(file_k8s_io_api_core_v1_generated, 163);
 
 /**
  * Represents a projected volume source
@@ -9353,7 +9432,7 @@ export type ProjectedVolumeSource = Message<"k8s.io.api.core.v1.ProjectedVolumeS
  * Use `create(ProjectedVolumeSourceSchema)` to create a new message.
  */
 export const ProjectedVolumeSourceSchema: GenMessage<ProjectedVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 163);
+  messageDesc(file_k8s_io_api_core_v1_generated, 164);
 
 /**
  * Represents a Quobyte mount that lasts the lifetime of a pod.
@@ -9420,7 +9499,7 @@ export type QuobyteVolumeSource = Message<"k8s.io.api.core.v1.QuobyteVolumeSourc
  * Use `create(QuobyteVolumeSourceSchema)` to create a new message.
  */
 export const QuobyteVolumeSourceSchema: GenMessage<QuobyteVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 164);
+  messageDesc(file_k8s_io_api_core_v1_generated, 165);
 
 /**
  * Represents a Rados Block Device mount that lasts the lifetime of a pod.
@@ -9518,7 +9597,7 @@ export type RBDPersistentVolumeSource = Message<"k8s.io.api.core.v1.RBDPersisten
  * Use `create(RBDPersistentVolumeSourceSchema)` to create a new message.
  */
 export const RBDPersistentVolumeSourceSchema: GenMessage<RBDPersistentVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 165);
+  messageDesc(file_k8s_io_api_core_v1_generated, 166);
 
 /**
  * Represents a Rados Block Device mount that lasts the lifetime of a pod.
@@ -9616,7 +9695,7 @@ export type RBDVolumeSource = Message<"k8s.io.api.core.v1.RBDVolumeSource"> & {
  * Use `create(RBDVolumeSourceSchema)` to create a new message.
  */
 export const RBDVolumeSourceSchema: GenMessage<RBDVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 166);
+  messageDesc(file_k8s_io_api_core_v1_generated, 167);
 
 /**
  * RangeAllocation is not a public type.
@@ -9653,7 +9732,7 @@ export type RangeAllocation = Message<"k8s.io.api.core.v1.RangeAllocation"> & {
  * Use `create(RangeAllocationSchema)` to create a new message.
  */
 export const RangeAllocationSchema: GenMessage<RangeAllocation> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 167);
+  messageDesc(file_k8s_io_api_core_v1_generated, 168);
 
 /**
  * ReplicationController represents the configuration of a replication controller.
@@ -9698,7 +9777,7 @@ export type ReplicationController = Message<"k8s.io.api.core.v1.ReplicationContr
  * Use `create(ReplicationControllerSchema)` to create a new message.
  */
 export const ReplicationControllerSchema: GenMessage<ReplicationController> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 168);
+  messageDesc(file_k8s_io_api_core_v1_generated, 169);
 
 /**
  * ReplicationControllerCondition describes the state of a replication controller at a certain point.
@@ -9750,7 +9829,7 @@ export type ReplicationControllerCondition = Message<"k8s.io.api.core.v1.Replica
  * Use `create(ReplicationControllerConditionSchema)` to create a new message.
  */
 export const ReplicationControllerConditionSchema: GenMessage<ReplicationControllerCondition> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 169);
+  messageDesc(file_k8s_io_api_core_v1_generated, 170);
 
 /**
  * ReplicationControllerList is a collection of replication controllers.
@@ -9781,7 +9860,7 @@ export type ReplicationControllerList = Message<"k8s.io.api.core.v1.ReplicationC
  * Use `create(ReplicationControllerListSchema)` to create a new message.
  */
 export const ReplicationControllerListSchema: GenMessage<ReplicationControllerList> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 170);
+  messageDesc(file_k8s_io_api_core_v1_generated, 171);
 
 /**
  * ReplicationControllerSpec is the specification of a replication controller.
@@ -9795,6 +9874,9 @@ export type ReplicationControllerSpec = Message<"k8s.io.api.core.v1.ReplicationC
    * Defaults to 1.
    * More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#what-is-a-replicationcontroller
    * +optional
+   * +k8s:optional
+   * +default=1
+   * +k8s:minimum=0
    *
    * @generated from field: optional int32 replicas = 1;
    */
@@ -9805,6 +9887,9 @@ export type ReplicationControllerSpec = Message<"k8s.io.api.core.v1.ReplicationC
    * without any of its container crashing, for it to be considered available.
    * Defaults to 0 (pod will be considered available as soon as it is ready)
    * +optional
+   * +k8s:optional
+   * +default=0
+   * +k8s:minimum=0
    *
    * @generated from field: optional int32 minReadySeconds = 4;
    */
@@ -9840,7 +9925,7 @@ export type ReplicationControllerSpec = Message<"k8s.io.api.core.v1.ReplicationC
  * Use `create(ReplicationControllerSpecSchema)` to create a new message.
  */
 export const ReplicationControllerSpecSchema: GenMessage<ReplicationControllerSpec> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 171);
+  messageDesc(file_k8s_io_api_core_v1_generated, 172);
 
 /**
  * ReplicationControllerStatus represents the current status of a replication
@@ -9907,7 +9992,7 @@ export type ReplicationControllerStatus = Message<"k8s.io.api.core.v1.Replicatio
  * Use `create(ReplicationControllerStatusSchema)` to create a new message.
  */
 export const ReplicationControllerStatusSchema: GenMessage<ReplicationControllerStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 172);
+  messageDesc(file_k8s_io_api_core_v1_generated, 173);
 
 /**
  * ResourceClaim references one entry in PodSpec.ResourceClaims.
@@ -9941,7 +10026,7 @@ export type ResourceClaim = Message<"k8s.io.api.core.v1.ResourceClaim"> & {
  * Use `create(ResourceClaimSchema)` to create a new message.
  */
 export const ResourceClaimSchema: GenMessage<ResourceClaim> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 173);
+  messageDesc(file_k8s_io_api_core_v1_generated, 174);
 
 /**
  * ResourceFieldSelector represents container resources (cpu, memory) and their output format
@@ -9979,7 +10064,7 @@ export type ResourceFieldSelector = Message<"k8s.io.api.core.v1.ResourceFieldSel
  * Use `create(ResourceFieldSelectorSchema)` to create a new message.
  */
 export const ResourceFieldSelectorSchema: GenMessage<ResourceFieldSelector> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 174);
+  messageDesc(file_k8s_io_api_core_v1_generated, 175);
 
 /**
  * ResourceHealth represents the health of a resource. It has the latest device health information.
@@ -10017,7 +10102,7 @@ export type ResourceHealth = Message<"k8s.io.api.core.v1.ResourceHealth"> & {
  * Use `create(ResourceHealthSchema)` to create a new message.
  */
 export const ResourceHealthSchema: GenMessage<ResourceHealth> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 175);
+  messageDesc(file_k8s_io_api_core_v1_generated, 176);
 
 /**
  * ResourceQuota sets aggregate quota restrictions enforced per namespace
@@ -10058,7 +10143,7 @@ export type ResourceQuota = Message<"k8s.io.api.core.v1.ResourceQuota"> & {
  * Use `create(ResourceQuotaSchema)` to create a new message.
  */
 export const ResourceQuotaSchema: GenMessage<ResourceQuota> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 176);
+  messageDesc(file_k8s_io_api_core_v1_generated, 177);
 
 /**
  * ResourceQuotaList is a list of ResourceQuota items.
@@ -10089,7 +10174,7 @@ export type ResourceQuotaList = Message<"k8s.io.api.core.v1.ResourceQuotaList">
  * Use `create(ResourceQuotaListSchema)` to create a new message.
  */
 export const ResourceQuotaListSchema: GenMessage<ResourceQuotaList> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 177);
+  messageDesc(file_k8s_io_api_core_v1_generated, 178);
 
 /**
  * ResourceQuotaSpec defines the desired hard limits to enforce for Quota.
@@ -10132,7 +10217,7 @@ export type ResourceQuotaSpec = Message<"k8s.io.api.core.v1.ResourceQuotaSpec">
  * Use `create(ResourceQuotaSpecSchema)` to create a new message.
  */
 export const ResourceQuotaSpecSchema: GenMessage<ResourceQuotaSpec> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 178);
+  messageDesc(file_k8s_io_api_core_v1_generated, 179);
 
 /**
  * ResourceQuotaStatus defines the enforced hard limits and observed use.
@@ -10163,7 +10248,7 @@ export type ResourceQuotaStatus = Message<"k8s.io.api.core.v1.ResourceQuotaStatu
  * Use `create(ResourceQuotaStatusSchema)` to create a new message.
  */
 export const ResourceQuotaStatusSchema: GenMessage<ResourceQuotaStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 179);
+  messageDesc(file_k8s_io_api_core_v1_generated, 180);
 
 /**
  * ResourceRequirements describes the compute resource requirements.
@@ -10215,7 +10300,7 @@ export type ResourceRequirements = Message<"k8s.io.api.core.v1.ResourceRequireme
  * Use `create(ResourceRequirementsSchema)` to create a new message.
  */
 export const ResourceRequirementsSchema: GenMessage<ResourceRequirements> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 180);
+  messageDesc(file_k8s_io_api_core_v1_generated, 181);
 
 /**
  * ResourceStatus represents the status of a single resource allocated to a Pod.
@@ -10251,7 +10336,7 @@ export type ResourceStatus = Message<"k8s.io.api.core.v1.ResourceStatus"> & {
  * Use `create(ResourceStatusSchema)` to create a new message.
  */
 export const ResourceStatusSchema: GenMessage<ResourceStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 181);
+  messageDesc(file_k8s_io_api_core_v1_generated, 182);
 
 /**
  * SELinuxOptions are the labels to be applied to the container
@@ -10297,7 +10382,7 @@ export type SELinuxOptions = Message<"k8s.io.api.core.v1.SELinuxOptions"> & {
  * Use `create(SELinuxOptionsSchema)` to create a new message.
  */
 export const SELinuxOptionsSchema: GenMessage<SELinuxOptions> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 182);
+  messageDesc(file_k8s_io_api_core_v1_generated, 183);
 
 /**
  * ScaleIOPersistentVolumeSource represents a persistent ScaleIO volume
@@ -10396,7 +10481,7 @@ export type ScaleIOPersistentVolumeSource = Message<"k8s.io.api.core.v1.ScaleIOP
  * Use `create(ScaleIOPersistentVolumeSourceSchema)` to create a new message.
  */
 export const ScaleIOPersistentVolumeSourceSchema: GenMessage<ScaleIOPersistentVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 183);
+  messageDesc(file_k8s_io_api_core_v1_generated, 184);
 
 /**
  * ScaleIOVolumeSource represents a persistent ScaleIO volume
@@ -10495,7 +10580,7 @@ export type ScaleIOVolumeSource = Message<"k8s.io.api.core.v1.ScaleIOVolumeSourc
  * Use `create(ScaleIOVolumeSourceSchema)` to create a new message.
  */
 export const ScaleIOVolumeSourceSchema: GenMessage<ScaleIOVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 184);
+  messageDesc(file_k8s_io_api_core_v1_generated, 185);
 
 /**
  * A scope selector represents the AND of the selectors represented
@@ -10520,7 +10605,7 @@ export type ScopeSelector = Message<"k8s.io.api.core.v1.ScopeSelector"> & {
  * Use `create(ScopeSelectorSchema)` to create a new message.
  */
 export const ScopeSelectorSchema: GenMessage<ScopeSelector> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 185);
+  messageDesc(file_k8s_io_api_core_v1_generated, 186);
 
 /**
  * A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator
@@ -10562,7 +10647,7 @@ export type ScopedResourceSelectorRequirement = Message<"k8s.io.api.core.v1.Scop
  * Use `create(ScopedResourceSelectorRequirementSchema)` to create a new message.
  */
 export const ScopedResourceSelectorRequirementSchema: GenMessage<ScopedResourceSelectorRequirement> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 186);
+  messageDesc(file_k8s_io_api_core_v1_generated, 187);
 
 /**
  * SeccompProfile defines a pod/container's seccomp profile settings.
@@ -10602,7 +10687,7 @@ export type SeccompProfile = Message<"k8s.io.api.core.v1.SeccompProfile"> & {
  * Use `create(SeccompProfileSchema)` to create a new message.
  */
 export const SeccompProfileSchema: GenMessage<SeccompProfile> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 187);
+  messageDesc(file_k8s_io_api_core_v1_generated, 188);
 
 /**
  * Secret holds secret data of a certain type. The total bytes of the values in
@@ -10669,7 +10754,7 @@ export type Secret = Message<"k8s.io.api.core.v1.Secret"> & {
  * Use `create(SecretSchema)` to create a new message.
  */
 export const SecretSchema: GenMessage<Secret> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 188);
+  messageDesc(file_k8s_io_api_core_v1_generated, 189);
 
 /**
  * SecretEnvSource selects a Secret to populate the environment
@@ -10702,7 +10787,7 @@ export type SecretEnvSource = Message<"k8s.io.api.core.v1.SecretEnvSource"> & {
  * Use `create(SecretEnvSourceSchema)` to create a new message.
  */
 export const SecretEnvSourceSchema: GenMessage<SecretEnvSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 189);
+  messageDesc(file_k8s_io_api_core_v1_generated, 190);
 
 /**
  * SecretKeySelector selects a key of a Secret.
@@ -10739,7 +10824,7 @@ export type SecretKeySelector = Message<"k8s.io.api.core.v1.SecretKeySelector">
  * Use `create(SecretKeySelectorSchema)` to create a new message.
  */
 export const SecretKeySelectorSchema: GenMessage<SecretKeySelector> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 190);
+  messageDesc(file_k8s_io_api_core_v1_generated, 191);
 
 /**
  * SecretList is a list of Secret.
@@ -10770,7 +10855,7 @@ export type SecretList = Message<"k8s.io.api.core.v1.SecretList"> & {
  * Use `create(SecretListSchema)` to create a new message.
  */
 export const SecretListSchema: GenMessage<SecretList> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 191);
+  messageDesc(file_k8s_io_api_core_v1_generated, 192);
 
 /**
  * Adapts a secret into a projected volume.
@@ -10817,7 +10902,7 @@ export type SecretProjection = Message<"k8s.io.api.core.v1.SecretProjection"> &
  * Use `create(SecretProjectionSchema)` to create a new message.
  */
 export const SecretProjectionSchema: GenMessage<SecretProjection> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 192);
+  messageDesc(file_k8s_io_api_core_v1_generated, 193);
 
 /**
  * SecretReference represents a Secret Reference. It has enough information to retrieve secret
@@ -10849,7 +10934,7 @@ export type SecretReference = Message<"k8s.io.api.core.v1.SecretReference"> & {
  * Use `create(SecretReferenceSchema)` to create a new message.
  */
 export const SecretReferenceSchema: GenMessage<SecretReference> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 193);
+  messageDesc(file_k8s_io_api_core_v1_generated, 194);
 
 /**
  * Adapts a Secret into a volume.
@@ -10913,7 +10998,7 @@ export type SecretVolumeSource = Message<"k8s.io.api.core.v1.SecretVolumeSource"
  * Use `create(SecretVolumeSourceSchema)` to create a new message.
  */
 export const SecretVolumeSourceSchema: GenMessage<SecretVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 194);
+  messageDesc(file_k8s_io_api_core_v1_generated, 195);
 
 /**
  * SecurityContext holds security configuration that will be applied to a container.
@@ -11067,7 +11152,7 @@ export type SecurityContext = Message<"k8s.io.api.core.v1.SecurityContext"> & {
  * Use `create(SecurityContextSchema)` to create a new message.
  */
 export const SecurityContextSchema: GenMessage<SecurityContext> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 195);
+  messageDesc(file_k8s_io_api_core_v1_generated, 196);
 
 /**
  * SerializedReference is a reference to serialized object.
@@ -11089,7 +11174,7 @@ export type SerializedReference = Message<"k8s.io.api.core.v1.SerializedReferenc
  * Use `create(SerializedReferenceSchema)` to create a new message.
  */
 export const SerializedReferenceSchema: GenMessage<SerializedReference> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 196);
+  messageDesc(file_k8s_io_api_core_v1_generated, 197);
 
 /**
  * Service is a named abstraction of software service (for example, mysql) consisting of local port
@@ -11134,7 +11219,7 @@ export type Service = Message<"k8s.io.api.core.v1.Service"> & {
  * Use `create(ServiceSchema)` to create a new message.
  */
 export const ServiceSchema: GenMessage<Service> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 197);
+  messageDesc(file_k8s_io_api_core_v1_generated, 198);
 
 /**
  * ServiceAccount binds together:
@@ -11199,7 +11284,7 @@ export type ServiceAccount = Message<"k8s.io.api.core.v1.ServiceAccount"> & {
  * Use `create(ServiceAccountSchema)` to create a new message.
  */
 export const ServiceAccountSchema: GenMessage<ServiceAccount> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 198);
+  messageDesc(file_k8s_io_api_core_v1_generated, 199);
 
 /**
  * ServiceAccountList is a list of ServiceAccount objects
@@ -11230,7 +11315,7 @@ export type ServiceAccountList = Message<"k8s.io.api.core.v1.ServiceAccountList"
  * Use `create(ServiceAccountListSchema)` to create a new message.
  */
 export const ServiceAccountListSchema: GenMessage<ServiceAccountList> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 199);
+  messageDesc(file_k8s_io_api_core_v1_generated, 200);
 
 /**
  * ServiceAccountTokenProjection represents a projected service account token
@@ -11279,7 +11364,7 @@ export type ServiceAccountTokenProjection = Message<"k8s.io.api.core.v1.ServiceA
  * Use `create(ServiceAccountTokenProjectionSchema)` to create a new message.
  */
 export const ServiceAccountTokenProjectionSchema: GenMessage<ServiceAccountTokenProjection> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 200);
+  messageDesc(file_k8s_io_api_core_v1_generated, 201);
 
 /**
  * ServiceList holds a list of services.
@@ -11309,7 +11394,7 @@ export type ServiceList = Message<"k8s.io.api.core.v1.ServiceList"> & {
  * Use `create(ServiceListSchema)` to create a new message.
  */
 export const ServiceListSchema: GenMessage<ServiceList> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 201);
+  messageDesc(file_k8s_io_api_core_v1_generated, 202);
 
 /**
  * ServicePort contains information on service's port.
@@ -11405,7 +11490,7 @@ export type ServicePort = Message<"k8s.io.api.core.v1.ServicePort"> & {
  * Use `create(ServicePortSchema)` to create a new message.
  */
 export const ServicePortSchema: GenMessage<ServicePort> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 202);
+  messageDesc(file_k8s_io_api_core_v1_generated, 203);
 
 /**
  * ServiceProxyOptions is the query options to a Service's proxy call.
@@ -11431,7 +11516,7 @@ export type ServiceProxyOptions = Message<"k8s.io.api.core.v1.ServiceProxyOption
  * Use `create(ServiceProxyOptionsSchema)` to create a new message.
  */
 export const ServiceProxyOptionsSchema: GenMessage<ServiceProxyOptions> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 203);
+  messageDesc(file_k8s_io_api_core_v1_generated, 204);
 
 /**
  * ServiceSpec describes the attributes that a user creates on a service.
@@ -11748,13 +11833,12 @@ export type ServiceSpec = Message<"k8s.io.api.core.v1.ServiceSpec"> & {
   internalTrafficPolicy: string;
 
   /**
-   * TrafficDistribution offers a way to express preferences for how traffic is
-   * distributed to Service endpoints. Implementations can use this field as a
-   * hint, but are not required to guarantee strict adherence. If the field is
-   * not set, the implementation will apply its default routing strategy. If set
-   * to "PreferClose", implementations should prioritize endpoints that are
-   * topologically close (e.g., same zone).
-   * This is a beta field and requires enabling ServiceTrafficDistribution feature.
+   * TrafficDistribution offers a way to express preferences for how traffic
+   * is distributed to Service endpoints. Implementations can use this field
+   * as a hint, but are not required to guarantee strict adherence. If the
+   * field is not set, the implementation will apply its default routing
+   * strategy. If set to "PreferClose", implementations should prioritize
+   * endpoints that are in the same zone.
    * +featureGate=ServiceTrafficDistribution
    * +optional
    *
@@ -11768,7 +11852,7 @@ export type ServiceSpec = Message<"k8s.io.api.core.v1.ServiceSpec"> & {
  * Use `create(ServiceSpecSchema)` to create a new message.
  */
 export const ServiceSpecSchema: GenMessage<ServiceSpec> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 204);
+  messageDesc(file_k8s_io_api_core_v1_generated, 205);
 
 /**
  * ServiceStatus represents the current status of a service.
@@ -11803,7 +11887,7 @@ export type ServiceStatus = Message<"k8s.io.api.core.v1.ServiceStatus"> & {
  * Use `create(ServiceStatusSchema)` to create a new message.
  */
 export const ServiceStatusSchema: GenMessage<ServiceStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 205);
+  messageDesc(file_k8s_io_api_core_v1_generated, 206);
 
 /**
  * SessionAffinityConfig represents the configurations of session affinity.
@@ -11825,7 +11909,7 @@ export type SessionAffinityConfig = Message<"k8s.io.api.core.v1.SessionAffinityC
  * Use `create(SessionAffinityConfigSchema)` to create a new message.
  */
 export const SessionAffinityConfigSchema: GenMessage<SessionAffinityConfig> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 206);
+  messageDesc(file_k8s_io_api_core_v1_generated, 207);
 
 /**
  * SleepAction describes a "sleep" action.
@@ -11846,7 +11930,7 @@ export type SleepAction = Message<"k8s.io.api.core.v1.SleepAction"> & {
  * Use `create(SleepActionSchema)` to create a new message.
  */
 export const SleepActionSchema: GenMessage<SleepAction> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 207);
+  messageDesc(file_k8s_io_api_core_v1_generated, 208);
 
 /**
  * Represents a StorageOS persistent volume resource.
@@ -11909,7 +11993,7 @@ export type StorageOSPersistentVolumeSource = Message<"k8s.io.api.core.v1.Storag
  * Use `create(StorageOSPersistentVolumeSourceSchema)` to create a new message.
  */
 export const StorageOSPersistentVolumeSourceSchema: GenMessage<StorageOSPersistentVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 208);
+  messageDesc(file_k8s_io_api_core_v1_generated, 209);
 
 /**
  * Represents a StorageOS persistent volume resource.
@@ -11972,7 +12056,7 @@ export type StorageOSVolumeSource = Message<"k8s.io.api.core.v1.StorageOSVolumeS
  * Use `create(StorageOSVolumeSourceSchema)` to create a new message.
  */
 export const StorageOSVolumeSourceSchema: GenMessage<StorageOSVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 209);
+  messageDesc(file_k8s_io_api_core_v1_generated, 210);
 
 /**
  * Sysctl defines a kernel parameter to be set
@@ -12000,7 +12084,7 @@ export type Sysctl = Message<"k8s.io.api.core.v1.Sysctl"> & {
  * Use `create(SysctlSchema)` to create a new message.
  */
 export const SysctlSchema: GenMessage<Sysctl> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 210);
+  messageDesc(file_k8s_io_api_core_v1_generated, 211);
 
 /**
  * TCPSocketAction describes an action based on opening a socket
@@ -12031,7 +12115,7 @@ export type TCPSocketAction = Message<"k8s.io.api.core.v1.TCPSocketAction"> & {
  * Use `create(TCPSocketActionSchema)` to create a new message.
  */
 export const TCPSocketActionSchema: GenMessage<TCPSocketAction> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 211);
+  messageDesc(file_k8s_io_api_core_v1_generated, 212);
 
 /**
  * The node this Taint is attached to has the "effect" on
@@ -12079,7 +12163,7 @@ export type Taint = Message<"k8s.io.api.core.v1.Taint"> & {
  * Use `create(TaintSchema)` to create a new message.
  */
 export const TaintSchema: GenMessage<Taint> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 212);
+  messageDesc(file_k8s_io_api_core_v1_generated, 213);
 
 /**
  * The pod this Toleration is attached to tolerates any taint that matches
@@ -12143,7 +12227,7 @@ export type Toleration = Message<"k8s.io.api.core.v1.Toleration"> & {
  * Use `create(TolerationSchema)` to create a new message.
  */
 export const TolerationSchema: GenMessage<Toleration> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 213);
+  messageDesc(file_k8s_io_api_core_v1_generated, 214);
 
 /**
  * A topology selector requirement is a selector that matches given label.
@@ -12174,7 +12258,7 @@ export type TopologySelectorLabelRequirement = Message<"k8s.io.api.core.v1.Topol
  * Use `create(TopologySelectorLabelRequirementSchema)` to create a new message.
  */
 export const TopologySelectorLabelRequirementSchema: GenMessage<TopologySelectorLabelRequirement> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 214);
+  messageDesc(file_k8s_io_api_core_v1_generated, 215);
 
 /**
  * A topology selector term represents the result of label queries.
@@ -12202,7 +12286,7 @@ export type TopologySelectorTerm = Message<"k8s.io.api.core.v1.TopologySelectorT
  * Use `create(TopologySelectorTermSchema)` to create a new message.
  */
 export const TopologySelectorTermSchema: GenMessage<TopologySelectorTerm> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 215);
+  messageDesc(file_k8s_io_api_core_v1_generated, 216);
 
 /**
  * TopologySpreadConstraint specifies how to spread matching pods among the given topology.
@@ -12325,7 +12409,6 @@ export type TopologySpreadConstraint = Message<"k8s.io.api.core.v1.TopologySprea
    * - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.
    *
    * If this value is nil, the behavior is equivalent to the Honor policy.
-   * This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.
    * +optional
    *
    * @generated from field: optional string nodeAffinityPolicy = 6;
@@ -12340,7 +12423,6 @@ export type TopologySpreadConstraint = Message<"k8s.io.api.core.v1.TopologySprea
    * - Ignore: node taints are ignored. All nodes are included.
    *
    * If this value is nil, the behavior is equivalent to the Ignore policy.
-   * This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.
    * +optional
    *
    * @generated from field: optional string nodeTaintsPolicy = 7;
@@ -12371,7 +12453,7 @@ export type TopologySpreadConstraint = Message<"k8s.io.api.core.v1.TopologySprea
  * Use `create(TopologySpreadConstraintSchema)` to create a new message.
  */
 export const TopologySpreadConstraintSchema: GenMessage<TopologySpreadConstraint> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 216);
+  messageDesc(file_k8s_io_api_core_v1_generated, 217);
 
 /**
  * TypedLocalObjectReference contains enough information to let you locate the
@@ -12425,7 +12507,7 @@ export type TypedLocalObjectReference = Message<"k8s.io.api.core.v1.TypedLocalOb
  * Use `create(TypedLocalObjectReferenceSchema)` to create a new message.
  */
 export const TypedLocalObjectReferenceSchema: GenMessage<TypedLocalObjectReference> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 217);
+  messageDesc(file_k8s_io_api_core_v1_generated, 218);
 
 /**
  * TypedObjectReference contains enough information to let you locate the typed referenced object
@@ -12474,7 +12556,7 @@ export type TypedObjectReference = Message<"k8s.io.api.core.v1.TypedObjectRefere
  * Use `create(TypedObjectReferenceSchema)` to create a new message.
  */
 export const TypedObjectReferenceSchema: GenMessage<TypedObjectReference> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 218);
+  messageDesc(file_k8s_io_api_core_v1_generated, 219);
 
 /**
  * Volume represents a named volume in a pod that may be accessed by any container in the pod.
@@ -12506,7 +12588,7 @@ export type Volume = Message<"k8s.io.api.core.v1.Volume"> & {
  * Use `create(VolumeSchema)` to create a new message.
  */
 export const VolumeSchema: GenMessage<Volume> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 219);
+  messageDesc(file_k8s_io_api_core_v1_generated, 220);
 
 /**
  * volumeDevice describes a mapping of a raw block device within a container.
@@ -12534,7 +12616,7 @@ export type VolumeDevice = Message<"k8s.io.api.core.v1.VolumeDevice"> & {
  * Use `create(VolumeDeviceSchema)` to create a new message.
  */
 export const VolumeDeviceSchema: GenMessage<VolumeDevice> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 220);
+  messageDesc(file_k8s_io_api_core_v1_generated, 221);
 
 /**
  * VolumeMount describes a mounting of a Volume within a container.
@@ -12630,7 +12712,7 @@ export type VolumeMount = Message<"k8s.io.api.core.v1.VolumeMount"> & {
  * Use `create(VolumeMountSchema)` to create a new message.
  */
 export const VolumeMountSchema: GenMessage<VolumeMount> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 221);
+  messageDesc(file_k8s_io_api_core_v1_generated, 222);
 
 /**
  * VolumeMountStatus shows status of volume mounts.
@@ -12677,7 +12759,7 @@ export type VolumeMountStatus = Message<"k8s.io.api.core.v1.VolumeMountStatus">
  * Use `create(VolumeMountStatusSchema)` to create a new message.
  */
 export const VolumeMountStatusSchema: GenMessage<VolumeMountStatus> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 222);
+  messageDesc(file_k8s_io_api_core_v1_generated, 223);
 
 /**
  * VolumeNodeAffinity defines constraints that limit what nodes this volume can be accessed from.
@@ -12698,7 +12780,7 @@ export type VolumeNodeAffinity = Message<"k8s.io.api.core.v1.VolumeNodeAffinity"
  * Use `create(VolumeNodeAffinitySchema)` to create a new message.
  */
 export const VolumeNodeAffinitySchema: GenMessage<VolumeNodeAffinity> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 223);
+  messageDesc(file_k8s_io_api_core_v1_generated, 224);
 
 /**
  * Projection that may be projected along with other supported volume types.
@@ -12767,7 +12849,7 @@ export type VolumeProjection = Message<"k8s.io.api.core.v1.VolumeProjection"> &
  * Use `create(VolumeProjectionSchema)` to create a new message.
  */
 export const VolumeProjectionSchema: GenMessage<VolumeProjection> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 224);
+  messageDesc(file_k8s_io_api_core_v1_generated, 225);
 
 /**
  * VolumeResourceRequirements describes the storage resource requirements for a volume.
@@ -12801,7 +12883,7 @@ export type VolumeResourceRequirements = Message<"k8s.io.api.core.v1.VolumeResou
  * Use `create(VolumeResourceRequirementsSchema)` to create a new message.
  */
 export const VolumeResourceRequirementsSchema: GenMessage<VolumeResourceRequirements> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 225);
+  messageDesc(file_k8s_io_api_core_v1_generated, 226);
 
 /**
  * Represents the source of a volume to mount.
@@ -13126,7 +13208,7 @@ export type VolumeSource = Message<"k8s.io.api.core.v1.VolumeSource"> & {
    * The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
    * The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
    * The volume will be mounted read-only (ro) and non-executable files (noexec).
-   * Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath).
+   * Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
    * The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
    * +featureGate=ImageVolume
    * +optional
@@ -13141,7 +13223,7 @@ export type VolumeSource = Message<"k8s.io.api.core.v1.VolumeSource"> & {
  * Use `create(VolumeSourceSchema)` to create a new message.
  */
 export const VolumeSourceSchema: GenMessage<VolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 226);
+  messageDesc(file_k8s_io_api_core_v1_generated, 227);
 
 /**
  * Represents a vSphere volume resource.
@@ -13188,7 +13270,7 @@ export type VsphereVirtualDiskVolumeSource = Message<"k8s.io.api.core.v1.Vsphere
  * Use `create(VsphereVirtualDiskVolumeSourceSchema)` to create a new message.
  */
 export const VsphereVirtualDiskVolumeSourceSchema: GenMessage<VsphereVirtualDiskVolumeSource> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 227);
+  messageDesc(file_k8s_io_api_core_v1_generated, 228);
 
 /**
  * The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
@@ -13217,7 +13299,7 @@ export type WeightedPodAffinityTerm = Message<"k8s.io.api.core.v1.WeightedPodAff
  * Use `create(WeightedPodAffinityTermSchema)` to create a new message.
  */
 export const WeightedPodAffinityTermSchema: GenMessage<WeightedPodAffinityTerm> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 228);
+  messageDesc(file_k8s_io_api_core_v1_generated, 229);
 
 /**
  * WindowsSecurityContextOptions contain Windows-specific options and credentials.
@@ -13271,5 +13353,5 @@ export type WindowsSecurityContextOptions = Message<"k8s.io.api.core.v1.WindowsS
  * Use `create(WindowsSecurityContextOptionsSchema)` to create a new message.
  */
 export const WindowsSecurityContextOptionsSchema: GenMessage<WindowsSecurityContextOptions> = /*@__PURE__*/
-  messageDesc(file_k8s_io_api_core_v1_generated, 229);
+  messageDesc(file_k8s_io_api_core_v1_generated, 230);
 
diff --git a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json
index 5cb6eb4e..beaaa225 100644
--- a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json
+++ b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json
@@ -186,7 +186,7 @@
                 "description": "Sources describes where the requested Freight may be obtained from. This is\na required field.",
                 "properties": {
                   "availabilityStrategy": {
-                    "description": "AvailabilityStrategy specifies the semantics for how requested Freight is\nmade available to the Stage. This field is optional. When left unspecified,\nthe field is implicitly treated as if its value were \"OneOf\".",
+                    "description": "AvailabilityStrategy specifies the semantics for how requested Freight is\nmade available to the Stage. This field is optional. When left unspecified,\nthe field is implicitly treated as if its value were \"OneOf\".\n\nAccepted Values:\n\n- \"All\": Freight must be be verified and, if applicable, soaked in all\n  upstream Stages to be considered available for promotion.\n- \"OneOf\": Freight must be verified and, if applicable, soaked in at least\n   one upstream Stage to be considered available for promotion.\n- \"\": Treated the same as \"OneOf\".",
                     "enum": [
                       "All",
                       "OneOf",
diff --git a/ui/src/gen/schema/warehouses.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/warehouses.kargo.akuity.io_v1alpha1.json
index 31d2df54..2c22e6c9 100644
--- a/ui/src/gen/schema/warehouses.kargo.akuity.io_v1alpha1.json
+++ b/ui/src/gen/schema/warehouses.kargo.akuity.io_v1alpha1.json
@@ -18,7 +18,7 @@
       "properties": {
         "freightCreationPolicy": {
           "default": "Automatic",
-          "description": "FreightCreationPolicy describes how Freight is created by this Warehouse.\nThis field is optional. When left unspecified, the field is implicitly\ntreated as if its value were \"Automatic\".\nAccepted values: Automatic, Manual",
+          "description": "FreightCreationPolicy describes how Freight is created by this Warehouse.\nThis field is optional. When left unspecified, the field is implicitly\ntreated as if its value were \"Automatic\".\n\nAccepted values:\n\n- \"Automatic\": New Freight is created automatically when any new artifact\n  is discovered.\n- \"Manual\": New Freight is never created automatically.",
           "enum": [
             "Automatic",
             "Manual"
@@ -87,7 +87,7 @@
                   },
                   "commitSelectionStrategy": {
                     "default": "NewestFromBranch",
-                    "description": "CommitSelectionStrategy specifies the rules for how to identify the newest\ncommit of interest in the repository specified by the RepoURL field. This\nfield is optional. When left unspecified, the field is implicitly treated\nas if its value were \"NewestFromBranch\".\nAccepted values: Lexical, NewestFromBranch, NewestTag, SemVer",
+                    "description": "CommitSelectionStrategy specifies the rules for how to identify the newest\ncommit of interest in the repository specified by the RepoURL field. This\nfield is optional. When left unspecified, the field is implicitly treated\nas if its value were \"NewestFromBranch\".\n\nAccepted values:\n\n- \"NewestFromBranch\": Selects the latest commit on the branch specified\n  by the Branch field or the default branch if none is specified. This is\n  the default strategy.\n\n- \"SemVer\": Selects the commit referenced by the the semantically greatest\n  tag. The SemverConstraint field can optionally be used to narrow the set\n  of tags eligible for selection.\n\n- \"Lexical\": Selects the commit referenced by the lexicographically\n  greatest tag. Useful when tags embed a _leading_ date or timestamp. The\n  AllowTags and IgnoreTags fields can optionally be used to narrow the set\n  of tags eligible for selection.\n\n- \"NewestTag\": Selects the commit referenced by the most recently created\n  tag. The AllowTags and IgnoreTags fields can optionally be used to\n  narrow the set of tags eligible for selection.",
                     "enum": [
                       "Lexical",
                       "NewestFromBranch",
@@ -119,7 +119,7 @@
                     "type": "array"
                   },
                   "includePaths": {
-                    "description": "IncludePaths is a list of selectors that designate paths in the repository\nthat should trigger the production of new Freight when changes are detected\ntherein. When specified, only changes in the identified paths will trigger\nFreight production. When not specified, changes in any path will trigger\nFreight production. Selectors may be defined using:\n  1. Exact paths to files or directories (ex. \"charts/foo\")\n  2. Glob patterns (prefix the pattern with \"glob:\"; ex. \"glob:*.yaml\")\n  3. Regular expressions (prefix the pattern with \"regex:\" or \"regexp:\";\n     ex. \"regexp:^.*\\.yaml$\")\nPaths selected by IncludePaths may be unselected by ExcludePaths. This\nis a useful method for including a broad set of paths and then excluding a\nsubset of them.",
+                    "description": "IncludePaths is a list of selectors that designate paths in the repository\nthat should trigger the production of new Freight when changes are detected\ntherein. When specified, only changes in the identified paths will trigger\nFreight production. When not specified, changes in any path will trigger\nFreight production. Selectors may be defined using:\n  1. Exact paths to files or directories (ex. \"charts/foo\")\n  2. Glob patterns (prefix the pattern with \"glob:\"; ex. \"glob:*.yaml\")\n  3. Regular expressions (prefix the pattern with \"regex:\" or \"regexp:\";\n     ex. \"regexp:^.*\\.yaml$\")\n\nPaths selected by IncludePaths may be unselected by ExcludePaths. This\nis a useful method for including a broad set of paths and then excluding a\nsubset of them.",
                     "items": {
                       "type": "string"
                     },
@@ -132,7 +132,7 @@
                   "repoURL": {
                     "description": "URL is the repository's URL. This is a required field.",
                     "minLength": 1,
-                    "pattern": "(?:^(https?)://(?:([\\w-]+):(.+)@)?([\\w-]+(?:\\.[\\w-]+)*)(?::(\\d{1,5}))?(/.*)$)|(?:^([\\w-]+)@([\\w+]+(?:\\.[\\w-]+)*):(/?.*))",
+                    "pattern": "(?:^(ssh|https?)://(?:([\\w-]+)(:(.+))?@)?([\\w-]+(?:\\.[\\w-]+)*)(?::(\\d{1,5}))?(/.*)$)|(?:^([\\w-]+)@([\\w+]+(?:\\.[\\w-]+)*):(/?.*))",
                     "type": "string"
                   },
                   "semverConstraint": {
@@ -180,7 +180,7 @@
                   },
                   "imageSelectionStrategy": {
                     "default": "SemVer",
-                    "description": "ImageSelectionStrategy specifies the rules for how to identify the newest version\nof the image specified by the RepoURL field. This field is optional. When\nleft unspecified, the field is implicitly treated as if its value were\n\"SemVer\".\nAccepted values: Digest, Lexical, NewestBuild, SemVer",
+                    "description": "ImageSelectionStrategy specifies the rules for how to identify the newest version\nof the image specified by the RepoURL field. This field is optional. When\nleft unspecified, the field is implicitly treated as if its value were\n\"SemVer\".\n\nAccepted values:\n\n- \"Digest\": Selects the image currently referenced by the tag specified\n  (unintuitively) by the SemverConstraint field.\n\n- \"Lexical\": Selects the image referenced by the lexicographically greatest\n  tag. Useful when tags embed a leading date or timestamp. The AllowTags\n  and IgnoreTags fields can optionally be used to narrow the set of tags\n  eligible for selection.\n\n- \"NewestBuild\": Selects the image that was most recently pushed to the\n  repository. The AllowTags and IgnoreTags fields can optionally be used\n  to narrow the set of tags eligible for selection. This is the least\n  efficient and is likely to cause rate limiting affecting this Warehouse\n  and possibly others. This strategy should be avoided.\n\n- \"SemVer\": Selects the image with the semantically greatest tag. The\n  AllowTags and IgnoreTags fields can optionally be used to narrow the set\n  of tags eligible for selection.",
                     "enum": [
                       "Digest",
                       "Lexical",
@@ -384,7 +384,7 @@
                   "repoURL": {
                     "description": "RepoURL is the repository URL of the GitSubscription.",
                     "minLength": 1,
-                    "pattern": "(?:^(https?)://(?:([\\w-]+):(.+)@)?([\\w-]+(?:\\.[\\w-]+)*)(?::(\\d{1,5}))?(/.*)$)|(?:^([\\w-]+)@([\\w+]+(?:\\.[\\w-]+)*):(/?.*))",
+                    "pattern": "(?:^(ssh|https?)://(?:([\\w-]+)(:(.+))?@)?([\\w-]+(?:\\.[\\w-]+)*)(?::(\\d{1,5}))?(/.*)$)|(?:^([\\w-]+)@([\\w+]+(?:\\.[\\w-]+)*):(/?.*))",
                     "type": "string"
                   }
                 },
diff --git a/ui/src/plugins/pr-plugin/deep-link/promotion-step.tsx b/ui/src/plugins/pr-plugin/deep-link/promotion-step.tsx
index 500581d1..aef4f0f7 100644
--- a/ui/src/plugins/pr-plugin/deep-link/promotion-step.tsx
+++ b/ui/src/plugins/pr-plugin/deep-link/promotion-step.tsx
@@ -38,7 +38,7 @@ const plugin: DeepLinkPluginsInstallation['PromotionStep'] = {
       );
     }
 
-    const url = getPullRequestLink(props.step, props.output || {});
+    const url = getPullRequestLink(props.output || {});
 
     nodes.push(
       <a href={url} target='_blank'>
diff --git a/ui/src/plugins/pr-plugin/deep-link/promotion.tsx b/ui/src/plugins/pr-plugin/deep-link/promotion.tsx
index 9ccb30fd..81ba9c39 100644
--- a/ui/src/plugins/pr-plugin/deep-link/promotion.tsx
+++ b/ui/src/plugins/pr-plugin/deep-link/promotion.tsx
@@ -22,7 +22,7 @@ const plugin: DeepLinkPluginsInstallation['Promotion'] = {
         const alias = getPromotionStepAlias(step, idx);
 
         try {
-          const deepLink = getPullRequestLink(step, promotionState[alias]);
+          const deepLink = getPullRequestLink(promotionState[alias]);
 
           deepLinks.push([alias, deepLink]);
         } catch {
diff --git a/ui/src/plugins/pr-plugin/get-pr-link.ts b/ui/src/plugins/pr-plugin/get-pr-link.ts
index 1a911760..883f2c4f 100644
--- a/ui/src/plugins/pr-plugin/get-pr-link.ts
+++ b/ui/src/plugins/pr-plugin/get-pr-link.ts
@@ -1,40 +1,2 @@
-import gitUrlParse from 'git-url-parse';
-
-import { PromotionStep } from '@ui/gen/api/v1alpha1/generated_pb';
-import { getPromotionStepConfig } from '@ui/plugins/atoms/plugin-helper';
-
-export const getPullRequestLink = (
-  promotionStep: PromotionStep,
-  promotionStepOutput: Record<string, unknown>
-) => {
-  const stepConfig = getPromotionStepConfig(promotionStep);
-
-  // plugins responsibility to keep up to date with actual promotion step config
-  const provider =
-    (stepConfig?.provider as 'github' | 'gitlab') || 'github'; /* default provider is github */
-
-  const repoURL = stepConfig?.repoURL as string;
-
-  const prNumber = promotionStepOutput?.prNumber;
-
-  if (typeof prNumber !== 'number' || !repoURL) {
-    // TODO: Throw plugin identified error to handle it at plugin level
-    throw new Error(
-      `cannot generate pull request link, either promotion step didn't return proper output or promotion step config is corrupted`
-    );
-  }
-
-  const parsedUrl = gitUrlParse(repoURL);
-
-  const url = `${parsedUrl.protocol}://${parsedUrl.resource}/${parsedUrl.full_name}`;
-
-  if (provider === 'github') {
-    return `${url}/pull/${prNumber}`;
-  }
-
-  if (provider === 'gitlab') {
-    return `${url}/merge_requests/${prNumber}`;
-  }
-
-  throw new Error(`provider ${provider} not supported by this plugin`);
-};
+export const getPullRequestLink = (promotionStepOutput: Record<string, unknown>) =>
+  (promotionStepOutput as { pr: { url: string } }).pr.url;
diff --git a/ui/src/utils/decode-raw-data.ts b/ui/src/utils/decode-raw-data.ts
index fdeb3994..3c097017 100644
--- a/ui/src/utils/decode-raw-data.ts
+++ b/ui/src/utils/decode-raw-data.ts
@@ -12,7 +12,8 @@ type Data = {
           | 'clusterAnalysisTemplate'
           | 'warehouse'
           | 'promotionTask'
-          | 'promotion';
+          | 'promotion'
+          | 'projectConfig';
       }
     | {
         value: Uint8Array;



Test patch:
diff --git a/internal/controller/controllertest/testing.go b/internal/controller/controllertest/testing.go
new file mode 100644
index 00000000..25db3627
--- /dev/null
+++ b/internal/controller/controllertest/testing.go
@@ -0,0 +1,78 @@
+/*
+Copyright 2018 The Kubernetes 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.
+*/
+
+// NB(hidde): Copied from https://github.com/kubernetes-sigs/controller-runtime/blob/2070bf4ee04c23ebae5f3d1e639567d9c160a7a4/pkg/controller/controllertest/testing.go
+// to unblock us from updating Kubernetes. Can be removed once upstream
+// has released a version with this change.
+// nolint: lll
+
+package controllertest
+
+import (
+	"sync"
+	"time"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/client-go/util/workqueue"
+	"sigs.k8s.io/controller-runtime/pkg/reconcile"
+)
+
+var _ runtime.Object = &ErrorType{}
+
+// ErrorType implements runtime.Object but isn't registered in any scheme and should cause errors in tests as a result.
+type ErrorType struct{}
+
+// GetObjectKind implements runtime.Object.
+func (ErrorType) GetObjectKind() schema.ObjectKind { return nil }
+
+// DeepCopyObject implements runtime.Object.
+func (ErrorType) DeepCopyObject() runtime.Object { return nil }
+
+var _ workqueue.TypedRateLimitingInterface[reconcile.Request] = &Queue{}
+
+// Queue implements a RateLimiting queue as a non-ratelimited queue for testing.
+// This helps testing by having functions that use a RateLimiting queue synchronously add items to the queue.
+type Queue = TypedQueue[reconcile.Request]
+
+// TypedQueue implements a RateLimiting queue as a non-ratelimited queue for testing.
+// This helps testing by having functions that use a RateLimiting queue synchronously add items to the queue.
+type TypedQueue[request comparable] struct {
+	workqueue.TypedInterface[request]
+	AddedRateLimitedLock sync.Mutex
+	AddedRatelimited     []any
+}
+
+// AddAfter implements RateLimitingInterface.
+func (q *TypedQueue[request]) AddAfter(item request, _ time.Duration) {
+	q.Add(item)
+}
+
+// AddRateLimited implements RateLimitingInterface.  TODO(community): Implement this.
+func (q *TypedQueue[request]) AddRateLimited(item request) {
+	q.AddedRateLimitedLock.Lock()
+	q.AddedRatelimited = append(q.AddedRatelimited, item)
+	q.AddedRateLimitedLock.Unlock()
+	q.Add(item)
+}
+
+// Forget implements RateLimitingInterface.  TODO(community): Implement this.
+func (q *TypedQueue[request]) Forget(_ request) {}
+
+// NumRequeues implements RateLimitingInterface.  TODO(community): Implement this.
+func (q *TypedQueue[request]) NumRequeues(_ request) int {
+	return 0
+}
diff --git a/internal/controller/git/repo_test.go b/internal/controller/git/repo_test.go
index 54f3732e..c67b10c6 100644
--- a/internal/controller/git/repo_test.go
+++ b/internal/controller/git/repo_test.go
@@ -103,7 +103,10 @@ func TestRepo(t *testing.T) {
 		require.True(t, hasDiffs)
 	})
 
-	testCommitMessage := fmt.Sprintf("test commit %s", uuid.NewString())
+	testCommitMessage := fmt.Sprintf(`test commit %s
+
+with a body
+`, uuid.NewString())
 	err = rep.AddAllAndCommit(testCommitMessage, nil)
 	require.NoError(t, err)
 
diff --git a/internal/controller/management/projects/event_handlers_test.go b/internal/controller/management/projects/event_handlers_test.go
index a76beed9..6ae5c618 100644
--- a/internal/controller/management/projects/event_handlers_test.go
+++ b/internal/controller/management/projects/event_handlers_test.go
@@ -9,11 +9,11 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/util/workqueue"
-	"sigs.k8s.io/controller-runtime/pkg/controller/controllertest"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+	"github.com/akuity/kargo/internal/controller/controllertest"
 )
 
 func Test_projectWarehouseHealthEnqueuer_Update(t *testing.T) {
diff --git a/internal/controller/stages/event_handlers_test.go b/internal/controller/stages/event_handlers_test.go
index 5de053f4..3d5367cf 100644
--- a/internal/controller/stages/event_handlers_test.go
+++ b/internal/controller/stages/event_handlers_test.go
@@ -14,13 +14,13 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
-	"sigs.k8s.io/controller-runtime/pkg/controller/controllertest"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	rollouts "github.com/akuity/kargo/api/stubs/rollouts/v1alpha1"
 	kargoapi "github.com/akuity/kargo/api/v1alpha1"
 	argocd "github.com/akuity/kargo/internal/controller/argocd/api/v1alpha1"
+	"github.com/akuity/kargo/internal/controller/controllertest"
 	"github.com/akuity/kargo/internal/indexer"
 )
 
diff --git a/internal/expressions/json_templates_test.go b/internal/expressions/json_templates_test.go
index ae3d9f21..5fb5b9f5 100644
--- a/internal/expressions/json_templates_test.go
+++ b/internal/expressions/json_templates_test.go
@@ -230,6 +230,16 @@ func TestEvaluateJSONTemplate(t *testing.T) {
 				require.Equal(t, "foo", parsed.AString)
 			},
 		},
+		{
+			name:         "unsafeQuote function does double quote string input",
+			jsonTemplate: `{ "AString": "${{ unsafeQuote('foo') }}" }`,
+			assertions: func(t *testing.T, jsonOutput []byte, err error) {
+				require.NoError(t, err)
+				parsed := testStruct{}
+				require.NoError(t, json.Unmarshal(jsonOutput, &parsed))
+				require.Equal(t, "\"foo\"", parsed.AString)
+			},
+		},
 		{
 			name: "a variety of tricky cases dealing with YAML and quotes",
 			yamlTemplate: `
diff --git a/internal/promotion/runner/builtin/git_commiter_test.go b/internal/promotion/runner/builtin/git_commiter_test.go
index 620a16c9..a8834958 100644
--- a/internal/promotion/runner/builtin/git_commiter_test.go
+++ b/internal/promotion/runner/builtin/git_commiter_test.go
@@ -253,5 +253,5 @@ func Test_gitCommitter_run(t *testing.T) {
 	require.Equal(t, expectedCommit, actualCommit)
 	lastCommitMsg, err := workTree.CommitMessage("HEAD")
 	require.NoError(t, err)
-	require.Equal(t, "Initial commit", lastCommitMsg)
+	require.Equal(t, "Initial commit\n", lastCommitMsg)
 }
diff --git a/internal/promotion/runner/builtin/git_pr_opener_test.go b/internal/promotion/runner/builtin/git_pr_opener_test.go
index 0dacd682..d9eaf201 100644
--- a/internal/promotion/runner/builtin/git_pr_opener_test.go
+++ b/internal/promotion/runner/builtin/git_pr_opener_test.go
@@ -102,6 +102,42 @@ func Test_gitPROpener_validate(t *testing.T) {
 				"title":        "custom title",
 			},
 		},
+		{
+			name: "invalid with empty title",
+			config: promotion.Config{
+				"provider":     "github",
+				"repoURL":      "https://github.com/example/repo.git",
+				"sourceBranch": "fake-branch",
+				"targetBranch": "another-fake-branch",
+				"title":        "",
+			},
+			expectedProblems: []string{
+				"title: String length must be greater than or equal to 1",
+			},
+		},
+		{
+			name: "valid with custom description",
+			config: promotion.Config{
+				"provider":     "github",
+				"repoURL":      "https://github.com/example/repo.git",
+				"sourceBranch": "fake-branch",
+				"targetBranch": "another-fake-branch",
+				"description":  "custom description",
+			},
+		},
+		{
+			name: "invalid with empty description",
+			config: promotion.Config{
+				"provider":     "github",
+				"repoURL":      "https://github.com/example/repo.git",
+				"sourceBranch": "fake-branch",
+				"targetBranch": "another-fake-branch",
+				"description":  "",
+			},
+			expectedProblems: []string{
+				"description: String length must be greater than or equal to 1",
+			},
+		},
 	}
 
 	r := newGitPROpener(nil)
@@ -207,6 +243,7 @@ func Test_gitPROpener_run(t *testing.T) {
 			CreateTargetBranch: true,
 			Provider:           ptr.To(builtin.Provider(fakeGitProviderName)),
 			Title:              "kargo",
+			Description:        "kargo description",
 		},
 	)
 	require.NoError(t, err)
diff --git a/internal/promotion/runner/builtin/yaml_updater_test.go b/internal/promotion/runner/builtin/yaml_updater_test.go
index 8d88d4b7..4b82c01d 100644
--- a/internal/promotion/runner/builtin/yaml_updater_test.go
+++ b/internal/promotion/runner/builtin/yaml_updater_test.go
@@ -95,6 +95,10 @@ func Test_yamlUpdater_validate(t *testing.T) {
 						"key":   "another-fake-key",
 						"value": "another-fake-value",
 					},
+					{
+						"key":   "yet-another-fake-key",
+						"value": 5,
+					},
 				},
 			},
 		},
@@ -135,22 +139,35 @@ func Test_yamlUpdater_run(t *testing.T) {
 				Path: "values.yaml",
 				Updates: []builtin.YAMLUpdate{
 					{Key: "image.tag", Value: "fake-tag"},
+					{Key: "image.numStr", Value: "42"},
+					{Key: "image.realNum", Value: 42},
 				},
 			},
 			files: map[string]string{
-				"values.yaml": "image:\n  tag: oldtag\n",
+				"values.yaml": `
+image:
+  tag: oldtag
+  numStr: "5"
+  realNum: 5
+`,
 			},
 			assertions: func(t *testing.T, workDir string, result promotion.StepResult, err error) {
 				assert.NoError(t, err)
 				assert.Equal(t, promotion.StepResult{
 					Status: kargoapi.PromotionStepStatusSucceeded,
 					Output: map[string]any{
-						"commitMessage": "Updated values.yaml\n\n- image.tag: \"fake-tag\"",
+						"commitMessage": `Updated values.yaml
+
+- image.tag: fake-tag
+- image.numStr: "42"
+- image.realNum: 42`,
 					},
 				}, result)
 				content, err := os.ReadFile(path.Join(workDir, "values.yaml"))
 				require.NoError(t, err)
-				assert.Contains(t, string(content), "tag: fake-tag")
+				assert.Contains(t, string(content), "  tag: fake-tag")
+				assert.Contains(t, string(content), `  numStr: "42"`)
+				assert.Contains(t, string(content), "  realNum: 42")
 			},
 		},
 		{
@@ -272,7 +289,7 @@ func Test_yamlUpdater_generateCommitMessage(t *testing.T) {
 			assertions: func(t *testing.T, result string) {
 				assert.Equal(t, `Updated values.yaml
 
-- image: "repo/image:tag1"`, result)
+- image: repo/image:tag1`, result)
 			},
 		},
 		{
@@ -281,12 +298,20 @@ func Test_yamlUpdater_generateCommitMessage(t *testing.T) {
 			updates: []builtin.YAMLUpdate{
 				{Key: "image1", Value: "repo1/image1:tag1"},
 				{Key: "image2", Value: "repo2/image2:tag2"},
+				{Key: "numStr", Value: "42"},
+				{Key: "realNum", Value: 42},
 			},
 			assertions: func(t *testing.T, result string) {
-				assert.Equal(t, `Updated chart/values.yaml
+				assert.Equal(
+					t,
+					`Updated chart/values.yaml
 
-- image1: "repo1/image1:tag1"
-- image2: "repo2/image2:tag2"`, result)
+- image1: repo1/image1:tag1
+- image2: repo2/image2:tag2
+- numStr: "42"
+- realNum: 42`,
+					result,
+				)
 			},
 		},
 	}
diff --git a/internal/server/get_project_config_v1alpha1_test.go b/internal/server/get_project_config_v1alpha1_test.go
new file mode 100644
index 00000000..1294712f
--- /dev/null
+++ b/internal/server/get_project_config_v1alpha1_test.go
@@ -0,0 +1,221 @@
+package server
+
+import (
+	"context"
+	"testing"
+
+	"connectrpc.com/connect"
+	"github.com/stretchr/testify/require"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/client-go/rest"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/client/fake"
+	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
+
+	svcv1alpha1 "github.com/akuity/kargo/api/service/v1alpha1"
+	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+	"github.com/akuity/kargo/internal/server/kubernetes"
+)
+
+func TestGetProjectConfig(t *testing.T) {
+	testCases := map[string]struct {
+		req         *svcv1alpha1.GetProjectConfigRequest
+		objects     []client.Object
+		interceptor interceptor.Funcs
+		assertions  func(*testing.T, *connect.Response[svcv1alpha1.GetProjectConfigResponse], error)
+	}{
+		"empty name": {
+			req: &svcv1alpha1.GetProjectConfigRequest{
+				Name: "",
+			},
+			objects: []client.Object{
+				&kargoapi.ProjectConfig{
+					ObjectMeta: metav1.ObjectMeta{
+						Name: "kargo-demo",
+					},
+				},
+			},
+			assertions: func(t *testing.T, r *connect.Response[svcv1alpha1.GetProjectConfigResponse], err error) {
+				require.Error(t, err)
+				require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
+				require.Nil(t, r)
+			},
+		},
+		"non-existing ProjectConfig": {
+			req: &svcv1alpha1.GetProjectConfigRequest{
+				Name: "kargo-x",
+			},
+			objects: []client.Object{},
+			assertions: func(t *testing.T, r *connect.Response[svcv1alpha1.GetProjectConfigResponse], err error) {
+				require.Error(t, err)
+				require.Equal(t, connect.CodeNotFound, connect.CodeOf(err))
+				require.Nil(t, r)
+			},
+		},
+		"existing ProjectConfig": {
+			req: &svcv1alpha1.GetProjectConfigRequest{
+				Name: "kargo-demo",
+			},
+			objects: []client.Object{
+				&kargoapi.ProjectConfig{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "kargo-demo",
+						Namespace: "kargo-demo",
+					},
+				},
+			},
+			assertions: func(t *testing.T, r *connect.Response[svcv1alpha1.GetProjectConfigResponse], err error) {
+				require.NoError(t, err)
+
+				require.NotNil(t, r)
+				require.Nil(t, r.Msg.GetRaw())
+
+				require.NotNil(t, r.Msg.GetProjectConfig())
+				require.Equal(t, "kargo-demo", r.Msg.GetProjectConfig().Name)
+			},
+		},
+		"raw format JSON": {
+			req: &svcv1alpha1.GetProjectConfigRequest{
+				Name:   "kargo-demo",
+				Format: svcv1alpha1.RawFormat_RAW_FORMAT_JSON,
+			},
+			objects: []client.Object{
+				&kargoapi.ProjectConfig{
+					TypeMeta: metav1.TypeMeta{
+						Kind:       "ProjectConfig",
+						APIVersion: kargoapi.GroupVersion.String(),
+					},
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "kargo-demo",
+						Namespace: "kargo-demo",
+					},
+					Spec: kargoapi.ProjectConfigSpec{
+						PromotionPolicies: []kargoapi.PromotionPolicy{
+							{
+								AutoPromotionEnabled: true,
+								StageSelector: &kargoapi.PromotionPolicySelector{
+									Name: "foo",
+								},
+							},
+						},
+					},
+				},
+			},
+			assertions: func(t *testing.T, r *connect.Response[svcv1alpha1.GetProjectConfigResponse], err error) {
+				require.NoError(t, err)
+
+				require.NotNil(t, r)
+				require.Nil(t, r.Msg.GetProjectConfig())
+				require.NotNil(t, r.Msg.GetRaw())
+
+				scheme := runtime.NewScheme()
+				require.NoError(t, kargoapi.AddToScheme(scheme))
+
+				obj, _, err := serializer.NewCodecFactory(scheme).UniversalDeserializer().Decode(
+					r.Msg.GetRaw(),
+					nil,
+					nil,
+				)
+
+				require.NoError(t, err)
+				tObj, ok := obj.(*kargoapi.ProjectConfig)
+				require.True(t, ok)
+				require.Equal(t, "kargo-demo", tObj.Name)
+				require.Equal(t, "kargo-demo", tObj.Namespace)
+				require.Equal(t, 1, len(tObj.Spec.PromotionPolicies))
+				require.Equal(t, true, tObj.Spec.PromotionPolicies[0].AutoPromotionEnabled)
+				require.Equal(t, "foo", tObj.Spec.PromotionPolicies[0].StageSelector.Name)
+			},
+		},
+		"raw format YAML": {
+			req: &svcv1alpha1.GetProjectConfigRequest{
+				Name:   "kargo-demo",
+				Format: svcv1alpha1.RawFormat_RAW_FORMAT_YAML,
+			},
+			objects: []client.Object{
+				&kargoapi.ProjectConfig{
+					TypeMeta: metav1.TypeMeta{
+						Kind:       "ProjectConfig",
+						APIVersion: kargoapi.GroupVersion.String(),
+					},
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "kargo-demo",
+						Namespace: "kargo-demo",
+					},
+					Spec: kargoapi.ProjectConfigSpec{
+						PromotionPolicies: []kargoapi.PromotionPolicy{
+							{
+								AutoPromotionEnabled: true,
+								StageSelector: &kargoapi.PromotionPolicySelector{
+									Name: "foo",
+								},
+							},
+						},
+					},
+				},
+			},
+			assertions: func(t *testing.T, c *connect.Response[svcv1alpha1.GetProjectConfigResponse], err error) {
+				require.NoError(t, err)
+
+				require.NotNil(t, c)
+				require.Nil(t, c.Msg.GetProjectConfig())
+				require.NotNil(t, c.Msg.GetRaw())
+
+				scheme := runtime.NewScheme()
+				require.NoError(t, kargoapi.AddToScheme(scheme))
+
+				obj, _, err := serializer.NewCodecFactory(scheme).UniversalDeserializer().Decode(
+					c.Msg.GetRaw(),
+					nil,
+					nil,
+				)
+				require.NoError(t, err)
+				tObj, ok := obj.(*kargoapi.ProjectConfig)
+				require.True(t, ok)
+				require.Equal(t, "kargo-demo", tObj.Name)
+				require.Equal(t, "kargo-demo", tObj.Namespace)
+				require.Equal(t, 1, len(tObj.Spec.PromotionPolicies))
+				require.Equal(t, true, tObj.Spec.PromotionPolicies[0].AutoPromotionEnabled)
+				require.Equal(t, "foo", tObj.Spec.PromotionPolicies[0].StageSelector.Name)
+			},
+		},
+	}
+
+	for name, testCase := range testCases {
+		t.Run(name, func(t *testing.T) {
+			t.Parallel()
+
+			ctx := context.Background()
+
+			client, err := kubernetes.NewClient(
+				ctx,
+				&rest.Config{},
+				kubernetes.ClientOptions{
+					SkipAuthorization: true,
+					NewInternalClient: func(
+						_ context.Context,
+						_ *rest.Config,
+						scheme *runtime.Scheme,
+					) (client.Client, error) {
+						c := fake.NewClientBuilder().WithScheme(scheme).WithInterceptorFuncs(testCase.interceptor)
+						if len(testCase.objects) > 0 {
+							c.WithObjects(testCase.objects...)
+						}
+						return c.Build(), nil
+					},
+				},
+			)
+
+			require.NoError(t, err)
+
+			svr := &server{
+				client: client,
+			}
+
+			res, err := (svr).GetProjectConfig(ctx, connect.NewRequest(testCase.req))
+			testCase.assertions(t, res, err)
+		})
+	}
+}
diff --git a/internal/yaml/quote_test.go b/internal/yaml/quote_test.go
new file mode 100644
index 00000000..7b820b4d
--- /dev/null
+++ b/internal/yaml/quote_test.go
@@ -0,0 +1,33 @@
+package yaml
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+func TestQuoteIfNecessary(t *testing.T) {
+	tests := []struct {
+		input    any
+		expected any
+	}{
+		{123, 123},
+		{123.0, 123.0},
+		{true, true},
+		{false, false},
+		{nil, nil},
+		{"123", `"123"`},
+		{"true", `"true"`},
+		{"false", `"false"`},
+		{"null", `"null"`},
+		{"[1, 2, 3]", `"[1, 2, 3]"`},
+		{`{"key": "value"}`, `"{\"key\": \"value\"}"`},
+		{"string", "string"},
+	}
+	for i, test := range tests {
+		t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
+			require.Equal(t, test.expected, QuoteIfNecessary(test.input))
+		})
+	}
+}
diff --git a/internal/yaml/yaml_test.go b/internal/yaml/yaml_test.go
index 1783f5fd..5cf2a7bd 100644
--- a/internal/yaml/yaml_test.go
+++ b/internal/yaml/yaml_test.go
@@ -8,7 +8,7 @@ import (
 	yaml "sigs.k8s.io/yaml/goyaml.v3"
 )
 
-func TestSetStringsInBytes(t *testing.T) {
+func TestSetValuesInBytes(t *testing.T) {
 	testCases := []struct {
 		name       string
 		inBytes    []byte
@@ -28,6 +28,58 @@ characters:
 				require.Nil(t, bytes)
 			},
 		},
+		{
+			name: "no extra quotes around true number",
+			inBytes: []byte(`
+characters:
+- name: Arthur Dent
+  answer: idk
+`),
+			updates: []Update{
+				{
+					Key:   "characters.0.answer",
+					Value: 42,
+				},
+			},
+			assertions: func(t *testing.T, bytes []byte, err error) {
+				require.NoError(t, err)
+				require.Equal(
+					t,
+					[]byte(`
+characters:
+- name: Arthur Dent
+  answer: 42
+`),
+					bytes,
+				)
+			},
+		},
+		{
+			name: "extra quotes around string containing a valid number",
+			inBytes: []byte(`
+characters:
+- name: Arthur Dent
+  answer: idk
+`),
+			updates: []Update{
+				{
+					Key:   "characters.0.answer",
+					Value: "42",
+				},
+			},
+			assertions: func(t *testing.T, bytes []byte, err error) {
+				require.NoError(t, err)
+				require.Equal(
+					t,
+					[]byte(`
+characters:
+- name: Arthur Dent
+  answer: "42"
+`),
+					bytes,
+				)
+			},
+		},
 		{
 			name: "success",
 			inBytes: []byte(`
@@ -57,7 +109,7 @@ characters:
 	}
 	for _, testCase := range testCases {
 		t.Run(testCase.name, func(t *testing.T) {
-			b, err := SetStringsInBytes(testCase.inBytes, testCase.updates)
+			b, err := SetValuesInBytes(testCase.inBytes, testCase.updates)
 			testCase.assertions(t, b, err)
 		})
 	}