// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/tasks/v2beta2/cloudtasks.proto

package tasks

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	empty "github.com/golang/protobuf/ptypes/empty"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	v1 "google.golang.org/genproto/googleapis/iam/v1"
	_ "google.golang.org/genproto/googleapis/rpc/code"
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	grpc "google.golang.org/grpc"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

// Request message for [ListQueues][google.cloud.tasks.v2beta2.CloudTasks.ListQueues].
type ListQueuesRequest struct {
	// Required.
	//
	// The location name.
	// For example: `projects/PROJECT_ID/locations/LOCATION_ID`
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// `filter` can be used to specify a subset of queues. Any [Queue][google.cloud.tasks.v2beta2.Queue]
	// field can be used as a filter and several operators as supported.
	// For example: `<=, <, >=, >, !=, =, :`. The filter syntax is the same as
	// described in
	// [Stackdriver's Advanced Logs Filters](https://cloud.google.com/logging/docs/view/advanced_filters).
	//
	// Sample filter "app_engine_http_target: *".
	//
	// Note that using filters might cause fewer queues than the
	// requested_page size to be returned.
	Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"`
	// Requested page size.
	//
	// The maximum page size is 9800. If unspecified, the page size will
	// be the maximum. Fewer queues than requested might be returned,
	// even if more queues exist; use the
	// [next_page_token][google.cloud.tasks.v2beta2.ListQueuesResponse.next_page_token] in the
	// response to determine if more queues exist.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// A token identifying the page of results to return.
	//
	// To request the first page results, page_token must be empty. To
	// request the next page of results, page_token must be the value of
	// [next_page_token][google.cloud.tasks.v2beta2.ListQueuesResponse.next_page_token] returned
	// from the previous call to [ListQueues][google.cloud.tasks.v2beta2.CloudTasks.ListQueues]
	// method. It is an error to switch the value of the
	// [filter][google.cloud.tasks.v2beta2.ListQueuesRequest.filter] while iterating through pages.
	PageToken            string   `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListQueuesRequest) Reset()         { *m = ListQueuesRequest{} }
func (m *ListQueuesRequest) String() string { return proto.CompactTextString(m) }
func (*ListQueuesRequest) ProtoMessage()    {}
func (*ListQueuesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{0}
}

func (m *ListQueuesRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListQueuesRequest.Unmarshal(m, b)
}
func (m *ListQueuesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListQueuesRequest.Marshal(b, m, deterministic)
}
func (m *ListQueuesRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListQueuesRequest.Merge(m, src)
}
func (m *ListQueuesRequest) XXX_Size() int {
	return xxx_messageInfo_ListQueuesRequest.Size(m)
}
func (m *ListQueuesRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_ListQueuesRequest.DiscardUnknown(m)
}

var xxx_messageInfo_ListQueuesRequest proto.InternalMessageInfo

func (m *ListQueuesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListQueuesRequest) GetFilter() string {
	if m != nil {
		return m.Filter
	}
	return ""
}

func (m *ListQueuesRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListQueuesRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

// Response message for [ListQueues][google.cloud.tasks.v2beta2.CloudTasks.ListQueues].
type ListQueuesResponse struct {
	// The list of queues.
	Queues []*Queue `protobuf:"bytes,1,rep,name=queues,proto3" json:"queues,omitempty"`
	// A token to retrieve next page of results.
	//
	// To return the next page of results, call
	// [ListQueues][google.cloud.tasks.v2beta2.CloudTasks.ListQueues] with this value as the
	// [page_token][google.cloud.tasks.v2beta2.ListQueuesRequest.page_token].
	//
	// If the next_page_token is empty, there are no more results.
	//
	// The page token is valid for only 2 hours.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListQueuesResponse) Reset()         { *m = ListQueuesResponse{} }
func (m *ListQueuesResponse) String() string { return proto.CompactTextString(m) }
func (*ListQueuesResponse) ProtoMessage()    {}
func (*ListQueuesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{1}
}

func (m *ListQueuesResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListQueuesResponse.Unmarshal(m, b)
}
func (m *ListQueuesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListQueuesResponse.Marshal(b, m, deterministic)
}
func (m *ListQueuesResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListQueuesResponse.Merge(m, src)
}
func (m *ListQueuesResponse) XXX_Size() int {
	return xxx_messageInfo_ListQueuesResponse.Size(m)
}
func (m *ListQueuesResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_ListQueuesResponse.DiscardUnknown(m)
}

var xxx_messageInfo_ListQueuesResponse proto.InternalMessageInfo

func (m *ListQueuesResponse) GetQueues() []*Queue {
	if m != nil {
		return m.Queues
	}
	return nil
}

func (m *ListQueuesResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// Request message for [GetQueue][google.cloud.tasks.v2beta2.CloudTasks.GetQueue].
type GetQueueRequest struct {
	// Required.
	//
	// The resource name of the queue. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetQueueRequest) Reset()         { *m = GetQueueRequest{} }
func (m *GetQueueRequest) String() string { return proto.CompactTextString(m) }
func (*GetQueueRequest) ProtoMessage()    {}
func (*GetQueueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{2}
}

func (m *GetQueueRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetQueueRequest.Unmarshal(m, b)
}
func (m *GetQueueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetQueueRequest.Marshal(b, m, deterministic)
}
func (m *GetQueueRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetQueueRequest.Merge(m, src)
}
func (m *GetQueueRequest) XXX_Size() int {
	return xxx_messageInfo_GetQueueRequest.Size(m)
}
func (m *GetQueueRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_GetQueueRequest.DiscardUnknown(m)
}

var xxx_messageInfo_GetQueueRequest proto.InternalMessageInfo

func (m *GetQueueRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for [CreateQueue][google.cloud.tasks.v2beta2.CloudTasks.CreateQueue].
type CreateQueueRequest struct {
	// Required.
	//
	// The location name in which the queue will be created.
	// For example: `projects/PROJECT_ID/locations/LOCATION_ID`
	//
	// The list of allowed locations can be obtained by calling Cloud
	// Tasks' implementation of
	// [ListLocations][google.cloud.location.Locations.ListLocations].
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required.
	//
	// The queue to create.
	//
	// [Queue's name][google.cloud.tasks.v2beta2.Queue.name] cannot be the same as an existing queue.
	Queue                *Queue   `protobuf:"bytes,2,opt,name=queue,proto3" json:"queue,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateQueueRequest) Reset()         { *m = CreateQueueRequest{} }
func (m *CreateQueueRequest) String() string { return proto.CompactTextString(m) }
func (*CreateQueueRequest) ProtoMessage()    {}
func (*CreateQueueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{3}
}

func (m *CreateQueueRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateQueueRequest.Unmarshal(m, b)
}
func (m *CreateQueueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateQueueRequest.Marshal(b, m, deterministic)
}
func (m *CreateQueueRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateQueueRequest.Merge(m, src)
}
func (m *CreateQueueRequest) XXX_Size() int {
	return xxx_messageInfo_CreateQueueRequest.Size(m)
}
func (m *CreateQueueRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateQueueRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CreateQueueRequest proto.InternalMessageInfo

func (m *CreateQueueRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateQueueRequest) GetQueue() *Queue {
	if m != nil {
		return m.Queue
	}
	return nil
}

// Request message for [UpdateQueue][google.cloud.tasks.v2beta2.CloudTasks.UpdateQueue].
type UpdateQueueRequest struct {
	// Required.
	//
	// The queue to create or update.
	//
	// The queue's [name][google.cloud.tasks.v2beta2.Queue.name] must be specified.
	//
	// Output only fields cannot be modified using UpdateQueue.
	// Any value specified for an output only field will be ignored.
	// The queue's [name][google.cloud.tasks.v2beta2.Queue.name] cannot be changed.
	Queue *Queue `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"`
	// A mask used to specify which fields of the queue are being updated.
	//
	// If empty, then all fields will be updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *UpdateQueueRequest) Reset()         { *m = UpdateQueueRequest{} }
func (m *UpdateQueueRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateQueueRequest) ProtoMessage()    {}
func (*UpdateQueueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{4}
}

func (m *UpdateQueueRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UpdateQueueRequest.Unmarshal(m, b)
}
func (m *UpdateQueueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UpdateQueueRequest.Marshal(b, m, deterministic)
}
func (m *UpdateQueueRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UpdateQueueRequest.Merge(m, src)
}
func (m *UpdateQueueRequest) XXX_Size() int {
	return xxx_messageInfo_UpdateQueueRequest.Size(m)
}
func (m *UpdateQueueRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_UpdateQueueRequest.DiscardUnknown(m)
}

var xxx_messageInfo_UpdateQueueRequest proto.InternalMessageInfo

func (m *UpdateQueueRequest) GetQueue() *Queue {
	if m != nil {
		return m.Queue
	}
	return nil
}

func (m *UpdateQueueRequest) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

// Request message for [DeleteQueue][google.cloud.tasks.v2beta2.CloudTasks.DeleteQueue].
type DeleteQueueRequest struct {
	// Required.
	//
	// The queue name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteQueueRequest) Reset()         { *m = DeleteQueueRequest{} }
func (m *DeleteQueueRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteQueueRequest) ProtoMessage()    {}
func (*DeleteQueueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{5}
}

func (m *DeleteQueueRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeleteQueueRequest.Unmarshal(m, b)
}
func (m *DeleteQueueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeleteQueueRequest.Marshal(b, m, deterministic)
}
func (m *DeleteQueueRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeleteQueueRequest.Merge(m, src)
}
func (m *DeleteQueueRequest) XXX_Size() int {
	return xxx_messageInfo_DeleteQueueRequest.Size(m)
}
func (m *DeleteQueueRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_DeleteQueueRequest.DiscardUnknown(m)
}

var xxx_messageInfo_DeleteQueueRequest proto.InternalMessageInfo

func (m *DeleteQueueRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for [PurgeQueue][google.cloud.tasks.v2beta2.CloudTasks.PurgeQueue].
type PurgeQueueRequest struct {
	// Required.
	//
	// The queue name. For example:
	// `projects/PROJECT_ID/location/LOCATION_ID/queues/QUEUE_ID`
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PurgeQueueRequest) Reset()         { *m = PurgeQueueRequest{} }
func (m *PurgeQueueRequest) String() string { return proto.CompactTextString(m) }
func (*PurgeQueueRequest) ProtoMessage()    {}
func (*PurgeQueueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{6}
}

func (m *PurgeQueueRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PurgeQueueRequest.Unmarshal(m, b)
}
func (m *PurgeQueueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PurgeQueueRequest.Marshal(b, m, deterministic)
}
func (m *PurgeQueueRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PurgeQueueRequest.Merge(m, src)
}
func (m *PurgeQueueRequest) XXX_Size() int {
	return xxx_messageInfo_PurgeQueueRequest.Size(m)
}
func (m *PurgeQueueRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_PurgeQueueRequest.DiscardUnknown(m)
}

var xxx_messageInfo_PurgeQueueRequest proto.InternalMessageInfo

func (m *PurgeQueueRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for [PauseQueue][google.cloud.tasks.v2beta2.CloudTasks.PauseQueue].
type PauseQueueRequest struct {
	// Required.
	//
	// The queue name. For example:
	// `projects/PROJECT_ID/location/LOCATION_ID/queues/QUEUE_ID`
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PauseQueueRequest) Reset()         { *m = PauseQueueRequest{} }
func (m *PauseQueueRequest) String() string { return proto.CompactTextString(m) }
func (*PauseQueueRequest) ProtoMessage()    {}
func (*PauseQueueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{7}
}

func (m *PauseQueueRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PauseQueueRequest.Unmarshal(m, b)
}
func (m *PauseQueueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PauseQueueRequest.Marshal(b, m, deterministic)
}
func (m *PauseQueueRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PauseQueueRequest.Merge(m, src)
}
func (m *PauseQueueRequest) XXX_Size() int {
	return xxx_messageInfo_PauseQueueRequest.Size(m)
}
func (m *PauseQueueRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_PauseQueueRequest.DiscardUnknown(m)
}

var xxx_messageInfo_PauseQueueRequest proto.InternalMessageInfo

func (m *PauseQueueRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for [ResumeQueue][google.cloud.tasks.v2beta2.CloudTasks.ResumeQueue].
type ResumeQueueRequest struct {
	// Required.
	//
	// The queue name. For example:
	// `projects/PROJECT_ID/location/LOCATION_ID/queues/QUEUE_ID`
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ResumeQueueRequest) Reset()         { *m = ResumeQueueRequest{} }
func (m *ResumeQueueRequest) String() string { return proto.CompactTextString(m) }
func (*ResumeQueueRequest) ProtoMessage()    {}
func (*ResumeQueueRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{8}
}

func (m *ResumeQueueRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ResumeQueueRequest.Unmarshal(m, b)
}
func (m *ResumeQueueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ResumeQueueRequest.Marshal(b, m, deterministic)
}
func (m *ResumeQueueRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ResumeQueueRequest.Merge(m, src)
}
func (m *ResumeQueueRequest) XXX_Size() int {
	return xxx_messageInfo_ResumeQueueRequest.Size(m)
}
func (m *ResumeQueueRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_ResumeQueueRequest.DiscardUnknown(m)
}

var xxx_messageInfo_ResumeQueueRequest proto.InternalMessageInfo

func (m *ResumeQueueRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for listing tasks using [ListTasks][google.cloud.tasks.v2beta2.CloudTasks.ListTasks].
type ListTasksRequest struct {
	// Required.
	//
	// The queue name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The response_view specifies which subset of the [Task][google.cloud.tasks.v2beta2.Task] will be
	// returned.
	//
	// By default response_view is [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC]; not all
	// information is retrieved by default because some data, such as
	// payloads, might be desirable to return only when needed because
	// of its large size or because of the sensitivity of data that it
	// contains.
	//
	// Authorization for [FULL][google.cloud.tasks.v2beta2.Task.View.FULL] requires
	// `cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
	// permission on the [Task][google.cloud.tasks.v2beta2.Task] resource.
	ResponseView Task_View `protobuf:"varint,2,opt,name=response_view,json=responseView,proto3,enum=google.cloud.tasks.v2beta2.Task_View" json:"response_view,omitempty"`
	// Requested page size. Fewer tasks than requested might be returned.
	//
	// The maximum page size is 1000. If unspecified, the page size will
	// be the maximum. Fewer tasks than requested might be returned,
	// even if more tasks exist; use
	// [next_page_token][google.cloud.tasks.v2beta2.ListTasksResponse.next_page_token] in the
	// response to determine if more tasks exist.
	PageSize int32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// A token identifying the page of results to return.
	//
	// To request the first page results, page_token must be empty. To
	// request the next page of results, page_token must be the value of
	// [next_page_token][google.cloud.tasks.v2beta2.ListTasksResponse.next_page_token] returned
	// from the previous call to [ListTasks][google.cloud.tasks.v2beta2.CloudTasks.ListTasks]
	// method.
	//
	// The page token is valid for only 2 hours.
	PageToken            string   `protobuf:"bytes,5,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListTasksRequest) Reset()         { *m = ListTasksRequest{} }
func (m *ListTasksRequest) String() string { return proto.CompactTextString(m) }
func (*ListTasksRequest) ProtoMessage()    {}
func (*ListTasksRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{9}
}

func (m *ListTasksRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListTasksRequest.Unmarshal(m, b)
}
func (m *ListTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListTasksRequest.Marshal(b, m, deterministic)
}
func (m *ListTasksRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListTasksRequest.Merge(m, src)
}
func (m *ListTasksRequest) XXX_Size() int {
	return xxx_messageInfo_ListTasksRequest.Size(m)
}
func (m *ListTasksRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_ListTasksRequest.DiscardUnknown(m)
}

var xxx_messageInfo_ListTasksRequest proto.InternalMessageInfo

func (m *ListTasksRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListTasksRequest) GetResponseView() Task_View {
	if m != nil {
		return m.ResponseView
	}
	return Task_VIEW_UNSPECIFIED
}

func (m *ListTasksRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListTasksRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

// Response message for listing tasks using [ListTasks][google.cloud.tasks.v2beta2.CloudTasks.ListTasks].
type ListTasksResponse struct {
	// The list of tasks.
	Tasks []*Task `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"`
	// A token to retrieve next page of results.
	//
	// To return the next page of results, call
	// [ListTasks][google.cloud.tasks.v2beta2.CloudTasks.ListTasks] with this value as the
	// [page_token][google.cloud.tasks.v2beta2.ListTasksRequest.page_token].
	//
	// If the next_page_token is empty, there are no more results.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListTasksResponse) Reset()         { *m = ListTasksResponse{} }
func (m *ListTasksResponse) String() string { return proto.CompactTextString(m) }
func (*ListTasksResponse) ProtoMessage()    {}
func (*ListTasksResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{10}
}

func (m *ListTasksResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListTasksResponse.Unmarshal(m, b)
}
func (m *ListTasksResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListTasksResponse.Marshal(b, m, deterministic)
}
func (m *ListTasksResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListTasksResponse.Merge(m, src)
}
func (m *ListTasksResponse) XXX_Size() int {
	return xxx_messageInfo_ListTasksResponse.Size(m)
}
func (m *ListTasksResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_ListTasksResponse.DiscardUnknown(m)
}

var xxx_messageInfo_ListTasksResponse proto.InternalMessageInfo

func (m *ListTasksResponse) GetTasks() []*Task {
	if m != nil {
		return m.Tasks
	}
	return nil
}

func (m *ListTasksResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// Request message for getting a task using [GetTask][google.cloud.tasks.v2beta2.CloudTasks.GetTask].
type GetTaskRequest struct {
	// Required.
	//
	// The task name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The response_view specifies which subset of the [Task][google.cloud.tasks.v2beta2.Task] will be
	// returned.
	//
	// By default response_view is [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC]; not all
	// information is retrieved by default because some data, such as
	// payloads, might be desirable to return only when needed because
	// of its large size or because of the sensitivity of data that it
	// contains.
	//
	// Authorization for [FULL][google.cloud.tasks.v2beta2.Task.View.FULL] requires
	// `cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
	// permission on the [Task][google.cloud.tasks.v2beta2.Task] resource.
	ResponseView         Task_View `protobuf:"varint,2,opt,name=response_view,json=responseView,proto3,enum=google.cloud.tasks.v2beta2.Task_View" json:"response_view,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *GetTaskRequest) Reset()         { *m = GetTaskRequest{} }
func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) }
func (*GetTaskRequest) ProtoMessage()    {}
func (*GetTaskRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{11}
}

func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetTaskRequest.Unmarshal(m, b)
}
func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic)
}
func (m *GetTaskRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetTaskRequest.Merge(m, src)
}
func (m *GetTaskRequest) XXX_Size() int {
	return xxx_messageInfo_GetTaskRequest.Size(m)
}
func (m *GetTaskRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_GetTaskRequest.DiscardUnknown(m)
}

var xxx_messageInfo_GetTaskRequest proto.InternalMessageInfo

func (m *GetTaskRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *GetTaskRequest) GetResponseView() Task_View {
	if m != nil {
		return m.ResponseView
	}
	return Task_VIEW_UNSPECIFIED
}

// Request message for [CreateTask][google.cloud.tasks.v2beta2.CloudTasks.CreateTask].
type CreateTaskRequest struct {
	// Required.
	//
	// The queue name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
	//
	// The queue must already exist.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required.
	//
	// The task to add.
	//
	// Task names have the following format:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`.
	// The user can optionally specify a task [name][google.cloud.tasks.v2beta2.Task.name]. If a
	// name is not specified then the system will generate a random
	// unique task id, which will be set in the task returned in the
	// [response][google.cloud.tasks.v2beta2.Task.name].
	//
	// If [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] is not set or is in the
	// past then Cloud Tasks will set it to the current time.
	//
	// Task De-duplication:
	//
	// Explicitly specifying a task ID enables task de-duplication.  If
	// a task's ID is identical to that of an existing task or a task
	// that was deleted or completed recently then the call will fail
	// with [ALREADY_EXISTS][google.rpc.Code.ALREADY_EXISTS].
	// If the task's queue was created using Cloud Tasks, then another task with
	// the same name can't be created for ~1hour after the original task was
	// deleted or completed. If the task's queue was created using queue.yaml or
	// queue.xml, then another task with the same name can't be created
	// for ~9days after the original task was deleted or completed.
	//
	// Because there is an extra lookup cost to identify duplicate task
	// names, these [CreateTask][google.cloud.tasks.v2beta2.CloudTasks.CreateTask] calls have significantly
	// increased latency. Using hashed strings for the task id or for
	// the prefix of the task id is recommended. Choosing task ids that
	// are sequential or have sequential prefixes, for example using a
	// timestamp, causes an increase in latency and error rates in all
	// task commands. The infrastructure relies on an approximately
	// uniform distribution of task ids to store and serve tasks
	// efficiently.
	Task *Task `protobuf:"bytes,2,opt,name=task,proto3" json:"task,omitempty"`
	// The response_view specifies which subset of the [Task][google.cloud.tasks.v2beta2.Task] will be
	// returned.
	//
	// By default response_view is [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC]; not all
	// information is retrieved by default because some data, such as
	// payloads, might be desirable to return only when needed because
	// of its large size or because of the sensitivity of data that it
	// contains.
	//
	// Authorization for [FULL][google.cloud.tasks.v2beta2.Task.View.FULL] requires
	// `cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
	// permission on the [Task][google.cloud.tasks.v2beta2.Task] resource.
	ResponseView         Task_View `protobuf:"varint,3,opt,name=response_view,json=responseView,proto3,enum=google.cloud.tasks.v2beta2.Task_View" json:"response_view,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *CreateTaskRequest) Reset()         { *m = CreateTaskRequest{} }
func (m *CreateTaskRequest) String() string { return proto.CompactTextString(m) }
func (*CreateTaskRequest) ProtoMessage()    {}
func (*CreateTaskRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{12}
}

func (m *CreateTaskRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateTaskRequest.Unmarshal(m, b)
}
func (m *CreateTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateTaskRequest.Marshal(b, m, deterministic)
}
func (m *CreateTaskRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateTaskRequest.Merge(m, src)
}
func (m *CreateTaskRequest) XXX_Size() int {
	return xxx_messageInfo_CreateTaskRequest.Size(m)
}
func (m *CreateTaskRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateTaskRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CreateTaskRequest proto.InternalMessageInfo

func (m *CreateTaskRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateTaskRequest) GetTask() *Task {
	if m != nil {
		return m.Task
	}
	return nil
}

func (m *CreateTaskRequest) GetResponseView() Task_View {
	if m != nil {
		return m.ResponseView
	}
	return Task_VIEW_UNSPECIFIED
}

// Request message for deleting a task using
// [DeleteTask][google.cloud.tasks.v2beta2.CloudTasks.DeleteTask].
type DeleteTaskRequest struct {
	// Required.
	//
	// The task name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteTaskRequest) Reset()         { *m = DeleteTaskRequest{} }
func (m *DeleteTaskRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteTaskRequest) ProtoMessage()    {}
func (*DeleteTaskRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{13}
}

func (m *DeleteTaskRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeleteTaskRequest.Unmarshal(m, b)
}
func (m *DeleteTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeleteTaskRequest.Marshal(b, m, deterministic)
}
func (m *DeleteTaskRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeleteTaskRequest.Merge(m, src)
}
func (m *DeleteTaskRequest) XXX_Size() int {
	return xxx_messageInfo_DeleteTaskRequest.Size(m)
}
func (m *DeleteTaskRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_DeleteTaskRequest.DiscardUnknown(m)
}

var xxx_messageInfo_DeleteTaskRequest proto.InternalMessageInfo

func (m *DeleteTaskRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for leasing tasks using [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks].
type LeaseTasksRequest struct {
	// Required.
	//
	// The queue name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The maximum number of tasks to lease.
	//
	// The system will make a best effort to return as close to as
	// `max_tasks` as possible.
	//
	// The largest that `max_tasks` can be is 1000.
	MaxTasks int32 `protobuf:"varint,2,opt,name=max_tasks,json=maxTasks,proto3" json:"max_tasks,omitempty"`
	//
	// After the worker has successfully finished the work associated
	// with the task, the worker must call via
	// [AcknowledgeTask][google.cloud.tasks.v2beta2.CloudTasks.AcknowledgeTask] before the
	// [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time]. Otherwise the task will be
	// returned to a later [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks] call so
	// that another worker can retry it.
	//
	// The maximum lease duration is 1 week.
	// `lease_duration` will be truncated to the nearest second.
	LeaseDuration *duration.Duration `protobuf:"bytes,3,opt,name=lease_duration,json=leaseDuration,proto3" json:"lease_duration,omitempty"`
	// The response_view specifies which subset of the [Task][google.cloud.tasks.v2beta2.Task] will be
	// returned.
	//
	// By default response_view is [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC]; not all
	// information is retrieved by default because some data, such as
	// payloads, might be desirable to return only when needed because
	// of its large size or because of the sensitivity of data that it
	// contains.
	//
	// Authorization for [FULL][google.cloud.tasks.v2beta2.Task.View.FULL] requires
	// `cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
	// permission on the [Task][google.cloud.tasks.v2beta2.Task] resource.
	ResponseView Task_View `protobuf:"varint,4,opt,name=response_view,json=responseView,proto3,enum=google.cloud.tasks.v2beta2.Task_View" json:"response_view,omitempty"`
	// `filter` can be used to specify a subset of tasks to lease.
	//
	// When `filter` is set to `tag=<my-tag>` then the
	// [response][google.cloud.tasks.v2beta2.LeaseTasksResponse] will contain only tasks whose
	// [tag][google.cloud.tasks.v2beta2.PullMessage.tag] is equal to `<my-tag>`. `<my-tag>` must be
	// less than 500 characters.
	//
	// When `filter` is set to `tag_function=oldest_tag()`, only tasks which have
	// the same tag as the task with the oldest
	// [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] will be returned.
	//
	// Grammar Syntax:
	//
	// * `filter = "tag=" tag | "tag_function=" function`
	//
	// * `tag = string`
	//
	// * `function = "oldest_tag()"`
	//
	// The `oldest_tag()` function returns tasks which have the same tag as the
	// oldest task (ordered by schedule time).
	//
	// SDK compatibility: Although the SDK allows tags to be either
	// string or
	// [bytes](https://cloud.google.com/appengine/docs/standard/java/javadoc/com/google/appengine/api/taskqueue/TaskOptions.html#tag-byte:A-),
	// only UTF-8 encoded tags can be used in Cloud Tasks. Tag which
	// aren't UTF-8 encoded can't be used in the
	// [filter][google.cloud.tasks.v2beta2.LeaseTasksRequest.filter] and the task's
	// [tag][google.cloud.tasks.v2beta2.PullMessage.tag] will be displayed as empty in Cloud Tasks.
	Filter               string   `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LeaseTasksRequest) Reset()         { *m = LeaseTasksRequest{} }
func (m *LeaseTasksRequest) String() string { return proto.CompactTextString(m) }
func (*LeaseTasksRequest) ProtoMessage()    {}
func (*LeaseTasksRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{14}
}

func (m *LeaseTasksRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LeaseTasksRequest.Unmarshal(m, b)
}
func (m *LeaseTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LeaseTasksRequest.Marshal(b, m, deterministic)
}
func (m *LeaseTasksRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LeaseTasksRequest.Merge(m, src)
}
func (m *LeaseTasksRequest) XXX_Size() int {
	return xxx_messageInfo_LeaseTasksRequest.Size(m)
}
func (m *LeaseTasksRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_LeaseTasksRequest.DiscardUnknown(m)
}

var xxx_messageInfo_LeaseTasksRequest proto.InternalMessageInfo

func (m *LeaseTasksRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *LeaseTasksRequest) GetMaxTasks() int32 {
	if m != nil {
		return m.MaxTasks
	}
	return 0
}

func (m *LeaseTasksRequest) GetLeaseDuration() *duration.Duration {
	if m != nil {
		return m.LeaseDuration
	}
	return nil
}

func (m *LeaseTasksRequest) GetResponseView() Task_View {
	if m != nil {
		return m.ResponseView
	}
	return Task_VIEW_UNSPECIFIED
}

func (m *LeaseTasksRequest) GetFilter() string {
	if m != nil {
		return m.Filter
	}
	return ""
}

// Response message for leasing tasks using [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks].
type LeaseTasksResponse struct {
	// The leased tasks.
	Tasks                []*Task  `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LeaseTasksResponse) Reset()         { *m = LeaseTasksResponse{} }
func (m *LeaseTasksResponse) String() string { return proto.CompactTextString(m) }
func (*LeaseTasksResponse) ProtoMessage()    {}
func (*LeaseTasksResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{15}
}

func (m *LeaseTasksResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LeaseTasksResponse.Unmarshal(m, b)
}
func (m *LeaseTasksResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LeaseTasksResponse.Marshal(b, m, deterministic)
}
func (m *LeaseTasksResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LeaseTasksResponse.Merge(m, src)
}
func (m *LeaseTasksResponse) XXX_Size() int {
	return xxx_messageInfo_LeaseTasksResponse.Size(m)
}
func (m *LeaseTasksResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_LeaseTasksResponse.DiscardUnknown(m)
}

var xxx_messageInfo_LeaseTasksResponse proto.InternalMessageInfo

func (m *LeaseTasksResponse) GetTasks() []*Task {
	if m != nil {
		return m.Tasks
	}
	return nil
}

// Request message for acknowledging a task using
// [AcknowledgeTask][google.cloud.tasks.v2beta2.CloudTasks.AcknowledgeTask].
type AcknowledgeTaskRequest struct {
	// Required.
	//
	// The task name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Required.
	//
	// The task's current schedule time, available in the
	// [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] returned by
	// [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks] response or
	// [RenewLease][google.cloud.tasks.v2beta2.CloudTasks.RenewLease] response. This restriction is
	// to ensure that your worker currently holds the lease.
	ScheduleTime         *timestamp.Timestamp `protobuf:"bytes,2,opt,name=schedule_time,json=scheduleTime,proto3" json:"schedule_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *AcknowledgeTaskRequest) Reset()         { *m = AcknowledgeTaskRequest{} }
func (m *AcknowledgeTaskRequest) String() string { return proto.CompactTextString(m) }
func (*AcknowledgeTaskRequest) ProtoMessage()    {}
func (*AcknowledgeTaskRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{16}
}

func (m *AcknowledgeTaskRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AcknowledgeTaskRequest.Unmarshal(m, b)
}
func (m *AcknowledgeTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AcknowledgeTaskRequest.Marshal(b, m, deterministic)
}
func (m *AcknowledgeTaskRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AcknowledgeTaskRequest.Merge(m, src)
}
func (m *AcknowledgeTaskRequest) XXX_Size() int {
	return xxx_messageInfo_AcknowledgeTaskRequest.Size(m)
}
func (m *AcknowledgeTaskRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_AcknowledgeTaskRequest.DiscardUnknown(m)
}

var xxx_messageInfo_AcknowledgeTaskRequest proto.InternalMessageInfo

func (m *AcknowledgeTaskRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *AcknowledgeTaskRequest) GetScheduleTime() *timestamp.Timestamp {
	if m != nil {
		return m.ScheduleTime
	}
	return nil
}

// Request message for renewing a lease using
// [RenewLease][google.cloud.tasks.v2beta2.CloudTasks.RenewLease].
type RenewLeaseRequest struct {
	// Required.
	//
	// The task name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Required.
	//
	// The task's current schedule time, available in the
	// [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] returned by
	// [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks] response or
	// [RenewLease][google.cloud.tasks.v2beta2.CloudTasks.RenewLease] response. This restriction is
	// to ensure that your worker currently holds the lease.
	ScheduleTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=schedule_time,json=scheduleTime,proto3" json:"schedule_time,omitempty"`
	// Required.
	//
	// The desired new lease duration, starting from now.
	//
	//
	// The maximum lease duration is 1 week.
	// `lease_duration` will be truncated to the nearest second.
	LeaseDuration *duration.Duration `protobuf:"bytes,3,opt,name=lease_duration,json=leaseDuration,proto3" json:"lease_duration,omitempty"`
	// The response_view specifies which subset of the [Task][google.cloud.tasks.v2beta2.Task] will be
	// returned.
	//
	// By default response_view is [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC]; not all
	// information is retrieved by default because some data, such as
	// payloads, might be desirable to return only when needed because
	// of its large size or because of the sensitivity of data that it
	// contains.
	//
	// Authorization for [FULL][google.cloud.tasks.v2beta2.Task.View.FULL] requires
	// `cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
	// permission on the [Task][google.cloud.tasks.v2beta2.Task] resource.
	ResponseView         Task_View `protobuf:"varint,4,opt,name=response_view,json=responseView,proto3,enum=google.cloud.tasks.v2beta2.Task_View" json:"response_view,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *RenewLeaseRequest) Reset()         { *m = RenewLeaseRequest{} }
func (m *RenewLeaseRequest) String() string { return proto.CompactTextString(m) }
func (*RenewLeaseRequest) ProtoMessage()    {}
func (*RenewLeaseRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{17}
}

func (m *RenewLeaseRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RenewLeaseRequest.Unmarshal(m, b)
}
func (m *RenewLeaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RenewLeaseRequest.Marshal(b, m, deterministic)
}
func (m *RenewLeaseRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RenewLeaseRequest.Merge(m, src)
}
func (m *RenewLeaseRequest) XXX_Size() int {
	return xxx_messageInfo_RenewLeaseRequest.Size(m)
}
func (m *RenewLeaseRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_RenewLeaseRequest.DiscardUnknown(m)
}

var xxx_messageInfo_RenewLeaseRequest proto.InternalMessageInfo

func (m *RenewLeaseRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *RenewLeaseRequest) GetScheduleTime() *timestamp.Timestamp {
	if m != nil {
		return m.ScheduleTime
	}
	return nil
}

func (m *RenewLeaseRequest) GetLeaseDuration() *duration.Duration {
	if m != nil {
		return m.LeaseDuration
	}
	return nil
}

func (m *RenewLeaseRequest) GetResponseView() Task_View {
	if m != nil {
		return m.ResponseView
	}
	return Task_VIEW_UNSPECIFIED
}

// Request message for canceling a lease using
// [CancelLease][google.cloud.tasks.v2beta2.CloudTasks.CancelLease].
type CancelLeaseRequest struct {
	// Required.
	//
	// The task name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Required.
	//
	// The task's current schedule time, available in the
	// [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] returned by
	// [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks] response or
	// [RenewLease][google.cloud.tasks.v2beta2.CloudTasks.RenewLease] response. This restriction is
	// to ensure that your worker currently holds the lease.
	ScheduleTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=schedule_time,json=scheduleTime,proto3" json:"schedule_time,omitempty"`
	// The response_view specifies which subset of the [Task][google.cloud.tasks.v2beta2.Task] will be
	// returned.
	//
	// By default response_view is [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC]; not all
	// information is retrieved by default because some data, such as
	// payloads, might be desirable to return only when needed because
	// of its large size or because of the sensitivity of data that it
	// contains.
	//
	// Authorization for [FULL][google.cloud.tasks.v2beta2.Task.View.FULL] requires
	// `cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
	// permission on the [Task][google.cloud.tasks.v2beta2.Task] resource.
	ResponseView         Task_View `protobuf:"varint,3,opt,name=response_view,json=responseView,proto3,enum=google.cloud.tasks.v2beta2.Task_View" json:"response_view,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *CancelLeaseRequest) Reset()         { *m = CancelLeaseRequest{} }
func (m *CancelLeaseRequest) String() string { return proto.CompactTextString(m) }
func (*CancelLeaseRequest) ProtoMessage()    {}
func (*CancelLeaseRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{18}
}

func (m *CancelLeaseRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CancelLeaseRequest.Unmarshal(m, b)
}
func (m *CancelLeaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CancelLeaseRequest.Marshal(b, m, deterministic)
}
func (m *CancelLeaseRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CancelLeaseRequest.Merge(m, src)
}
func (m *CancelLeaseRequest) XXX_Size() int {
	return xxx_messageInfo_CancelLeaseRequest.Size(m)
}
func (m *CancelLeaseRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CancelLeaseRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CancelLeaseRequest proto.InternalMessageInfo

func (m *CancelLeaseRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *CancelLeaseRequest) GetScheduleTime() *timestamp.Timestamp {
	if m != nil {
		return m.ScheduleTime
	}
	return nil
}

func (m *CancelLeaseRequest) GetResponseView() Task_View {
	if m != nil {
		return m.ResponseView
	}
	return Task_VIEW_UNSPECIFIED
}

// Request message for forcing a task to run now using
// [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask].
type RunTaskRequest struct {
	// Required.
	//
	// The task name. For example:
	// `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The response_view specifies which subset of the [Task][google.cloud.tasks.v2beta2.Task] will be
	// returned.
	//
	// By default response_view is [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC]; not all
	// information is retrieved by default because some data, such as
	// payloads, might be desirable to return only when needed because
	// of its large size or because of the sensitivity of data that it
	// contains.
	//
	// Authorization for [FULL][google.cloud.tasks.v2beta2.Task.View.FULL] requires
	// `cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
	// permission on the [Task][google.cloud.tasks.v2beta2.Task] resource.
	ResponseView         Task_View `protobuf:"varint,2,opt,name=response_view,json=responseView,proto3,enum=google.cloud.tasks.v2beta2.Task_View" json:"response_view,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *RunTaskRequest) Reset()         { *m = RunTaskRequest{} }
func (m *RunTaskRequest) String() string { return proto.CompactTextString(m) }
func (*RunTaskRequest) ProtoMessage()    {}
func (*RunTaskRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f19d568d0a105212, []int{19}
}

func (m *RunTaskRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RunTaskRequest.Unmarshal(m, b)
}
func (m *RunTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RunTaskRequest.Marshal(b, m, deterministic)
}
func (m *RunTaskRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RunTaskRequest.Merge(m, src)
}
func (m *RunTaskRequest) XXX_Size() int {
	return xxx_messageInfo_RunTaskRequest.Size(m)
}
func (m *RunTaskRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_RunTaskRequest.DiscardUnknown(m)
}

var xxx_messageInfo_RunTaskRequest proto.InternalMessageInfo

func (m *RunTaskRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *RunTaskRequest) GetResponseView() Task_View {
	if m != nil {
		return m.ResponseView
	}
	return Task_VIEW_UNSPECIFIED
}

func init() {
	proto.RegisterType((*ListQueuesRequest)(nil), "google.cloud.tasks.v2beta2.ListQueuesRequest")
	proto.RegisterType((*ListQueuesResponse)(nil), "google.cloud.tasks.v2beta2.ListQueuesResponse")
	proto.RegisterType((*GetQueueRequest)(nil), "google.cloud.tasks.v2beta2.GetQueueRequest")
	proto.RegisterType((*CreateQueueRequest)(nil), "google.cloud.tasks.v2beta2.CreateQueueRequest")
	proto.RegisterType((*UpdateQueueRequest)(nil), "google.cloud.tasks.v2beta2.UpdateQueueRequest")
	proto.RegisterType((*DeleteQueueRequest)(nil), "google.cloud.tasks.v2beta2.DeleteQueueRequest")
	proto.RegisterType((*PurgeQueueRequest)(nil), "google.cloud.tasks.v2beta2.PurgeQueueRequest")
	proto.RegisterType((*PauseQueueRequest)(nil), "google.cloud.tasks.v2beta2.PauseQueueRequest")
	proto.RegisterType((*ResumeQueueRequest)(nil), "google.cloud.tasks.v2beta2.ResumeQueueRequest")
	proto.RegisterType((*ListTasksRequest)(nil), "google.cloud.tasks.v2beta2.ListTasksRequest")
	proto.RegisterType((*ListTasksResponse)(nil), "google.cloud.tasks.v2beta2.ListTasksResponse")
	proto.RegisterType((*GetTaskRequest)(nil), "google.cloud.tasks.v2beta2.GetTaskRequest")
	proto.RegisterType((*CreateTaskRequest)(nil), "google.cloud.tasks.v2beta2.CreateTaskRequest")
	proto.RegisterType((*DeleteTaskRequest)(nil), "google.cloud.tasks.v2beta2.DeleteTaskRequest")
	proto.RegisterType((*LeaseTasksRequest)(nil), "google.cloud.tasks.v2beta2.LeaseTasksRequest")
	proto.RegisterType((*LeaseTasksResponse)(nil), "google.cloud.tasks.v2beta2.LeaseTasksResponse")
	proto.RegisterType((*AcknowledgeTaskRequest)(nil), "google.cloud.tasks.v2beta2.AcknowledgeTaskRequest")
	proto.RegisterType((*RenewLeaseRequest)(nil), "google.cloud.tasks.v2beta2.RenewLeaseRequest")
	proto.RegisterType((*CancelLeaseRequest)(nil), "google.cloud.tasks.v2beta2.CancelLeaseRequest")
	proto.RegisterType((*RunTaskRequest)(nil), "google.cloud.tasks.v2beta2.RunTaskRequest")
}

func init() {
	proto.RegisterFile("google/cloud/tasks/v2beta2/cloudtasks.proto", fileDescriptor_f19d568d0a105212)
}

var fileDescriptor_f19d568d0a105212 = []byte{
	// 1382 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x98, 0xdf, 0x6f, 0x14, 0x55,
	0x14, 0xc7, 0x73, 0x4b, 0x17, 0xe8, 0x59, 0xda, 0xba, 0x37, 0x81, 0x94, 0x45, 0xb1, 0xde, 0x04,
	0x58, 0x17, 0xd9, 0x09, 0xab, 0x80, 0x6c, 0x05, 0x4a, 0x0b, 0x14, 0x05, 0x4c, 0x99, 0x56, 0x1f,
	0x7c, 0xd9, 0x0c, 0xb3, 0x97, 0x75, 0xec, 0xfc, 0x62, 0x7e, 0xb4, 0x15, 0x6d, 0x4c, 0x7c, 0xf4,
	0xc1, 0x17, 0x8c, 0xf1, 0xcd, 0x9f, 0x31, 0x31, 0x91, 0x98, 0x98, 0xf0, 0xe6, 0x7f, 0xe1, 0xbf,
	0xe0, 0xb3, 0xf1, 0xc9, 0x67, 0x73, 0x7f, 0xcc, 0xce, 0x74, 0xa6, 0x3b, 0x33, 0x5d, 0x28, 0xf1,
	0xa9, 0x9d, 0x7b, 0xcf, 0xbd, 0xe7, 0x73, 0xcf, 0x3d, 0xf7, 0xde, 0xef, 0x59, 0x38, 0xdd, 0x77,
	0x9c, 0xbe, 0x49, 0x15, 0xdd, 0x74, 0xc2, 0x9e, 0x12, 0x68, 0xfe, 0x9a, 0xaf, 0xac, 0xb7, 0xef,
	0xd1, 0x40, 0x6b, 0x8b, 0x36, 0xde, 0xd4, 0x72, 0x3d, 0x27, 0x70, 0x70, 0x5d, 0x18, 0xb7, 0x78,
	0x47, 0x4b, 0xf4, 0x48, 0xe3, 0xfa, 0x8b, 0x72, 0x22, 0xcd, 0x35, 0x14, 0xcd, 0xb6, 0x9d, 0x40,
	0x0b, 0x0c, 0xc7, 0x96, 0x23, 0xeb, 0x27, 0x73, 0xdc, 0x3c, 0x08, 0x69, 0x48, 0xa5, 0xdd, 0x89,
	0x1c, 0x3b, 0xf6, 0x25, 0xcd, 0x8e, 0x4b, 0x33, 0x43, 0xb3, 0x94, 0xf5, 0xb3, 0xec, 0x4f, 0xd7,
	0x75, 0x4c, 0x43, 0xff, 0x58, 0xf6, 0xd7, 0xb7, 0xf7, 0x6f, 0xeb, 0x8b, 0xc6, 0xf2, 0xaf, 0x7b,
	0xe1, 0x7d, 0xa5, 0x17, 0x7a, 0x9c, 0x55, 0xf6, 0x1f, 0x4b, 0xf7, 0x53, 0xcb, 0x0d, 0xa2, 0xc1,
	0xb3, 0xe9, 0xce, 0xfb, 0x06, 0x35, 0x7b, 0x5d, 0x2b, 0x46, 0x7b, 0x39, 0x6d, 0x11, 0x18, 0x16,
	0xf5, 0x03, 0xcd, 0x72, 0xa5, 0xc1, 0x61, 0x69, 0xe0, 0xb9, 0xba, 0xa2, 0x3b, 0x3d, 0xb9, 0x72,
	0xf2, 0x19, 0xd4, 0x6e, 0x1b, 0x7e, 0x70, 0x97, 0x05, 0xc3, 0x57, 0xe9, 0x83, 0x90, 0xfa, 0x01,
	0x3e, 0x02, 0xfb, 0x5d, 0xcd, 0xa3, 0x76, 0x30, 0x83, 0x66, 0x51, 0x63, 0x42, 0x95, 0x5f, 0xac,
	0xfd, 0xbe, 0x61, 0x06, 0xd4, 0x9b, 0x19, 0x13, 0xed, 0xe2, 0x0b, 0x1f, 0x83, 0x09, 0x57, 0xeb,
	0xd3, 0xae, 0x6f, 0x3c, 0xa4, 0x33, 0xfb, 0x66, 0x51, 0xa3, 0xa2, 0x1e, 0x64, 0x0d, 0x2b, 0xc6,
	0x43, 0x8a, 0x5f, 0x02, 0xe0, 0x9d, 0x81, 0xb3, 0x46, 0xed, 0x99, 0x71, 0x3e, 0x90, 0x9b, 0xaf,
	0xb2, 0x06, 0xb2, 0x01, 0x38, 0x09, 0xe0, 0xbb, 0x8e, 0xed, 0x53, 0x7c, 0x11, 0xf6, 0xf3, 0xfd,
	0xf1, 0x67, 0xd0, 0xec, 0xbe, 0x46, 0xb5, 0xfd, 0x4a, 0x6b, 0x78, 0x0e, 0xb4, 0xf8, 0x58, 0x55,
	0x0e, 0xc0, 0x27, 0x61, 0xda, 0xa6, 0x9b, 0x41, 0x37, 0xe1, 0x54, 0xd0, 0x4e, 0xb2, 0xe6, 0xe5,
	0x81, 0xe3, 0x13, 0x30, 0xbd, 0x44, 0x85, 0xdf, 0x68, 0xdd, 0x18, 0xc6, 0x6d, 0xcd, 0xa2, 0x72,
	0xd5, 0xfc, 0x7f, 0x42, 0x01, 0x2f, 0x7a, 0x54, 0x0b, 0xe8, 0x36, 0xcb, 0x61, 0x11, 0xba, 0x00,
	0x15, 0x8e, 0xc1, 0x5d, 0x96, 0xc2, 0x16, 0xf6, 0xe4, 0x0b, 0x04, 0xf8, 0x3d, 0xb7, 0x97, 0xf6,
	0x33, 0x98, 0x0f, 0xed, 0x6e, 0x3e, 0x3c, 0x07, 0xd5, 0x90, 0x4f, 0xc7, 0x93, 0x44, 0xe2, 0xd4,
	0xa3, 0xe1, 0x51, 0x96, 0xb4, 0x6e, 0xb0, 0x3c, 0xba, 0xa3, 0xf9, 0x6b, 0x2a, 0x08, 0x73, 0xf6,
	0x3f, 0x69, 0x00, 0xbe, 0x46, 0x4d, 0x9a, 0x62, 0xd9, 0x29, 0x3a, 0xa7, 0xa0, 0xb6, 0x1c, 0x7a,
	0xfd, 0x72, 0x86, 0x5a, 0xe8, 0x17, 0x1b, 0x36, 0x00, 0xab, 0xd4, 0x0f, 0xad, 0x62, 0xcb, 0xdf,
	0x11, 0xbc, 0xc0, 0x52, 0x67, 0x95, 0x45, 0xa1, 0x68, 0x63, 0xde, 0x81, 0x49, 0x4f, 0x26, 0x57,
	0x77, 0xdd, 0xa0, 0x1b, 0x3c, 0x22, 0x53, 0xed, 0x13, 0x79, 0x01, 0x65, 0x13, 0xb7, 0xde, 0x37,
	0xe8, 0x86, 0x7a, 0x28, 0x1a, 0xcb, 0xbe, 0xb6, 0xa7, 0xfb, 0x78, 0x6e, 0xba, 0x57, 0xd2, 0xe9,
	0xee, 0x8b, 0xf3, 0x26, 0x99, 0x65, 0xb6, 0x9f, 0x87, 0x0a, 0xf7, 0x2c, 0x93, 0x7d, 0xb6, 0x08,
	0x4a, 0x15, 0xe6, 0xa5, 0x53, 0xdd, 0x85, 0xa9, 0x25, 0xca, 0x7d, 0xe6, 0xc4, 0xf3, 0x59, 0x86,
	0x88, 0x3c, 0x46, 0x50, 0x13, 0xc7, 0x26, 0xe9, 0x75, 0xd8, 0xe6, 0xbc, 0x01, 0xe3, 0x41, 0x9c,
	0xa5, 0xc5, 0xcb, 0xe7, 0xd6, 0x59, 0xde, 0x7d, 0xa3, 0xf3, 0x9e, 0x82, 0x9a, 0xc8, 0xf8, 0x82,
	0x20, 0x91, 0xbf, 0x11, 0xd4, 0x6e, 0x53, 0xcd, 0xa7, 0xa5, 0xb2, 0xee, 0x18, 0x4c, 0x58, 0xda,
	0x66, 0x57, 0x6c, 0xee, 0x98, 0xc8, 0x14, 0x4b, 0xdb, 0xe4, 0x63, 0xf1, 0x3c, 0x4c, 0x99, 0x6c,
	0xa6, 0x6e, 0xf4, 0x12, 0xf0, 0x05, 0x54, 0xdb, 0x47, 0x33, 0xa7, 0xf4, 0x9a, 0x34, 0x50, 0x27,
	0xf9, 0x80, 0xe8, 0x33, 0x1b, 0x81, 0xf1, 0xd1, 0x93, 0x3a, 0xbe, 0xdb, 0x2b, 0xc9, 0xbb, 0x9d,
	0xdc, 0x06, 0x9c, 0x5c, 0xef, 0xd3, 0x65, 0x2c, 0xb1, 0xe0, 0xc8, 0x55, 0x7d, 0xcd, 0x76, 0x36,
	0x4c, 0xda, 0xeb, 0x17, 0x05, 0x1b, 0x5f, 0x81, 0x49, 0x5f, 0xff, 0x90, 0xf6, 0x42, 0x93, 0x76,
	0xd9, 0x7b, 0x36, 0xf4, 0x1a, 0x5b, 0x8d, 0x1e, 0x3b, 0xf5, 0x50, 0x34, 0x80, 0x35, 0x91, 0x7f,
	0x11, 0xd4, 0x54, 0x6a, 0xd3, 0x0d, 0xbe, 0x84, 0xbd, 0x74, 0xf5, 0xff, 0xda, 0x4d, 0xf2, 0x04,
	0x01, 0x5e, 0xd4, 0x6c, 0x9d, 0x9a, 0x7b, 0xbf, 0xf2, 0x67, 0x79, 0x0e, 0x5d, 0x98, 0x52, 0x43,
	0xfb, 0x39, 0xde, 0x54, 0xed, 0x7f, 0x8e, 0x02, 0x2c, 0x32, 0x7b, 0x71, 0x28, 0x7f, 0x42, 0x00,
	0xb1, 0x1e, 0xc1, 0x67, 0xf2, 0xa6, 0xcc, 0x08, 0xa7, 0x7a, 0xab, 0xac, 0xb9, 0x00, 0x20, 0x17,
	0x3e, 0xff, 0xf3, 0xaf, 0x47, 0x63, 0x67, 0xb1, 0x32, 0x50, 0x9b, 0x9f, 0x88, 0x9b, 0xe3, 0x92,
	0xeb, 0x39, 0x1f, 0x51, 0x3d, 0xf0, 0x95, 0xa6, 0x62, 0x3a, 0xba, 0x10, 0xb5, 0x4a, 0x73, 0x4b,
	0x91, 0x22, 0xe7, 0x11, 0x82, 0x83, 0x91, 0x7a, 0xc1, 0xa7, 0xf3, 0xbc, 0xa6, 0x34, 0x4e, 0xbd,
	0x58, 0x42, 0xec, 0x44, 0xc5, 0xc2, 0x3e, 0x84, 0x49, 0x22, 0x29, 0xcd, 0x2d, 0xfc, 0x1d, 0x82,
	0x6a, 0x42, 0x2c, 0xe1, 0xdc, 0x70, 0x64, 0x55, 0x55, 0x19, 0xb6, 0xcb, 0x9c, 0xed, 0x4d, 0xb2,
	0xdb, 0x88, 0x75, 0xa4, 0x2e, 0xfa, 0x19, 0x41, 0x35, 0xa1, 0xb3, 0xf2, 0x11, 0xb3, 0x82, 0xac,
	0x0c, 0xe2, 0x35, 0x8e, 0x78, 0xb9, 0x7d, 0x2e, 0x46, 0x14, 0xb5, 0x46, 0xa9, 0x20, 0x46, 0xa0,
	0x5f, 0x22, 0xa8, 0x26, 0x44, 0x58, 0x3e, 0x68, 0x56, 0xad, 0xd5, 0x8f, 0x64, 0xce, 0xef, 0x75,
	0x56, 0x50, 0x44, 0x9b, 0xdb, 0x1c, 0x65, 0x73, 0x21, 0xd6, 0x7a, 0xf9, 0x27, 0x23, 0xa3, 0x09,
	0xcb, 0xc4, 0x6d, 0x9e, 0x93, 0x75, 0xc8, 0xb9, 0x5d, 0x92, 0x75, 0x5c, 0xe6, 0xad, 0x83, 0x9a,
	0x02, 0x71, 0xa0, 0x32, 0x0b, 0x10, 0xd3, 0x6a, 0x74, 0x6f, 0x11, 0x99, 0x37, 0x86, 0xf8, 0x23,
	0x82, 0x6a, 0x42, 0xdf, 0xe6, 0x6f, 0x6b, 0x56, 0x08, 0x97, 0x81, 0xbc, 0xca, 0x21, 0xe7, 0xc8,
	0xf9, 0xdd, 0x42, 0x7a, 0xdc, 0x1d, 0xa3, 0xfc, 0x1a, 0xc1, 0xa1, 0x25, 0x1a, 0xbc, 0xad, 0x59,
	0xcb, 0xbc, 0x86, 0xc5, 0x24, 0x72, 0x6b, 0x68, 0x56, 0x6b, 0xfd, 0x6c, 0x2b, 0xd9, 0x19, 0xa1,
	0x1d, 0x4e, 0xd9, 0x88, 0x5e, 0x72, 0x8b, 0xe3, 0x5c, 0x27, 0xf3, 0x31, 0x8e, 0x47, 0x7d, 0x27,
	0xf4, 0xf4, 0x12, 0x48, 0xfd, 0x84, 0x9f, 0x08, 0x6c, 0x25, 0x0f, 0x6c, 0xe5, 0x39, 0x81, 0xf9,
	0x29, 0xb0, 0x3f, 0x10, 0xe0, 0x55, 0xea, 0xf3, 0x46, 0xea, 0x59, 0x86, 0xef, 0xb3, 0x21, 0xb8,
	0x91, 0x72, 0x9d, 0x35, 0x89, 0x20, 0x5f, 0x2d, 0x61, 0x29, 0x5f, 0x8d, 0xbb, 0x1c, 0xfc, 0x16,
	0xb9, 0x31, 0x0a, 0x78, 0x90, 0x99, 0x97, 0xe1, 0xff, 0x82, 0x60, 0x62, 0x50, 0x97, 0xe0, 0xd7,
	0x8a, 0x9e, 0xb1, 0xa4, 0xf8, 0xad, 0x9f, 0x29, 0x69, 0x2d, 0xe9, 0xaf, 0x70, 0xfa, 0x8b, 0xf8,
	0x42, 0xc9, 0x1b, 0x3c, 0x66, 0x17, 0x3f, 0xcc, 0xe0, 0x6f, 0x10, 0x1c, 0x90, 0xe5, 0x0c, 0x6e,
	0x16, 0x3c, 0x7d, 0x09, 0x25, 0x51, 0x2f, 0x14, 0xa9, 0x3b, 0xa1, 0x95, 0x39, 0x39, 0xf2, 0x07,
	0xa3, 0xe6, 0x16, 0xfe, 0x1e, 0x01, 0xc4, 0x65, 0x4f, 0xfe, 0x05, 0x94, 0x29, 0x8f, 0x4a, 0x00,
	0x2e, 0x70, 0xc0, 0xb7, 0xc8, 0xa8, 0xb1, 0x63, 0x5b, 0xfd, 0x15, 0x02, 0x88, 0x6b, 0x9d, 0x7c,
	0xc6, 0x4c, 0x4d, 0x34, 0xf4, 0x59, 0x91, 0xa1, 0x6b, 0x8e, 0x1c, 0xba, 0x27, 0x4c, 0x78, 0x0d,
	0x0a, 0x8d, 0x02, 0xe1, 0x95, 0x2e, 0xc0, 0x0a, 0x84, 0x57, 0xa6, 0x7e, 0x21, 0x37, 0x39, 0xee,
	0x02, 0xb9, 0x34, 0x6a, 0x20, 0xb9, 0x74, 0x67, 0xe1, 0x7c, 0x8c, 0x60, 0x3a, 0x55, 0xd2, 0xe0,
	0x76, 0x1e, 0xcd, 0xce, 0xf5, 0xcf, 0xd0, 0xc0, 0xbe, 0xcb, 0x49, 0x6f, 0x92, 0xc5, 0x11, 0x03,
	0xdb, 0xd1, 0x62, 0x7f, 0x8c, 0xf7, 0x57, 0x04, 0x10, 0x97, 0x44, 0xf9, 0x71, 0xce, 0x94, 0x4e,
	0x25, 0x52, 0xf4, 0x0e, 0xe7, 0x5d, 0x22, 0x0b, 0xa3, 0xf2, 0x7a, 0x03, 0xa7, 0x0c, 0xf7, 0x37,
	0x26, 0x29, 0xe3, 0x42, 0xa6, 0x40, 0x52, 0x66, 0x2a, 0x9e, 0x12, 0xc0, 0x4f, 0x1d, 0x60, 0x3d,
	0xf6, 0xca, 0x88, 0xbf, 0x45, 0x70, 0x40, 0xd6, 0x30, 0xf9, 0xd7, 0xd3, 0xf6, 0x42, 0xa7, 0x04,
	0xe9, 0x0d, 0x4e, 0x3a, 0x4f, 0xe6, 0x46, 0x0e, 0x6d, 0x68, 0x77, 0x50, 0x73, 0xe1, 0x53, 0x38,
	0xae, 0x3b, 0x56, 0x8e, 0xbb, 0x85, 0xe9, 0xb8, 0x22, 0x5a, 0x66, 0xe9, 0xb8, 0x8c, 0x3e, 0xb8,
	0x22, 0xcd, 0xfb, 0x8e, 0xa9, 0xd9, 0xfd, 0x96, 0xe3, 0xf5, 0x95, 0x3e, 0xb5, 0x79, 0xb2, 0x2a,
	0xa2, 0x4b, 0x73, 0x0d, 0x7f, 0xa7, 0x5f, 0xd0, 0xe7, 0xf8, 0xd7, 0x0f, 0x63, 0x95, 0xd5, 0xab,
	0x2b, 0xb7, 0x56, 0xee, 0xed, 0xe7, 0x63, 0x5e, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x01, 0x6f,
	0x4f, 0xe1, 0x03, 0x18, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// CloudTasksClient is the client API for CloudTasks service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type CloudTasksClient interface {
	// Lists queues.
	//
	// Queues are returned in lexicographical order.
	ListQueues(ctx context.Context, in *ListQueuesRequest, opts ...grpc.CallOption) (*ListQueuesResponse, error)
	// Gets a queue.
	GetQueue(ctx context.Context, in *GetQueueRequest, opts ...grpc.CallOption) (*Queue, error)
	// Creates a queue.
	//
	// Queues created with this method allow tasks to live for a maximum of 31
	// days. After a task is 31 days old, the task will be deleted regardless of whether
	// it was dispatched or not.
	//
	// WARNING: Using this method may have unintended side effects if you are
	// using an App Engine `queue.yaml` or `queue.xml` file to manage your queues.
	// Read
	// [Overview of Queue Management and queue.yaml](https://cloud.google.com/tasks/docs/queue-yaml)
	// before using this method.
	CreateQueue(ctx context.Context, in *CreateQueueRequest, opts ...grpc.CallOption) (*Queue, error)
	// Updates a queue.
	//
	// This method creates the queue if it does not exist and updates
	// the queue if it does exist.
	//
	// Queues created with this method allow tasks to live for a maximum of 31
	// days. After a task is 31 days old, the task will be deleted regardless of whether
	// it was dispatched or not.
	//
	// WARNING: Using this method may have unintended side effects if you are
	// using an App Engine `queue.yaml` or `queue.xml` file to manage your queues.
	// Read
	// [Overview of Queue Management and queue.yaml](https://cloud.google.com/tasks/docs/queue-yaml)
	// before using this method.
	UpdateQueue(ctx context.Context, in *UpdateQueueRequest, opts ...grpc.CallOption) (*Queue, error)
	// Deletes a queue.
	//
	// This command will delete the queue even if it has tasks in it.
	//
	// Note: If you delete a queue, a queue with the same name can't be created
	// for 7 days.
	//
	// WARNING: Using this method may have unintended side effects if you are
	// using an App Engine `queue.yaml` or `queue.xml` file to manage your queues.
	// Read
	// [Overview of Queue Management and queue.yaml](https://cloud.google.com/tasks/docs/queue-yaml)
	// before using this method.
	DeleteQueue(ctx context.Context, in *DeleteQueueRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Purges a queue by deleting all of its tasks.
	//
	// All tasks created before this method is called are permanently deleted.
	//
	// Purge operations can take up to one minute to take effect. Tasks
	// might be dispatched before the purge takes effect. A purge is irreversible.
	PurgeQueue(ctx context.Context, in *PurgeQueueRequest, opts ...grpc.CallOption) (*Queue, error)
	// Pauses the queue.
	//
	// If a queue is paused then the system will stop dispatching tasks
	// until the queue is resumed via
	// [ResumeQueue][google.cloud.tasks.v2beta2.CloudTasks.ResumeQueue]. Tasks can still be added
	// when the queue is paused. A queue is paused if its
	// [state][google.cloud.tasks.v2beta2.Queue.state] is [PAUSED][google.cloud.tasks.v2beta2.Queue.State.PAUSED].
	PauseQueue(ctx context.Context, in *PauseQueueRequest, opts ...grpc.CallOption) (*Queue, error)
	// Resume a queue.
	//
	// This method resumes a queue after it has been
	// [PAUSED][google.cloud.tasks.v2beta2.Queue.State.PAUSED] or
	// [DISABLED][google.cloud.tasks.v2beta2.Queue.State.DISABLED]. The state of a queue is stored
	// in the queue's [state][google.cloud.tasks.v2beta2.Queue.state]; after calling this method it
	// will be set to [RUNNING][google.cloud.tasks.v2beta2.Queue.State.RUNNING].
	//
	// WARNING: Resuming many high-QPS queues at the same time can
	// lead to target overloading. If you are resuming high-QPS
	// queues, follow the 500/50/5 pattern described in
	// [Managing Cloud Tasks Scaling Risks](https://cloud.google.com/tasks/docs/manage-cloud-task-scaling).
	ResumeQueue(ctx context.Context, in *ResumeQueueRequest, opts ...grpc.CallOption) (*Queue, error)
	// Gets the access control policy for a [Queue][google.cloud.tasks.v2beta2.Queue].
	// Returns an empty policy if the resource exists and does not have a policy
	// set.
	//
	// Authorization requires the following
	// [Google IAM](https://cloud.google.com/iam) permission on the specified
	// resource parent:
	//
	// * `cloudtasks.queues.getIamPolicy`
	GetIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error)
	// Sets the access control policy for a [Queue][google.cloud.tasks.v2beta2.Queue]. Replaces any existing
	// policy.
	//
	// Note: The Cloud Console does not check queue-level IAM permissions yet.
	// Project-level permissions are required to use the Cloud Console.
	//
	// Authorization requires the following
	// [Google IAM](https://cloud.google.com/iam) permission on the specified
	// resource parent:
	//
	// * `cloudtasks.queues.setIamPolicy`
	SetIamPolicy(ctx context.Context, in *v1.SetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error)
	// Returns permissions that a caller has on a [Queue][google.cloud.tasks.v2beta2.Queue].
	// If the resource does not exist, this will return an empty set of
	// permissions, not a [NOT_FOUND][google.rpc.Code.NOT_FOUND] error.
	//
	// Note: This operation is designed to be used for building permission-aware
	// UIs and command-line tools, not for authorization checking. This operation
	// may "fail open" without warning.
	TestIamPermissions(ctx context.Context, in *v1.TestIamPermissionsRequest, opts ...grpc.CallOption) (*v1.TestIamPermissionsResponse, error)
	// Lists the tasks in a queue.
	//
	// By default, only the [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC] view is retrieved
	// due to performance considerations;
	// [response_view][google.cloud.tasks.v2beta2.ListTasksRequest.response_view] controls the
	// subset of information which is returned.
	//
	// The tasks may be returned in any order. The ordering may change at any
	// time.
	ListTasks(ctx context.Context, in *ListTasksRequest, opts ...grpc.CallOption) (*ListTasksResponse, error)
	// Gets a task.
	GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*Task, error)
	// Creates a task and adds it to a queue.
	//
	// Tasks cannot be updated after creation; there is no UpdateTask command.
	//
	// * For [App Engine queues][google.cloud.tasks.v2beta2.AppEngineHttpTarget], the maximum task size is
	//   100KB.
	// * For [pull queues][google.cloud.tasks.v2beta2.PullTarget], the maximum task size is 1MB.
	CreateTask(ctx context.Context, in *CreateTaskRequest, opts ...grpc.CallOption) (*Task, error)
	// Deletes a task.
	//
	// A task can be deleted if it is scheduled or dispatched. A task
	// cannot be deleted if it has completed successfully or permanently
	// failed.
	DeleteTask(ctx context.Context, in *DeleteTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Leases tasks from a pull queue for
	// [lease_duration][google.cloud.tasks.v2beta2.LeaseTasksRequest.lease_duration].
	//
	// This method is invoked by the worker to obtain a lease. The
	// worker must acknowledge the task via
	// [AcknowledgeTask][google.cloud.tasks.v2beta2.CloudTasks.AcknowledgeTask] after they have
	// performed the work associated with the task.
	//
	// The [payload][google.cloud.tasks.v2beta2.PullMessage.payload] is intended to store data that
	// the worker needs to perform the work associated with the task. To
	// return the payloads in the [response][google.cloud.tasks.v2beta2.LeaseTasksResponse], set
	// [response_view][google.cloud.tasks.v2beta2.LeaseTasksRequest.response_view] to
	// [FULL][google.cloud.tasks.v2beta2.Task.View.FULL].
	//
	// A maximum of 10 qps of [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks]
	// requests are allowed per
	// queue. [RESOURCE_EXHAUSTED][google.rpc.Code.RESOURCE_EXHAUSTED]
	// is returned when this limit is
	// exceeded. [RESOURCE_EXHAUSTED][google.rpc.Code.RESOURCE_EXHAUSTED]
	// is also returned when
	// [max_tasks_dispatched_per_second][google.cloud.tasks.v2beta2.RateLimits.max_tasks_dispatched_per_second]
	// is exceeded.
	LeaseTasks(ctx context.Context, in *LeaseTasksRequest, opts ...grpc.CallOption) (*LeaseTasksResponse, error)
	// Acknowledges a pull task.
	//
	// The worker, that is, the entity that
	// [leased][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks] this task must call this method
	// to indicate that the work associated with the task has finished.
	//
	// The worker must acknowledge a task within the
	// [lease_duration][google.cloud.tasks.v2beta2.LeaseTasksRequest.lease_duration] or the lease
	// will expire and the task will become available to be leased
	// again. After the task is acknowledged, it will not be returned
	// by a later [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks],
	// [GetTask][google.cloud.tasks.v2beta2.CloudTasks.GetTask], or
	// [ListTasks][google.cloud.tasks.v2beta2.CloudTasks.ListTasks].
	AcknowledgeTask(ctx context.Context, in *AcknowledgeTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Renew the current lease of a pull task.
	//
	// The worker can use this method to extend the lease by a new
	// duration, starting from now. The new task lease will be
	// returned in the task's [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time].
	RenewLease(ctx context.Context, in *RenewLeaseRequest, opts ...grpc.CallOption) (*Task, error)
	// Cancel a pull task's lease.
	//
	// The worker can use this method to cancel a task's lease by
	// setting its [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] to now. This will
	// make the task available to be leased to the next caller of
	// [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks].
	CancelLease(ctx context.Context, in *CancelLeaseRequest, opts ...grpc.CallOption) (*Task, error)
	// Forces a task to run now.
	//
	// When this method is called, Cloud Tasks will dispatch the task, even if
	// the task is already running, the queue has reached its [RateLimits][google.cloud.tasks.v2beta2.RateLimits] or
	// is [PAUSED][google.cloud.tasks.v2beta2.Queue.State.PAUSED].
	//
	// This command is meant to be used for manual debugging. For
	// example, [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] can be used to retry a failed
	// task after a fix has been made or to manually force a task to be
	// dispatched now.
	//
	// The dispatched task is returned. That is, the task that is returned
	// contains the [status][google.cloud.tasks.v2beta2.Task.status] after the task is dispatched but
	// before the task is received by its target.
	//
	// If Cloud Tasks receives a successful response from the task's
	// target, then the task will be deleted; otherwise the task's
	// [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] will be reset to the time that
	// [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] was called plus the retry delay specified
	// in the queue's [RetryConfig][google.cloud.tasks.v2beta2.RetryConfig].
	//
	// [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] returns
	// [NOT_FOUND][google.rpc.Code.NOT_FOUND] when it is called on a
	// task that has already succeeded or permanently failed.
	//
	// [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] cannot be called on a
	// [pull task][google.cloud.tasks.v2beta2.PullMessage].
	RunTask(ctx context.Context, in *RunTaskRequest, opts ...grpc.CallOption) (*Task, error)
}

type cloudTasksClient struct {
	cc *grpc.ClientConn
}

func NewCloudTasksClient(cc *grpc.ClientConn) CloudTasksClient {
	return &cloudTasksClient{cc}
}

func (c *cloudTasksClient) ListQueues(ctx context.Context, in *ListQueuesRequest, opts ...grpc.CallOption) (*ListQueuesResponse, error) {
	out := new(ListQueuesResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/ListQueues", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) GetQueue(ctx context.Context, in *GetQueueRequest, opts ...grpc.CallOption) (*Queue, error) {
	out := new(Queue)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/GetQueue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) CreateQueue(ctx context.Context, in *CreateQueueRequest, opts ...grpc.CallOption) (*Queue, error) {
	out := new(Queue)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/CreateQueue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) UpdateQueue(ctx context.Context, in *UpdateQueueRequest, opts ...grpc.CallOption) (*Queue, error) {
	out := new(Queue)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/UpdateQueue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) DeleteQueue(ctx context.Context, in *DeleteQueueRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/DeleteQueue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) PurgeQueue(ctx context.Context, in *PurgeQueueRequest, opts ...grpc.CallOption) (*Queue, error) {
	out := new(Queue)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/PurgeQueue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) PauseQueue(ctx context.Context, in *PauseQueueRequest, opts ...grpc.CallOption) (*Queue, error) {
	out := new(Queue)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/PauseQueue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) ResumeQueue(ctx context.Context, in *ResumeQueueRequest, opts ...grpc.CallOption) (*Queue, error) {
	out := new(Queue)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/ResumeQueue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) GetIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) {
	out := new(v1.Policy)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/GetIamPolicy", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) SetIamPolicy(ctx context.Context, in *v1.SetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) {
	out := new(v1.Policy)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/SetIamPolicy", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) TestIamPermissions(ctx context.Context, in *v1.TestIamPermissionsRequest, opts ...grpc.CallOption) (*v1.TestIamPermissionsResponse, error) {
	out := new(v1.TestIamPermissionsResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/TestIamPermissions", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) ListTasks(ctx context.Context, in *ListTasksRequest, opts ...grpc.CallOption) (*ListTasksResponse, error) {
	out := new(ListTasksResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/ListTasks", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*Task, error) {
	out := new(Task)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/GetTask", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) CreateTask(ctx context.Context, in *CreateTaskRequest, opts ...grpc.CallOption) (*Task, error) {
	out := new(Task)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/CreateTask", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) DeleteTask(ctx context.Context, in *DeleteTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/DeleteTask", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) LeaseTasks(ctx context.Context, in *LeaseTasksRequest, opts ...grpc.CallOption) (*LeaseTasksResponse, error) {
	out := new(LeaseTasksResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/LeaseTasks", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) AcknowledgeTask(ctx context.Context, in *AcknowledgeTaskRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/AcknowledgeTask", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) RenewLease(ctx context.Context, in *RenewLeaseRequest, opts ...grpc.CallOption) (*Task, error) {
	out := new(Task)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/RenewLease", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) CancelLease(ctx context.Context, in *CancelLeaseRequest, opts ...grpc.CallOption) (*Task, error) {
	out := new(Task)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/CancelLease", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *cloudTasksClient) RunTask(ctx context.Context, in *RunTaskRequest, opts ...grpc.CallOption) (*Task, error) {
	out := new(Task)
	err := c.cc.Invoke(ctx, "/google.cloud.tasks.v2beta2.CloudTasks/RunTask", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// CloudTasksServer is the server API for CloudTasks service.
type CloudTasksServer interface {
	// Lists queues.
	//
	// Queues are returned in lexicographical order.
	ListQueues(context.Context, *ListQueuesRequest) (*ListQueuesResponse, error)
	// Gets a queue.
	GetQueue(context.Context, *GetQueueRequest) (*Queue, error)
	// Creates a queue.
	//
	// Queues created with this method allow tasks to live for a maximum of 31
	// days. After a task is 31 days old, the task will be deleted regardless of whether
	// it was dispatched or not.
	//
	// WARNING: Using this method may have unintended side effects if you are
	// using an App Engine `queue.yaml` or `queue.xml` file to manage your queues.
	// Read
	// [Overview of Queue Management and queue.yaml](https://cloud.google.com/tasks/docs/queue-yaml)
	// before using this method.
	CreateQueue(context.Context, *CreateQueueRequest) (*Queue, error)
	// Updates a queue.
	//
	// This method creates the queue if it does not exist and updates
	// the queue if it does exist.
	//
	// Queues created with this method allow tasks to live for a maximum of 31
	// days. After a task is 31 days old, the task will be deleted regardless of whether
	// it was dispatched or not.
	//
	// WARNING: Using this method may have unintended side effects if you are
	// using an App Engine `queue.yaml` or `queue.xml` file to manage your queues.
	// Read
	// [Overview of Queue Management and queue.yaml](https://cloud.google.com/tasks/docs/queue-yaml)
	// before using this method.
	UpdateQueue(context.Context, *UpdateQueueRequest) (*Queue, error)
	// Deletes a queue.
	//
	// This command will delete the queue even if it has tasks in it.
	//
	// Note: If you delete a queue, a queue with the same name can't be created
	// for 7 days.
	//
	// WARNING: Using this method may have unintended side effects if you are
	// using an App Engine `queue.yaml` or `queue.xml` file to manage your queues.
	// Read
	// [Overview of Queue Management and queue.yaml](https://cloud.google.com/tasks/docs/queue-yaml)
	// before using this method.
	DeleteQueue(context.Context, *DeleteQueueRequest) (*empty.Empty, error)
	// Purges a queue by deleting all of its tasks.
	//
	// All tasks created before this method is called are permanently deleted.
	//
	// Purge operations can take up to one minute to take effect. Tasks
	// might be dispatched before the purge takes effect. A purge is irreversible.
	PurgeQueue(context.Context, *PurgeQueueRequest) (*Queue, error)
	// Pauses the queue.
	//
	// If a queue is paused then the system will stop dispatching tasks
	// until the queue is resumed via
	// [ResumeQueue][google.cloud.tasks.v2beta2.CloudTasks.ResumeQueue]. Tasks can still be added
	// when the queue is paused. A queue is paused if its
	// [state][google.cloud.tasks.v2beta2.Queue.state] is [PAUSED][google.cloud.tasks.v2beta2.Queue.State.PAUSED].
	PauseQueue(context.Context, *PauseQueueRequest) (*Queue, error)
	// Resume a queue.
	//
	// This method resumes a queue after it has been
	// [PAUSED][google.cloud.tasks.v2beta2.Queue.State.PAUSED] or
	// [DISABLED][google.cloud.tasks.v2beta2.Queue.State.DISABLED]. The state of a queue is stored
	// in the queue's [state][google.cloud.tasks.v2beta2.Queue.state]; after calling this method it
	// will be set to [RUNNING][google.cloud.tasks.v2beta2.Queue.State.RUNNING].
	//
	// WARNING: Resuming many high-QPS queues at the same time can
	// lead to target overloading. If you are resuming high-QPS
	// queues, follow the 500/50/5 pattern described in
	// [Managing Cloud Tasks Scaling Risks](https://cloud.google.com/tasks/docs/manage-cloud-task-scaling).
	ResumeQueue(context.Context, *ResumeQueueRequest) (*Queue, error)
	// Gets the access control policy for a [Queue][google.cloud.tasks.v2beta2.Queue].
	// Returns an empty policy if the resource exists and does not have a policy
	// set.
	//
	// Authorization requires the following
	// [Google IAM](https://cloud.google.com/iam) permission on the specified
	// resource parent:
	//
	// * `cloudtasks.queues.getIamPolicy`
	GetIamPolicy(context.Context, *v1.GetIamPolicyRequest) (*v1.Policy, error)
	// Sets the access control policy for a [Queue][google.cloud.tasks.v2beta2.Queue]. Replaces any existing
	// policy.
	//
	// Note: The Cloud Console does not check queue-level IAM permissions yet.
	// Project-level permissions are required to use the Cloud Console.
	//
	// Authorization requires the following
	// [Google IAM](https://cloud.google.com/iam) permission on the specified
	// resource parent:
	//
	// * `cloudtasks.queues.setIamPolicy`
	SetIamPolicy(context.Context, *v1.SetIamPolicyRequest) (*v1.Policy, error)
	// Returns permissions that a caller has on a [Queue][google.cloud.tasks.v2beta2.Queue].
	// If the resource does not exist, this will return an empty set of
	// permissions, not a [NOT_FOUND][google.rpc.Code.NOT_FOUND] error.
	//
	// Note: This operation is designed to be used for building permission-aware
	// UIs and command-line tools, not for authorization checking. This operation
	// may "fail open" without warning.
	TestIamPermissions(context.Context, *v1.TestIamPermissionsRequest) (*v1.TestIamPermissionsResponse, error)
	// Lists the tasks in a queue.
	//
	// By default, only the [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC] view is retrieved
	// due to performance considerations;
	// [response_view][google.cloud.tasks.v2beta2.ListTasksRequest.response_view] controls the
	// subset of information which is returned.
	//
	// The tasks may be returned in any order. The ordering may change at any
	// time.
	ListTasks(context.Context, *ListTasksRequest) (*ListTasksResponse, error)
	// Gets a task.
	GetTask(context.Context, *GetTaskRequest) (*Task, error)
	// Creates a task and adds it to a queue.
	//
	// Tasks cannot be updated after creation; there is no UpdateTask command.
	//
	// * For [App Engine queues][google.cloud.tasks.v2beta2.AppEngineHttpTarget], the maximum task size is
	//   100KB.
	// * For [pull queues][google.cloud.tasks.v2beta2.PullTarget], the maximum task size is 1MB.
	CreateTask(context.Context, *CreateTaskRequest) (*Task, error)
	// Deletes a task.
	//
	// A task can be deleted if it is scheduled or dispatched. A task
	// cannot be deleted if it has completed successfully or permanently
	// failed.
	DeleteTask(context.Context, *DeleteTaskRequest) (*empty.Empty, error)
	// Leases tasks from a pull queue for
	// [lease_duration][google.cloud.tasks.v2beta2.LeaseTasksRequest.lease_duration].
	//
	// This method is invoked by the worker to obtain a lease. The
	// worker must acknowledge the task via
	// [AcknowledgeTask][google.cloud.tasks.v2beta2.CloudTasks.AcknowledgeTask] after they have
	// performed the work associated with the task.
	//
	// The [payload][google.cloud.tasks.v2beta2.PullMessage.payload] is intended to store data that
	// the worker needs to perform the work associated with the task. To
	// return the payloads in the [response][google.cloud.tasks.v2beta2.LeaseTasksResponse], set
	// [response_view][google.cloud.tasks.v2beta2.LeaseTasksRequest.response_view] to
	// [FULL][google.cloud.tasks.v2beta2.Task.View.FULL].
	//
	// A maximum of 10 qps of [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks]
	// requests are allowed per
	// queue. [RESOURCE_EXHAUSTED][google.rpc.Code.RESOURCE_EXHAUSTED]
	// is returned when this limit is
	// exceeded. [RESOURCE_EXHAUSTED][google.rpc.Code.RESOURCE_EXHAUSTED]
	// is also returned when
	// [max_tasks_dispatched_per_second][google.cloud.tasks.v2beta2.RateLimits.max_tasks_dispatched_per_second]
	// is exceeded.
	LeaseTasks(context.Context, *LeaseTasksRequest) (*LeaseTasksResponse, error)
	// Acknowledges a pull task.
	//
	// The worker, that is, the entity that
	// [leased][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks] this task must call this method
	// to indicate that the work associated with the task has finished.
	//
	// The worker must acknowledge a task within the
	// [lease_duration][google.cloud.tasks.v2beta2.LeaseTasksRequest.lease_duration] or the lease
	// will expire and the task will become available to be leased
	// again. After the task is acknowledged, it will not be returned
	// by a later [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks],
	// [GetTask][google.cloud.tasks.v2beta2.CloudTasks.GetTask], or
	// [ListTasks][google.cloud.tasks.v2beta2.CloudTasks.ListTasks].
	AcknowledgeTask(context.Context, *AcknowledgeTaskRequest) (*empty.Empty, error)
	// Renew the current lease of a pull task.
	//
	// The worker can use this method to extend the lease by a new
	// duration, starting from now. The new task lease will be
	// returned in the task's [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time].
	RenewLease(context.Context, *RenewLeaseRequest) (*Task, error)
	// Cancel a pull task's lease.
	//
	// The worker can use this method to cancel a task's lease by
	// setting its [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] to now. This will
	// make the task available to be leased to the next caller of
	// [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks].
	CancelLease(context.Context, *CancelLeaseRequest) (*Task, error)
	// Forces a task to run now.
	//
	// When this method is called, Cloud Tasks will dispatch the task, even if
	// the task is already running, the queue has reached its [RateLimits][google.cloud.tasks.v2beta2.RateLimits] or
	// is [PAUSED][google.cloud.tasks.v2beta2.Queue.State.PAUSED].
	//
	// This command is meant to be used for manual debugging. For
	// example, [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] can be used to retry a failed
	// task after a fix has been made or to manually force a task to be
	// dispatched now.
	//
	// The dispatched task is returned. That is, the task that is returned
	// contains the [status][google.cloud.tasks.v2beta2.Task.status] after the task is dispatched but
	// before the task is received by its target.
	//
	// If Cloud Tasks receives a successful response from the task's
	// target, then the task will be deleted; otherwise the task's
	// [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] will be reset to the time that
	// [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] was called plus the retry delay specified
	// in the queue's [RetryConfig][google.cloud.tasks.v2beta2.RetryConfig].
	//
	// [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] returns
	// [NOT_FOUND][google.rpc.Code.NOT_FOUND] when it is called on a
	// task that has already succeeded or permanently failed.
	//
	// [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] cannot be called on a
	// [pull task][google.cloud.tasks.v2beta2.PullMessage].
	RunTask(context.Context, *RunTaskRequest) (*Task, error)
}

func RegisterCloudTasksServer(s *grpc.Server, srv CloudTasksServer) {
	s.RegisterService(&_CloudTasks_serviceDesc, srv)
}

func _CloudTasks_ListQueues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListQueuesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).ListQueues(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/ListQueues",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).ListQueues(ctx, req.(*ListQueuesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_GetQueue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetQueueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).GetQueue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/GetQueue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).GetQueue(ctx, req.(*GetQueueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_CreateQueue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateQueueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).CreateQueue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/CreateQueue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).CreateQueue(ctx, req.(*CreateQueueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_UpdateQueue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateQueueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).UpdateQueue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/UpdateQueue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).UpdateQueue(ctx, req.(*UpdateQueueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_DeleteQueue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteQueueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).DeleteQueue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/DeleteQueue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).DeleteQueue(ctx, req.(*DeleteQueueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_PurgeQueue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PurgeQueueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).PurgeQueue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/PurgeQueue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).PurgeQueue(ctx, req.(*PurgeQueueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_PauseQueue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PauseQueueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).PauseQueue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/PauseQueue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).PauseQueue(ctx, req.(*PauseQueueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_ResumeQueue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ResumeQueueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).ResumeQueue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/ResumeQueue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).ResumeQueue(ctx, req.(*ResumeQueueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(v1.GetIamPolicyRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).GetIamPolicy(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/GetIamPolicy",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).GetIamPolicy(ctx, req.(*v1.GetIamPolicyRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(v1.SetIamPolicyRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).SetIamPolicy(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/SetIamPolicy",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).SetIamPolicy(ctx, req.(*v1.SetIamPolicyRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(v1.TestIamPermissionsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).TestIamPermissions(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/TestIamPermissions",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).TestIamPermissions(ctx, req.(*v1.TestIamPermissionsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_ListTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListTasksRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).ListTasks(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/ListTasks",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).ListTasks(ctx, req.(*ListTasksRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetTaskRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).GetTask(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/GetTask",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).GetTask(ctx, req.(*GetTaskRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_CreateTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateTaskRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).CreateTask(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/CreateTask",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).CreateTask(ctx, req.(*CreateTaskRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_DeleteTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteTaskRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).DeleteTask(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/DeleteTask",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).DeleteTask(ctx, req.(*DeleteTaskRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_LeaseTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(LeaseTasksRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).LeaseTasks(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/LeaseTasks",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).LeaseTasks(ctx, req.(*LeaseTasksRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_AcknowledgeTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AcknowledgeTaskRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).AcknowledgeTask(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/AcknowledgeTask",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).AcknowledgeTask(ctx, req.(*AcknowledgeTaskRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_RenewLease_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(RenewLeaseRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).RenewLease(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/RenewLease",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).RenewLease(ctx, req.(*RenewLeaseRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_CancelLease_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CancelLeaseRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).CancelLease(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/CancelLease",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).CancelLease(ctx, req.(*CancelLeaseRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CloudTasks_RunTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(RunTaskRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CloudTasksServer).RunTask(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.tasks.v2beta2.CloudTasks/RunTask",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CloudTasksServer).RunTask(ctx, req.(*RunTaskRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _CloudTasks_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.cloud.tasks.v2beta2.CloudTasks",
	HandlerType: (*CloudTasksServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "ListQueues",
			Handler:    _CloudTasks_ListQueues_Handler,
		},
		{
			MethodName: "GetQueue",
			Handler:    _CloudTasks_GetQueue_Handler,
		},
		{
			MethodName: "CreateQueue",
			Handler:    _CloudTasks_CreateQueue_Handler,
		},
		{
			MethodName: "UpdateQueue",
			Handler:    _CloudTasks_UpdateQueue_Handler,
		},
		{
			MethodName: "DeleteQueue",
			Handler:    _CloudTasks_DeleteQueue_Handler,
		},
		{
			MethodName: "PurgeQueue",
			Handler:    _CloudTasks_PurgeQueue_Handler,
		},
		{
			MethodName: "PauseQueue",
			Handler:    _CloudTasks_PauseQueue_Handler,
		},
		{
			MethodName: "ResumeQueue",
			Handler:    _CloudTasks_ResumeQueue_Handler,
		},
		{
			MethodName: "GetIamPolicy",
			Handler:    _CloudTasks_GetIamPolicy_Handler,
		},
		{
			MethodName: "SetIamPolicy",
			Handler:    _CloudTasks_SetIamPolicy_Handler,
		},
		{
			MethodName: "TestIamPermissions",
			Handler:    _CloudTasks_TestIamPermissions_Handler,
		},
		{
			MethodName: "ListTasks",
			Handler:    _CloudTasks_ListTasks_Handler,
		},
		{
			MethodName: "GetTask",
			Handler:    _CloudTasks_GetTask_Handler,
		},
		{
			MethodName: "CreateTask",
			Handler:    _CloudTasks_CreateTask_Handler,
		},
		{
			MethodName: "DeleteTask",
			Handler:    _CloudTasks_DeleteTask_Handler,
		},
		{
			MethodName: "LeaseTasks",
			Handler:    _CloudTasks_LeaseTasks_Handler,
		},
		{
			MethodName: "AcknowledgeTask",
			Handler:    _CloudTasks_AcknowledgeTask_Handler,
		},
		{
			MethodName: "RenewLease",
			Handler:    _CloudTasks_RenewLease_Handler,
		},
		{
			MethodName: "CancelLease",
			Handler:    _CloudTasks_CancelLease_Handler,
		},
		{
			MethodName: "RunTask",
			Handler:    _CloudTasks_RunTask_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/cloud/tasks/v2beta2/cloudtasks.proto",
}
