// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google.golang.org/appengine/internal/memcache/memcache_service.proto

package memcache

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import 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

type MemcacheServiceError_ErrorCode int32

const (
	MemcacheServiceError_OK                MemcacheServiceError_ErrorCode = 0
	MemcacheServiceError_UNSPECIFIED_ERROR MemcacheServiceError_ErrorCode = 1
	MemcacheServiceError_NAMESPACE_NOT_SET MemcacheServiceError_ErrorCode = 2
	MemcacheServiceError_PERMISSION_DENIED MemcacheServiceError_ErrorCode = 3
	MemcacheServiceError_INVALID_VALUE     MemcacheServiceError_ErrorCode = 6
)

var MemcacheServiceError_ErrorCode_name = map[int32]string{
	0: "OK",
	1: "UNSPECIFIED_ERROR",
	2: "NAMESPACE_NOT_SET",
	3: "PERMISSION_DENIED",
	6: "INVALID_VALUE",
}
var MemcacheServiceError_ErrorCode_value = map[string]int32{
	"OK":                0,
	"UNSPECIFIED_ERROR": 1,
	"NAMESPACE_NOT_SET": 2,
	"PERMISSION_DENIED": 3,
	"INVALID_VALUE":     6,
}

func (x MemcacheServiceError_ErrorCode) Enum() *MemcacheServiceError_ErrorCode {
	p := new(MemcacheServiceError_ErrorCode)
	*p = x
	return p
}
func (x MemcacheServiceError_ErrorCode) String() string {
	return proto.EnumName(MemcacheServiceError_ErrorCode_name, int32(x))
}
func (x *MemcacheServiceError_ErrorCode) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(MemcacheServiceError_ErrorCode_value, data, "MemcacheServiceError_ErrorCode")
	if err != nil {
		return err
	}
	*x = MemcacheServiceError_ErrorCode(value)
	return nil
}
func (MemcacheServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{0, 0}
}

type MemcacheSetRequest_SetPolicy int32

const (
	MemcacheSetRequest_SET     MemcacheSetRequest_SetPolicy = 1
	MemcacheSetRequest_ADD     MemcacheSetRequest_SetPolicy = 2
	MemcacheSetRequest_REPLACE MemcacheSetRequest_SetPolicy = 3
	MemcacheSetRequest_CAS     MemcacheSetRequest_SetPolicy = 4
)

var MemcacheSetRequest_SetPolicy_name = map[int32]string{
	1: "SET",
	2: "ADD",
	3: "REPLACE",
	4: "CAS",
}
var MemcacheSetRequest_SetPolicy_value = map[string]int32{
	"SET":     1,
	"ADD":     2,
	"REPLACE": 3,
	"CAS":     4,
}

func (x MemcacheSetRequest_SetPolicy) Enum() *MemcacheSetRequest_SetPolicy {
	p := new(MemcacheSetRequest_SetPolicy)
	*p = x
	return p
}
func (x MemcacheSetRequest_SetPolicy) String() string {
	return proto.EnumName(MemcacheSetRequest_SetPolicy_name, int32(x))
}
func (x *MemcacheSetRequest_SetPolicy) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(MemcacheSetRequest_SetPolicy_value, data, "MemcacheSetRequest_SetPolicy")
	if err != nil {
		return err
	}
	*x = MemcacheSetRequest_SetPolicy(value)
	return nil
}
func (MemcacheSetRequest_SetPolicy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{4, 0}
}

type MemcacheSetResponse_SetStatusCode int32

const (
	MemcacheSetResponse_STORED     MemcacheSetResponse_SetStatusCode = 1
	MemcacheSetResponse_NOT_STORED MemcacheSetResponse_SetStatusCode = 2
	MemcacheSetResponse_ERROR      MemcacheSetResponse_SetStatusCode = 3
	MemcacheSetResponse_EXISTS     MemcacheSetResponse_SetStatusCode = 4
)

var MemcacheSetResponse_SetStatusCode_name = map[int32]string{
	1: "STORED",
	2: "NOT_STORED",
	3: "ERROR",
	4: "EXISTS",
}
var MemcacheSetResponse_SetStatusCode_value = map[string]int32{
	"STORED":     1,
	"NOT_STORED": 2,
	"ERROR":      3,
	"EXISTS":     4,
}

func (x MemcacheSetResponse_SetStatusCode) Enum() *MemcacheSetResponse_SetStatusCode {
	p := new(MemcacheSetResponse_SetStatusCode)
	*p = x
	return p
}
func (x MemcacheSetResponse_SetStatusCode) String() string {
	return proto.EnumName(MemcacheSetResponse_SetStatusCode_name, int32(x))
}
func (x *MemcacheSetResponse_SetStatusCode) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(MemcacheSetResponse_SetStatusCode_value, data, "MemcacheSetResponse_SetStatusCode")
	if err != nil {
		return err
	}
	*x = MemcacheSetResponse_SetStatusCode(value)
	return nil
}
func (MemcacheSetResponse_SetStatusCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{5, 0}
}

type MemcacheDeleteResponse_DeleteStatusCode int32

const (
	MemcacheDeleteResponse_DELETED   MemcacheDeleteResponse_DeleteStatusCode = 1
	MemcacheDeleteResponse_NOT_FOUND MemcacheDeleteResponse_DeleteStatusCode = 2
)

var MemcacheDeleteResponse_DeleteStatusCode_name = map[int32]string{
	1: "DELETED",
	2: "NOT_FOUND",
}
var MemcacheDeleteResponse_DeleteStatusCode_value = map[string]int32{
	"DELETED":   1,
	"NOT_FOUND": 2,
}

func (x MemcacheDeleteResponse_DeleteStatusCode) Enum() *MemcacheDeleteResponse_DeleteStatusCode {
	p := new(MemcacheDeleteResponse_DeleteStatusCode)
	*p = x
	return p
}
func (x MemcacheDeleteResponse_DeleteStatusCode) String() string {
	return proto.EnumName(MemcacheDeleteResponse_DeleteStatusCode_name, int32(x))
}
func (x *MemcacheDeleteResponse_DeleteStatusCode) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(MemcacheDeleteResponse_DeleteStatusCode_value, data, "MemcacheDeleteResponse_DeleteStatusCode")
	if err != nil {
		return err
	}
	*x = MemcacheDeleteResponse_DeleteStatusCode(value)
	return nil
}
func (MemcacheDeleteResponse_DeleteStatusCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{7, 0}
}

type MemcacheIncrementRequest_Direction int32

const (
	MemcacheIncrementRequest_INCREMENT MemcacheIncrementRequest_Direction = 1
	MemcacheIncrementRequest_DECREMENT MemcacheIncrementRequest_Direction = 2
)

var MemcacheIncrementRequest_Direction_name = map[int32]string{
	1: "INCREMENT",
	2: "DECREMENT",
}
var MemcacheIncrementRequest_Direction_value = map[string]int32{
	"INCREMENT": 1,
	"DECREMENT": 2,
}

func (x MemcacheIncrementRequest_Direction) Enum() *MemcacheIncrementRequest_Direction {
	p := new(MemcacheIncrementRequest_Direction)
	*p = x
	return p
}
func (x MemcacheIncrementRequest_Direction) String() string {
	return proto.EnumName(MemcacheIncrementRequest_Direction_name, int32(x))
}
func (x *MemcacheIncrementRequest_Direction) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(MemcacheIncrementRequest_Direction_value, data, "MemcacheIncrementRequest_Direction")
	if err != nil {
		return err
	}
	*x = MemcacheIncrementRequest_Direction(value)
	return nil
}
func (MemcacheIncrementRequest_Direction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{8, 0}
}

type MemcacheIncrementResponse_IncrementStatusCode int32

const (
	MemcacheIncrementResponse_OK          MemcacheIncrementResponse_IncrementStatusCode = 1
	MemcacheIncrementResponse_NOT_CHANGED MemcacheIncrementResponse_IncrementStatusCode = 2
	MemcacheIncrementResponse_ERROR       MemcacheIncrementResponse_IncrementStatusCode = 3
)

var MemcacheIncrementResponse_IncrementStatusCode_name = map[int32]string{
	1: "OK",
	2: "NOT_CHANGED",
	3: "ERROR",
}
var MemcacheIncrementResponse_IncrementStatusCode_value = map[string]int32{
	"OK":          1,
	"NOT_CHANGED": 2,
	"ERROR":       3,
}

func (x MemcacheIncrementResponse_IncrementStatusCode) Enum() *MemcacheIncrementResponse_IncrementStatusCode {
	p := new(MemcacheIncrementResponse_IncrementStatusCode)
	*p = x
	return p
}
func (x MemcacheIncrementResponse_IncrementStatusCode) String() string {
	return proto.EnumName(MemcacheIncrementResponse_IncrementStatusCode_name, int32(x))
}
func (x *MemcacheIncrementResponse_IncrementStatusCode) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(MemcacheIncrementResponse_IncrementStatusCode_value, data, "MemcacheIncrementResponse_IncrementStatusCode")
	if err != nil {
		return err
	}
	*x = MemcacheIncrementResponse_IncrementStatusCode(value)
	return nil
}
func (MemcacheIncrementResponse_IncrementStatusCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{9, 0}
}

type MemcacheServiceError struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MemcacheServiceError) Reset()         { *m = MemcacheServiceError{} }
func (m *MemcacheServiceError) String() string { return proto.CompactTextString(m) }
func (*MemcacheServiceError) ProtoMessage()    {}
func (*MemcacheServiceError) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{0}
}
func (m *MemcacheServiceError) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheServiceError.Unmarshal(m, b)
}
func (m *MemcacheServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheServiceError.Marshal(b, m, deterministic)
}
func (dst *MemcacheServiceError) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheServiceError.Merge(dst, src)
}
func (m *MemcacheServiceError) XXX_Size() int {
	return xxx_messageInfo_MemcacheServiceError.Size(m)
}
func (m *MemcacheServiceError) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheServiceError.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheServiceError proto.InternalMessageInfo

type AppOverride struct {
	AppId                    *string  `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"`
	NumMemcachegBackends     *int32   `protobuf:"varint,2,opt,name=num_memcacheg_backends,json=numMemcachegBackends" json:"num_memcacheg_backends,omitempty"`            // Deprecated: Do not use.
	IgnoreShardlock          *bool    `protobuf:"varint,3,opt,name=ignore_shardlock,json=ignoreShardlock" json:"ignore_shardlock,omitempty"`                             // Deprecated: Do not use.
	MemcachePoolHint         *string  `protobuf:"bytes,4,opt,name=memcache_pool_hint,json=memcachePoolHint" json:"memcache_pool_hint,omitempty"`                         // Deprecated: Do not use.
	MemcacheShardingStrategy []byte   `protobuf:"bytes,5,opt,name=memcache_sharding_strategy,json=memcacheShardingStrategy" json:"memcache_sharding_strategy,omitempty"` // Deprecated: Do not use.
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

func (m *AppOverride) Reset()         { *m = AppOverride{} }
func (m *AppOverride) String() string { return proto.CompactTextString(m) }
func (*AppOverride) ProtoMessage()    {}
func (*AppOverride) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{1}
}
func (m *AppOverride) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AppOverride.Unmarshal(m, b)
}
func (m *AppOverride) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AppOverride.Marshal(b, m, deterministic)
}
func (dst *AppOverride) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AppOverride.Merge(dst, src)
}
func (m *AppOverride) XXX_Size() int {
	return xxx_messageInfo_AppOverride.Size(m)
}
func (m *AppOverride) XXX_DiscardUnknown() {
	xxx_messageInfo_AppOverride.DiscardUnknown(m)
}

var xxx_messageInfo_AppOverride proto.InternalMessageInfo

func (m *AppOverride) GetAppId() string {
	if m != nil && m.AppId != nil {
		return *m.AppId
	}
	return ""
}

// Deprecated: Do not use.
func (m *AppOverride) GetNumMemcachegBackends() int32 {
	if m != nil && m.NumMemcachegBackends != nil {
		return *m.NumMemcachegBackends
	}
	return 0
}

// Deprecated: Do not use.
func (m *AppOverride) GetIgnoreShardlock() bool {
	if m != nil && m.IgnoreShardlock != nil {
		return *m.IgnoreShardlock
	}
	return false
}

// Deprecated: Do not use.
func (m *AppOverride) GetMemcachePoolHint() string {
	if m != nil && m.MemcachePoolHint != nil {
		return *m.MemcachePoolHint
	}
	return ""
}

// Deprecated: Do not use.
func (m *AppOverride) GetMemcacheShardingStrategy() []byte {
	if m != nil {
		return m.MemcacheShardingStrategy
	}
	return nil
}

type MemcacheGetRequest struct {
	Key                  [][]byte     `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"`
	NameSpace            *string      `protobuf:"bytes,2,opt,name=name_space,json=nameSpace,def=" json:"name_space,omitempty"`
	ForCas               *bool        `protobuf:"varint,4,opt,name=for_cas,json=forCas" json:"for_cas,omitempty"`
	Override             *AppOverride `protobuf:"bytes,5,opt,name=override" json:"override,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *MemcacheGetRequest) Reset()         { *m = MemcacheGetRequest{} }
func (m *MemcacheGetRequest) String() string { return proto.CompactTextString(m) }
func (*MemcacheGetRequest) ProtoMessage()    {}
func (*MemcacheGetRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{2}
}
func (m *MemcacheGetRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheGetRequest.Unmarshal(m, b)
}
func (m *MemcacheGetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheGetRequest.Marshal(b, m, deterministic)
}
func (dst *MemcacheGetRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheGetRequest.Merge(dst, src)
}
func (m *MemcacheGetRequest) XXX_Size() int {
	return xxx_messageInfo_MemcacheGetRequest.Size(m)
}
func (m *MemcacheGetRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheGetRequest.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheGetRequest proto.InternalMessageInfo

func (m *MemcacheGetRequest) GetKey() [][]byte {
	if m != nil {
		return m.Key
	}
	return nil
}

func (m *MemcacheGetRequest) GetNameSpace() string {
	if m != nil && m.NameSpace != nil {
		return *m.NameSpace
	}
	return ""
}

func (m *MemcacheGetRequest) GetForCas() bool {
	if m != nil && m.ForCas != nil {
		return *m.ForCas
	}
	return false
}

func (m *MemcacheGetRequest) GetOverride() *AppOverride {
	if m != nil {
		return m.Override
	}
	return nil
}

type MemcacheGetResponse struct {
	Item                 []*MemcacheGetResponse_Item `protobuf:"group,1,rep,name=Item,json=item" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *MemcacheGetResponse) Reset()         { *m = MemcacheGetResponse{} }
func (m *MemcacheGetResponse) String() string { return proto.CompactTextString(m) }
func (*MemcacheGetResponse) ProtoMessage()    {}
func (*MemcacheGetResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{3}
}
func (m *MemcacheGetResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheGetResponse.Unmarshal(m, b)
}
func (m *MemcacheGetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheGetResponse.Marshal(b, m, deterministic)
}
func (dst *MemcacheGetResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheGetResponse.Merge(dst, src)
}
func (m *MemcacheGetResponse) XXX_Size() int {
	return xxx_messageInfo_MemcacheGetResponse.Size(m)
}
func (m *MemcacheGetResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheGetResponse.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheGetResponse proto.InternalMessageInfo

func (m *MemcacheGetResponse) GetItem() []*MemcacheGetResponse_Item {
	if m != nil {
		return m.Item
	}
	return nil
}

type MemcacheGetResponse_Item struct {
	Key                  []byte   `protobuf:"bytes,2,req,name=key" json:"key,omitempty"`
	Value                []byte   `protobuf:"bytes,3,req,name=value" json:"value,omitempty"`
	Flags                *uint32  `protobuf:"fixed32,4,opt,name=flags" json:"flags,omitempty"`
	CasId                *uint64  `protobuf:"fixed64,5,opt,name=cas_id,json=casId" json:"cas_id,omitempty"`
	ExpiresInSeconds     *int32   `protobuf:"varint,6,opt,name=expires_in_seconds,json=expiresInSeconds" json:"expires_in_seconds,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MemcacheGetResponse_Item) Reset()         { *m = MemcacheGetResponse_Item{} }
func (m *MemcacheGetResponse_Item) String() string { return proto.CompactTextString(m) }
func (*MemcacheGetResponse_Item) ProtoMessage()    {}
func (*MemcacheGetResponse_Item) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{3, 0}
}
func (m *MemcacheGetResponse_Item) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheGetResponse_Item.Unmarshal(m, b)
}
func (m *MemcacheGetResponse_Item) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheGetResponse_Item.Marshal(b, m, deterministic)
}
func (dst *MemcacheGetResponse_Item) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheGetResponse_Item.Merge(dst, src)
}
func (m *MemcacheGetResponse_Item) XXX_Size() int {
	return xxx_messageInfo_MemcacheGetResponse_Item.Size(m)
}
func (m *MemcacheGetResponse_Item) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheGetResponse_Item.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheGetResponse_Item proto.InternalMessageInfo

func (m *MemcacheGetResponse_Item) GetKey() []byte {
	if m != nil {
		return m.Key
	}
	return nil
}

func (m *MemcacheGetResponse_Item) GetValue() []byte {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *MemcacheGetResponse_Item) GetFlags() uint32 {
	if m != nil && m.Flags != nil {
		return *m.Flags
	}
	return 0
}

func (m *MemcacheGetResponse_Item) GetCasId() uint64 {
	if m != nil && m.CasId != nil {
		return *m.CasId
	}
	return 0
}

func (m *MemcacheGetResponse_Item) GetExpiresInSeconds() int32 {
	if m != nil && m.ExpiresInSeconds != nil {
		return *m.ExpiresInSeconds
	}
	return 0
}

type MemcacheSetRequest struct {
	Item                 []*MemcacheSetRequest_Item `protobuf:"group,1,rep,name=Item,json=item" json:"item,omitempty"`
	NameSpace            *string                    `protobuf:"bytes,7,opt,name=name_space,json=nameSpace,def=" json:"name_space,omitempty"`
	Override             *AppOverride               `protobuf:"bytes,10,opt,name=override" json:"override,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *MemcacheSetRequest) Reset()         { *m = MemcacheSetRequest{} }
func (m *MemcacheSetRequest) String() string { return proto.CompactTextString(m) }
func (*MemcacheSetRequest) ProtoMessage()    {}
func (*MemcacheSetRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{4}
}
func (m *MemcacheSetRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheSetRequest.Unmarshal(m, b)
}
func (m *MemcacheSetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheSetRequest.Marshal(b, m, deterministic)
}
func (dst *MemcacheSetRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheSetRequest.Merge(dst, src)
}
func (m *MemcacheSetRequest) XXX_Size() int {
	return xxx_messageInfo_MemcacheSetRequest.Size(m)
}
func (m *MemcacheSetRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheSetRequest.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheSetRequest proto.InternalMessageInfo

func (m *MemcacheSetRequest) GetItem() []*MemcacheSetRequest_Item {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *MemcacheSetRequest) GetNameSpace() string {
	if m != nil && m.NameSpace != nil {
		return *m.NameSpace
	}
	return ""
}

func (m *MemcacheSetRequest) GetOverride() *AppOverride {
	if m != nil {
		return m.Override
	}
	return nil
}

type MemcacheSetRequest_Item struct {
	Key                  []byte                        `protobuf:"bytes,2,req,name=key" json:"key,omitempty"`
	Value                []byte                        `protobuf:"bytes,3,req,name=value" json:"value,omitempty"`
	Flags                *uint32                       `protobuf:"fixed32,4,opt,name=flags" json:"flags,omitempty"`
	SetPolicy            *MemcacheSetRequest_SetPolicy `protobuf:"varint,5,opt,name=set_policy,json=setPolicy,enum=appengine.MemcacheSetRequest_SetPolicy,def=1" json:"set_policy,omitempty"`
	ExpirationTime       *uint32                       `protobuf:"fixed32,6,opt,name=expiration_time,json=expirationTime,def=0" json:"expiration_time,omitempty"`
	CasId                *uint64                       `protobuf:"fixed64,8,opt,name=cas_id,json=casId" json:"cas_id,omitempty"`
	ForCas               *bool                         `protobuf:"varint,9,opt,name=for_cas,json=forCas" json:"for_cas,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

func (m *MemcacheSetRequest_Item) Reset()         { *m = MemcacheSetRequest_Item{} }
func (m *MemcacheSetRequest_Item) String() string { return proto.CompactTextString(m) }
func (*MemcacheSetRequest_Item) ProtoMessage()    {}
func (*MemcacheSetRequest_Item) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{4, 0}
}
func (m *MemcacheSetRequest_Item) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheSetRequest_Item.Unmarshal(m, b)
}
func (m *MemcacheSetRequest_Item) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheSetRequest_Item.Marshal(b, m, deterministic)
}
func (dst *MemcacheSetRequest_Item) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheSetRequest_Item.Merge(dst, src)
}
func (m *MemcacheSetRequest_Item) XXX_Size() int {
	return xxx_messageInfo_MemcacheSetRequest_Item.Size(m)
}
func (m *MemcacheSetRequest_Item) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheSetRequest_Item.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheSetRequest_Item proto.InternalMessageInfo

const Default_MemcacheSetRequest_Item_SetPolicy MemcacheSetRequest_SetPolicy = MemcacheSetRequest_SET
const Default_MemcacheSetRequest_Item_ExpirationTime uint32 = 0

func (m *MemcacheSetRequest_Item) GetKey() []byte {
	if m != nil {
		return m.Key
	}
	return nil
}

func (m *MemcacheSetRequest_Item) GetValue() []byte {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *MemcacheSetRequest_Item) GetFlags() uint32 {
	if m != nil && m.Flags != nil {
		return *m.Flags
	}
	return 0
}

func (m *MemcacheSetRequest_Item) GetSetPolicy() MemcacheSetRequest_SetPolicy {
	if m != nil && m.SetPolicy != nil {
		return *m.SetPolicy
	}
	return Default_MemcacheSetRequest_Item_SetPolicy
}

func (m *MemcacheSetRequest_Item) GetExpirationTime() uint32 {
	if m != nil && m.ExpirationTime != nil {
		return *m.ExpirationTime
	}
	return Default_MemcacheSetRequest_Item_ExpirationTime
}

func (m *MemcacheSetRequest_Item) GetCasId() uint64 {
	if m != nil && m.CasId != nil {
		return *m.CasId
	}
	return 0
}

func (m *MemcacheSetRequest_Item) GetForCas() bool {
	if m != nil && m.ForCas != nil {
		return *m.ForCas
	}
	return false
}

type MemcacheSetResponse struct {
	SetStatus            []MemcacheSetResponse_SetStatusCode `protobuf:"varint,1,rep,name=set_status,json=setStatus,enum=appengine.MemcacheSetResponse_SetStatusCode" json:"set_status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
	XXX_unrecognized     []byte                              `json:"-"`
	XXX_sizecache        int32                               `json:"-"`
}

func (m *MemcacheSetResponse) Reset()         { *m = MemcacheSetResponse{} }
func (m *MemcacheSetResponse) String() string { return proto.CompactTextString(m) }
func (*MemcacheSetResponse) ProtoMessage()    {}
func (*MemcacheSetResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{5}
}
func (m *MemcacheSetResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheSetResponse.Unmarshal(m, b)
}
func (m *MemcacheSetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheSetResponse.Marshal(b, m, deterministic)
}
func (dst *MemcacheSetResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheSetResponse.Merge(dst, src)
}
func (m *MemcacheSetResponse) XXX_Size() int {
	return xxx_messageInfo_MemcacheSetResponse.Size(m)
}
func (m *MemcacheSetResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheSetResponse.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheSetResponse proto.InternalMessageInfo

func (m *MemcacheSetResponse) GetSetStatus() []MemcacheSetResponse_SetStatusCode {
	if m != nil {
		return m.SetStatus
	}
	return nil
}

type MemcacheDeleteRequest struct {
	Item                 []*MemcacheDeleteRequest_Item `protobuf:"group,1,rep,name=Item,json=item" json:"item,omitempty"`
	NameSpace            *string                       `protobuf:"bytes,4,opt,name=name_space,json=nameSpace,def=" json:"name_space,omitempty"`
	Override             *AppOverride                  `protobuf:"bytes,5,opt,name=override" json:"override,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

func (m *MemcacheDeleteRequest) Reset()         { *m = MemcacheDeleteRequest{} }
func (m *MemcacheDeleteRequest) String() string { return proto.CompactTextString(m) }
func (*MemcacheDeleteRequest) ProtoMessage()    {}
func (*MemcacheDeleteRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{6}
}
func (m *MemcacheDeleteRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheDeleteRequest.Unmarshal(m, b)
}
func (m *MemcacheDeleteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheDeleteRequest.Marshal(b, m, deterministic)
}
func (dst *MemcacheDeleteRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheDeleteRequest.Merge(dst, src)
}
func (m *MemcacheDeleteRequest) XXX_Size() int {
	return xxx_messageInfo_MemcacheDeleteRequest.Size(m)
}
func (m *MemcacheDeleteRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheDeleteRequest.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheDeleteRequest proto.InternalMessageInfo

func (m *MemcacheDeleteRequest) GetItem() []*MemcacheDeleteRequest_Item {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *MemcacheDeleteRequest) GetNameSpace() string {
	if m != nil && m.NameSpace != nil {
		return *m.NameSpace
	}
	return ""
}

func (m *MemcacheDeleteRequest) GetOverride() *AppOverride {
	if m != nil {
		return m.Override
	}
	return nil
}

type MemcacheDeleteRequest_Item struct {
	Key                  []byte   `protobuf:"bytes,2,req,name=key" json:"key,omitempty"`
	DeleteTime           *uint32  `protobuf:"fixed32,3,opt,name=delete_time,json=deleteTime,def=0" json:"delete_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MemcacheDeleteRequest_Item) Reset()         { *m = MemcacheDeleteRequest_Item{} }
func (m *MemcacheDeleteRequest_Item) String() string { return proto.CompactTextString(m) }
func (*MemcacheDeleteRequest_Item) ProtoMessage()    {}
func (*MemcacheDeleteRequest_Item) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{6, 0}
}
func (m *MemcacheDeleteRequest_Item) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheDeleteRequest_Item.Unmarshal(m, b)
}
func (m *MemcacheDeleteRequest_Item) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheDeleteRequest_Item.Marshal(b, m, deterministic)
}
func (dst *MemcacheDeleteRequest_Item) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheDeleteRequest_Item.Merge(dst, src)
}
func (m *MemcacheDeleteRequest_Item) XXX_Size() int {
	return xxx_messageInfo_MemcacheDeleteRequest_Item.Size(m)
}
func (m *MemcacheDeleteRequest_Item) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheDeleteRequest_Item.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheDeleteRequest_Item proto.InternalMessageInfo

const Default_MemcacheDeleteRequest_Item_DeleteTime uint32 = 0

func (m *MemcacheDeleteRequest_Item) GetKey() []byte {
	if m != nil {
		return m.Key
	}
	return nil
}

func (m *MemcacheDeleteRequest_Item) GetDeleteTime() uint32 {
	if m != nil && m.DeleteTime != nil {
		return *m.DeleteTime
	}
	return Default_MemcacheDeleteRequest_Item_DeleteTime
}

type MemcacheDeleteResponse struct {
	DeleteStatus         []MemcacheDeleteResponse_DeleteStatusCode `protobuf:"varint,1,rep,name=delete_status,json=deleteStatus,enum=appengine.MemcacheDeleteResponse_DeleteStatusCode" json:"delete_status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

func (m *MemcacheDeleteResponse) Reset()         { *m = MemcacheDeleteResponse{} }
func (m *MemcacheDeleteResponse) String() string { return proto.CompactTextString(m) }
func (*MemcacheDeleteResponse) ProtoMessage()    {}
func (*MemcacheDeleteResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{7}
}
func (m *MemcacheDeleteResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheDeleteResponse.Unmarshal(m, b)
}
func (m *MemcacheDeleteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheDeleteResponse.Marshal(b, m, deterministic)
}
func (dst *MemcacheDeleteResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheDeleteResponse.Merge(dst, src)
}
func (m *MemcacheDeleteResponse) XXX_Size() int {
	return xxx_messageInfo_MemcacheDeleteResponse.Size(m)
}
func (m *MemcacheDeleteResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheDeleteResponse.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheDeleteResponse proto.InternalMessageInfo

func (m *MemcacheDeleteResponse) GetDeleteStatus() []MemcacheDeleteResponse_DeleteStatusCode {
	if m != nil {
		return m.DeleteStatus
	}
	return nil
}

type MemcacheIncrementRequest struct {
	Key                  []byte                              `protobuf:"bytes,1,req,name=key" json:"key,omitempty"`
	NameSpace            *string                             `protobuf:"bytes,4,opt,name=name_space,json=nameSpace,def=" json:"name_space,omitempty"`
	Delta                *uint64                             `protobuf:"varint,2,opt,name=delta,def=1" json:"delta,omitempty"`
	Direction            *MemcacheIncrementRequest_Direction `protobuf:"varint,3,opt,name=direction,enum=appengine.MemcacheIncrementRequest_Direction,def=1" json:"direction,omitempty"`
	InitialValue         *uint64                             `protobuf:"varint,5,opt,name=initial_value,json=initialValue" json:"initial_value,omitempty"`
	InitialFlags         *uint32                             `protobuf:"fixed32,6,opt,name=initial_flags,json=initialFlags" json:"initial_flags,omitempty"`
	Override             *AppOverride                        `protobuf:"bytes,7,opt,name=override" json:"override,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
	XXX_unrecognized     []byte                              `json:"-"`
	XXX_sizecache        int32                               `json:"-"`
}

func (m *MemcacheIncrementRequest) Reset()         { *m = MemcacheIncrementRequest{} }
func (m *MemcacheIncrementRequest) String() string { return proto.CompactTextString(m) }
func (*MemcacheIncrementRequest) ProtoMessage()    {}
func (*MemcacheIncrementRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{8}
}
func (m *MemcacheIncrementRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheIncrementRequest.Unmarshal(m, b)
}
func (m *MemcacheIncrementRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheIncrementRequest.Marshal(b, m, deterministic)
}
func (dst *MemcacheIncrementRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheIncrementRequest.Merge(dst, src)
}
func (m *MemcacheIncrementRequest) XXX_Size() int {
	return xxx_messageInfo_MemcacheIncrementRequest.Size(m)
}
func (m *MemcacheIncrementRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheIncrementRequest.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheIncrementRequest proto.InternalMessageInfo

const Default_MemcacheIncrementRequest_Delta uint64 = 1
const Default_MemcacheIncrementRequest_Direction MemcacheIncrementRequest_Direction = MemcacheIncrementRequest_INCREMENT

func (m *MemcacheIncrementRequest) GetKey() []byte {
	if m != nil {
		return m.Key
	}
	return nil
}

func (m *MemcacheIncrementRequest) GetNameSpace() string {
	if m != nil && m.NameSpace != nil {
		return *m.NameSpace
	}
	return ""
}

func (m *MemcacheIncrementRequest) GetDelta() uint64 {
	if m != nil && m.Delta != nil {
		return *m.Delta
	}
	return Default_MemcacheIncrementRequest_Delta
}

func (m *MemcacheIncrementRequest) GetDirection() MemcacheIncrementRequest_Direction {
	if m != nil && m.Direction != nil {
		return *m.Direction
	}
	return Default_MemcacheIncrementRequest_Direction
}

func (m *MemcacheIncrementRequest) GetInitialValue() uint64 {
	if m != nil && m.InitialValue != nil {
		return *m.InitialValue
	}
	return 0
}

func (m *MemcacheIncrementRequest) GetInitialFlags() uint32 {
	if m != nil && m.InitialFlags != nil {
		return *m.InitialFlags
	}
	return 0
}

func (m *MemcacheIncrementRequest) GetOverride() *AppOverride {
	if m != nil {
		return m.Override
	}
	return nil
}

type MemcacheIncrementResponse struct {
	NewValue             *uint64                                        `protobuf:"varint,1,opt,name=new_value,json=newValue" json:"new_value,omitempty"`
	IncrementStatus      *MemcacheIncrementResponse_IncrementStatusCode `protobuf:"varint,2,opt,name=increment_status,json=incrementStatus,enum=appengine.MemcacheIncrementResponse_IncrementStatusCode" json:"increment_status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                       `json:"-"`
	XXX_unrecognized     []byte                                         `json:"-"`
	XXX_sizecache        int32                                          `json:"-"`
}

func (m *MemcacheIncrementResponse) Reset()         { *m = MemcacheIncrementResponse{} }
func (m *MemcacheIncrementResponse) String() string { return proto.CompactTextString(m) }
func (*MemcacheIncrementResponse) ProtoMessage()    {}
func (*MemcacheIncrementResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{9}
}
func (m *MemcacheIncrementResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheIncrementResponse.Unmarshal(m, b)
}
func (m *MemcacheIncrementResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheIncrementResponse.Marshal(b, m, deterministic)
}
func (dst *MemcacheIncrementResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheIncrementResponse.Merge(dst, src)
}
func (m *MemcacheIncrementResponse) XXX_Size() int {
	return xxx_messageInfo_MemcacheIncrementResponse.Size(m)
}
func (m *MemcacheIncrementResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheIncrementResponse.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheIncrementResponse proto.InternalMessageInfo

func (m *MemcacheIncrementResponse) GetNewValue() uint64 {
	if m != nil && m.NewValue != nil {
		return *m.NewValue
	}
	return 0
}

func (m *MemcacheIncrementResponse) GetIncrementStatus() MemcacheIncrementResponse_IncrementStatusCode {
	if m != nil && m.IncrementStatus != nil {
		return *m.IncrementStatus
	}
	return MemcacheIncrementResponse_OK
}

type MemcacheBatchIncrementRequest struct {
	NameSpace            *string                     `protobuf:"bytes,1,opt,name=name_space,json=nameSpace,def=" json:"name_space,omitempty"`
	Item                 []*MemcacheIncrementRequest `protobuf:"bytes,2,rep,name=item" json:"item,omitempty"`
	Override             *AppOverride                `protobuf:"bytes,3,opt,name=override" json:"override,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *MemcacheBatchIncrementRequest) Reset()         { *m = MemcacheBatchIncrementRequest{} }
func (m *MemcacheBatchIncrementRequest) String() string { return proto.CompactTextString(m) }
func (*MemcacheBatchIncrementRequest) ProtoMessage()    {}
func (*MemcacheBatchIncrementRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{10}
}
func (m *MemcacheBatchIncrementRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheBatchIncrementRequest.Unmarshal(m, b)
}
func (m *MemcacheBatchIncrementRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheBatchIncrementRequest.Marshal(b, m, deterministic)
}
func (dst *MemcacheBatchIncrementRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheBatchIncrementRequest.Merge(dst, src)
}
func (m *MemcacheBatchIncrementRequest) XXX_Size() int {
	return xxx_messageInfo_MemcacheBatchIncrementRequest.Size(m)
}
func (m *MemcacheBatchIncrementRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheBatchIncrementRequest.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheBatchIncrementRequest proto.InternalMessageInfo

func (m *MemcacheBatchIncrementRequest) GetNameSpace() string {
	if m != nil && m.NameSpace != nil {
		return *m.NameSpace
	}
	return ""
}

func (m *MemcacheBatchIncrementRequest) GetItem() []*MemcacheIncrementRequest {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *MemcacheBatchIncrementRequest) GetOverride() *AppOverride {
	if m != nil {
		return m.Override
	}
	return nil
}

type MemcacheBatchIncrementResponse struct {
	Item                 []*MemcacheIncrementResponse `protobuf:"bytes,1,rep,name=item" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *MemcacheBatchIncrementResponse) Reset()         { *m = MemcacheBatchIncrementResponse{} }
func (m *MemcacheBatchIncrementResponse) String() string { return proto.CompactTextString(m) }
func (*MemcacheBatchIncrementResponse) ProtoMessage()    {}
func (*MemcacheBatchIncrementResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{11}
}
func (m *MemcacheBatchIncrementResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheBatchIncrementResponse.Unmarshal(m, b)
}
func (m *MemcacheBatchIncrementResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheBatchIncrementResponse.Marshal(b, m, deterministic)
}
func (dst *MemcacheBatchIncrementResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheBatchIncrementResponse.Merge(dst, src)
}
func (m *MemcacheBatchIncrementResponse) XXX_Size() int {
	return xxx_messageInfo_MemcacheBatchIncrementResponse.Size(m)
}
func (m *MemcacheBatchIncrementResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheBatchIncrementResponse.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheBatchIncrementResponse proto.InternalMessageInfo

func (m *MemcacheBatchIncrementResponse) GetItem() []*MemcacheIncrementResponse {
	if m != nil {
		return m.Item
	}
	return nil
}

type MemcacheFlushRequest struct {
	Override             *AppOverride `protobuf:"bytes,1,opt,name=override" json:"override,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *MemcacheFlushRequest) Reset()         { *m = MemcacheFlushRequest{} }
func (m *MemcacheFlushRequest) String() string { return proto.CompactTextString(m) }
func (*MemcacheFlushRequest) ProtoMessage()    {}
func (*MemcacheFlushRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{12}
}
func (m *MemcacheFlushRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheFlushRequest.Unmarshal(m, b)
}
func (m *MemcacheFlushRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheFlushRequest.Marshal(b, m, deterministic)
}
func (dst *MemcacheFlushRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheFlushRequest.Merge(dst, src)
}
func (m *MemcacheFlushRequest) XXX_Size() int {
	return xxx_messageInfo_MemcacheFlushRequest.Size(m)
}
func (m *MemcacheFlushRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheFlushRequest.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheFlushRequest proto.InternalMessageInfo

func (m *MemcacheFlushRequest) GetOverride() *AppOverride {
	if m != nil {
		return m.Override
	}
	return nil
}

type MemcacheFlushResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MemcacheFlushResponse) Reset()         { *m = MemcacheFlushResponse{} }
func (m *MemcacheFlushResponse) String() string { return proto.CompactTextString(m) }
func (*MemcacheFlushResponse) ProtoMessage()    {}
func (*MemcacheFlushResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{13}
}
func (m *MemcacheFlushResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheFlushResponse.Unmarshal(m, b)
}
func (m *MemcacheFlushResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheFlushResponse.Marshal(b, m, deterministic)
}
func (dst *MemcacheFlushResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheFlushResponse.Merge(dst, src)
}
func (m *MemcacheFlushResponse) XXX_Size() int {
	return xxx_messageInfo_MemcacheFlushResponse.Size(m)
}
func (m *MemcacheFlushResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheFlushResponse.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheFlushResponse proto.InternalMessageInfo

type MemcacheStatsRequest struct {
	Override             *AppOverride `protobuf:"bytes,1,opt,name=override" json:"override,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *MemcacheStatsRequest) Reset()         { *m = MemcacheStatsRequest{} }
func (m *MemcacheStatsRequest) String() string { return proto.CompactTextString(m) }
func (*MemcacheStatsRequest) ProtoMessage()    {}
func (*MemcacheStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{14}
}
func (m *MemcacheStatsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheStatsRequest.Unmarshal(m, b)
}
func (m *MemcacheStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheStatsRequest.Marshal(b, m, deterministic)
}
func (dst *MemcacheStatsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheStatsRequest.Merge(dst, src)
}
func (m *MemcacheStatsRequest) XXX_Size() int {
	return xxx_messageInfo_MemcacheStatsRequest.Size(m)
}
func (m *MemcacheStatsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheStatsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheStatsRequest proto.InternalMessageInfo

func (m *MemcacheStatsRequest) GetOverride() *AppOverride {
	if m != nil {
		return m.Override
	}
	return nil
}

type MergedNamespaceStats struct {
	Hits                 *uint64  `protobuf:"varint,1,req,name=hits" json:"hits,omitempty"`
	Misses               *uint64  `protobuf:"varint,2,req,name=misses" json:"misses,omitempty"`
	ByteHits             *uint64  `protobuf:"varint,3,req,name=byte_hits,json=byteHits" json:"byte_hits,omitempty"`
	Items                *uint64  `protobuf:"varint,4,req,name=items" json:"items,omitempty"`
	Bytes                *uint64  `protobuf:"varint,5,req,name=bytes" json:"bytes,omitempty"`
	OldestItemAge        *uint32  `protobuf:"fixed32,6,req,name=oldest_item_age,json=oldestItemAge" json:"oldest_item_age,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MergedNamespaceStats) Reset()         { *m = MergedNamespaceStats{} }
func (m *MergedNamespaceStats) String() string { return proto.CompactTextString(m) }
func (*MergedNamespaceStats) ProtoMessage()    {}
func (*MergedNamespaceStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{15}
}
func (m *MergedNamespaceStats) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MergedNamespaceStats.Unmarshal(m, b)
}
func (m *MergedNamespaceStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MergedNamespaceStats.Marshal(b, m, deterministic)
}
func (dst *MergedNamespaceStats) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MergedNamespaceStats.Merge(dst, src)
}
func (m *MergedNamespaceStats) XXX_Size() int {
	return xxx_messageInfo_MergedNamespaceStats.Size(m)
}
func (m *MergedNamespaceStats) XXX_DiscardUnknown() {
	xxx_messageInfo_MergedNamespaceStats.DiscardUnknown(m)
}

var xxx_messageInfo_MergedNamespaceStats proto.InternalMessageInfo

func (m *MergedNamespaceStats) GetHits() uint64 {
	if m != nil && m.Hits != nil {
		return *m.Hits
	}
	return 0
}

func (m *MergedNamespaceStats) GetMisses() uint64 {
	if m != nil && m.Misses != nil {
		return *m.Misses
	}
	return 0
}

func (m *MergedNamespaceStats) GetByteHits() uint64 {
	if m != nil && m.ByteHits != nil {
		return *m.ByteHits
	}
	return 0
}

func (m *MergedNamespaceStats) GetItems() uint64 {
	if m != nil && m.Items != nil {
		return *m.Items
	}
	return 0
}

func (m *MergedNamespaceStats) GetBytes() uint64 {
	if m != nil && m.Bytes != nil {
		return *m.Bytes
	}
	return 0
}

func (m *MergedNamespaceStats) GetOldestItemAge() uint32 {
	if m != nil && m.OldestItemAge != nil {
		return *m.OldestItemAge
	}
	return 0
}

type MemcacheStatsResponse struct {
	Stats                *MergedNamespaceStats `protobuf:"bytes,1,opt,name=stats" json:"stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *MemcacheStatsResponse) Reset()         { *m = MemcacheStatsResponse{} }
func (m *MemcacheStatsResponse) String() string { return proto.CompactTextString(m) }
func (*MemcacheStatsResponse) ProtoMessage()    {}
func (*MemcacheStatsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{16}
}
func (m *MemcacheStatsResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheStatsResponse.Unmarshal(m, b)
}
func (m *MemcacheStatsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheStatsResponse.Marshal(b, m, deterministic)
}
func (dst *MemcacheStatsResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheStatsResponse.Merge(dst, src)
}
func (m *MemcacheStatsResponse) XXX_Size() int {
	return xxx_messageInfo_MemcacheStatsResponse.Size(m)
}
func (m *MemcacheStatsResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheStatsResponse.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheStatsResponse proto.InternalMessageInfo

func (m *MemcacheStatsResponse) GetStats() *MergedNamespaceStats {
	if m != nil {
		return m.Stats
	}
	return nil
}

type MemcacheGrabTailRequest struct {
	ItemCount            *int32       `protobuf:"varint,1,req,name=item_count,json=itemCount" json:"item_count,omitempty"`
	NameSpace            *string      `protobuf:"bytes,2,opt,name=name_space,json=nameSpace,def=" json:"name_space,omitempty"`
	Override             *AppOverride `protobuf:"bytes,3,opt,name=override" json:"override,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *MemcacheGrabTailRequest) Reset()         { *m = MemcacheGrabTailRequest{} }
func (m *MemcacheGrabTailRequest) String() string { return proto.CompactTextString(m) }
func (*MemcacheGrabTailRequest) ProtoMessage()    {}
func (*MemcacheGrabTailRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{17}
}
func (m *MemcacheGrabTailRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheGrabTailRequest.Unmarshal(m, b)
}
func (m *MemcacheGrabTailRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheGrabTailRequest.Marshal(b, m, deterministic)
}
func (dst *MemcacheGrabTailRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheGrabTailRequest.Merge(dst, src)
}
func (m *MemcacheGrabTailRequest) XXX_Size() int {
	return xxx_messageInfo_MemcacheGrabTailRequest.Size(m)
}
func (m *MemcacheGrabTailRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheGrabTailRequest.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheGrabTailRequest proto.InternalMessageInfo

func (m *MemcacheGrabTailRequest) GetItemCount() int32 {
	if m != nil && m.ItemCount != nil {
		return *m.ItemCount
	}
	return 0
}

func (m *MemcacheGrabTailRequest) GetNameSpace() string {
	if m != nil && m.NameSpace != nil {
		return *m.NameSpace
	}
	return ""
}

func (m *MemcacheGrabTailRequest) GetOverride() *AppOverride {
	if m != nil {
		return m.Override
	}
	return nil
}

type MemcacheGrabTailResponse struct {
	Item                 []*MemcacheGrabTailResponse_Item `protobuf:"group,1,rep,name=Item,json=item" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

func (m *MemcacheGrabTailResponse) Reset()         { *m = MemcacheGrabTailResponse{} }
func (m *MemcacheGrabTailResponse) String() string { return proto.CompactTextString(m) }
func (*MemcacheGrabTailResponse) ProtoMessage()    {}
func (*MemcacheGrabTailResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{18}
}
func (m *MemcacheGrabTailResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheGrabTailResponse.Unmarshal(m, b)
}
func (m *MemcacheGrabTailResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheGrabTailResponse.Marshal(b, m, deterministic)
}
func (dst *MemcacheGrabTailResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheGrabTailResponse.Merge(dst, src)
}
func (m *MemcacheGrabTailResponse) XXX_Size() int {
	return xxx_messageInfo_MemcacheGrabTailResponse.Size(m)
}
func (m *MemcacheGrabTailResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheGrabTailResponse.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheGrabTailResponse proto.InternalMessageInfo

func (m *MemcacheGrabTailResponse) GetItem() []*MemcacheGrabTailResponse_Item {
	if m != nil {
		return m.Item
	}
	return nil
}

type MemcacheGrabTailResponse_Item struct {
	Value                []byte   `protobuf:"bytes,2,req,name=value" json:"value,omitempty"`
	Flags                *uint32  `protobuf:"fixed32,3,opt,name=flags" json:"flags,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MemcacheGrabTailResponse_Item) Reset()         { *m = MemcacheGrabTailResponse_Item{} }
func (m *MemcacheGrabTailResponse_Item) String() string { return proto.CompactTextString(m) }
func (*MemcacheGrabTailResponse_Item) ProtoMessage()    {}
func (*MemcacheGrabTailResponse_Item) Descriptor() ([]byte, []int) {
	return fileDescriptor_memcache_service_e327a14e42649a60, []int{18, 0}
}
func (m *MemcacheGrabTailResponse_Item) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MemcacheGrabTailResponse_Item.Unmarshal(m, b)
}
func (m *MemcacheGrabTailResponse_Item) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MemcacheGrabTailResponse_Item.Marshal(b, m, deterministic)
}
func (dst *MemcacheGrabTailResponse_Item) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MemcacheGrabTailResponse_Item.Merge(dst, src)
}
func (m *MemcacheGrabTailResponse_Item) XXX_Size() int {
	return xxx_messageInfo_MemcacheGrabTailResponse_Item.Size(m)
}
func (m *MemcacheGrabTailResponse_Item) XXX_DiscardUnknown() {
	xxx_messageInfo_MemcacheGrabTailResponse_Item.DiscardUnknown(m)
}

var xxx_messageInfo_MemcacheGrabTailResponse_Item proto.InternalMessageInfo

func (m *MemcacheGrabTailResponse_Item) GetValue() []byte {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *MemcacheGrabTailResponse_Item) GetFlags() uint32 {
	if m != nil && m.Flags != nil {
		return *m.Flags
	}
	return 0
}

func init() {
	proto.RegisterType((*MemcacheServiceError)(nil), "appengine.MemcacheServiceError")
	proto.RegisterType((*AppOverride)(nil), "appengine.AppOverride")
	proto.RegisterType((*MemcacheGetRequest)(nil), "appengine.MemcacheGetRequest")
	proto.RegisterType((*MemcacheGetResponse)(nil), "appengine.MemcacheGetResponse")
	proto.RegisterType((*MemcacheGetResponse_Item)(nil), "appengine.MemcacheGetResponse.Item")
	proto.RegisterType((*MemcacheSetRequest)(nil), "appengine.MemcacheSetRequest")
	proto.RegisterType((*MemcacheSetRequest_Item)(nil), "appengine.MemcacheSetRequest.Item")
	proto.RegisterType((*MemcacheSetResponse)(nil), "appengine.MemcacheSetResponse")
	proto.RegisterType((*MemcacheDeleteRequest)(nil), "appengine.MemcacheDeleteRequest")
	proto.RegisterType((*MemcacheDeleteRequest_Item)(nil), "appengine.MemcacheDeleteRequest.Item")
	proto.RegisterType((*MemcacheDeleteResponse)(nil), "appengine.MemcacheDeleteResponse")
	proto.RegisterType((*MemcacheIncrementRequest)(nil), "appengine.MemcacheIncrementRequest")
	proto.RegisterType((*MemcacheIncrementResponse)(nil), "appengine.MemcacheIncrementResponse")
	proto.RegisterType((*MemcacheBatchIncrementRequest)(nil), "appengine.MemcacheBatchIncrementRequest")
	proto.RegisterType((*MemcacheBatchIncrementResponse)(nil), "appengine.MemcacheBatchIncrementResponse")
	proto.RegisterType((*MemcacheFlushRequest)(nil), "appengine.MemcacheFlushRequest")
	proto.RegisterType((*MemcacheFlushResponse)(nil), "appengine.MemcacheFlushResponse")
	proto.RegisterType((*MemcacheStatsRequest)(nil), "appengine.MemcacheStatsRequest")
	proto.RegisterType((*MergedNamespaceStats)(nil), "appengine.MergedNamespaceStats")
	proto.RegisterType((*MemcacheStatsResponse)(nil), "appengine.MemcacheStatsResponse")
	proto.RegisterType((*MemcacheGrabTailRequest)(nil), "appengine.MemcacheGrabTailRequest")
	proto.RegisterType((*MemcacheGrabTailResponse)(nil), "appengine.MemcacheGrabTailResponse")
	proto.RegisterType((*MemcacheGrabTailResponse_Item)(nil), "appengine.MemcacheGrabTailResponse.Item")
}

func init() {
	proto.RegisterFile("google.golang.org/appengine/internal/memcache/memcache_service.proto", fileDescriptor_memcache_service_e327a14e42649a60)
}

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