//go:build !ignore_autogenerated
// +build !ignore_autogenerated

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Code generated by controller-gen. DO NOT EDIT.

package v1alpha1

import (
	"k8s.io/api/autoscaling/v2"
	"k8s.io/api/autoscaling/v2beta2"
	corev1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/apis/meta/v1"
	runtime "k8s.io/apimachinery/pkg/runtime"
	autoscaling_k8s_iov1 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1"
)

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AgentConfig) DeepCopyInto(out *AgentConfig) {
	*out = *in
	if in.Plugins != nil {
		in, out := &in.Plugins, &out.Plugins
		*out = new(AgentPlugin)
		(*in).DeepCopyInto(*out)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AgentConfig.
func (in *AgentConfig) DeepCopy() *AgentConfig {
	if in == nil {
		return nil
	}
	out := new(AgentConfig)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AgentPlugin) DeepCopyInto(out *AgentPlugin) {
	*out = *in
	if in.Logging != nil {
		in, out := &in.Logging, &out.Logging
		*out = new(PluginLogging)
		(*in).DeepCopyInto(*out)
	}
	if in.Metrics != nil {
		in, out := &in.Metrics, &out.Metrics
		*out = new(PluginMetrics)
		(*in).DeepCopyInto(*out)
	}
	if in.Tracing != nil {
		in, out := &in.Tracing, &out.Tracing
		*out = new(PluginTracing)
		(*in).DeepCopyInto(*out)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AgentPlugin.
func (in *AgentPlugin) DeepCopy() *AgentPlugin {
	if in == nil {
		return nil
	}
	out := new(AgentPlugin)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Auth) DeepCopyInto(out *Auth) {
	*out = *in
	if in.Users != nil {
		in, out := &in.Users, &out.Users
		*out = make([]User, len(*in))
		copy(*out, *in)
	}
	if in.Privilege != nil {
		in, out := &in.Privilege, &out.Privilege
		*out = new(Privilege)
		**out = **in
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Auth.
func (in *Auth) DeepCopy() *Auth {
	if in == nil {
		return nil
	}
	out := new(Auth)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AutoScaler) DeepCopyInto(out *AutoScaler) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
	in.Spec.DeepCopyInto(&out.Spec)
	in.Status.DeepCopyInto(&out.Status)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutoScaler.
func (in *AutoScaler) DeepCopy() *AutoScaler {
	if in == nil {
		return nil
	}
	out := new(AutoScaler)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *AutoScaler) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AutoScalerCondition) DeepCopyInto(out *AutoScalerCondition) {
	*out = *in
	in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutoScalerCondition.
func (in *AutoScalerCondition) DeepCopy() *AutoScalerCondition {
	if in == nil {
		return nil
	}
	out := new(AutoScalerCondition)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AutoScalerList) DeepCopyInto(out *AutoScalerList) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ListMeta.DeepCopyInto(&out.ListMeta)
	if in.Items != nil {
		in, out := &in.Items, &out.Items
		*out = make([]AutoScaler, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutoScalerList.
func (in *AutoScalerList) DeepCopy() *AutoScalerList {
	if in == nil {
		return nil
	}
	out := new(AutoScalerList)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *AutoScalerList) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AutoScalerSpec) DeepCopyInto(out *AutoScalerSpec) {
	*out = *in
	if in.PolicyGroup != nil {
		in, out := &in.PolicyGroup, &out.PolicyGroup
		*out = make([]ScalingPolicy, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutoScalerSpec.
func (in *AutoScalerSpec) DeepCopy() *AutoScalerSpec {
	if in == nil {
		return nil
	}
	out := new(AutoScalerSpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AutoScalerStatus) DeepCopyInto(out *AutoScalerStatus) {
	*out = *in
	if in.Conditions != nil {
		in, out := &in.Conditions, &out.Conditions
		*out = make([]AutoScalerCondition, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutoScalerStatus.
func (in *AutoScalerStatus) DeepCopy() *AutoScalerStatus {
	if in == nil {
		return nil
	}
	out := new(AutoScalerStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AutomaticScaling) DeepCopyInto(out *AutomaticScaling) {
	*out = *in
	if in.CustomMetrics != nil {
		in, out := &in.CustomMetrics, &out.CustomMetrics
		*out = make([]v2beta2.MetricSpec, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutomaticScaling.
func (in *AutomaticScaling) DeepCopy() *AutomaticScaling {
	if in == nil {
		return nil
	}
	out := new(AutomaticScaling)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BasicCredential) DeepCopyInto(out *BasicCredential) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicCredential.
func (in *BasicCredential) DeepCopy() *BasicCredential {
	if in == nil {
		return nil
	}
	out := new(BasicCredential)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BootstrapConfig) DeepCopyInto(out *BootstrapConfig) {
	*out = *in
	in.ServerConfig.DeepCopyInto(&out.ServerConfig)
	in.AgentConfig.DeepCopyInto(&out.AgentConfig)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BootstrapConfig.
func (in *BootstrapConfig) DeepCopy() *BootstrapConfig {
	if in == nil {
		return nil
	}
	out := new(BootstrapConfig)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CPUStressParams) DeepCopyInto(out *CPUStressParams) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CPUStressParams.
func (in *CPUStressParams) DeepCopy() *CPUStressParams {
	if in == nil {
		return nil
	}
	out := new(CPUStressParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Chaos) DeepCopyInto(out *Chaos) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
	in.Spec.DeepCopyInto(&out.Spec)
	in.Status.DeepCopyInto(&out.Status)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Chaos.
func (in *Chaos) DeepCopy() *Chaos {
	if in == nil {
		return nil
	}
	out := new(Chaos)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *Chaos) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ChaosList) DeepCopyInto(out *ChaosList) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ListMeta.DeepCopyInto(&out.ListMeta)
	if in.Items != nil {
		in, out := &in.Items, &out.Items
		*out = make([]Chaos, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChaosList.
func (in *ChaosList) DeepCopy() *ChaosList {
	if in == nil {
		return nil
	}
	out := new(ChaosList)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *ChaosList) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ChaosSpec) DeepCopyInto(out *ChaosSpec) {
	*out = *in
	in.EmbedChaos.DeepCopyInto(&out.EmbedChaos)
	if in.InjectJob != nil {
		in, out := &in.InjectJob, &out.InjectJob
		*out = new(JobSpec)
		**out = **in
	}
	if in.PressureCfg != nil {
		in, out := &in.PressureCfg, &out.PressureCfg
		*out = new(PressureCfg)
		(*in).DeepCopyInto(*out)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChaosSpec.
func (in *ChaosSpec) DeepCopy() *ChaosSpec {
	if in == nil {
		return nil
	}
	out := new(ChaosSpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ChaosStatus) DeepCopyInto(out *ChaosStatus) {
	*out = *in
	if in.Conditions != nil {
		in, out := &in.Conditions, &out.Conditions
		*out = make([]*v1.Condition, len(*in))
		for i := range *in {
			if (*in)[i] != nil {
				in, out := &(*in)[i], &(*out)[i]
				*out = new(v1.Condition)
				(*in).DeepCopyInto(*out)
			}
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChaosStatus.
func (in *ChaosStatus) DeepCopy() *ChaosStatus {
	if in == nil {
		return nil
	}
	out := new(ChaosStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ClusterConfig) DeepCopyInto(out *ClusterConfig) {
	*out = *in
	out.Repository = in.Repository
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterConfig.
func (in *ClusterConfig) DeepCopy() *ClusterConfig {
	if in == nil {
		return nil
	}
	out := new(ClusterConfig)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ClusterProps) DeepCopyInto(out *ClusterProps) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterProps.
func (in *ClusterProps) DeepCopy() *ClusterProps {
	if in == nil {
		return nil
	}
	out := new(ClusterProps)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ClusterStatus) DeepCopyInto(out *ClusterStatus) {
	*out = *in
	out.PrimaryEndpoint = in.PrimaryEndpoint
	if in.ReaderEndpoints != nil {
		in, out := &in.ReaderEndpoints, &out.ReaderEndpoints
		*out = make([]Endpoint, len(*in))
		copy(*out, *in)
	}
	if in.Properties != nil {
		in, out := &in.Properties, &out.Properties
		*out = make(map[string]string, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterStatus.
func (in *ClusterStatus) DeepCopy() *ClusterStatus {
	if in == nil {
		return nil
	}
	out := new(ClusterStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ComputeNode) DeepCopyInto(out *ComputeNode) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
	in.Spec.DeepCopyInto(&out.Spec)
	in.Status.DeepCopyInto(&out.Status)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComputeNode.
func (in *ComputeNode) DeepCopy() *ComputeNode {
	if in == nil {
		return nil
	}
	out := new(ComputeNode)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *ComputeNode) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ComputeNodeAuthority) DeepCopyInto(out *ComputeNodeAuthority) {
	*out = *in
	if in.Users != nil {
		in, out := &in.Users, &out.Users
		*out = make([]ComputeNodeUser, len(*in))
		copy(*out, *in)
	}
	out.Privilege = in.Privilege
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComputeNodeAuthority.
func (in *ComputeNodeAuthority) DeepCopy() *ComputeNodeAuthority {
	if in == nil {
		return nil
	}
	out := new(ComputeNodeAuthority)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ComputeNodeCondition) DeepCopyInto(out *ComputeNodeCondition) {
	*out = *in
	in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
	in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComputeNodeCondition.
func (in *ComputeNodeCondition) DeepCopy() *ComputeNodeCondition {
	if in == nil {
		return nil
	}
	out := new(ComputeNodeCondition)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ComputeNodeList) DeepCopyInto(out *ComputeNodeList) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ListMeta.DeepCopyInto(&out.ListMeta)
	if in.Items != nil {
		in, out := &in.Items, &out.Items
		*out = make([]ComputeNode, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComputeNodeList.
func (in *ComputeNodeList) DeepCopy() *ComputeNodeList {
	if in == nil {
		return nil
	}
	out := new(ComputeNodeList)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *ComputeNodeList) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ComputeNodePrivilege) DeepCopyInto(out *ComputeNodePrivilege) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComputeNodePrivilege.
func (in *ComputeNodePrivilege) DeepCopy() *ComputeNodePrivilege {
	if in == nil {
		return nil
	}
	out := new(ComputeNodePrivilege)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ComputeNodeServerMode) DeepCopyInto(out *ComputeNodeServerMode) {
	*out = *in
	in.Repository.DeepCopyInto(&out.Repository)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComputeNodeServerMode.
func (in *ComputeNodeServerMode) DeepCopy() *ComputeNodeServerMode {
	if in == nil {
		return nil
	}
	out := new(ComputeNodeServerMode)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ComputeNodeSpec) DeepCopyInto(out *ComputeNodeSpec) {
	*out = *in
	if in.StorageNodeConnector != nil {
		in, out := &in.StorageNodeConnector, &out.StorageNodeConnector
		*out = new(StorageNodeConnector)
		**out = **in
	}
	if in.Selector != nil {
		in, out := &in.Selector, &out.Selector
		*out = new(v1.LabelSelector)
		(*in).DeepCopyInto(*out)
	}
	if in.Probes != nil {
		in, out := &in.Probes, &out.Probes
		*out = new(ProxyProbe)
		(*in).DeepCopyInto(*out)
	}
	if in.ImagePullSecrets != nil {
		in, out := &in.ImagePullSecrets, &out.ImagePullSecrets
		*out = make([]corev1.LocalObjectReference, len(*in))
		copy(*out, *in)
	}
	if in.Env != nil {
		in, out := &in.Env, &out.Env
		*out = make([]corev1.EnvVar, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
	in.Resources.DeepCopyInto(&out.Resources)
	if in.PortBindings != nil {
		in, out := &in.PortBindings, &out.PortBindings
		*out = make([]PortBinding, len(*in))
		copy(*out, *in)
	}
	in.Bootstrap.DeepCopyInto(&out.Bootstrap)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComputeNodeSpec.
func (in *ComputeNodeSpec) DeepCopy() *ComputeNodeSpec {
	if in == nil {
		return nil
	}
	out := new(ComputeNodeSpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ComputeNodeStatus) DeepCopyInto(out *ComputeNodeStatus) {
	*out = *in
	if in.Conditions != nil {
		in, out := &in.Conditions, &out.Conditions
		*out = make([]ComputeNodeCondition, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
	in.LoadBalancer.DeepCopyInto(&out.LoadBalancer)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComputeNodeStatus.
func (in *ComputeNodeStatus) DeepCopy() *ComputeNodeStatus {
	if in == nil {
		return nil
	}
	out := new(ComputeNodeStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ComputeNodeUser) DeepCopyInto(out *ComputeNodeUser) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComputeNodeUser.
func (in *ComputeNodeUser) DeepCopy() *ComputeNodeUser {
	if in == nil {
		return nil
	}
	out := new(ComputeNodeUser)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Condition) DeepCopyInto(out *Condition) {
	*out = *in
	in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Condition.
func (in *Condition) DeepCopy() *Condition {
	if in == nil {
		return nil
	}
	out := new(Condition)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in Conditions) DeepCopyInto(out *Conditions) {
	{
		in := &in
		*out = make(Conditions, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Conditions.
func (in Conditions) DeepCopy() Conditions {
	if in == nil {
		return nil
	}
	out := new(Conditions)
	in.DeepCopyInto(out)
	return *out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ContainerKillParams) DeepCopyInto(out *ContainerKillParams) {
	*out = *in
	if in.ContainerNames != nil {
		in, out := &in.ContainerNames, &out.ContainerNames
		*out = make([]string, len(*in))
		copy(*out, *in)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerKillParams.
func (in *ContainerKillParams) DeepCopy() *ContainerKillParams {
	if in == nil {
		return nil
	}
	out := new(ContainerKillParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CorruptionParams) DeepCopyInto(out *CorruptionParams) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CorruptionParams.
func (in *CorruptionParams) DeepCopy() *CorruptionParams {
	if in == nil {
		return nil
	}
	out := new(CorruptionParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CredentialType) DeepCopyInto(out *CredentialType) {
	*out = *in
	out.BasicCredential = in.BasicCredential
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CredentialType.
func (in *CredentialType) DeepCopy() *CredentialType {
	if in == nil {
		return nil
	}
	out := new(CredentialType)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DelayParams) DeepCopyInto(out *DelayParams) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DelayParams.
func (in *DelayParams) DeepCopy() *DelayParams {
	if in == nil {
		return nil
	}
	out := new(DelayParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DistSQL) DeepCopyInto(out *DistSQL) {
	*out = *in
	if in.Args != nil {
		in, out := &in.Args, &out.Args
		*out = make([]string, len(*in))
		copy(*out, *in)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DistSQL.
func (in *DistSQL) DeepCopy() *DistSQL {
	if in == nil {
		return nil
	}
	out := new(DistSQL)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DuplicationParams) DeepCopyInto(out *DuplicationParams) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DuplicationParams.
func (in *DuplicationParams) DeepCopy() *DuplicationParams {
	if in == nil {
		return nil
	}
	out := new(DuplicationParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EmbedChaos) DeepCopyInto(out *EmbedChaos) {
	*out = *in
	if in.NetworkChaos != nil {
		in, out := &in.NetworkChaos, &out.NetworkChaos
		*out = new(NetworkChaosSpec)
		(*in).DeepCopyInto(*out)
	}
	if in.PodChaos != nil {
		in, out := &in.PodChaos, &out.PodChaos
		*out = new(PodChaosSpec)
		(*in).DeepCopyInto(*out)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EmbedChaos.
func (in *EmbedChaos) DeepCopy() *EmbedChaos {
	if in == nil {
		return nil
	}
	out := new(EmbedChaos)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Endpoint) DeepCopyInto(out *Endpoint) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Endpoint.
func (in *Endpoint) DeepCopy() *Endpoint {
	if in == nil {
		return nil
	}
	out := new(Endpoint)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *HorizontalScaling) DeepCopyInto(out *HorizontalScaling) {
	*out = *in
	if in.ScaleUpRules != nil {
		in, out := &in.ScaleUpRules, &out.ScaleUpRules
		*out = new(v2.HPAScalingRules)
		(*in).DeepCopyInto(*out)
	}
	if in.ScaleDownRules != nil {
		in, out := &in.ScaleDownRules, &out.ScaleDownRules
		*out = new(v2.HPAScalingRules)
		(*in).DeepCopyInto(*out)
	}
	if in.Metrics != nil {
		in, out := &in.Metrics, &out.Metrics
		*out = make([]v2.MetricSpec, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HorizontalScaling.
func (in *HorizontalScaling) DeepCopy() *HorizontalScaling {
	if in == nil {
		return nil
	}
	out := new(HorizontalScaling)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *InstanceStatus) DeepCopyInto(out *InstanceStatus) {
	*out = *in
	out.Endpoint = in.Endpoint
	if in.Properties != nil {
		in, out := &in.Properties, &out.Properties
		*out = make(map[string]string, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InstanceStatus.
func (in *InstanceStatus) DeepCopy() *InstanceStatus {
	if in == nil {
		return nil
	}
	out := new(InstanceStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *JobSpec) DeepCopyInto(out *JobSpec) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JobSpec.
func (in *JobSpec) DeepCopy() *JobSpec {
	if in == nil {
		return nil
	}
	out := new(JobSpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *LoadBalancerStatus) DeepCopyInto(out *LoadBalancerStatus) {
	*out = *in
	if in.Ingress != nil {
		in, out := &in.Ingress, &out.Ingress
		*out = make([]corev1.LoadBalancerIngress, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoadBalancerStatus.
func (in *LoadBalancerStatus) DeepCopy() *LoadBalancerStatus {
	if in == nil {
		return nil
	}
	out := new(LoadBalancerStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *LoggingFile) DeepCopyInto(out *LoggingFile) {
	*out = *in
	if in.Props != nil {
		in, out := &in.Props, &out.Props
		*out = make(Properties, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoggingFile.
func (in *LoggingFile) DeepCopy() *LoggingFile {
	if in == nil {
		return nil
	}
	out := new(LoggingFile)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *LossParams) DeepCopyInto(out *LossParams) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LossParams.
func (in *LossParams) DeepCopy() *LossParams {
	if in == nil {
		return nil
	}
	out := new(LossParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MemoryStressParams) DeepCopyInto(out *MemoryStressParams) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MemoryStressParams.
func (in *MemoryStressParams) DeepCopy() *MemoryStressParams {
	if in == nil {
		return nil
	}
	out := new(MemoryStressParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Msg) DeepCopyInto(out *Msg) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Msg.
func (in *Msg) DeepCopy() *Msg {
	if in == nil {
		return nil
	}
	out := new(Msg)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MySQLDriver) DeepCopyInto(out *MySQLDriver) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLDriver.
func (in *MySQLDriver) DeepCopy() *MySQLDriver {
	if in == nil {
		return nil
	}
	out := new(MySQLDriver)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *NetworkChaosParams) DeepCopyInto(out *NetworkChaosParams) {
	*out = *in
	if in.Delay != nil {
		in, out := &in.Delay, &out.Delay
		*out = new(DelayParams)
		**out = **in
	}
	if in.Loss != nil {
		in, out := &in.Loss, &out.Loss
		*out = new(LossParams)
		**out = **in
	}
	if in.Duplication != nil {
		in, out := &in.Duplication, &out.Duplication
		*out = new(DuplicationParams)
		**out = **in
	}
	if in.Corruption != nil {
		in, out := &in.Corruption, &out.Corruption
		*out = new(CorruptionParams)
		**out = **in
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkChaosParams.
func (in *NetworkChaosParams) DeepCopy() *NetworkChaosParams {
	if in == nil {
		return nil
	}
	out := new(NetworkChaosParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *NetworkChaosSpec) DeepCopyInto(out *NetworkChaosSpec) {
	*out = *in
	in.Source.DeepCopyInto(&out.Source)
	if in.Target != nil {
		in, out := &in.Target, &out.Target
		*out = new(PodSelector)
		(*in).DeepCopyInto(*out)
	}
	if in.Duration != nil {
		in, out := &in.Duration, &out.Duration
		*out = new(string)
		**out = **in
	}
	in.Params.DeepCopyInto(&out.Params)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkChaosSpec.
func (in *NetworkChaosSpec) DeepCopy() *NetworkChaosSpec {
	if in == nil {
		return nil
	}
	out := new(NetworkChaosSpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ObjectRefSelector) DeepCopyInto(out *ObjectRefSelector) {
	*out = *in
	out.ObjectRef = in.ObjectRef
	if in.Selector != nil {
		in, out := &in.Selector, &out.Selector
		*out = new(v1.LabelSelector)
		(*in).DeepCopyInto(*out)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectRefSelector.
func (in *ObjectRefSelector) DeepCopy() *ObjectRefSelector {
	if in == nil {
		return nil
	}
	out := new(ObjectRefSelector)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OpenTelemetry) DeepCopyInto(out *OpenTelemetry) {
	*out = *in
	if in.Props != nil {
		in, out := &in.Props, &out.Props
		*out = make(Properties, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenTelemetry.
func (in *OpenTelemetry) DeepCopy() *OpenTelemetry {
	if in == nil {
		return nil
	}
	out := new(OpenTelemetry)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OpenTracing) DeepCopyInto(out *OpenTracing) {
	*out = *in
	if in.Props != nil {
		in, out := &in.Props, &out.Props
		*out = make(Properties, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenTracing.
func (in *OpenTracing) DeepCopy() *OpenTracing {
	if in == nil {
		return nil
	}
	out := new(OpenTracing)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PluginLogging) DeepCopyInto(out *PluginLogging) {
	*out = *in
	in.File.DeepCopyInto(&out.File)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginLogging.
func (in *PluginLogging) DeepCopy() *PluginLogging {
	if in == nil {
		return nil
	}
	out := new(PluginLogging)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PluginMetrics) DeepCopyInto(out *PluginMetrics) {
	*out = *in
	in.Prometheus.DeepCopyInto(&out.Prometheus)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginMetrics.
func (in *PluginMetrics) DeepCopy() *PluginMetrics {
	if in == nil {
		return nil
	}
	out := new(PluginMetrics)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PluginTracing) DeepCopyInto(out *PluginTracing) {
	*out = *in
	in.OpenTracing.DeepCopyInto(&out.OpenTracing)
	in.OpenTelemetry.DeepCopyInto(&out.OpenTelemetry)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginTracing.
func (in *PluginTracing) DeepCopy() *PluginTracing {
	if in == nil {
		return nil
	}
	out := new(PluginTracing)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PodChaosParams) DeepCopyInto(out *PodChaosParams) {
	*out = *in
	if in.PodFailure != nil {
		in, out := &in.PodFailure, &out.PodFailure
		*out = new(PodFailureParams)
		(*in).DeepCopyInto(*out)
	}
	if in.ContainerKill != nil {
		in, out := &in.ContainerKill, &out.ContainerKill
		*out = new(ContainerKillParams)
		(*in).DeepCopyInto(*out)
	}
	if in.CPUStress != nil {
		in, out := &in.CPUStress, &out.CPUStress
		*out = new(CPUStressParams)
		**out = **in
	}
	if in.MemoryStress != nil {
		in, out := &in.MemoryStress, &out.MemoryStress
		*out = new(MemoryStressParams)
		**out = **in
	}
	if in.PodKill != nil {
		in, out := &in.PodKill, &out.PodKill
		*out = new(PodKillParams)
		**out = **in
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodChaosParams.
func (in *PodChaosParams) DeepCopy() *PodChaosParams {
	if in == nil {
		return nil
	}
	out := new(PodChaosParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PodChaosSpec) DeepCopyInto(out *PodChaosSpec) {
	*out = *in
	in.PodSelector.DeepCopyInto(&out.PodSelector)
	in.Params.DeepCopyInto(&out.Params)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodChaosSpec.
func (in *PodChaosSpec) DeepCopy() *PodChaosSpec {
	if in == nil {
		return nil
	}
	out := new(PodChaosSpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PodFailureParams) DeepCopyInto(out *PodFailureParams) {
	*out = *in
	if in.Duration != nil {
		in, out := &in.Duration, &out.Duration
		*out = new(string)
		**out = **in
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodFailureParams.
func (in *PodFailureParams) DeepCopy() *PodFailureParams {
	if in == nil {
		return nil
	}
	out := new(PodFailureParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PodKillParams) DeepCopyInto(out *PodKillParams) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodKillParams.
func (in *PodKillParams) DeepCopy() *PodKillParams {
	if in == nil {
		return nil
	}
	out := new(PodKillParams)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PodSelector) DeepCopyInto(out *PodSelector) {
	*out = *in
	if in.Namespaces != nil {
		in, out := &in.Namespaces, &out.Namespaces
		*out = make([]string, len(*in))
		copy(*out, *in)
	}
	if in.LabelSelectors != nil {
		in, out := &in.LabelSelectors, &out.LabelSelectors
		*out = make(map[string]string, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
	if in.AnnotationSelectors != nil {
		in, out := &in.AnnotationSelectors, &out.AnnotationSelectors
		*out = make(map[string]string, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
	if in.Nodes != nil {
		in, out := &in.Nodes, &out.Nodes
		*out = make([]string, len(*in))
		copy(*out, *in)
	}
	if in.Pods != nil {
		in, out := &in.Pods, &out.Pods
		*out = make(map[string][]string, len(*in))
		for key, val := range *in {
			var outVal []string
			if val == nil {
				(*out)[key] = nil
			} else {
				in, out := &val, &outVal
				*out = make([]string, len(*in))
				copy(*out, *in)
			}
			(*out)[key] = outVal
		}
	}
	if in.NodeSelectors != nil {
		in, out := &in.NodeSelectors, &out.NodeSelectors
		*out = make(map[string]string, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
	if in.ExpressionSelectors != nil {
		in, out := &in.ExpressionSelectors, &out.ExpressionSelectors
		*out = make([]v1.LabelSelectorRequirement, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodSelector.
func (in *PodSelector) DeepCopy() *PodSelector {
	if in == nil {
		return nil
	}
	out := new(PodSelector)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PortBinding) DeepCopyInto(out *PortBinding) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PortBinding.
func (in *PortBinding) DeepCopy() *PortBinding {
	if in == nil {
		return nil
	}
	out := new(PortBinding)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PressureCfg) DeepCopyInto(out *PressureCfg) {
	*out = *in
	out.Duration = in.Duration
	out.ReqTime = in.ReqTime
	if in.DistSQLs != nil {
		in, out := &in.DistSQLs, &out.DistSQLs
		*out = make([]DistSQL, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PressureCfg.
func (in *PressureCfg) DeepCopy() *PressureCfg {
	if in == nil {
		return nil
	}
	out := new(PressureCfg)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Privilege) DeepCopyInto(out *Privilege) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Privilege.
func (in *Privilege) DeepCopy() *Privilege {
	if in == nil {
		return nil
	}
	out := new(Privilege)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Prometheus) DeepCopyInto(out *Prometheus) {
	*out = *in
	if in.Props != nil {
		in, out := &in.Props, &out.Props
		*out = make(Properties, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Prometheus.
func (in *Prometheus) DeepCopy() *Prometheus {
	if in == nil {
		return nil
	}
	out := new(Prometheus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in Properties) DeepCopyInto(out *Properties) {
	{
		in := &in
		*out = make(Properties, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Properties.
func (in Properties) DeepCopy() Properties {
	if in == nil {
		return nil
	}
	out := new(Properties)
	in.DeepCopyInto(out)
	return *out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Props) DeepCopyInto(out *Props) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Props.
func (in *Props) DeepCopy() *Props {
	if in == nil {
		return nil
	}
	out := new(Props)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ProxyConfigSpec) DeepCopyInto(out *ProxyConfigSpec) {
	*out = *in
	out.ClusterConfig = in.ClusterConfig
	in.Authority.DeepCopyInto(&out.Authority)
	if in.Props != nil {
		in, out := &in.Props, &out.Props
		*out = new(Props)
		**out = **in
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyConfigSpec.
func (in *ProxyConfigSpec) DeepCopy() *ProxyConfigSpec {
	if in == nil {
		return nil
	}
	out := new(ProxyConfigSpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ProxyConfigStatus) DeepCopyInto(out *ProxyConfigStatus) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyConfigStatus.
func (in *ProxyConfigStatus) DeepCopy() *ProxyConfigStatus {
	if in == nil {
		return nil
	}
	out := new(ProxyConfigStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ProxyProbe) DeepCopyInto(out *ProxyProbe) {
	*out = *in
	if in.LivenessProbe != nil {
		in, out := &in.LivenessProbe, &out.LivenessProbe
		*out = new(corev1.Probe)
		(*in).DeepCopyInto(*out)
	}
	if in.ReadinessProbe != nil {
		in, out := &in.ReadinessProbe, &out.ReadinessProbe
		*out = new(corev1.Probe)
		(*in).DeepCopyInto(*out)
	}
	if in.StartupProbe != nil {
		in, out := &in.StartupProbe, &out.StartupProbe
		*out = new(corev1.Probe)
		(*in).DeepCopyInto(*out)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyProbe.
func (in *ProxyProbe) DeepCopy() *ProxyProbe {
	if in == nil {
		return nil
	}
	out := new(ProxyProbe)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ProxySpec) DeepCopyInto(out *ProxySpec) {
	*out = *in
	out.ServiceType = in.ServiceType
	if in.AutomaticScaling != nil {
		in, out := &in.AutomaticScaling, &out.AutomaticScaling
		*out = new(AutomaticScaling)
		(*in).DeepCopyInto(*out)
	}
	if in.ImagePullSecrets != nil {
		in, out := &in.ImagePullSecrets, &out.ImagePullSecrets
		*out = make([]corev1.LocalObjectReference, len(*in))
		copy(*out, *in)
	}
	if in.MySQLDriver != nil {
		in, out := &in.MySQLDriver, &out.MySQLDriver
		*out = new(MySQLDriver)
		**out = **in
	}
	in.Resources.DeepCopyInto(&out.Resources)
	if in.LivenessProbe != nil {
		in, out := &in.LivenessProbe, &out.LivenessProbe
		*out = new(corev1.Probe)
		(*in).DeepCopyInto(*out)
	}
	if in.ReadinessProbe != nil {
		in, out := &in.ReadinessProbe, &out.ReadinessProbe
		*out = new(corev1.Probe)
		(*in).DeepCopyInto(*out)
	}
	if in.StartupProbe != nil {
		in, out := &in.StartupProbe, &out.StartupProbe
		*out = new(corev1.Probe)
		(*in).DeepCopyInto(*out)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxySpec.
func (in *ProxySpec) DeepCopy() *ProxySpec {
	if in == nil {
		return nil
	}
	out := new(ProxySpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ProxyStatus) DeepCopyInto(out *ProxyStatus) {
	*out = *in
	if in.Conditions != nil {
		in, out := &in.Conditions, &out.Conditions
		*out = make([]Condition, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyStatus.
func (in *ProxyStatus) DeepCopy() *ProxyStatus {
	if in == nil {
		return nil
	}
	out := new(ProxyStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Repository) DeepCopyInto(out *Repository) {
	*out = *in
	if in.Props != nil {
		in, out := &in.Props, &out.Props
		*out = make(Properties, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Repository.
func (in *Repository) DeepCopy() *Repository {
	if in == nil {
		return nil
	}
	out := new(Repository)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RepositoryConfig) DeepCopyInto(out *RepositoryConfig) {
	*out = *in
	out.Props = in.Props
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepositoryConfig.
func (in *RepositoryConfig) DeepCopy() *RepositoryConfig {
	if in == nil {
		return nil
	}
	out := new(RepositoryConfig)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Result) DeepCopyInto(out *Result) {
	*out = *in
	out.Steady = in.Steady
	out.Chaos = in.Chaos
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Result.
func (in *Result) DeepCopy() *Result {
	if in == nil {
		return nil
	}
	out := new(Result)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ScalingPolicy) DeepCopyInto(out *ScalingPolicy) {
	*out = *in
	if in.TargetSelector != nil {
		in, out := &in.TargetSelector, &out.TargetSelector
		*out = new(ObjectRefSelector)
		(*in).DeepCopyInto(*out)
	}
	if in.Horizontal != nil {
		in, out := &in.Horizontal, &out.Horizontal
		*out = new(HorizontalScaling)
		(*in).DeepCopyInto(*out)
	}
	if in.Vertical != nil {
		in, out := &in.Vertical, &out.Vertical
		*out = new(VerticalScaling)
		(*in).DeepCopyInto(*out)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScalingPolicy.
func (in *ScalingPolicy) DeepCopy() *ScalingPolicy {
	if in == nil {
		return nil
	}
	out := new(ScalingPolicy)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ServerConfig) DeepCopyInto(out *ServerConfig) {
	*out = *in
	in.Authority.DeepCopyInto(&out.Authority)
	in.Mode.DeepCopyInto(&out.Mode)
	if in.Props != nil {
		in, out := &in.Props, &out.Props
		*out = make(Properties, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServerConfig.
func (in *ServerConfig) DeepCopy() *ServerConfig {
	if in == nil {
		return nil
	}
	out := new(ServerConfig)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Service) DeepCopyInto(out *Service) {
	*out = *in
	if in.Ports != nil {
		in, out := &in.Ports, &out.Ports
		*out = make([]corev1.ServicePort, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Service.
func (in *Service) DeepCopy() *Service {
	if in == nil {
		return nil
	}
	out := new(Service)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ServiceType) DeepCopyInto(out *ServiceType) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceType.
func (in *ServiceType) DeepCopy() *ServiceType {
	if in == nil {
		return nil
	}
	out := new(ServiceType)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ShardingSphereProxy) DeepCopyInto(out *ShardingSphereProxy) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
	in.Spec.DeepCopyInto(&out.Spec)
	in.Status.DeepCopyInto(&out.Status)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ShardingSphereProxy.
func (in *ShardingSphereProxy) DeepCopy() *ShardingSphereProxy {
	if in == nil {
		return nil
	}
	out := new(ShardingSphereProxy)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *ShardingSphereProxy) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ShardingSphereProxyList) DeepCopyInto(out *ShardingSphereProxyList) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ListMeta.DeepCopyInto(&out.ListMeta)
	if in.Items != nil {
		in, out := &in.Items, &out.Items
		*out = make([]ShardingSphereProxy, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ShardingSphereProxyList.
func (in *ShardingSphereProxyList) DeepCopy() *ShardingSphereProxyList {
	if in == nil {
		return nil
	}
	out := new(ShardingSphereProxyList)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *ShardingSphereProxyList) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ShardingSphereProxyServerConfig) DeepCopyInto(out *ShardingSphereProxyServerConfig) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
	in.Spec.DeepCopyInto(&out.Spec)
	out.Status = in.Status
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ShardingSphereProxyServerConfig.
func (in *ShardingSphereProxyServerConfig) DeepCopy() *ShardingSphereProxyServerConfig {
	if in == nil {
		return nil
	}
	out := new(ShardingSphereProxyServerConfig)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *ShardingSphereProxyServerConfig) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ShardingSphereProxyServerConfigList) DeepCopyInto(out *ShardingSphereProxyServerConfigList) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ListMeta.DeepCopyInto(&out.ListMeta)
	if in.Items != nil {
		in, out := &in.Items, &out.Items
		*out = make([]ShardingSphereProxyServerConfig, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ShardingSphereProxyServerConfigList.
func (in *ShardingSphereProxyServerConfigList) DeepCopy() *ShardingSphereProxyServerConfigList {
	if in == nil {
		return nil
	}
	out := new(ShardingSphereProxyServerConfigList)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *ShardingSphereProxyServerConfigList) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageNode) DeepCopyInto(out *StorageNode) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
	out.Spec = in.Spec
	in.Status.DeepCopyInto(&out.Status)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageNode.
func (in *StorageNode) DeepCopy() *StorageNode {
	if in == nil {
		return nil
	}
	out := new(StorageNode)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *StorageNode) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageNodeCondition) DeepCopyInto(out *StorageNodeCondition) {
	*out = *in
	in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageNodeCondition.
func (in *StorageNodeCondition) DeepCopy() *StorageNodeCondition {
	if in == nil {
		return nil
	}
	out := new(StorageNodeCondition)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in StorageNodeConditions) DeepCopyInto(out *StorageNodeConditions) {
	{
		in := &in
		*out = make(StorageNodeConditions, len(*in))
		for i := range *in {
			if (*in)[i] != nil {
				in, out := &(*in)[i], &(*out)[i]
				*out = new(StorageNodeCondition)
				(*in).DeepCopyInto(*out)
			}
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageNodeConditions.
func (in StorageNodeConditions) DeepCopy() StorageNodeConditions {
	if in == nil {
		return nil
	}
	out := new(StorageNodeConditions)
	in.DeepCopyInto(out)
	return *out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageNodeConnector) DeepCopyInto(out *StorageNodeConnector) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageNodeConnector.
func (in *StorageNodeConnector) DeepCopy() *StorageNodeConnector {
	if in == nil {
		return nil
	}
	out := new(StorageNodeConnector)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageNodeList) DeepCopyInto(out *StorageNodeList) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ListMeta.DeepCopyInto(&out.ListMeta)
	if in.Items != nil {
		in, out := &in.Items, &out.Items
		*out = make([]StorageNode, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageNodeList.
func (in *StorageNodeList) DeepCopy() *StorageNodeList {
	if in == nil {
		return nil
	}
	out := new(StorageNodeList)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *StorageNodeList) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageNodeSpec) DeepCopyInto(out *StorageNodeSpec) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageNodeSpec.
func (in *StorageNodeSpec) DeepCopy() *StorageNodeSpec {
	if in == nil {
		return nil
	}
	out := new(StorageNodeSpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageNodeStatus) DeepCopyInto(out *StorageNodeStatus) {
	*out = *in
	if in.Conditions != nil {
		in, out := &in.Conditions, &out.Conditions
		*out = make(StorageNodeConditions, len(*in))
		for i := range *in {
			if (*in)[i] != nil {
				in, out := &(*in)[i], &(*out)[i]
				*out = new(StorageNodeCondition)
				(*in).DeepCopyInto(*out)
			}
		}
	}
	in.Cluster.DeepCopyInto(&out.Cluster)
	if in.Instances != nil {
		in, out := &in.Instances, &out.Instances
		*out = make([]InstanceStatus, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageNodeStatus.
func (in *StorageNodeStatus) DeepCopy() *StorageNodeStatus {
	if in == nil {
		return nil
	}
	out := new(StorageNodeStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageProvider) DeepCopyInto(out *StorageProvider) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
	out.Status = in.Status
	in.Spec.DeepCopyInto(&out.Spec)
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageProvider.
func (in *StorageProvider) DeepCopy() *StorageProvider {
	if in == nil {
		return nil
	}
	out := new(StorageProvider)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *StorageProvider) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageProviderList) DeepCopyInto(out *StorageProviderList) {
	*out = *in
	out.TypeMeta = in.TypeMeta
	in.ListMeta.DeepCopyInto(&out.ListMeta)
	if in.Items != nil {
		in, out := &in.Items, &out.Items
		*out = make([]StorageProvider, len(*in))
		for i := range *in {
			(*in)[i].DeepCopyInto(&(*out)[i])
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageProviderList.
func (in *StorageProviderList) DeepCopy() *StorageProviderList {
	if in == nil {
		return nil
	}
	out := new(StorageProviderList)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *StorageProviderList) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageProviderSpec) DeepCopyInto(out *StorageProviderSpec) {
	*out = *in
	if in.Parameters != nil {
		in, out := &in.Parameters, &out.Parameters
		*out = make(map[string]string, len(*in))
		for key, val := range *in {
			(*out)[key] = val
		}
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageProviderSpec.
func (in *StorageProviderSpec) DeepCopy() *StorageProviderSpec {
	if in == nil {
		return nil
	}
	out := new(StorageProviderSpec)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageProviderStatus) DeepCopyInto(out *StorageProviderStatus) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageProviderStatus.
func (in *StorageProviderStatus) DeepCopy() *StorageProviderStatus {
	if in == nil {
		return nil
	}
	out := new(StorageProviderStatus)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *User) DeepCopyInto(out *User) {
	*out = *in
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new User.
func (in *User) DeepCopy() *User {
	if in == nil {
		return nil
	}
	out := new(User)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *VerticalScaling) DeepCopyInto(out *VerticalScaling) {
	*out = *in
	if in.UpdatePolicy != nil {
		in, out := &in.UpdatePolicy, &out.UpdatePolicy
		*out = new(autoscaling_k8s_iov1.PodUpdatePolicy)
		(*in).DeepCopyInto(*out)
	}
	if in.ResourcePolicy != nil {
		in, out := &in.ResourcePolicy, &out.ResourcePolicy
		*out = new(autoscaling_k8s_iov1.PodResourcePolicy)
		(*in).DeepCopyInto(*out)
	}
	if in.Recommenders != nil {
		in, out := &in.Recommenders, &out.Recommenders
		*out = make([]autoscaling_k8s_iov1.VerticalPodAutoscalerRecommenderSelector, len(*in))
		copy(*out, *in)
	}
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VerticalScaling.
func (in *VerticalScaling) DeepCopy() *VerticalScaling {
	if in == nil {
		return nil
	}
	out := new(VerticalScaling)
	in.DeepCopyInto(out)
	return out
}
