// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: test_platform/steps/compute_backfill.proto

package steps

import (
	test_platform "go.chromium.org/chromiumos/infra/proto/go/test_platform"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type ComputeBackfillRequests struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Each ComputeBackfillRequest is handled independently.
	Requests       []*ComputeBackfillRequest          `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"`
	TaggedRequests map[string]*ComputeBackfillRequest `protobuf:"bytes,2,rep,name=tagged_requests,json=taggedRequests,proto3" json:"tagged_requests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

func (x *ComputeBackfillRequests) Reset() {
	*x = ComputeBackfillRequests{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_compute_backfill_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ComputeBackfillRequests) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ComputeBackfillRequests) ProtoMessage() {}

func (x *ComputeBackfillRequests) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_compute_backfill_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ComputeBackfillRequests.ProtoReflect.Descriptor instead.
func (*ComputeBackfillRequests) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_compute_backfill_proto_rawDescGZIP(), []int{0}
}

func (x *ComputeBackfillRequests) GetRequests() []*ComputeBackfillRequest {
	if x != nil {
		return x.Requests
	}
	return nil
}

func (x *ComputeBackfillRequests) GetTaggedRequests() map[string]*ComputeBackfillRequest {
	if x != nil {
		return x.TaggedRequests
	}
	return nil
}

type ComputeBackfillResponses struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Each ComputeBackfillResponse corresponds to a single
	// ComputeBackfillRequest handled independently.
	Responses []*ComputeBackfillResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	// tagged_responses only contains responses for requests that need to be
	// backfilled. Successfully completed requests are not included.
	TaggedResponses map[string]*ComputeBackfillResponse `protobuf:"bytes,2,rep,name=tagged_responses,json=taggedResponses,proto3" json:"tagged_responses,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

func (x *ComputeBackfillResponses) Reset() {
	*x = ComputeBackfillResponses{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_compute_backfill_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ComputeBackfillResponses) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ComputeBackfillResponses) ProtoMessage() {}

func (x *ComputeBackfillResponses) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_compute_backfill_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ComputeBackfillResponses.ProtoReflect.Descriptor instead.
func (*ComputeBackfillResponses) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_compute_backfill_proto_rawDescGZIP(), []int{1}
}

func (x *ComputeBackfillResponses) GetResponses() []*ComputeBackfillResponse {
	if x != nil {
		return x.Responses
	}
	return nil
}

func (x *ComputeBackfillResponses) GetTaggedResponses() map[string]*ComputeBackfillResponse {
	if x != nil {
		return x.TaggedResponses
	}
	return nil
}

// ComputeBackfillRequest defines the input of the compute-backfill step.
type ComputeBackfillRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Request     *test_platform.Request `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
	Enumeration *EnumerationResponse   `protobuf:"bytes,2,opt,name=enumeration,proto3" json:"enumeration,omitempty"`
	Execution   *ExecuteResponse       `protobuf:"bytes,3,opt,name=execution,proto3" json:"execution,omitempty"`
}

func (x *ComputeBackfillRequest) Reset() {
	*x = ComputeBackfillRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_compute_backfill_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ComputeBackfillRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ComputeBackfillRequest) ProtoMessage() {}

func (x *ComputeBackfillRequest) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_compute_backfill_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ComputeBackfillRequest.ProtoReflect.Descriptor instead.
func (*ComputeBackfillRequest) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_compute_backfill_proto_rawDescGZIP(), []int{2}
}

func (x *ComputeBackfillRequest) GetRequest() *test_platform.Request {
	if x != nil {
		return x.Request
	}
	return nil
}

func (x *ComputeBackfillRequest) GetEnumeration() *EnumerationResponse {
	if x != nil {
		return x.Enumeration
	}
	return nil
}

func (x *ComputeBackfillRequest) GetExecution() *ExecuteResponse {
	if x != nil {
		return x.Execution
	}
	return nil
}

// ComputeBackfillResponse defines the output of the compute-backfill step.
type ComputeBackfillResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Request *test_platform.Request `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
}

func (x *ComputeBackfillResponse) Reset() {
	*x = ComputeBackfillResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_compute_backfill_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ComputeBackfillResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ComputeBackfillResponse) ProtoMessage() {}

func (x *ComputeBackfillResponse) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_compute_backfill_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ComputeBackfillResponse.ProtoReflect.Descriptor instead.
func (*ComputeBackfillResponse) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_compute_backfill_proto_rawDescGZIP(), []int{3}
}

func (x *ComputeBackfillResponse) GetRequest() *test_platform.Request {
	if x != nil {
		return x.Request
	}
	return nil
}

var File_test_platform_steps_compute_backfill_proto protoreflect.FileDescriptor

var file_test_platform_steps_compute_backfill_proto_rawDesc = []byte{
	0x0a, 0x2a, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x73, 0x74, 0x65, 0x70, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x62, 0x61,
	0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x74, 0x65,
	0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70,
	0x73, 0x1a, 0x1b, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x74,
	0x65, 0x70, 0x73, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75,
	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbd, 0x02, 0x0a, 0x17, 0x43,
	0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x43,
	0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12,
	0x69, 0x0a, 0x0f, 0x74, 0x61, 0x67, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x43,
	0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x74, 0x61, 0x67, 0x67,
	0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x1a, 0x6e, 0x0a, 0x13, 0x54, 0x61,
	0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72,
	0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
	0x6b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
	0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65,
	0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52,
	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc7, 0x02, 0x0a, 0x18, 0x43,
	0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73,
	0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x10, 0x74, 0x61, 0x67, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74,
	0x65, 0x70, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x66,
	0x69, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x2e, 0x54, 0x61, 0x67,
	0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72,
	0x79, 0x52, 0x0f, 0x74, 0x61, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x73, 0x1a, 0x70, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 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, 0x42, 0x0a, 0x05,
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70,
	0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c,
	0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
	0x3a, 0x02, 0x38, 0x01, 0x22, 0xda, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65,
	0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
	0x30, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x16, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x12, 0x4a, 0x0a, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x6e, 0x75,
	0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x52, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a,
	0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x24, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
	0x6e, 0x22, 0x4b, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b,
	0x66, 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07,
	0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x3f,
	0x5a, 0x3d, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66,
	0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x62,
	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_steps_compute_backfill_proto_rawDescOnce sync.Once
	file_test_platform_steps_compute_backfill_proto_rawDescData = file_test_platform_steps_compute_backfill_proto_rawDesc
)

func file_test_platform_steps_compute_backfill_proto_rawDescGZIP() []byte {
	file_test_platform_steps_compute_backfill_proto_rawDescOnce.Do(func() {
		file_test_platform_steps_compute_backfill_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_steps_compute_backfill_proto_rawDescData)
	})
	return file_test_platform_steps_compute_backfill_proto_rawDescData
}

var file_test_platform_steps_compute_backfill_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_test_platform_steps_compute_backfill_proto_goTypes = []interface{}{
	(*ComputeBackfillRequests)(nil),  // 0: test_platform.steps.ComputeBackfillRequests
	(*ComputeBackfillResponses)(nil), // 1: test_platform.steps.ComputeBackfillResponses
	(*ComputeBackfillRequest)(nil),   // 2: test_platform.steps.ComputeBackfillRequest
	(*ComputeBackfillResponse)(nil),  // 3: test_platform.steps.ComputeBackfillResponse
	nil,                              // 4: test_platform.steps.ComputeBackfillRequests.TaggedRequestsEntry
	nil,                              // 5: test_platform.steps.ComputeBackfillResponses.TaggedResponsesEntry
	(*test_platform.Request)(nil),    // 6: test_platform.Request
	(*EnumerationResponse)(nil),      // 7: test_platform.steps.EnumerationResponse
	(*ExecuteResponse)(nil),          // 8: test_platform.steps.ExecuteResponse
}
var file_test_platform_steps_compute_backfill_proto_depIdxs = []int32{
	2,  // 0: test_platform.steps.ComputeBackfillRequests.requests:type_name -> test_platform.steps.ComputeBackfillRequest
	4,  // 1: test_platform.steps.ComputeBackfillRequests.tagged_requests:type_name -> test_platform.steps.ComputeBackfillRequests.TaggedRequestsEntry
	3,  // 2: test_platform.steps.ComputeBackfillResponses.responses:type_name -> test_platform.steps.ComputeBackfillResponse
	5,  // 3: test_platform.steps.ComputeBackfillResponses.tagged_responses:type_name -> test_platform.steps.ComputeBackfillResponses.TaggedResponsesEntry
	6,  // 4: test_platform.steps.ComputeBackfillRequest.request:type_name -> test_platform.Request
	7,  // 5: test_platform.steps.ComputeBackfillRequest.enumeration:type_name -> test_platform.steps.EnumerationResponse
	8,  // 6: test_platform.steps.ComputeBackfillRequest.execution:type_name -> test_platform.steps.ExecuteResponse
	6,  // 7: test_platform.steps.ComputeBackfillResponse.request:type_name -> test_platform.Request
	2,  // 8: test_platform.steps.ComputeBackfillRequests.TaggedRequestsEntry.value:type_name -> test_platform.steps.ComputeBackfillRequest
	3,  // 9: test_platform.steps.ComputeBackfillResponses.TaggedResponsesEntry.value:type_name -> test_platform.steps.ComputeBackfillResponse
	10, // [10:10] is the sub-list for method output_type
	10, // [10:10] is the sub-list for method input_type
	10, // [10:10] is the sub-list for extension type_name
	10, // [10:10] is the sub-list for extension extendee
	0,  // [0:10] is the sub-list for field type_name
}

func init() { file_test_platform_steps_compute_backfill_proto_init() }
func file_test_platform_steps_compute_backfill_proto_init() {
	if File_test_platform_steps_compute_backfill_proto != nil {
		return
	}
	file_test_platform_steps_enumeration_proto_init()
	file_test_platform_steps_execution_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_steps_compute_backfill_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ComputeBackfillRequests); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_compute_backfill_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ComputeBackfillResponses); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_compute_backfill_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ComputeBackfillRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_compute_backfill_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ComputeBackfillResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_steps_compute_backfill_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   6,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_steps_compute_backfill_proto_goTypes,
		DependencyIndexes: file_test_platform_steps_compute_backfill_proto_depIdxs,
		MessageInfos:      file_test_platform_steps_compute_backfill_proto_msgTypes,
	}.Build()
	File_test_platform_steps_compute_backfill_proto = out.File
	file_test_platform_steps_compute_backfill_proto_rawDesc = nil
	file_test_platform_steps_compute_backfill_proto_goTypes = nil
	file_test_platform_steps_compute_backfill_proto_depIdxs = nil
}
