// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v2/services/keyword_plan_keyword_service.proto

package services

import (
	context "context"
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	resources "google.golang.org/genproto/googleapis/ads/googleads/v2/resources"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	status "google.golang.org/genproto/googleapis/rpc/status"
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status1 "google.golang.org/grpc/status"
)

// 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.ProtoPackageIsVersion3 // please upgrade the proto package

// Request message for [KeywordPlanKeywordService.GetKeywordPlanKeyword][google.ads.googleads.v2.services.KeywordPlanKeywordService.GetKeywordPlanKeyword].
type GetKeywordPlanKeywordRequest struct {
	// Required. The resource name of the ad group keyword to fetch.
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetKeywordPlanKeywordRequest proto.InternalMessageInfo

func (m *GetKeywordPlanKeywordRequest) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

// Request message for [KeywordPlanKeywordService.MutateKeywordPlanKeywords][google.ads.googleads.v2.services.KeywordPlanKeywordService.MutateKeywordPlanKeywords].
type MutateKeywordPlanKeywordsRequest struct {
	// Required. The ID of the customer whose Keyword Plan keywords are being modified.
	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
	// Required. The list of operations to perform on individual Keyword Plan keywords.
	Operations []*KeywordPlanKeywordOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
	// If true, successful operations will be carried out and invalid
	// operations will return errors. If false, all operations will be carried
	// out in one transaction if and only if they are all valid.
	// Default is false.
	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
	// If true, the request is validated but not executed. Only errors are
	// returned, not results.
	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MutateKeywordPlanKeywordsRequest proto.InternalMessageInfo

func (m *MutateKeywordPlanKeywordsRequest) GetCustomerId() string {
	if m != nil {
		return m.CustomerId
	}
	return ""
}

func (m *MutateKeywordPlanKeywordsRequest) GetOperations() []*KeywordPlanKeywordOperation {
	if m != nil {
		return m.Operations
	}
	return nil
}

func (m *MutateKeywordPlanKeywordsRequest) GetPartialFailure() bool {
	if m != nil {
		return m.PartialFailure
	}
	return false
}

func (m *MutateKeywordPlanKeywordsRequest) GetValidateOnly() bool {
	if m != nil {
		return m.ValidateOnly
	}
	return false
}

// A single operation (create, update, remove) on a Keyword Plan keyword.
type KeywordPlanKeywordOperation struct {
	// The FieldMask that determines which resource fields are modified in an
	// update.
	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	// The mutate operation.
	//
	// Types that are valid to be assigned to Operation:
	//	*KeywordPlanKeywordOperation_Create
	//	*KeywordPlanKeywordOperation_Update
	//	*KeywordPlanKeywordOperation_Remove
	Operation            isKeywordPlanKeywordOperation_Operation `protobuf_oneof:"operation"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

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

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

var xxx_messageInfo_KeywordPlanKeywordOperation proto.InternalMessageInfo

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

type isKeywordPlanKeywordOperation_Operation interface {
	isKeywordPlanKeywordOperation_Operation()
}

type KeywordPlanKeywordOperation_Create struct {
	Create *resources.KeywordPlanKeyword `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
}

type KeywordPlanKeywordOperation_Update struct {
	Update *resources.KeywordPlanKeyword `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
}

type KeywordPlanKeywordOperation_Remove struct {
	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
}

func (*KeywordPlanKeywordOperation_Create) isKeywordPlanKeywordOperation_Operation() {}

func (*KeywordPlanKeywordOperation_Update) isKeywordPlanKeywordOperation_Operation() {}

func (*KeywordPlanKeywordOperation_Remove) isKeywordPlanKeywordOperation_Operation() {}

func (m *KeywordPlanKeywordOperation) GetOperation() isKeywordPlanKeywordOperation_Operation {
	if m != nil {
		return m.Operation
	}
	return nil
}

func (m *KeywordPlanKeywordOperation) GetCreate() *resources.KeywordPlanKeyword {
	if x, ok := m.GetOperation().(*KeywordPlanKeywordOperation_Create); ok {
		return x.Create
	}
	return nil
}

func (m *KeywordPlanKeywordOperation) GetUpdate() *resources.KeywordPlanKeyword {
	if x, ok := m.GetOperation().(*KeywordPlanKeywordOperation_Update); ok {
		return x.Update
	}
	return nil
}

func (m *KeywordPlanKeywordOperation) GetRemove() string {
	if x, ok := m.GetOperation().(*KeywordPlanKeywordOperation_Remove); ok {
		return x.Remove
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*KeywordPlanKeywordOperation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*KeywordPlanKeywordOperation_Create)(nil),
		(*KeywordPlanKeywordOperation_Update)(nil),
		(*KeywordPlanKeywordOperation_Remove)(nil),
	}
}

// Response message for a Keyword Plan keyword mutate.
type MutateKeywordPlanKeywordsResponse struct {
	// Errors that pertain to operation failures in the partial failure mode.
	// Returned only when partial_failure = true and all errors occur inside the
	// operations. If any errors occur outside the operations (e.g. auth errors),
	// we return an RPC level error.
	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
	// All results for the mutate.
	Results              []*MutateKeywordPlanKeywordResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

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

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

var xxx_messageInfo_MutateKeywordPlanKeywordsResponse proto.InternalMessageInfo

func (m *MutateKeywordPlanKeywordsResponse) GetPartialFailureError() *status.Status {
	if m != nil {
		return m.PartialFailureError
	}
	return nil
}

func (m *MutateKeywordPlanKeywordsResponse) GetResults() []*MutateKeywordPlanKeywordResult {
	if m != nil {
		return m.Results
	}
	return nil
}

// The result for the Keyword Plan keyword mutate.
type MutateKeywordPlanKeywordResult struct {
	// Returned for successful operations.
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MutateKeywordPlanKeywordResult proto.InternalMessageInfo

func (m *MutateKeywordPlanKeywordResult) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func init() {
	proto.RegisterType((*GetKeywordPlanKeywordRequest)(nil), "google.ads.googleads.v2.services.GetKeywordPlanKeywordRequest")
	proto.RegisterType((*MutateKeywordPlanKeywordsRequest)(nil), "google.ads.googleads.v2.services.MutateKeywordPlanKeywordsRequest")
	proto.RegisterType((*KeywordPlanKeywordOperation)(nil), "google.ads.googleads.v2.services.KeywordPlanKeywordOperation")
	proto.RegisterType((*MutateKeywordPlanKeywordsResponse)(nil), "google.ads.googleads.v2.services.MutateKeywordPlanKeywordsResponse")
	proto.RegisterType((*MutateKeywordPlanKeywordResult)(nil), "google.ads.googleads.v2.services.MutateKeywordPlanKeywordResult")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v2/services/keyword_plan_keyword_service.proto", fileDescriptor_ec3e8b0b40b90dff)
}

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

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

// 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.SupportPackageIsVersion6

// KeywordPlanKeywordServiceClient is the client API for KeywordPlanKeywordService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type KeywordPlanKeywordServiceClient interface {
	// Returns the requested Keyword Plan keyword in full detail.
	GetKeywordPlanKeyword(ctx context.Context, in *GetKeywordPlanKeywordRequest, opts ...grpc.CallOption) (*resources.KeywordPlanKeyword, error)
	// Creates, updates, or removes Keyword Plan keywords. Operation statuses are
	// returned.
	MutateKeywordPlanKeywords(ctx context.Context, in *MutateKeywordPlanKeywordsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanKeywordsResponse, error)
}

type keywordPlanKeywordServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewKeywordPlanKeywordServiceClient(cc grpc.ClientConnInterface) KeywordPlanKeywordServiceClient {
	return &keywordPlanKeywordServiceClient{cc}
}

func (c *keywordPlanKeywordServiceClient) GetKeywordPlanKeyword(ctx context.Context, in *GetKeywordPlanKeywordRequest, opts ...grpc.CallOption) (*resources.KeywordPlanKeyword, error) {
	out := new(resources.KeywordPlanKeyword)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v2.services.KeywordPlanKeywordService/GetKeywordPlanKeyword", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *keywordPlanKeywordServiceClient) MutateKeywordPlanKeywords(ctx context.Context, in *MutateKeywordPlanKeywordsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanKeywordsResponse, error) {
	out := new(MutateKeywordPlanKeywordsResponse)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v2.services.KeywordPlanKeywordService/MutateKeywordPlanKeywords", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// KeywordPlanKeywordServiceServer is the server API for KeywordPlanKeywordService service.
type KeywordPlanKeywordServiceServer interface {
	// Returns the requested Keyword Plan keyword in full detail.
	GetKeywordPlanKeyword(context.Context, *GetKeywordPlanKeywordRequest) (*resources.KeywordPlanKeyword, error)
	// Creates, updates, or removes Keyword Plan keywords. Operation statuses are
	// returned.
	MutateKeywordPlanKeywords(context.Context, *MutateKeywordPlanKeywordsRequest) (*MutateKeywordPlanKeywordsResponse, error)
}

// UnimplementedKeywordPlanKeywordServiceServer can be embedded to have forward compatible implementations.
type UnimplementedKeywordPlanKeywordServiceServer struct {
}

func (*UnimplementedKeywordPlanKeywordServiceServer) GetKeywordPlanKeyword(ctx context.Context, req *GetKeywordPlanKeywordRequest) (*resources.KeywordPlanKeyword, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetKeywordPlanKeyword not implemented")
}
func (*UnimplementedKeywordPlanKeywordServiceServer) MutateKeywordPlanKeywords(ctx context.Context, req *MutateKeywordPlanKeywordsRequest) (*MutateKeywordPlanKeywordsResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method MutateKeywordPlanKeywords not implemented")
}

func RegisterKeywordPlanKeywordServiceServer(s *grpc.Server, srv KeywordPlanKeywordServiceServer) {
	s.RegisterService(&_KeywordPlanKeywordService_serviceDesc, srv)
}

func _KeywordPlanKeywordService_GetKeywordPlanKeyword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetKeywordPlanKeywordRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(KeywordPlanKeywordServiceServer).GetKeywordPlanKeyword(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v2.services.KeywordPlanKeywordService/GetKeywordPlanKeyword",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(KeywordPlanKeywordServiceServer).GetKeywordPlanKeyword(ctx, req.(*GetKeywordPlanKeywordRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _KeywordPlanKeywordService_MutateKeywordPlanKeywords_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(MutateKeywordPlanKeywordsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(KeywordPlanKeywordServiceServer).MutateKeywordPlanKeywords(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v2.services.KeywordPlanKeywordService/MutateKeywordPlanKeywords",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(KeywordPlanKeywordServiceServer).MutateKeywordPlanKeywords(ctx, req.(*MutateKeywordPlanKeywordsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _KeywordPlanKeywordService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v2.services.KeywordPlanKeywordService",
	HandlerType: (*KeywordPlanKeywordServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetKeywordPlanKeyword",
			Handler:    _KeywordPlanKeywordService_GetKeywordPlanKeyword_Handler,
		},
		{
			MethodName: "MutateKeywordPlanKeywords",
			Handler:    _KeywordPlanKeywordService_MutateKeywordPlanKeywords_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v2/services/keyword_plan_keyword_service.proto",
}
