[task scheduler] Add job-search-sk

Also fix parts of job search.

Change-Id: Ie7faed76b2af68ddc0895b56340ba96ba5177a85
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/326946
Commit-Queue: Eric Boren <borenet@google.com>
Reviewed-by: Weston Tracey <westont@google.com>
diff --git a/task_scheduler/go/db/db.go b/task_scheduler/go/db/db.go
index 8926f64..0bb0c3a 100644
--- a/task_scheduler/go/db/db.go
+++ b/task_scheduler/go/db/db.go
@@ -204,13 +204,16 @@
 // any value for that field. If either of TimeStart or TimeEnd is not provided,
 // the search defaults to the last 24 hours.
 type JobSearchParams struct {
-	types.RepoState
-	BuildbucketBuildId *int64          `json:"buildbucket_build_id,string,omitempty"`
-	IsForce            *bool           `json:"is_force,omitempty"`
-	Name               string          `json:"name"`
-	Status             types.JobStatus `json:"status"`
-	TimeStart          time.Time       `json:"time_start"`
-	TimeEnd            time.Time       `json:"time_end"`
+	BuildbucketBuildID *int64           `json:"buildbucket_build_id,string,omitempty"`
+	IsForce            *bool            `json:"is_force,omitempty"`
+	Issue              *string          `json:"issue,omitempty"`
+	Name               *string          `json:"name"`
+	Patchset           *string          `json:"patchset,omitempty"`
+	Repo               *string          `json:"repo,omitempty"`
+	Revision           *string          `json:"revision,omitempty"`
+	Status             *types.JobStatus `json:"status"`
+	TimeStart          *time.Time       `json:"time_start"`
+	TimeEnd            *time.Time       `json:"time_end"`
 }
 
 // searchBoolEqual compares the two bools and returns true if the first is
@@ -232,55 +235,64 @@
 }
 
 // searchStringEqual compares the two strings and returns true if the first is
-// either not provided or equal to the second.
-func searchStringEqual(search, test string) bool {
-	if search == "" {
+// either not provided, equal to the second, or a regular expression which
+// matches the second.
+func searchStringEqual(search *string, test string) bool {
+	if search == nil {
 		return true
 	}
-	return search == test
+	if *search == test {
+		return true
+	}
+	re, err := regexp.Compile(*search)
+	if err == nil && re.MatchString(test) {
+		return true
+	}
+	return false
 }
 
 // matchJobs returns Jobs which match the given search parameters.
-func matchJobs(jobs []*types.Job, p *JobSearchParams) ([]*types.Job, error) {
-	// We accept a regex for the job name.
-	nameRe, err := regexp.Compile(p.Name)
-	if err != nil {
-		return nil, err
-	}
-
+func matchJobs(jobs []*types.Job, p *JobSearchParams) []*types.Job {
 	rv := []*types.Job{}
 	for _, j := range jobs {
 		// Compare all attributes which are provided.
 		if true &&
-			!p.TimeStart.After(j.Created) &&
-			j.Created.Before(p.TimeEnd) &&
+			(p.TimeStart == nil || !(*p.TimeStart).After(j.Created)) &&
+			(p.TimeEnd == nil || j.Created.Before(*p.TimeEnd)) &&
 			searchStringEqual(p.Issue, j.Issue) &&
+			searchStringEqual(p.Name, j.Name) &&
 			searchStringEqual(p.Patchset, j.Patchset) &&
-			searchStringEqual(p.Server, j.Server) &&
 			searchStringEqual(p.Repo, j.Repo) &&
 			searchStringEqual(p.Revision, j.Revision) &&
-			nameRe.MatchString(j.Name) &&
-			searchStringEqual(string(p.Status), string(j.Status)) &&
+			searchStringEqual((*string)(p.Status), string(j.Status)) &&
 			searchBoolEqual(p.IsForce, j.IsForce) &&
-			searchInt64Equal(p.BuildbucketBuildId, j.BuildbucketBuildId) {
+			searchInt64Equal(p.BuildbucketBuildID, j.BuildbucketBuildId) {
 			rv = append(rv, j)
 		}
 	}
-	return rv, nil
+	return rv
 }
 
 // SearchJobs returns Jobs in the given time range which match the given search
 // parameters.
 func SearchJobs(db JobReader, p *JobSearchParams) ([]*types.Job, error) {
-	if util.TimeIsZero(p.TimeStart) || util.TimeIsZero(p.TimeEnd) {
-		p.TimeEnd = time.Now()
-		p.TimeStart = p.TimeEnd.Add(-24 * time.Hour)
+	if p.TimeEnd == nil || util.TimeIsZero(*p.TimeEnd) {
+		end := time.Now()
+		p.TimeEnd = &end
 	}
-	jobs, err := db.GetJobsFromDateRange(p.TimeStart, p.TimeEnd, p.Repo)
+	if p.TimeStart == nil || util.TimeIsZero(*p.TimeStart) {
+		start := (*p.TimeEnd).Add(-24 * time.Hour)
+		p.TimeStart = &start
+	}
+	repo := ""
+	if p.Repo != nil {
+		repo = *p.Repo
+	}
+	jobs, err := db.GetJobsFromDateRange(*p.TimeStart, *p.TimeEnd, repo)
 	if err != nil {
 		return nil, err
 	}
-	return matchJobs(jobs, p)
+	return matchJobs(jobs, p), nil
 }
 
 // matchTasks returns Tasks which match the given search parameters.
@@ -290,15 +302,14 @@
 		// Compare all attributes which are provided.
 		if true &&
 			!p.TimeStart.After(t.Created) &&
-			t.Created.Before(p.TimeEnd) &&
+			t.Created.Before(*p.TimeEnd) &&
 			searchInt64Equal(p.Attempt, int64(t.Attempt)) &&
 			searchStringEqual(p.Issue, t.Issue) &&
 			searchStringEqual(p.Patchset, t.Patchset) &&
-			searchStringEqual(p.Server, t.Server) &&
 			searchStringEqual(p.Repo, t.Repo) &&
 			searchStringEqual(p.Revision, t.Revision) &&
 			searchStringEqual(p.Name, t.Name) &&
-			searchStringEqual(string(p.Status), string(t.Status)) &&
+			searchStringEqual((*string)(p.Status), string(t.Status)) &&
 			searchStringEqual(p.ForcedJobId, t.ForcedJobId) {
 			rv = append(rv, t)
 		}
@@ -311,21 +322,34 @@
 // any value for that field. If either of TimeStart or TimeEnd is not provided,
 // the search defaults to the last 24 hours.
 type TaskSearchParams struct {
-	Attempt *int64           `json:"attempt,string,omitempty"`
-	Status  types.TaskStatus `json:"status"`
-	types.TaskKey
-	TimeStart time.Time `json:"time_start"`
-	TimeEnd   time.Time `json:"time_end"`
+	Attempt     *int64            `json:"attempt,string,omitempty"`
+	Status      *types.TaskStatus `json:"status"`
+	ForcedJobId *string           `json:"forcedJobId,omitempty"`
+	Issue       *string           `json:"issue,omitempty"`
+	Name        *string           `json:"name"`
+	Patchset    *string           `json:"patchset,omitempty"`
+	Repo        *string           `json:"repo,omitempty"`
+	Revision    *string           `json:"revision,omitempty"`
+	TimeStart   *time.Time        `json:"time_start"`
+	TimeEnd     *time.Time        `json:"time_end"`
 }
 
 // SearchTasks returns Tasks in the given time range which match the given search
 // parameters.
 func SearchTasks(db TaskReader, p *TaskSearchParams) ([]*types.Task, error) {
-	if util.TimeIsZero(p.TimeStart) || util.TimeIsZero(p.TimeEnd) {
-		p.TimeEnd = time.Now()
-		p.TimeStart = p.TimeEnd.Add(-24 * time.Hour)
+	if p.TimeEnd == nil || util.TimeIsZero(*p.TimeEnd) {
+		end := time.Now()
+		p.TimeEnd = &end
 	}
-	tasks, err := db.GetTasksFromDateRange(p.TimeStart, p.TimeEnd, p.Repo)
+	if p.TimeStart == nil || util.TimeIsZero(*p.TimeStart) {
+		start := (*p.TimeEnd).Add(-24 * time.Hour)
+		p.TimeStart = &start
+	}
+	repo := ""
+	if p.Repo != nil {
+		repo = *p.Repo
+	}
+	tasks, err := db.GetTasksFromDateRange(*p.TimeStart, *p.TimeEnd, repo)
 	if err != nil {
 		return nil, err
 	}
diff --git a/task_scheduler/go/db/search_test.go b/task_scheduler/go/db/search_test.go
index 03c914d..852d4c5 100644
--- a/task_scheduler/go/db/search_test.go
+++ b/task_scheduler/go/db/search_test.go
@@ -20,99 +20,103 @@
 	j.Name = "Build-Win-Clang-x86_64-Debug-Vulkan"
 
 	emptyParams := func() *JobSearchParams {
+		start := now.Add(-1 * time.Hour)
+		end := now.Add(1 * time.Hour)
 		return &JobSearchParams{
-			TimeStart: now.Add(-1 * time.Hour),
-			TimeEnd:   now.Add(1 * time.Hour),
+			TimeStart: &start,
+			TimeEnd:   &end,
 		}
 	}
-	isForce := new(bool)
-	*isForce = j.IsForce
+	stringPtr := func(s string) *string {
+		rv := new(string)
+		*rv = s
+		return rv
+	}
+	intPtr := func(i int64) *int64 {
+		rv := new(int64)
+		*rv = i
+		return rv
+	}
+	boolPtr := func(b bool) *bool {
+		rv := new(bool)
+		*rv = b
+		return rv
+	}
+	timePtr := func(ts time.Time) *time.Time {
+		rv := new(time.Time)
+		*rv = ts
+		return rv
+	}
 	matchParams := func() *JobSearchParams {
 		return &JobSearchParams{
-			RepoState: types.RepoState{
-				Patch: types.Patch{
-					Issue:    j.Issue,
-					Patchset: j.Patchset,
-					Server:   j.Server,
-				},
-				Repo:     j.Repo,
-				Revision: j.Revision,
-			},
-			BuildbucketBuildId: &j.BuildbucketBuildId,
-			IsForce:            isForce,
-			Name:               j.Name,
-			Status:             j.Status,
-			TimeStart:          now.Add(-1 * time.Hour),
-			TimeEnd:            now.Add(1 * time.Hour),
+			Issue:              stringPtr(j.Issue),
+			Patchset:           stringPtr(j.Patchset),
+			Repo:               stringPtr(j.Repo),
+			Revision:           stringPtr(j.Revision),
+			BuildbucketBuildID: intPtr(j.BuildbucketBuildId),
+			IsForce:            boolPtr(j.IsForce),
+			Name:               stringPtr(j.Name),
+			Status:             (*types.JobStatus)(stringPtr(string(j.Status))),
+			TimeStart:          timePtr(now.Add(-1 * time.Hour)),
+			TimeEnd:            timePtr(now.Add(1 * time.Hour)),
 		}
 	}
 
 	checkMatches := func(p *JobSearchParams) {
-		jobs, err := matchJobs([]*types.Job{j}, p)
-		assert.NoError(t, err)
+		jobs := matchJobs([]*types.Job{j}, p)
 		assert.Equal(t, 1, len(jobs))
 		assertdeep.Equal(t, j, jobs[0])
 	}
 	checkNoMatch := func(p *JobSearchParams) {
-		jobs, err := matchJobs([]*types.Job{j}, p)
-		assert.NoError(t, err)
+		jobs := matchJobs([]*types.Job{j}, p)
 		assert.Equal(t, 0, len(jobs))
 	}
 
-	// Sanity check: both emptyParams and matchParams should match.
+	// Both emptyParams and matchParams should match.
 	checkMatches(matchParams())
 	checkMatches(emptyParams())
-	checkNoMatch(&JobSearchParams{})
+	checkMatches(&JobSearchParams{})
 
 	// Check each individual parameter.
 
 	// Issue
 	p := emptyParams()
-	p.Issue = j.Issue
+	p.Issue = stringPtr(j.Issue)
 	checkMatches(p)
 	p = matchParams()
-	p.Issue = "bogus"
+	p.Issue = stringPtr("bogus")
 	checkNoMatch(p)
 
 	// Patchset
 	p = emptyParams()
-	p.Patchset = j.Patchset
+	p.Patchset = stringPtr(j.Patchset)
 	checkMatches(p)
 	p = matchParams()
-	p.Patchset = "bogus"
-	checkNoMatch(p)
-
-	// Server
-	p = emptyParams()
-	p.Server = j.Server
-	checkMatches(p)
-	p = matchParams()
-	p.Server = "bogus"
+	p.Patchset = stringPtr("bogus")
 	checkNoMatch(p)
 
 	// Repo
 	p = emptyParams()
-	p.Repo = j.Repo
+	p.Repo = stringPtr(j.Repo)
 	checkMatches(p)
 	p = matchParams()
-	p.Repo = "bogus"
+	p.Repo = stringPtr("bogus")
 	checkNoMatch(p)
 
 	// Revision
 	p = emptyParams()
-	p.Revision = j.Revision
+	p.Revision = stringPtr(j.Revision)
 	checkMatches(p)
 	p = matchParams()
-	p.Revision = "bogus"
+	p.Revision = stringPtr("bogus")
 	checkNoMatch(p)
 
 	// BuildbucketBuildId
 	p = emptyParams()
-	p.BuildbucketBuildId = &j.BuildbucketBuildId
+	p.BuildbucketBuildID = intPtr(j.BuildbucketBuildId)
 	checkMatches(p)
 	p = matchParams()
-	v := int64(999991)
-	p.BuildbucketBuildId = &v
+	p.BuildbucketBuildID = intPtr(999991)
 	checkNoMatch(p)
 
 	// IsForce
@@ -128,46 +132,45 @@
 
 	// Name
 	p = emptyParams()
-	p.Name = j.Name
+	p.Name = stringPtr(j.Name)
 	checkMatches(p)
-	p.Name = j.Name[:3] + ".*"
+	p.Name = stringPtr(j.Name[:3] + ".*")
 	checkMatches(p)
 	p = matchParams()
-	p.Name = "bogus"
+	p.Name = stringPtr("bogus")
 	checkNoMatch(p)
 	p = matchParams()
-	p.Name = "^T.*"
+	p.Name = stringPtr("^T.*")
 	checkNoMatch(p)
-	p.Name = "((("
-	_, err := matchJobs([]*types.Job{}, p)
-	assert.EqualError(t, err, "error parsing regexp: missing closing ): `(((`")
+	p.Name = stringPtr("(((")
+	checkNoMatch(p)
 
 	// Status
 	p = emptyParams()
-	p.Status = j.Status
+	p.Status = (*types.JobStatus)(stringPtr(string(j.Status)))
 	checkMatches(p)
 	p = matchParams()
-	p.Status = "bogus"
+	p.Status = (*types.JobStatus)(stringPtr("bogus"))
 	checkNoMatch(p)
 
 	// Check time periods.
 
 	// Inclusive TimeStart.
 	p = matchParams()
-	p.TimeStart = j.Created
+	p.TimeStart = timePtr(j.Created)
 	checkMatches(p)
 
 	// j.Created just before p.TimeStart.
-	p.TimeStart = j.Created.Add(time.Millisecond)
+	p.TimeStart = timePtr(j.Created.Add(time.Millisecond))
 	checkNoMatch(p)
 
 	// Non-inclusive TimeEnd.
 	p = matchParams()
-	p.TimeEnd = j.Created
+	p.TimeEnd = timePtr(j.Created)
 	checkNoMatch(p)
 
 	// j.Created Just before TimeEnd.
-	p.TimeEnd = j.Created.Add(time.Millisecond)
+	p.TimeEnd = timePtr(j.Created.Add(time.Millisecond))
 	checkMatches(p)
 }
 
diff --git a/task_scheduler/go/rpc/rpc.go b/task_scheduler/go/rpc/rpc.go
index 123afc6..e3d0d61 100644
--- a/task_scheduler/go/rpc/rpc.go
+++ b/task_scheduler/go/rpc/rpc.go
@@ -181,41 +181,49 @@
 	if _, err := s.GetViewer(ctx); err != nil {
 		return nil, err
 	}
-	bbid := int64(req.BuildbucketBuildId)
-	status := types.JobStatus("")
-	switch req.Status {
-	case JobStatus_JOB_STATUS_IN_PROGRESS:
-		status = types.JOB_STATUS_IN_PROGRESS
-	case JobStatus_JOB_STATUS_SUCCESS:
-		status = types.JOB_STATUS_IN_PROGRESS
-	case JobStatus_JOB_STATUS_FAILURE:
-		status = types.JOB_STATUS_FAILURE
-	case JobStatus_JOB_STATUS_MISHAP:
-		status = types.JOB_STATUS_MISHAP
-	case JobStatus_JOB_STATUS_CANCELED:
-		status = types.JOB_STATUS_CANCELED
+	params := &db.JobSearchParams{}
+	if req.HasBuildbucketBuildId {
+		params.BuildbucketBuildID = intPtr(req.BuildbucketBuildId)
 	}
-	params := &db.JobSearchParams{
-		BuildbucketBuildId: &bbid,
-		IsForce:            &req.IsForce,
-		Name:               req.Name,
-		Status:             status,
-		TimeStart:          req.TimeStart.AsTime(),
-		TimeEnd:            req.TimeEnd.AsTime(),
+	if req.HasIsForce {
+		params.IsForce = boolPtr(req.IsForce)
 	}
-	if req.RepoState != nil {
-		params.RepoState = types.RepoState{
-			Repo:     req.RepoState.Repo,
-			Revision: req.RepoState.Revision,
+	if req.HasIssue {
+		params.Issue = stringPtr(req.Issue)
+	}
+	if req.HasName {
+		params.Name = stringPtr(req.Name)
+	}
+	if req.HasPatchset {
+		params.Patchset = stringPtr(req.Patchset)
+	}
+	if req.HasRepo {
+		params.Repo = stringPtr(req.Repo)
+	}
+	if req.HasRevision {
+		params.Revision = stringPtr(req.Revision)
+	}
+	if req.HasStatus {
+		status := types.JobStatus("")
+		switch req.Status {
+		case JobStatus_JOB_STATUS_IN_PROGRESS:
+			status = types.JOB_STATUS_IN_PROGRESS
+		case JobStatus_JOB_STATUS_SUCCESS:
+			status = types.JOB_STATUS_IN_PROGRESS
+		case JobStatus_JOB_STATUS_FAILURE:
+			status = types.JOB_STATUS_FAILURE
+		case JobStatus_JOB_STATUS_MISHAP:
+			status = types.JOB_STATUS_MISHAP
+		case JobStatus_JOB_STATUS_CANCELED:
+			status = types.JOB_STATUS_CANCELED
 		}
-		if req.RepoState.Patch != nil {
-			params.RepoState.Patch = types.Patch{
-				Issue:     req.RepoState.Patch.Issue,
-				PatchRepo: req.RepoState.Patch.PatchRepo,
-				Patchset:  req.RepoState.Patch.Patchset,
-				Server:    req.RepoState.Patch.Server,
-			}
-		}
+		params.Status = (*types.JobStatus)(stringPtr(string(status)))
+	}
+	if req.HasTimeEnd {
+		params.TimeEnd = timePtr(req.TimeEnd.AsTime())
+	}
+	if req.HasTimeStart {
+		params.TimeStart = timePtr(req.TimeStart.AsTime())
 	}
 	results, err := db.SearchJobs(s.db, params)
 	if err != nil {
@@ -281,46 +289,48 @@
 	if _, err := s.GetViewer(ctx); err != nil {
 		return nil, err
 	}
-	attempt := int64(req.Attempt)
-	status := types.TaskStatus("")
-	switch req.Status {
-	case TaskStatus_TASK_STATUS_PENDING:
-		status = types.TASK_STATUS_PENDING
-	case TaskStatus_TASK_STATUS_RUNNING:
-		status = types.TASK_STATUS_RUNNING
-	case TaskStatus_TASK_STATUS_SUCCESS:
-		status = types.TASK_STATUS_SUCCESS
-	case TaskStatus_TASK_STATUS_FAILURE:
-		status = types.TASK_STATUS_FAILURE
-	case TaskStatus_TASK_STATUS_MISHAP:
-		status = types.TASK_STATUS_MISHAP
+	params := &db.TaskSearchParams{}
+	if req.HasAttempt {
+		params.Attempt = intPtr(int64(req.Attempt))
 	}
-	params := &db.TaskSearchParams{
-		Attempt:   &attempt, // TODO(borenet): nil vs empty?
-		Status:    status,
-		TimeStart: req.TimeStart.AsTime(),
-		TimeEnd:   req.TimeEnd.AsTime(),
+	if req.HasIssue {
+		params.Issue = stringPtr(req.Issue)
 	}
-	if req.TaskKey != nil {
-		params.TaskKey = types.TaskKey{
-			Name:        req.TaskKey.Name,
-			ForcedJobId: req.TaskKey.ForcedJobId,
+	if req.HasName {
+		params.Name = stringPtr(req.Name)
+	}
+	if req.HasPatchset {
+		params.Patchset = stringPtr(req.Patchset)
+	}
+	if req.HasRepo {
+		params.Repo = stringPtr(req.Repo)
+	}
+	if req.HasRevision {
+		params.Revision = stringPtr(req.Revision)
+	}
+	if req.HasStatus {
+		status := types.TaskStatus("")
+		switch req.Status {
+		case TaskStatus_TASK_STATUS_PENDING:
+			status = types.TASK_STATUS_PENDING
+		case TaskStatus_TASK_STATUS_RUNNING:
+			status = types.TASK_STATUS_RUNNING
+		case TaskStatus_TASK_STATUS_SUCCESS:
+			status = types.TASK_STATUS_SUCCESS
+		case TaskStatus_TASK_STATUS_FAILURE:
+			status = types.TASK_STATUS_FAILURE
+		case TaskStatus_TASK_STATUS_MISHAP:
+			status = types.TASK_STATUS_MISHAP
 		}
-		if req.TaskKey.RepoState != nil {
-			params.RepoState = types.RepoState{
-				Repo:     req.TaskKey.RepoState.Repo,
-				Revision: req.TaskKey.RepoState.Revision,
-			}
-			if req.TaskKey.RepoState.Patch != nil {
-				params.RepoState.Patch = types.Patch{
-					Issue:     req.TaskKey.RepoState.Patch.Issue,
-					PatchRepo: req.TaskKey.RepoState.Patch.PatchRepo,
-					Patchset:  req.TaskKey.RepoState.Patch.Patchset,
-					Server:    req.TaskKey.RepoState.Patch.Server,
-				}
-			}
-		}
+		params.Status = (*types.TaskStatus)(stringPtr(string(status)))
 	}
+	if req.HasTimeEnd {
+		params.TimeEnd = timePtr(req.TimeEnd.AsTime())
+	}
+	if req.HasTimeStart {
+		params.TimeStart = timePtr(req.TimeStart.AsTime())
+	}
+
 	results, err := db.SearchTasks(s.db, params)
 	if err != nil {
 		sklog.Error(err)
@@ -579,4 +589,25 @@
 	return rv, nil
 }
 
+func stringPtr(s string) *string {
+	rv := new(string)
+	*rv = s
+	return rv
+}
+func intPtr(i int64) *int64 {
+	rv := new(int64)
+	*rv = i
+	return rv
+}
+func boolPtr(b bool) *bool {
+	rv := new(bool)
+	*rv = b
+	return rv
+}
+func timePtr(ts time.Time) *time.Time {
+	rv := new(time.Time)
+	*rv = ts
+	return rv
+}
+
 var _ TaskSchedulerService = &taskSchedulerServiceImpl{}
diff --git a/task_scheduler/go/rpc/rpc.pb.go b/task_scheduler/go/rpc/rpc.pb.go
index 0341e0d..e7efcfc 100644
--- a/task_scheduler/go/rpc/rpc.pb.go
+++ b/task_scheduler/go/rpc/rpc.pb.go
@@ -506,13 +506,26 @@
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	RepoState          *RepoState           `protobuf:"bytes,1,opt,name=repo_state,json=repoState,proto3" json:"repo_state,omitempty"`
-	BuildbucketBuildId int64                `protobuf:"varint,2,opt,name=buildbucket_build_id,json=buildbucketBuildId,proto3" json:"buildbucket_build_id,omitempty"` // TODO: Make optional.
-	IsForce            bool                 `protobuf:"varint,3,opt,name=is_force,json=isForce,proto3" json:"is_force,omitempty"`                                    // TODO: Make optional.
-	Name               string               `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
-	Status             JobStatus            `protobuf:"varint,5,opt,name=status,proto3,enum=task_scheduler.rpc.JobStatus" json:"status,omitempty"` // TODO: Make optional.
-	TimeStart          *timestamp.Timestamp `protobuf:"bytes,6,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"`
-	TimeEnd            *timestamp.Timestamp `protobuf:"bytes,7,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"`
+	BuildbucketBuildId    int64                `protobuf:"varint,1,opt,name=buildbucket_build_id,json=buildbucketBuildId,proto3" json:"buildbucket_build_id,omitempty"`
+	HasBuildbucketBuildId bool                 `protobuf:"varint,2,opt,name=has_buildbucket_build_id,json=hasBuildbucketBuildId,proto3" json:"has_buildbucket_build_id,omitempty"`
+	IsForce               bool                 `protobuf:"varint,3,opt,name=is_force,json=isForce,proto3" json:"is_force,omitempty"`
+	HasIsForce            bool                 `protobuf:"varint,4,opt,name=has_is_force,json=hasIsForce,proto3" json:"has_is_force,omitempty"`
+	Issue                 string               `protobuf:"bytes,5,opt,name=issue,proto3" json:"issue,omitempty"`
+	HasIssue              bool                 `protobuf:"varint,6,opt,name=has_issue,json=hasIssue,proto3" json:"has_issue,omitempty"`
+	Name                  string               `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"`
+	HasName               bool                 `protobuf:"varint,8,opt,name=has_name,json=hasName,proto3" json:"has_name,omitempty"`
+	Patchset              string               `protobuf:"bytes,9,opt,name=patchset,proto3" json:"patchset,omitempty"`
+	HasPatchset           bool                 `protobuf:"varint,10,opt,name=has_patchset,json=hasPatchset,proto3" json:"has_patchset,omitempty"`
+	Repo                  string               `protobuf:"bytes,11,opt,name=repo,proto3" json:"repo,omitempty"`
+	HasRepo               bool                 `protobuf:"varint,12,opt,name=has_repo,json=hasRepo,proto3" json:"has_repo,omitempty"`
+	Revision              string               `protobuf:"bytes,13,opt,name=revision,proto3" json:"revision,omitempty"`
+	HasRevision           bool                 `protobuf:"varint,14,opt,name=has_revision,json=hasRevision,proto3" json:"has_revision,omitempty"`
+	Status                JobStatus            `protobuf:"varint,15,opt,name=status,proto3,enum=task_scheduler.rpc.JobStatus" json:"status,omitempty"`
+	HasStatus             bool                 `protobuf:"varint,16,opt,name=has_status,json=hasStatus,proto3" json:"has_status,omitempty"`
+	TimeStart             *timestamp.Timestamp `protobuf:"bytes,17,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"`
+	HasTimeStart          bool                 `protobuf:"varint,18,opt,name=has_time_start,json=hasTimeStart,proto3" json:"has_time_start,omitempty"`
+	TimeEnd               *timestamp.Timestamp `protobuf:"bytes,19,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"`
+	HasTimeEnd            bool                 `protobuf:"varint,20,opt,name=has_time_end,json=hasTimeEnd,proto3" json:"has_time_end,omitempty"`
 }
 
 func (x *SearchJobsRequest) Reset() {
@@ -547,13 +560,6 @@
 	return file_rpc_proto_rawDescGZIP(), []int{7}
 }
 
-func (x *SearchJobsRequest) GetRepoState() *RepoState {
-	if x != nil {
-		return x.RepoState
-	}
-	return nil
-}
-
 func (x *SearchJobsRequest) GetBuildbucketBuildId() int64 {
 	if x != nil {
 		return x.BuildbucketBuildId
@@ -561,6 +567,13 @@
 	return 0
 }
 
+func (x *SearchJobsRequest) GetHasBuildbucketBuildId() bool {
+	if x != nil {
+		return x.HasBuildbucketBuildId
+	}
+	return false
+}
+
 func (x *SearchJobsRequest) GetIsForce() bool {
 	if x != nil {
 		return x.IsForce
@@ -568,6 +581,27 @@
 	return false
 }
 
+func (x *SearchJobsRequest) GetHasIsForce() bool {
+	if x != nil {
+		return x.HasIsForce
+	}
+	return false
+}
+
+func (x *SearchJobsRequest) GetIssue() string {
+	if x != nil {
+		return x.Issue
+	}
+	return ""
+}
+
+func (x *SearchJobsRequest) GetHasIssue() bool {
+	if x != nil {
+		return x.HasIssue
+	}
+	return false
+}
+
 func (x *SearchJobsRequest) GetName() string {
 	if x != nil {
 		return x.Name
@@ -575,6 +609,55 @@
 	return ""
 }
 
+func (x *SearchJobsRequest) GetHasName() bool {
+	if x != nil {
+		return x.HasName
+	}
+	return false
+}
+
+func (x *SearchJobsRequest) GetPatchset() string {
+	if x != nil {
+		return x.Patchset
+	}
+	return ""
+}
+
+func (x *SearchJobsRequest) GetHasPatchset() bool {
+	if x != nil {
+		return x.HasPatchset
+	}
+	return false
+}
+
+func (x *SearchJobsRequest) GetRepo() string {
+	if x != nil {
+		return x.Repo
+	}
+	return ""
+}
+
+func (x *SearchJobsRequest) GetHasRepo() bool {
+	if x != nil {
+		return x.HasRepo
+	}
+	return false
+}
+
+func (x *SearchJobsRequest) GetRevision() string {
+	if x != nil {
+		return x.Revision
+	}
+	return ""
+}
+
+func (x *SearchJobsRequest) GetHasRevision() bool {
+	if x != nil {
+		return x.HasRevision
+	}
+	return false
+}
+
 func (x *SearchJobsRequest) GetStatus() JobStatus {
 	if x != nil {
 		return x.Status
@@ -582,6 +665,13 @@
 	return JobStatus_JOB_STATUS_IN_PROGRESS
 }
 
+func (x *SearchJobsRequest) GetHasStatus() bool {
+	if x != nil {
+		return x.HasStatus
+	}
+	return false
+}
+
 func (x *SearchJobsRequest) GetTimeStart() *timestamp.Timestamp {
 	if x != nil {
 		return x.TimeStart
@@ -589,6 +679,13 @@
 	return nil
 }
 
+func (x *SearchJobsRequest) GetHasTimeStart() bool {
+	if x != nil {
+		return x.HasTimeStart
+	}
+	return false
+}
+
 func (x *SearchJobsRequest) GetTimeEnd() *timestamp.Timestamp {
 	if x != nil {
 		return x.TimeEnd
@@ -596,6 +693,13 @@
 	return nil
 }
 
+func (x *SearchJobsRequest) GetHasTimeEnd() bool {
+	if x != nil {
+		return x.HasTimeEnd
+	}
+	return false
+}
+
 // SearchJobsRequest is a response returned by SearchJobs.
 type SearchJobsResponse struct {
 	state         protoimpl.MessageState
@@ -758,11 +862,24 @@
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	TaskKey   *TaskKey             `protobuf:"bytes,1,opt,name=task_key,json=taskKey,proto3" json:"task_key,omitempty"`
-	Attempt   int32                `protobuf:"varint,2,opt,name=attempt,proto3" json:"attempt,omitempty"` // TODO: Make optional.
-	Status    TaskStatus           `protobuf:"varint,3,opt,name=status,proto3,enum=task_scheduler.rpc.TaskStatus" json:"status,omitempty"`
-	TimeStart *timestamp.Timestamp `protobuf:"bytes,6,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"`
-	TimeEnd   *timestamp.Timestamp `protobuf:"bytes,7,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"`
+	Attempt      int32                `protobuf:"varint,1,opt,name=attempt,proto3" json:"attempt,omitempty"`
+	HasAttempt   bool                 `protobuf:"varint,2,opt,name=has_attempt,json=hasAttempt,proto3" json:"has_attempt,omitempty"`
+	Issue        string               `protobuf:"bytes,3,opt,name=issue,proto3" json:"issue,omitempty"`
+	HasIssue     bool                 `protobuf:"varint,4,opt,name=has_issue,json=hasIssue,proto3" json:"has_issue,omitempty"`
+	Name         string               `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
+	HasName      bool                 `protobuf:"varint,6,opt,name=has_name,json=hasName,proto3" json:"has_name,omitempty"`
+	Patchset     string               `protobuf:"bytes,7,opt,name=patchset,proto3" json:"patchset,omitempty"`
+	HasPatchset  bool                 `protobuf:"varint,8,opt,name=has_patchset,json=hasPatchset,proto3" json:"has_patchset,omitempty"`
+	Repo         string               `protobuf:"bytes,9,opt,name=repo,proto3" json:"repo,omitempty"`
+	HasRepo      bool                 `protobuf:"varint,10,opt,name=has_repo,json=hasRepo,proto3" json:"has_repo,omitempty"`
+	Revision     string               `protobuf:"bytes,11,opt,name=revision,proto3" json:"revision,omitempty"`
+	HasRevision  bool                 `protobuf:"varint,12,opt,name=has_revision,json=hasRevision,proto3" json:"has_revision,omitempty"`
+	Status       TaskStatus           `protobuf:"varint,13,opt,name=status,proto3,enum=task_scheduler.rpc.TaskStatus" json:"status,omitempty"`
+	HasStatus    bool                 `protobuf:"varint,14,opt,name=has_status,json=hasStatus,proto3" json:"has_status,omitempty"`
+	TimeStart    *timestamp.Timestamp `protobuf:"bytes,15,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"`
+	HasTimeStart bool                 `protobuf:"varint,16,opt,name=has_time_start,json=hasTimeStart,proto3" json:"has_time_start,omitempty"`
+	TimeEnd      *timestamp.Timestamp `protobuf:"bytes,17,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"`
+	HasTimeEnd   bool                 `protobuf:"varint,18,opt,name=has_time_end,json=hasTimeEnd,proto3" json:"has_time_end,omitempty"`
 }
 
 func (x *SearchTasksRequest) Reset() {
@@ -797,13 +914,6 @@
 	return file_rpc_proto_rawDescGZIP(), []int{11}
 }
 
-func (x *SearchTasksRequest) GetTaskKey() *TaskKey {
-	if x != nil {
-		return x.TaskKey
-	}
-	return nil
-}
-
 func (x *SearchTasksRequest) GetAttempt() int32 {
 	if x != nil {
 		return x.Attempt
@@ -811,6 +921,83 @@
 	return 0
 }
 
+func (x *SearchTasksRequest) GetHasAttempt() bool {
+	if x != nil {
+		return x.HasAttempt
+	}
+	return false
+}
+
+func (x *SearchTasksRequest) GetIssue() string {
+	if x != nil {
+		return x.Issue
+	}
+	return ""
+}
+
+func (x *SearchTasksRequest) GetHasIssue() bool {
+	if x != nil {
+		return x.HasIssue
+	}
+	return false
+}
+
+func (x *SearchTasksRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *SearchTasksRequest) GetHasName() bool {
+	if x != nil {
+		return x.HasName
+	}
+	return false
+}
+
+func (x *SearchTasksRequest) GetPatchset() string {
+	if x != nil {
+		return x.Patchset
+	}
+	return ""
+}
+
+func (x *SearchTasksRequest) GetHasPatchset() bool {
+	if x != nil {
+		return x.HasPatchset
+	}
+	return false
+}
+
+func (x *SearchTasksRequest) GetRepo() string {
+	if x != nil {
+		return x.Repo
+	}
+	return ""
+}
+
+func (x *SearchTasksRequest) GetHasRepo() bool {
+	if x != nil {
+		return x.HasRepo
+	}
+	return false
+}
+
+func (x *SearchTasksRequest) GetRevision() string {
+	if x != nil {
+		return x.Revision
+	}
+	return ""
+}
+
+func (x *SearchTasksRequest) GetHasRevision() bool {
+	if x != nil {
+		return x.HasRevision
+	}
+	return false
+}
+
 func (x *SearchTasksRequest) GetStatus() TaskStatus {
 	if x != nil {
 		return x.Status
@@ -818,6 +1005,13 @@
 	return TaskStatus_TASK_STATUS_PENDING
 }
 
+func (x *SearchTasksRequest) GetHasStatus() bool {
+	if x != nil {
+		return x.HasStatus
+	}
+	return false
+}
+
 func (x *SearchTasksRequest) GetTimeStart() *timestamp.Timestamp {
 	if x != nil {
 		return x.TimeStart
@@ -825,6 +1019,13 @@
 	return nil
 }
 
+func (x *SearchTasksRequest) GetHasTimeStart() bool {
+	if x != nil {
+		return x.HasTimeStart
+	}
+	return false
+}
+
 func (x *SearchTasksRequest) GetTimeEnd() *timestamp.Timestamp {
 	if x != nil {
 		return x.TimeEnd
@@ -832,6 +1033,13 @@
 	return nil
 }
 
+func (x *SearchTasksRequest) GetHasTimeEnd() bool {
+	if x != nil {
+		return x.HasTimeEnd
+	}
+	return false
+}
+
 // SearchTasksResponse is a response returned from SearchTasks.
 type SearchTasksResponse struct {
 	state         protoimpl.MessageState
@@ -1278,7 +1486,7 @@
 	return nil
 }
 
-// RepoState encapsulates all of the parameters which define the state of a
+//  encapsulates all of the parameters which define the state of a
 // repo.
 type RepoState struct {
 	state         protoimpl.MessageState
@@ -1769,6 +1977,8 @@
 	return ""
 }
 
+// TODO: Make optional.
+// TODO: Make optional.
 // TaskSummaries groups TaskSummaries which have the same TaskSpec name.
 type TaskSummaries struct {
 	state         protoimpl.MessageState
@@ -1992,7 +2202,7 @@
 	Name string `protobuf:"bytes,9,opt,name=name,proto3" json:"name,omitempty"`
 	// priority is an indicator of the relative priority of this Job.
 	Priority float32 `protobuf:"fixed32,10,opt,name=priority,proto3" json:"priority,omitempty"`
-	// repoState is the current state of the repository for this Job.
+	//  is the current state of the repository for this Job.
 	RepoState *RepoState `protobuf:"bytes,11,opt,name=repo_state,json=repoState,proto3" json:"repo_state,omitempty"`
 	// requested is the time at which this Job was requested. This is a
 	// commit timestamp, tryjob request creation timestamp, time at which
@@ -2252,342 +2462,388 @@
 	0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x03, 0x6a,
 	0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
 	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4a, 0x6f,
-	0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0xdb, 0x02, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63,
-	0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a,
-	0x72, 0x65, 0x70, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1d, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
-	0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52,
-	0x09, 0x72, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x62, 0x75,
-	0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f,
-	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62,
-	0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08,
-	0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
-	0x69, 0x73, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x61,
+	0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0xda, 0x05, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63,
+	0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x37,
+	0x0a, 0x18, 0x68, 0x61, 0x73, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65,
+	0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x15, 0x68, 0x61, 0x73, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+	0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x66, 0x6f,
+	0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x46, 0x6f, 0x72,
+	0x63, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x68, 0x61, 0x73, 0x5f, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72,
+	0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x49, 0x73, 0x46,
+	0x6f, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x73, 0x75, 0x65, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x73, 0x73, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x61,
+	0x73, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x68,
+	0x61, 0x73, 0x49, 0x73, 0x73, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x68,
+	0x61, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68,
+	0x61, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x63, 0x68, 0x73,
+	0x65, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x63, 0x68, 0x73,
+	0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x73,
+	0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x50, 0x61, 0x74,
+	0x63, 0x68, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x0b, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73,
+	0x5f, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73,
+	0x52, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
+	0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
+	0x12, 0x21, 0x0a, 0x0c, 0x68, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
+	0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x52, 0x65, 0x76, 0x69, 0x73,
+	0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64,
+	0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61,
+	0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09,
+	0x68, 0x61, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d,
+	0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53,
+	0x74, 0x61, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65,
+	0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61,
+	0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69,
+	0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e,
+	0x64, 0x12, 0x20, 0x0a, 0x0c, 0x68, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e,
+	0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65,
+	0x45, 0x6e, 0x64, 0x22, 0x41, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4a, 0x6f, 0x62,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x6a, 0x6f, 0x62,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73,
+	0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4a, 0x6f, 0x62,
+	0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x45, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73,
+	0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c,
+	0x75, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x3f, 0x0a,
+	0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x2c, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18,
+	0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e,
+	0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0xef,
+	0x04, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12,
+	0x1f, 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74,
+	0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x73, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x69, 0x73, 0x73, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x69, 0x73,
+	0x73, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x49, 0x73,
+	0x73, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x63, 0x68, 0x73, 0x65, 0x74, 0x18, 0x07,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x63, 0x68, 0x73, 0x65, 0x74, 0x12, 0x21,
+	0x0a, 0x0c, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x73, 0x65, 0x74, 0x18, 0x08,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x50, 0x61, 0x74, 0x63, 0x68, 0x73, 0x65,
+	0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x70,
+	0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x52, 0x65, 0x70, 0x6f,
+	0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c,
+	0x68, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x1e, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
+	0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
+	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73,
+	0x74, 0x61, 0x72, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72,
+	0x74, 0x12, 0x24, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74,
+	0x61, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x54, 0x69,
+	0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f,
+	0x65, 0x6e, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x20,
+	0x0a, 0x0c, 0x68, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x12,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64,
+	0x22, 0x45, 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63,
+	0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b,
+	0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x6b,
+	0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x22, 0xa7, 0x01, 0x0a, 0x0c, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52,
+	0x75, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x65, 0x64, 0x42, 0x79, 0x12, 0x2c,
+	0x0a, 0x12, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x74,
+	0x65, 0x72, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x74, 0x61, 0x73, 0x6b,
+	0x53, 0x70, 0x65, 0x63, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07,
+	0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63,
+	0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73,
+	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x18,
+	0x47, 0x65, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73,
+	0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6b, 0x69,
+	0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73,
+	0x22, 0x96, 0x01, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b,
+	0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x74,
+	0x61, 0x73, 0x6b, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e,
+	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x74, 0x61, 0x73, 0x6b, 0x53, 0x70, 0x65,
+	0x63, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d,
+	0x6d, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d,
+	0x69, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x17, 0x41, 0x64, 0x64,
+	0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64,
+	0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73,
+	0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x19,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75,
+	0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x54, 0x0a, 0x1a, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63,
+	0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6b, 0x69, 0x70,
+	0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22,
+	0xe8, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a,
+	0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74,
+	0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70,
+	0x63, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x61, 0x74, 0x63,
+	0x68, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08,
+	0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x70, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x63,
+	0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x73, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x69, 0x73, 0x73, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x74, 0x63, 0x68,
+	0x5f, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x74,
+	0x63, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x63, 0x68, 0x73,
+	0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x63, 0x68, 0x73,
+	0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x7f, 0x0a, 0x07, 0x54, 0x61,
+	0x73, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x61, 0x73, 0x6b,
+	0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52,
+	0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x09, 0x72, 0x65, 0x70, 0x6f, 0x53, 0x74,
+	0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x66, 0x6f, 0x72, 0x63, 0x65,
+	0x64, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
+	0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0xe2, 0x06, 0x0a, 0x04,
+	0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x18,
+	0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x64, 0x41, 0x74, 0x12, 0x40, 0x0a, 0x0e, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69,
+	0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x64, 0x62, 0x4d, 0x6f, 0x64, 0x69, 0x66,
+	0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65,
+	0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64,
+	0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f,
+	0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x73, 0x6f,
+	0x6c, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6a,
+	0x6f, 0x62, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x12,
+	0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70,
+	0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73,
+	0x6b, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72,
+	0x65, 0x6e, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x48, 0x0a, 0x0a, 0x70, 0x72,
+	0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28,
+	0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e,
+	0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+	0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+	0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x6f, 0x66,
+	0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x79, 0x4f, 0x66, 0x12,
+	0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0d, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
+	0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x73,
+	0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e,
+	0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x62,
+	0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x77, 0x61,
+	0x72, 0x6d, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x77,
+	0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x10,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x54, 0x61,
+	0x73, 0x6b, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x6b, 0x65, 0x79,
+	0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63,
+	0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b,
+	0x4b, 0x65, 0x79, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05,
+	0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x61,
 	0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63,
-	0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74,
-	0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
-	0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a,
-	0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d,
-	0x65, 0x45, 0x6e, 0x64, 0x22, 0x41, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4a, 0x6f,
-	0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x6a, 0x6f,
-	0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
-	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4a, 0x6f,
-	0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x45, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61,
-	0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63,
-	0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x3f,
-	0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x18, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
-	0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22,
-	0x90, 0x02, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x6b,
-	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
-	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61,
-	0x73, 0x6b, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x18,
-	0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
-	0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
-	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61,
-	0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06,
+	0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74,
+	0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
+	0x22, 0x4a, 0x0a, 0x10, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e,
+	0x63, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x70, 0x65,
+	0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c,
+	0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x22, 0xbc, 0x01, 0x0a,
+	0x0b, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07,
+	0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61,
+	0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74,
+	0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61,
+	0x78, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x73, 0x6b,
+	0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54,
+	0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61,
+	0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x77, 0x61,
+	0x72, 0x6d, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x5a, 0x0a, 0x0d, 0x54,
+	0x61, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x12, 0x35, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x1f, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
+	0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79,
+	0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x4d, 0x0a, 0x0e, 0x54, 0x61, 0x73, 0x6b, 0x44,
+	0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x73,
+	0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61,
+	0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x54, 0x61, 0x73, 0x6b, 0x53,
+	0x74, 0x61, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6f, 0x76,
+	0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e,
+	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x53, 0x12, 0x2e,
+	0x0a, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68,
+	0x65, 0x61, 0x64, 0x5f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x64, 0x6f, 0x77,
+	0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x53, 0x12, 0x2a,
+	0x0a, 0x11, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61,
+	0x64, 0x5f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x75, 0x70, 0x6c, 0x6f, 0x61,
+	0x64, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x53, 0x22, 0x84, 0x06, 0x0a, 0x03, 0x4a,
+	0x6f, 0x62, 0x12, 0x30, 0x0a, 0x14, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65,
+	0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x75, 0x69,
+	0x6c, 0x64, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63,
+	0x6b, 0x65, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+	0x4c, 0x65, 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x64, 0x41, 0x74, 0x12, 0x40, 0x0a, 0x0e, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69,
+	0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x64, 0x62, 0x4d, 0x6f, 0x64, 0x69, 0x66,
+	0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65,
+	0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x61,
+	0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63,
+	0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65,
+	0x73, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12,
+	0x3b, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06,
 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
-	0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74,
-	0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45,
-	0x6e, 0x64, 0x22, 0x45, 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73,
-	0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
-	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61,
-	0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74,
-	0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x22, 0xa7, 0x01, 0x0a, 0x0c, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73,
-	0x6b, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x62,
-	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x65, 0x64, 0x42, 0x79,
-	0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x70, 0x61,
-	0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x74, 0x61,
-	0x73, 0x6b, 0x53, 0x70, 0x65, 0x63, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x12, 0x18,
-	0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52,
-	0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63,
-	0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64,
-	0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x52,
-	0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c,
-	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x72, 0x75,
-	0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x73, 0x6b,
-	0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53,
-	0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c,
-	0x65, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61,
-	0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a,
-	0x12, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65,
-	0x72, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x74, 0x61, 0x73, 0x6b, 0x53,
-	0x70, 0x65, 0x63, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63,
-	0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f,
-	0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63,
-	0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x17, 0x41,
-	0x64, 0x64, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18,
-	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68,
-	0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6b, 0x69, 0x70, 0x54,
-	0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x2b,
-	0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b,
-	0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
-	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x54, 0x0a, 0x1a, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c,
-	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x72, 0x75, 0x6c,
-	0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
-	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6b,
-	0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65,
-	0x73, 0x22, 0xe8, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
-	0x39, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23,
-	0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e,
-	0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x61,
-	0x74, 0x63, 0x68, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65,
-	0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a,
-	0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x70, 0x0a, 0x05, 0x50, 0x61,
-	0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x73, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x05, 0x69, 0x73, 0x73, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x74,
-	0x63, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70,
-	0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x63,
-	0x68, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x63,
-	0x68, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x7f, 0x0a, 0x07,
-	0x54, 0x61, 0x73, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x5f,
-	0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x61,
+	0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+	0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08,
+	0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
+	0x69, 0x73, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70,
+	0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x70,
+	0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x5f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x61,
 	0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63,
 	0x2e, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x09, 0x72, 0x65, 0x70, 0x6f,
-	0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x66, 0x6f, 0x72,
-	0x63, 0x65, 0x64, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0xe2, 0x06,
-	0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70,
-	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74,
-	0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x40, 0x0a, 0x0e, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x64, 0x69,
-	0x66, 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x64, 0x62, 0x4d, 0x6f, 0x64,
-	0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73,
-	0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
-	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68,
-	0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x64,
-	0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69,
-	0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a,
-	0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6a, 0x6f, 0x62,
-	0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74,
-	0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, 0x65,
-	0x6d, 0x70, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74,
-	0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x70,
-	0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x48, 0x0a, 0x0a,
-	0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x28, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
-	0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65,
-	0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70,
-	0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f,
-	0x6f, 0x66, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x79, 0x4f,
-	0x66, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18,
-	0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x06,
-	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74,
-	0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70,
-	0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67,
-	0x5f, 0x62, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,
-	0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10,
-	0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64,
-	0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67,
-	0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x6b,
-	0x65, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
-	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61,
-	0x73, 0x6b, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x33,
-	0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e,
-	0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72,
-	0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74,
-	0x61, 0x74, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65,
-	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
-	0x38, 0x01, 0x22, 0x4a, 0x0a, 0x10, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64,
-	0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65,
-	0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
-	0x52, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x22, 0xbc,
-	0x01, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x0e,
-	0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18,
-	0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
-	0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f,
-	0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b,
-	0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x61,
-	0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63,
-	0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f,
-	0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73,
-	0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x5a, 0x0a,
-	0x0d, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12,
-	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
-	0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x6d, 0x61,
-	0x72, 0x79, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x4d, 0x0a, 0x0e, 0x54, 0x61, 0x73,
-	0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74,
-	0x61, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
-	0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69,
-	0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x09, 0x54, 0x61, 0x73,
-	0x6b, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f,
-	0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02,
-	0x52, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x53,
-	0x12, 0x2e, 0x0a, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x76, 0x65,
-	0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x64,
-	0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x53,
-	0x12, 0x2a, 0x0a, 0x11, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68,
-	0x65, 0x61, 0x64, 0x5f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x75, 0x70, 0x6c,
-	0x6f, 0x61, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x53, 0x22, 0x84, 0x06, 0x0a,
-	0x03, 0x4a, 0x6f, 0x62, 0x12, 0x30, 0x0a, 0x14, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63,
-	0x6b, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x03, 0x52, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42,
-	0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62,
-	0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b,
-	0x65, 0x74, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x40, 0x0a, 0x0e, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x64, 0x69,
-	0x66, 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x64, 0x62, 0x4d, 0x6f, 0x64,
-	0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e,
-	0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e,
-	0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72,
-	0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63,
-	0x69, 0x65, 0x73, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65,
-	0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74,
-	0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
-	0x6d, 0x70, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e,
-	0x0a, 0x02, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19,
-	0x0a, 0x08, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x07, 0x69, 0x73, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
-	0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a,
-	0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52,
-	0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x70,
-	0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e,
-	0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72,
-	0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x09, 0x72, 0x65,
-	0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63,
-	0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4a, 0x6f, 0x62, 0x53,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a,
-	0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74,
-	0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70,
-	0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52,
-	0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x0f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64,
-	0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x22, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
-	0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x52, 0x0e, 0x74, 0x61, 0x73, 0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x2a, 0x88, 0x01, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55,
-	0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x54,
-	0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49,
-	0x4e, 0x47, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41,
-	0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x17, 0x0a,
-	0x13, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49,
-	0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x53,
-	0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4d, 0x49, 0x53, 0x48, 0x41, 0x50, 0x10, 0x04, 0x2a, 0x87,
-	0x01, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x16,
-	0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52,
-	0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f,
-	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01,
-	0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46,
-	0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4a, 0x4f, 0x42, 0x5f,
-	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4d, 0x49, 0x53, 0x48, 0x41, 0x50, 0x10, 0x03, 0x12,
-	0x17, 0x0a, 0x13, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41,
-	0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x32, 0x82, 0x07, 0x0a, 0x14, 0x54, 0x61, 0x73,
-	0x6b, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x12, 0x5e, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x73,
-	0x12, 0x26, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
-	0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62,
-	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
-	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72,
-	0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x4f, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x21, 0x2e, 0x74, 0x61,
-	0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63,
-	0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22,
-	0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e,
-	0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x58, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x12,
-	0x24, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
-	0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68,
-	0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65,
-	0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x0a,
-	0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x73,
+	0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65,
+	0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x05, 0x74,
+	0x61, 0x73, 0x6b, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x61, 0x73,
 	0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e,
-	0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x26, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
-	0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4a, 0x6f, 0x62,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x07, 0x47, 0x65, 0x74,
-	0x54, 0x61, 0x73, 0x6b, 0x12, 0x22, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65,
-	0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73,
-	0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
-	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65,
-	0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a,
-	0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x26, 0x2e, 0x74,
-	0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70,
-	0x63, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65,
-	0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
-	0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a,
-	0x10, 0x47, 0x65, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65,
-	0x73, 0x12, 0x2b, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
-	0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61,
-	0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c,
-	0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e,
-	0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52,
-	0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0f,
-	0x41, 0x64, 0x64, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x12,
-	0x2a, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
-	0x2e, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b,
-	0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x61,
-	0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63,
-	0x2e, 0x41, 0x64, 0x64, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65,
-	0x74, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2d,
-	0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e,
-	0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61,
-	0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e,
+	0x54, 0x61, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x05, 0x74,
+	0x61, 0x73, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x0f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x69, 0x6d,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e,
 	0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72,
-	0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73,
-	0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x29, 0x5a,
-	0x27, 0x67, 0x6f, 0x2e, 0x73, 0x6b, 0x69, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x69, 0x6e, 0x66,
-	0x72, 0x61, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
-	0x72, 0x2f, 0x67, 0x6f, 0x2f, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x70, 0x63, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x52, 0x0e, 0x74, 0x61, 0x73, 0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x2a, 0x88, 0x01, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
+	0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x53,
+	0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47,
+	0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55,
+	0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54,
+	0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55,
+	0x52, 0x45, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x53, 0x54, 0x41,
+	0x54, 0x55, 0x53, 0x5f, 0x4d, 0x49, 0x53, 0x48, 0x41, 0x50, 0x10, 0x04, 0x2a, 0x87, 0x01, 0x0a,
+	0x09, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x16, 0x4a, 0x4f,
+	0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47,
+	0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54,
+	0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x16,
+	0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49,
+	0x4c, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54,
+	0x41, 0x54, 0x55, 0x53, 0x5f, 0x4d, 0x49, 0x53, 0x48, 0x41, 0x50, 0x10, 0x03, 0x12, 0x17, 0x0a,
+	0x13, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43,
+	0x45, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x32, 0x82, 0x07, 0x0a, 0x14, 0x54, 0x61, 0x73, 0x6b, 0x53,
+	0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
+	0x5e, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x26,
+	0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e,
+	0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63,
+	0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x69, 0x67,
+	0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x4f, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x21, 0x2e, 0x74, 0x61, 0x73, 0x6b,
+	0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47,
+	0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74,
+	0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70,
+	0x63, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x58, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x24, 0x2e,
+	0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72,
+	0x70, 0x63, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64,
+	0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a,
+	0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x0a, 0x53, 0x65,
+	0x61, 0x72, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f,
+	0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65,
+	0x61, 0x72, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x26, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
+	0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61,
+	0x73, 0x6b, 0x12, 0x22, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75,
+	0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63,
+	0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54,
+	0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0b, 0x53,
+	0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x26, 0x2e, 0x74, 0x61, 0x73,
+	0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e,
+	0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75,
+	0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x61,
+	0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x10, 0x47,
+	0x65, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12,
+	0x2b, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
+	0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b,
+	0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74,
+	0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70,
+	0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c,
+	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0f, 0x41, 0x64,
+	0x64, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2a, 0x2e,
+	0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72,
+	0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75,
+	0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x61, 0x73, 0x6b,
+	0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x41,
+	0x64, 0x64, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2d, 0x2e, 0x74,
+	0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70,
+	0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b,
+	0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x61,
+	0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x70, 0x63,
+	0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52,
+	0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x29, 0x5a, 0x27, 0x67,
+	0x6f, 0x2e, 0x73, 0x6b, 0x69, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61,
+	0x2f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2f,
+	0x67, 0x6f, 0x2f, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -2644,64 +2900,62 @@
 	2,  // 0: task_scheduler.rpc.TriggerJobsRequest.jobs:type_name -> task_scheduler.rpc.TriggerJob
 	30, // 1: task_scheduler.rpc.GetJobResponse.job:type_name -> task_scheduler.rpc.Job
 	30, // 2: task_scheduler.rpc.CancelJobResponse.job:type_name -> task_scheduler.rpc.Job
-	22, // 3: task_scheduler.rpc.SearchJobsRequest.repo_state:type_name -> task_scheduler.rpc.RepoState
-	1,  // 4: task_scheduler.rpc.SearchJobsRequest.status:type_name -> task_scheduler.rpc.JobStatus
-	33, // 5: task_scheduler.rpc.SearchJobsRequest.time_start:type_name -> google.protobuf.Timestamp
-	33, // 6: task_scheduler.rpc.SearchJobsRequest.time_end:type_name -> google.protobuf.Timestamp
-	30, // 7: task_scheduler.rpc.SearchJobsResponse.jobs:type_name -> task_scheduler.rpc.Job
-	24, // 8: task_scheduler.rpc.GetTaskResponse.task:type_name -> task_scheduler.rpc.Task
-	23, // 9: task_scheduler.rpc.SearchTasksRequest.task_key:type_name -> task_scheduler.rpc.TaskKey
-	0,  // 10: task_scheduler.rpc.SearchTasksRequest.status:type_name -> task_scheduler.rpc.TaskStatus
-	33, // 11: task_scheduler.rpc.SearchTasksRequest.time_start:type_name -> google.protobuf.Timestamp
-	33, // 12: task_scheduler.rpc.SearchTasksRequest.time_end:type_name -> google.protobuf.Timestamp
-	24, // 13: task_scheduler.rpc.SearchTasksResponse.tasks:type_name -> task_scheduler.rpc.Task
-	16, // 14: task_scheduler.rpc.GetSkipTaskRulesResponse.rules:type_name -> task_scheduler.rpc.SkipTaskRule
-	16, // 15: task_scheduler.rpc.AddSkipTaskRuleResponse.rules:type_name -> task_scheduler.rpc.SkipTaskRule
-	16, // 16: task_scheduler.rpc.DeleteSkipTaskRuleResponse.rules:type_name -> task_scheduler.rpc.SkipTaskRule
-	31, // 17: task_scheduler.rpc.RepoState.patch:type_name -> task_scheduler.rpc.RepoState.Patch
-	22, // 18: task_scheduler.rpc.TaskKey.repo_state:type_name -> task_scheduler.rpc.RepoState
-	33, // 19: task_scheduler.rpc.Task.created_at:type_name -> google.protobuf.Timestamp
-	33, // 20: task_scheduler.rpc.Task.db_modified_at:type_name -> google.protobuf.Timestamp
-	33, // 21: task_scheduler.rpc.Task.finished_at:type_name -> google.protobuf.Timestamp
-	32, // 22: task_scheduler.rpc.Task.properties:type_name -> task_scheduler.rpc.Task.PropertiesEntry
-	33, // 23: task_scheduler.rpc.Task.started_at:type_name -> google.protobuf.Timestamp
-	0,  // 24: task_scheduler.rpc.Task.status:type_name -> task_scheduler.rpc.TaskStatus
-	23, // 25: task_scheduler.rpc.Task.task_key:type_name -> task_scheduler.rpc.TaskKey
-	29, // 26: task_scheduler.rpc.Task.stats:type_name -> task_scheduler.rpc.TaskStats
-	0,  // 27: task_scheduler.rpc.TaskSummary.status:type_name -> task_scheduler.rpc.TaskStatus
-	26, // 28: task_scheduler.rpc.TaskSummaries.tasks:type_name -> task_scheduler.rpc.TaskSummary
-	33, // 29: task_scheduler.rpc.Job.created_at:type_name -> google.protobuf.Timestamp
-	33, // 30: task_scheduler.rpc.Job.db_modified_at:type_name -> google.protobuf.Timestamp
-	25, // 31: task_scheduler.rpc.Job.dependencies:type_name -> task_scheduler.rpc.TaskDependencies
-	33, // 32: task_scheduler.rpc.Job.finished_at:type_name -> google.protobuf.Timestamp
-	22, // 33: task_scheduler.rpc.Job.repo_state:type_name -> task_scheduler.rpc.RepoState
-	33, // 34: task_scheduler.rpc.Job.requested_at:type_name -> google.protobuf.Timestamp
-	1,  // 35: task_scheduler.rpc.Job.status:type_name -> task_scheduler.rpc.JobStatus
-	27, // 36: task_scheduler.rpc.Job.tasks:type_name -> task_scheduler.rpc.TaskSummaries
-	28, // 37: task_scheduler.rpc.Job.task_dimensions:type_name -> task_scheduler.rpc.TaskDimensions
-	3,  // 38: task_scheduler.rpc.TaskSchedulerService.TriggerJobs:input_type -> task_scheduler.rpc.TriggerJobsRequest
-	5,  // 39: task_scheduler.rpc.TaskSchedulerService.GetJob:input_type -> task_scheduler.rpc.GetJobRequest
-	7,  // 40: task_scheduler.rpc.TaskSchedulerService.CancelJob:input_type -> task_scheduler.rpc.CancelJobRequest
-	9,  // 41: task_scheduler.rpc.TaskSchedulerService.SearchJobs:input_type -> task_scheduler.rpc.SearchJobsRequest
-	11, // 42: task_scheduler.rpc.TaskSchedulerService.GetTask:input_type -> task_scheduler.rpc.GetTaskRequest
-	13, // 43: task_scheduler.rpc.TaskSchedulerService.SearchTasks:input_type -> task_scheduler.rpc.SearchTasksRequest
-	15, // 44: task_scheduler.rpc.TaskSchedulerService.GetSkipTaskRules:input_type -> task_scheduler.rpc.GetSkipTaskRulesRequest
-	18, // 45: task_scheduler.rpc.TaskSchedulerService.AddSkipTaskRule:input_type -> task_scheduler.rpc.AddSkipTaskRuleRequest
-	20, // 46: task_scheduler.rpc.TaskSchedulerService.DeleteSkipTaskRule:input_type -> task_scheduler.rpc.DeleteSkipTaskRuleRequest
-	4,  // 47: task_scheduler.rpc.TaskSchedulerService.TriggerJobs:output_type -> task_scheduler.rpc.TriggerJobsResponse
-	6,  // 48: task_scheduler.rpc.TaskSchedulerService.GetJob:output_type -> task_scheduler.rpc.GetJobResponse
-	8,  // 49: task_scheduler.rpc.TaskSchedulerService.CancelJob:output_type -> task_scheduler.rpc.CancelJobResponse
-	10, // 50: task_scheduler.rpc.TaskSchedulerService.SearchJobs:output_type -> task_scheduler.rpc.SearchJobsResponse
-	12, // 51: task_scheduler.rpc.TaskSchedulerService.GetTask:output_type -> task_scheduler.rpc.GetTaskResponse
-	14, // 52: task_scheduler.rpc.TaskSchedulerService.SearchTasks:output_type -> task_scheduler.rpc.SearchTasksResponse
-	17, // 53: task_scheduler.rpc.TaskSchedulerService.GetSkipTaskRules:output_type -> task_scheduler.rpc.GetSkipTaskRulesResponse
-	19, // 54: task_scheduler.rpc.TaskSchedulerService.AddSkipTaskRule:output_type -> task_scheduler.rpc.AddSkipTaskRuleResponse
-	21, // 55: task_scheduler.rpc.TaskSchedulerService.DeleteSkipTaskRule:output_type -> task_scheduler.rpc.DeleteSkipTaskRuleResponse
-	47, // [47:56] is the sub-list for method output_type
-	38, // [38:47] is the sub-list for method input_type
-	38, // [38:38] is the sub-list for extension type_name
-	38, // [38:38] is the sub-list for extension extendee
-	0,  // [0:38] is the sub-list for field type_name
+	1,  // 3: task_scheduler.rpc.SearchJobsRequest.status:type_name -> task_scheduler.rpc.JobStatus
+	33, // 4: task_scheduler.rpc.SearchJobsRequest.time_start:type_name -> google.protobuf.Timestamp
+	33, // 5: task_scheduler.rpc.SearchJobsRequest.time_end:type_name -> google.protobuf.Timestamp
+	30, // 6: task_scheduler.rpc.SearchJobsResponse.jobs:type_name -> task_scheduler.rpc.Job
+	24, // 7: task_scheduler.rpc.GetTaskResponse.task:type_name -> task_scheduler.rpc.Task
+	0,  // 8: task_scheduler.rpc.SearchTasksRequest.status:type_name -> task_scheduler.rpc.TaskStatus
+	33, // 9: task_scheduler.rpc.SearchTasksRequest.time_start:type_name -> google.protobuf.Timestamp
+	33, // 10: task_scheduler.rpc.SearchTasksRequest.time_end:type_name -> google.protobuf.Timestamp
+	24, // 11: task_scheduler.rpc.SearchTasksResponse.tasks:type_name -> task_scheduler.rpc.Task
+	16, // 12: task_scheduler.rpc.GetSkipTaskRulesResponse.rules:type_name -> task_scheduler.rpc.SkipTaskRule
+	16, // 13: task_scheduler.rpc.AddSkipTaskRuleResponse.rules:type_name -> task_scheduler.rpc.SkipTaskRule
+	16, // 14: task_scheduler.rpc.DeleteSkipTaskRuleResponse.rules:type_name -> task_scheduler.rpc.SkipTaskRule
+	31, // 15: task_scheduler.rpc.RepoState.patch:type_name -> task_scheduler.rpc.RepoState.Patch
+	22, // 16: task_scheduler.rpc.TaskKey.repo_state:type_name -> task_scheduler.rpc.RepoState
+	33, // 17: task_scheduler.rpc.Task.created_at:type_name -> google.protobuf.Timestamp
+	33, // 18: task_scheduler.rpc.Task.db_modified_at:type_name -> google.protobuf.Timestamp
+	33, // 19: task_scheduler.rpc.Task.finished_at:type_name -> google.protobuf.Timestamp
+	32, // 20: task_scheduler.rpc.Task.properties:type_name -> task_scheduler.rpc.Task.PropertiesEntry
+	33, // 21: task_scheduler.rpc.Task.started_at:type_name -> google.protobuf.Timestamp
+	0,  // 22: task_scheduler.rpc.Task.status:type_name -> task_scheduler.rpc.TaskStatus
+	23, // 23: task_scheduler.rpc.Task.task_key:type_name -> task_scheduler.rpc.TaskKey
+	29, // 24: task_scheduler.rpc.Task.stats:type_name -> task_scheduler.rpc.TaskStats
+	0,  // 25: task_scheduler.rpc.TaskSummary.status:type_name -> task_scheduler.rpc.TaskStatus
+	26, // 26: task_scheduler.rpc.TaskSummaries.tasks:type_name -> task_scheduler.rpc.TaskSummary
+	33, // 27: task_scheduler.rpc.Job.created_at:type_name -> google.protobuf.Timestamp
+	33, // 28: task_scheduler.rpc.Job.db_modified_at:type_name -> google.protobuf.Timestamp
+	25, // 29: task_scheduler.rpc.Job.dependencies:type_name -> task_scheduler.rpc.TaskDependencies
+	33, // 30: task_scheduler.rpc.Job.finished_at:type_name -> google.protobuf.Timestamp
+	22, // 31: task_scheduler.rpc.Job.repo_state:type_name -> task_scheduler.rpc.RepoState
+	33, // 32: task_scheduler.rpc.Job.requested_at:type_name -> google.protobuf.Timestamp
+	1,  // 33: task_scheduler.rpc.Job.status:type_name -> task_scheduler.rpc.JobStatus
+	27, // 34: task_scheduler.rpc.Job.tasks:type_name -> task_scheduler.rpc.TaskSummaries
+	28, // 35: task_scheduler.rpc.Job.task_dimensions:type_name -> task_scheduler.rpc.TaskDimensions
+	3,  // 36: task_scheduler.rpc.TaskSchedulerService.TriggerJobs:input_type -> task_scheduler.rpc.TriggerJobsRequest
+	5,  // 37: task_scheduler.rpc.TaskSchedulerService.GetJob:input_type -> task_scheduler.rpc.GetJobRequest
+	7,  // 38: task_scheduler.rpc.TaskSchedulerService.CancelJob:input_type -> task_scheduler.rpc.CancelJobRequest
+	9,  // 39: task_scheduler.rpc.TaskSchedulerService.SearchJobs:input_type -> task_scheduler.rpc.SearchJobsRequest
+	11, // 40: task_scheduler.rpc.TaskSchedulerService.GetTask:input_type -> task_scheduler.rpc.GetTaskRequest
+	13, // 41: task_scheduler.rpc.TaskSchedulerService.SearchTasks:input_type -> task_scheduler.rpc.SearchTasksRequest
+	15, // 42: task_scheduler.rpc.TaskSchedulerService.GetSkipTaskRules:input_type -> task_scheduler.rpc.GetSkipTaskRulesRequest
+	18, // 43: task_scheduler.rpc.TaskSchedulerService.AddSkipTaskRule:input_type -> task_scheduler.rpc.AddSkipTaskRuleRequest
+	20, // 44: task_scheduler.rpc.TaskSchedulerService.DeleteSkipTaskRule:input_type -> task_scheduler.rpc.DeleteSkipTaskRuleRequest
+	4,  // 45: task_scheduler.rpc.TaskSchedulerService.TriggerJobs:output_type -> task_scheduler.rpc.TriggerJobsResponse
+	6,  // 46: task_scheduler.rpc.TaskSchedulerService.GetJob:output_type -> task_scheduler.rpc.GetJobResponse
+	8,  // 47: task_scheduler.rpc.TaskSchedulerService.CancelJob:output_type -> task_scheduler.rpc.CancelJobResponse
+	10, // 48: task_scheduler.rpc.TaskSchedulerService.SearchJobs:output_type -> task_scheduler.rpc.SearchJobsResponse
+	12, // 49: task_scheduler.rpc.TaskSchedulerService.GetTask:output_type -> task_scheduler.rpc.GetTaskResponse
+	14, // 50: task_scheduler.rpc.TaskSchedulerService.SearchTasks:output_type -> task_scheduler.rpc.SearchTasksResponse
+	17, // 51: task_scheduler.rpc.TaskSchedulerService.GetSkipTaskRules:output_type -> task_scheduler.rpc.GetSkipTaskRulesResponse
+	19, // 52: task_scheduler.rpc.TaskSchedulerService.AddSkipTaskRule:output_type -> task_scheduler.rpc.AddSkipTaskRuleResponse
+	21, // 53: task_scheduler.rpc.TaskSchedulerService.DeleteSkipTaskRule:output_type -> task_scheduler.rpc.DeleteSkipTaskRuleResponse
+	45, // [45:54] is the sub-list for method output_type
+	36, // [36:45] is the sub-list for method input_type
+	36, // [36:36] is the sub-list for extension type_name
+	36, // [36:36] is the sub-list for extension extendee
+	0,  // [0:36] is the sub-list for field type_name
 }
 
 func init() { file_rpc_proto_init() }
diff --git a/task_scheduler/go/rpc/rpc.proto b/task_scheduler/go/rpc/rpc.proto
index 175f83a..d38e2e3 100644
--- a/task_scheduler/go/rpc/rpc.proto
+++ b/task_scheduler/go/rpc/rpc.proto
@@ -76,13 +76,26 @@
 
 // SearchJobsRequest is a request to SearchJobs.
 message SearchJobsRequest {
-	RepoState repo_state = 1;
-	int64 buildbucket_build_id = 2; // TODO: Make optional.
-	bool is_force = 3; // TODO: Make optional.
-	string name = 4;
-	JobStatus status = 5; // TODO: Make optional.
-	google.protobuf.Timestamp time_start = 6;
-	google.protobuf.Timestamp time_end = 7;
+	int64 buildbucket_build_id = 1;
+	bool has_buildbucket_build_id = 2;
+	bool is_force = 3;
+	bool has_is_force = 4;
+	string issue = 5;
+	bool has_issue = 6;
+	string name = 7;
+	bool has_name = 8;
+	string patchset = 9;
+	bool has_patchset = 10;
+	string repo = 11;
+	bool has_repo = 12;
+	string revision = 13;
+	bool has_revision = 14;
+	JobStatus status = 15;
+	bool has_status = 16;
+	google.protobuf.Timestamp time_start = 17;
+	bool has_time_start = 18;
+	google.protobuf.Timestamp time_end = 19;
+	bool has_time_end = 20;
 }
 
 // SearchJobsRequest is a response returned by SearchJobs.
@@ -107,11 +120,24 @@
 
 // SearchTasksRequest is a request to SearchTasks.
 message SearchTasksRequest {
-	TaskKey task_key = 1;
-	int32 attempt = 2; // TODO: Make optional.
-	TaskStatus status = 3;
-	google.protobuf.Timestamp time_start = 6;
-	google.protobuf.Timestamp time_end = 7;
+	int32 attempt = 1;
+	bool has_attempt = 2;
+	string issue = 3;
+	bool has_issue = 4;
+	string name = 5;
+	bool has_name = 6;
+	string patchset = 7;
+	bool has_patchset = 8;
+	string repo = 9;
+	bool has_repo = 10;
+	string revision = 11;
+	bool has_revision = 12;
+	TaskStatus status = 13;
+	bool has_status = 14;
+	google.protobuf.Timestamp time_start = 15;
+	bool has_time_start = 16;
+	google.protobuf.Timestamp time_end = 17;
+	bool has_time_end = 18;
 }
 
 // SearchTasksResponse is a response returned from SearchTasks.
@@ -174,7 +200,7 @@
 	repeated SkipTaskRule rules = 1;
 }
 
-// RepoState encapsulates all of the parameters which define the state of a
+//  encapsulates all of the parameters which define the state of a
 // repo.
 message RepoState {
   // Patch describes a patch which may be applied to a code checkout.
@@ -322,7 +348,8 @@
 	TaskStatus status = 4;
 	string swarming_task_id = 5;
 }
-
+ // TODO: Make optional.
+ // TODO: Make optional.
 // TaskSummaries groups TaskSummaries which have the same TaskSpec name.
 message TaskSummaries {
 	string name = 1;
@@ -395,7 +422,7 @@
 	// priority is an indicator of the relative priority of this Job.
 	float priority = 10;
 
-	// repoState is the current state of the repository for this Job.
+	//  is the current state of the repository for this Job.
 	RepoState repo_state = 11;
 
 	// requested is the time at which this Job was requested. This is a
diff --git a/task_scheduler/go/rpc/rpc.twirp.go b/task_scheduler/go/rpc/rpc.twirp.go
index d2e3d78..13bc974 100644
--- a/task_scheduler/go/rpc/rpc.twirp.go
+++ b/task_scheduler/go/rpc/rpc.twirp.go
@@ -2292,121 +2292,133 @@
 }
 
 var twirpFileDescriptor0 = []byte{
-	// 1842 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0x1b, 0xb7,
-	0x15, 0xce, 0xf2, 0x57, 0x3c, 0x94, 0x48, 0x0a, 0x72, 0x2c, 0x9a, 0x99, 0xd8, 0xca, 0xba, 0xb5,
-	0x15, 0xdb, 0xa5, 0x3a, 0xca, 0xc4, 0xad, 0x9b, 0xa6, 0x2d, 0x25, 0x33, 0x96, 0x64, 0x5b, 0x52,
-	0x97, 0xd2, 0x4c, 0x27, 0x9d, 0xc9, 0xce, 0x72, 0x17, 0x92, 0x56, 0x22, 0x17, 0x5b, 0x00, 0x54,
-	0xa2, 0xab, 0xce, 0x74, 0x3a, 0xd3, 0x5e, 0xb6, 0x37, 0x7d, 0x85, 0xbe, 0x44, 0xdf, 0xa4, 0x77,
-	0xbd, 0xea, 0x63, 0x74, 0xf0, 0xb3, 0x4b, 0x90, 0x5a, 0x8a, 0x56, 0x7d, 0xe1, 0x3b, 0xe0, 0xe0,
-	0x3b, 0x07, 0x07, 0xe7, 0x0f, 0x38, 0x80, 0x0a, 0x8d, 0xfd, 0x76, 0x4c, 0x09, 0x27, 0x08, 0x71,
-	0x8f, 0x5d, 0xb8, 0xcc, 0x3f, 0xc3, 0xc1, 0x68, 0x80, 0x69, 0x9b, 0xc6, 0x7e, 0xeb, 0xc1, 0x29,
-	0x21, 0xa7, 0x03, 0xbc, 0x21, 0x11, 0xfd, 0xd1, 0xc9, 0x06, 0x0f, 0x87, 0x98, 0x71, 0x6f, 0x18,
-	0x2b, 0x26, 0x7b, 0x07, 0xe0, 0x88, 0x86, 0xa7, 0xa7, 0x98, 0xee, 0x91, 0x3e, 0xba, 0x07, 0x0b,
-	0xe7, 0xa4, 0xef, 0x46, 0xde, 0x10, 0x37, 0xad, 0x35, 0x6b, 0xbd, 0xe2, 0x94, 0xcf, 0x49, 0x7f,
-	0xdf, 0x1b, 0x62, 0xf4, 0x00, 0xaa, 0x3e, 0x19, 0x0e, 0x43, 0xee, 0x9e, 0x79, 0xec, 0xac, 0x99,
-	0x93, 0xab, 0xa0, 0x48, 0x3b, 0x1e, 0x3b, 0xb3, 0x77, 0x00, 0x8d, 0x25, 0x31, 0x07, 0xff, 0x61,
-	0x84, 0x19, 0x47, 0x9b, 0x50, 0x38, 0x27, 0x7d, 0xd6, 0xb4, 0xd6, 0xf2, 0xeb, 0xd5, 0xcd, 0xfb,
-	0xed, 0xeb, 0x3a, 0xb6, 0xc7, 0x5c, 0x8e, 0xc4, 0xda, 0x6d, 0x58, 0x99, 0x90, 0xc4, 0x62, 0x12,
-	0x31, 0x8c, 0x56, 0x41, 0x28, 0xe3, 0x86, 0x81, 0x92, 0x56, 0x71, 0x4a, 0xe7, 0xa4, 0xbf, 0x1b,
-	0x30, 0xfb, 0x01, 0x2c, 0xbd, 0xc2, 0x5c, 0xf0, 0xeb, 0x4d, 0x6b, 0x90, 0x0b, 0x03, 0x7d, 0x80,
-	0x5c, 0x18, 0xd8, 0x5f, 0x41, 0x2d, 0x01, 0x68, 0x59, 0x9f, 0x43, 0xfe, 0x9c, 0xf4, 0x25, 0xa4,
-	0xba, 0xb9, 0x9a, 0xa5, 0x95, 0x40, 0x0b, 0x8c, 0x6d, 0x43, 0x63, 0xdb, 0x8b, 0x7c, 0x3c, 0xb8,
-	0x61, 0x83, 0x5f, 0xc1, 0xb2, 0x81, 0xb9, 0xfd, 0x1e, 0xff, 0xce, 0xc1, 0x72, 0x0f, 0x7b, 0xd4,
-	0x3f, 0x33, 0x6d, 0xf7, 0x4b, 0x00, 0x8a, 0x63, 0xe2, 0x32, 0xee, 0x71, 0xac, 0xe5, 0x7c, 0x9a,
-	0x25, 0xc7, 0xc1, 0x31, 0xe9, 0x09, 0x90, 0x53, 0xa1, 0xc9, 0x10, 0xfd, 0x14, 0xee, 0xf4, 0x47,
-	0xe1, 0x20, 0xe8, 0x8f, 0xfc, 0x0b, 0xcc, 0x5d, 0x39, 0x76, 0xc3, 0x40, 0x7a, 0x2e, 0xef, 0x20,
-	0x63, 0x6d, 0x4b, 0x0c, 0x77, 0x03, 0xe1, 0xfd, 0x90, 0xb9, 0x27, 0x84, 0xfa, 0xb8, 0x99, 0x5f,
-	0xb3, 0xd6, 0x17, 0x9c, 0x72, 0xc8, 0xbe, 0x11, 0x53, 0x84, 0xa0, 0x20, 0x83, 0xa2, 0x20, 0x8f,
-	0x2c, 0xc7, 0xe8, 0x4b, 0x28, 0x09, 0xcd, 0x46, 0xac, 0x59, 0x5c, 0xb3, 0xd6, 0x6b, 0xd9, 0xaa,
-	0xed, 0x91, 0x7e, 0x4f, 0x82, 0x1c, 0x0d, 0x46, 0x2f, 0x00, 0x44, 0x10, 0x8a, 0x53, 0x51, 0xde,
-	0x2c, 0xc9, 0x53, 0xb5, 0xda, 0x2a, 0x4e, 0xdb, 0x49, 0x9c, 0xb6, 0x8f, 0x92, 0x38, 0x75, 0x2a,
-	0x02, 0xdd, 0x13, 0x60, 0xf4, 0x25, 0x2c, 0x48, 0x56, 0x1c, 0x05, 0xcd, 0xf2, 0x5c, 0xc6, 0xb2,
-	0xc0, 0x76, 0xa3, 0xc0, 0xee, 0x00, 0x32, 0x8d, 0xab, 0xdd, 0xf3, 0x74, 0x22, 0x32, 0x67, 0xfa,
-	0x47, 0x85, 0x64, 0x57, 0x46, 0xd0, 0x91, 0xc7, 0x2e, 0x66, 0x84, 0x00, 0x7a, 0x08, 0x4b, 0x61,
-	0xe4, 0x0f, 0x46, 0x81, 0x3c, 0x19, 0x67, 0xd2, 0xce, 0x0b, 0xce, 0xa2, 0x26, 0x0a, 0x23, 0x30,
-	0xfb, 0xd7, 0x50, 0x4f, 0xc5, 0x68, 0x35, 0x9e, 0x41, 0x41, 0xec, 0xac, 0xdd, 0xdb, 0xcc, 0x4c,
-	0x10, 0x81, 0x97, 0x28, 0xfb, 0x6f, 0xb9, 0xe4, 0x2c, 0x82, 0x98, 0x46, 0xca, 0x73, 0x58, 0x90,
-	0x7c, 0x17, 0xf8, 0x4a, 0x0b, 0xfa, 0x64, 0x96, 0xa0, 0xd7, 0xf8, 0xca, 0x29, 0x73, 0x35, 0x40,
-	0x4d, 0x28, 0x7b, 0x9c, 0xe3, 0x61, 0xcc, 0xa5, 0xba, 0x45, 0x27, 0x99, 0xa2, 0xe7, 0xa9, 0x73,
-	0xf3, 0xd2, 0xb9, 0xf7, 0x67, 0xc9, 0xfb, 0xe0, 0xde, 0xed, 0xc2, 0xca, 0x84, 0x45, 0xb4, 0x5d,
-	0xdb, 0x50, 0x14, 0x1a, 0x27, 0xfe, 0x9d, 0x6d, 0x58, 0x05, 0xb3, 0xef, 0xc1, 0xea, 0x2b, 0xcc,
-	0x7b, 0x17, 0x61, 0x2c, 0xa9, 0xa3, 0x01, 0x4e, 0xac, 0x6b, 0xff, 0xd3, 0x82, 0x45, 0x73, 0x41,
-	0x24, 0x8a, 0x17, 0x04, 0x38, 0x70, 0xfb, 0x57, 0x49, 0x99, 0x94, 0xf3, 0xad, 0x2b, 0xf4, 0x0c,
-	0x74, 0x19, 0x8e, 0xb1, 0xef, 0xc6, 0xc2, 0x9a, 0x34, 0x12, 0xb1, 0x20, 0xea, 0x55, 0x43, 0xac,
-	0xf4, 0x62, 0xec, 0x1f, 0x6a, 0xba, 0xb0, 0xbf, 0xaa, 0xa0, 0xc2, 0xcc, 0x02, 0x92, 0x4c, 0xd1,
-	0x1a, 0x54, 0x03, 0xcc, 0x7c, 0x1a, 0xc6, 0x3c, 0x24, 0x91, 0xce, 0x3b, 0x93, 0x94, 0xa6, 0x64,
-	0x71, 0x9c, 0x92, 0xb6, 0x03, 0xcd, 0xeb, 0x87, 0xd0, 0x06, 0x79, 0x0e, 0x45, 0x2a, 0x08, 0xda,
-	0x20, 0x6b, 0x59, 0x06, 0x31, 0x39, 0x1d, 0x05, 0xb7, 0xff, 0x61, 0xc1, 0xdd, 0x4e, 0x10, 0x4c,
-	0x2c, 0xe9, 0xb0, 0xfb, 0xb0, 0x87, 0xfd, 0x2d, 0xac, 0x5e, 0xd3, 0xeb, 0x3d, 0xcf, 0xfa, 0x14,
-	0xee, 0xbd, 0xc4, 0x03, 0xcc, 0x71, 0xd6, 0x69, 0xa7, 0x8b, 0xfe, 0x11, 0xb4, 0xb2, 0xc0, 0xef,
-	0xa9, 0xc2, 0x7f, 0x2d, 0xa8, 0xa4, 0xf5, 0x1c, 0xbd, 0x80, 0x62, 0xec, 0x71, 0xff, 0x4c, 0x67,
-	0xf5, 0xc3, 0x1b, 0xab, 0x7f, 0xfb, 0x50, 0x40, 0x1d, 0xc5, 0x21, 0x4c, 0x26, 0x2e, 0x03, 0x7d,
-	0x53, 0xcb, 0x31, 0x6a, 0xc1, 0x02, 0xc5, 0x97, 0x21, 0x13, 0x56, 0xce, 0x4b, 0x7a, 0x3a, 0x6f,
-	0xc5, 0x50, 0x94, 0xfc, 0xe8, 0x0e, 0x14, 0x43, 0xc6, 0x46, 0xc9, 0x0b, 0x40, 0x4d, 0xd0, 0xa7,
-	0x00, 0x52, 0xae, 0x6b, 0x08, 0xad, 0x48, 0x8a, 0xa3, 0x25, 0xcb, 0x09, 0xc3, 0x3c, 0x91, 0x9c,
-	0xcc, 0xd1, 0x5d, 0x28, 0x31, 0x4c, 0x2f, 0x31, 0xd5, 0x9e, 0xd5, 0x33, 0xfb, 0x8f, 0x50, 0xd6,
-	0x15, 0xe9, 0x3d, 0xaf, 0xba, 0x24, 0x3a, 0x72, 0xc6, 0xed, 0x64, 0xc3, 0x92, 0xbc, 0xc9, 0x02,
-	0x57, 0x3d, 0x1a, 0xb4, 0x56, 0x55, 0x45, 0xdc, 0x13, 0x2f, 0x07, 0xfb, 0x3f, 0x25, 0x28, 0x08,
-	0x0d, 0xcc, 0x3a, 0x68, 0x4d, 0xd6, 0x41, 0x23, 0x68, 0x73, 0x93, 0x41, 0xfb, 0x02, 0xc0, 0xa7,
-	0xd8, 0xe3, 0x38, 0x70, 0x3d, 0x75, 0xe6, 0x39, 0x95, 0x4e, 0xa3, 0x3b, 0x1c, 0xfd, 0x06, 0x6a,
-	0x41, 0xdf, 0x1d, 0x92, 0x20, 0x3c, 0x09, 0x15, 0x7b, 0x61, 0x2e, 0xfb, 0x62, 0xd0, 0x7f, 0xab,
-	0x19, 0x3a, 0x1c, 0x7d, 0x05, 0xd5, 0x93, 0x30, 0x0a, 0xd9, 0x99, 0x62, 0x2f, 0xce, 0x65, 0x87,
-	0x04, 0xde, 0x49, 0x02, 0xb9, 0x94, 0x5e, 0x5d, 0x8f, 0xa1, 0x1e, 0x32, 0x32, 0x90, 0x47, 0x21,
-	0x23, 0x1e, 0x8f, 0xb8, 0xac, 0xbf, 0x15, 0xa7, 0x96, 0x90, 0x0f, 0x24, 0x55, 0xd8, 0x59, 0x5e,
-	0x99, 0x0b, 0xd2, 0x12, 0x72, 0x8c, 0x3e, 0x83, 0xc5, 0xa1, 0xf7, 0x83, 0xab, 0xed, 0xc5, 0x9a,
-	0x15, 0x69, 0xbf, 0xea, 0xd0, 0xfb, 0xa1, 0xa3, 0x49, 0xe8, 0x11, 0xd4, 0x63, 0x8f, 0xe2, 0x88,
-	0xbb, 0xd2, 0xa1, 0xe2, 0x01, 0x07, 0x52, 0xc2, 0x92, 0x22, 0x0b, 0x17, 0xec, 0x06, 0x0c, 0xed,
-	0x00, 0xc4, 0x94, 0xc4, 0x98, 0xf2, 0x10, 0xb3, 0x66, 0x55, 0xe6, 0xcd, 0xfa, 0xac, 0xba, 0xdd,
-	0x3e, 0x4c, 0xa1, 0xdd, 0x88, 0xd3, 0x2b, 0xc7, 0xe0, 0x15, 0x05, 0x9a, 0x62, 0x4e, 0xaf, 0x5c,
-	0x72, 0xd2, 0x5c, 0x54, 0x05, 0x5a, 0xce, 0x0f, 0x4e, 0x84, 0xdb, 0xe4, 0xdd, 0xa4, 0x0c, 0xb7,
-	0x34, 0xdf, 0x6d, 0x1a, 0xdd, 0x31, 0xef, 0xc4, 0xda, 0xad, 0xee, 0xc4, 0x47, 0x50, 0x67, 0xdf,
-	0x7b, 0x74, 0x18, 0x46, 0xa7, 0x6e, 0x9f, 0x70, 0x11, 0x8c, 0x75, 0xa9, 0xd4, 0x52, 0x42, 0xde,
-	0x22, 0x7c, 0x37, 0x40, 0xeb, 0xd0, 0x48, 0x71, 0xda, 0x52, 0xcd, 0x86, 0x72, 0x44, 0x42, 0x57,
-	0xa6, 0x9a, 0xb8, 0xef, 0x97, 0x6f, 0x71, 0xdf, 0x7f, 0x01, 0x45, 0xf5, 0x38, 0x41, 0xb3, 0x33,
-	0x2c, 0x39, 0x00, 0x73, 0x14, 0xb6, 0xf5, 0x35, 0xd4, 0xa7, 0x6c, 0x8d, 0x1a, 0x90, 0x4f, 0x9e,
-	0x1a, 0x15, 0x47, 0x0c, 0x45, 0xd1, 0xb8, 0xf4, 0x06, 0xa3, 0x24, 0x07, 0xd5, 0xe4, 0x17, 0xb9,
-	0x9f, 0x5b, 0xf6, 0x1e, 0x34, 0x84, 0xc8, 0x97, 0x38, 0xc6, 0x51, 0x80, 0x23, 0x5f, 0xf8, 0x07,
-	0x19, 0x8f, 0x9e, 0x8a, 0x7a, 0xda, 0x20, 0x1b, 0x16, 0x03, 0x03, 0xa3, 0xd3, 0x6d, 0x82, 0x66,
-	0xff, 0xcb, 0x82, 0xaa, 0xd4, 0x6f, 0x34, 0x1c, 0x7a, 0xf4, 0xea, 0xda, 0x23, 0x6c, 0xf6, 0x7b,
-	0x66, 0x3a, 0x4c, 0xf3, 0xd7, 0xc3, 0x74, 0xec, 0xde, 0xc2, 0xad, 0xdc, 0x9b, 0xe5, 0xb6, 0x62,
-	0x96, 0xdb, 0xec, 0x6f, 0x61, 0x69, 0xac, 0xbd, 0xb6, 0x83, 0xd1, 0x6b, 0x25, 0xcf, 0x6a, 0xfd,
-	0x70, 0xc9, 0xc9, 0x04, 0x78, 0x30, 0x53, 0x0b, 0x65, 0x83, 0xe4, 0xfd, 0xf2, 0x16, 0x6a, 0xd2,
-	0xcc, 0xe1, 0x10, 0x47, 0xa2, 0x9e, 0x33, 0xf4, 0x09, 0x54, 0x24, 0xab, 0xb1, 0x83, 0x8c, 0x1a,
-	0xd9, 0xce, 0xdd, 0x07, 0x08, 0x52, 0xa8, 0xb6, 0xb5, 0x41, 0xb1, 0xff, 0x6e, 0x41, 0x25, 0x8d,
-	0x04, 0x71, 0x44, 0x4e, 0xb8, 0x37, 0x70, 0xc9, 0x25, 0xa6, 0x67, 0xd8, 0x0b, 0x5c, 0x26, 0x25,
-	0xe6, 0x9c, 0x9a, 0xa4, 0x1f, 0x68, 0x72, 0x0f, 0xb5, 0x61, 0x25, 0x20, 0xdf, 0x47, 0x03, 0xe2,
-	0x05, 0x26, 0x38, 0x27, 0xc1, 0xcb, 0xc9, 0xd2, 0x18, 0xff, 0x04, 0x96, 0x47, 0xf1, 0x34, 0x3a,
-	0x2f, 0xd1, 0x75, 0xb5, 0x90, 0x62, 0xed, 0x3f, 0x97, 0x20, 0x2f, 0xba, 0xd4, 0x59, 0x9d, 0x8d,
-	0x35, 0xb3, 0xb3, 0xd9, 0x84, 0x8f, 0x4d, 0x8e, 0x01, 0xf6, 0x18, 0x96, 0xc9, 0xa3, 0x9a, 0xa1,
-	0x15, 0x63, 0xf1, 0x8d, 0x58, 0x13, 0xb9, 0xf2, 0x41, 0xeb, 0xfb, 0xce, 0x54, 0x32, 0x14, 0x65,
-	0x2c, 0xfc, 0x68, 0x56, 0x2c, 0x98, 0xc9, 0x35, 0x99, 0x32, 0xd3, 0x37, 0x45, 0xe9, 0xff, 0xb8,
-	0x29, 0xca, 0x69, 0x7e, 0x99, 0x1d, 0xe2, 0x42, 0x76, 0x87, 0x58, 0x31, 0x42, 0x59, 0x3c, 0x0a,
-	0x68, 0x48, 0x68, 0xc8, 0xaf, 0x9a, 0x20, 0x7d, 0x9a, 0xce, 0xa7, 0x6e, 0xfc, 0xea, 0x2d, 0x6f,
-	0xfc, 0xaf, 0x61, 0x91, 0xaa, 0x67, 0x99, 0x3a, 0xd6, 0xe2, 0xdc, 0x63, 0x55, 0x53, 0x7c, 0x87,
-	0x1b, 0xad, 0xeb, 0xd2, 0x6d, 0x5a, 0xd7, 0x9f, 0x25, 0xa9, 0x59, 0x93, 0xee, 0xf8, 0xec, 0xe6,
-	0xd4, 0x14, 0xbe, 0x50, 0x78, 0xf4, 0x1a, 0xea, 0x12, 0x6a, 0xa4, 0x5c, 0x5d, 0x8a, 0xb0, 0x67,
-	0x7a, 0x34, 0x45, 0x3a, 0x35, 0x3e, 0x31, 0x7f, 0xf2, 0x57, 0x0b, 0x60, 0x5c, 0x86, 0xd0, 0x2a,
-	0xac, 0x1c, 0x75, 0x7a, 0xaf, 0xdd, 0xde, 0x51, 0xe7, 0xe8, 0xb8, 0xe7, 0x1e, 0x76, 0xf7, 0x5f,
-	0xee, 0xee, 0xbf, 0x6a, 0x7c, 0x34, 0xbd, 0xe0, 0x1c, 0xef, 0xef, 0x8b, 0x05, 0x6b, 0x7a, 0xa1,
-	0x77, 0xbc, 0xbd, 0xdd, 0xed, 0xf5, 0x1a, 0xb9, 0xe9, 0x85, 0x6f, 0x3a, 0xbb, 0x6f, 0x8e, 0x9d,
-	0x6e, 0x23, 0x8f, 0xee, 0x02, 0x32, 0x17, 0xde, 0xee, 0xf6, 0x76, 0x3a, 0x87, 0x8d, 0xc2, 0x93,
-	0xbf, 0x58, 0x50, 0x49, 0xcd, 0x84, 0x5a, 0x70, 0x77, 0xef, 0x60, 0x2b, 0x01, 0xed, 0xee, 0xbb,
-	0x87, 0xce, 0xc1, 0x2b, 0x47, 0x88, 0xfe, 0x48, 0x48, 0x30, 0xd6, 0x92, 0x2d, 0xad, 0x29, 0x7a,
-	0xb2, 0x63, 0x0e, 0x7d, 0x0c, 0xcb, 0x06, 0x5d, 0x6f, 0x98, 0x17, 0x1a, 0x1a, 0xe4, 0xed, 0xce,
-	0xfe, 0x76, 0xf7, 0x4d, 0xf7, 0x65, 0xa3, 0xb0, 0xf9, 0xa7, 0x32, 0xdc, 0x91, 0x46, 0x49, 0x2c,
-	0xd9, 0xc3, 0xf4, 0x32, 0xf4, 0x31, 0xfa, 0x0e, 0xaa, 0xc6, 0x67, 0x12, 0x7a, 0x74, 0xf3, 0x0f,
-	0x54, 0xd2, 0xf3, 0xb5, 0x1e, 0xcf, 0xc5, 0xe9, 0x77, 0xfe, 0x01, 0x94, 0xd4, 0xdf, 0x12, 0xca,
-	0x0c, 0x87, 0x89, 0x8f, 0xa9, 0x96, 0x7d, 0x13, 0x44, 0x0b, 0xfc, 0x1d, 0x54, 0xd2, 0xbf, 0x24,
-	0x94, 0x99, 0xf1, 0xd3, 0xdf, 0x51, 0xad, 0x1f, 0xcf, 0x41, 0x69, 0xc9, 0xbf, 0x07, 0x18, 0xff,
-	0x83, 0xa0, 0x4c, 0xa6, 0x6b, 0x9f, 0x50, 0xad, 0x47, 0xf3, 0x60, 0x5a, 0xb8, 0x03, 0x65, 0xfd,
-	0xb5, 0x81, 0x66, 0x9d, 0xd2, 0xf8, 0x3e, 0x69, 0x3d, 0xbc, 0x11, 0xa3, 0x65, 0x7e, 0x07, 0x55,
-	0xa3, 0xb5, 0x47, 0x37, 0xa8, 0x62, 0xfe, 0x86, 0x64, 0xfb, 0x2e, 0xeb, 0x8f, 0x60, 0x08, 0x8d,
-	0xe9, 0x76, 0x19, 0x3d, 0x9d, 0xa1, 0x58, 0xd6, 0xcf, 0x40, 0xeb, 0xd9, 0xbb, 0x81, 0xf5, 0x76,
-	0xe7, 0x50, 0x9f, 0x6a, 0x58, 0xd1, 0x93, 0x2c, 0x01, 0xd9, 0xdd, 0x76, 0xeb, 0xe9, 0x3b, 0x61,
-	0xf5, 0x5e, 0x0c, 0xd0, 0xf5, 0xe6, 0x14, 0xfd, 0x24, 0x4b, 0xc4, 0xcc, 0x8e, 0xb7, 0xd5, 0x7e,
-	0x57, 0xb8, 0xda, 0x74, 0xeb, 0xf3, 0x6f, 0x1f, 0x9f, 0x92, 0x36, 0xbb, 0x08, 0xbd, 0x36, 0xa1,
-	0xa7, 0x1b, 0x61, 0x74, 0x42, 0xbd, 0x8d, 0x49, 0x11, 0x1b, 0xa7, 0x64, 0x83, 0xc6, 0x7e, 0xbf,
-	0x24, 0x4b, 0xf4, 0x17, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xd3, 0xb9, 0xf5, 0x3e, 0xc0, 0x16,
-	0x00, 0x00,
+	// 2046 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xcd, 0x72, 0x1b, 0xc7,
+	0x11, 0x36, 0xfe, 0x81, 0x06, 0xf1, 0xc3, 0xa1, 0x24, 0x42, 0x70, 0x49, 0xa2, 0x57, 0x8e, 0x44,
+	0x4b, 0x0a, 0x98, 0xa2, 0x4b, 0x72, 0x14, 0xc7, 0x49, 0x40, 0x8a, 0x16, 0x49, 0x49, 0x24, 0xb3,
+	0xa0, 0xaa, 0x52, 0x4e, 0x95, 0xb7, 0x16, 0xd8, 0x21, 0xb1, 0x24, 0x80, 0xdd, 0xec, 0x0c, 0x68,
+	0xf3, 0x94, 0xaa, 0x54, 0xaa, 0x92, 0x6b, 0x2e, 0x79, 0x85, 0xbc, 0x44, 0x9e, 0x24, 0xc7, 0x9c,
+	0x72, 0xcb, 0x2b, 0xb8, 0xa6, 0x67, 0x76, 0x39, 0x00, 0x76, 0x01, 0x51, 0x3a, 0xe8, 0xb6, 0xd3,
+	0xfd, 0x75, 0xcf, 0x4c, 0x4f, 0x7f, 0x3d, 0xbd, 0x03, 0xa5, 0xc0, 0xef, 0xb5, 0xfc, 0xc0, 0xe3,
+	0x1e, 0x21, 0xdc, 0x66, 0xe7, 0x16, 0xeb, 0xf5, 0xa9, 0x33, 0x1e, 0xd0, 0xa0, 0x15, 0xf8, 0xbd,
+	0xe6, 0xbd, 0x53, 0xcf, 0x3b, 0x1d, 0xd0, 0x0d, 0x44, 0x74, 0xc7, 0x27, 0x1b, 0xdc, 0x1d, 0x52,
+	0xc6, 0xed, 0xa1, 0x2f, 0x8d, 0x8c, 0x5d, 0x80, 0xe3, 0xc0, 0x3d, 0x3d, 0xa5, 0xc1, 0xbe, 0xd7,
+	0x25, 0xb7, 0xa1, 0x78, 0xe6, 0x75, 0xad, 0x91, 0x3d, 0xa4, 0x8d, 0xd4, 0x5a, 0x6a, 0xbd, 0x64,
+	0x16, 0xce, 0xbc, 0xee, 0x81, 0x3d, 0xa4, 0xe4, 0x1e, 0x94, 0x7b, 0xde, 0x70, 0xe8, 0x72, 0xab,
+	0x6f, 0xb3, 0x7e, 0x23, 0x8d, 0x5a, 0x90, 0xa2, 0x5d, 0x9b, 0xf5, 0x8d, 0x5d, 0x20, 0x57, 0x9e,
+	0x98, 0x49, 0xff, 0x34, 0xa6, 0x8c, 0x93, 0x4d, 0xc8, 0x9e, 0x79, 0x5d, 0xd6, 0x48, 0xad, 0x65,
+	0xd6, 0xcb, 0x9b, 0x77, 0x5b, 0xb3, 0x6b, 0x6c, 0x5d, 0x59, 0x99, 0x88, 0x35, 0x5a, 0xb0, 0x32,
+	0xe1, 0x89, 0xf9, 0xde, 0x88, 0x51, 0xb2, 0x0a, 0x62, 0x31, 0x96, 0xeb, 0x48, 0x6f, 0x25, 0x33,
+	0x7f, 0xe6, 0x75, 0xf7, 0x1c, 0x66, 0xdc, 0x83, 0xca, 0x4b, 0xca, 0x85, 0xbd, 0x9a, 0xb4, 0x0a,
+	0x69, 0xd7, 0x51, 0x1b, 0x48, 0xbb, 0x8e, 0xf1, 0x35, 0x54, 0x43, 0x80, 0xf2, 0xf5, 0x05, 0x64,
+	0xce, 0xbc, 0x2e, 0x42, 0xca, 0x9b, 0xab, 0x71, 0xab, 0x12, 0x68, 0x81, 0x31, 0x0c, 0xa8, 0x6f,
+	0xdb, 0xa3, 0x1e, 0x1d, 0xcc, 0x99, 0xe0, 0x37, 0xb0, 0xac, 0x61, 0xae, 0x3f, 0xc7, 0x7f, 0x72,
+	0xb0, 0xdc, 0xa1, 0x76, 0xd0, 0xeb, 0xeb, 0xb1, 0xfb, 0x05, 0xdc, 0xe8, 0x8e, 0xdd, 0x81, 0xd3,
+	0x1d, 0xf7, 0xce, 0x29, 0xb7, 0xf0, 0xdb, 0x52, 0xf3, 0x66, 0x4c, 0xa2, 0xe9, 0xb6, 0xc4, 0xe7,
+	0x9e, 0x43, 0xbe, 0x82, 0x46, 0xdf, 0x66, 0x56, 0xac, 0x95, 0x38, 0xb1, 0xa2, 0x79, 0xb3, 0x6f,
+	0xb3, 0xad, 0x59, 0xc3, 0xdb, 0x50, 0x74, 0x99, 0x75, 0xe2, 0x05, 0x3d, 0xda, 0xc8, 0x20, 0xb0,
+	0xe0, 0xb2, 0x6f, 0xc5, 0x90, 0xac, 0xc1, 0x92, 0xf0, 0x19, 0xa9, 0xb3, 0xa8, 0x86, 0xbe, 0xcd,
+	0xf6, 0x14, 0xe2, 0x06, 0xe4, 0x5c, 0xc6, 0xc6, 0xb4, 0x91, 0xc3, 0x80, 0xc8, 0x01, 0xf9, 0x14,
+	0x4a, 0xd2, 0x4e, 0x68, 0xf2, 0x68, 0x54, 0x44, 0x23, 0xa1, 0x24, 0x90, 0xc5, 0x24, 0x2b, 0xa0,
+	0x05, 0x7e, 0x8b, 0x35, 0x08, 0x03, 0x94, 0x17, 0xe5, 0x1a, 0xfa, 0x36, 0xc3, 0xe4, 0x6b, 0x42,
+	0xd1, 0xb7, 0x79, 0xaf, 0xcf, 0x28, 0x6f, 0x94, 0xd0, 0x24, 0x1a, 0x93, 0xcf, 0xe4, 0xfa, 0x22,
+	0x3d, 0xa0, 0x69, 0xb9, 0x6f, 0xb3, 0xa3, 0x10, 0x42, 0x20, 0x1b, 0x50, 0xdf, 0x6b, 0x94, 0xe5,
+	0x6c, 0xe2, 0x3b, 0x9c, 0x0d, 0xe5, 0x4b, 0xd1, 0x6c, 0xa6, 0x50, 0x35, 0xa1, 0x18, 0xd0, 0x0b,
+	0x97, 0xb9, 0xde, 0xa8, 0x51, 0x91, 0xb3, 0x85, 0xe3, 0x70, 0xb6, 0x48, 0x5f, 0x8d, 0x66, 0x33,
+	0x43, 0xc8, 0x53, 0xc8, 0x33, 0x6e, 0xf3, 0x31, 0x6b, 0xd4, 0xd6, 0x52, 0xeb, 0xd5, 0xcd, 0x3b,
+	0x09, 0x47, 0xdf, 0x41, 0x90, 0xa9, 0xc0, 0xe4, 0x0e, 0x88, 0x98, 0x5a, 0xca, 0xb4, 0x8e, 0x7e,
+	0x45, 0x04, 0x25, 0x8c, 0x3c, 0x07, 0x10, 0xdc, 0x15, 0xfa, 0x80, 0x37, 0x96, 0x31, 0xa9, 0x9a,
+	0x2d, 0x49, 0xef, 0x56, 0x48, 0xef, 0xd6, 0x71, 0x48, 0x6f, 0xb3, 0x24, 0xd0, 0x1d, 0x01, 0x26,
+	0x9f, 0x43, 0x55, 0x78, 0xd6, 0xcc, 0x09, 0x7a, 0x17, 0x3b, 0x39, 0x8e, 0x50, 0x4f, 0xa1, 0x88,
+	0x08, 0x3a, 0x72, 0x1a, 0x2b, 0x0b, 0xdd, 0x17, 0x04, 0x76, 0x67, 0xe4, 0x84, 0xe9, 0x11, 0x99,
+	0xde, 0x88, 0xd2, 0xe3, 0x58, 0x22, 0x8c, 0x36, 0x10, 0x3d, 0xb7, 0x15, 0x3b, 0x1e, 0x4f, 0x14,
+	0x86, 0x44, 0x7a, 0xc8, 0x8a, 0xb0, 0x83, 0x04, 0x3e, 0xb6, 0xd9, 0x79, 0x02, 0x03, 0xc9, 0x7d,
+	0xa8, 0xb8, 0xa3, 0xde, 0x60, 0xec, 0xe0, 0x16, 0x39, 0x53, 0xe9, 0xbe, 0xa4, 0x84, 0x22, 0x88,
+	0xcc, 0xf8, 0x2d, 0xd4, 0x22, 0x37, 0x6a, 0x19, 0x4f, 0x20, 0x2b, 0x66, 0x56, 0x2c, 0x6d, 0xc4,
+	0xd6, 0x27, 0x81, 0x47, 0x94, 0xf1, 0xff, 0x6c, 0xb8, 0x17, 0x21, 0x8c, 0x88, 0xda, 0x80, 0x82,
+	0xcd, 0x39, 0x1d, 0xfa, 0x1c, 0xfd, 0xe4, 0xcc, 0x70, 0x28, 0xaa, 0xa6, 0x88, 0x4e, 0xa8, 0x4d,
+	0x47, 0xc1, 0x69, 0x2b, 0x40, 0xc4, 0x9d, 0x4c, 0x22, 0x77, 0xb2, 0x09, 0xdc, 0xc9, 0x25, 0x70,
+	0x27, 0x9f, 0xcc, 0x9d, 0xc2, 0x02, 0xee, 0x14, 0x93, 0xb9, 0x53, 0x4a, 0xe0, 0x0e, 0x24, 0x73,
+	0xa7, 0xbc, 0x80, 0x3b, 0x4b, 0xb3, 0xdc, 0x79, 0x16, 0x71, 0xa7, 0x82, 0xdc, 0xb9, 0x9b, 0x74,
+	0x20, 0x73, 0xc9, 0x53, 0x9d, 0x4f, 0x9e, 0xda, 0x87, 0x91, 0xa7, 0xbe, 0x80, 0x3c, 0xcb, 0xef,
+	0x4f, 0x1e, 0x32, 0x43, 0x9e, 0x1d, 0x58, 0x99, 0x48, 0x38, 0x95, 0xb6, 0x2d, 0xc8, 0x89, 0xc0,
+	0x84, 0xf4, 0x49, 0xce, 0x5b, 0x09, 0x33, 0x6e, 0xc3, 0xea, 0x4b, 0xca, 0x3b, 0xe7, 0xae, 0x8f,
+	0xd2, 0xf1, 0x80, 0x86, 0xc9, 0x6b, 0xfc, 0x2b, 0x05, 0x4b, 0xba, 0x42, 0x9c, 0xae, 0xed, 0x38,
+	0xd4, 0xb1, 0xba, 0x97, 0x61, 0x13, 0x80, 0xe3, 0xad, 0x4b, 0xf2, 0x04, 0x54, 0x93, 0xe1, 0xd3,
+	0x9e, 0xc8, 0x1a, 0x4e, 0x83, 0x91, 0xa0, 0x9a, 0xb8, 0x8d, 0xeb, 0x42, 0xd3, 0xf1, 0x69, 0xef,
+	0x48, 0xc9, 0x05, 0x2d, 0x64, 0x7f, 0xc0, 0x1a, 0x19, 0x84, 0x84, 0x43, 0xb2, 0x06, 0x65, 0x87,
+	0xb2, 0x5e, 0xe0, 0xfa, 0x5c, 0x24, 0x42, 0x16, 0x67, 0xd1, 0x45, 0x71, 0x49, 0x6e, 0x98, 0xd0,
+	0x98, 0xdd, 0x84, 0x0a, 0xc8, 0x33, 0xc8, 0x05, 0x42, 0xa0, 0x02, 0xb2, 0x16, 0x17, 0x10, 0xdd,
+	0xd2, 0x94, 0x70, 0xe3, 0x9f, 0x29, 0xb8, 0xd5, 0x76, 0x9c, 0x09, 0x95, 0x62, 0xf5, 0xc7, 0xdd,
+	0xec, 0xef, 0x61, 0x75, 0x66, 0x5d, 0x1f, 0xb8, 0xd7, 0xc7, 0x70, 0xfb, 0x05, 0x1d, 0x50, 0x4e,
+	0xe3, 0x76, 0x3b, 0xdd, 0xd2, 0x1c, 0x43, 0x33, 0x0e, 0xfc, 0x81, 0x4b, 0xf8, 0x5f, 0x0a, 0x4a,
+	0xa2, 0x4e, 0x08, 0x5e, 0x52, 0xf2, 0x1c, 0x72, 0x58, 0x7a, 0x54, 0xf5, 0xbd, 0x1f, 0xe7, 0x25,
+	0x42, 0xb7, 0xb0, 0x24, 0x99, 0xd2, 0x22, 0x2a, 0x4b, 0x69, 0xad, 0x2c, 0xe9, 0xb5, 0x27, 0x33,
+	0x59, 0x7b, 0x9a, 0x3e, 0xe4, 0xd0, 0xfe, 0xaa, 0xe0, 0xa6, 0xf4, 0x82, 0x7b, 0x07, 0x00, 0xfd,
+	0x5a, 0x9a, 0xd3, 0x12, 0x4a, 0xc2, 0xaa, 0x16, 0xd5, 0xc8, 0xcc, 0x54, 0x0d, 0xbd, 0x05, 0x79,
+	0x46, 0x83, 0x0b, 0x1a, 0xa8, 0x93, 0x55, 0x23, 0xe3, 0xcf, 0x50, 0x10, 0xbb, 0x7f, 0x45, 0x2f,
+	0xc9, 0xaf, 0x01, 0x84, 0x5f, 0x2c, 0x4f, 0x54, 0x6d, 0xf6, 0xce, 0xdc, 0xcd, 0x9a, 0xa5, 0x20,
+	0x8a, 0x52, 0x98, 0x1d, 0x69, 0xad, 0xde, 0x1b, 0x50, 0xc1, 0x6e, 0xcc, 0xb1, 0x64, 0x4b, 0xac,
+	0x56, 0x55, 0x96, 0xc2, 0x7d, 0xd1, 0x17, 0x1b, 0xff, 0xcd, 0x43, 0x56, 0xac, 0x60, 0xce, 0xf5,
+	0xa4, 0x25, 0x6d, 0x7a, 0x32, 0x69, 0x9f, 0x03, 0xf4, 0x02, 0x6a, 0x73, 0xea, 0x58, 0xb6, 0xdc,
+	0xf3, 0x82, 0x8a, 0xa9, 0xd0, 0x6d, 0x4e, 0x7e, 0x07, 0x55, 0xa7, 0x6b, 0x0d, 0x3d, 0xc7, 0x3d,
+	0x71, 0xa5, 0x79, 0x76, 0xa1, 0xf9, 0x92, 0xd3, 0x7d, 0xa3, 0x0c, 0xda, 0x9c, 0x7c, 0x0d, 0xe5,
+	0x13, 0x77, 0xe4, 0xb2, 0xbe, 0x34, 0xcf, 0x2d, 0x34, 0x87, 0x10, 0xde, 0x0e, 0x13, 0x39, 0x1f,
+	0x75, 0x06, 0x0f, 0xa1, 0xe6, 0x32, 0x6f, 0x80, 0x5b, 0xf1, 0xc6, 0xdc, 0x1f, 0x87, 0xd7, 0x60,
+	0x35, 0x14, 0x1f, 0xa2, 0x54, 0xc4, 0x19, 0x3b, 0x92, 0x22, 0x46, 0x02, 0xbf, 0xc5, 0x95, 0x35,
+	0xb4, 0x7f, 0x0c, 0xef, 0x6f, 0x86, 0xb7, 0x60, 0xce, 0x2c, 0x0f, 0xed, 0x1f, 0xd5, 0x05, 0xce,
+	0xc8, 0x03, 0xa8, 0xf9, 0x76, 0x40, 0x47, 0xdc, 0xc2, 0x03, 0x15, 0xbf, 0x27, 0x80, 0x1e, 0x2a,
+	0x52, 0x2c, 0x8e, 0x60, 0xcf, 0x61, 0x64, 0x17, 0xc0, 0x0f, 0x3c, 0x9f, 0x06, 0xdc, 0xa5, 0xac,
+	0x51, 0x46, 0xde, 0xac, 0x27, 0xd5, 0xed, 0xd6, 0x51, 0x04, 0xdd, 0x19, 0xf1, 0xe0, 0xd2, 0xd4,
+	0x6c, 0x45, 0x81, 0x0e, 0x28, 0x0f, 0x2e, 0x2d, 0xef, 0x04, 0xef, 0xd0, 0x92, 0x59, 0xc0, 0xf1,
+	0xe1, 0x89, 0x38, 0x36, 0xbc, 0xa4, 0x64, 0xe0, 0x2a, 0x8b, 0x8f, 0x4d, 0xa1, 0xdb, 0x5c, 0xbb,
+	0x7a, 0xab, 0xd7, 0xba, 0x7a, 0x1f, 0x40, 0x8d, 0xfd, 0x60, 0x07, 0x43, 0x77, 0x74, 0x6a, 0x75,
+	0x3d, 0x2e, 0x92, 0xb1, 0x86, 0x8b, 0xaa, 0x84, 0xe2, 0x2d, 0x8f, 0xef, 0x39, 0x64, 0x1d, 0xea,
+	0x11, 0x4e, 0x45, 0x0a, 0xaf, 0xd2, 0x92, 0x59, 0x0d, 0xe5, 0x32, 0x54, 0xe4, 0x19, 0x14, 0x11,
+	0x70, 0x4e, 0x2f, 0xd5, 0x65, 0xfa, 0x69, 0xd2, 0x5a, 0x5e, 0xd1, 0x4b, 0xb3, 0xc0, 0x15, 0xcd,
+	0xbe, 0x84, 0x9c, 0xec, 0xfd, 0x48, 0x32, 0xc3, 0xc2, 0x0d, 0x30, 0x53, 0x62, 0x9b, 0xdf, 0x40,
+	0x6d, 0x2a, 0xd6, 0xa4, 0x0e, 0x19, 0x31, 0xb5, 0x2c, 0x10, 0xe2, 0x53, 0x14, 0x8d, 0x0b, 0x7b,
+	0x30, 0x0e, 0x39, 0x28, 0x07, 0xbf, 0x4a, 0xff, 0x32, 0x65, 0xec, 0x43, 0x5d, 0xb8, 0x7c, 0x41,
+	0x7d, 0x3a, 0x72, 0xe8, 0xa8, 0x27, 0xce, 0x87, 0x68, 0x3d, 0x65, 0x49, 0x76, 0x8e, 0xc4, 0x80,
+	0x25, 0x47, 0xc3, 0x28, 0xba, 0x4d, 0xc8, 0x8c, 0x7f, 0xa7, 0xa0, 0x8c, 0xeb, 0x1b, 0x0f, 0x87,
+	0x76, 0x70, 0x39, 0xd3, 0xe3, 0x6a, 0x3c, 0x4e, 0x4f, 0xf2, 0x78, 0x3a, 0x4d, 0x33, 0xb3, 0x69,
+	0x7a, 0x75, 0xbc, 0xd9, 0x6b, 0x1d, 0x6f, 0xdc, 0xb1, 0xe5, 0xe2, 0x8e, 0xcd, 0xf8, 0x0e, 0x2a,
+	0x57, 0xab, 0x57, 0x71, 0xd0, 0x5e, 0x12, 0x64, 0xe1, 0x7a, 0x1a, 0x36, 0x2e, 0x69, 0x24, 0xc0,
+	0xbd, 0xc4, 0x55, 0xc8, 0x18, 0x84, 0xfd, 0xcb, 0x1b, 0xa8, 0x62, 0x98, 0xdd, 0x21, 0x1d, 0x89,
+	0x7a, 0xce, 0x44, 0x8b, 0x8c, 0xa6, 0xda, 0x0c, 0x98, 0x35, 0xd8, 0xf3, 0xde, 0x05, 0x70, 0x22,
+	0xa8, 0x8a, 0xb5, 0x26, 0x31, 0xfe, 0x91, 0x82, 0x52, 0x94, 0x09, 0x62, 0x8b, 0xdc, 0xe3, 0xf6,
+	0xc0, 0xf2, 0x2e, 0x68, 0xd0, 0xa7, 0xb6, 0x63, 0x31, 0xf4, 0x98, 0x36, 0xab, 0x28, 0x3f, 0x54,
+	0xe2, 0x0e, 0x69, 0xc1, 0x8a, 0xe3, 0xfd, 0x30, 0x1a, 0x78, 0xb6, 0xa3, 0x83, 0xd3, 0x08, 0x5e,
+	0x0e, 0x55, 0x57, 0xf8, 0x47, 0xb0, 0x3c, 0xf6, 0xa7, 0xd1, 0x19, 0x44, 0xd7, 0xa4, 0x22, 0xc2,
+	0x1a, 0x7f, 0xcd, 0x43, 0x66, 0xdf, 0xeb, 0xbe, 0xc7, 0x5f, 0xff, 0x26, 0xdc, 0xd4, 0x2d, 0x06,
+	0xd4, 0x66, 0x14, 0xc9, 0x93, 0x46, 0x93, 0x15, 0x4d, 0xf9, 0x5a, 0xe8, 0x04, 0x57, 0x3e, 0x6a,
+	0x7d, 0xdf, 0x9d, 0x22, 0x43, 0x0e, 0x73, 0xe1, 0xf3, 0xa4, 0x5c, 0xd0, 0xc9, 0x35, 0x49, 0x99,
+	0xe9, 0x9b, 0x22, 0xff, 0x1e, 0x37, 0x45, 0x21, 0xe2, 0x97, 0xfe, 0x08, 0x52, 0x9c, 0x7c, 0x04,
+	0x09, 0x53, 0xb9, 0xa4, 0xa5, 0xb2, 0x68, 0x0a, 0x02, 0xd7, 0x0b, 0x5c, 0x7e, 0x89, 0x7f, 0x41,
+	0x69, 0x33, 0x1a, 0x4f, 0xdd, 0xf8, 0xe5, 0x6b, 0xde, 0xf8, 0xdf, 0xc0, 0x52, 0x20, 0xdb, 0x32,
+	0xb9, 0xad, 0xa5, 0x85, 0xdb, 0x2a, 0x47, 0xf8, 0x36, 0xd7, 0x1e, 0x20, 0x2a, 0xd7, 0x79, 0x80,
+	0xf8, 0x2a, 0xa4, 0x66, 0x15, 0x8f, 0xe3, 0xb3, 0xf9, 0xd4, 0x14, 0x67, 0x21, 0xf1, 0xe4, 0x15,
+	0xd4, 0x10, 0xaa, 0x51, 0xae, 0x86, 0x2e, 0x8c, 0xc4, 0x13, 0x8d, 0x90, 0x66, 0x95, 0x4f, 0x8c,
+	0x1f, 0xfd, 0x3d, 0x05, 0x70, 0x55, 0x86, 0xc8, 0x2a, 0xac, 0x1c, 0xb7, 0x3b, 0xaf, 0xac, 0xce,
+	0x71, 0xfb, 0xf8, 0x6d, 0xc7, 0x3a, 0xda, 0x39, 0x78, 0xb1, 0x77, 0xf0, 0xb2, 0xfe, 0xc9, 0xb4,
+	0xc2, 0x7c, 0x7b, 0x70, 0x20, 0x14, 0xa9, 0x69, 0x45, 0xe7, 0xed, 0xf6, 0xf6, 0x4e, 0xa7, 0x53,
+	0x4f, 0x4f, 0x2b, 0xbe, 0x6d, 0xef, 0xbd, 0x7e, 0x6b, 0xee, 0xd4, 0x33, 0xe4, 0x16, 0x10, 0x5d,
+	0xf1, 0x66, 0xaf, 0xb3, 0xdb, 0x3e, 0xaa, 0x67, 0x1f, 0xfd, 0x2d, 0x05, 0xa5, 0x28, 0x4c, 0xa4,
+	0x09, 0xb7, 0xf6, 0x0f, 0xb7, 0x42, 0xd0, 0xde, 0x81, 0x75, 0x64, 0x1e, 0xbe, 0x34, 0x85, 0xeb,
+	0x4f, 0x84, 0x07, 0x4d, 0x17, 0x4e, 0x99, 0x9a, 0x92, 0x87, 0x33, 0xa6, 0xc9, 0x4d, 0x58, 0xd6,
+	0xe4, 0x6a, 0xc2, 0x8c, 0x58, 0xa1, 0x26, 0xde, 0x6e, 0x1f, 0x6c, 0xef, 0xbc, 0xde, 0x79, 0x51,
+	0xcf, 0x6e, 0xfe, 0xa5, 0x00, 0x37, 0x30, 0x28, 0x61, 0x24, 0x3b, 0x34, 0xb8, 0x70, 0x7b, 0x94,
+	0x7c, 0x0f, 0x65, 0xed, 0xa9, 0x94, 0x3c, 0x98, 0xff, 0xbe, 0x1a, 0xfe, 0xf3, 0x35, 0x1f, 0x2e,
+	0xc4, 0xa9, 0x3e, 0xff, 0x10, 0xf2, 0xf2, 0xe5, 0x94, 0xc4, 0xa6, 0xc3, 0xc4, 0xb3, 0x6b, 0xd3,
+	0x98, 0x07, 0x51, 0x0e, 0xff, 0x00, 0xa5, 0xe8, 0xa5, 0x94, 0xc4, 0x32, 0x7e, 0xfa, 0xb1, 0xb5,
+	0xf9, 0xb3, 0x05, 0x28, 0xe5, 0xf9, 0x8f, 0x00, 0x57, 0xcf, 0x4c, 0x24, 0xd6, 0x68, 0xe6, 0x89,
+	0xb5, 0xf9, 0x60, 0x11, 0x4c, 0x39, 0x37, 0xa1, 0xa0, 0x5e, 0x8e, 0x48, 0xd2, 0x2e, 0xb5, 0xd7,
+	0xa9, 0xe6, 0xfd, 0xb9, 0x18, 0xe5, 0xf3, 0x7b, 0x28, 0x6b, 0xbf, 0xf6, 0x64, 0xce, 0x52, 0xf4,
+	0xc7, 0xa6, 0xf8, 0xb3, 0x8b, 0x7b, 0x23, 0x18, 0x42, 0x7d, 0xfa, 0x77, 0x99, 0x3c, 0x4e, 0x58,
+	0x58, 0xdc, 0xcb, 0x40, 0xf3, 0xc9, 0xbb, 0x81, 0xd5, 0x74, 0x67, 0x50, 0x9b, 0xfa, 0x61, 0x25,
+	0x8f, 0xe2, 0x1c, 0xc4, 0xff, 0x6d, 0x37, 0x1f, 0xbf, 0x13, 0x56, 0xcd, 0xc5, 0x80, 0xcc, 0xfe,
+	0x9c, 0x92, 0x9f, 0xc7, 0xb9, 0x48, 0xfc, 0xe3, 0x6d, 0xb6, 0xde, 0x15, 0x2e, 0x27, 0xdd, 0xfa,
+	0xe2, 0xbb, 0x87, 0xa7, 0x5e, 0x8b, 0x9d, 0xbb, 0x76, 0xcb, 0x0b, 0x4e, 0x37, 0xdc, 0xd1, 0x49,
+	0x60, 0x6f, 0x4c, 0xba, 0xd8, 0x38, 0xf5, 0x36, 0x02, 0xbf, 0xd7, 0xcd, 0x63, 0x89, 0xfe, 0xf2,
+	0xa7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x84, 0x7f, 0x83, 0x98, 0x9e, 0x19, 0x00, 0x00,
 }
diff --git a/task_scheduler/modules/colors.css b/task_scheduler/modules/colors.css
index cb16eb7..0be8952 100644
--- a/task_scheduler/modules/colors.css
+++ b/task_scheduler/modules/colors.css
@@ -12,6 +12,12 @@
   --primary-variant: rgb(204, 204, 255);
   --on-primary-variant: var(--black);
   --link-color: hsl(199, 70%, 40%);
+
+  --color-canceled: rgb(117, 112, 179);
+  --color-failure: rgb(217, 95, 2);
+  --color-in-progress: rgb(248, 230, 180);
+  --color-mishap: rgb(117, 112, 179);
+  --color-success: rgb(209, 228, 188);
 }
 .darkmode {
   --grey-850: #303030;
@@ -27,7 +33,8 @@
   --link-color: hsl(199, 70%, 40%);
 }
 
-a,a.visited {
+a,
+a.visited {
   color: var(--link-color);
 }
 
@@ -38,4 +45,42 @@
 
 :disabled {
   opacity: var(--text-intensity-medium);
-}
\ No newline at end of file
+}
+
+/* Background and foreground colors. */
+.bg-canceled {
+  background-color: var(--color-canceled);
+}
+.bg-failure {
+  background-color: var(--color-failure);
+}
+.bg-in-progress {
+  background-color: var(--color-in-progress);
+}
+.bg-mishap {
+  background-color: var(--color-mishap);
+}
+.bg-success {
+  background-color: var(--color-success);
+}
+
+.fg-canceled {
+  color: var(--color-canceled);
+  fill: var(--color-canceled);
+}
+.fg-failure {
+  color: var(--color-failure);
+  fill: var(--color-failure);
+}
+.fg-in-progress {
+  color: var(--color-in-progress);
+  fill: var(--color-in-progress);
+}
+.fg-mishap {
+  color: var(--color-mishap);
+  fill: var(--color-mishap);
+}
+.fg-success {
+  color: var(--color-success);
+  fill: var(--color-success);
+}
diff --git a/task_scheduler/modules/job-search-sk/index.ts b/task_scheduler/modules/job-search-sk/index.ts
new file mode 100644
index 0000000..17b4a60
--- /dev/null
+++ b/task_scheduler/modules/job-search-sk/index.ts
@@ -0,0 +1,2 @@
+import './job-search-sk';
+import './job-search-sk.scss';
diff --git a/task_scheduler/modules/job-search-sk/job-search-sk-demo.html b/task_scheduler/modules/job-search-sk/job-search-sk-demo.html
new file mode 100644
index 0000000..3e64ddb
--- /dev/null
+++ b/task_scheduler/modules/job-search-sk/job-search-sk-demo.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>job-search-sk</title>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  </head>
+  <body>
+    <h1>job-search-sk</h1>
+    <job-search-sk></job-search-sk>
+  </body>
+</html>
diff --git a/task_scheduler/modules/job-search-sk/job-search-sk-demo.ts b/task_scheduler/modules/job-search-sk/job-search-sk-demo.ts
new file mode 100644
index 0000000..0d6d5dc
--- /dev/null
+++ b/task_scheduler/modules/job-search-sk/job-search-sk-demo.ts
@@ -0,0 +1,7 @@
+import './index';
+
+import { FakeTaskSchedulerService } from '../rpc-mock';
+import { JobSearchSk } from './job-search-sk';
+
+const ele = <JobSearchSk>document.querySelector('job-search-sk')!;
+ele.rpc = new FakeTaskSchedulerService();
diff --git a/task_scheduler/modules/job-search-sk/job-search-sk.scss b/task_scheduler/modules/job-search-sk/job-search-sk.scss
new file mode 100644
index 0000000..0ee8ff7
--- /dev/null
+++ b/task_scheduler/modules/job-search-sk/job-search-sk.scss
@@ -0,0 +1,39 @@
+@import '../colors';
+
+job-search-sk {
+  th {
+    opacity: inherit;
+  }
+
+  tr.searchTerms {
+    background: inherit;
+    border: 0px;
+  }
+
+  button {
+    cursor: pointer;
+    width: -webkit-fill-available;
+  }
+
+  button.cancel {
+    background-color: var(--color-canceled);
+  }
+
+  button.delete {
+    margin: 0px;
+    padding: 0px;
+    border: 0px;
+  }
+
+  button.search {
+    background-color: var(--secondary);
+    margin: 0px;
+  }
+
+  div.container {
+    background-color: var(--surface);
+    border: 1px solid #eeeeee;
+    margin: 5px;
+    padding: 10px;
+  }
+}
diff --git a/task_scheduler/modules/job-search-sk/job-search-sk.ts b/task_scheduler/modules/job-search-sk/job-search-sk.ts
new file mode 100644
index 0000000..104ba3a
--- /dev/null
+++ b/task_scheduler/modules/job-search-sk/job-search-sk.ts
@@ -0,0 +1,343 @@
+/**
+ * @module modules/job-search-sk
+ * @description <h2><code>job-search-sk</code></h2>
+ *
+ * Provides UI for searching the jobs in the DB.
+ */
+import { define } from 'elements-sk/define';
+import { html } from 'lit-html';
+import { ElementSk } from '../../../infra-sk/modules/ElementSk';
+import { ParamSet, toParamSet, fromParamSet } from 'common-sk/modules/query';
+import {
+  TaskSchedulerService,
+  SearchJobsResponse,
+  SearchJobsRequest,
+  Job,
+  JobStatus,
+} from '../rpc';
+import 'elements-sk/icon/delete-icon-sk';
+import 'elements-sk/styles/buttons';
+import 'elements-sk/styles/table';
+import { $$ } from 'common-sk/modules/dom';
+
+// Names and types of search terms.
+interface DisplaySearchTerm {
+  label: string;
+  type: string;
+}
+
+// TODO(borenet): Find a way not to duplicate the contents of SearchJobRequest.
+const searchTerms: { [key: string]: DisplaySearchTerm } = {
+  name: { label: 'Name', type: 'text' },
+  repo: { label: 'Repo', type: 'text' },
+  revision: { label: 'Revision', type: 'text' },
+  issue: { label: 'Issue', type: 'text' },
+  patchset: { label: 'Patchset', type: 'text' },
+  buildbucketBuildId: { label: 'Buildbucket Build ID', type: 'text' },
+  isForce: { label: 'Manually Triggered', type: 'checkbox' },
+  status: { label: 'Status', type: 'text' },
+  timeStart: { label: 'Start Time', type: 'datetime-local' },
+  timeEnd: { label: 'End Time', type: 'datetime-local' },
+};
+
+// Display parameters for job results.
+interface DisplayJobResult {
+  label: string;
+  class: string;
+}
+
+const jobStatusToLabelAndClass: { [key: string]: DisplayJobResult } = {
+  [JobStatus.JOB_STATUS_IN_PROGRESS]: {
+    label: 'in progress',
+    class: 'bg-in-progress',
+  },
+  [JobStatus.JOB_STATUS_SUCCESS]: {
+    label: 'succeeded',
+    class: 'bg-success',
+  },
+  [JobStatus.JOB_STATUS_FAILURE]: {
+    label: 'failed',
+    class: 'bg-failure',
+  },
+  [JobStatus.JOB_STATUS_MISHAP]: {
+    label: 'mishap',
+    class: 'bg-mishap',
+  },
+  [JobStatus.JOB_STATUS_CANCELED]: {
+    label: 'canceled',
+    class: 'bg-canceled',
+  },
+};
+
+interface SearchTerm {
+  key: string;
+  value: string;
+}
+
+export class JobSearchSk extends ElementSk {
+  private static template = (ele: JobSearchSk) => html`
+    <div class="container">
+      <table class="searchTerms">
+        ${Array.from(ele.searchTerms.values()).map(
+          (term: SearchTerm) => html`
+        <tr class="searchTerms">
+          <th>
+            <label for="${term.key}">
+              ${searchTerms[term.key]!.label}
+            </label>
+          </th>
+          <td>
+            <input
+                .id="${term.key}"
+                .type="${searchTerms[term.key]!.type}"
+                .value="${term.value}"
+                ?checked="${
+                  searchTerms[term.key]!.type == 'checkbox' &&
+                  term.value == 'true'
+                }"
+                @change="${(ev: Event) => {
+                  const input = (<HTMLInputElement>ev.target)!;
+                  if (searchTerms[term.key]!.type == 'checkbox') {
+                    term.value = input.checked ? 'true' : 'false';
+                  } else {
+                    term.value = input.value;
+                  }
+                  ele.updateQuery();
+                }}"
+                >
+            </input>
+          </td>
+          <td>
+            <button class="delete" @click="${() => {
+              ele.searchTerms.delete(term.key);
+              ele._render();
+              ele.updateQuery();
+            }}">
+              <delete-icon-sk></delete-icon-sk>
+            </button>
+        </tr>
+      `
+        )}
+        <tr class="searchTerms">
+          <td>
+            <select
+              @change="${(ev: Event) => {
+                const select = <HTMLSelectElement>ev.target!;
+                const selected = select.value;
+                ele.searchTerms.set(selected, {
+                  key: select.value,
+                  value: '',
+                });
+                select.selectedIndex = 0;
+                ele._render();
+                ele.updateQuery();
+                // Auto-focus the new input field.
+                const inp = $$<HTMLInputElement>('#' + selected, ele)!;
+                console.log(inp);
+                inp?.focus();
+              }}"
+            >
+              <option disabled selected>Add Search Term</option>
+              ${Object.entries(searchTerms)
+                .filter(([key, _]) => !ele.searchTerms.get(key))
+                .map(
+                  ([key, term]) => html`
+                    <option .value="${key}">${term.label}</option>
+                  `
+                )}
+            </select>
+          </td>
+          <td></td>
+          <td>
+            <button class="search" @click="${ele.search}">Search</button>
+          </td>
+        </tr>
+      </table>
+    </div>
+    ${ele.results && ele.results.length > 0
+      ? html`
+          <div class="container">
+            <table>
+              <tr>
+                <th>ID</th>
+                <th>Name</th>
+                <th>Repo</th>
+                <th>Revision</th>
+                <th>Codereview Link</th>
+                <th>Status</th>
+                <th>Manually Triggered</th>
+                <th>Created At</th>
+                <th>
+                  <button class="cancel" @click="${ele.cancelAll}">
+                    <delete-icon-sk></delete-icon-sk>
+                    Cancel All
+                  </button>
+                </th>
+              </tr>
+
+              ${ele.results.map(
+                (job: Job) => html`
+                  <tr>
+                    <td>
+                      <a href="/job/${job.id}" target="_blank">${job.id}</a>
+                    </td>
+                    <td>${job.name}</td>
+                    <td>
+                      <a href="${job.repoState?.repo}" target="_blank">
+                        ${job.repoState?.repo}
+                      </a>
+                    </td>
+                    <td>
+                      <a
+                        href="${job.repoState!.repo}/+show/${job.repoState!
+                          .revision}"
+                        target="_blank"
+                      >
+                        ${job.repoState!.revision.substring(0, 12)}
+                      </a>
+                    </td>
+                    <td>
+                      ${job.repoState?.patch?.issue &&
+                      job.repoState?.patch?.patchset &&
+                      job.repoState?.patch?.server
+                        ? html`
+                            <a
+                              href="${job.repoState?.patch?.server}/c/${job
+                                .repoState?.patch?.issue}/${job.repoState?.patch
+                                ?.patchset}"
+                              target="_blank"
+                              >${job.repoState?.patch?.server}/c/${job.repoState
+                                ?.patch?.issue}/${job.repoState?.patch
+                                ?.patchset}
+                            </a>
+                          `
+                        : html``}
+                    </td>
+                    <td class="${jobStatusToLabelAndClass[job.status]!.class}">
+                      ${jobStatusToLabelAndClass[job.status]!.label}
+                    </td>
+                    <td>${job.isForce ? 'true' : 'false'}</td>
+                    <td>${job.createdAt}</td>
+                    <td>
+                      ${job.status === JobStatus.JOB_STATUS_IN_PROGRESS
+                        ? html`
+                            <button
+                              class="cancel"
+                              @click="${() => ele.cancel(job)}"
+                            >
+                              <delete-icon-sk></delete-icon-sk>
+                              Cancel
+                            </button>
+                          `
+                        : html``}
+                    </td>
+                  </tr>
+                `
+              )}
+            </table>
+          </div>
+        `
+      : html``}
+  `;
+
+  private results: Job[] = [];
+  private _rpc: TaskSchedulerService | null = null;
+  private searchTerms: Map<string, SearchTerm> = new Map();
+
+  constructor() {
+    super(JobSearchSk.template);
+  }
+
+  get rpc(): TaskSchedulerService | null {
+    return this._rpc;
+  }
+
+  set rpc(rpc: TaskSchedulerService | null) {
+    this._rpc = rpc;
+    if (this.searchTerms.size > 0) {
+      this.search();
+    }
+  }
+
+  connectedCallback() {
+    super.connectedCallback();
+    if (window.location.search) {
+      const params = toParamSet(window.location.search.substring(1));
+      Object.entries(params).forEach((entry: [string, string[]]) => {
+        const key = entry[0];
+        const value = entry[1][0]; // Just take the first one.
+        this.searchTerms.set(key, {
+          key: key,
+          value: value,
+        });
+      });
+      if (this.rpc) {
+        this.search();
+      }
+    }
+    this._render();
+  }
+
+  private updateQuery() {
+    const params: ParamSet = {};
+    this.searchTerms.forEach((term: SearchTerm) => {
+      params[term.key] = [term.value];
+    });
+    const newUrl =
+      window.location.href.split('?')[0] + '?' + fromParamSet(params);
+    window.history.replaceState('', '', newUrl);
+  }
+
+  private search() {
+    const req: SearchJobsRequest = {
+      buildbucketBuildId: parseInt(
+        this.searchTerms.get('buildbucketBuildId')?.value || '0'
+      ),
+      hasBuildbucketBuildId: !!this.searchTerms.get('buildbucketBuildId'),
+      isForce: this.searchTerms.get('isForce')?.value === 'true',
+      hasIsForce: !!this.searchTerms.get('isForce'),
+      issue: this.searchTerms.get('issue')?.value || '',
+      hasIssue: !!this.searchTerms.get('issue'),
+      name: this.searchTerms.get('name')?.value || '',
+      hasName: !!this.searchTerms.get('name'),
+      patchset: this.searchTerms.get('patchset')?.value || '',
+      hasPatchset: !!this.searchTerms.get('patchset'),
+      repo: this.searchTerms.get('repo')?.value || '',
+      hasRepo: !!this.searchTerms.get('repo'),
+      revision: this.searchTerms.get('revision')?.value || '',
+      hasRevision: !!this.searchTerms.get('revision'),
+      status: (this.searchTerms.get('status')?.value || '') as JobStatus,
+      hasStatus: !!this.searchTerms.get('status'),
+      timeEnd: this.searchTerms.get('timeEnd')?.value || '',
+      hasTimeEnd: !!this.searchTerms.get('timeEnd'),
+      timeStart: this.searchTerms.get('timeStart')?.value || '',
+      hasTimeStart: !!this.searchTerms.get('timeStart'),
+    };
+    this.rpc!.searchJobs(req as SearchJobsRequest).then(
+      (resp: SearchJobsResponse) => {
+        this.results = resp.jobs!;
+        this._render();
+      }
+    );
+  }
+
+  private cancel(job: Job) {
+    this.rpc!.cancelJob({ id: job.id }).then(() => {
+      const result = this.results.find((result: Job) => result.id == job.id);
+      if (result) {
+        result.status = JobStatus.JOB_STATUS_CANCELED;
+        this._render();
+      }
+    });
+  }
+
+  private cancelAll() {
+    this.results.forEach((job: Job) => {
+      if (job.status == JobStatus.JOB_STATUS_IN_PROGRESS) {
+        this.cancel(job);
+      }
+    });
+  }
+}
+
+define('job-search-sk', JobSearchSk);
diff --git a/task_scheduler/modules/job-search-sk/job-search-sk_puppeteer_test.ts b/task_scheduler/modules/job-search-sk/job-search-sk_puppeteer_test.ts
new file mode 100644
index 0000000..4a0919f
--- /dev/null
+++ b/task_scheduler/modules/job-search-sk/job-search-sk_puppeteer_test.ts
@@ -0,0 +1,101 @@
+import * as path from 'path';
+import { expect } from 'chai';
+import {
+  setUpPuppeteerAndDemoPageServer,
+  takeScreenshot,
+} from '../../../puppeteer-tests/util';
+
+describe('job-search-sk', () => {
+  const testBed = setUpPuppeteerAndDemoPageServer(
+    path.join(__dirname, '..', '..', 'webpack.config.ts')
+  );
+
+  beforeEach(async () => {
+    await testBed.page.goto(`${testBed.baseUrl}/dist/job-search-sk.html`);
+    await testBed.page.setViewport({ width: 2200, height: 500 });
+  });
+
+  it('should render the demo page (smoke test)', async () => {
+    expect(await testBed.page.$$('job-search-sk')).to.have.length(1);
+  });
+
+  describe('screenshots', () => {
+    it('select search terms and search', async () => {
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-searching-initial'
+      );
+      await testBed.page.click('select');
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-searching-selecting'
+      );
+      await testBed.page.select('select', 'name');
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-searching-selected'
+      );
+      await testBed.page.type('#name', 'ABCDEF');
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-searching-type'
+      );
+      await testBed.page.click('button.search');
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-searching-results'
+      );
+    });
+
+    it('deletes search terms', async () => {
+      await testBed.page.select('select', 'name');
+      await testBed.page.type('#name', 'ABCDEF');
+      await testBed.page.select('select', 'revision');
+      await testBed.page.type(
+        '#revision',
+        '9883def4f8661f8eec4ccbae2e34d7fcb14bf65d'
+      );
+      await testBed.page.click('button.delete');
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-deleted-search-term'
+      );
+    });
+
+    it('cancels a job', async () => {
+      await testBed.page.click('button.search');
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-cancel-before'
+      );
+      await testBed.page.click('td > button.cancel');
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-cancel-after'
+      );
+    });
+
+    it('cancels all jobs', async () => {
+      await testBed.page.click('button.search');
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-cancel-all-before'
+      );
+      await testBed.page.click('th > button.cancel');
+      await takeScreenshot(
+        testBed.page,
+        'task-scheduler',
+        'job-search-sk-cancel-all-after'
+      );
+    });
+  });
+});
diff --git a/task_scheduler/modules/rpc-mock/index.ts b/task_scheduler/modules/rpc-mock/index.ts
index 898899e..d6ebad5 100644
--- a/task_scheduler/modules/rpc-mock/index.ts
+++ b/task_scheduler/modules/rpc-mock/index.ts
@@ -64,11 +64,47 @@
       job: job,
     });
   }
-  searchJobs(
-    searchJobsRequest: SearchJobsRequest
-  ): Promise<SearchJobsResponse> {
-    return new Promise((_, reject) => {
-      reject('not implemented');
+  searchJobs(req: SearchJobsRequest): Promise<SearchJobsResponse> {
+    console.log(req);
+    const results: Job[] = Object.values(this.jobs).filter((job: Job) => {
+      if (req.hasRepo && job.repoState?.repo != req.repo) {
+        return false;
+      } else if (req.hasRevision && job.repoState?.revision != req.revision) {
+        return false;
+      } else if (req.hasIssue && req.issue != job.repoState!.patch!.issue) {
+        return false;
+      } else if (
+        req.hasPatchset &&
+        req.patchset != job.repoState?.patch?.patchset
+      ) {
+        return false;
+      } else if (req.hasName && job.name != req.name) {
+        return false;
+      } else if (
+        req.hasBuildbucketBuildId &&
+        job.buildbucketBuildId != req.buildbucketBuildId
+      ) {
+        return false;
+      } else if (req.hasStatus && job.status != req.status) {
+        return false;
+      } else if (
+        req.hasTimeStart &&
+        new Date(job.createdAt!).getTime() <= new Date(req.timeStart!).getTime()
+      ) {
+        return false;
+      } else if (
+        req.hasTimeEnd &&
+        new Date(job.createdAt!).getTime() > new Date(req.timeEnd!).getTime()
+      ) {
+        return false;
+      } else if (req.hasIsForce && job.isForce != req.isForce) {
+        return false;
+      }
+      return true;
+    });
+    console.log(results);
+    return Promise.resolve({
+      jobs: results,
     });
   }
   getTask(getTaskRequest: GetTaskRequest): Promise<GetTaskResponse> {
diff --git a/task_scheduler/modules/rpc/rpc.ts b/task_scheduler/modules/rpc/rpc.ts
index 915578d..77912a1 100644
--- a/task_scheduler/modules/rpc/rpc.ts
+++ b/task_scheduler/modules/rpc/rpc.ts
@@ -118,34 +118,73 @@
 };
 
 export interface SearchJobsRequest {
-  repoState?: RepoState;
   buildbucketBuildId: number;
+  hasBuildbucketBuildId: boolean;
   isForce: boolean;
+  hasIsForce: boolean;
+  issue: string;
+  hasIssue: boolean;
   name: string;
+  hasName: boolean;
+  patchset: string;
+  hasPatchset: boolean;
+  repo: string;
+  hasRepo: boolean;
+  revision: string;
+  hasRevision: boolean;
   status: JobStatus;
+  hasStatus: boolean;
   timeStart?: string;
+  hasTimeStart: boolean;
   timeEnd?: string;
+  hasTimeEnd: boolean;
 }
 
 interface SearchJobsRequestJSON {
-  repo_state?: RepoStateJSON;
   buildbucket_build_id?: number;
+  has_buildbucket_build_id?: boolean;
   is_force?: boolean;
+  has_is_force?: boolean;
+  issue?: string;
+  has_issue?: boolean;
   name?: string;
+  has_name?: boolean;
+  patchset?: string;
+  has_patchset?: boolean;
+  repo?: string;
+  has_repo?: boolean;
+  revision?: string;
+  has_revision?: boolean;
   status?: string;
+  has_status?: boolean;
   time_start?: string;
+  has_time_start?: boolean;
   time_end?: string;
+  has_time_end?: boolean;
 }
 
 const SearchJobsRequestToJSON = (m: SearchJobsRequest): SearchJobsRequestJSON => {
   return {
-    repo_state: m.repoState && RepoStateToJSON(m.repoState),
     buildbucket_build_id: m.buildbucketBuildId,
+    has_buildbucket_build_id: m.hasBuildbucketBuildId,
     is_force: m.isForce,
+    has_is_force: m.hasIsForce,
+    issue: m.issue,
+    has_issue: m.hasIssue,
     name: m.name,
+    has_name: m.hasName,
+    patchset: m.patchset,
+    has_patchset: m.hasPatchset,
+    repo: m.repo,
+    has_repo: m.hasRepo,
+    revision: m.revision,
+    has_revision: m.hasRevision,
     status: m.status,
+    has_status: m.hasStatus,
     time_start: m.timeStart,
+    has_time_start: m.hasTimeStart,
     time_end: m.timeEnd,
+    has_time_end: m.hasTimeEnd,
   };
 };
 
@@ -195,28 +234,67 @@
 };
 
 export interface SearchTasksRequest {
-  taskKey?: TaskKey;
   attempt: number;
+  hasAttempt: boolean;
+  issue: string;
+  hasIssue: boolean;
+  name: string;
+  hasName: boolean;
+  patchset: string;
+  hasPatchset: boolean;
+  repo: string;
+  hasRepo: boolean;
+  revision: string;
+  hasRevision: boolean;
   status: TaskStatus;
+  hasStatus: boolean;
   timeStart?: string;
+  hasTimeStart: boolean;
   timeEnd?: string;
+  hasTimeEnd: boolean;
 }
 
 interface SearchTasksRequestJSON {
-  task_key?: TaskKeyJSON;
   attempt?: number;
+  has_attempt?: boolean;
+  issue?: string;
+  has_issue?: boolean;
+  name?: string;
+  has_name?: boolean;
+  patchset?: string;
+  has_patchset?: boolean;
+  repo?: string;
+  has_repo?: boolean;
+  revision?: string;
+  has_revision?: boolean;
   status?: string;
+  has_status?: boolean;
   time_start?: string;
+  has_time_start?: boolean;
   time_end?: string;
+  has_time_end?: boolean;
 }
 
 const SearchTasksRequestToJSON = (m: SearchTasksRequest): SearchTasksRequestJSON => {
   return {
-    task_key: m.taskKey && TaskKeyToJSON(m.taskKey),
     attempt: m.attempt,
+    has_attempt: m.hasAttempt,
+    issue: m.issue,
+    has_issue: m.hasIssue,
+    name: m.name,
+    has_name: m.hasName,
+    patchset: m.patchset,
+    has_patchset: m.hasPatchset,
+    repo: m.repo,
+    has_repo: m.hasRepo,
+    revision: m.revision,
+    has_revision: m.hasRevision,
     status: m.status,
+    has_status: m.hasStatus,
     time_start: m.timeStart,
+    has_time_start: m.hasTimeStart,
     time_end: m.timeEnd,
+    has_time_end: m.hasTimeEnd,
   };
 };
 
@@ -364,15 +442,6 @@
   server?: string;
 }
 
-const RepoState_PatchToJSON = (m: RepoState_Patch): RepoState_PatchJSON => {
-  return {
-    issue: m.issue,
-    patch_repo: m.patchRepo,
-    patchset: m.patchset,
-    server: m.server,
-  };
-};
-
 const JSONToRepoState_Patch = (m: RepoState_PatchJSON): RepoState_Patch => {
   return {
     issue: m.issue || "",
@@ -394,14 +463,6 @@
   revision?: string;
 }
 
-const RepoStateToJSON = (m: RepoState): RepoStateJSON => {
-  return {
-    patch: m.patch && RepoState_PatchToJSON(m.patch),
-    repo: m.repo,
-    revision: m.revision,
-  };
-};
-
 const JSONToRepoState = (m: RepoStateJSON): RepoState => {
   return {
     patch: m.patch && JSONToRepoState_Patch(m.patch),
@@ -422,14 +483,6 @@
   forced_job_id?: string;
 }
 
-const TaskKeyToJSON = (m: TaskKey): TaskKeyJSON => {
-  return {
-    repo_state: m.repoState && RepoStateToJSON(m.repoState),
-    name: m.name,
-    forced_job_id: m.forcedJobId,
-  };
-};
-
 const JSONToTaskKey = (m: TaskKeyJSON): TaskKey => {
   return {
     repoState: m.repo_state && JSONToRepoState(m.repo_state),