mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-02 19:28:16 +00:00 
			
		
		
		
	Merge pull request #98312 from deads2k/finish-export-option-removal
finish removal of exportoptions
This commit is contained in:
		
							
								
								
									
										1120
									
								
								api/openapi-spec/swagger.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1120
									
								
								api/openapi-spec/swagger.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -167,7 +167,7 @@ var nonRoundTrippableTypes = sets.NewString(
 | 
			
		||||
	"PatchOptions",
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var commonKinds = []string{"Status", "ListOptions", "DeleteOptions", "ExportOptions", "GetOptions", "CreateOptions", "UpdateOptions", "PatchOptions"}
 | 
			
		||||
var commonKinds = []string{"Status", "ListOptions", "DeleteOptions", "GetOptions", "CreateOptions", "UpdateOptions", "PatchOptions"}
 | 
			
		||||
 | 
			
		||||
// TestCommonKindsRegistered verifies that all group/versions registered with
 | 
			
		||||
// the legacyscheme package have the common kinds.
 | 
			
		||||
 
 | 
			
		||||
@@ -64,7 +64,6 @@ var typesAllowedTags = map[reflect.Type]bool{
 | 
			
		||||
	reflect.TypeOf(metav1.OwnerReference{}):       true,
 | 
			
		||||
	reflect.TypeOf(metav1.LabelSelector{}):        true,
 | 
			
		||||
	reflect.TypeOf(metav1.GetOptions{}):           true,
 | 
			
		||||
	reflect.TypeOf(metav1.ExportOptions{}):        true,
 | 
			
		||||
	reflect.TypeOf(metav1.ListOptions{}):          true,
 | 
			
		||||
	reflect.TypeOf(metav1.DeleteOptions{}):        true,
 | 
			
		||||
	reflect.TypeOf(metav1.GroupVersionKind{}):     true,
 | 
			
		||||
 
 | 
			
		||||
@@ -160,18 +160,7 @@ func TestLegacyRestStorageStrategies(t *testing.T) {
 | 
			
		||||
		t.Errorf("failed to create legacy REST storage: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Any new stores with export logic will need to be added here:
 | 
			
		||||
	exceptions := registrytest.StrategyExceptions{
 | 
			
		||||
		// Only these stores should have an export strategy defined:
 | 
			
		||||
		HasExportStrategy: []string{
 | 
			
		||||
			"secrets",
 | 
			
		||||
			"limitRanges",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"podTemplates",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	strategyErrors := registrytest.ValidateStorageStrategies(apiGroupInfo.VersionedResourcesStorageMap["v1"], exceptions)
 | 
			
		||||
	strategyErrors := registrytest.ValidateStorageStrategies(apiGroupInfo.VersionedResourcesStorageMap["v1"])
 | 
			
		||||
	for _, err := range strategyErrors {
 | 
			
		||||
		t.Error(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -187,14 +176,8 @@ func TestCertificatesRestStorageStrategies(t *testing.T) {
 | 
			
		||||
		t.Fatalf("unexpected error from REST storage: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	exceptions := registrytest.StrategyExceptions{
 | 
			
		||||
		HasExportStrategy: []string{
 | 
			
		||||
			"certificatesigningrequests",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	strategyErrors := registrytest.ValidateStorageStrategies(
 | 
			
		||||
		apiGroupInfo.VersionedResourcesStorageMap[certificatesapiv1beta1.SchemeGroupVersion.Version], exceptions)
 | 
			
		||||
		apiGroupInfo.VersionedResourcesStorageMap[certificatesapiv1beta1.SchemeGroupVersion.Version])
 | 
			
		||||
	for _, err := range strategyErrors {
 | 
			
		||||
		t.Error(err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,6 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Approva
 | 
			
		||||
		CreateStrategy: csrregistry.Strategy,
 | 
			
		||||
		UpdateStrategy: csrregistry.Strategy,
 | 
			
		||||
		DeleteStrategy: csrregistry.Strategy,
 | 
			
		||||
		ExportStrategy: csrregistry.Strategy,
 | 
			
		||||
 | 
			
		||||
		TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)},
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -118,21 +118,6 @@ func (csrStrategy) AllowUnconditionalUpdate() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s csrStrategy) Export(ctx context.Context, obj runtime.Object, exact bool) error {
 | 
			
		||||
	csr, ok := obj.(*certificates.CertificateSigningRequest)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		// unexpected programmer error
 | 
			
		||||
		return fmt.Errorf("unexpected object: %v", obj)
 | 
			
		||||
	}
 | 
			
		||||
	s.PrepareForCreate(ctx, obj)
 | 
			
		||||
	if exact {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	// CSRs allow direct subresource edits, we clear them without exact so the CSR value can be reused.
 | 
			
		||||
	csr.Status = certificates.CertificateSigningRequestStatus{}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Storage strategy for the Status subresource
 | 
			
		||||
type csrStatusStrategy struct {
 | 
			
		||||
	csrStrategy
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,6 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
 | 
			
		||||
		CreateStrategy: limitrange.Strategy,
 | 
			
		||||
		UpdateStrategy: limitrange.Strategy,
 | 
			
		||||
		DeleteStrategy: limitrange.Strategy,
 | 
			
		||||
		ExportStrategy: limitrange.Strategy,
 | 
			
		||||
 | 
			
		||||
		// TODO: define table converter that exposes more than name/creation timestamp
 | 
			
		||||
		TableConvertor: rest.NewDefaultTableConvertor(api.Resource("limitranges")),
 | 
			
		||||
 
 | 
			
		||||
@@ -72,10 +72,3 @@ func (limitrangeStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.O
 | 
			
		||||
func (limitrangeStrategy) AllowUnconditionalUpdate() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (limitrangeStrategy) Export(context.Context, runtime.Object, bool) error {
 | 
			
		||||
	// Copied from OpenShift exporter
 | 
			
		||||
	// TODO: this needs to be fixed
 | 
			
		||||
	//  limitrange.Strategy.PrepareForCreate(ctx, obj)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -119,10 +119,6 @@ func (r *REST) Watch(ctx context.Context, options *metainternalversion.ListOptio
 | 
			
		||||
	return r.store.Watch(ctx, options)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *REST) Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) {
 | 
			
		||||
	return r.store.Export(ctx, name, opts)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Delete enforces life-cycle rules for namespace termination
 | 
			
		||||
func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
 | 
			
		||||
	nsObj, err := r.Get(ctx, name, &metav1.GetOptions{})
 | 
			
		||||
 
 | 
			
		||||
@@ -88,7 +88,6 @@ func NewStorage(optsGetter generic.RESTOptionsGetter, kubeletClientConfig client
 | 
			
		||||
		CreateStrategy: node.Strategy,
 | 
			
		||||
		UpdateStrategy: node.Strategy,
 | 
			
		||||
		DeleteStrategy: node.Strategy,
 | 
			
		||||
		ExportStrategy: node.Strategy,
 | 
			
		||||
 | 
			
		||||
		TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)},
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -141,22 +141,6 @@ func (nodeStrategy) AllowUnconditionalUpdate() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ns nodeStrategy) Export(ctx context.Context, obj runtime.Object, exact bool) error {
 | 
			
		||||
	n, ok := obj.(*api.Node)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		// unexpected programmer error
 | 
			
		||||
		return fmt.Errorf("unexpected object: %v", obj)
 | 
			
		||||
	}
 | 
			
		||||
	ns.PrepareForCreate(ctx, obj)
 | 
			
		||||
	if exact {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	// Nodes are the only resources that allow direct status edits, therefore
 | 
			
		||||
	// we clear that without exact so that the node value can be reused.
 | 
			
		||||
	n.Status = api.NodeStatus{}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type nodeStatusStrategy struct {
 | 
			
		||||
	nodeStrategy
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,6 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
 | 
			
		||||
		CreateStrategy: podtemplate.Strategy,
 | 
			
		||||
		UpdateStrategy: podtemplate.Strategy,
 | 
			
		||||
		DeleteStrategy: podtemplate.Strategy,
 | 
			
		||||
		ExportStrategy: podtemplate.Strategy,
 | 
			
		||||
 | 
			
		||||
		ReturnDeletedObject: true,
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -87,8 +87,3 @@ func (podTemplateStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.
 | 
			
		||||
func (podTemplateStrategy) AllowUnconditionalUpdate() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (podTemplateStrategy) Export(ctx context.Context, obj runtime.Object, exact bool) error {
 | 
			
		||||
	// Do nothing
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,6 @@ go_library(
 | 
			
		||||
        "//pkg/api/legacyscheme:go_default_library",
 | 
			
		||||
        "//pkg/apis/core:go_default_library",
 | 
			
		||||
        "//pkg/apis/core/validation:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
 | 
			
		||||
@@ -37,9 +36,6 @@ go_test(
 | 
			
		||||
        "//pkg/api/testing:go_default_library",
 | 
			
		||||
        "//pkg/apis/core:go_default_library",
 | 
			
		||||
        "//pkg/apis/core/install:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,6 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
 | 
			
		||||
		CreateStrategy: secret.Strategy,
 | 
			
		||||
		UpdateStrategy: secret.Strategy,
 | 
			
		||||
		DeleteStrategy: secret.Strategy,
 | 
			
		||||
		ExportStrategy: secret.Strategy,
 | 
			
		||||
 | 
			
		||||
		TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)},
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,6 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/api/errors"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/fields"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/labels"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
@@ -85,26 +84,6 @@ func (strategy) AllowUnconditionalUpdate() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s strategy) Export(ctx context.Context, obj runtime.Object, exact bool) error {
 | 
			
		||||
	t, ok := obj.(*api.Secret)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		// unexpected programmer error
 | 
			
		||||
		return fmt.Errorf("unexpected object: %v", obj)
 | 
			
		||||
	}
 | 
			
		||||
	s.PrepareForCreate(ctx, obj)
 | 
			
		||||
	if exact {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	// secrets that are tied to the UID of a service account cannot be exported anyway
 | 
			
		||||
	if t.Type == api.SecretTypeServiceAccountToken || len(t.Annotations[api.ServiceAccountUIDKey]) > 0 {
 | 
			
		||||
		errs := []*field.Error{
 | 
			
		||||
			field.Invalid(field.NewPath("type"), t, "can not export service account secrets"),
 | 
			
		||||
		}
 | 
			
		||||
		return errors.NewInvalid(api.Kind("Secret"), t.Name, errs)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetAttrs returns labels and fields of a given object for filtering purposes.
 | 
			
		||||
func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) {
 | 
			
		||||
	secret, ok := obj.(*api.Secret)
 | 
			
		||||
 
 | 
			
		||||
@@ -17,12 +17,8 @@ limitations under the License.
 | 
			
		||||
package secret
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
 | 
			
		||||
	apitesting "k8s.io/kubernetes/pkg/api/testing"
 | 
			
		||||
	api "k8s.io/kubernetes/pkg/apis/core"
 | 
			
		||||
 | 
			
		||||
@@ -30,80 +26,6 @@ import (
 | 
			
		||||
	_ "k8s.io/kubernetes/pkg/apis/core/install"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestExportSecret(t *testing.T) {
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		objIn     runtime.Object
 | 
			
		||||
		objOut    runtime.Object
 | 
			
		||||
		exact     bool
 | 
			
		||||
		expectErr bool
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			objIn: &api.Secret{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
				},
 | 
			
		||||
				Data: map[string][]byte{
 | 
			
		||||
					"foo": []byte("bar"),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			objOut: &api.Secret{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
				},
 | 
			
		||||
				Data: map[string][]byte{
 | 
			
		||||
					"foo": []byte("bar"),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			exact: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			objIn: &api.Secret{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
				},
 | 
			
		||||
				Type: api.SecretTypeServiceAccountToken,
 | 
			
		||||
			},
 | 
			
		||||
			expectErr: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			objIn: &api.Secret{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
					Annotations: map[string]string{
 | 
			
		||||
						api.ServiceAccountUIDKey: "true",
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectErr: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			objIn:     &api.Pod{},
 | 
			
		||||
			expectErr: true,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, test := range tests {
 | 
			
		||||
		err := Strategy.Export(genericapirequest.NewContext(), test.objIn, test.exact)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if !test.expectErr {
 | 
			
		||||
				t.Errorf("unexpected error: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if test.expectErr {
 | 
			
		||||
			t.Error("unexpected non-error")
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if !reflect.DeepEqual(test.objIn, test.objOut) {
 | 
			
		||||
			t.Errorf("expected:\n%v\nsaw:\n%v\n", test.objOut, test.objIn)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSelectableFieldLabelConversions(t *testing.T) {
 | 
			
		||||
	apitesting.TestSelectableFieldLabelConversionsOfKind(t,
 | 
			
		||||
		"v1",
 | 
			
		||||
 
 | 
			
		||||
@@ -79,7 +79,6 @@ type ServiceStorage interface {
 | 
			
		||||
	rest.CreaterUpdater
 | 
			
		||||
	rest.GracefulDeleter
 | 
			
		||||
	rest.Watcher
 | 
			
		||||
	rest.Exporter
 | 
			
		||||
	rest.StorageVersionProvider
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -189,10 +188,6 @@ func (rs *REST) Watch(ctx context.Context, options *metainternalversion.ListOpti
 | 
			
		||||
	return rs.services.Watch(ctx, options)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (rs *REST) Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) {
 | 
			
		||||
	return rs.services.Export(ctx, name, opts)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (rs *REST) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
 | 
			
		||||
	service := obj.(*api.Service)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -163,10 +163,6 @@ func (s *serviceStorage) ConvertToTable(ctx context.Context, object runtime.Obje
 | 
			
		||||
	panic("not implemented")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *serviceStorage) Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) {
 | 
			
		||||
	panic("not implemented")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *serviceStorage) StorageVersion() runtime.GroupVersioner {
 | 
			
		||||
	panic("not implemented")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,6 @@ func NewGenericREST(optsGetter generic.RESTOptionsGetter, serviceCIDR net.IPNet,
 | 
			
		||||
		CreateStrategy: strategy,
 | 
			
		||||
		UpdateStrategy: strategy,
 | 
			
		||||
		DeleteStrategy: strategy,
 | 
			
		||||
		ExportStrategy: strategy,
 | 
			
		||||
 | 
			
		||||
		TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)},
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,6 @@ package service
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"reflect"
 | 
			
		||||
 | 
			
		||||
@@ -37,7 +36,6 @@ import (
 | 
			
		||||
 | 
			
		||||
type Strategy interface {
 | 
			
		||||
	rest.RESTCreateUpdateStrategy
 | 
			
		||||
	rest.RESTExportStrategy
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// svcStrategy implements behavior for Services
 | 
			
		||||
@@ -139,30 +137,6 @@ func (svcStrategy) AllowUnconditionalUpdate() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (svcStrategy) Export(ctx context.Context, obj runtime.Object, exact bool) error {
 | 
			
		||||
	t, ok := obj.(*api.Service)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		// unexpected programmer error
 | 
			
		||||
		return fmt.Errorf("unexpected object: %v", obj)
 | 
			
		||||
	}
 | 
			
		||||
	// TODO: service does not yet have a prepare create strategy (see above)
 | 
			
		||||
	t.Status = api.ServiceStatus{}
 | 
			
		||||
	if exact {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	//set ClusterIPs as nil - if ClusterIPs[0] != None
 | 
			
		||||
	if len(t.Spec.ClusterIPs) > 0 && t.Spec.ClusterIPs[0] != api.ClusterIPNone {
 | 
			
		||||
		t.Spec.ClusterIP = ""
 | 
			
		||||
		t.Spec.ClusterIPs = nil
 | 
			
		||||
	}
 | 
			
		||||
	if t.Spec.Type == api.ServiceTypeNodePort {
 | 
			
		||||
		for i := range t.Spec.Ports {
 | 
			
		||||
			t.Spec.Ports[i].NodePort = 0
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dropServiceDisabledFields drops fields that are not used if their associated feature gates
 | 
			
		||||
// are not enabled.  The typical pattern is:
 | 
			
		||||
//     if !utilfeature.DefaultFeatureGate.Enabled(features.MyFeature) && !myFeatureInUse(oldSvc) {
 | 
			
		||||
 
 | 
			
		||||
@@ -47,115 +47,6 @@ func newStrategy(cidr string, hasSecondary bool) (testStrategy Strategy, testSta
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestExportService(t *testing.T) {
 | 
			
		||||
	testStrategy, _ := newStrategy("10.0.0.0/16", false)
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		objIn     runtime.Object
 | 
			
		||||
		objOut    runtime.Object
 | 
			
		||||
		exact     bool
 | 
			
		||||
		expectErr bool
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			objIn: &api.Service{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
				},
 | 
			
		||||
				Status: api.ServiceStatus{
 | 
			
		||||
					LoadBalancer: api.LoadBalancerStatus{
 | 
			
		||||
						Ingress: []api.LoadBalancerIngress{
 | 
			
		||||
							{IP: "1.2.3.4"},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			objOut: &api.Service{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			exact: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			objIn: &api.Service{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
				},
 | 
			
		||||
				Spec: api.ServiceSpec{
 | 
			
		||||
					ClusterIPs: []string{"10.0.0.1"},
 | 
			
		||||
				},
 | 
			
		||||
				Status: api.ServiceStatus{
 | 
			
		||||
					LoadBalancer: api.LoadBalancerStatus{
 | 
			
		||||
						Ingress: []api.LoadBalancerIngress{
 | 
			
		||||
							{IP: "1.2.3.4"},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			objOut: &api.Service{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
				},
 | 
			
		||||
				Spec: api.ServiceSpec{
 | 
			
		||||
					ClusterIPs: nil,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			objIn: &api.Service{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
				},
 | 
			
		||||
				Spec: api.ServiceSpec{
 | 
			
		||||
					ClusterIPs: []string{"10.0.0.1", "2001::1"},
 | 
			
		||||
				},
 | 
			
		||||
				Status: api.ServiceStatus{
 | 
			
		||||
					LoadBalancer: api.LoadBalancerStatus{
 | 
			
		||||
						Ingress: []api.LoadBalancerIngress{
 | 
			
		||||
							{IP: "1.2.3.4"},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			objOut: &api.Service{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:      "foo",
 | 
			
		||||
					Namespace: "bar",
 | 
			
		||||
				},
 | 
			
		||||
				Spec: api.ServiceSpec{
 | 
			
		||||
					ClusterIPs: nil,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			objIn:     &api.Pod{},
 | 
			
		||||
			expectErr: true,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, test := range tests {
 | 
			
		||||
		err := testStrategy.Export(genericapirequest.NewContext(), test.objIn, test.exact)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if !test.expectErr {
 | 
			
		||||
				t.Errorf("unexpected error: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if test.expectErr {
 | 
			
		||||
			t.Error("unexpected non-error")
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if !reflect.DeepEqual(test.objIn, test.objOut) {
 | 
			
		||||
			t.Errorf("expected:\n%v\nsaw:\n%v\n", test.objOut, test.objIn)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCheckGeneratedNameError(t *testing.T) {
 | 
			
		||||
	testStrategy, _ := newStrategy("10.0.0.0/16", false)
 | 
			
		||||
	expect := errors.NewNotFound(api.Resource("foos"), "bar")
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,6 @@ go_library(
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//pkg/apis/core:go_default_library",
 | 
			
		||||
        "//pkg/kubeapiserver:go_default_library",
 | 
			
		||||
        "//pkg/util/slice:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
			
		||||
 
 | 
			
		||||
@@ -117,10 +117,3 @@ func (r *ServiceRegistry) WatchServices(ctx context.Context, options *metaintern
 | 
			
		||||
 | 
			
		||||
	return nil, r.Err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *ServiceRegistry) ExportService(ctx context.Context, name string, options metav1.ExportOptions) (*api.Service, error) {
 | 
			
		||||
	r.mu.Lock()
 | 
			
		||||
	defer r.mu.Unlock()
 | 
			
		||||
 | 
			
		||||
	return r.Service, r.Err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,17 +21,13 @@ import (
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apiserver/pkg/registry/generic/registry"
 | 
			
		||||
	"k8s.io/apiserver/pkg/registry/rest"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/util/slice"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ValidateStorageStrategies ensures any instances of the generic registry.Store in the given storage map
 | 
			
		||||
// have expected strategies defined.
 | 
			
		||||
func ValidateStorageStrategies(storageMap map[string]rest.Storage, exceptions StrategyExceptions) []error {
 | 
			
		||||
func ValidateStorageStrategies(storageMap map[string]rest.Storage) []error {
 | 
			
		||||
	errs := []error{}
 | 
			
		||||
 | 
			
		||||
	// Used to ensure we saw all the expected exceptions:
 | 
			
		||||
	hasExportExceptionsSeen := []string{}
 | 
			
		||||
 | 
			
		||||
	for k, storage := range storageMap {
 | 
			
		||||
		switch t := storage.(type) {
 | 
			
		||||
		case registry.GenericStore:
 | 
			
		||||
@@ -46,27 +42,6 @@ func ValidateStorageStrategies(storageMap map[string]rest.Storage, exceptions St
 | 
			
		||||
			if t.GetDeleteStrategy() == nil {
 | 
			
		||||
				errs = append(errs, fmt.Errorf("store for type [%v] does not have a DeleteStrategy", k))
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Check that ExportStrategy is set if applicable:
 | 
			
		||||
			if slice.ContainsString(exceptions.HasExportStrategy, k, nil) {
 | 
			
		||||
				hasExportExceptionsSeen = append(hasExportExceptionsSeen, k)
 | 
			
		||||
				if t.GetExportStrategy() == nil {
 | 
			
		||||
					errs = append(errs, fmt.Errorf("store for type [%v] does not have an ExportStrategy", k))
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				// By default we expect Stores to not have additional export logic:
 | 
			
		||||
				if t.GetExportStrategy() != nil {
 | 
			
		||||
					errs = append(errs, fmt.Errorf("store for type [%v] has an unexpected ExportStrategy", k))
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure that we saw all our expected exceptions:
 | 
			
		||||
	for _, expKey := range exceptions.HasExportStrategy {
 | 
			
		||||
		if !slice.ContainsString(hasExportExceptionsSeen, expKey, nil) {
 | 
			
		||||
			errs = append(errs, fmt.Errorf("no generic store seen for expected ExportStrategy: %v", expKey))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -388,7 +388,7 @@ func (r *crdHandler) serveResource(w http.ResponseWriter, req *http.Request, req
 | 
			
		||||
 | 
			
		||||
	switch requestInfo.Verb {
 | 
			
		||||
	case "get":
 | 
			
		||||
		return handlers.GetResource(storage, storage, requestScope)
 | 
			
		||||
		return handlers.GetResource(storage, requestScope)
 | 
			
		||||
	case "list":
 | 
			
		||||
		forceWatch := false
 | 
			
		||||
		return handlers.ListResource(storage, storage, requestScope, forceWatch, r.minRequestTimeout)
 | 
			
		||||
@@ -428,7 +428,7 @@ func (r *crdHandler) serveStatus(w http.ResponseWriter, req *http.Request, reque
 | 
			
		||||
 | 
			
		||||
	switch requestInfo.Verb {
 | 
			
		||||
	case "get":
 | 
			
		||||
		return handlers.GetResource(storage, nil, requestScope)
 | 
			
		||||
		return handlers.GetResource(storage, requestScope)
 | 
			
		||||
	case "update":
 | 
			
		||||
		return handlers.UpdateResource(storage, requestScope, r.admission)
 | 
			
		||||
	case "patch":
 | 
			
		||||
@@ -448,7 +448,7 @@ func (r *crdHandler) serveScale(w http.ResponseWriter, req *http.Request, reques
 | 
			
		||||
 | 
			
		||||
	switch requestInfo.Verb {
 | 
			
		||||
	case "get":
 | 
			
		||||
		return handlers.GetResource(storage, nil, requestScope)
 | 
			
		||||
		return handlers.GetResource(storage, requestScope)
 | 
			
		||||
	case "update":
 | 
			
		||||
		return handlers.UpdateResource(storage, requestScope, r.admission)
 | 
			
		||||
	case "patch":
 | 
			
		||||
@@ -698,7 +698,6 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
 | 
			
		||||
		parameterScheme := runtime.NewScheme()
 | 
			
		||||
		parameterScheme.AddUnversionedTypes(schema.GroupVersion{Group: crd.Spec.Group, Version: v.Name},
 | 
			
		||||
			&metav1.ListOptions{},
 | 
			
		||||
			&metav1.ExportOptions{},
 | 
			
		||||
			&metav1.GetOptions{},
 | 
			
		||||
			&metav1.DeleteOptions{},
 | 
			
		||||
		)
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.CreateOptions":             schema_pkg_apis_meta_v1_CreateOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.DeleteOptions":             schema_pkg_apis_meta_v1_DeleteOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.Duration":                  schema_pkg_apis_meta_v1_Duration(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.ExportOptions":             schema_pkg_apis_meta_v1_ExportOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.FieldsV1":                  schema_pkg_apis_meta_v1_FieldsV1(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.GetOptions":                schema_pkg_apis_meta_v1_GetOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.GroupKind":                 schema_pkg_apis_meta_v1_GroupKind(ref),
 | 
			
		||||
@@ -1560,50 +1559,6 @@ func schema_pkg_apis_meta_v1_Duration(ref common.ReferenceCallback) common.OpenA
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func schema_pkg_apis_meta_v1_ExportOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
 | 
			
		||||
	return common.OpenAPIDefinition{
 | 
			
		||||
		Schema: spec.Schema{
 | 
			
		||||
			SchemaProps: spec.SchemaProps{
 | 
			
		||||
				Description: "ExportOptions is the query options to the standard REST get call. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
				Type:        []string{"object"},
 | 
			
		||||
				Properties: map[string]spec.Schema{
 | 
			
		||||
					"kind": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
 | 
			
		||||
							Type:        []string{"string"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"apiVersion": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
 | 
			
		||||
							Type:        []string{"string"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"export": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Should this value be exported.  Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
							Default:     false,
 | 
			
		||||
							Type:        []string{"boolean"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"exact": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Should the export be exact.  Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
							Default:     false,
 | 
			
		||||
							Type:        []string{"boolean"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Required: []string{"export", "exact"},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func schema_pkg_apis_meta_v1_FieldsV1(ref common.ReferenceCallback) common.OpenAPIDefinition {
 | 
			
		||||
	return common.OpenAPIDefinition{
 | 
			
		||||
		Schema: spec.Schema{
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,6 @@ func newStorage(t *testing.T) (customresource.CustomResourceStorage, *etcd3testi
 | 
			
		||||
	parameterScheme := runtime.NewScheme()
 | 
			
		||||
	parameterScheme.AddUnversionedTypes(schema.GroupVersion{Group: "mygroup.example.com", Version: "v1beta1"},
 | 
			
		||||
		&metav1.ListOptions{},
 | 
			
		||||
		&metav1.ExportOptions{},
 | 
			
		||||
		&metav1.GetOptions{},
 | 
			
		||||
		&metav1.DeleteOptions{},
 | 
			
		||||
	)
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,6 @@ func addToGroupVersion(scheme *runtime.Scheme) error {
 | 
			
		||||
	scheme.AddKnownTypes(SchemeGroupVersion,
 | 
			
		||||
		&ListOptions{},
 | 
			
		||||
		&metav1.GetOptions{},
 | 
			
		||||
		&metav1.ExportOptions{},
 | 
			
		||||
		&metav1.DeleteOptions{},
 | 
			
		||||
		&metav1.CreateOptions{},
 | 
			
		||||
		&metav1.UpdateOptions{},
 | 
			
		||||
 
 | 
			
		||||
@@ -301,38 +301,10 @@ func (m *Duration) XXX_DiscardUnknown() {
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_Duration proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *ExportOptions) Reset()      { *m = ExportOptions{} }
 | 
			
		||||
func (*ExportOptions) ProtoMessage() {}
 | 
			
		||||
func (*ExportOptions) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{9}
 | 
			
		||||
}
 | 
			
		||||
func (m *ExportOptions) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *ExportOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	b = b[:cap(b)]
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return b[:n], nil
 | 
			
		||||
}
 | 
			
		||||
func (m *ExportOptions) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_ExportOptions.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *ExportOptions) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *ExportOptions) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_ExportOptions.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_ExportOptions proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *FieldsV1) Reset()      { *m = FieldsV1{} }
 | 
			
		||||
func (*FieldsV1) ProtoMessage() {}
 | 
			
		||||
func (*FieldsV1) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{10}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{9}
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldsV1) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -360,7 +332,7 @@ var xxx_messageInfo_FieldsV1 proto.InternalMessageInfo
 | 
			
		||||
func (m *GetOptions) Reset()      { *m = GetOptions{} }
 | 
			
		||||
func (*GetOptions) ProtoMessage() {}
 | 
			
		||||
func (*GetOptions) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{11}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{10}
 | 
			
		||||
}
 | 
			
		||||
func (m *GetOptions) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -388,7 +360,7 @@ var xxx_messageInfo_GetOptions proto.InternalMessageInfo
 | 
			
		||||
func (m *GroupKind) Reset()      { *m = GroupKind{} }
 | 
			
		||||
func (*GroupKind) ProtoMessage() {}
 | 
			
		||||
func (*GroupKind) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{12}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{11}
 | 
			
		||||
}
 | 
			
		||||
func (m *GroupKind) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -416,7 +388,7 @@ var xxx_messageInfo_GroupKind proto.InternalMessageInfo
 | 
			
		||||
func (m *GroupResource) Reset()      { *m = GroupResource{} }
 | 
			
		||||
func (*GroupResource) ProtoMessage() {}
 | 
			
		||||
func (*GroupResource) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{13}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{12}
 | 
			
		||||
}
 | 
			
		||||
func (m *GroupResource) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -444,7 +416,7 @@ var xxx_messageInfo_GroupResource proto.InternalMessageInfo
 | 
			
		||||
func (m *GroupVersion) Reset()      { *m = GroupVersion{} }
 | 
			
		||||
func (*GroupVersion) ProtoMessage() {}
 | 
			
		||||
func (*GroupVersion) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{14}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{13}
 | 
			
		||||
}
 | 
			
		||||
func (m *GroupVersion) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -472,7 +444,7 @@ var xxx_messageInfo_GroupVersion proto.InternalMessageInfo
 | 
			
		||||
func (m *GroupVersionForDiscovery) Reset()      { *m = GroupVersionForDiscovery{} }
 | 
			
		||||
func (*GroupVersionForDiscovery) ProtoMessage() {}
 | 
			
		||||
func (*GroupVersionForDiscovery) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{15}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{14}
 | 
			
		||||
}
 | 
			
		||||
func (m *GroupVersionForDiscovery) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -500,7 +472,7 @@ var xxx_messageInfo_GroupVersionForDiscovery proto.InternalMessageInfo
 | 
			
		||||
func (m *GroupVersionKind) Reset()      { *m = GroupVersionKind{} }
 | 
			
		||||
func (*GroupVersionKind) ProtoMessage() {}
 | 
			
		||||
func (*GroupVersionKind) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{16}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{15}
 | 
			
		||||
}
 | 
			
		||||
func (m *GroupVersionKind) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -528,7 +500,7 @@ var xxx_messageInfo_GroupVersionKind proto.InternalMessageInfo
 | 
			
		||||
func (m *GroupVersionResource) Reset()      { *m = GroupVersionResource{} }
 | 
			
		||||
func (*GroupVersionResource) ProtoMessage() {}
 | 
			
		||||
func (*GroupVersionResource) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{17}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{16}
 | 
			
		||||
}
 | 
			
		||||
func (m *GroupVersionResource) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -556,7 +528,7 @@ var xxx_messageInfo_GroupVersionResource proto.InternalMessageInfo
 | 
			
		||||
func (m *LabelSelector) Reset()      { *m = LabelSelector{} }
 | 
			
		||||
func (*LabelSelector) ProtoMessage() {}
 | 
			
		||||
func (*LabelSelector) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{18}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{17}
 | 
			
		||||
}
 | 
			
		||||
func (m *LabelSelector) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -584,7 +556,7 @@ var xxx_messageInfo_LabelSelector proto.InternalMessageInfo
 | 
			
		||||
func (m *LabelSelectorRequirement) Reset()      { *m = LabelSelectorRequirement{} }
 | 
			
		||||
func (*LabelSelectorRequirement) ProtoMessage() {}
 | 
			
		||||
func (*LabelSelectorRequirement) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{19}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{18}
 | 
			
		||||
}
 | 
			
		||||
func (m *LabelSelectorRequirement) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -612,7 +584,7 @@ var xxx_messageInfo_LabelSelectorRequirement proto.InternalMessageInfo
 | 
			
		||||
func (m *List) Reset()      { *m = List{} }
 | 
			
		||||
func (*List) ProtoMessage() {}
 | 
			
		||||
func (*List) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{20}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{19}
 | 
			
		||||
}
 | 
			
		||||
func (m *List) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -640,7 +612,7 @@ var xxx_messageInfo_List proto.InternalMessageInfo
 | 
			
		||||
func (m *ListMeta) Reset()      { *m = ListMeta{} }
 | 
			
		||||
func (*ListMeta) ProtoMessage() {}
 | 
			
		||||
func (*ListMeta) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{21}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{20}
 | 
			
		||||
}
 | 
			
		||||
func (m *ListMeta) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -668,7 +640,7 @@ var xxx_messageInfo_ListMeta proto.InternalMessageInfo
 | 
			
		||||
func (m *ListOptions) Reset()      { *m = ListOptions{} }
 | 
			
		||||
func (*ListOptions) ProtoMessage() {}
 | 
			
		||||
func (*ListOptions) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{22}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{21}
 | 
			
		||||
}
 | 
			
		||||
func (m *ListOptions) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -696,7 +668,7 @@ var xxx_messageInfo_ListOptions proto.InternalMessageInfo
 | 
			
		||||
func (m *ManagedFieldsEntry) Reset()      { *m = ManagedFieldsEntry{} }
 | 
			
		||||
func (*ManagedFieldsEntry) ProtoMessage() {}
 | 
			
		||||
func (*ManagedFieldsEntry) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{23}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{22}
 | 
			
		||||
}
 | 
			
		||||
func (m *ManagedFieldsEntry) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -724,7 +696,7 @@ var xxx_messageInfo_ManagedFieldsEntry proto.InternalMessageInfo
 | 
			
		||||
func (m *MicroTime) Reset()      { *m = MicroTime{} }
 | 
			
		||||
func (*MicroTime) ProtoMessage() {}
 | 
			
		||||
func (*MicroTime) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{24}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{23}
 | 
			
		||||
}
 | 
			
		||||
func (m *MicroTime) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_MicroTime.Unmarshal(m, b)
 | 
			
		||||
@@ -747,7 +719,7 @@ var xxx_messageInfo_MicroTime proto.InternalMessageInfo
 | 
			
		||||
func (m *ObjectMeta) Reset()      { *m = ObjectMeta{} }
 | 
			
		||||
func (*ObjectMeta) ProtoMessage() {}
 | 
			
		||||
func (*ObjectMeta) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{25}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{24}
 | 
			
		||||
}
 | 
			
		||||
func (m *ObjectMeta) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -775,7 +747,7 @@ var xxx_messageInfo_ObjectMeta proto.InternalMessageInfo
 | 
			
		||||
func (m *OwnerReference) Reset()      { *m = OwnerReference{} }
 | 
			
		||||
func (*OwnerReference) ProtoMessage() {}
 | 
			
		||||
func (*OwnerReference) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{26}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{25}
 | 
			
		||||
}
 | 
			
		||||
func (m *OwnerReference) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -803,7 +775,7 @@ var xxx_messageInfo_OwnerReference proto.InternalMessageInfo
 | 
			
		||||
func (m *PartialObjectMetadata) Reset()      { *m = PartialObjectMetadata{} }
 | 
			
		||||
func (*PartialObjectMetadata) ProtoMessage() {}
 | 
			
		||||
func (*PartialObjectMetadata) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{27}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{26}
 | 
			
		||||
}
 | 
			
		||||
func (m *PartialObjectMetadata) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -831,7 +803,7 @@ var xxx_messageInfo_PartialObjectMetadata proto.InternalMessageInfo
 | 
			
		||||
func (m *PartialObjectMetadataList) Reset()      { *m = PartialObjectMetadataList{} }
 | 
			
		||||
func (*PartialObjectMetadataList) ProtoMessage() {}
 | 
			
		||||
func (*PartialObjectMetadataList) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{28}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{27}
 | 
			
		||||
}
 | 
			
		||||
func (m *PartialObjectMetadataList) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -859,7 +831,7 @@ var xxx_messageInfo_PartialObjectMetadataList proto.InternalMessageInfo
 | 
			
		||||
func (m *Patch) Reset()      { *m = Patch{} }
 | 
			
		||||
func (*Patch) ProtoMessage() {}
 | 
			
		||||
func (*Patch) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{29}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{28}
 | 
			
		||||
}
 | 
			
		||||
func (m *Patch) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -887,7 +859,7 @@ var xxx_messageInfo_Patch proto.InternalMessageInfo
 | 
			
		||||
func (m *PatchOptions) Reset()      { *m = PatchOptions{} }
 | 
			
		||||
func (*PatchOptions) ProtoMessage() {}
 | 
			
		||||
func (*PatchOptions) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{30}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{29}
 | 
			
		||||
}
 | 
			
		||||
func (m *PatchOptions) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -915,7 +887,7 @@ var xxx_messageInfo_PatchOptions proto.InternalMessageInfo
 | 
			
		||||
func (m *Preconditions) Reset()      { *m = Preconditions{} }
 | 
			
		||||
func (*Preconditions) ProtoMessage() {}
 | 
			
		||||
func (*Preconditions) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{31}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{30}
 | 
			
		||||
}
 | 
			
		||||
func (m *Preconditions) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -943,7 +915,7 @@ var xxx_messageInfo_Preconditions proto.InternalMessageInfo
 | 
			
		||||
func (m *RootPaths) Reset()      { *m = RootPaths{} }
 | 
			
		||||
func (*RootPaths) ProtoMessage() {}
 | 
			
		||||
func (*RootPaths) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{32}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{31}
 | 
			
		||||
}
 | 
			
		||||
func (m *RootPaths) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -971,7 +943,7 @@ var xxx_messageInfo_RootPaths proto.InternalMessageInfo
 | 
			
		||||
func (m *ServerAddressByClientCIDR) Reset()      { *m = ServerAddressByClientCIDR{} }
 | 
			
		||||
func (*ServerAddressByClientCIDR) ProtoMessage() {}
 | 
			
		||||
func (*ServerAddressByClientCIDR) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{33}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{32}
 | 
			
		||||
}
 | 
			
		||||
func (m *ServerAddressByClientCIDR) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -999,7 +971,7 @@ var xxx_messageInfo_ServerAddressByClientCIDR proto.InternalMessageInfo
 | 
			
		||||
func (m *Status) Reset()      { *m = Status{} }
 | 
			
		||||
func (*Status) ProtoMessage() {}
 | 
			
		||||
func (*Status) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{34}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{33}
 | 
			
		||||
}
 | 
			
		||||
func (m *Status) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -1027,7 +999,7 @@ var xxx_messageInfo_Status proto.InternalMessageInfo
 | 
			
		||||
func (m *StatusCause) Reset()      { *m = StatusCause{} }
 | 
			
		||||
func (*StatusCause) ProtoMessage() {}
 | 
			
		||||
func (*StatusCause) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{35}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{34}
 | 
			
		||||
}
 | 
			
		||||
func (m *StatusCause) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -1055,7 +1027,7 @@ var xxx_messageInfo_StatusCause proto.InternalMessageInfo
 | 
			
		||||
func (m *StatusDetails) Reset()      { *m = StatusDetails{} }
 | 
			
		||||
func (*StatusDetails) ProtoMessage() {}
 | 
			
		||||
func (*StatusDetails) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{36}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{35}
 | 
			
		||||
}
 | 
			
		||||
func (m *StatusDetails) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -1083,7 +1055,7 @@ var xxx_messageInfo_StatusDetails proto.InternalMessageInfo
 | 
			
		||||
func (m *TableOptions) Reset()      { *m = TableOptions{} }
 | 
			
		||||
func (*TableOptions) ProtoMessage() {}
 | 
			
		||||
func (*TableOptions) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{37}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{36}
 | 
			
		||||
}
 | 
			
		||||
func (m *TableOptions) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -1111,7 +1083,7 @@ var xxx_messageInfo_TableOptions proto.InternalMessageInfo
 | 
			
		||||
func (m *Time) Reset()      { *m = Time{} }
 | 
			
		||||
func (*Time) ProtoMessage() {}
 | 
			
		||||
func (*Time) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{38}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{37}
 | 
			
		||||
}
 | 
			
		||||
func (m *Time) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_Time.Unmarshal(m, b)
 | 
			
		||||
@@ -1134,7 +1106,7 @@ var xxx_messageInfo_Time proto.InternalMessageInfo
 | 
			
		||||
func (m *Timestamp) Reset()      { *m = Timestamp{} }
 | 
			
		||||
func (*Timestamp) ProtoMessage() {}
 | 
			
		||||
func (*Timestamp) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{39}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{38}
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -1162,7 +1134,7 @@ var xxx_messageInfo_Timestamp proto.InternalMessageInfo
 | 
			
		||||
func (m *TypeMeta) Reset()      { *m = TypeMeta{} }
 | 
			
		||||
func (*TypeMeta) ProtoMessage() {}
 | 
			
		||||
func (*TypeMeta) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{40}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{39}
 | 
			
		||||
}
 | 
			
		||||
func (m *TypeMeta) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -1190,7 +1162,7 @@ var xxx_messageInfo_TypeMeta proto.InternalMessageInfo
 | 
			
		||||
func (m *UpdateOptions) Reset()      { *m = UpdateOptions{} }
 | 
			
		||||
func (*UpdateOptions) ProtoMessage() {}
 | 
			
		||||
func (*UpdateOptions) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{41}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{40}
 | 
			
		||||
}
 | 
			
		||||
func (m *UpdateOptions) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -1218,7 +1190,7 @@ var xxx_messageInfo_UpdateOptions proto.InternalMessageInfo
 | 
			
		||||
func (m *Verbs) Reset()      { *m = Verbs{} }
 | 
			
		||||
func (*Verbs) ProtoMessage() {}
 | 
			
		||||
func (*Verbs) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{42}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{41}
 | 
			
		||||
}
 | 
			
		||||
func (m *Verbs) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -1246,7 +1218,7 @@ var xxx_messageInfo_Verbs proto.InternalMessageInfo
 | 
			
		||||
func (m *WatchEvent) Reset()      { *m = WatchEvent{} }
 | 
			
		||||
func (*WatchEvent) ProtoMessage() {}
 | 
			
		||||
func (*WatchEvent) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{43}
 | 
			
		||||
	return fileDescriptor_cf52fa777ced5367, []int{42}
 | 
			
		||||
}
 | 
			
		||||
func (m *WatchEvent) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
@@ -1281,7 +1253,6 @@ func init() {
 | 
			
		||||
	proto.RegisterType((*CreateOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.CreateOptions")
 | 
			
		||||
	proto.RegisterType((*DeleteOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.DeleteOptions")
 | 
			
		||||
	proto.RegisterType((*Duration)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Duration")
 | 
			
		||||
	proto.RegisterType((*ExportOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.ExportOptions")
 | 
			
		||||
	proto.RegisterType((*FieldsV1)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.FieldsV1")
 | 
			
		||||
	proto.RegisterType((*GetOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.GetOptions")
 | 
			
		||||
	proto.RegisterType((*GroupKind)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.GroupKind")
 | 
			
		||||
@@ -1326,184 +1297,182 @@ func init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_cf52fa777ced5367 = []byte{
 | 
			
		||||
	// 2832 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	// 2792 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x1a, 0xcd, 0x6f, 0x23, 0x57,
 | 
			
		||||
	0x3d, 0x63, 0xc7, 0x89, 0xfd, 0x73, 0x9c, 0x8f, 0xb7, 0x59, 0xf0, 0x06, 0x11, 0xa7, 0x53, 0xb4,
 | 
			
		||||
	0xda, 0x42, 0xeb, 0x34, 0x4b, 0xa9, 0xb6, 0x5b, 0x5a, 0x88, 0xe3, 0x64, 0x1b, 0x9a, 0x34, 0xd1,
 | 
			
		||||
	0xcb, 0xee, 0x02, 0xa5, 0x42, 0x9d, 0x78, 0x5e, 0x9c, 0x21, 0xe3, 0x19, 0xf7, 0xbd, 0x71, 0xb2,
 | 
			
		||||
	0x86, 0x03, 0x3d, 0x80, 0x00, 0x09, 0xaa, 0x1e, 0x11, 0x07, 0xd4, 0x0a, 0xfe, 0x02, 0x2e, 0xf0,
 | 
			
		||||
	0x07, 0x20, 0xd1, 0x63, 0x25, 0x2e, 0x95, 0x40, 0x56, 0x37, 0x1c, 0x38, 0x22, 0xae, 0xb9, 0x80,
 | 
			
		||||
	0xde, 0xc7, 0xcc, 0xbc, 0xf1, 0xc7, 0x66, 0xdc, 0x2d, 0x15, 0x37, 0xcf, 0xef, 0xfb, 0xbd, 0xf7,
 | 
			
		||||
	0x7b, 0xbf, 0xaf, 0x67, 0xd8, 0x3d, 0xb9, 0xc5, 0xaa, 0x8e, 0xbf, 0x7a, 0xd2, 0x39, 0x24, 0xd4,
 | 
			
		||||
	0x23, 0x01, 0x61, 0xab, 0xa7, 0xc4, 0xb3, 0x7d, 0xba, 0xaa, 0x10, 0x56, 0xdb, 0x69, 0x59, 0x8d,
 | 
			
		||||
	0x63, 0xc7, 0x23, 0xb4, 0xbb, 0xda, 0x3e, 0x69, 0x72, 0x00, 0x5b, 0x6d, 0x91, 0xc0, 0x5a, 0x3d,
 | 
			
		||||
	0x5d, 0x5b, 0x6d, 0x12, 0x8f, 0x50, 0x2b, 0x20, 0x76, 0xb5, 0x4d, 0xfd, 0xc0, 0x47, 0x5f, 0x92,
 | 
			
		||||
	0x5c, 0x55, 0x9d, 0xab, 0xda, 0x3e, 0x69, 0x72, 0x00, 0xab, 0x72, 0xae, 0xea, 0xe9, 0xda, 0xd2,
 | 
			
		||||
	0x33, 0x4d, 0x27, 0x38, 0xee, 0x1c, 0x56, 0x1b, 0x7e, 0x6b, 0xb5, 0xe9, 0x37, 0xfd, 0x55, 0xc1,
 | 
			
		||||
	0x7c, 0xd8, 0x39, 0x12, 0x5f, 0xe2, 0x43, 0xfc, 0x92, 0x42, 0x97, 0x46, 0x9a, 0x42, 0x3b, 0x5e,
 | 
			
		||||
	0xe0, 0xb4, 0x48, 0xbf, 0x15, 0x4b, 0xcf, 0x5f, 0xc6, 0xc0, 0x1a, 0xc7, 0xa4, 0x65, 0xf5, 0xf3,
 | 
			
		||||
	0x99, 0x7f, 0xc9, 0x42, 0x7e, 0x7d, 0x7f, 0xfb, 0x0e, 0xf5, 0x3b, 0x6d, 0xb4, 0x02, 0x93, 0x9e,
 | 
			
		||||
	0xd5, 0x22, 0x65, 0x63, 0xc5, 0xb8, 0x51, 0xa8, 0xcd, 0x7c, 0xd0, 0xab, 0x4c, 0x9c, 0xf7, 0x2a,
 | 
			
		||||
	0x93, 0xaf, 0x59, 0x2d, 0x82, 0x05, 0x06, 0xb9, 0x90, 0x3f, 0x25, 0x94, 0x39, 0xbe, 0xc7, 0xca,
 | 
			
		||||
	0x99, 0x95, 0xec, 0x8d, 0xe2, 0xcd, 0x97, 0xab, 0x69, 0xd6, 0x5f, 0x15, 0x0a, 0xee, 0x4b, 0xd6,
 | 
			
		||||
	0x2d, 0x9f, 0xd6, 0x1d, 0xd6, 0xf0, 0x4f, 0x09, 0xed, 0xd6, 0xe6, 0x95, 0x96, 0xbc, 0x42, 0x32,
 | 
			
		||||
	0x1c, 0x69, 0x40, 0x3f, 0x31, 0x60, 0xbe, 0x4d, 0xc9, 0x11, 0xa1, 0x94, 0xd8, 0x0a, 0x5f, 0xce,
 | 
			
		||||
	0xae, 0x18, 0x9f, 0x82, 0xda, 0xb2, 0x52, 0x3b, 0xbf, 0xdf, 0x27, 0x1f, 0x0f, 0x68, 0x44, 0xbf,
 | 
			
		||||
	0x33, 0x60, 0x89, 0x11, 0x7a, 0x4a, 0xe8, 0xba, 0x6d, 0x53, 0xc2, 0x58, 0xad, 0xbb, 0xe1, 0x3a,
 | 
			
		||||
	0xc4, 0x0b, 0x36, 0xb6, 0xeb, 0x98, 0x95, 0x27, 0xc5, 0x3e, 0x7c, 0x23, 0x9d, 0x41, 0x07, 0xa3,
 | 
			
		||||
	0xe4, 0xd4, 0x4c, 0x65, 0xd1, 0xd2, 0x48, 0x12, 0x86, 0x1f, 0x61, 0x86, 0x79, 0x04, 0x33, 0xe1,
 | 
			
		||||
	0x41, 0xee, 0x38, 0x2c, 0x40, 0xf7, 0x61, 0xaa, 0xc9, 0x3f, 0x58, 0xd9, 0x10, 0x06, 0x56, 0xd3,
 | 
			
		||||
	0x19, 0x18, 0xca, 0xa8, 0xcd, 0x2a, 0x7b, 0xa6, 0xc4, 0x27, 0xc3, 0x4a, 0x9a, 0xf9, 0x8b, 0x49,
 | 
			
		||||
	0x28, 0xae, 0xef, 0x6f, 0x63, 0xc2, 0xfc, 0x0e, 0x6d, 0x90, 0x14, 0x4e, 0x73, 0x0b, 0x66, 0x98,
 | 
			
		||||
	0xe3, 0x35, 0x3b, 0xae, 0x45, 0x39, 0xb4, 0x3c, 0x25, 0x28, 0x17, 0x15, 0xe5, 0xcc, 0x81, 0x86,
 | 
			
		||||
	0xc3, 0x09, 0x4a, 0x74, 0x13, 0x80, 0x4b, 0x60, 0x6d, 0xab, 0x41, 0xec, 0x72, 0x66, 0xc5, 0xb8,
 | 
			
		||||
	0x91, 0xaf, 0x21, 0xc5, 0x07, 0xaf, 0x45, 0x18, 0xac, 0x51, 0xa1, 0x27, 0x21, 0x27, 0x2c, 0x2d,
 | 
			
		||||
	0xe7, 0x85, 0x9a, 0x92, 0x22, 0xcf, 0x89, 0x65, 0x60, 0x89, 0x43, 0x4f, 0xc1, 0xb4, 0xf2, 0xb2,
 | 
			
		||||
	0x72, 0x41, 0x90, 0xcd, 0x29, 0xb2, 0xe9, 0xd0, 0x0d, 0x42, 0x3c, 0x5f, 0xdf, 0x89, 0xe3, 0xd9,
 | 
			
		||||
	0xc2, 0xef, 0xb4, 0xf5, 0xbd, 0xea, 0x78, 0x36, 0x16, 0x18, 0xb4, 0x03, 0xb9, 0x53, 0x42, 0x0f,
 | 
			
		||||
	0xb9, 0x27, 0x70, 0xd7, 0xfc, 0x4a, 0xba, 0x8d, 0xbe, 0xcf, 0x59, 0x6a, 0x05, 0x6e, 0x9a, 0xf8,
 | 
			
		||||
	0x89, 0xa5, 0x10, 0x54, 0x05, 0x60, 0xc7, 0x3e, 0x0d, 0xc4, 0xf2, 0xca, 0xb9, 0x95, 0xec, 0x8d,
 | 
			
		||||
	0x42, 0x6d, 0x96, 0xaf, 0xf7, 0x20, 0x82, 0x62, 0x8d, 0x82, 0xd3, 0x37, 0xac, 0x80, 0x34, 0x7d,
 | 
			
		||||
	0xea, 0x10, 0x56, 0x9e, 0x8e, 0xe9, 0x37, 0x22, 0x28, 0xd6, 0x28, 0xd0, 0xb7, 0x00, 0xb1, 0xc0,
 | 
			
		||||
	0xa7, 0x56, 0x93, 0xa8, 0xa5, 0xbe, 0x62, 0xb1, 0xe3, 0x32, 0x88, 0xd5, 0x2d, 0xa9, 0xd5, 0xa1,
 | 
			
		||||
	0x83, 0x01, 0x0a, 0x3c, 0x84, 0xcb, 0xfc, 0x83, 0x01, 0x73, 0x9a, 0x2f, 0x08, 0xbf, 0xbb, 0x05,
 | 
			
		||||
	0x33, 0x4d, 0xed, 0xd6, 0x29, 0xbf, 0x88, 0x4e, 0x5b, 0xbf, 0x91, 0x38, 0x41, 0x89, 0x08, 0x14,
 | 
			
		||||
	0xa8, 0x92, 0x14, 0x46, 0x97, 0xb5, 0xd4, 0x4e, 0x1b, 0xda, 0x10, 0x6b, 0xd2, 0x80, 0x0c, 0xc7,
 | 
			
		||||
	0x92, 0xcd, 0x7f, 0x1a, 0xc2, 0x81, 0xc3, 0x78, 0x83, 0x6e, 0x68, 0x31, 0xcd, 0x10, 0xdb, 0x37,
 | 
			
		||||
	0x33, 0x22, 0x1e, 0x5d, 0x12, 0x08, 0x32, 0xff, 0x17, 0x81, 0xe0, 0x76, 0xfe, 0xd7, 0xef, 0x55,
 | 
			
		||||
	0x26, 0xde, 0xfe, 0xfb, 0xca, 0x84, 0xf9, 0x9f, 0x0c, 0x14, 0x36, 0x7c, 0xcf, 0x76, 0x02, 0xe5,
 | 
			
		||||
	0xc8, 0x41, 0xb7, 0x3d, 0x70, 0x51, 0xef, 0x76, 0xdb, 0x04, 0x0b, 0x0c, 0x7a, 0x01, 0xa6, 0x58,
 | 
			
		||||
	0x60, 0x05, 0x1d, 0x26, 0xae, 0x5a, 0xa1, 0xf6, 0x44, 0x18, 0x02, 0x0e, 0x04, 0xf4, 0xa2, 0x57,
 | 
			
		||||
	0x99, 0x8b, 0xc4, 0x49, 0x10, 0x56, 0x0c, 0xdc, 0xab, 0xfc, 0x43, 0x61, 0x94, 0x7d, 0x47, 0xa6,
 | 
			
		||||
	0x98, 0x30, 0x56, 0x67, 0x63, 0xaf, 0xda, 0x1b, 0xa0, 0xc0, 0x43, 0xb8, 0xd0, 0x29, 0x20, 0xd7,
 | 
			
		||||
	0x62, 0xc1, 0x5d, 0x6a, 0x79, 0x4c, 0xe8, 0xba, 0xeb, 0xb4, 0x88, 0xba, 0x5c, 0x5f, 0x4e, 0xb7,
 | 
			
		||||
	0xbb, 0x9c, 0x23, 0xd6, 0xbb, 0x33, 0x20, 0x0d, 0x0f, 0xd1, 0x80, 0xae, 0xc3, 0x14, 0x25, 0x16,
 | 
			
		||||
	0xf3, 0xbd, 0x72, 0x4e, 0x2c, 0x3f, 0x8a, 0x80, 0x58, 0x40, 0xb1, 0xc2, 0xf2, 0xe0, 0xd1, 0x22,
 | 
			
		||||
	0x8c, 0x59, 0xcd, 0x30, 0x94, 0x45, 0xc1, 0x63, 0x57, 0x82, 0x71, 0x88, 0x37, 0x5b, 0x50, 0xda,
 | 
			
		||||
	0xa0, 0xc4, 0x0a, 0xc8, 0x5e, 0x3b, 0x10, 0x2e, 0x64, 0xc2, 0x94, 0x4d, 0xbb, 0xb8, 0xe3, 0x29,
 | 
			
		||||
	0x57, 0x03, 0x2e, 0xbf, 0x2e, 0x20, 0x58, 0x61, 0xf8, 0x0d, 0x3a, 0x72, 0x88, 0x6b, 0xef, 0x5a,
 | 
			
		||||
	0x9e, 0xd5, 0x24, 0x54, 0x45, 0x9e, 0xc8, 0xaf, 0xb7, 0x34, 0x1c, 0x4e, 0x50, 0x9a, 0x3f, 0xcb,
 | 
			
		||||
	0x42, 0xa9, 0x4e, 0x5c, 0x12, 0xeb, 0xdb, 0x02, 0xd4, 0xa4, 0x56, 0x83, 0xec, 0x13, 0xea, 0xf8,
 | 
			
		||||
	0xf6, 0x01, 0x69, 0xf8, 0x9e, 0xcd, 0x84, 0x0b, 0x64, 0x6b, 0x9f, 0xe3, 0x7b, 0x73, 0x67, 0x00,
 | 
			
		||||
	0x8b, 0x87, 0x70, 0x20, 0x17, 0x4a, 0x6d, 0x2a, 0x7e, 0x8b, 0xfd, 0x92, 0x1e, 0x52, 0xbc, 0xf9,
 | 
			
		||||
	0xd5, 0x74, 0xc7, 0xb1, 0xaf, 0xb3, 0xd6, 0x16, 0xce, 0x7b, 0x95, 0x52, 0x02, 0x84, 0x93, 0xc2,
 | 
			
		||||
	0xd1, 0x37, 0x61, 0xde, 0xa7, 0xed, 0x63, 0xcb, 0xab, 0x93, 0x36, 0xf1, 0x6c, 0xe2, 0x05, 0x4c,
 | 
			
		||||
	0xec, 0x42, 0xbe, 0xb6, 0xc8, 0x73, 0xf6, 0x5e, 0x1f, 0x0e, 0x0f, 0x50, 0xa3, 0xd7, 0x61, 0xa1,
 | 
			
		||||
	0x4d, 0xfd, 0xb6, 0xd5, 0x14, 0x2e, 0xb5, 0xef, 0xbb, 0x4e, 0xa3, 0x2b, 0x5c, 0xa8, 0x50, 0x7b,
 | 
			
		||||
	0xfa, 0xbc, 0x57, 0x59, 0xd8, 0xef, 0x47, 0x5e, 0xf4, 0x2a, 0x57, 0xc4, 0xd6, 0x71, 0x48, 0x8c,
 | 
			
		||||
	0xc4, 0x83, 0x62, 0xb4, 0x33, 0xcc, 0x8d, 0x3a, 0x43, 0x73, 0x1b, 0xf2, 0xf5, 0x8e, 0xf2, 0xe7,
 | 
			
		||||
	0x97, 0x20, 0x6f, 0xab, 0xdf, 0x6a, 0xe7, 0xc3, 0x8b, 0x15, 0xd1, 0x5c, 0xf4, 0x2a, 0x25, 0x5e,
 | 
			
		||||
	0xa6, 0x55, 0x43, 0x00, 0x8e, 0x58, 0xcc, 0x37, 0xa0, 0xb4, 0xf9, 0xa0, 0xed, 0xd3, 0x20, 0x3c,
 | 
			
		||||
	0xd3, 0xeb, 0x30, 0x45, 0x04, 0x40, 0x48, 0xcb, 0xc7, 0x7e, 0x2a, 0xc9, 0xb0, 0xc2, 0xf2, 0x4c,
 | 
			
		||||
	0x48, 0x1e, 0x58, 0x8d, 0x40, 0x25, 0xce, 0x28, 0x13, 0x6e, 0x72, 0x20, 0x96, 0x38, 0xf3, 0x3a,
 | 
			
		||||
	0xe4, 0x85, 0x43, 0xb1, 0xfb, 0x6b, 0x68, 0x1e, 0xb2, 0xd8, 0x3a, 0x13, 0x52, 0x67, 0x70, 0x96,
 | 
			
		||||
	0x5a, 0x67, 0x5a, 0x2c, 0xd9, 0x03, 0xb8, 0x43, 0x22, 0x13, 0xd6, 0x61, 0x2e, 0x0c, 0xa8, 0xc9,
 | 
			
		||||
	0x38, 0xff, 0x79, 0xa5, 0x64, 0x0e, 0x27, 0xd1, 0xb8, 0x9f, 0xde, 0x7c, 0x03, 0x0a, 0x22, 0x17,
 | 
			
		||||
	0xf0, 0x44, 0x1a, 0x27, 0x6d, 0xe3, 0x11, 0x49, 0x3b, 0xcc, 0xc4, 0x99, 0x51, 0x99, 0x58, 0x33,
 | 
			
		||||
	0xd7, 0x85, 0x92, 0xe4, 0x0d, 0xcb, 0x94, 0x54, 0x1a, 0x9e, 0x86, 0x7c, 0x68, 0xa6, 0xd2, 0x12,
 | 
			
		||||
	0x95, 0xa7, 0xa1, 0x20, 0x1c, 0x51, 0x68, 0xda, 0x8e, 0x21, 0x91, 0xd7, 0xd2, 0x29, 0xd3, 0x6a,
 | 
			
		||||
	0x90, 0xcc, 0xa3, 0x6b, 0x10, 0x4d, 0xd3, 0x8f, 0xa1, 0x3c, 0xaa, 0xa6, 0x7d, 0x8c, 0xcc, 0x9b,
 | 
			
		||||
	0xde, 0x14, 0xf3, 0x1d, 0x03, 0xe6, 0x75, 0x49, 0xe9, 0x8f, 0x2f, 0xbd, 0x92, 0xcb, 0x6b, 0x2e,
 | 
			
		||||
	0x6d, 0x47, 0x7e, 0x6b, 0xc0, 0x62, 0x62, 0x69, 0x63, 0x9d, 0xf8, 0x18, 0x46, 0xe9, 0xce, 0x91,
 | 
			
		||||
	0x1d, 0xc3, 0x39, 0xfe, 0x9a, 0x81, 0xd2, 0x8e, 0x75, 0x48, 0xdc, 0x03, 0xe2, 0x92, 0x46, 0xe0,
 | 
			
		||||
	0x53, 0xf4, 0x23, 0x28, 0xb6, 0xac, 0xa0, 0x71, 0x2c, 0xa0, 0x61, 0x7d, 0x5e, 0x4f, 0x17, 0x4a,
 | 
			
		||||
	0x13, 0x92, 0xaa, 0xbb, 0xb1, 0x98, 0x4d, 0x2f, 0xa0, 0xdd, 0xda, 0x15, 0x65, 0x52, 0x51, 0xc3,
 | 
			
		||||
	0x60, 0x5d, 0x9b, 0x68, 0xaa, 0xc4, 0xf7, 0xe6, 0x83, 0x36, 0x2f, 0x1e, 0xc6, 0xef, 0xe5, 0x12,
 | 
			
		||||
	0x26, 0x60, 0xf2, 0x56, 0xc7, 0xa1, 0xa4, 0x45, 0xbc, 0x20, 0x6e, 0xaa, 0x76, 0xfb, 0xe4, 0xe3,
 | 
			
		||||
	0x01, 0x8d, 0x4b, 0x2f, 0xc3, 0x7c, 0xbf, 0xf1, 0x3c, 0xfe, 0x9c, 0x90, 0xae, 0x3c, 0x2f, 0xcc,
 | 
			
		||||
	0x7f, 0xa2, 0x45, 0xc8, 0x9d, 0x5a, 0x6e, 0x47, 0xdd, 0x46, 0x2c, 0x3f, 0x6e, 0x67, 0x6e, 0x19,
 | 
			
		||||
	0xe6, 0xef, 0x0d, 0x28, 0x8f, 0x32, 0x04, 0x7d, 0x51, 0x13, 0x54, 0x2b, 0x2a, 0xab, 0xb2, 0xaf,
 | 
			
		||||
	0x92, 0xae, 0x94, 0xba, 0x09, 0x79, 0xbf, 0xcd, 0xab, 0x0d, 0x9f, 0xaa, 0x53, 0x7f, 0x2a, 0x3c,
 | 
			
		||||
	0xc9, 0x3d, 0x05, 0xbf, 0xe8, 0x55, 0xae, 0x26, 0xc4, 0x87, 0x08, 0x1c, 0xb1, 0xf2, 0x3c, 0x20,
 | 
			
		||||
	0xec, 0xe1, 0xb9, 0x29, 0xca, 0x03, 0xf7, 0x05, 0x04, 0x2b, 0x8c, 0xf9, 0x27, 0x03, 0x26, 0x45,
 | 
			
		||||
	0x59, 0xfc, 0x06, 0xe4, 0xf9, 0xfe, 0xd9, 0x56, 0x60, 0x09, 0xbb, 0x52, 0x37, 0x64, 0x9c, 0x7b,
 | 
			
		||||
	0x97, 0x04, 0x56, 0xec, 0x6d, 0x21, 0x04, 0x47, 0x12, 0x11, 0x86, 0x9c, 0x13, 0x90, 0x56, 0x78,
 | 
			
		||||
	0x90, 0xcf, 0x8c, 0x14, 0xad, 0xc6, 0x01, 0x55, 0x6c, 0x9d, 0x6d, 0x3e, 0x08, 0x88, 0xc7, 0x0f,
 | 
			
		||||
	0x23, 0xbe, 0x1a, 0xdb, 0x5c, 0x06, 0x96, 0xa2, 0xcc, 0x7f, 0x1b, 0x10, 0xa9, 0xe2, 0xce, 0xcf,
 | 
			
		||||
	0x88, 0x7b, 0xb4, 0xe3, 0x78, 0x27, 0x6a, 0x5b, 0x23, 0x73, 0x0e, 0x14, 0x1c, 0x47, 0x14, 0xc3,
 | 
			
		||||
	0xd2, 0x43, 0x66, 0xbc, 0xf4, 0xc0, 0x15, 0x36, 0x7c, 0x2f, 0x70, 0xbc, 0xce, 0xc0, 0x6d, 0xdb,
 | 
			
		||||
	0x50, 0x70, 0x1c, 0x51, 0xf0, 0x32, 0x87, 0x92, 0x96, 0xe5, 0x78, 0x8e, 0xd7, 0xe4, 0x8b, 0xd8,
 | 
			
		||||
	0xf0, 0x3b, 0x5e, 0x20, 0xf2, 0xbd, 0x2a, 0x73, 0xf0, 0x00, 0x16, 0x0f, 0xe1, 0x30, 0xff, 0x38,
 | 
			
		||||
	0x09, 0x45, 0xbe, 0xe6, 0x30, 0xcf, 0xbd, 0x08, 0x25, 0x57, 0xf7, 0x02, 0xb5, 0xf6, 0xab, 0xca,
 | 
			
		||||
	0x94, 0xe4, 0xbd, 0xc6, 0x49, 0x5a, 0xce, 0x2c, 0xaa, 0xb3, 0x88, 0x39, 0x93, 0x64, 0xde, 0xd2,
 | 
			
		||||
	0x91, 0x38, 0x49, 0xcb, 0xa3, 0xd7, 0x19, 0xbf, 0x1f, 0xaa, 0xee, 0x89, 0x8e, 0xe8, 0xdb, 0x1c,
 | 
			
		||||
	0x88, 0x25, 0x0e, 0xed, 0xc2, 0x15, 0xcb, 0x75, 0xfd, 0x33, 0x01, 0xac, 0xf9, 0xfe, 0x49, 0xcb,
 | 
			
		||||
	0xa2, 0x27, 0x4c, 0xb4, 0xb4, 0xf9, 0xda, 0x17, 0x14, 0xcb, 0x95, 0xf5, 0x41, 0x12, 0x3c, 0x8c,
 | 
			
		||||
	0x6f, 0xd8, 0xb1, 0x4d, 0x8e, 0x79, 0x6c, 0xc7, 0xb0, 0xd8, 0x07, 0x12, 0xb7, 0x5c, 0xf5, 0x97,
 | 
			
		||||
	0xcf, 0x29, 0x39, 0x8b, 0x78, 0x08, 0xcd, 0xc5, 0x08, 0x38, 0x1e, 0x2a, 0x11, 0xdd, 0x86, 0x59,
 | 
			
		||||
	0xee, 0xc9, 0x7e, 0x27, 0x08, 0xab, 0xda, 0x9c, 0x38, 0x6e, 0x74, 0xde, 0xab, 0xcc, 0xde, 0x4d,
 | 
			
		||||
	0x60, 0x70, 0x1f, 0x25, 0xdf, 0x5c, 0xd7, 0x69, 0x39, 0x41, 0x79, 0x5a, 0xb0, 0x44, 0x9b, 0xbb,
 | 
			
		||||
	0xc3, 0x81, 0x58, 0xe2, 0x12, 0x1e, 0x98, 0xbf, 0xcc, 0x03, 0xcd, 0xdf, 0x64, 0x01, 0xc9, 0x32,
 | 
			
		||||
	0xdc, 0x96, 0xf5, 0x94, 0x0c, 0x69, 0xbc, 0x57, 0x50, 0x65, 0xbc, 0xd1, 0xd7, 0x2b, 0xa8, 0x0a,
 | 
			
		||||
	0x3e, 0xc4, 0xa3, 0x5d, 0x28, 0xc8, 0xd0, 0x12, 0x5f, 0x97, 0x55, 0x45, 0x5c, 0xd8, 0x0b, 0x11,
 | 
			
		||||
	0x17, 0xbd, 0xca, 0x52, 0x42, 0x4d, 0x84, 0x11, 0x7d, 0x5c, 0x2c, 0x01, 0xdd, 0x04, 0xb0, 0xda,
 | 
			
		||||
	0x8e, 0x3e, 0x35, 0x2b, 0xc4, 0xb3, 0x93, 0xb8, 0xff, 0xc5, 0x1a, 0x15, 0x7a, 0x05, 0x26, 0x83,
 | 
			
		||||
	0x4f, 0xd6, 0x6b, 0xe5, 0x45, 0x2b, 0xc9, 0x3b, 0x2b, 0x21, 0x81, 0x6b, 0x17, 0xfe, 0xcc, 0xb8,
 | 
			
		||||
	0x59, 0xaa, 0x4d, 0x8a, 0xb4, 0x6f, 0x45, 0x18, 0xac, 0x51, 0xa1, 0xef, 0x40, 0xfe, 0x48, 0x95,
 | 
			
		||||
	0xa2, 0xe2, 0x60, 0x52, 0x87, 0xc8, 0xb0, 0x80, 0x95, 0x8d, 0x7b, 0xf8, 0x85, 0x23, 0x69, 0xe6,
 | 
			
		||||
	0x5b, 0x50, 0xd8, 0x75, 0x1a, 0xd4, 0x17, 0x6d, 0xde, 0x53, 0x30, 0xcd, 0x12, 0x7d, 0x50, 0x74,
 | 
			
		||||
	0x24, 0xa1, 0xbb, 0x84, 0x78, 0xee, 0x27, 0x9e, 0xe5, 0xf9, 0xb2, 0xdb, 0xc9, 0xc5, 0x7e, 0xf2,
 | 
			
		||||
	0x1a, 0x07, 0x62, 0x89, 0xbb, 0xbd, 0xc8, 0x33, 0xfd, 0xcf, 0xdf, 0xaf, 0x4c, 0xbc, 0xfb, 0x7e,
 | 
			
		||||
	0x65, 0xe2, 0xbd, 0xf7, 0x55, 0xd6, 0xbf, 0x00, 0x80, 0xbd, 0xc3, 0x1f, 0x90, 0x86, 0x8c, 0x9f,
 | 
			
		||||
	0xa9, 0xa6, 0x64, 0xe1, 0x70, 0x56, 0x4c, 0xc9, 0x32, 0x7d, 0xd5, 0x9b, 0x86, 0xc3, 0x09, 0x4a,
 | 
			
		||||
	0xb4, 0x0a, 0x85, 0x68, 0xfe, 0xa5, 0x0e, 0x7a, 0x21, 0x74, 0x9c, 0x68, 0x48, 0x86, 0x63, 0x9a,
 | 
			
		||||
	0x44, 0x30, 0x9f, 0xbc, 0x34, 0x98, 0xd7, 0x20, 0xdb, 0x71, 0x6c, 0xd5, 0x13, 0x3f, 0x1b, 0x26,
 | 
			
		||||
	0xd3, 0x7b, 0xdb, 0xf5, 0x8b, 0x5e, 0xe5, 0x89, 0x51, 0x63, 0xe7, 0xa0, 0xdb, 0x26, 0xac, 0x7a,
 | 
			
		||||
	0x6f, 0xbb, 0x8e, 0x39, 0xf3, 0xb0, 0xc8, 0x32, 0x35, 0x66, 0x64, 0xb9, 0x09, 0xd0, 0x8c, 0x27,
 | 
			
		||||
	0x0b, 0xf2, 0xe2, 0x46, 0x1e, 0xa5, 0x4d, 0x14, 0x34, 0x2a, 0xc4, 0x60, 0xa1, 0xc1, 0xdb, 0x6f,
 | 
			
		||||
	0xd5, 0xe1, 0xb3, 0xc0, 0x6a, 0xc9, 0xb9, 0xe0, 0x78, 0xce, 0x7d, 0x4d, 0xa9, 0x59, 0xd8, 0xe8,
 | 
			
		||||
	0x17, 0x86, 0x07, 0xe5, 0x23, 0x1f, 0x16, 0x6c, 0xd5, 0x48, 0xc6, 0x4a, 0x0b, 0x63, 0x2b, 0xbd,
 | 
			
		||||
	0xca, 0x15, 0xd6, 0xfb, 0x05, 0xe1, 0x41, 0xd9, 0xe8, 0xfb, 0xb0, 0x14, 0x02, 0x07, 0xbb, 0x79,
 | 
			
		||||
	0x11, 0x79, 0xb3, 0xb5, 0xe5, 0xf3, 0x5e, 0x65, 0xa9, 0x3e, 0x92, 0x0a, 0x3f, 0x42, 0x02, 0xb2,
 | 
			
		||||
	0x61, 0xca, 0x95, 0x95, 0x6a, 0x51, 0x54, 0x17, 0x5f, 0x4f, 0xb7, 0x8a, 0xd8, 0xfb, 0xab, 0x7a,
 | 
			
		||||
	0x85, 0x1a, 0x75, 0xab, 0xaa, 0x38, 0x55, 0xb2, 0xd1, 0x03, 0x28, 0x5a, 0x9e, 0xe7, 0x07, 0x96,
 | 
			
		||||
	0x9c, 0x2f, 0xcc, 0x08, 0x55, 0xeb, 0x63, 0xab, 0x5a, 0x8f, 0x65, 0xf4, 0x55, 0xc4, 0x1a, 0x06,
 | 
			
		||||
	0xeb, 0xaa, 0xd0, 0x19, 0xcc, 0xf9, 0x67, 0x1e, 0xa1, 0x98, 0x1c, 0x11, 0x4a, 0xbc, 0x06, 0x61,
 | 
			
		||||
	0xe5, 0x92, 0xd0, 0xfe, 0x5c, 0x4a, 0xed, 0x09, 0xe6, 0xd8, 0xa5, 0x93, 0x70, 0x86, 0xfb, 0xb5,
 | 
			
		||||
	0xa0, 0x2a, 0x0f, 0x92, 0x9e, 0xe5, 0x3a, 0x3f, 0x24, 0x94, 0x95, 0x67, 0xe3, 0xd1, 0xed, 0x56,
 | 
			
		||||
	0x04, 0xc5, 0x1a, 0x05, 0xfa, 0x1a, 0x14, 0x1b, 0x6e, 0x87, 0x05, 0x44, 0xce, 0xd1, 0xe7, 0xc4,
 | 
			
		||||
	0x0d, 0x8a, 0xd6, 0xb7, 0x11, 0xa3, 0xb0, 0x4e, 0x87, 0x3a, 0x50, 0x6a, 0xe9, 0x29, 0xa3, 0xbc,
 | 
			
		||||
	0x20, 0x56, 0x77, 0x2b, 0xdd, 0xea, 0x06, 0x93, 0x5a, 0x5c, 0xc1, 0x24, 0x70, 0x38, 0xa9, 0x65,
 | 
			
		||||
	0xe9, 0x05, 0x28, 0x7e, 0xc2, 0xe2, 0x9e, 0x37, 0x07, 0xfd, 0xe7, 0x38, 0x56, 0x73, 0xf0, 0xe7,
 | 
			
		||||
	0x0c, 0xcc, 0x26, 0x77, 0xbf, 0x2f, 0x1d, 0xe6, 0x52, 0xa5, 0xc3, 0xb0, 0x0d, 0x35, 0x46, 0x8e,
 | 
			
		||||
	0xfe, 0xc3, 0xb0, 0x9e, 0x1d, 0x19, 0xd6, 0x55, 0xf4, 0x9c, 0x7c, 0x9c, 0xe8, 0x59, 0x05, 0xe0,
 | 
			
		||||
	0x75, 0x06, 0xf5, 0x5d, 0x97, 0x50, 0x11, 0x38, 0xf3, 0x6a, 0xc4, 0x1f, 0x41, 0xb1, 0x46, 0xc1,
 | 
			
		||||
	0xab, 0xe1, 0x43, 0xd7, 0x6f, 0x9c, 0x88, 0x2d, 0x08, 0x2f, 0xbd, 0x08, 0x99, 0x79, 0x59, 0x0d,
 | 
			
		||||
	0xd7, 0x06, 0xb0, 0x78, 0x08, 0x87, 0xd9, 0x85, 0xab, 0xfb, 0x16, 0x0d, 0x1c, 0xcb, 0x8d, 0x2f,
 | 
			
		||||
	0x98, 0x68, 0x37, 0xde, 0x1c, 0x68, 0x66, 0x9e, 0x1d, 0xf7, 0xa2, 0xc6, 0x9b, 0x1f, 0xc3, 0xe2,
 | 
			
		||||
	0x86, 0xc6, 0xfc, 0x9b, 0x01, 0xd7, 0x86, 0xea, 0xfe, 0x0c, 0x9a, 0xa9, 0x37, 0x93, 0xcd, 0xd4,
 | 
			
		||||
	0x8b, 0x29, 0x67, 0x9c, 0xc3, 0xac, 0x1d, 0xd1, 0x5a, 0x4d, 0x43, 0x6e, 0x9f, 0x17, 0xb1, 0xe6,
 | 
			
		||||
	0xaf, 0x0c, 0x98, 0x11, 0xbf, 0xc6, 0x99, 0x0f, 0x57, 0x20, 0x77, 0xe4, 0x87, 0x23, 0xaa, 0xbc,
 | 
			
		||||
	0x7c, 0x42, 0xda, 0xe2, 0x00, 0x2c, 0xe1, 0x8f, 0x31, 0x40, 0x7e, 0xc7, 0x80, 0xe4, 0x64, 0x16,
 | 
			
		||||
	0xbd, 0x2c, 0xfd, 0xd7, 0x88, 0x46, 0xa7, 0x63, 0xfa, 0xee, 0x4b, 0xa3, 0x5a, 0xc1, 0x2b, 0xa9,
 | 
			
		||||
	0xa6, 0x84, 0x4f, 0x43, 0x01, 0xfb, 0x7e, 0xb0, 0x6f, 0x05, 0xc7, 0x8c, 0x2f, 0xbc, 0xcd, 0x7f,
 | 
			
		||||
	0xa8, 0xbd, 0x11, 0x0b, 0x17, 0x18, 0x2c, 0xe1, 0xe6, 0x2f, 0x0d, 0xb8, 0x36, 0xf2, 0xd5, 0x84,
 | 
			
		||||
	0x87, 0x80, 0x46, 0xf4, 0xa5, 0x56, 0x14, 0x79, 0x61, 0x4c, 0x87, 0x35, 0x2a, 0xde, 0xc3, 0x25,
 | 
			
		||||
	0x9e, 0x5a, 0xfa, 0x7b, 0xb8, 0x84, 0x36, 0x9c, 0xa4, 0x35, 0xff, 0x95, 0x01, 0xf5, 0x74, 0xf2,
 | 
			
		||||
	0x3f, 0xf6, 0xd8, 0xeb, 0x7d, 0x0f, 0x37, 0xb3, 0xc9, 0x87, 0x9b, 0xe8, 0x95, 0x46, 0x7b, 0xb9,
 | 
			
		||||
	0xc8, 0x3e, 0xfa, 0xe5, 0x02, 0x3d, 0x1f, 0x3d, 0x86, 0xc8, 0xd0, 0xb5, 0x9c, 0x7c, 0x0c, 0xb9,
 | 
			
		||||
	0xe8, 0x55, 0x66, 0x94, 0xf0, 0xe4, 0xe3, 0xc8, 0xeb, 0x30, 0x6d, 0x93, 0xc0, 0x72, 0x5c, 0xd9,
 | 
			
		||||
	0x8f, 0xa5, 0x7e, 0x22, 0x90, 0xc2, 0xea, 0x92, 0xb5, 0x56, 0xe4, 0x36, 0xa9, 0x0f, 0x1c, 0x0a,
 | 
			
		||||
	0xe4, 0xd1, 0xb6, 0xe1, 0xdb, 0xb2, 0x9d, 0xc8, 0xc5, 0xd1, 0x76, 0xc3, 0xb7, 0x09, 0x16, 0x18,
 | 
			
		||||
	0xf3, 0x5d, 0x03, 0x8a, 0x52, 0xd2, 0x86, 0xd5, 0x61, 0x04, 0xad, 0x45, 0xab, 0x90, 0xc7, 0x7d,
 | 
			
		||||
	0x4d, 0x7f, 0xf5, 0xba, 0xe8, 0x55, 0x0a, 0x82, 0x4c, 0x74, 0x22, 0x43, 0x5e, 0x77, 0x32, 0x97,
 | 
			
		||||
	0xec, 0xd1, 0x93, 0x90, 0x13, 0xb7, 0x47, 0x6d, 0x66, 0x74, 0xd7, 0xc5, 0x05, 0xc3, 0x12, 0x67,
 | 
			
		||||
	0x7e, 0x9c, 0x81, 0x52, 0x62, 0x71, 0x29, 0x7a, 0x81, 0x68, 0x74, 0x99, 0x49, 0x31, 0x0e, 0x1f,
 | 
			
		||||
	0xfd, 0x30, 0xad, 0x72, 0xcf, 0xd4, 0xe3, 0xe4, 0x9e, 0xef, 0xc2, 0x54, 0x83, 0xef, 0x51, 0xf8,
 | 
			
		||||
	0x3f, 0x87, 0xb5, 0x71, 0x8e, 0x53, 0xec, 0x6e, 0xec, 0x8d, 0xe2, 0x93, 0x61, 0x25, 0x10, 0xdd,
 | 
			
		||||
	0x81, 0x05, 0x4a, 0x02, 0xda, 0x5d, 0x3f, 0x0a, 0x08, 0xd5, 0x9b, 0xf8, 0x5c, 0x5c, 0x71, 0xe3,
 | 
			
		||||
	0x7e, 0x02, 0x3c, 0xc8, 0x63, 0x1e, 0xc2, 0xcc, 0x5d, 0xeb, 0xd0, 0x8d, 0x1e, 0xbd, 0x30, 0x94,
 | 
			
		||||
	0x1c, 0xaf, 0xe1, 0x76, 0x6c, 0x22, 0xa3, 0x71, 0x18, 0xbd, 0xc2, 0x4b, 0xbb, 0xad, 0x23, 0x2f,
 | 
			
		||||
	0x7a, 0x95, 0x2b, 0x09, 0x80, 0x7c, 0xe5, 0xc1, 0x49, 0x11, 0xa6, 0x0b, 0x93, 0x9f, 0x61, 0xf7,
 | 
			
		||||
	0xf8, 0x3d, 0x28, 0xc4, 0xf5, 0xfd, 0xa7, 0xac, 0xd2, 0x7c, 0x13, 0xf2, 0xdc, 0xe3, 0xc3, 0xbe,
 | 
			
		||||
	0xf4, 0x92, 0x12, 0x27, 0x59, 0x38, 0x65, 0xd2, 0x14, 0x4e, 0x66, 0x0b, 0x4a, 0xf7, 0xda, 0xf6,
 | 
			
		||||
	0x63, 0x3e, 0x7b, 0x66, 0x52, 0x67, 0xad, 0x9b, 0x20, 0xff, 0x42, 0xc1, 0x13, 0x84, 0xcc, 0xdc,
 | 
			
		||||
	0x5a, 0x82, 0xd0, 0x13, 0xaf, 0x36, 0x95, 0xff, 0xa9, 0x01, 0x20, 0xc6, 0x5f, 0x9b, 0xa7, 0xc4,
 | 
			
		||||
	0x0b, 0x52, 0x3c, 0x8e, 0xdf, 0x83, 0x29, 0x5f, 0x7a, 0x93, 0x7c, 0xfa, 0x1c, 0x73, 0xc6, 0x1a,
 | 
			
		||||
	0x5d, 0x02, 0xe9, 0x4f, 0x58, 0x09, 0xab, 0xdd, 0xf8, 0xe0, 0xe1, 0xf2, 0xc4, 0x87, 0x0f, 0x97,
 | 
			
		||||
	0x27, 0x3e, 0x7a, 0xb8, 0x3c, 0xf1, 0xf6, 0xf9, 0xb2, 0xf1, 0xc1, 0xf9, 0xb2, 0xf1, 0xe1, 0xf9,
 | 
			
		||||
	0xb2, 0xf1, 0xd1, 0xf9, 0xb2, 0xf1, 0xf1, 0xf9, 0xb2, 0xf1, 0xee, 0x3f, 0x96, 0x27, 0x5e, 0xcf,
 | 
			
		||||
	0x9c, 0xae, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, 0x82, 0x62, 0x88, 0xff, 0xb8, 0x26, 0x00, 0x00,
 | 
			
		||||
	0x3d, 0x63, 0xc7, 0x89, 0xfd, 0x73, 0x9c, 0x8f, 0xb7, 0x59, 0xf0, 0x06, 0x11, 0xa7, 0x53, 0x54,
 | 
			
		||||
	0xa5, 0xd0, 0x3a, 0x4d, 0x28, 0xd5, 0x76, 0x4b, 0x0b, 0x71, 0xbc, 0xd9, 0x86, 0x26, 0x4d, 0xf4,
 | 
			
		||||
	0xb2, 0xbb, 0x40, 0xa9, 0x50, 0x27, 0x9e, 0x17, 0x67, 0xc8, 0x78, 0xc6, 0x7d, 0x6f, 0x9c, 0xd4,
 | 
			
		||||
	0x70, 0xa0, 0x07, 0x10, 0x20, 0x41, 0xd5, 0x23, 0xe2, 0x80, 0x5a, 0xc1, 0x5f, 0xc0, 0x05, 0xfe,
 | 
			
		||||
	0x00, 0x24, 0x7a, 0xac, 0xc4, 0xa5, 0x12, 0xc8, 0xea, 0x86, 0x03, 0x47, 0xc4, 0x35, 0x17, 0xd0,
 | 
			
		||||
	0xfb, 0x98, 0x99, 0x37, 0xfe, 0xd8, 0x8c, 0xbb, 0xa5, 0xe2, 0xe6, 0xf9, 0x7d, 0xbf, 0xf7, 0x7e,
 | 
			
		||||
	0xef, 0xf7, 0xf5, 0x0c, 0x7b, 0xa7, 0x37, 0x59, 0xd5, 0xf1, 0xd7, 0x4e, 0x3b, 0x47, 0x84, 0x7a,
 | 
			
		||||
	0x24, 0x20, 0x6c, 0xed, 0x8c, 0x78, 0xb6, 0x4f, 0xd7, 0x14, 0xc2, 0x6a, 0x3b, 0x2d, 0xab, 0x71,
 | 
			
		||||
	0xe2, 0x78, 0x84, 0x76, 0xd7, 0xda, 0xa7, 0x4d, 0x0e, 0x60, 0x6b, 0x2d, 0x12, 0x58, 0x6b, 0x67,
 | 
			
		||||
	0xeb, 0x6b, 0x4d, 0xe2, 0x11, 0x6a, 0x05, 0xc4, 0xae, 0xb6, 0xa9, 0x1f, 0xf8, 0xe8, 0x4b, 0x92,
 | 
			
		||||
	0xab, 0xaa, 0x73, 0x55, 0xdb, 0xa7, 0x4d, 0x0e, 0x60, 0x55, 0xce, 0x55, 0x3d, 0x5b, 0x5f, 0x7a,
 | 
			
		||||
	0xba, 0xe9, 0x04, 0x27, 0x9d, 0xa3, 0x6a, 0xc3, 0x6f, 0xad, 0x35, 0xfd, 0xa6, 0xbf, 0x26, 0x98,
 | 
			
		||||
	0x8f, 0x3a, 0xc7, 0xe2, 0x4b, 0x7c, 0x88, 0x5f, 0x52, 0xe8, 0xd2, 0x48, 0x53, 0x68, 0xc7, 0x0b,
 | 
			
		||||
	0x9c, 0x16, 0xe9, 0xb7, 0x62, 0xe9, 0xb9, 0xab, 0x18, 0x58, 0xe3, 0x84, 0xb4, 0xac, 0x7e, 0x3e,
 | 
			
		||||
	0xf3, 0x2f, 0x59, 0xc8, 0x6f, 0x1e, 0xec, 0xdc, 0xa1, 0x7e, 0xa7, 0x8d, 0x56, 0x60, 0xd2, 0xb3,
 | 
			
		||||
	0x5a, 0xa4, 0x6c, 0xac, 0x18, 0xab, 0x85, 0xda, 0xcc, 0x07, 0xbd, 0xca, 0xc4, 0x45, 0xaf, 0x32,
 | 
			
		||||
	0xf9, 0xaa, 0xd5, 0x22, 0x58, 0x60, 0x90, 0x0b, 0xf9, 0x33, 0x42, 0x99, 0xe3, 0x7b, 0xac, 0x9c,
 | 
			
		||||
	0x59, 0xc9, 0xae, 0x16, 0x37, 0x5e, 0xaa, 0xa6, 0x59, 0x7f, 0x55, 0x28, 0xb8, 0x2f, 0x59, 0xb7,
 | 
			
		||||
	0x7d, 0x5a, 0x77, 0x58, 0xc3, 0x3f, 0x23, 0xb4, 0x5b, 0x9b, 0x57, 0x5a, 0xf2, 0x0a, 0xc9, 0x70,
 | 
			
		||||
	0xa4, 0x01, 0xfd, 0xc4, 0x80, 0xf9, 0x36, 0x25, 0xc7, 0x84, 0x52, 0x62, 0x2b, 0x7c, 0x39, 0xbb,
 | 
			
		||||
	0x62, 0x7c, 0x0a, 0x6a, 0xcb, 0x4a, 0xed, 0xfc, 0x41, 0x9f, 0x7c, 0x3c, 0xa0, 0x11, 0xfd, 0xce,
 | 
			
		||||
	0x80, 0x25, 0x46, 0xe8, 0x19, 0xa1, 0x9b, 0xb6, 0x4d, 0x09, 0x63, 0xb5, 0xee, 0x96, 0xeb, 0x10,
 | 
			
		||||
	0x2f, 0xd8, 0xda, 0xa9, 0x63, 0x56, 0x9e, 0x14, 0xfb, 0xf0, 0x8d, 0x74, 0x06, 0x1d, 0x8e, 0x92,
 | 
			
		||||
	0x53, 0x33, 0x95, 0x45, 0x4b, 0x23, 0x49, 0x18, 0x7e, 0x88, 0x19, 0xe6, 0x31, 0xcc, 0x84, 0x07,
 | 
			
		||||
	0xb9, 0xeb, 0xb0, 0x00, 0xdd, 0x87, 0xa9, 0x26, 0xff, 0x60, 0x65, 0x43, 0x18, 0x58, 0x4d, 0x67,
 | 
			
		||||
	0x60, 0x28, 0xa3, 0x36, 0xab, 0xec, 0x99, 0x12, 0x9f, 0x0c, 0x2b, 0x69, 0xe6, 0x2f, 0x26, 0xa1,
 | 
			
		||||
	0xb8, 0x79, 0xb0, 0x83, 0x09, 0xf3, 0x3b, 0xb4, 0x41, 0x52, 0x38, 0xcd, 0x4d, 0x98, 0x61, 0x8e,
 | 
			
		||||
	0xd7, 0xec, 0xb8, 0x16, 0xe5, 0xd0, 0xf2, 0x94, 0xa0, 0x5c, 0x54, 0x94, 0x33, 0x87, 0x1a, 0x0e,
 | 
			
		||||
	0x27, 0x28, 0xd1, 0x06, 0x00, 0x97, 0xc0, 0xda, 0x56, 0x83, 0xd8, 0xe5, 0xcc, 0x8a, 0xb1, 0x9a,
 | 
			
		||||
	0xaf, 0x21, 0xc5, 0x07, 0xaf, 0x46, 0x18, 0xac, 0x51, 0xa1, 0xc7, 0x21, 0x27, 0x2c, 0x2d, 0xe7,
 | 
			
		||||
	0x85, 0x9a, 0x92, 0x22, 0xcf, 0x89, 0x65, 0x60, 0x89, 0x43, 0x4f, 0xc2, 0xb4, 0xf2, 0xb2, 0x72,
 | 
			
		||||
	0x41, 0x90, 0xcd, 0x29, 0xb2, 0xe9, 0xd0, 0x0d, 0x42, 0x3c, 0x5f, 0xdf, 0xa9, 0xe3, 0xd9, 0xc2,
 | 
			
		||||
	0xef, 0xb4, 0xf5, 0xbd, 0xe2, 0x78, 0x36, 0x16, 0x18, 0xb4, 0x0b, 0xb9, 0x33, 0x42, 0x8f, 0xb8,
 | 
			
		||||
	0x27, 0x70, 0xd7, 0xfc, 0x4a, 0xba, 0x8d, 0xbe, 0xcf, 0x59, 0x6a, 0x05, 0x6e, 0x9a, 0xf8, 0x89,
 | 
			
		||||
	0xa5, 0x10, 0x54, 0x05, 0x60, 0x27, 0x3e, 0x0d, 0xc4, 0xf2, 0xca, 0xb9, 0x95, 0xec, 0x6a, 0xa1,
 | 
			
		||||
	0x36, 0xcb, 0xd7, 0x7b, 0x18, 0x41, 0xb1, 0x46, 0xc1, 0xe9, 0x1b, 0x56, 0x40, 0x9a, 0x3e, 0x75,
 | 
			
		||||
	0x08, 0x2b, 0x4f, 0xc7, 0xf4, 0x5b, 0x11, 0x14, 0x6b, 0x14, 0xe8, 0x5b, 0x80, 0x58, 0xe0, 0x53,
 | 
			
		||||
	0xab, 0x49, 0xd4, 0x52, 0x5f, 0xb6, 0xd8, 0x49, 0x19, 0xc4, 0xea, 0x96, 0xd4, 0xea, 0xd0, 0xe1,
 | 
			
		||||
	0x00, 0x05, 0x1e, 0xc2, 0x65, 0xfe, 0xc1, 0x80, 0x39, 0xcd, 0x17, 0x84, 0xdf, 0xdd, 0x84, 0x99,
 | 
			
		||||
	0xa6, 0x76, 0xeb, 0x94, 0x5f, 0x44, 0xa7, 0xad, 0xdf, 0x48, 0x9c, 0xa0, 0x44, 0x04, 0x0a, 0x54,
 | 
			
		||||
	0x49, 0x0a, 0xa3, 0xcb, 0x7a, 0x6a, 0xa7, 0x0d, 0x6d, 0x88, 0x35, 0x69, 0x40, 0x86, 0x63, 0xc9,
 | 
			
		||||
	0xe6, 0x3f, 0x0d, 0xe1, 0xc0, 0x61, 0xbc, 0x41, 0xab, 0x5a, 0x4c, 0x33, 0xc4, 0xf6, 0xcd, 0x8c,
 | 
			
		||||
	0x88, 0x47, 0x57, 0x04, 0x82, 0xcc, 0xff, 0x45, 0x20, 0xb8, 0x95, 0xff, 0xf5, 0x7b, 0x95, 0x89,
 | 
			
		||||
	0xb7, 0xff, 0xbe, 0x32, 0x61, 0xfe, 0x27, 0x03, 0x85, 0x2d, 0xdf, 0xb3, 0x9d, 0x40, 0x39, 0x72,
 | 
			
		||||
	0xd0, 0x6d, 0x0f, 0x5c, 0xd4, 0xbb, 0xdd, 0x36, 0xc1, 0x02, 0x83, 0x9e, 0x87, 0x29, 0x16, 0x58,
 | 
			
		||||
	0x41, 0x87, 0x89, 0xab, 0x56, 0xa8, 0x3d, 0x16, 0x86, 0x80, 0x43, 0x01, 0xbd, 0xec, 0x55, 0xe6,
 | 
			
		||||
	0x22, 0x71, 0x12, 0x84, 0x15, 0x03, 0xf7, 0x2a, 0xff, 0x48, 0x18, 0x65, 0xdf, 0x91, 0x29, 0x26,
 | 
			
		||||
	0x8c, 0xd5, 0xd9, 0xd8, 0xab, 0xf6, 0x07, 0x28, 0xf0, 0x10, 0x2e, 0x74, 0x06, 0xc8, 0xb5, 0x58,
 | 
			
		||||
	0x70, 0x97, 0x5a, 0x1e, 0x13, 0xba, 0xee, 0x3a, 0x2d, 0xa2, 0x2e, 0xd7, 0x97, 0xd3, 0xed, 0x2e,
 | 
			
		||||
	0xe7, 0x88, 0xf5, 0xee, 0x0e, 0x48, 0xc3, 0x43, 0x34, 0xa0, 0x27, 0x60, 0x8a, 0x12, 0x8b, 0xf9,
 | 
			
		||||
	0x5e, 0x39, 0x27, 0x96, 0x1f, 0x45, 0x40, 0x2c, 0xa0, 0x58, 0x61, 0x79, 0xf0, 0x68, 0x11, 0xc6,
 | 
			
		||||
	0xac, 0x66, 0x18, 0xca, 0xa2, 0xe0, 0xb1, 0x27, 0xc1, 0x38, 0xc4, 0x9b, 0x2d, 0x28, 0x6d, 0x51,
 | 
			
		||||
	0x62, 0x05, 0x64, 0xbf, 0x1d, 0x08, 0x17, 0x32, 0x61, 0xca, 0xa6, 0x5d, 0xdc, 0xf1, 0x94, 0xab,
 | 
			
		||||
	0x01, 0x97, 0x5f, 0x17, 0x10, 0xac, 0x30, 0xfc, 0x06, 0x1d, 0x3b, 0xc4, 0xb5, 0xf7, 0x2c, 0xcf,
 | 
			
		||||
	0x6a, 0x12, 0xaa, 0x22, 0x4f, 0xe4, 0xd7, 0xdb, 0x1a, 0x0e, 0x27, 0x28, 0xcd, 0x9f, 0x65, 0xa1,
 | 
			
		||||
	0x54, 0x27, 0x2e, 0x89, 0xf5, 0x6d, 0x03, 0x6a, 0x52, 0xab, 0x41, 0x0e, 0x08, 0x75, 0x7c, 0xfb,
 | 
			
		||||
	0x90, 0x34, 0x7c, 0xcf, 0x66, 0xc2, 0x05, 0xb2, 0xb5, 0xcf, 0xf1, 0xbd, 0xb9, 0x33, 0x80, 0xc5,
 | 
			
		||||
	0x43, 0x38, 0x90, 0x0b, 0xa5, 0x36, 0x15, 0xbf, 0xc5, 0x7e, 0x49, 0x0f, 0x29, 0x6e, 0x7c, 0x35,
 | 
			
		||||
	0xdd, 0x71, 0x1c, 0xe8, 0xac, 0xb5, 0x85, 0x8b, 0x5e, 0xa5, 0x94, 0x00, 0xe1, 0xa4, 0x70, 0xf4,
 | 
			
		||||
	0x4d, 0x98, 0xf7, 0x69, 0xfb, 0xc4, 0xf2, 0xea, 0xa4, 0x4d, 0x3c, 0x9b, 0x78, 0x01, 0x13, 0xbb,
 | 
			
		||||
	0x90, 0xaf, 0x2d, 0xf2, 0x9c, 0xbd, 0xdf, 0x87, 0xc3, 0x03, 0xd4, 0xe8, 0x35, 0x58, 0x68, 0x53,
 | 
			
		||||
	0xbf, 0x6d, 0x35, 0x85, 0x4b, 0x1d, 0xf8, 0xae, 0xd3, 0xe8, 0x0a, 0x17, 0x2a, 0xd4, 0x9e, 0xba,
 | 
			
		||||
	0xe8, 0x55, 0x16, 0x0e, 0xfa, 0x91, 0x97, 0xbd, 0xca, 0x35, 0xb1, 0x75, 0x1c, 0x12, 0x23, 0xf1,
 | 
			
		||||
	0xa0, 0x18, 0xed, 0x0c, 0x73, 0xa3, 0xce, 0xd0, 0xdc, 0x81, 0x7c, 0xbd, 0xa3, 0xfc, 0xf9, 0x45,
 | 
			
		||||
	0xc8, 0xdb, 0xea, 0xb7, 0xda, 0xf9, 0xf0, 0x62, 0x45, 0x34, 0x97, 0xbd, 0x4a, 0x89, 0x97, 0x69,
 | 
			
		||||
	0xd5, 0x10, 0x80, 0x23, 0x16, 0xf3, 0x09, 0xc8, 0x8b, 0x23, 0x67, 0xf7, 0xd7, 0xd1, 0x3c, 0x64,
 | 
			
		||||
	0xb1, 0x75, 0x2e, 0xa4, 0xcc, 0xe0, 0x2c, 0xb5, 0xce, 0xb5, 0xdb, 0xbe, 0x0f, 0x70, 0x87, 0x04,
 | 
			
		||||
	0xe1, 0xc1, 0x6f, 0xc2, 0x5c, 0x18, 0xf2, 0x92, 0x91, 0xf8, 0xf3, 0x4a, 0xf7, 0x1c, 0x4e, 0xa2,
 | 
			
		||||
	0x71, 0x3f, 0xbd, 0xf9, 0x3a, 0x14, 0x44, 0xb4, 0xe6, 0xa9, 0x2e, 0x4e, 0xab, 0xc6, 0x43, 0xd2,
 | 
			
		||||
	0x6a, 0x98, 0x2b, 0x33, 0xa3, 0x72, 0xa5, 0x66, 0xae, 0x0b, 0x25, 0xc9, 0x1b, 0x16, 0x12, 0xa9,
 | 
			
		||||
	0x34, 0x3c, 0x05, 0xf9, 0xd0, 0x4c, 0xa5, 0x25, 0x2a, 0x20, 0x43, 0x41, 0x38, 0xa2, 0xd0, 0xb4,
 | 
			
		||||
	0x9d, 0x40, 0x22, 0xf3, 0xa4, 0x53, 0xa6, 0x55, 0x09, 0x99, 0x87, 0x57, 0x09, 0x9a, 0xa6, 0x1f,
 | 
			
		||||
	0x43, 0x79, 0x54, 0xd5, 0xf9, 0x08, 0xb9, 0x31, 0xbd, 0x29, 0xe6, 0x3b, 0x06, 0xcc, 0xeb, 0x92,
 | 
			
		||||
	0xd2, 0x1f, 0x5f, 0x7a, 0x25, 0x57, 0x57, 0x45, 0xda, 0x8e, 0xfc, 0xd6, 0x80, 0xc5, 0xc4, 0xd2,
 | 
			
		||||
	0xc6, 0x3a, 0xf1, 0x31, 0x8c, 0xd2, 0x9d, 0x23, 0x3b, 0x86, 0x73, 0xfc, 0x35, 0x03, 0xa5, 0x5d,
 | 
			
		||||
	0xeb, 0x88, 0xb8, 0x87, 0xc4, 0x25, 0x8d, 0xc0, 0xa7, 0xe8, 0x47, 0x50, 0x6c, 0x59, 0x41, 0xe3,
 | 
			
		||||
	0x44, 0x40, 0xc3, 0x0a, 0xba, 0x9e, 0x2e, 0xd8, 0x25, 0x24, 0x55, 0xf7, 0x62, 0x31, 0xb7, 0xbd,
 | 
			
		||||
	0x80, 0x76, 0x6b, 0xd7, 0x94, 0x49, 0x45, 0x0d, 0x83, 0x75, 0x6d, 0xa2, 0xed, 0x11, 0xdf, 0xb7,
 | 
			
		||||
	0xdf, 0x6a, 0xf3, 0xf4, 0x3e, 0x7e, 0xb7, 0x95, 0x30, 0x01, 0x93, 0x37, 0x3b, 0x0e, 0x25, 0x2d,
 | 
			
		||||
	0xe2, 0x05, 0x71, 0xdb, 0xb3, 0xd7, 0x27, 0x1f, 0x0f, 0x68, 0x5c, 0x7a, 0x09, 0xe6, 0xfb, 0x8d,
 | 
			
		||||
	0xe7, 0xf1, 0xe7, 0x94, 0x74, 0xe5, 0x79, 0x61, 0xfe, 0x13, 0x2d, 0x42, 0xee, 0xcc, 0x72, 0x3b,
 | 
			
		||||
	0xea, 0x36, 0x62, 0xf9, 0x71, 0x2b, 0x73, 0xd3, 0x30, 0x7f, 0x6f, 0x40, 0x79, 0x94, 0x21, 0xe8,
 | 
			
		||||
	0x8b, 0x9a, 0xa0, 0x5a, 0x51, 0x59, 0x95, 0x7d, 0x85, 0x74, 0xa5, 0xd4, 0xdb, 0x90, 0xf7, 0xdb,
 | 
			
		||||
	0xbc, 0x1e, 0xf0, 0xa9, 0x3a, 0xf5, 0x27, 0xc3, 0x93, 0xdc, 0x57, 0xf0, 0xcb, 0x5e, 0xe5, 0x7a,
 | 
			
		||||
	0x42, 0x7c, 0x88, 0xc0, 0x11, 0x2b, 0x8f, 0xd4, 0xc2, 0x1e, 0x9e, 0x3d, 0xa2, 0x48, 0x7d, 0x5f,
 | 
			
		||||
	0x40, 0xb0, 0xc2, 0x98, 0x7f, 0x32, 0x60, 0x52, 0x14, 0xae, 0xaf, 0x43, 0x9e, 0xef, 0x9f, 0x6d,
 | 
			
		||||
	0x05, 0x96, 0xb0, 0x2b, 0x75, 0xcb, 0xc4, 0xb9, 0xf7, 0x48, 0x60, 0xc5, 0xde, 0x16, 0x42, 0x70,
 | 
			
		||||
	0x24, 0x11, 0x61, 0xc8, 0x39, 0x01, 0x69, 0x85, 0x07, 0xf9, 0xf4, 0x48, 0xd1, 0xaa, 0x61, 0xaf,
 | 
			
		||||
	0x62, 0xeb, 0xfc, 0xf6, 0x5b, 0x01, 0xf1, 0xf8, 0x61, 0xc4, 0x57, 0x63, 0x87, 0xcb, 0xc0, 0x52,
 | 
			
		||||
	0x94, 0xf9, 0x6f, 0x03, 0x22, 0x55, 0xdc, 0xf9, 0x19, 0x71, 0x8f, 0x77, 0x1d, 0xef, 0x54, 0x6d,
 | 
			
		||||
	0x6b, 0x64, 0xce, 0xa1, 0x82, 0xe3, 0x88, 0x62, 0x58, 0x7a, 0xc8, 0x8c, 0x97, 0x1e, 0xb8, 0xc2,
 | 
			
		||||
	0x86, 0xef, 0x05, 0x8e, 0xd7, 0x19, 0xb8, 0x6d, 0x5b, 0x0a, 0x8e, 0x23, 0x0a, 0x5e, 0x88, 0x50,
 | 
			
		||||
	0xd2, 0xb2, 0x1c, 0xcf, 0xf1, 0x9a, 0x7c, 0x11, 0x5b, 0x7e, 0xc7, 0x0b, 0x44, 0x46, 0x56, 0x85,
 | 
			
		||||
	0x08, 0x1e, 0xc0, 0xe2, 0x21, 0x1c, 0xe6, 0x1f, 0x27, 0xa1, 0xc8, 0xd7, 0x1c, 0xe6, 0xb9, 0x17,
 | 
			
		||||
	0xa0, 0xe4, 0xea, 0x5e, 0xa0, 0xd6, 0x7e, 0x5d, 0x99, 0x92, 0xbc, 0xd7, 0x38, 0x49, 0xcb, 0x99,
 | 
			
		||||
	0x45, 0xfd, 0x14, 0x31, 0x67, 0x92, 0xcc, 0xdb, 0x3a, 0x12, 0x27, 0x69, 0x79, 0xf4, 0x3a, 0xe7,
 | 
			
		||||
	0xf7, 0x43, 0x55, 0x26, 0xd1, 0x11, 0x7d, 0x9b, 0x03, 0xb1, 0xc4, 0xa1, 0x3d, 0xb8, 0x66, 0xb9,
 | 
			
		||||
	0xae, 0x7f, 0x2e, 0x80, 0x35, 0xdf, 0x3f, 0x6d, 0x59, 0xf4, 0x94, 0x89, 0xa6, 0x33, 0x5f, 0xfb,
 | 
			
		||||
	0x82, 0x62, 0xb9, 0xb6, 0x39, 0x48, 0x82, 0x87, 0xf1, 0x0d, 0x3b, 0xb6, 0xc9, 0x31, 0x8f, 0xed,
 | 
			
		||||
	0x04, 0x16, 0xfb, 0x40, 0xe2, 0x96, 0xab, 0x0e, 0xf0, 0x59, 0x25, 0x67, 0x11, 0x0f, 0xa1, 0xb9,
 | 
			
		||||
	0x1c, 0x01, 0xc7, 0x43, 0x25, 0xa2, 0x5b, 0x30, 0xcb, 0x3d, 0xd9, 0xef, 0x04, 0x61, 0xdd, 0x99,
 | 
			
		||||
	0x13, 0xc7, 0x8d, 0x2e, 0x7a, 0x95, 0xd9, 0xbb, 0x09, 0x0c, 0xee, 0xa3, 0xe4, 0x9b, 0xeb, 0x3a,
 | 
			
		||||
	0x2d, 0x27, 0x28, 0x4f, 0x0b, 0x96, 0x68, 0x73, 0x77, 0x39, 0x10, 0x4b, 0x5c, 0xc2, 0x03, 0xf3,
 | 
			
		||||
	0x57, 0x79, 0xa0, 0xf9, 0x9b, 0x2c, 0x20, 0x59, 0x28, 0xdb, 0xb2, 0x9e, 0x92, 0x21, 0x8d, 0x57,
 | 
			
		||||
	0xf3, 0xaa, 0xd0, 0x36, 0xfa, 0xaa, 0x79, 0x55, 0x63, 0x87, 0x78, 0xb4, 0x07, 0x05, 0x19, 0x5a,
 | 
			
		||||
	0xe2, 0xeb, 0xb2, 0xa6, 0x88, 0x0b, 0xfb, 0x21, 0xe2, 0xb2, 0x57, 0x59, 0x4a, 0xa8, 0x89, 0x30,
 | 
			
		||||
	0xa2, 0xd3, 0x8a, 0x25, 0xa0, 0x0d, 0x00, 0xab, 0xed, 0xe8, 0x73, 0xad, 0x42, 0x3c, 0xdd, 0x88,
 | 
			
		||||
	0x3b, 0x54, 0xac, 0x51, 0xa1, 0x97, 0x61, 0x32, 0xf8, 0x64, 0xdd, 0x50, 0x5e, 0x34, 0x7b, 0xbc,
 | 
			
		||||
	0xf7, 0x11, 0x12, 0xb8, 0x76, 0xe1, 0xcf, 0x8c, 0x9b, 0xa5, 0x1a, 0x99, 0x48, 0xfb, 0x76, 0x84,
 | 
			
		||||
	0xc1, 0x1a, 0x15, 0xfa, 0x0e, 0xe4, 0x8f, 0x55, 0x29, 0x2a, 0x0e, 0x26, 0x75, 0x88, 0x0c, 0x0b,
 | 
			
		||||
	0x58, 0xd9, 0x5a, 0x87, 0x5f, 0x38, 0x92, 0x66, 0xbe, 0x09, 0x85, 0x3d, 0xa7, 0x41, 0x7d, 0xd1,
 | 
			
		||||
	0x88, 0x3d, 0x09, 0xd3, 0x2c, 0xd1, 0xa9, 0x44, 0x47, 0x12, 0xba, 0x4b, 0x88, 0xe7, 0x7e, 0xe2,
 | 
			
		||||
	0x59, 0x9e, 0x2f, 0xfb, 0x91, 0x5c, 0xec, 0x27, 0xaf, 0x72, 0x20, 0x96, 0xb8, 0x5b, 0x8b, 0x3c,
 | 
			
		||||
	0xd3, 0xff, 0xfc, 0xfd, 0xca, 0xc4, 0xbb, 0xef, 0x57, 0x26, 0xde, 0x7b, 0x5f, 0x65, 0xfd, 0x4b,
 | 
			
		||||
	0x00, 0xd8, 0x3f, 0xfa, 0x01, 0x69, 0xc8, 0xf8, 0x99, 0x6a, 0x8e, 0x15, 0x8e, 0x4f, 0xc5, 0x1c,
 | 
			
		||||
	0x2b, 0xd3, 0x57, 0xbd, 0x69, 0x38, 0x9c, 0xa0, 0x44, 0x6b, 0x50, 0x88, 0x26, 0x54, 0xea, 0xa0,
 | 
			
		||||
	0x17, 0x42, 0xc7, 0x89, 0xc6, 0x58, 0x38, 0xa6, 0x49, 0x04, 0xf3, 0xc9, 0x2b, 0x83, 0x79, 0x0d,
 | 
			
		||||
	0xb2, 0x1d, 0xc7, 0x56, 0x5d, 0xeb, 0x33, 0x61, 0x32, 0xbd, 0xb7, 0x53, 0xbf, 0xec, 0x55, 0x1e,
 | 
			
		||||
	0x1b, 0x35, 0x18, 0xe6, 0x1d, 0x3f, 0xab, 0xde, 0xdb, 0xa9, 0x63, 0xce, 0x3c, 0x2c, 0xb2, 0x4c,
 | 
			
		||||
	0x8d, 0x19, 0x59, 0x36, 0x00, 0x9a, 0x71, 0xef, 0x2f, 0x2f, 0x6e, 0xe4, 0x51, 0x5a, 0xcf, 0xaf,
 | 
			
		||||
	0x51, 0x21, 0x06, 0x0b, 0x0d, 0xde, 0x20, 0xab, 0x1e, 0x9c, 0x05, 0x56, 0x4b, 0x4e, 0xee, 0xc6,
 | 
			
		||||
	0x73, 0xee, 0x1b, 0x4a, 0xcd, 0xc2, 0x56, 0xbf, 0x30, 0x3c, 0x28, 0x1f, 0xf9, 0xb0, 0x60, 0xab,
 | 
			
		||||
	0x56, 0x2f, 0x56, 0x5a, 0x18, 0x5b, 0xe9, 0x75, 0xae, 0xb0, 0xde, 0x2f, 0x08, 0x0f, 0xca, 0x46,
 | 
			
		||||
	0xdf, 0x87, 0xa5, 0x10, 0x38, 0xd8, 0x6f, 0x8b, 0xc8, 0x9b, 0xad, 0x2d, 0x5f, 0xf4, 0x2a, 0x4b,
 | 
			
		||||
	0xf5, 0x91, 0x54, 0xf8, 0x21, 0x12, 0x90, 0x0d, 0x53, 0xae, 0xac, 0x54, 0x8b, 0xa2, 0xba, 0xf8,
 | 
			
		||||
	0x7a, 0xba, 0x55, 0xc4, 0xde, 0x5f, 0xd5, 0x2b, 0xd4, 0x68, 0xee, 0xa1, 0x8a, 0x53, 0x25, 0x1b,
 | 
			
		||||
	0xbd, 0x05, 0x45, 0xcb, 0xf3, 0xfc, 0xc0, 0x92, 0x13, 0x80, 0x19, 0xa1, 0x6a, 0x73, 0x6c, 0x55,
 | 
			
		||||
	0x9b, 0xb1, 0x8c, 0xbe, 0x8a, 0x58, 0xc3, 0x60, 0x5d, 0x15, 0x3a, 0x87, 0x39, 0xff, 0xdc, 0x23,
 | 
			
		||||
	0x14, 0x93, 0x63, 0x42, 0x89, 0xd7, 0x20, 0xac, 0x5c, 0x12, 0xda, 0x9f, 0x4d, 0xa9, 0x3d, 0xc1,
 | 
			
		||||
	0x1c, 0xbb, 0x74, 0x12, 0xce, 0x70, 0xbf, 0x16, 0x54, 0xe5, 0x41, 0xd2, 0xb3, 0x5c, 0xe7, 0x87,
 | 
			
		||||
	0x84, 0xb2, 0xf2, 0x6c, 0x3c, 0x5c, 0xdd, 0x8e, 0xa0, 0x58, 0xa3, 0x40, 0x5f, 0x83, 0x62, 0xc3,
 | 
			
		||||
	0xed, 0xb0, 0x80, 0xc8, 0x49, 0xf7, 0x9c, 0xb8, 0x41, 0xd1, 0xfa, 0xb6, 0x62, 0x14, 0xd6, 0xe9,
 | 
			
		||||
	0x50, 0x07, 0x4a, 0x2d, 0x3d, 0x65, 0x94, 0x17, 0xc4, 0xea, 0x6e, 0xa6, 0x5b, 0xdd, 0x60, 0x52,
 | 
			
		||||
	0x8b, 0x2b, 0x98, 0x04, 0x0e, 0x27, 0xb5, 0x2c, 0x3d, 0x0f, 0xc5, 0x4f, 0x58, 0xdc, 0xf3, 0xe6,
 | 
			
		||||
	0xa0, 0xff, 0x1c, 0xc7, 0x6a, 0x0e, 0xfe, 0x9c, 0x81, 0xd9, 0xe4, 0xee, 0xf7, 0xa5, 0xc3, 0x5c,
 | 
			
		||||
	0xaa, 0x74, 0x18, 0xb6, 0xa1, 0xc6, 0xc8, 0xe1, 0x7c, 0x18, 0xd6, 0xb3, 0x23, 0xc3, 0xba, 0x8a,
 | 
			
		||||
	0x9e, 0x93, 0x8f, 0x12, 0x3d, 0xab, 0x00, 0xbc, 0xce, 0xa0, 0xbe, 0xeb, 0x12, 0x2a, 0x02, 0x67,
 | 
			
		||||
	0x5e, 0x0d, 0xe1, 0x23, 0x28, 0xd6, 0x28, 0x78, 0x35, 0x7c, 0xe4, 0xfa, 0x8d, 0x53, 0xb1, 0x05,
 | 
			
		||||
	0xe1, 0xa5, 0x17, 0x21, 0x33, 0x2f, 0xab, 0xe1, 0xda, 0x00, 0x16, 0x0f, 0xe1, 0x30, 0xbb, 0x70,
 | 
			
		||||
	0xfd, 0xc0, 0xa2, 0x81, 0x63, 0xb9, 0xf1, 0x05, 0x13, 0xed, 0xc6, 0x1b, 0x03, 0xcd, 0xcc, 0x33,
 | 
			
		||||
	0xe3, 0x5e, 0xd4, 0x78, 0xf3, 0x63, 0x58, 0xdc, 0xd0, 0x98, 0x7f, 0x33, 0xe0, 0xc6, 0x50, 0xdd,
 | 
			
		||||
	0x9f, 0x41, 0x33, 0xf5, 0x46, 0xb2, 0x99, 0x7a, 0x21, 0xe5, 0x14, 0x72, 0x98, 0xb5, 0x23, 0x5a,
 | 
			
		||||
	0xab, 0x69, 0xc8, 0x1d, 0xf0, 0x22, 0xd6, 0xfc, 0x95, 0x01, 0x33, 0xe2, 0xd7, 0x38, 0x13, 0xdc,
 | 
			
		||||
	0x0a, 0xe4, 0x8e, 0xfd, 0x70, 0x44, 0x95, 0x97, 0x8f, 0x3c, 0xdb, 0x1c, 0x80, 0x25, 0xfc, 0x11,
 | 
			
		||||
	0x46, 0xbc, 0xef, 0x18, 0x90, 0x9c, 0x9d, 0xa2, 0x97, 0xa4, 0xff, 0x1a, 0xd1, 0x70, 0x73, 0x4c,
 | 
			
		||||
	0xdf, 0x7d, 0x71, 0x54, 0x2b, 0x78, 0x2d, 0xd5, 0x94, 0xf0, 0x29, 0x28, 0x60, 0xdf, 0x0f, 0x0e,
 | 
			
		||||
	0xac, 0xe0, 0x84, 0xf1, 0x85, 0xb7, 0xf9, 0x0f, 0xb5, 0x37, 0x62, 0xe1, 0x02, 0x83, 0x25, 0xdc,
 | 
			
		||||
	0xfc, 0xa5, 0x01, 0x37, 0x46, 0xbe, 0x6b, 0xf0, 0x10, 0xd0, 0x88, 0xbe, 0xd4, 0x8a, 0x22, 0x2f,
 | 
			
		||||
	0x8c, 0xe9, 0xb0, 0x46, 0xc5, 0x7b, 0xb8, 0xc4, 0x63, 0x48, 0x7f, 0x0f, 0x97, 0xd0, 0x86, 0x93,
 | 
			
		||||
	0xb4, 0xe6, 0xbf, 0x32, 0xa0, 0x1e, 0x37, 0xfe, 0xc7, 0x1e, 0xfb, 0x44, 0xdf, 0xd3, 0xca, 0x6c,
 | 
			
		||||
	0xf2, 0x69, 0x25, 0x7a, 0x47, 0xd1, 0xde, 0x16, 0xb2, 0x0f, 0x7f, 0x5b, 0x40, 0xcf, 0x45, 0xcf,
 | 
			
		||||
	0x15, 0x32, 0x74, 0x2d, 0x27, 0x9f, 0x2b, 0x2e, 0x7b, 0x95, 0x19, 0x25, 0x3c, 0xf9, 0x7c, 0xf1,
 | 
			
		||||
	0x1a, 0x4c, 0xdb, 0x24, 0xb0, 0x1c, 0x57, 0xf6, 0x63, 0xa9, 0x87, 0xf8, 0x52, 0x58, 0x5d, 0xb2,
 | 
			
		||||
	0xd6, 0x8a, 0xdc, 0x26, 0xf5, 0x81, 0x43, 0x81, 0x3c, 0xda, 0x36, 0x7c, 0x5b, 0xb6, 0x13, 0xb9,
 | 
			
		||||
	0x38, 0xda, 0x6e, 0xf9, 0x36, 0xc1, 0x02, 0x63, 0xbe, 0x6b, 0x40, 0x51, 0x4a, 0xda, 0xb2, 0x3a,
 | 
			
		||||
	0x8c, 0xa0, 0xf5, 0x68, 0x15, 0xf2, 0xb8, 0x6f, 0xe8, 0xef, 0x52, 0x97, 0xbd, 0x4a, 0x41, 0x90,
 | 
			
		||||
	0x89, 0x4e, 0x64, 0xc8, 0xfb, 0x4b, 0xe6, 0x8a, 0x3d, 0x7a, 0x1c, 0x72, 0xe2, 0xf6, 0xa8, 0xcd,
 | 
			
		||||
	0x8c, 0xee, 0xba, 0xb8, 0x60, 0x58, 0xe2, 0xcc, 0x8f, 0x33, 0x50, 0x4a, 0x2c, 0x2e, 0x45, 0x2f,
 | 
			
		||||
	0x10, 0x8d, 0x2e, 0x33, 0x29, 0xc6, 0xe1, 0xa3, 0x9f, 0x8e, 0x55, 0xee, 0x99, 0x7a, 0x94, 0xdc,
 | 
			
		||||
	0xf3, 0x5d, 0x98, 0x6a, 0xf0, 0x3d, 0x0a, 0xff, 0x89, 0xb0, 0x3e, 0xce, 0x71, 0x8a, 0xdd, 0x8d,
 | 
			
		||||
	0xbd, 0x51, 0x7c, 0x32, 0xac, 0x04, 0xa2, 0x3b, 0xb0, 0x40, 0x49, 0x40, 0xbb, 0x9b, 0xc7, 0x01,
 | 
			
		||||
	0xa1, 0x7a, 0x13, 0x9f, 0x8b, 0x2b, 0x6e, 0xdc, 0x4f, 0x80, 0x07, 0x79, 0xcc, 0x23, 0x98, 0xb9,
 | 
			
		||||
	0x6b, 0x1d, 0xb9, 0xd1, 0xb3, 0x14, 0x86, 0x92, 0xe3, 0x35, 0xdc, 0x8e, 0x4d, 0x64, 0x34, 0x0e,
 | 
			
		||||
	0xa3, 0x57, 0x78, 0x69, 0x77, 0x74, 0xe4, 0x65, 0xaf, 0x72, 0x2d, 0x01, 0x90, 0xef, 0x30, 0x38,
 | 
			
		||||
	0x29, 0xc2, 0x74, 0x61, 0xf2, 0x33, 0xec, 0x1e, 0xbf, 0x07, 0x85, 0xb8, 0xbe, 0xff, 0x94, 0x55,
 | 
			
		||||
	0x9a, 0x6f, 0x40, 0x9e, 0x7b, 0x7c, 0xd8, 0x97, 0x5e, 0x51, 0xe2, 0x24, 0x0b, 0xa7, 0x4c, 0x9a,
 | 
			
		||||
	0xc2, 0xc9, 0x6c, 0x41, 0xe9, 0x5e, 0xdb, 0x7e, 0xc4, 0x87, 0xc9, 0x4c, 0xea, 0xac, 0xb5, 0x01,
 | 
			
		||||
	0xf2, 0x4f, 0x0e, 0x3c, 0x41, 0xc8, 0xcc, 0xad, 0x25, 0x08, 0x3d, 0xf1, 0x6a, 0x53, 0xf9, 0x9f,
 | 
			
		||||
	0x1a, 0x00, 0x62, 0xfc, 0x75, 0xfb, 0x8c, 0x78, 0x41, 0x8a, 0xe7, 0xeb, 0x7b, 0x30, 0xe5, 0x4b,
 | 
			
		||||
	0x6f, 0x92, 0x8f, 0x93, 0x63, 0xce, 0x58, 0xa3, 0x4b, 0x20, 0xfd, 0x09, 0x2b, 0x61, 0xb5, 0xd5,
 | 
			
		||||
	0x0f, 0x1e, 0x2c, 0x4f, 0x7c, 0xf8, 0x60, 0x79, 0xe2, 0xa3, 0x07, 0xcb, 0x13, 0x6f, 0x5f, 0x2c,
 | 
			
		||||
	0x1b, 0x1f, 0x5c, 0x2c, 0x1b, 0x1f, 0x5e, 0x2c, 0x1b, 0x1f, 0x5d, 0x2c, 0x1b, 0x1f, 0x5f, 0x2c,
 | 
			
		||||
	0x1b, 0xef, 0xfe, 0x63, 0x79, 0xe2, 0xb5, 0xcc, 0xd9, 0xfa, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff,
 | 
			
		||||
	0x8c, 0xe4, 0xf0, 0xe3, 0x5a, 0x26, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *APIGroup) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
@@ -1973,45 +1942,6 @@ func (m *Duration) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *ExportOptions) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *ExportOptions) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *ExportOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	i--
 | 
			
		||||
	if m.Exact {
 | 
			
		||||
		dAtA[i] = 1
 | 
			
		||||
	} else {
 | 
			
		||||
		dAtA[i] = 0
 | 
			
		||||
	}
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x10
 | 
			
		||||
	i--
 | 
			
		||||
	if m.Export {
 | 
			
		||||
		dAtA[i] = 1
 | 
			
		||||
	} else {
 | 
			
		||||
		dAtA[i] = 0
 | 
			
		||||
	}
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x8
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *FieldsV1) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
@@ -3661,17 +3591,6 @@ func (m *Duration) Size() (n int) {
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *ExportOptions) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	n += 2
 | 
			
		||||
	n += 2
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *FieldsV1) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
@@ -4367,17 +4286,6 @@ func (this *Duration) String() string {
 | 
			
		||||
	}, "")
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
func (this *ExportOptions) String() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := strings.Join([]string{`&ExportOptions{`,
 | 
			
		||||
		`Export:` + fmt.Sprintf("%v", this.Export) + `,`,
 | 
			
		||||
		`Exact:` + fmt.Sprintf("%v", this.Exact) + `,`,
 | 
			
		||||
		`}`,
 | 
			
		||||
	}, "")
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
func (this *GetOptions) String() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
@@ -6250,99 +6158,6 @@ func (m *Duration) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (m *ExportOptions) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowGenerated
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: ExportOptions: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: ExportOptions: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 0 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Export", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var v int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenerated
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				v |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			m.Export = bool(v != 0)
 | 
			
		||||
		case 2:
 | 
			
		||||
			if wireType != 0 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Exact", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var v int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenerated
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				v |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			m.Exact = bool(v != 0)
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipGenerated(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if skippy < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenerated
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenerated
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldsV1) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
 
 | 
			
		||||
@@ -268,18 +268,6 @@ message Duration {
 | 
			
		||||
  optional int64 duration = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExportOptions is the query options to the standard REST get call.
 | 
			
		||||
// Deprecated. Planned for removal in 1.18.
 | 
			
		||||
message ExportOptions {
 | 
			
		||||
  // Should this value be exported.  Export strips fields that a user can not specify.
 | 
			
		||||
  // Deprecated. Planned for removal in 1.18.
 | 
			
		||||
  optional bool export = 1;
 | 
			
		||||
 | 
			
		||||
  // Should the export be exact.  Exact export maintains cluster-specific fields like 'Namespace'.
 | 
			
		||||
  // Deprecated. Planned for removal in 1.18.
 | 
			
		||||
  optional bool exact = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FieldsV1 stores a set of fields in a data structure like a Trie, in JSON format.
 | 
			
		||||
//
 | 
			
		||||
// Each key is either a '.' representing the field itself, and will always map to an empty set,
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,6 @@ var ParameterCodec = runtime.NewParameterCodec(scheme)
 | 
			
		||||
 | 
			
		||||
var optionsTypes = []runtime.Object{
 | 
			
		||||
	&ListOptions{},
 | 
			
		||||
	&ExportOptions{},
 | 
			
		||||
	&GetOptions{},
 | 
			
		||||
	&DeleteOptions{},
 | 
			
		||||
	&CreateOptions{},
 | 
			
		||||
 
 | 
			
		||||
@@ -433,21 +433,6 @@ const (
 | 
			
		||||
// +k8s:conversion-gen:explicit-from=net/url.Values
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// ExportOptions is the query options to the standard REST get call.
 | 
			
		||||
// Deprecated. Planned for removal in 1.18.
 | 
			
		||||
type ExportOptions struct {
 | 
			
		||||
	TypeMeta `json:",inline"`
 | 
			
		||||
	// Should this value be exported.  Export strips fields that a user can not specify.
 | 
			
		||||
	// Deprecated. Planned for removal in 1.18.
 | 
			
		||||
	Export bool `json:"export" protobuf:"varint,1,opt,name=export"`
 | 
			
		||||
	// Should the export be exact.  Exact export maintains cluster-specific fields like 'Namespace'.
 | 
			
		||||
	// Deprecated. Planned for removal in 1.18.
 | 
			
		||||
	Exact bool `json:"exact" protobuf:"varint,2,opt,name=exact"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:conversion-gen:explicit-from=net/url.Values
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// GetOptions is the standard query options to the standard REST get call.
 | 
			
		||||
type GetOptions struct {
 | 
			
		||||
	TypeMeta `json:",inline"`
 | 
			
		||||
 
 | 
			
		||||
@@ -123,16 +123,6 @@ func (DeleteOptions) SwaggerDoc() map[string]string {
 | 
			
		||||
	return map_DeleteOptions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var map_ExportOptions = map[string]string{
 | 
			
		||||
	"":       "ExportOptions is the query options to the standard REST get call. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
	"export": "Should this value be exported.  Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
	"exact":  "Should the export be exact.  Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ExportOptions) SwaggerDoc() map[string]string {
 | 
			
		||||
	return map_ExportOptions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var map_FieldsV1 = map[string]string{
 | 
			
		||||
	"": "FieldsV1 stores a set of fields in a data structure like a Trie, in JSON format.\n\nEach key is either a '.' representing the field itself, and will always map to an empty set, or a string representing a sub-field or item. The string will follow one of these four formats: 'f:<name>', where <name> is the name of a field in a struct, or key in a map 'v:<value>', where <value> is the exact json formatted value of a list item 'i:<index>', where <index> is position of a item in a list 'k:<keys>', where <keys> is a map of  a list item's key fields to their unique values If a key maps to an empty Fields value, the field that key represents is part of the set.\n\nThe exact format is defined in sigs.k8s.io/structured-merge-diff",
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -50,11 +50,6 @@ func RegisterConversions(s *runtime.Scheme) error {
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*url.Values)(nil), (*ExportOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_url_Values_To_v1_ExportOptions(a.(*url.Values), b.(*ExportOptions), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*url.Values)(nil), (*GetOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_url_Values_To_v1_GetOptions(a.(*url.Values), b.(*GetOptions), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
@@ -339,31 +334,6 @@ func autoConvert_url_Values_To_v1_DeleteOptions(in *url.Values, out *DeleteOptio
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_url_Values_To_v1_ExportOptions(in *url.Values, out *ExportOptions, s conversion.Scope) error {
 | 
			
		||||
	// WARNING: Field TypeMeta does not have json tag, skipping.
 | 
			
		||||
 | 
			
		||||
	if values, ok := map[string][]string(*in)["export"]; ok && len(values) > 0 {
 | 
			
		||||
		if err := runtime.Convert_Slice_string_To_bool(&values, &out.Export, s); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Export = false
 | 
			
		||||
	}
 | 
			
		||||
	if values, ok := map[string][]string(*in)["exact"]; ok && len(values) > 0 {
 | 
			
		||||
		if err := runtime.Convert_Slice_string_To_bool(&values, &out.Exact, s); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Exact = false
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_url_Values_To_v1_ExportOptions is an autogenerated conversion function.
 | 
			
		||||
func Convert_url_Values_To_v1_ExportOptions(in *url.Values, out *ExportOptions, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_url_Values_To_v1_ExportOptions(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_url_Values_To_v1_GetOptions(in *url.Values, out *GetOptions, s conversion.Scope) error {
 | 
			
		||||
	// WARNING: Field TypeMeta does not have json tag, skipping.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -304,31 +304,6 @@ func (in *Duration) DeepCopy() *Duration {
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *ExportOptions) DeepCopyInto(out *ExportOptions) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExportOptions.
 | 
			
		||||
func (in *ExportOptions) DeepCopy() *ExportOptions {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(ExportOptions)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *ExportOptions) 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 *FieldsV1) DeepCopyInto(out *FieldsV1) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
 
 | 
			
		||||
@@ -142,10 +142,10 @@ func init() {
 | 
			
		||||
 | 
			
		||||
func addGrouplessTypes() {
 | 
			
		||||
	scheme.AddKnownTypes(grouplessGroupVersion,
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ListOptions{}, &metav1.ExportOptions{},
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ListOptions{},
 | 
			
		||||
		&metav1.DeleteOptions{}, &genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{})
 | 
			
		||||
	scheme.AddKnownTypes(grouplessInternalGroupVersion,
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ExportOptions{},
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{},
 | 
			
		||||
		&genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{})
 | 
			
		||||
 | 
			
		||||
	utilruntime.Must(genericapitesting.RegisterConversions(scheme))
 | 
			
		||||
@@ -153,20 +153,20 @@ func addGrouplessTypes() {
 | 
			
		||||
 | 
			
		||||
func addTestTypes() {
 | 
			
		||||
	scheme.AddKnownTypes(testGroupVersion,
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ExportOptions{},
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{},
 | 
			
		||||
		&metav1.DeleteOptions{}, &genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{},
 | 
			
		||||
		&genericapitesting.SimpleXGSubresource{})
 | 
			
		||||
	scheme.AddKnownTypes(testGroupVersion, &examplev1.Pod{})
 | 
			
		||||
	scheme.AddKnownTypes(testInternalGroupVersion,
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ExportOptions{},
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{},
 | 
			
		||||
		&genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{},
 | 
			
		||||
		&genericapitesting.SimpleXGSubresource{})
 | 
			
		||||
	scheme.AddKnownTypes(testInternalGroupVersion, &example.Pod{})
 | 
			
		||||
	// Register SimpleXGSubresource in both testGroupVersion and testGroup2Version, and also their
 | 
			
		||||
	// their corresponding internal versions, to verify that the desired group version object is
 | 
			
		||||
	// served in the tests.
 | 
			
		||||
	scheme.AddKnownTypes(testGroup2Version, &genericapitesting.SimpleXGSubresource{}, &metav1.ExportOptions{})
 | 
			
		||||
	scheme.AddKnownTypes(testInternalGroup2Version, &genericapitesting.SimpleXGSubresource{}, &metav1.ExportOptions{})
 | 
			
		||||
	scheme.AddKnownTypes(testGroup2Version, &genericapitesting.SimpleXGSubresource{})
 | 
			
		||||
	scheme.AddKnownTypes(testInternalGroup2Version, &genericapitesting.SimpleXGSubresource{})
 | 
			
		||||
	metav1.AddToGroupVersion(scheme, testGroupVersion)
 | 
			
		||||
 | 
			
		||||
	utilruntime.Must(genericapitesting.RegisterConversions(scheme))
 | 
			
		||||
@@ -174,7 +174,7 @@ func addTestTypes() {
 | 
			
		||||
 | 
			
		||||
func addNewTestTypes() {
 | 
			
		||||
	scheme.AddKnownTypes(newGroupVersion,
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ExportOptions{},
 | 
			
		||||
		&genericapitesting.Simple{}, &genericapitesting.SimpleList{},
 | 
			
		||||
		&metav1.DeleteOptions{}, &genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{},
 | 
			
		||||
		&examplev1.Pod{},
 | 
			
		||||
	)
 | 
			
		||||
@@ -368,21 +368,6 @@ func (storage *SimpleRESTStorage) NamespaceScoped() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (storage *SimpleRESTStorage) Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) {
 | 
			
		||||
	obj, err := storage.Get(ctx, name, &metav1.GetOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	s, ok := obj.(*genericapitesting.Simple)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("unexpected object")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Set a marker to verify the method was called
 | 
			
		||||
	s.Other = "exported"
 | 
			
		||||
	return obj, storage.errors["export"]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (storage *SimpleRESTStorage) ConvertToTable(ctx context.Context, obj runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) {
 | 
			
		||||
	return rest.NewDefaultTableConvertor(schema.GroupResource{Resource: "simple"}).ConvertToTable(ctx, obj, tableOptions)
 | 
			
		||||
}
 | 
			
		||||
@@ -1556,55 +1541,6 @@ func TestMetadata(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestExport(t *testing.T) {
 | 
			
		||||
	storage := map[string]rest.Storage{}
 | 
			
		||||
	simpleStorage := SimpleRESTStorage{
 | 
			
		||||
		item: genericapitesting.Simple{
 | 
			
		||||
			ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
				ResourceVersion:   "1234",
 | 
			
		||||
				CreationTimestamp: metav1.NewTime(time.Unix(10, 10)),
 | 
			
		||||
			},
 | 
			
		||||
			Other: "foo",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	selfLinker := &setTestSelfLinker{
 | 
			
		||||
		t:           t,
 | 
			
		||||
		expectedSet: "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/default/simple/id",
 | 
			
		||||
		name:        "id",
 | 
			
		||||
		namespace:   "default",
 | 
			
		||||
	}
 | 
			
		||||
	storage["simple"] = &simpleStorage
 | 
			
		||||
	handler := handleLinker(storage, selfLinker)
 | 
			
		||||
	server := httptest.NewServer(handler)
 | 
			
		||||
	defer server.Close()
 | 
			
		||||
 | 
			
		||||
	resp, err := http.Get(server.URL + "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/default/simple/id?export=true")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unexpected error: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if resp.StatusCode != http.StatusOK {
 | 
			
		||||
		data, _ := ioutil.ReadAll(resp.Body)
 | 
			
		||||
		resp.Body.Close()
 | 
			
		||||
		t.Fatalf("unexpected response: %#v\n%s\n", resp, string(data))
 | 
			
		||||
	}
 | 
			
		||||
	var itemOut genericapitesting.Simple
 | 
			
		||||
	body, err := extractBody(resp, &itemOut)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("unexpected error: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if itemOut.Name != simpleStorage.item.Name {
 | 
			
		||||
		t.Errorf("Unexpected data: %#v, expected %#v (%s)", itemOut, simpleStorage.item, string(body))
 | 
			
		||||
	}
 | 
			
		||||
	if itemOut.Other != "exported" {
 | 
			
		||||
		t.Errorf("Expected: exported, saw: %s", itemOut.Other)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
 | 
			
		||||
		t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGet(t *testing.T) {
 | 
			
		||||
	storage := map[string]rest.Storage{}
 | 
			
		||||
	simpleStorage := SimpleRESTStorage{
 | 
			
		||||
 
 | 
			
		||||
@@ -19,14 +19,15 @@ package handlers
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	metainternalversionvalidation "k8s.io/apimachinery/pkg/apis/meta/internalversion/validation"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	metainternalversionvalidation "k8s.io/apimachinery/pkg/apis/meta/internalversion/validation"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/api/errors"
 | 
			
		||||
@@ -81,22 +82,22 @@ func getResourceHandler(scope *RequestScope, getter getterFunc) http.HandlerFunc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetResource returns a function that handles retrieving a single resource from a rest.Storage object.
 | 
			
		||||
func GetResource(r rest.Getter, e rest.Exporter, scope *RequestScope) http.HandlerFunc {
 | 
			
		||||
func GetResource(r rest.Getter, scope *RequestScope) http.HandlerFunc {
 | 
			
		||||
	return getResourceHandler(scope,
 | 
			
		||||
		func(ctx context.Context, name string, req *http.Request, trace *utiltrace.Trace) (runtime.Object, error) {
 | 
			
		||||
			// check for export
 | 
			
		||||
			options := metav1.GetOptions{}
 | 
			
		||||
			if values := req.URL.Query(); len(values) > 0 {
 | 
			
		||||
				exports := metav1.ExportOptions{}
 | 
			
		||||
				if err := metainternalversionscheme.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &exports); err != nil {
 | 
			
		||||
					err = errors.NewBadRequest(err.Error())
 | 
			
		||||
					return nil, err
 | 
			
		||||
				}
 | 
			
		||||
				if exports.Export {
 | 
			
		||||
					if e == nil {
 | 
			
		||||
						return nil, errors.NewBadRequest(fmt.Sprintf("export of %q is not supported", scope.Resource.Resource))
 | 
			
		||||
				if len(values["export"]) > 0 {
 | 
			
		||||
					exportBool := true
 | 
			
		||||
					exportStrings := values["export"]
 | 
			
		||||
					err := runtime.Convert_Slice_string_To_bool(&exportStrings, &exportBool, nil)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						return nil, errors.NewBadRequest(fmt.Sprintf("the export parameter cannot be parsed: %v", err))
 | 
			
		||||
					}
 | 
			
		||||
					if exportBool {
 | 
			
		||||
						return nil, errors.NewBadRequest("the export parameter, deprecated since v1.14, is no longer supported")
 | 
			
		||||
					}
 | 
			
		||||
					return e.Export(ctx, name, exports)
 | 
			
		||||
				}
 | 
			
		||||
				if err := metainternalversionscheme.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &options); err != nil {
 | 
			
		||||
					err = errors.NewBadRequest(err.Error())
 | 
			
		||||
 
 | 
			
		||||
@@ -253,15 +253,6 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
 | 
			
		||||
	if !isMetadata {
 | 
			
		||||
		storageMeta = defaultStorageMetadata{}
 | 
			
		||||
	}
 | 
			
		||||
	exporter, isExporter := storage.(rest.Exporter)
 | 
			
		||||
	if !isExporter {
 | 
			
		||||
		exporter = nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	versionedExportOptions, err := a.group.Creater.New(optionsExternalVersion.WithKind("ExportOptions"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if isNamedCreater {
 | 
			
		||||
		isCreater = true
 | 
			
		||||
@@ -684,7 +675,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
 | 
			
		||||
			if isGetterWithOptions {
 | 
			
		||||
				handler = restfulGetResourceWithOptions(getterWithOptions, reqScope, isSubresource)
 | 
			
		||||
			} else {
 | 
			
		||||
				handler = restfulGetResource(getter, exporter, reqScope)
 | 
			
		||||
				handler = restfulGetResource(getter, reqScope)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if needOverride {
 | 
			
		||||
@@ -713,11 +704,6 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
 | 
			
		||||
					return nil, nil, err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if isExporter {
 | 
			
		||||
				if err := AddObjectParams(ws, route, versionedExportOptions); err != nil {
 | 
			
		||||
					return nil, nil, err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			addParams(route, action.Params)
 | 
			
		||||
			routes = append(routes, route)
 | 
			
		||||
		case "LIST": // List all resources of a kind.
 | 
			
		||||
@@ -1227,9 +1213,9 @@ func restfulPatchResource(r rest.Patcher, scope handlers.RequestScope, admit adm
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func restfulGetResource(r rest.Getter, e rest.Exporter, scope handlers.RequestScope) restful.RouteFunction {
 | 
			
		||||
func restfulGetResource(r rest.Getter, scope handlers.RequestScope) restful.RouteFunction {
 | 
			
		||||
	return func(req *restful.Request, res *restful.Response) {
 | 
			
		||||
		handlers.GetResource(r, e, &scope)(res.ResponseWriter, req.Request)
 | 
			
		||||
		handlers.GetResource(r, &scope)(res.ResponseWriter, req.Request)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@ package registry
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -73,7 +72,6 @@ type GenericStore interface {
 | 
			
		||||
	GetCreateStrategy() rest.RESTCreateStrategy
 | 
			
		||||
	GetUpdateStrategy() rest.RESTUpdateStrategy
 | 
			
		||||
	GetDeleteStrategy() rest.RESTDeleteStrategy
 | 
			
		||||
	GetExportStrategy() rest.RESTExportStrategy
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Store implements k8s.io/apiserver/pkg/registry/rest.StandardStorage. It's
 | 
			
		||||
@@ -199,10 +197,6 @@ type Store struct {
 | 
			
		||||
	// deletionTimestamp, and deletionGracePeriodSeconds checks.
 | 
			
		||||
	ShouldDeleteDuringUpdate func(ctx context.Context, key string, obj, existing runtime.Object) bool
 | 
			
		||||
 | 
			
		||||
	// ExportStrategy implements resource-specific behavior during export,
 | 
			
		||||
	// optional. Exported objects are not decorated.
 | 
			
		||||
	ExportStrategy rest.RESTExportStrategy
 | 
			
		||||
 | 
			
		||||
	// TableConvertor is an optional interface for transforming items or lists
 | 
			
		||||
	// of items into tabular output. If unset, the default will be used.
 | 
			
		||||
	TableConvertor rest.TableConvertor
 | 
			
		||||
@@ -223,7 +217,6 @@ type Store struct {
 | 
			
		||||
 | 
			
		||||
// Note: the rest.StandardStorage interface aggregates the common REST verbs
 | 
			
		||||
var _ rest.StandardStorage = &Store{}
 | 
			
		||||
var _ rest.Exporter = &Store{}
 | 
			
		||||
var _ rest.TableConvertor = &Store{}
 | 
			
		||||
var _ GenericStore = &Store{}
 | 
			
		||||
 | 
			
		||||
@@ -312,11 +305,6 @@ func (e *Store) GetDeleteStrategy() rest.RESTDeleteStrategy {
 | 
			
		||||
	return e.DeleteStrategy
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetExportStrategy implements GenericStore.
 | 
			
		||||
func (e *Store) GetExportStrategy() rest.RESTExportStrategy {
 | 
			
		||||
	return e.ExportStrategy
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// List returns a list of items matching labels and field according to the
 | 
			
		||||
// store's PredicateFunc.
 | 
			
		||||
func (e *Store) List(ctx context.Context, options *metainternalversion.ListOptions) (runtime.Object, error) {
 | 
			
		||||
@@ -1267,44 +1255,6 @@ func (e *Store) calculateTTL(obj runtime.Object, defaultTTL int64, update bool)
 | 
			
		||||
	return ttl, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// exportObjectMeta unsets the fields on the given object that should not be
 | 
			
		||||
// present when the object is exported.
 | 
			
		||||
func exportObjectMeta(accessor metav1.Object, exact bool) {
 | 
			
		||||
	accessor.SetUID("")
 | 
			
		||||
	if !exact {
 | 
			
		||||
		accessor.SetNamespace("")
 | 
			
		||||
	}
 | 
			
		||||
	accessor.SetCreationTimestamp(metav1.Time{})
 | 
			
		||||
	accessor.SetDeletionTimestamp(nil)
 | 
			
		||||
	accessor.SetResourceVersion("")
 | 
			
		||||
	accessor.SetSelfLink("")
 | 
			
		||||
	if len(accessor.GetGenerateName()) > 0 && !exact {
 | 
			
		||||
		accessor.SetName("")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Export implements the rest.Exporter interface
 | 
			
		||||
func (e *Store) Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) {
 | 
			
		||||
	obj, err := e.Get(ctx, name, &metav1.GetOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if accessor, err := meta.Accessor(obj); err == nil {
 | 
			
		||||
		exportObjectMeta(accessor, opts.Exact)
 | 
			
		||||
	} else {
 | 
			
		||||
		klog.V(4).Infof("Object of type %v does not have ObjectMeta: %v", reflect.TypeOf(obj), err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if e.ExportStrategy != nil {
 | 
			
		||||
		if err = e.ExportStrategy.Export(ctx, obj, opts.Exact); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		e.CreateStrategy.PrepareForCreate(ctx, obj)
 | 
			
		||||
	}
 | 
			
		||||
	return obj, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CompleteWithOptions updates the store with the provided options and
 | 
			
		||||
// defaults common fields.
 | 
			
		||||
func (e *Store) CompleteWithOptions(options *generic.StoreOptions) error {
 | 
			
		||||
 
 | 
			
		||||
@@ -1162,104 +1162,6 @@ func TestStoreUpdateHooksInnerRetry(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO: Add a test to check no-op update if we have object with ResourceVersion
 | 
			
		||||
// already stored in etcd. Currently there is no easy way to store object with
 | 
			
		||||
// ResourceVersion in etcd.
 | 
			
		||||
 | 
			
		||||
type testPodExport struct{}
 | 
			
		||||
 | 
			
		||||
func (t testPodExport) Export(ctx context.Context, obj runtime.Object, exact bool) error {
 | 
			
		||||
	pod := obj.(*example.Pod)
 | 
			
		||||
	if pod.Labels == nil {
 | 
			
		||||
		pod.Labels = map[string]string{}
 | 
			
		||||
	}
 | 
			
		||||
	pod.Labels["exported"] = "true"
 | 
			
		||||
	pod.Labels["exact"] = strconv.FormatBool(exact)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestStoreCustomExport(t *testing.T) {
 | 
			
		||||
	podA := example.Pod{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Namespace: "test",
 | 
			
		||||
			Name:      "foo",
 | 
			
		||||
			Labels:    map[string]string{},
 | 
			
		||||
		},
 | 
			
		||||
		Spec: example.PodSpec{NodeName: "machine"},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	destroyFunc, registry := NewTestGenericStoreRegistry(t)
 | 
			
		||||
	defer destroyFunc()
 | 
			
		||||
 | 
			
		||||
	registry.ExportStrategy = testPodExport{}
 | 
			
		||||
 | 
			
		||||
	testContext := genericapirequest.WithNamespace(genericapirequest.NewContext(), "test")
 | 
			
		||||
	registry.UpdateStrategy.(*testRESTStrategy).allowCreateOnUpdate = true
 | 
			
		||||
	if !updateAndVerify(t, testContext, registry, &podA) {
 | 
			
		||||
		t.Errorf("Unexpected error updating podA")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	obj, err := registry.Export(testContext, podA.Name, metav1.ExportOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("unexpected error: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	exportedPod := obj.(*example.Pod)
 | 
			
		||||
	if exportedPod.Labels["exported"] != "true" {
 | 
			
		||||
		t.Errorf("expected: exported->true, found: %s", exportedPod.Labels["exported"])
 | 
			
		||||
	}
 | 
			
		||||
	if exportedPod.Labels["exact"] != "false" {
 | 
			
		||||
		t.Errorf("expected: exact->false, found: %s", exportedPod.Labels["exact"])
 | 
			
		||||
	}
 | 
			
		||||
	if exportedPod.Labels["prepare_create"] != "true" {
 | 
			
		||||
		t.Errorf("expected: prepare_create->true, found: %s", exportedPod.Labels["prepare_create"])
 | 
			
		||||
	}
 | 
			
		||||
	delete(exportedPod.Labels, "exported")
 | 
			
		||||
	delete(exportedPod.Labels, "exact")
 | 
			
		||||
	delete(exportedPod.Labels, "prepare_create")
 | 
			
		||||
	exportObjectMeta(&podA.ObjectMeta, false)
 | 
			
		||||
	podA.Spec = exportedPod.Spec
 | 
			
		||||
	if !reflect.DeepEqual(&podA, exportedPod) {
 | 
			
		||||
		t.Errorf("expected:\n%v\nsaw:\n%v\n", &podA, exportedPod)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestStoreBasicExport(t *testing.T) {
 | 
			
		||||
	podA := example.Pod{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Namespace: "test",
 | 
			
		||||
			Name:      "foo",
 | 
			
		||||
			Labels:    map[string]string{},
 | 
			
		||||
		},
 | 
			
		||||
		Spec:   example.PodSpec{NodeName: "machine"},
 | 
			
		||||
		Status: example.PodStatus{HostIP: "1.2.3.4"},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	destroyFunc, registry := NewTestGenericStoreRegistry(t)
 | 
			
		||||
	defer destroyFunc()
 | 
			
		||||
 | 
			
		||||
	testContext := genericapirequest.WithNamespace(genericapirequest.NewContext(), "test")
 | 
			
		||||
	registry.UpdateStrategy.(*testRESTStrategy).allowCreateOnUpdate = true
 | 
			
		||||
	if !updateAndVerify(t, testContext, registry, &podA) {
 | 
			
		||||
		t.Errorf("Unexpected error updating podA")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	obj, err := registry.Export(testContext, podA.Name, metav1.ExportOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("unexpected error: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	exportedPod := obj.(*example.Pod)
 | 
			
		||||
	if exportedPod.Labels["prepare_create"] != "true" {
 | 
			
		||||
		t.Errorf("expected: prepare_create->true, found: %s", exportedPod.Labels["prepare_create"])
 | 
			
		||||
	}
 | 
			
		||||
	delete(exportedPod.Labels, "prepare_create")
 | 
			
		||||
	exportObjectMeta(&podA.ObjectMeta, false)
 | 
			
		||||
	podA.Spec = exportedPod.Spec
 | 
			
		||||
	if !reflect.DeepEqual(&podA, exportedPod) {
 | 
			
		||||
		t.Errorf("expected:\n%v\nsaw:\n%v\n", &podA, exportedPod)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestStoreGet(t *testing.T) {
 | 
			
		||||
	podA := &example.Pod{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{Namespace: "test", Name: "foo"},
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,6 @@ go_library(
 | 
			
		||||
        "create_update.go",
 | 
			
		||||
        "delete.go",
 | 
			
		||||
        "doc.go",
 | 
			
		||||
        "export.go",
 | 
			
		||||
        "meta.go",
 | 
			
		||||
        "rest.go",
 | 
			
		||||
        "table.go",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2015 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed 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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package rest
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RESTExportStrategy is the interface that defines how to export a Kubernetes
 | 
			
		||||
// object.  An exported object is stripped of non-user-settable fields and
 | 
			
		||||
// optionally, the identifying information related to the object's identity in
 | 
			
		||||
// the cluster so that it can be loaded into a different namespace or entirely
 | 
			
		||||
// different cluster without conflict.
 | 
			
		||||
type RESTExportStrategy interface {
 | 
			
		||||
	// Export strips fields that can not be set by the user.  If 'exact' is false
 | 
			
		||||
	// fields specific to the cluster are also stripped
 | 
			
		||||
	Export(ctx context.Context, obj runtime.Object, exact bool) error
 | 
			
		||||
}
 | 
			
		||||
@@ -102,16 +102,6 @@ type Lister interface {
 | 
			
		||||
	TableConvertor
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Exporter is an object that knows how to strip a RESTful resource for export. A store should implement this interface
 | 
			
		||||
// if export is generally supported for that type. Errors can still be returned during the actual Export when certain
 | 
			
		||||
// instances of the type are not exportable.
 | 
			
		||||
type Exporter interface {
 | 
			
		||||
	// Export an object.  Fields that are not user specified (e.g. Status, ObjectMeta.ResourceVersion) are stripped out
 | 
			
		||||
	// Returns the stripped object.  If 'exact' is true, fields that are specific to the cluster (e.g. namespace) are
 | 
			
		||||
	// retained, otherwise they are stripped also.
 | 
			
		||||
	Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Getter is an object that can retrieve a named RESTful resource.
 | 
			
		||||
type Getter interface {
 | 
			
		||||
	// Get finds a resource in the storage by name and returns it.
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.CreateOptions":                           schema_pkg_apis_meta_v1_CreateOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.DeleteOptions":                           schema_pkg_apis_meta_v1_DeleteOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.Duration":                                schema_pkg_apis_meta_v1_Duration(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.ExportOptions":                           schema_pkg_apis_meta_v1_ExportOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.FieldsV1":                                schema_pkg_apis_meta_v1_FieldsV1(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.GetOptions":                              schema_pkg_apis_meta_v1_GetOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.GroupKind":                               schema_pkg_apis_meta_v1_GroupKind(ref),
 | 
			
		||||
@@ -628,50 +627,6 @@ func schema_pkg_apis_meta_v1_Duration(ref common.ReferenceCallback) common.OpenA
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func schema_pkg_apis_meta_v1_ExportOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
 | 
			
		||||
	return common.OpenAPIDefinition{
 | 
			
		||||
		Schema: spec.Schema{
 | 
			
		||||
			SchemaProps: spec.SchemaProps{
 | 
			
		||||
				Description: "ExportOptions is the query options to the standard REST get call. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
				Type:        []string{"object"},
 | 
			
		||||
				Properties: map[string]spec.Schema{
 | 
			
		||||
					"kind": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
 | 
			
		||||
							Type:        []string{"string"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"apiVersion": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
 | 
			
		||||
							Type:        []string{"string"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"export": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Should this value be exported.  Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
							Default:     false,
 | 
			
		||||
							Type:        []string{"boolean"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"exact": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Should the export be exact.  Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
							Default:     false,
 | 
			
		||||
							Type:        []string{"boolean"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Required: []string{"export", "exact"},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func schema_pkg_apis_meta_v1_FieldsV1(ref common.ReferenceCallback) common.OpenAPIDefinition {
 | 
			
		||||
	return common.OpenAPIDefinition{
 | 
			
		||||
		Schema: spec.Schema{
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.CreateOptions":                          schema_pkg_apis_meta_v1_CreateOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.DeleteOptions":                          schema_pkg_apis_meta_v1_DeleteOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.Duration":                               schema_pkg_apis_meta_v1_Duration(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.ExportOptions":                          schema_pkg_apis_meta_v1_ExportOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.FieldsV1":                               schema_pkg_apis_meta_v1_FieldsV1(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.GetOptions":                             schema_pkg_apis_meta_v1_GetOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.GroupKind":                              schema_pkg_apis_meta_v1_GroupKind(ref),
 | 
			
		||||
@@ -631,50 +630,6 @@ func schema_pkg_apis_meta_v1_Duration(ref common.ReferenceCallback) common.OpenA
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func schema_pkg_apis_meta_v1_ExportOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
 | 
			
		||||
	return common.OpenAPIDefinition{
 | 
			
		||||
		Schema: spec.Schema{
 | 
			
		||||
			SchemaProps: spec.SchemaProps{
 | 
			
		||||
				Description: "ExportOptions is the query options to the standard REST get call. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
				Type:        []string{"object"},
 | 
			
		||||
				Properties: map[string]spec.Schema{
 | 
			
		||||
					"kind": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
 | 
			
		||||
							Type:        []string{"string"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"apiVersion": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
 | 
			
		||||
							Type:        []string{"string"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"export": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Should this value be exported.  Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
							Default:     false,
 | 
			
		||||
							Type:        []string{"boolean"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"exact": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Should the export be exact.  Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
							Default:     false,
 | 
			
		||||
							Type:        []string{"boolean"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Required: []string{"export", "exact"},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func schema_pkg_apis_meta_v1_FieldsV1(ref common.ReferenceCallback) common.OpenAPIDefinition {
 | 
			
		||||
	return common.OpenAPIDefinition{
 | 
			
		||||
		Schema: spec.Schema{
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.CreateOptions":             schema_pkg_apis_meta_v1_CreateOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.DeleteOptions":             schema_pkg_apis_meta_v1_DeleteOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.Duration":                  schema_pkg_apis_meta_v1_Duration(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.ExportOptions":             schema_pkg_apis_meta_v1_ExportOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.FieldsV1":                  schema_pkg_apis_meta_v1_FieldsV1(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.GetOptions":                schema_pkg_apis_meta_v1_GetOptions(ref),
 | 
			
		||||
		"k8s.io/apimachinery/pkg/apis/meta/v1.GroupKind":                 schema_pkg_apis_meta_v1_GroupKind(ref),
 | 
			
		||||
@@ -629,50 +628,6 @@ func schema_pkg_apis_meta_v1_Duration(ref common.ReferenceCallback) common.OpenA
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func schema_pkg_apis_meta_v1_ExportOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
 | 
			
		||||
	return common.OpenAPIDefinition{
 | 
			
		||||
		Schema: spec.Schema{
 | 
			
		||||
			SchemaProps: spec.SchemaProps{
 | 
			
		||||
				Description: "ExportOptions is the query options to the standard REST get call. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
				Type:        []string{"object"},
 | 
			
		||||
				Properties: map[string]spec.Schema{
 | 
			
		||||
					"kind": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
 | 
			
		||||
							Type:        []string{"string"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"apiVersion": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
 | 
			
		||||
							Type:        []string{"string"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"export": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Should this value be exported.  Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
							Default:     false,
 | 
			
		||||
							Type:        []string{"boolean"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					"exact": {
 | 
			
		||||
						SchemaProps: spec.SchemaProps{
 | 
			
		||||
							Description: "Should the export be exact.  Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.",
 | 
			
		||||
							Default:     false,
 | 
			
		||||
							Type:        []string{"boolean"},
 | 
			
		||||
							Format:      "",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Required: []string{"export", "exact"},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func schema_pkg_apis_meta_v1_FieldsV1(ref common.ReferenceCallback) common.OpenAPIDefinition {
 | 
			
		||||
	return common.OpenAPIDefinition{
 | 
			
		||||
		Schema: spec.Schema{
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@ go_test(
 | 
			
		||||
    size = "large",
 | 
			
		||||
    srcs = [
 | 
			
		||||
        "apiserver_test.go",
 | 
			
		||||
        "export_test.go",
 | 
			
		||||
        "main_test.go",
 | 
			
		||||
        "max_json_patch_operations_test.go",
 | 
			
		||||
        "max_request_body_bytes_test.go",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										57
									
								
								test/integration/apiserver/export_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								test/integration/apiserver/export_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed 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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package apiserver
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	corev1 "k8s.io/api/core/v1"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Tests that the apiserver rejects the export param
 | 
			
		||||
func TestExportRejection(t *testing.T) {
 | 
			
		||||
	_, clientSet, closeFn := setup(t)
 | 
			
		||||
	defer closeFn()
 | 
			
		||||
 | 
			
		||||
	_, err := clientSet.CoreV1().Namespaces().Create(context.Background(), &corev1.Namespace{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{Name: "export-fail"},
 | 
			
		||||
	}, metav1.CreateOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer func() {
 | 
			
		||||
		clientSet.CoreV1().Namespaces().Delete(context.Background(), "export-fail", metav1.DeleteOptions{})
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	result := clientSet.Discovery().RESTClient().Get().AbsPath("/api/v1/namespaces/export-fail").Param("export", "true").Do(context.Background())
 | 
			
		||||
	statusCode := 0
 | 
			
		||||
	result.StatusCode(&statusCode)
 | 
			
		||||
	if statusCode != http.StatusBadRequest {
 | 
			
		||||
		t.Errorf("expected %v, got %v", http.StatusBadRequest, statusCode)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result = clientSet.Discovery().RESTClient().Get().AbsPath("/api/v1/namespaces/export-fail").Param("export", "false").Do(context.Background())
 | 
			
		||||
	statusCode = 0
 | 
			
		||||
	result.StatusCode(&statusCode)
 | 
			
		||||
	if statusCode != http.StatusOK {
 | 
			
		||||
		t.Errorf("expected %v, got %v", http.StatusOK, statusCode)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user