// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/common/custom_parameter.proto

package common

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

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

// A mapping that can be used by custom parameter tags in a
// `tracking_url_template`, `final_urls`, or `mobile_final_urls`.
type CustomParameter struct {
	// The key matching the parameter tag name.
	Key *wrappers.StringValue `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	// The value to be substituted.
	Value                *wrappers.StringValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_CustomParameter proto.InternalMessageInfo

func (m *CustomParameter) GetKey() *wrappers.StringValue {
	if m != nil {
		return m.Key
	}
	return nil
}

func (m *CustomParameter) GetValue() *wrappers.StringValue {
	if m != nil {
		return m.Value
	}
	return nil
}

func init() {
	proto.RegisterType((*CustomParameter)(nil), "google.ads.googleads.v3.common.CustomParameter")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/common/custom_parameter.proto", fileDescriptor_cab50381e27619f9)
}

var fileDescriptor_cab50381e27619f9 = []byte{
	// 300 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0xc1, 0x4a, 0xc4, 0x30,
	0x10, 0x86, 0x69, 0x17, 0x3d, 0xd4, 0x83, 0xb0, 0x78, 0x58, 0x96, 0x65, 0x91, 0x3d, 0x79, 0x9a,
	0xc0, 0x06, 0x2f, 0xf1, 0xd4, 0x5d, 0x61, 0xaf, 0x45, 0xa1, 0x07, 0x29, 0x48, 0xb6, 0x8d, 0xa1,
	0xd8, 0x66, 0x42, 0x92, 0x56, 0x7c, 0x1d, 0x8f, 0x3e, 0x8a, 0x8f, 0xe2, 0xc5, 0x57, 0x90, 0x36,
	0x6d, 0x0f, 0x82, 0xe2, 0x29, 0x7f, 0x32, 0xdf, 0x3f, 0xff, 0x64, 0xa2, 0x6b, 0x89, 0x28, 0x2b,
	0x41, 0x78, 0x61, 0x89, 0x97, 0x9d, 0x6a, 0x29, 0xc9, 0xb1, 0xae, 0x51, 0x91, 0xbc, 0xb1, 0x0e,
	0xeb, 0x47, 0xcd, 0x0d, 0xaf, 0x85, 0x13, 0x06, 0xb4, 0x41, 0x87, 0xf3, 0xb5, 0x67, 0x81, 0x17,
	0x16, 0x26, 0x1b, 0xb4, 0x14, 0xbc, 0x6d, 0x39, 0xd4, 0x49, 0x4f, 0x1f, 0x9b, 0x27, 0xf2, 0x62,
	0xb8, 0xd6, 0xc2, 0x58, 0xef, 0x5f, 0xae, 0xc6, 0x58, 0x5d, 0x12, 0xae, 0x14, 0x3a, 0xee, 0x4a,
	0x54, 0x43, 0x75, 0xd3, 0x44, 0xe7, 0xfb, 0x3e, 0x37, 0x19, 0x63, 0xe7, 0x10, 0xcd, 0x9e, 0xc5,
	0xeb, 0x22, 0xb8, 0x0c, 0xae, 0xce, 0xb6, 0xab, 0x21, 0x13, 0xc6, 0xf6, 0x70, 0xef, 0x4c, 0xa9,
	0x64, 0xca, 0xab, 0x46, 0xdc, 0x75, 0xe0, 0x7c, 0x1b, 0x9d, 0xb4, 0xdd, 0x6d, 0x11, 0xfe, 0xc3,
	0xe1, 0xd1, 0xdd, 0x57, 0x10, 0x6d, 0x72, 0xac, 0xe1, 0xef, 0xbf, 0xed, 0x2e, 0x7e, 0xcc, 0x96,
	0x74, 0x2d, 0x93, 0xe0, 0xe1, 0x76, 0xf0, 0x49, 0xac, 0xb8, 0x92, 0x80, 0x46, 0x12, 0x29, 0x54,
	0x1f, 0x38, 0xae, 0x56, 0x97, 0xf6, 0xb7, 0x4d, 0xdf, 0xf8, 0xe3, 0x2d, 0x9c, 0x1d, 0xe2, 0xf8,
	0x3d, 0x5c, 0x1f, 0x7c, 0xb3, 0xb8, 0xb0, 0xe0, 0x65, 0xa7, 0x52, 0x0a, 0xfb, 0x1e, 0xfb, 0x18,
	0x81, 0x2c, 0x2e, 0x6c, 0x36, 0x01, 0x59, 0x4a, 0x33, 0x0f, 0x7c, 0x86, 0x1b, 0xff, 0xca, 0x58,
	0x5c, 0x58, 0xc6, 0x26, 0x84, 0xb1, 0x94, 0x32, 0xe6, 0xa1, 0xe3, 0x69, 0x3f, 0x1d, 0xfd, 0x0e,
	0x00, 0x00, 0xff, 0xff, 0x1c, 0xe6, 0xc6, 0xe8, 0x06, 0x02, 0x00, 0x00,
}
