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

package cycler

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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

// The existing storage classes.
type ChillEffectConfiguration_EnumStorageClass int32

const (
	ChillEffectConfiguration_UNKNOWN  ChillEffectConfiguration_EnumStorageClass = 0
	ChillEffectConfiguration_STANDARD ChillEffectConfiguration_EnumStorageClass = 1
	ChillEffectConfiguration_NEARLINE ChillEffectConfiguration_EnumStorageClass = 2
	ChillEffectConfiguration_COLDLINE ChillEffectConfiguration_EnumStorageClass = 3
	ChillEffectConfiguration_ARCHIVE  ChillEffectConfiguration_EnumStorageClass = 4
)

// Enum value maps for ChillEffectConfiguration_EnumStorageClass.
var (
	ChillEffectConfiguration_EnumStorageClass_name = map[int32]string{
		0: "UNKNOWN",
		1: "STANDARD",
		2: "NEARLINE",
		3: "COLDLINE",
		4: "ARCHIVE",
	}
	ChillEffectConfiguration_EnumStorageClass_value = map[string]int32{
		"UNKNOWN":  0,
		"STANDARD": 1,
		"NEARLINE": 2,
		"COLDLINE": 3,
		"ARCHIVE":  4,
	}
)

func (x ChillEffectConfiguration_EnumStorageClass) Enum() *ChillEffectConfiguration_EnumStorageClass {
	p := new(ChillEffectConfiguration_EnumStorageClass)
	*p = x
	return p
}

func (x ChillEffectConfiguration_EnumStorageClass) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ChillEffectConfiguration_EnumStorageClass) Descriptor() protoreflect.EnumDescriptor {
	return file_cycler_effect_proto_enumTypes[0].Descriptor()
}

func (ChillEffectConfiguration_EnumStorageClass) Type() protoreflect.EnumType {
	return &file_cycler_effect_proto_enumTypes[0]
}

func (x ChillEffectConfiguration_EnumStorageClass) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ChillEffectConfiguration_EnumStorageClass.Descriptor instead.
func (ChillEffectConfiguration_EnumStorageClass) EnumDescriptor() ([]byte, []int) {
	return file_cycler_effect_proto_rawDescGZIP(), []int{3, 0}
}

// Like it says on the tin, will run stats only.
type NoopEffectConfiguration struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*NoopEffectConfiguration) ProtoMessage() {}

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

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

// Move objects that match the configuration to another bucket + prefix.
// If the destination is within the configured bucket/prefix the behavior
// on those objects created via the move is undefined. They may or may not
// exist in whole or in part at the time the prefix is iterated.
type MoveEffectConfiguration struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The destination bucket for the moved objects (e.g. 'engeg-testing-bucket').
	DestinationBucket string `protobuf:"bytes,1,opt,name=destination_bucket,json=destinationBucket,proto3" json:"destination_bucket,omitempty"`
	// The destination prefix for the moved objects (e.g. 'moved-files-prefix/').
	// Note: Prefixes are literal, and no '/' will be infered/appended.
	DestinationPrefix string `protobuf:"bytes,2,opt,name=destination_prefix,json=destinationPrefix,proto3" json:"destination_prefix,omitempty"`
}

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

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

func (*MoveEffectConfiguration) ProtoMessage() {}

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

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

func (x *MoveEffectConfiguration) GetDestinationBucket() string {
	if x != nil {
		return x.DestinationBucket
	}
	return ""
}

func (x *MoveEffectConfiguration) GetDestinationPrefix() string {
	if x != nil {
		return x.DestinationPrefix
	}
	return ""
}

// Duplicate objects that match the configuration to another bucket + prefix.
// If the destination is within the configured bucket/prefix the behavior
// on those objects created via the duplicate is undefined. They may or may not
// exist in whole or in part at the time the prefix is iterated.
type DuplicateEffectConfiguration struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The destination bucket for the copied objects (e.g. 'engeg-testing-bucket').
	DestinationBucket string `protobuf:"bytes,1,opt,name=destination_bucket,json=destinationBucket,proto3" json:"destination_bucket,omitempty"`
	// The destination prefix for the copied objects (e.g. 'copied-files-prefix/').
	// Note: Prefixes are literal, and no '/' will be infered/appended.
	DestinationPrefix string `protobuf:"bytes,2,opt,name=destination_prefix,json=destinationPrefix,proto3" json:"destination_prefix,omitempty"`
}

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

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

func (*DuplicateEffectConfiguration) ProtoMessage() {}

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

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

func (x *DuplicateEffectConfiguration) GetDestinationBucket() string {
	if x != nil {
		return x.DestinationBucket
	}
	return ""
}

func (x *DuplicateEffectConfiguration) GetDestinationPrefix() string {
	if x != nil {
		return x.DestinationPrefix
	}
	return ""
}

// Change the storage class of an object in place.
type ChillEffectConfiguration struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The desired destination storage class.
	ToStorageClass ChillEffectConfiguration_EnumStorageClass `protobuf:"varint,1,opt,name=to_storage_class,json=toStorageClass,proto3,enum=cycler.ChillEffectConfiguration_EnumStorageClass" json:"to_storage_class,omitempty"`
}

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

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

func (*ChillEffectConfiguration) ProtoMessage() {}

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

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

func (x *ChillEffectConfiguration) GetToStorageClass() ChillEffectConfiguration_EnumStorageClass {
	if x != nil {
		return x.ToStorageClass
	}
	return ChillEffectConfiguration_UNKNOWN
}

// Delete the objects that match the configuration.
type DeleteEffectConfiguration struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *DeleteEffectConfiguration) Reset() {
	*x = DeleteEffectConfiguration{}
	if protoimpl.UnsafeEnabled {
		mi := &file_cycler_effect_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*DeleteEffectConfiguration) ProtoMessage() {}

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

// Deprecated: Use DeleteEffectConfiguration.ProtoReflect.Descriptor instead.
func (*DeleteEffectConfiguration) Descriptor() ([]byte, []int) {
	return file_cycler_effect_proto_rawDescGZIP(), []int{4}
}

var File_cycler_effect_proto protoreflect.FileDescriptor

var file_cycler_effect_proto_rawDesc = []byte{
	0x0a, 0x13, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x2f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x22, 0x19, 0x0a,
	0x17, 0x4e, 0x6f, 0x6f, 0x70, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65,
	0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x63, 0x6b,
	0x65, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11,
	0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69,
	0x78, 0x22, 0x7c, 0x0a, 0x1c, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x66,
	0x66, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64,
	0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,
	0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
	0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65,
	0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22,
	0xcf, 0x01, 0x0a, 0x18, 0x43, 0x68, 0x69, 0x6c, 0x6c, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x10,
	0x74, 0x6f, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x2e,
	0x43, 0x68, 0x69, 0x6c, 0x6c, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x74, 0x6f,
	0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x0e, 0x74, 0x6f, 0x53, 0x74, 0x6f,
	0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x56, 0x0a, 0x10, 0x45, 0x6e, 0x75,
	0x6d, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x0b, 0x0a,
	0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54,
	0x41, 0x4e, 0x44, 0x41, 0x52, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x45, 0x41, 0x52,
	0x4c, 0x49, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4c, 0x44, 0x4c, 0x49,
	0x4e, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x52, 0x43, 0x48, 0x49, 0x56, 0x45, 0x10,
	0x04, 0x22, 0x1b, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x66, 0x66, 0x65, 0x63,
	0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x32,
	0x5a, 0x30, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66,
	0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x79, 0x63, 0x6c,
	0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_cycler_effect_proto_rawDescOnce sync.Once
	file_cycler_effect_proto_rawDescData = file_cycler_effect_proto_rawDesc
)

func file_cycler_effect_proto_rawDescGZIP() []byte {
	file_cycler_effect_proto_rawDescOnce.Do(func() {
		file_cycler_effect_proto_rawDescData = protoimpl.X.CompressGZIP(file_cycler_effect_proto_rawDescData)
	})
	return file_cycler_effect_proto_rawDescData
}

var file_cycler_effect_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_cycler_effect_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_cycler_effect_proto_goTypes = []interface{}{
	(ChillEffectConfiguration_EnumStorageClass)(0), // 0: cycler.ChillEffectConfiguration.EnumStorageClass
	(*NoopEffectConfiguration)(nil),                // 1: cycler.NoopEffectConfiguration
	(*MoveEffectConfiguration)(nil),                // 2: cycler.MoveEffectConfiguration
	(*DuplicateEffectConfiguration)(nil),           // 3: cycler.DuplicateEffectConfiguration
	(*ChillEffectConfiguration)(nil),               // 4: cycler.ChillEffectConfiguration
	(*DeleteEffectConfiguration)(nil),              // 5: cycler.DeleteEffectConfiguration
}
var file_cycler_effect_proto_depIdxs = []int32{
	0, // 0: cycler.ChillEffectConfiguration.to_storage_class:type_name -> cycler.ChillEffectConfiguration.EnumStorageClass
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_cycler_effect_proto_init() }
func file_cycler_effect_proto_init() {
	if File_cycler_effect_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_cycler_effect_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*NoopEffectConfiguration); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_cycler_effect_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MoveEffectConfiguration); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_cycler_effect_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DuplicateEffectConfiguration); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_cycler_effect_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChillEffectConfiguration); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_cycler_effect_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeleteEffectConfiguration); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_cycler_effect_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_cycler_effect_proto_goTypes,
		DependencyIndexes: file_cycler_effect_proto_depIdxs,
		EnumInfos:         file_cycler_effect_proto_enumTypes,
		MessageInfos:      file_cycler_effect_proto_msgTypes,
	}.Build()
	File_cycler_effect_proto = out.File
	file_cycler_effect_proto_rawDesc = nil
	file_cycler_effect_proto_goTypes = nil
	file_cycler_effect_proto_depIdxs = nil
}
