diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 12b06c97b75..30a5c28fb52 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -65753,6 +65753,37 @@ } ] }, + "io.k8s.api.core.v1.PersistentVolumeClaimCondition": { + "description": "PersistentVolumeClaimCondition contails details about state of pvc", + "required": [ + "type", + "status" + ], + "properties": { + "lastProbeTime": { + "description": "Last time we probed the condition.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "lastTransitionTime": { + "description": "Last time the condition transitioned from one status to another.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "message": { + "description": "Human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized.", + "type": "string" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, "io.k8s.api.core.v1.PersistentVolumeClaimList": { "description": "PersistentVolumeClaimList is a list of PersistentVolumeClaim items.", "required": [ @@ -65832,6 +65863,15 @@ "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" } }, + "conditions": { + "description": "Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimCondition" + }, + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, "phase": { "description": "Phase represents the current phase of PersistentVolumeClaim.", "type": "string" @@ -70708,6 +70748,10 @@ "provisioner" ], "properties": { + "allowVolumeExpansion": { + "description": "AllowVolumeExpansion shows whether the storage class allow volume expand", + "type": "boolean" + }, "apiVersion": { "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/api-conventions.md#resources", "type": "string" @@ -70791,6 +70835,10 @@ "provisioner" ], "properties": { + "allowVolumeExpansion": { + "description": "AllowVolumeExpansion shows whether the storage class allow volume expand", + "type": "boolean" + }, "apiVersion": { "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/api-conventions.md#resources", "type": "string" diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index a297274bbc9..79babd0ed58 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -6524,6 +6524,45 @@ "capacity": { "type": "object", "description": "Represents the actual resources of the underlying volume." + }, + "conditions": { + "type": "array", + "items": { + "$ref": "v1.PersistentVolumeClaimCondition" + }, + "description": "Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'." + } + } + }, + "v1.PersistentVolumeClaimCondition": { + "id": "v1.PersistentVolumeClaimCondition", + "description": "PersistentVolumeClaimCondition contails details about state of pvc", + "required": [ + "type", + "status" + ], + "properties": { + "type": { + "type": "string" + }, + "status": { + "type": "string" + }, + "lastProbeTime": { + "type": "string", + "description": "Last time we probed the condition." + }, + "lastTransitionTime": { + "type": "string", + "description": "Last time the condition transitioned from one status to another." + }, + "reason": { + "type": "string", + "description": "Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized." + }, + "message": { + "type": "string", + "description": "Human-readable message indicating details about last transition." } } }, diff --git a/api/swagger-spec/apps_v1beta2.json b/api/swagger-spec/apps_v1beta2.json index e2f5fc8e992..71f9178a4b9 100644 --- a/api/swagger-spec/apps_v1beta2.json +++ b/api/swagger-spec/apps_v1beta2.json @@ -9142,6 +9142,45 @@ "capacity": { "type": "object", "description": "Represents the actual resources of the underlying volume." + }, + "conditions": { + "type": "array", + "items": { + "$ref": "v1.PersistentVolumeClaimCondition" + }, + "description": "Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'." + } + } + }, + "v1.PersistentVolumeClaimCondition": { + "id": "v1.PersistentVolumeClaimCondition", + "description": "PersistentVolumeClaimCondition contails details about state of pvc", + "required": [ + "type", + "status" + ], + "properties": { + "type": { + "type": "string" + }, + "status": { + "type": "string" + }, + "lastProbeTime": { + "type": "string", + "description": "Last time we probed the condition." + }, + "lastTransitionTime": { + "type": "string", + "description": "Last time the condition transitioned from one status to another." + }, + "reason": { + "type": "string", + "description": "Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized." + }, + "message": { + "type": "string", + "description": "Human-readable message indicating details about last transition." } } }, diff --git a/api/swagger-spec/storage.k8s.io_v1.json b/api/swagger-spec/storage.k8s.io_v1.json index 6b2ba5e3ab7..e583a4892f4 100644 --- a/api/swagger-spec/storage.k8s.io_v1.json +++ b/api/swagger-spec/storage.k8s.io_v1.json @@ -795,6 +795,10 @@ "type": "string" }, "description": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid." + }, + "allowVolumeExpansion": { + "type": "boolean", + "description": "AllowVolumeExpansion shows whether the storage class allow volume expand" } } }, diff --git a/api/swagger-spec/storage.k8s.io_v1beta1.json b/api/swagger-spec/storage.k8s.io_v1beta1.json index 86f8dcb1aee..b80206e4e5a 100644 --- a/api/swagger-spec/storage.k8s.io_v1beta1.json +++ b/api/swagger-spec/storage.k8s.io_v1beta1.json @@ -795,6 +795,10 @@ "type": "string" }, "description": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid." + }, + "allowVolumeExpansion": { + "type": "boolean", + "description": "AllowVolumeExpansion shows whether the storage class allow volume expand" } } }, diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index a6636dad5ad..559ff273089 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -20099,6 +20099,45 @@ "capacity": { "type": "object", "description": "Represents the actual resources of the underlying volume." + }, + "conditions": { + "type": "array", + "items": { + "$ref": "v1.PersistentVolumeClaimCondition" + }, + "description": "Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'." + } + } + }, + "v1.PersistentVolumeClaimCondition": { + "id": "v1.PersistentVolumeClaimCondition", + "description": "PersistentVolumeClaimCondition contails details about state of pvc", + "required": [ + "type", + "status" + ], + "properties": { + "type": { + "type": "string" + }, + "status": { + "type": "string" + }, + "lastProbeTime": { + "type": "string", + "description": "Last time we probed the condition." + }, + "lastTransitionTime": { + "type": "string", + "description": "Last time the condition transitioned from one status to another." + }, + "reason": { + "type": "string", + "description": "Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized." + }, + "message": { + "type": "string", + "description": "Human-readable message indicating details about last transition." } } }, diff --git a/cmd/kube-apiserver/app/options/BUILD b/cmd/kube-apiserver/app/options/BUILD index 9a36fd5b360..f65e5b213d4 100644 --- a/cmd/kube-apiserver/app/options/BUILD +++ b/cmd/kube-apiserver/app/options/BUILD @@ -37,6 +37,7 @@ go_library( "//plugin/pkg/admission/namespace/exists:go_default_library", "//plugin/pkg/admission/noderestriction:go_default_library", "//plugin/pkg/admission/persistentvolume/label:go_default_library", + "//plugin/pkg/admission/persistentvolume/resize:go_default_library", "//plugin/pkg/admission/podnodeselector:go_default_library", "//plugin/pkg/admission/podpreset:go_default_library", "//plugin/pkg/admission/podtolerationrestriction:go_default_library", diff --git a/cmd/kube-apiserver/app/options/plugins.go b/cmd/kube-apiserver/app/options/plugins.go index 192fd275d38..1c71ac6b5c2 100644 --- a/cmd/kube-apiserver/app/options/plugins.go +++ b/cmd/kube-apiserver/app/options/plugins.go @@ -41,6 +41,7 @@ import ( "k8s.io/kubernetes/plugin/pkg/admission/namespace/exists" "k8s.io/kubernetes/plugin/pkg/admission/noderestriction" "k8s.io/kubernetes/plugin/pkg/admission/persistentvolume/label" + "k8s.io/kubernetes/plugin/pkg/admission/persistentvolume/resize" "k8s.io/kubernetes/plugin/pkg/admission/podnodeselector" "k8s.io/kubernetes/plugin/pkg/admission/podpreset" "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction" @@ -81,4 +82,5 @@ func RegisterAllAdmissionPlugins(plugins *admission.Plugins) { serviceaccount.Register(plugins) setdefault.Register(plugins) webhook.Register(plugins) + resize.Register(plugins) } diff --git a/cmd/kube-controller-manager/app/BUILD b/cmd/kube-controller-manager/app/BUILD index 683c45450c1..a9d8968191e 100644 --- a/cmd/kube-controller-manager/app/BUILD +++ b/cmd/kube-controller-manager/app/BUILD @@ -72,6 +72,7 @@ go_library( "//pkg/controller/statefulset:go_default_library", "//pkg/controller/ttl:go_default_library", "//pkg/controller/volume/attachdetach:go_default_library", + "//pkg/controller/volume/expand:go_default_library", "//pkg/controller/volume/persistentvolume:go_default_library", "//pkg/features:go_default_library", "//pkg/quota/install:go_default_library", diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index 0221f58ab98..ba781a9a6e4 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -357,6 +357,7 @@ func NewControllerInitializers() map[string]InitFunc { controllers["route"] = startRouteController controllers["persistentvolume-binder"] = startPersistentVolumeBinderController controllers["attachdetach"] = startAttachDetachController + controllers["persistentvolume-expander"] = startVolumeExpandController return controllers } diff --git a/cmd/kube-controller-manager/app/core.go b/cmd/kube-controller-manager/app/core.go index 9b8be77460d..15443874360 100644 --- a/cmd/kube-controller-manager/app/core.go +++ b/cmd/kube-controller-manager/app/core.go @@ -51,6 +51,7 @@ import ( serviceaccountcontroller "k8s.io/kubernetes/pkg/controller/serviceaccount" ttlcontroller "k8s.io/kubernetes/pkg/controller/ttl" "k8s.io/kubernetes/pkg/controller/volume/attachdetach" + "k8s.io/kubernetes/pkg/controller/volume/expand" persistentvolumecontroller "k8s.io/kubernetes/pkg/controller/volume/persistentvolume" "k8s.io/kubernetes/pkg/features" quotainstall "k8s.io/kubernetes/pkg/quota/install" @@ -189,6 +190,24 @@ func startAttachDetachController(ctx ControllerContext) (bool, error) { return true, nil } +func startVolumeExpandController(ctx ControllerContext) (bool, error) { + if utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { + expandController, expandControllerErr := expand.NewExpandController( + ctx.ClientBuilder.ClientOrDie("expand-controller"), + ctx.InformerFactory.Core().V1().PersistentVolumeClaims(), + ctx.InformerFactory.Core().V1().PersistentVolumes(), + ctx.Cloud, + ProbeExpandableVolumePlugins(ctx.Options.VolumeConfiguration)) + + if expandControllerErr != nil { + return true, fmt.Errorf("Failed to start volume expand controller : %v", expandControllerErr) + } + go expandController.Run(ctx.Stop) + return true, nil + } + return false, nil +} + func startEndpointController(ctx ControllerContext) (bool, error) { go endpointcontroller.NewEndpointController( ctx.InformerFactory.Core().V1().Pods(), diff --git a/cmd/kube-controller-manager/app/plugins.go b/cmd/kube-controller-manager/app/plugins.go index f26ab264cef..bf9c9fe1299 100644 --- a/cmd/kube-controller-manager/app/plugins.go +++ b/cmd/kube-controller-manager/app/plugins.go @@ -88,6 +88,25 @@ func GetDynamicPluginProber(config componentconfig.VolumeConfiguration) volume.D return flexvolume.GetDynamicPluginProber(config.FlexVolumePluginDir) } +// ProbeExpandableVolumePlugins returns volume plugins which are expandable +func ProbeExpandableVolumePlugins(config componentconfig.VolumeConfiguration) []volume.VolumePlugin { + allPlugins := []volume.VolumePlugin{} + + allPlugins = append(allPlugins, aws_ebs.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, gce_pd.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, cinder.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, portworx.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, vsphere_volume.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, glusterfs.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, rbd.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, azure_dd.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, photon_pd.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, storageos.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...) + return allPlugins +} + // ProbeControllerVolumePlugins collects all persistent volume plugins into an // easy to use list. Only volume plugins that implement any of // provisioner/recycler/deleter interface should be returned. diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index 2dafbff04de..ef36e5a6efd 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -2482,6 +2482,13 @@ When an object is created, the system will populate this list with the current s

object

+ +

conditions

+

Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to ResizeStarted.

+

false

+

v1.PersistentVolumeClaimCondition array

+ + @@ -2519,6 +2526,75 @@ When an object is created, the system will populate this list with the current s + +
+

v1.PersistentVolumeClaimCondition

+
+

PersistentVolumeClaimCondition contails details about state of pvc

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

type

true

string

status

true

string

lastProbeTime

Last time we probed the condition.

false

string

lastTransitionTime

Last time the condition transitioned from one status to another.

false

string

reason

Unique, this should be a short, machine understandable string that gives the reason for condition’s last transition. If it reports "ResizeStarted" that means the underlying persistent volume is being resized.

false

string

message

Human-readable message indicating details about last transition.

false

string

+

v1.SecretVolumeSource

diff --git a/docs/api-reference/apps/v1beta2/definitions.html b/docs/api-reference/apps/v1beta2/definitions.html index 34a1ded7df1..3afb4401ecb 100755 --- a/docs/api-reference/apps/v1beta2/definitions.html +++ b/docs/api-reference/apps/v1beta2/definitions.html @@ -2808,6 +2808,13 @@ When an object is created, the system will populate this list with the current s

object

+ +

conditions

+

Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to ResizeStarted.

+

false

+

v1.PersistentVolumeClaimCondition array

+ + @@ -3094,6 +3101,75 @@ When an object is created, the system will populate this list with the current s +
+
+

v1.PersistentVolumeClaimCondition

+
+

PersistentVolumeClaimCondition contails details about state of pvc

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

type

true

string

status

true

string

lastProbeTime

Last time we probed the condition.

false

string

lastTransitionTime

Last time the condition transitioned from one status to another.

false

string

reason

Unique, this should be a short, machine understandable string that gives the reason for condition’s last transition. If it reports "ResizeStarted" that means the underlying persistent volume is being resized.

false

string

message

Human-readable message indicating details about last transition.

false

string

+

v1.SecretVolumeSource

diff --git a/docs/api-reference/storage.k8s.io/v1/definitions.html b/docs/api-reference/storage.k8s.io/v1/definitions.html index 88a2edf669a..3263c0ca075 100755 --- a/docs/api-reference/storage.k8s.io/v1/definitions.html +++ b/docs/api-reference/storage.k8s.io/v1/definitions.html @@ -989,6 +989,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

string array

+ +

allowVolumeExpansion

+

AllowVolumeExpansion shows whether the storage class allow volume expand

+

false

+

boolean

+

false

+ diff --git a/docs/api-reference/storage.k8s.io/v1beta1/definitions.html b/docs/api-reference/storage.k8s.io/v1beta1/definitions.html index fbeef75b905..0f64250074b 100755 --- a/docs/api-reference/storage.k8s.io/v1beta1/definitions.html +++ b/docs/api-reference/storage.k8s.io/v1beta1/definitions.html @@ -951,6 +951,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

string array

+ +

allowVolumeExpansion

+

AllowVolumeExpansion shows whether the storage class allow volume expand

+

false

+

boolean

+

false

+ diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 0c0be691b89..db8f27a6c52 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -1632,6 +1632,54 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +
+
+

v1.GitRepoVolumeSource

+
+

Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support ownership management. Git repo volumes support SELinux relabeling.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

repository

Repository URL

true

string

revision

Commit hash for the specified revision.

false

string

directory

Target directory name. Must not contain or start with ... If . is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name.

false

string

+

v1.EndpointsList

@@ -1687,54 +1735,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } -
-
-

v1.GitRepoVolumeSource

-
-

Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support ownership management. Git repo volumes support SELinux relabeling.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

repository

Repository URL

true

string

revision

Commit hash for the specified revision.

false

string

directory

Target directory name. Must not contain or start with ... If . is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name.

false

string

-

v1.ReplicationControllerCondition

@@ -3582,6 +3582,13 @@ When an object is created, the system will populate this list with the current s

object

+ +

conditions

+

Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to ResizeStarted.

+

false

+

v1.PersistentVolumeClaimCondition array

+ + @@ -3644,6 +3651,75 @@ The resulting set of endpoints can be viewed as:
+
+
+

v1.PersistentVolumeClaimCondition

+
+

PersistentVolumeClaimCondition contails details about state of pvc

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

type

true

string

status

true

string

lastProbeTime

Last time we probed the condition.

false

string

lastTransitionTime

Last time the condition transitioned from one status to another.

false

string

reason

Unique, this should be a short, machine understandable string that gives the reason for condition’s last transition. If it reports "ResizeStarted" that means the underlying persistent volume is being resized.

false

string

message

Human-readable message indicating details about last transition.

false

string

+

v1.SecretVolumeSource

diff --git a/hack/.golint_failures b/hack/.golint_failures index d73c3779a5b..4f5a61cac89 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -190,6 +190,7 @@ pkg/controller/volume/attachdetach pkg/controller/volume/attachdetach/statusupdater pkg/controller/volume/attachdetach/testing pkg/controller/volume/events +pkg/controller/volume/expand pkg/controller/volume/persistentvolume pkg/controller/volume/persistentvolume/options pkg/credentialprovider diff --git a/pkg/api/types.go b/pkg/api/types.go index 69d9f42c9c4..089b20aa8d0 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -547,6 +547,27 @@ type PersistentVolumeClaimSpec struct { StorageClassName *string } +type PersistentVolumeClaimConditionType string + +// These are valid conditions of Pvc +const ( + // An user trigger resize of pvc has been started + PersistentVolumeClaimResizing PersistentVolumeClaimConditionType = "Resizing" +) + +type PersistentVolumeClaimCondition struct { + Type PersistentVolumeClaimConditionType + Status ConditionStatus + // +optional + LastProbeTime metav1.Time + // +optional + LastTransitionTime metav1.Time + // +optional + Reason string + // +optional + Message string +} + type PersistentVolumeClaimStatus struct { // Phase represents the current phase of PersistentVolumeClaim // +optional @@ -557,6 +578,8 @@ type PersistentVolumeClaimStatus struct { // Represents the actual resources of the underlying volume // +optional Capacity ResourceList + // +optional + Conditions []PersistentVolumeClaimCondition } type PersistentVolumeAccessMode string diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 24216c3dd52..716ca05ed77 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -233,6 +233,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_PersistentVolume_To_v1_PersistentVolume, Convert_v1_PersistentVolumeClaim_To_api_PersistentVolumeClaim, Convert_api_PersistentVolumeClaim_To_v1_PersistentVolumeClaim, + Convert_v1_PersistentVolumeClaimCondition_To_api_PersistentVolumeClaimCondition, + Convert_api_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition, Convert_v1_PersistentVolumeClaimList_To_api_PersistentVolumeClaimList, Convert_api_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList, Convert_v1_PersistentVolumeClaimSpec_To_api_PersistentVolumeClaimSpec, @@ -2942,6 +2944,36 @@ func Convert_api_PersistentVolumeClaim_To_v1_PersistentVolumeClaim(in *api.Persi return autoConvert_api_PersistentVolumeClaim_To_v1_PersistentVolumeClaim(in, out, s) } +func autoConvert_v1_PersistentVolumeClaimCondition_To_api_PersistentVolumeClaimCondition(in *v1.PersistentVolumeClaimCondition, out *api.PersistentVolumeClaimCondition, s conversion.Scope) error { + out.Type = api.PersistentVolumeClaimConditionType(in.Type) + out.Status = api.ConditionStatus(in.Status) + out.LastProbeTime = in.LastProbeTime + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_v1_PersistentVolumeClaimCondition_To_api_PersistentVolumeClaimCondition is an autogenerated conversion function. +func Convert_v1_PersistentVolumeClaimCondition_To_api_PersistentVolumeClaimCondition(in *v1.PersistentVolumeClaimCondition, out *api.PersistentVolumeClaimCondition, s conversion.Scope) error { + return autoConvert_v1_PersistentVolumeClaimCondition_To_api_PersistentVolumeClaimCondition(in, out, s) +} + +func autoConvert_api_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition(in *api.PersistentVolumeClaimCondition, out *v1.PersistentVolumeClaimCondition, s conversion.Scope) error { + out.Type = v1.PersistentVolumeClaimConditionType(in.Type) + out.Status = v1.ConditionStatus(in.Status) + out.LastProbeTime = in.LastProbeTime + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_api_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition is an autogenerated conversion function. +func Convert_api_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition(in *api.PersistentVolumeClaimCondition, out *v1.PersistentVolumeClaimCondition, s conversion.Scope) error { + return autoConvert_api_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition(in, out, s) +} + func autoConvert_v1_PersistentVolumeClaimList_To_api_PersistentVolumeClaimList(in *v1.PersistentVolumeClaimList, out *api.PersistentVolumeClaimList, s conversion.Scope) error { out.ListMeta = in.ListMeta out.Items = *(*[]api.PersistentVolumeClaim)(unsafe.Pointer(&in.Items)) @@ -3000,6 +3032,7 @@ func autoConvert_v1_PersistentVolumeClaimStatus_To_api_PersistentVolumeClaimStat out.Phase = api.PersistentVolumeClaimPhase(in.Phase) out.AccessModes = *(*[]api.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes)) out.Capacity = *(*api.ResourceList)(unsafe.Pointer(&in.Capacity)) + out.Conditions = *(*[]api.PersistentVolumeClaimCondition)(unsafe.Pointer(&in.Conditions)) return nil } @@ -3012,6 +3045,7 @@ func autoConvert_api_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStat out.Phase = v1.PersistentVolumeClaimPhase(in.Phase) out.AccessModes = *(*[]v1.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes)) out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity)) + out.Conditions = *(*[]v1.PersistentVolumeClaimCondition)(unsafe.Pointer(&in.Conditions)) return nil } diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index f52e55405ba..c484f124431 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -1588,10 +1588,31 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *api.PersistentVolumeCla oldPvc.Spec.VolumeName = newPvc.Spec.VolumeName defer func() { oldPvc.Spec.VolumeName = "" }() } - // changes to Spec are not allowed, but updates to label/and some annotations are OK. - // no-op updates pass validation. - if !apiequality.Semantic.DeepEqual(newPvc.Spec, oldPvc.Spec) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "field is immutable after creation")) + + if utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { + newPVCSpecCopy := newPvc.Spec.DeepCopy() + + // lets make sure storage values are same. + if newPvc.Status.Phase == api.ClaimBound && newPVCSpecCopy.Resources.Requests != nil { + newPVCSpecCopy.Resources.Requests["storage"] = oldPvc.Spec.Resources.Requests["storage"] + } + + oldSize := oldPvc.Spec.Resources.Requests["storage"] + newSize := newPvc.Spec.Resources.Requests["storage"] + + if !apiequality.Semantic.DeepEqual(*newPVCSpecCopy, oldPvc.Spec) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "is immutable after creation except resources.requests for bound claims")) + } + if newSize.Cmp(oldSize) < 0 { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "resources", "requests", "storage"), "field can not be less than previous value")) + } + + } else { + // changes to Spec are not allowed, but updates to label/and some annotations are OK. + // no-op updates pass validation. + if !apiequality.Semantic.DeepEqual(newPvc.Spec, oldPvc.Spec) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "field is immutable after creation")) + } } // storageclass annotation should be immutable after creation @@ -1611,6 +1632,10 @@ func ValidatePersistentVolumeClaimStatusUpdate(newPvc, oldPvc *api.PersistentVol if len(newPvc.Spec.AccessModes) == 0 { allErrs = append(allErrs, field.Required(field.NewPath("Spec", "accessModes"), "")) } + if !utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) && len(newPvc.Status.Conditions) > 0 { + conditionPath := field.NewPath("status", "conditions") + allErrs = append(allErrs, field.Forbidden(conditionPath, "invalid field")) + } capPath := field.NewPath("status", "capacity") for r, qty := range newPvc.Status.Capacity { allErrs = append(allErrs, validateBasicResource(qty, capPath.Key(string(r)))...) diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 065af85d543..26b5aa061e5 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -530,6 +530,17 @@ func testVolumeClaim(name string, namespace string, spec api.PersistentVolumeCla } } +func testVolumeClaimWithStatus( + name, namespace string, + spec api.PersistentVolumeClaimSpec, + status api.PersistentVolumeClaimStatus) *api.PersistentVolumeClaim { + return &api.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace}, + Spec: spec, + Status: status, + } +} + func testVolumeClaimStorageClass(name string, namespace string, annval string, spec api.PersistentVolumeClaimSpec) *api.PersistentVolumeClaim { annotations := map[string]string{ v1.BetaStorageClassAnnotation: annval, @@ -728,7 +739,7 @@ func TestValidatePersistentVolumeClaim(t *testing.T) { } func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { - validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ + validClaim := testVolumeClaimWithStatus("foo", "ns", api.PersistentVolumeClaimSpec{ AccessModes: []api.PersistentVolumeAccessMode{ api.ReadWriteOnce, api.ReadOnlyMany, @@ -738,7 +749,10 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), }, }, + }, api.PersistentVolumeClaimStatus{ + Phase: api.ClaimBound, }) + validClaimStorageClass := testVolumeClaimStorageClass("foo", "ns", "fast", api.PersistentVolumeClaimSpec{ AccessModes: []api.PersistentVolumeAccessMode{ api.ReadOnlyMany, @@ -828,50 +842,125 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { }, VolumeName: "volume", }) + validSizeUpdate := testVolumeClaimWithStatus("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + api.ReadOnlyMany, + }, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("15G"), + }, + }, + }, api.PersistentVolumeClaimStatus{ + Phase: api.ClaimBound, + }) + + invalidSizeUpdate := testVolumeClaimWithStatus("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + api.ReadOnlyMany, + }, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("5G"), + }, + }, + }, api.PersistentVolumeClaimStatus{ + Phase: api.ClaimBound, + }) + + unboundSizeUpdate := testVolumeClaimWithStatus("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + api.ReadOnlyMany, + }, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("12G"), + }, + }, + }, api.PersistentVolumeClaimStatus{ + Phase: api.ClaimPending, + }) + scenarios := map[string]struct { isExpectedFailure bool oldClaim *api.PersistentVolumeClaim newClaim *api.PersistentVolumeClaim + enableResize bool }{ "valid-update-volumeName-only": { isExpectedFailure: false, oldClaim: validClaim, newClaim: validUpdateClaim, + enableResize: false, }, "valid-no-op-update": { isExpectedFailure: false, oldClaim: validUpdateClaim, newClaim: validUpdateClaim, + enableResize: false, }, "invalid-update-change-resources-on-bound-claim": { isExpectedFailure: true, oldClaim: validUpdateClaim, newClaim: invalidUpdateClaimResources, + enableResize: false, }, "invalid-update-change-access-modes-on-bound-claim": { isExpectedFailure: true, oldClaim: validUpdateClaim, newClaim: invalidUpdateClaimAccessModes, + enableResize: false, }, "invalid-update-change-storage-class-annotation-after-creation": { isExpectedFailure: true, oldClaim: validClaimStorageClass, newClaim: invalidUpdateClaimStorageClass, + enableResize: false, }, "valid-update-mutable-annotation": { isExpectedFailure: false, oldClaim: validClaimAnnotation, newClaim: validUpdateClaimMutableAnnotation, + enableResize: false, }, "valid-update-add-annotation": { isExpectedFailure: false, oldClaim: validClaim, newClaim: validAddClaimAnnotation, + enableResize: false, + }, + "valid-size-update-resize-disabled": { + isExpectedFailure: true, + oldClaim: validClaim, + newClaim: validSizeUpdate, + enableResize: false, + }, + "valid-size-update-resize-enabled": { + isExpectedFailure: false, + oldClaim: validClaim, + newClaim: validSizeUpdate, + enableResize: true, + }, + "invalid-size-update-resize-enabled": { + isExpectedFailure: true, + oldClaim: validClaim, + newClaim: invalidSizeUpdate, + enableResize: true, + }, + "unbound-size-update-resize-enabled": { + isExpectedFailure: true, + oldClaim: validClaim, + newClaim: unboundSizeUpdate, + enableResize: true, }, } for name, scenario := range scenarios { // ensure we have a resource version specified for updates + togglePVExpandFeature(scenario.enableResize, t) scenario.oldClaim.ResourceVersion = "1" scenario.newClaim.ResourceVersion = "1" errs := ValidatePersistentVolumeClaimUpdate(scenario.newClaim, scenario.oldClaim) @@ -884,6 +973,23 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { } } +func togglePVExpandFeature(toggleFlag bool, t *testing.T) { + if toggleFlag { + // Enable alpha feature LocalStorageCapacityIsolation + err := utilfeature.DefaultFeatureGate.Set("ExpandPersistentVolumes=true") + if err != nil { + t.Errorf("Failed to enable feature gate for ExpandPersistentVolumes: %v", err) + return + } + } else { + err := utilfeature.DefaultFeatureGate.Set("ExpandPersistentVolumes=false") + if err != nil { + t.Errorf("Failed to disable feature gate for ExpandPersistentVolumes: %v", err) + return + } + } +} + func TestValidateKeyToPath(t *testing.T) { testCases := []struct { kp api.KeyToPath @@ -9232,6 +9338,68 @@ func TestValidateLimitRange(t *testing.T) { } +func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) { + validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + api.ReadOnlyMany, + }, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), + }, + }, + }) + validConditionUpdate := testVolumeClaimWithStatus("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + api.ReadOnlyMany, + }, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), + }, + }, + }, api.PersistentVolumeClaimStatus{ + Phase: api.ClaimPending, + Conditions: []api.PersistentVolumeClaimCondition{ + {Type: api.PersistentVolumeClaimResizing, Status: api.ConditionTrue}, + }, + }) + scenarios := map[string]struct { + isExpectedFailure bool + oldClaim *api.PersistentVolumeClaim + newClaim *api.PersistentVolumeClaim + enableResize bool + }{ + "condition-update-with-disabled-feature-gate": { + isExpectedFailure: true, + oldClaim: validClaim, + newClaim: validConditionUpdate, + enableResize: false, + }, + "condition-update-with-enabled-feature-gate": { + isExpectedFailure: false, + oldClaim: validClaim, + newClaim: validConditionUpdate, + enableResize: true, + }, + } + for name, scenario := range scenarios { + // ensure we have a resource version specified for updates + togglePVExpandFeature(scenario.enableResize, t) + scenario.oldClaim.ResourceVersion = "1" + scenario.newClaim.ResourceVersion = "1" + errs := ValidatePersistentVolumeClaimStatusUpdate(scenario.newClaim, scenario.oldClaim) + if len(errs) == 0 && scenario.isExpectedFailure { + t.Errorf("Unexpected success for scenario: %s", name) + } + if len(errs) > 0 && !scenario.isExpectedFailure { + t.Errorf("Unexpected failure for scenario: %s - %+v", name, errs) + } + } +} + func TestValidateResourceQuota(t *testing.T) { spec := api.ResourceQuotaSpec{ Hard: api.ResourceList{ diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index d9ab39d3354..938b7316a05 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -427,6 +427,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*PersistentVolumeClaim).DeepCopyInto(out.(*PersistentVolumeClaim)) return nil }, InType: reflect.TypeOf(&PersistentVolumeClaim{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*PersistentVolumeClaimCondition).DeepCopyInto(out.(*PersistentVolumeClaimCondition)) + return nil + }, InType: reflect.TypeOf(&PersistentVolumeClaimCondition{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*PersistentVolumeClaimList).DeepCopyInto(out.(*PersistentVolumeClaimList)) return nil @@ -3513,6 +3517,24 @@ func (in *PersistentVolumeClaim) DeepCopyObject() runtime.Object { } } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PersistentVolumeClaimCondition) DeepCopyInto(out *PersistentVolumeClaimCondition) { + *out = *in + in.LastProbeTime.DeepCopyInto(&out.LastProbeTime) + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaimCondition. +func (in *PersistentVolumeClaimCondition) DeepCopy() *PersistentVolumeClaimCondition { + if in == nil { + return nil + } + out := new(PersistentVolumeClaimCondition) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PersistentVolumeClaimList) DeepCopyInto(out *PersistentVolumeClaimList) { *out = *in @@ -3602,6 +3624,13 @@ func (in *PersistentVolumeClaimStatus) DeepCopyInto(out *PersistentVolumeClaimSt (*out)[key] = val.DeepCopy() } } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]PersistentVolumeClaimCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/pkg/apis/storage/types.go b/pkg/apis/storage/types.go index 2a45e3557d1..1af94b2d745 100644 --- a/pkg/apis/storage/types.go +++ b/pkg/apis/storage/types.go @@ -59,6 +59,12 @@ type StorageClass struct { // PersistentVolumes of this storage class are created with // +optional MountOptions []string + + // AllowVolumeExpansion shows whether the storage class allow volume expand + // If the field is nil or not set, it would amount to expansion disabled + // for all PVs created from this storageclass. + // +optional + AllowVolumeExpansion *bool } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/apis/storage/v1/zz_generated.conversion.go b/pkg/apis/storage/v1/zz_generated.conversion.go index d7d8f95860b..59594d26519 100644 --- a/pkg/apis/storage/v1/zz_generated.conversion.go +++ b/pkg/apis/storage/v1/zz_generated.conversion.go @@ -51,6 +51,7 @@ func autoConvert_v1_StorageClass_To_storage_StorageClass(in *v1.StorageClass, ou out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) out.ReclaimPolicy = (*api.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy)) out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions)) + out.AllowVolumeExpansion = (*bool)(unsafe.Pointer(in.AllowVolumeExpansion)) return nil } @@ -65,6 +66,7 @@ func autoConvert_storage_StorageClass_To_v1_StorageClass(in *storage.StorageClas out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) out.ReclaimPolicy = (*core_v1.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy)) out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions)) + out.AllowVolumeExpansion = (*bool)(unsafe.Pointer(in.AllowVolumeExpansion)) return nil } diff --git a/pkg/apis/storage/v1beta1/zz_generated.conversion.go b/pkg/apis/storage/v1beta1/zz_generated.conversion.go index 4477999da79..d340530abbc 100644 --- a/pkg/apis/storage/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/storage/v1beta1/zz_generated.conversion.go @@ -51,6 +51,7 @@ func autoConvert_v1beta1_StorageClass_To_storage_StorageClass(in *v1beta1.Storag out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) out.ReclaimPolicy = (*api.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy)) out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions)) + out.AllowVolumeExpansion = (*bool)(unsafe.Pointer(in.AllowVolumeExpansion)) return nil } @@ -65,6 +66,7 @@ func autoConvert_storage_StorageClass_To_v1beta1_StorageClass(in *storage.Storag out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) out.ReclaimPolicy = (*v1.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy)) out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions)) + out.AllowVolumeExpansion = (*bool)(unsafe.Pointer(in.AllowVolumeExpansion)) return nil } diff --git a/pkg/apis/storage/validation/BUILD b/pkg/apis/storage/validation/BUILD index 2ce7952d201..cdb70b259ad 100644 --- a/pkg/apis/storage/validation/BUILD +++ b/pkg/apis/storage/validation/BUILD @@ -13,9 +13,11 @@ go_library( "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", "//pkg/apis/storage:go_default_library", + "//pkg/features:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -27,6 +29,7 @@ go_test( "//pkg/api:go_default_library", "//pkg/apis/storage:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/pkg/apis/storage/validation/validation.go b/pkg/apis/storage/validation/validation.go index 84dc042faec..38b7915167e 100644 --- a/pkg/apis/storage/validation/validation.go +++ b/pkg/apis/storage/validation/validation.go @@ -23,9 +23,11 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api" apivalidation "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/apis/storage" + "k8s.io/kubernetes/pkg/features" ) // ValidateStorageClass validates a StorageClass. @@ -34,6 +36,7 @@ func ValidateStorageClass(storageClass *storage.StorageClass) field.ErrorList { allErrs = append(allErrs, validateProvisioner(storageClass.Provisioner, field.NewPath("provisioner"))...) allErrs = append(allErrs, validateParameters(storageClass.Parameters, field.NewPath("parameters"))...) allErrs = append(allErrs, validateReclaimPolicy(storageClass.ReclaimPolicy, field.NewPath("reclaimPolicy"))...) + allErrs = append(allErrs, validateAllowVolumeExpansion(storageClass.AllowVolumeExpansion, field.NewPath("allowVolumeExpansion"))...) return allErrs } @@ -108,3 +111,13 @@ func validateReclaimPolicy(reclaimPolicy *api.PersistentVolumeReclaimPolicy, fld } return allErrs } + +// validateAllowVolumeExpansion tests that if ExpandPersistentVolumes feature gate is disabled, whether the AllowVolumeExpansion filed +// of storage class is set +func validateAllowVolumeExpansion(allowExpand *bool, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if allowExpand != nil && !utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { + allErrs = append(allErrs, field.Forbidden(fldPath, "field is disabled by feature-gate ExpandPersistentVolumes")) + } + return allErrs +} diff --git a/pkg/apis/storage/validation/validation_test.go b/pkg/apis/storage/validation/validation_test.go index 07b020b52eb..8e8e9f499a2 100644 --- a/pkg/apis/storage/validation/validation_test.go +++ b/pkg/apis/storage/validation/validation_test.go @@ -21,6 +21,7 @@ import ( "testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/storage" ) @@ -123,3 +124,36 @@ func TestValidateStorageClass(t *testing.T) { } } } + +func TestAlphaExpandPersistentVolumesFeatureValidation(t *testing.T) { + deleteReclaimPolicy := api.PersistentVolumeReclaimPolicy("Delete") + falseVar := false + testSC := &storage.StorageClass{ + // empty parameters + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Provisioner: "kubernetes.io/foo-provisioner", + Parameters: map[string]string{}, + ReclaimPolicy: &deleteReclaimPolicy, + AllowVolumeExpansion: &falseVar, + } + + // Enable alpha feature ExpandPersistentVolumes + err := utilfeature.DefaultFeatureGate.Set("ExpandPersistentVolumes=true") + if err != nil { + t.Errorf("Failed to enable feature gate for ExpandPersistentVolumes: %v", err) + return + } + if errs := ValidateStorageClass(testSC); len(errs) != 0 { + t.Errorf("expected success: %v", errs) + } + // Disable alpha feature ExpandPersistentVolumes + err = utilfeature.DefaultFeatureGate.Set("ExpandPersistentVolumes=false") + if err != nil { + t.Errorf("Failed to disable feature gate for ExpandPersistentVolumes: %v", err) + return + } + if errs := ValidateStorageClass(testSC); len(errs) == 0 { + t.Errorf("expected failure, but got no error") + } + +} diff --git a/pkg/apis/storage/zz_generated.deepcopy.go b/pkg/apis/storage/zz_generated.deepcopy.go index e95da89445a..b6564ce03ad 100644 --- a/pkg/apis/storage/zz_generated.deepcopy.go +++ b/pkg/apis/storage/zz_generated.deepcopy.go @@ -74,6 +74,15 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.AllowVolumeExpansion != nil { + in, out := &in.AllowVolumeExpansion, &out.AllowVolumeExpansion + if *in == nil { + *out = nil + } else { + *out = new(bool) + **out = **in + } + } return } diff --git a/pkg/controller/BUILD b/pkg/controller/BUILD index 405f2571b1f..06544fbddad 100644 --- a/pkg/controller/BUILD +++ b/pkg/controller/BUILD @@ -128,6 +128,7 @@ filegroup( "//pkg/controller/ttl:all-srcs", "//pkg/controller/volume/attachdetach:all-srcs", "//pkg/controller/volume/events:all-srcs", + "//pkg/controller/volume/expand:all-srcs", "//pkg/controller/volume/persistentvolume:all-srcs", ], tags = ["automanaged"], diff --git a/pkg/controller/volume/expand/BUILD b/pkg/controller/volume/expand/BUILD new file mode 100644 index 00000000000..b68223bee84 --- /dev/null +++ b/pkg/controller/volume/expand/BUILD @@ -0,0 +1,60 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "expand_controller.go", + "pvc_populator.go", + "sync_volume_resize.go", + ], + tags = ["automanaged"], + deps = [ + "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", + "//pkg/controller/volume/expand/cache:go_default_library", + "//pkg/controller/volume/expand/util:go_default_library", + "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", + "//pkg/util/io:go_default_library", + "//pkg/util/mount:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/util/operationexecutor:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", + "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//pkg/controller/volume/expand/cache:all-srcs", + "//pkg/controller/volume/expand/util:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/pkg/controller/volume/expand/OWNERS b/pkg/controller/volume/expand/OWNERS new file mode 100644 index 00000000000..f9e1482748f --- /dev/null +++ b/pkg/controller/volume/expand/OWNERS @@ -0,0 +1,4 @@ +approvers: +- saad-ali +- jsafrane +- gnufied diff --git a/pkg/controller/volume/expand/cache/BUILD b/pkg/controller/volume/expand/cache/BUILD new file mode 100644 index 00000000000..f07d34a020a --- /dev/null +++ b/pkg/controller/volume/expand/cache/BUILD @@ -0,0 +1,53 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_library( + name = "go_default_library", + srcs = ["volume_resize_map.go"], + tags = ["automanaged"], + deps = [ + "//pkg/controller/volume/expand/util:go_default_library", + "//pkg/util/strings:go_default_library", + "//pkg/volume/util/types:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) + +go_test( + name = "go_default_test", + srcs = ["volume_resize_map_test.go"], + library = ":go_default_library", + deps = [ + "//pkg/volume/util/types:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + ], +) diff --git a/pkg/controller/volume/expand/cache/volume_resize_map.go b/pkg/controller/volume/expand/cache/volume_resize_map.go new file mode 100644 index 00000000000..b04bf9f254e --- /dev/null +++ b/pkg/controller/volume/expand/cache/volume_resize_map.go @@ -0,0 +1,211 @@ +/* +Copyright 2017 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 cache + +import ( + "encoding/json" + "fmt" + "sync" + + "github.com/golang/glog" + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + commontypes "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/strategicpatch" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/pkg/controller/volume/expand/util" + "k8s.io/kubernetes/pkg/util/strings" + "k8s.io/kubernetes/pkg/volume/util/types" +) + +// VolumeResizeMap defines an interface that serves as a cache for holding pending resizing requests +type VolumeResizeMap interface { + // AddPVCUpdate adds pvc for resizing + AddPVCUpdate(pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) + // DeletePVC deletes pvc that is scheduled for resizing + DeletePVC(pvc *v1.PersistentVolumeClaim) + // GetPVCsWithResizeRequest returns all pending pvc resize requests + GetPVCsWithResizeRequest() []*PVCWithResizeRequest + // MarkAsResized marks a pvc as fully resized + MarkAsResized(*PVCWithResizeRequest, resource.Quantity) error + // UpdatePVSize updates just pv size after cloudprovider resizing is successful + UpdatePVSize(*PVCWithResizeRequest, resource.Quantity) error +} + +type volumeResizeMap struct { + // map of unique pvc name and resize requests that are pending or inflight + pvcrs map[types.UniquePVCName]*PVCWithResizeRequest + // kube client for making API calls + kubeClient clientset.Interface + // for guarding access to pvcrs map + sync.RWMutex +} + +// PVCWithResizeRequest struct defines data structure that stores state needed for +// performing file system resize +type PVCWithResizeRequest struct { + // PVC that needs to be resized + PVC *v1.PersistentVolumeClaim + // persistentvolume + PersistentVolume *v1.PersistentVolume + // Current volume size + CurrentSize resource.Quantity + // Expended volume size + ExpectedSize resource.Quantity +} + +// UniquePVCKey returns unique key of the PVC based on its UID +func (pvcr *PVCWithResizeRequest) UniquePVCKey() types.UniquePVCName { + return types.UniquePVCName(pvcr.PVC.UID) +} + +// QualifiedName returns namespace and name combination of the PVC +func (pvcr *PVCWithResizeRequest) QualifiedName() string { + return strings.JoinQualifiedName(pvcr.PVC.Namespace, pvcr.PVC.Name) +} + +// NewVolumeResizeMap returns new VolumeResizeMap which acts as a cache +// for holding pending resize requests. +func NewVolumeResizeMap(kubeClient clientset.Interface) VolumeResizeMap { + resizeMap := &volumeResizeMap{} + resizeMap.pvcrs = make(map[types.UniquePVCName]*PVCWithResizeRequest) + resizeMap.kubeClient = kubeClient + return resizeMap +} + +// AddPVCUpdate adds pvc for resizing +func (resizeMap *volumeResizeMap) AddPVCUpdate(pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) { + if pvc.Namespace != pv.Spec.ClaimRef.Namespace || pvc.Name != pv.Spec.ClaimRef.Name { + glog.V(4).Infof("Persistent Volume is not mapped to PVC being updated : %s", util.ClaimToClaimKey(pvc)) + return + } + + if pvc.Status.Phase != v1.ClaimBound { + return + } + + resizeMap.Lock() + defer resizeMap.Unlock() + + pvcSize := pvc.Spec.Resources.Requests[v1.ResourceStorage] + pvcStatusSize := pvc.Status.Capacity[v1.ResourceStorage] + + if pvcStatusSize.Cmp(pvcSize) >= 0 { + return + } + + glog.V(4).Infof("Adding pvc %s with Size %s/%s for resizing", util.ClaimToClaimKey(pvc), pvcSize.String(), pvcStatusSize.String()) + + pvcRequest := &PVCWithResizeRequest{ + PVC: pvc, + CurrentSize: pvcStatusSize, + ExpectedSize: pvcSize, + PersistentVolume: pv, + } + resizeMap.pvcrs[types.UniquePVCName(pvc.UID)] = pvcRequest +} + +// GetPVCsWithResizeRequest returns all pending pvc resize requests +func (resizeMap *volumeResizeMap) GetPVCsWithResizeRequest() []*PVCWithResizeRequest { + resizeMap.Lock() + defer resizeMap.Unlock() + + pvcrs := []*PVCWithResizeRequest{} + for _, pvcr := range resizeMap.pvcrs { + pvcrs = append(pvcrs, pvcr) + } + // Empty out pvcrs map, we will add back failed resize requests later + resizeMap.pvcrs = map[types.UniquePVCName]*PVCWithResizeRequest{} + return pvcrs +} + +// DeletePVC removes given pvc object from list of pvcs that needs resizing. +// deleting a pvc in this map doesn't affect operations that are already inflight. +func (resizeMap *volumeResizeMap) DeletePVC(pvc *v1.PersistentVolumeClaim) { + resizeMap.Lock() + defer resizeMap.Unlock() + pvcUniqueName := types.UniquePVCName(pvc.UID) + glog.V(5).Infof("Removing PVC %v from resize map", pvcUniqueName) + delete(resizeMap.pvcrs, pvcUniqueName) +} + +// MarkAsResized marks a pvc as fully resized +func (resizeMap *volumeResizeMap) MarkAsResized(pvcr *PVCWithResizeRequest, newSize resource.Quantity) error { + resizeMap.Lock() + defer resizeMap.Unlock() + + emptyCondition := []v1.PersistentVolumeClaimCondition{} + + err := resizeMap.updatePVCCapacityAndConditions(pvcr, newSize, emptyCondition) + if err != nil { + glog.V(4).Infof("Error updating PV spec capacity for volume %q with : %v", pvcr.QualifiedName(), err) + return err + } + return nil +} + +// UpdatePVSize updates just pv size after cloudprovider resizing is successful +func (resizeMap *volumeResizeMap) UpdatePVSize(pvcr *PVCWithResizeRequest, newSize resource.Quantity) error { + resizeMap.Lock() + defer resizeMap.Unlock() + + oldPv := pvcr.PersistentVolume + pvClone := oldPv.DeepCopy() + + oldData, err := json.Marshal(pvClone) + + if err != nil { + return fmt.Errorf("Unexpected error marshaling PV : %q with error %v", pvClone.Name, err) + } + + pvClone.Spec.Capacity[v1.ResourceStorage] = newSize + + newData, err := json.Marshal(pvClone) + + if err != nil { + return fmt.Errorf("Unexpected error marshaling PV : %q with error %v", pvClone.Name, err) + } + + patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, pvClone) + + if err != nil { + return fmt.Errorf("Error Creating two way merge patch for PV : %q with error %v", pvClone.Name, err) + } + + _, updateErr := resizeMap.kubeClient.CoreV1().PersistentVolumes().Patch(pvClone.Name, commontypes.StrategicMergePatchType, patchBytes) + + if updateErr != nil { + glog.V(4).Infof("Error updating pv %q with error : %v", pvClone.Name, updateErr) + return updateErr + } + return nil +} + +func (resizeMap *volumeResizeMap) updatePVCCapacityAndConditions(pvcr *PVCWithResizeRequest, newSize resource.Quantity, pvcConditions []v1.PersistentVolumeClaimCondition) error { + + claimClone := pvcr.PVC.DeepCopy() + + claimClone.Status.Capacity[v1.ResourceStorage] = newSize + claimClone.Status.Conditions = pvcConditions + + _, updateErr := resizeMap.kubeClient.CoreV1().PersistentVolumeClaims(claimClone.Namespace).UpdateStatus(claimClone) + if updateErr != nil { + glog.V(4).Infof("updating PersistentVolumeClaim[%s] status: failed: %v", pvcr.QualifiedName(), updateErr) + return updateErr + } + return nil +} diff --git a/pkg/controller/volume/expand/cache/volume_resize_map_test.go b/pkg/controller/volume/expand/cache/volume_resize_map_test.go new file mode 100644 index 00000000000..8a52df1544c --- /dev/null +++ b/pkg/controller/volume/expand/cache/volume_resize_map_test.go @@ -0,0 +1,88 @@ +/* +Copyright 2017 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 cache + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/fake" + "k8s.io/kubernetes/pkg/volume/util/types" +) + +func Test_AddValidPvcUpdate(t *testing.T) { + resizeMap := createTestVolumeResizeMap() + claim1 := testVolumeClaim("foo", "ns", v1.PersistentVolumeClaimSpec{ + AccessModes: []v1.PersistentVolumeAccessMode{ + v1.ReadWriteOnce, + v1.ReadOnlyMany, + }, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceStorage): resource.MustParse("10G"), + }, + }, + VolumeName: "foo", + }) + + claimClone := claim1.DeepCopy() + claimClone.Spec.Resources.Requests[v1.ResourceStorage] = resource.MustParse("12G") + pv := getPersistentVolume("foo", resource.MustParse("10G"), claim1) + resizeMap.AddPVCUpdate(claimClone, pv) + pvcr := resizeMap.GetPVCsWithResizeRequest() + if len(pvcr) != 1 { + t.Fatalf("Expected 1 pvc resize request got 0") + } + assert.Equal(t, resource.MustParse("12G"), pvcr[0].ExpectedSize) + assert.Equal(t, 0, len(resizeMap.pvcrs)) +} + +func createTestVolumeResizeMap() *volumeResizeMap { + fakeClient := &fake.Clientset{} + resizeMap := &volumeResizeMap{} + resizeMap.pvcrs = make(map[types.UniquePVCName]*PVCWithResizeRequest) + resizeMap.kubeClient = fakeClient + return resizeMap +} + +func testVolumeClaim(name string, namespace string, spec v1.PersistentVolumeClaimSpec) *v1.PersistentVolumeClaim { + return &v1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace}, + Spec: spec, + Status: v1.PersistentVolumeClaimStatus{ + Phase: v1.ClaimBound, + }, + } +} + +func getPersistentVolume(volumeName string, capacity resource.Quantity, pvc *v1.PersistentVolumeClaim) *v1.PersistentVolume { + return &v1.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{Name: volumeName}, + Spec: v1.PersistentVolumeSpec{ + Capacity: v1.ResourceList{ + v1.ResourceName(v1.ResourceStorage): capacity, + }, + ClaimRef: &v1.ObjectReference{ + Namespace: pvc.Namespace, + Name: pvc.Name, + }, + }, + } +} diff --git a/pkg/controller/volume/expand/expand_controller.go b/pkg/controller/volume/expand/expand_controller.go new file mode 100644 index 00000000000..1c71528ef91 --- /dev/null +++ b/pkg/controller/volume/expand/expand_controller.go @@ -0,0 +1,268 @@ +/* +Copyright 2017 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 expand implements interfaces that attempt to resize a pvc +// by adding pvc to a volume resize map from which PVCs are picked and +// resized +package expand + +import ( + "fmt" + "net" + "time" + + "github.com/golang/glog" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/runtime" + coreinformers "k8s.io/client-go/informers/core/v1" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/scheme" + v1core "k8s.io/client-go/kubernetes/typed/core/v1" + corelisters "k8s.io/client-go/listers/core/v1" + kcache "k8s.io/client-go/tools/cache" + "k8s.io/client-go/tools/record" + "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" + "k8s.io/kubernetes/pkg/controller/volume/expand/cache" + "k8s.io/kubernetes/pkg/util/io" + "k8s.io/kubernetes/pkg/util/mount" + "k8s.io/kubernetes/pkg/volume" + "k8s.io/kubernetes/pkg/volume/util/operationexecutor" +) + +const ( + // How often resizing loop runs + syncLoopPeriod time.Duration = 30 * time.Second + // How often pvc populator runs + populatorLoopPeriod time.Duration = 2 * time.Minute +) + +// ExpandController expands the pvs +type ExpandController interface { + Run(stopCh <-chan struct{}) +} + +type expandController struct { + // kubeClient is the kube API client used by volumehost to communicate with + // the API server. + kubeClient clientset.Interface + + // pvcLister is the shared PVC lister used to fetch and store PVC + // objects from the API server. It is shared with other controllers and + // therefore the PVC objects in its store should be treated as immutable. + pvcLister corelisters.PersistentVolumeClaimLister + pvcsSynced kcache.InformerSynced + + pvLister corelisters.PersistentVolumeLister + pvSynced kcache.InformerSynced + + // cloud provider used by volume host + cloud cloudprovider.Interface + + // volumePluginMgr used to initialize and fetch volume plugins + volumePluginMgr volume.VolumePluginMgr + + // recorder is used to record events in the API server + recorder record.EventRecorder + + // Volume resize map of volumes that needs resizing + resizeMap cache.VolumeResizeMap + + // Worker goroutine to process resize requests from resizeMap + syncResize SyncVolumeResize + + // Operation executor + opExecutor operationexecutor.OperationExecutor + + // populator for periodically polling all PVCs + pvcPopulator PVCPopulator +} + +func NewExpandController( + kubeClient clientset.Interface, + pvcInformer coreinformers.PersistentVolumeClaimInformer, + pvInformer coreinformers.PersistentVolumeInformer, + cloud cloudprovider.Interface, + plugins []volume.VolumePlugin) (ExpandController, error) { + + expc := &expandController{ + kubeClient: kubeClient, + cloud: cloud, + pvcLister: pvcInformer.Lister(), + pvcsSynced: pvcInformer.Informer().HasSynced, + pvLister: pvInformer.Lister(), + pvSynced: pvInformer.Informer().HasSynced, + } + + if err := expc.volumePluginMgr.InitPlugins(plugins, nil, expc); err != nil { + return nil, fmt.Errorf("Could not initialize volume plugins for Expand Controller : %+v", err) + } + + eventBroadcaster := record.NewBroadcaster() + eventBroadcaster.StartLogging(glog.Infof) + eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(kubeClient.CoreV1().RESTClient()).Events("")}) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "volume_expand"}) + + expc.opExecutor = operationexecutor.NewOperationExecutor(operationexecutor.NewOperationGenerator( + kubeClient, + &expc.volumePluginMgr, + recorder, + false)) + + expc.resizeMap = cache.NewVolumeResizeMap(expc.kubeClient) + + pvcInformer.Informer().AddEventHandler(kcache.ResourceEventHandlerFuncs{ + UpdateFunc: expc.pvcUpdate, + DeleteFunc: expc.deletePVC, + }) + + expc.syncResize = NewSyncVolumeResize(syncLoopPeriod, expc.opExecutor, expc.resizeMap, kubeClient) + expc.pvcPopulator = NewPVCPopulator( + populatorLoopPeriod, + expc.resizeMap, + expc.pvcLister, + expc.pvLister, + kubeClient) + return expc, nil +} + +func (expc *expandController) Run(stopCh <-chan struct{}) { + defer runtime.HandleCrash() + glog.Infof("Starting expand controller") + defer glog.Infof("Shutting down expand controller") + + if !controller.WaitForCacheSync("expand", stopCh, expc.pvcsSynced, expc.pvSynced) { + return + } + + // Run volume sync work goroutine + go expc.syncResize.Run(stopCh) + // Start the pvc populator loop + go expc.pvcPopulator.Run(stopCh) + <-stopCh +} + +func (expc *expandController) deletePVC(obj interface{}) { + pvc, ok := obj.(*v1.PersistentVolumeClaim) + + if pvc == nil || !ok { + return + } + + expc.resizeMap.DeletePVC(pvc) +} + +func (expc *expandController) pvcUpdate(oldObj, newObj interface{}) { + oldPvc, ok := oldObj.(*v1.PersistentVolumeClaim) + + if oldPvc == nil || !ok { + return + } + + newPVC, ok := newObj.(*v1.PersistentVolumeClaim) + + if newPVC == nil || !ok { + return + } + pv, err := getPersistentVolume(newPVC, expc.pvLister) + if err != nil { + glog.V(5).Infof("Error getting Persistent Volume for pvc %q : %v", newPVC.UID, err) + return + } + expc.resizeMap.AddPVCUpdate(newPVC, pv) +} + +func getPersistentVolume(pvc *v1.PersistentVolumeClaim, pvLister corelisters.PersistentVolumeLister) (*v1.PersistentVolume, error) { + volumeName := pvc.Spec.VolumeName + pv, err := pvLister.Get(volumeName) + + if err != nil { + return nil, fmt.Errorf("failed to find PV %q in PV informer cache with error : %v", volumeName, err) + } + + return pv.DeepCopy(), nil +} + +// Implementing VolumeHost interface +func (expc *expandController) GetPluginDir(pluginName string) string { + return "" +} + +func (expc *expandController) GetPodVolumeDir(podUID types.UID, pluginName string, volumeName string) string { + return "" +} + +func (expc *expandController) GetPodPluginDir(podUID types.UID, pluginName string) string { + return "" +} + +func (expc *expandController) GetKubeClient() clientset.Interface { + return expc.kubeClient +} + +func (expc *expandController) NewWrapperMounter(volName string, spec volume.Spec, pod *v1.Pod, opts volume.VolumeOptions) (volume.Mounter, error) { + return nil, fmt.Errorf("NewWrapperMounter not supported by expand controller's VolumeHost implementation") +} + +func (expc *expandController) NewWrapperUnmounter(volName string, spec volume.Spec, podUID types.UID) (volume.Unmounter, error) { + return nil, fmt.Errorf("NewWrapperUnmounter not supported by expand controller's VolumeHost implementation") +} + +func (expc *expandController) GetCloudProvider() cloudprovider.Interface { + return expc.cloud +} + +func (expc *expandController) GetMounter(pluginName string) mount.Interface { + return nil +} + +func (expc *expandController) GetExec(pluginName string) mount.Exec { + return mount.NewOsExec() +} + +func (expc *expandController) GetWriter() io.Writer { + return nil +} + +func (expc *expandController) GetHostName() string { + return "" +} + +func (expc *expandController) GetHostIP() (net.IP, error) { + return nil, fmt.Errorf("GetHostIP not supported by expand controller's VolumeHost implementation") +} + +func (expc *expandController) GetNodeAllocatable() (v1.ResourceList, error) { + return v1.ResourceList{}, nil +} + +func (expc *expandController) GetSecretFunc() func(namespace, name string) (*v1.Secret, error) { + return func(_, _ string) (*v1.Secret, error) { + return nil, fmt.Errorf("GetSecret unsupported in expandController") + } +} + +func (expc *expandController) GetConfigMapFunc() func(namespace, name string) (*v1.ConfigMap, error) { + return func(_, _ string) (*v1.ConfigMap, error) { + return nil, fmt.Errorf("GetConfigMap unsupported in expandController") + } +} + +func (expc *expandController) GetNodeLabels() (map[string]string, error) { + return nil, fmt.Errorf("GetNodeLabels unsupported in expandController") +} diff --git a/pkg/controller/volume/expand/pvc_populator.go b/pkg/controller/volume/expand/pvc_populator.go new file mode 100644 index 00000000000..220e1092f7d --- /dev/null +++ b/pkg/controller/volume/expand/pvc_populator.go @@ -0,0 +1,85 @@ +/* +Copyright 2017 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 reconciler implements interfaces that attempt to reconcile the +// desired state of the with the actual state of the world by triggering +// actions. + +package expand + +import ( + "time" + + "github.com/golang/glog" + + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/wait" + clientset "k8s.io/client-go/kubernetes" + corelisters "k8s.io/client-go/listers/core/v1" + "k8s.io/kubernetes/pkg/controller/volume/expand/cache" +) + +// PVCPopulator iterates through PVCs and checks if for bound PVCs +// their size doesn't match with Persistent Volume size +type PVCPopulator interface { + Run(stopCh <-chan struct{}) +} + +type pvcPopulator struct { + loopPeriod time.Duration + resizeMap cache.VolumeResizeMap + pvcLister corelisters.PersistentVolumeClaimLister + pvLister corelisters.PersistentVolumeLister + kubeClient clientset.Interface +} + +func NewPVCPopulator( + loopPeriod time.Duration, + resizeMap cache.VolumeResizeMap, + pvcLister corelisters.PersistentVolumeClaimLister, + pvLister corelisters.PersistentVolumeLister, + kubeClient clientset.Interface) PVCPopulator { + populator := &pvcPopulator{ + loopPeriod: loopPeriod, + pvcLister: pvcLister, + pvLister: pvLister, + resizeMap: resizeMap, + kubeClient: kubeClient, + } + return populator +} + +func (populator *pvcPopulator) Run(stopCh <-chan struct{}) { + wait.Until(populator.Sync, populator.loopPeriod, stopCh) +} + +func (populator *pvcPopulator) Sync() { + pvcs, err := populator.pvcLister.List(labels.Everything()) + if err != nil { + glog.Errorf("Listing PVCs failed in populator : %v", err) + return + } + + for _, pvc := range pvcs { + pv, err := getPersistentVolume(pvc, populator.pvLister) + + if err != nil { + glog.V(5).Infof("Error getting persistent volume for pvc %q : %v", pvc.UID, err) + continue + } + populator.resizeMap.AddPVCUpdate(pvc, pv) + } +} diff --git a/pkg/controller/volume/expand/sync_volume_resize.go b/pkg/controller/volume/expand/sync_volume_resize.go new file mode 100644 index 00000000000..06565775e63 --- /dev/null +++ b/pkg/controller/volume/expand/sync_volume_resize.go @@ -0,0 +1,101 @@ +/* +Copyright 2017 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 expand + +import ( + "time" + + "github.com/golang/glog" + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/pkg/controller/volume/expand/cache" + "k8s.io/kubernetes/pkg/controller/volume/expand/util" + "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff" + "k8s.io/kubernetes/pkg/volume/util/operationexecutor" +) + +type SyncVolumeResize interface { + Run(stopCh <-chan struct{}) +} + +type syncResize struct { + loopPeriod time.Duration + resizeMap cache.VolumeResizeMap + opsExecutor operationexecutor.OperationExecutor + kubeClient clientset.Interface +} + +// NewSyncVolumeResize returns actual volume resize handler +func NewSyncVolumeResize( + loopPeriod time.Duration, + opsExecutor operationexecutor.OperationExecutor, + resizeMap cache.VolumeResizeMap, + kubeClient clientset.Interface) SyncVolumeResize { + rc := &syncResize{ + loopPeriod: loopPeriod, + opsExecutor: opsExecutor, + resizeMap: resizeMap, + kubeClient: kubeClient, + } + return rc +} + +func (rc *syncResize) Run(stopCh <-chan struct{}) { + wait.Until(rc.Sync, rc.loopPeriod, stopCh) +} + +func (rc *syncResize) Sync() { + // Resize PVCs that require resize + for _, pvcWithResizeRequest := range rc.resizeMap.GetPVCsWithResizeRequest() { + uniqueVolumeKey := v1.UniqueVolumeName(pvcWithResizeRequest.UniquePVCKey()) + updatedClaim, err := markPVCResizeInProgress(pvcWithResizeRequest, rc.kubeClient) + if err != nil { + glog.V(5).Infof("Error setting PVC %s in progress with error : %v", pvcWithResizeRequest.QualifiedName(), err) + continue + } + if updatedClaim != nil { + pvcWithResizeRequest.PVC = updatedClaim + } + + if rc.opsExecutor.IsOperationPending(uniqueVolumeKey, "") { + glog.V(10).Infof("Operation for PVC %v is already pending", pvcWithResizeRequest.QualifiedName()) + continue + } + glog.V(5).Infof("Starting opsExecutor.ExpandVolume for volume %s", pvcWithResizeRequest.QualifiedName()) + growFuncError := rc.opsExecutor.ExpandVolume(pvcWithResizeRequest, rc.resizeMap) + if growFuncError != nil && !exponentialbackoff.IsExponentialBackoff(growFuncError) { + glog.Errorf("Error growing pvc %s with %v", pvcWithResizeRequest.QualifiedName(), growFuncError) + } + if growFuncError == nil { + glog.V(5).Infof("Started opsExecutor.ExpandVolume for volume %s", pvcWithResizeRequest.QualifiedName()) + } + } +} + +func markPVCResizeInProgress(pvcWithResizeRequest *cache.PVCWithResizeRequest, kubeClient clientset.Interface) (*v1.PersistentVolumeClaim, error) { + // Mark PVC as Resize Started + progressCondition := v1.PersistentVolumeClaimCondition{ + Type: v1.PersistentVolumeClaimResizing, + Status: v1.ConditionTrue, + LastTransitionTime: metav1.Now(), + } + conditions := []v1.PersistentVolumeClaimCondition{progressCondition} + + return util.UpdatePVCCondition(pvcWithResizeRequest.PVC, conditions, kubeClient) +} diff --git a/pkg/controller/volume/expand/util/BUILD b/pkg/controller/volume/expand/util/BUILD new file mode 100644 index 00000000000..ce155342a61 --- /dev/null +++ b/pkg/controller/volume/expand/util/BUILD @@ -0,0 +1,26 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["util.go"], + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/pkg/controller/volume/expand/util/util.go b/pkg/controller/volume/expand/util/util.go new file mode 100644 index 00000000000..bc6795c4fa7 --- /dev/null +++ b/pkg/controller/volume/expand/util/util.go @@ -0,0 +1,46 @@ +/* +Copyright 2017 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 util + +import ( + "fmt" + + "github.com/golang/glog" + + "k8s.io/api/core/v1" + clientset "k8s.io/client-go/kubernetes" +) + +// ClaimToClaimKey return namespace/name string for pvc +func ClaimToClaimKey(claim *v1.PersistentVolumeClaim) string { + return fmt.Sprintf("%s/%s", claim.Namespace, claim.Name) +} + +// UpdatePVCCondition updates pvc with given condition status +func UpdatePVCCondition(pvc *v1.PersistentVolumeClaim, + pvcConditions []v1.PersistentVolumeClaimCondition, + kubeClient clientset.Interface) (*v1.PersistentVolumeClaim, error) { + + claimClone := pvc.DeepCopy() + claimClone.Status.Conditions = pvcConditions + updatedClaim, updateErr := kubeClient.CoreV1().PersistentVolumeClaims(claimClone.Namespace).UpdateStatus(claimClone) + if updateErr != nil { + glog.V(4).Infof("updating PersistentVolumeClaim[%s] status: failed: %v", ClaimToClaimKey(pvc), updateErr) + return nil, updateErr + } + return updatedClaim, nil +} diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 60549a65e5a..29b5cc2b46b 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -114,6 +114,11 @@ const ( // New local storage types to support local storage capacity isolation LocalStorageCapacityIsolation utilfeature.Feature = "LocalStorageCapacityIsolation" + // owner: @gnufied + // alpha: v1.8 + // Ability to Expand persistent volumes + ExpandPersistentVolumes utilfeature.Feature = "ExpandPersistentVolumes" + // owner: @verb // alpha: v1.8 // @@ -179,6 +184,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS EnableEquivalenceClassCache: {Default: false, PreRelease: utilfeature.Alpha}, TaintNodesByCondition: {Default: false, PreRelease: utilfeature.Alpha}, MountPropagation: {Default: false, PreRelease: utilfeature.Alpha}, + ExpandPersistentVolumes: {Default: false, PreRelease: utilfeature.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: diff --git a/pkg/kubelet/events/event.go b/pkg/kubelet/events/event.go index b8cae2cfad9..a1bb2682ed0 100644 --- a/pkg/kubelet/events/event.go +++ b/pkg/kubelet/events/event.go @@ -45,6 +45,7 @@ const ( FailedAttachVolume = "FailedAttachVolume" FailedDetachVolume = "FailedDetachVolume" FailedMountVolume = "FailedMount" + VolumeResizeFailed = "VolumeResizeFailed" FailedUnMountVolume = "FailedUnMount" WarnAlreadyMountedVolume = "AlreadyMountedVolume" SuccessfulDetachVolume = "SuccessfulDetachVolume" diff --git a/pkg/quota/evaluator/core/BUILD b/pkg/quota/evaluator/core/BUILD index b413ddac201..205408b97b3 100644 --- a/pkg/quota/evaluator/core/BUILD +++ b/pkg/quota/evaluator/core/BUILD @@ -25,6 +25,7 @@ go_library( "//pkg/api/helper/qos:go_default_library", "//pkg/api/v1:go_default_library", "//pkg/api/validation:go_default_library", + "//pkg/features:go_default_library", "//pkg/kubeapiserver/admission/util:go_default_library", "//pkg/quota:go_default_library", "//pkg/quota/generic:go_default_library", @@ -36,6 +37,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", ], diff --git a/pkg/quota/evaluator/core/persistent_volume_claims.go b/pkg/quota/evaluator/core/persistent_volume_claims.go index ed2d8bef0d0..c7a3a61ea44 100644 --- a/pkg/quota/evaluator/core/persistent_volume_claims.go +++ b/pkg/quota/evaluator/core/persistent_volume_claims.go @@ -27,11 +27,13 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apiserver/pkg/admission" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/informers" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/helper" k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubeapiserver/admission/util" "k8s.io/kubernetes/pkg/quota" "k8s.io/kubernetes/pkg/quota/generic" @@ -147,6 +149,10 @@ func (p *pvcEvaluator) Handles(a admission.Attributes) bool { if op == admission.Create { return true } + if op == admission.Update && utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { + return true + } + updateUninitialized, err := util.IsUpdatingUninitializedObject(a) if err != nil { // fail closed, will try to give an evaluation. diff --git a/pkg/registry/storage/storageclass/BUILD b/pkg/registry/storage/storageclass/BUILD index 1e906231a19..9ad952bafc9 100644 --- a/pkg/registry/storage/storageclass/BUILD +++ b/pkg/registry/storage/storageclass/BUILD @@ -16,10 +16,12 @@ go_library( "//pkg/api:go_default_library", "//pkg/apis/storage:go_default_library", "//pkg/apis/storage/validation:go_default_library", + "//pkg/features:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/pkg/registry/storage/storageclass/strategy.go b/pkg/registry/storage/storageclass/strategy.go index 216cc7ddc26..0da81213437 100644 --- a/pkg/registry/storage/storageclass/strategy.go +++ b/pkg/registry/storage/storageclass/strategy.go @@ -21,9 +21,11 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/storage/names" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage/validation" + "k8s.io/kubernetes/pkg/features" ) // storageClassStrategy implements behavior for StorageClass objects @@ -42,7 +44,11 @@ func (storageClassStrategy) NamespaceScoped() bool { // ResetBeforeCreate clears the Status field which is not allowed to be set by end users on creation. func (storageClassStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) { - _ = obj.(*storage.StorageClass) + class := obj.(*storage.StorageClass) + + if !utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { + class.AllowVolumeExpansion = nil + } } func (storageClassStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList { @@ -60,8 +66,13 @@ func (storageClassStrategy) AllowCreateOnUpdate() bool { // PrepareForUpdate sets the Status fields which is not allowed to be set by an end user updating a PV func (storageClassStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) { - _ = obj.(*storage.StorageClass) - _ = old.(*storage.StorageClass) + newClass := obj.(*storage.StorageClass) + oldClass := old.(*storage.StorageClass) + + if !utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { + newClass.AllowVolumeExpansion = nil + oldClass.AllowVolumeExpansion = nil + } } func (storageClassStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { diff --git a/pkg/volume/glusterfs/glusterfs.go b/pkg/volume/glusterfs/glusterfs.go index 2145fa63333..a3225e16a44 100644 --- a/pkg/volume/glusterfs/glusterfs.go +++ b/pkg/volume/glusterfs/glusterfs.go @@ -127,6 +127,10 @@ func (plugin *glusterfsPlugin) SupportsBulkVolumeVerification() bool { return false } +func (plugin *glusterfsPlugin) RequiresFSResize() bool { + return false +} + func (plugin *glusterfsPlugin) GetAccessModes() []v1.PersistentVolumeAccessMode { return []v1.PersistentVolumeAccessMode{ v1.ReadWriteOnce, @@ -1046,3 +1050,49 @@ func parseClassParameters(params map[string]string, kubeClient clientset.Interfa } return &cfg, nil } + +func (plugin *glusterfsPlugin) ExpandVolumeDevice(spec *volume.Spec, newSize resource.Quantity, oldSize resource.Quantity) (resource.Quantity, error) { + pvSpec := spec.PersistentVolume.Spec + glog.V(2).Infof("Request to expand volume: %s ", pvSpec.Glusterfs.Path) + volumeName := pvSpec.Glusterfs.Path + + // Fetch the volume for expansion. + volumeID := dstrings.TrimPrefix(volumeName, volPrefix) + + //Get details of SC. + class, err := volutil.GetClassForVolume(plugin.host.GetKubeClient(), spec.PersistentVolume) + if err != nil { + return oldSize, err + } + cfg, err := parseClassParameters(class.Parameters, plugin.host.GetKubeClient()) + if err != nil { + return oldSize, err + } + + glog.V(4).Infof("Expanding volume %q with configuration %+v", volumeID, cfg) + + //Create REST server connection + cli := gcli.NewClient(cfg.url, cfg.user, cfg.secretValue) + if cli == nil { + glog.Errorf("failed to create glusterfs rest client") + return oldSize, fmt.Errorf("failed to create glusterfs rest client, REST server authentication failed") + } + + // Find out delta size + expansionSize := (newSize.Value() - oldSize.Value()) + expansionSizeGB := int(volume.RoundUpSize(expansionSize, 1024*1024*1024)) + + // Make volume expansion request + volumeExpandReq := &gapi.VolumeExpandRequest{Size: expansionSizeGB} + + // Expand the volume + volumeInfoRes, err := cli.VolumeExpand(volumeID, volumeExpandReq) + if err != nil { + glog.Errorf("error when expanding the volume :%v", err) + return oldSize, err + } + + glog.V(2).Infof("volume %s expanded to new size %d successfully", volumeName, volumeInfoRes.Size) + newVolumeSize := resource.MustParse(fmt.Sprintf("%dG", volumeInfoRes.Size)) + return newVolumeSize, nil +} diff --git a/pkg/volume/plugins.go b/pkg/volume/plugins.go index b97f54af33b..eb2f8149ac4 100644 --- a/pkg/volume/plugins.go +++ b/pkg/volume/plugins.go @@ -24,6 +24,7 @@ import ( "github.com/golang/glog" "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" @@ -201,6 +202,14 @@ type AttachableVolumePlugin interface { GetDeviceMountRefs(deviceMountPath string) ([]string, error) } +// ExpandableVolumePlugin is an extended interface of VolumePlugin and is used for volumes that can be +// expanded +type ExpandableVolumePlugin interface { + VolumePlugin + ExpandVolumeDevice(spec *Spec, newSize resource.Quantity, oldSize resource.Quantity) (resource.Quantity, error) + RequiresFSResize() bool +} + // VolumeHost is an interface that plugins can use to access the kubelet. type VolumeHost interface { // GetPluginDir returns the absolute path to a directory under which @@ -642,6 +651,32 @@ func (pm *VolumePluginMgr) FindAttachablePluginByName(name string) (AttachableVo return nil, nil } +// FindExpandablePluginBySpec fetches a persistent volume plugin by spec. +func (pm *VolumePluginMgr) FindExpandablePluginBySpec(spec *Spec) (ExpandableVolumePlugin, error) { + volumePlugin, err := pm.FindPluginBySpec(spec) + if err != nil { + return nil, err + } + + if expandableVolumePlugin, ok := volumePlugin.(ExpandableVolumePlugin); ok { + return expandableVolumePlugin, nil + } + return nil, nil +} + +// FindExpandablePluginBySpec fetches a persistent volume plugin by name. +func (pm *VolumePluginMgr) FindExpandablePluginByName(name string) (ExpandableVolumePlugin, error) { + volumePlugin, err := pm.FindPluginByName(name) + if err != nil { + return nil, err + } + + if expandableVolumePlugin, ok := volumePlugin.(ExpandableVolumePlugin); ok { + return expandableVolumePlugin, nil + } + return nil, nil +} + // NewPersistentVolumeRecyclerPodTemplate creates a template for a recycler // pod. By default, a recycler pod simply runs "rm -rf" on a volume and tests // for emptiness. Most attributes of the template will be correct for most diff --git a/pkg/volume/util/operationexecutor/BUILD b/pkg/volume/util/operationexecutor/BUILD index dae1131fc3a..647fd569d33 100644 --- a/pkg/volume/util/operationexecutor/BUILD +++ b/pkg/volume/util/operationexecutor/BUILD @@ -13,6 +13,7 @@ go_library( "operation_generator.go", ], deps = [ + "//pkg/controller/volume/expand/cache:go_default_library", "//pkg/features:go_default_library", "//pkg/kubelet/events:go_default_library", "//pkg/util/mount:go_default_library", @@ -37,6 +38,7 @@ go_test( srcs = ["operation_executor_test.go"], library = ":go_default_library", deps = [ + "//pkg/controller/volume/expand/cache:go_default_library", "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util/types:go_default_library", diff --git a/pkg/volume/util/operationexecutor/operation_executor.go b/pkg/volume/util/operationexecutor/operation_executor.go index 21e8eecbdc7..8b11358436a 100644 --- a/pkg/volume/util/operationexecutor/operation_executor.go +++ b/pkg/volume/util/operationexecutor/operation_executor.go @@ -29,6 +29,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + expandcache "k8s.io/kubernetes/pkg/controller/volume/expand/cache" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" @@ -119,6 +120,8 @@ type OperationExecutor interface { // IsOperationPending returns true if an operation for the given volumeName and podName is pending, // otherwise it returns false IsOperationPending(volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) bool + // Expand Volume will grow size available to PVC + ExpandVolume(*expandcache.PVCWithResizeRequest, expandcache.VolumeResizeMap) error } // NewOperationExecutor returns a new instance of OperationExecutor. @@ -719,6 +722,17 @@ func (oe *operationExecutor) UnmountDevice( deviceToDetach.VolumeName, "" /* podName */, unmountDeviceFunc, opCompleteFunc) } +func (oe *operationExecutor) ExpandVolume(pvcWithResizeRequest *expandcache.PVCWithResizeRequest, resizeMap expandcache.VolumeResizeMap) error { + expandFunc, pluginName, err := oe.operationGenerator.GenerateExpandVolumeFunc(pvcWithResizeRequest, resizeMap) + + if err != nil { + return err + } + uniqueVolumeKey := v1.UniqueVolumeName(pvcWithResizeRequest.UniquePVCKey()) + opCompleteFunc := util.OperationCompleteHook(pluginName, "expand_volume") + return oe.pendingOperations.Run(uniqueVolumeKey, "", expandFunc, opCompleteFunc) +} + func (oe *operationExecutor) VerifyControllerAttachedVolume( volumeToMount VolumeToMount, nodeName types.NodeName, diff --git a/pkg/volume/util/operationexecutor/operation_executor_test.go b/pkg/volume/util/operationexecutor/operation_executor_test.go index 94118674ecc..35b7064c0d1 100644 --- a/pkg/volume/util/operationexecutor/operation_executor_test.go +++ b/pkg/volume/util/operationexecutor/operation_executor_test.go @@ -25,6 +25,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/uuid" + expandcache "k8s.io/kubernetes/pkg/controller/volume/expand/cache" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumetypes "k8s.io/kubernetes/pkg/volume/util/types" @@ -282,6 +283,14 @@ func (fopg *fakeOperationGenerator) GenerateVerifyControllerAttachedVolumeFunc(v }, "", nil } +func (fopg *fakeOperationGenerator) GenerateExpandVolumeFunc(pvcWithResizeRequest *expandcache.PVCWithResizeRequest, + resizeMap expandcache.VolumeResizeMap) (func() error, string, error) { + return func() error { + startOperationAndBlock(fopg.ch, fopg.quit) + return nil + }, "", nil +} + func (fopg *fakeOperationGenerator) GenerateBulkVolumeVerifyFunc( pluginNodeVolumes map[types.NodeName][]*volume.Spec, pluginNane string, diff --git a/pkg/volume/util/operationexecutor/operation_generator.go b/pkg/volume/util/operationexecutor/operation_generator.go index 73445ac3a0f..93b05ae6dd1 100644 --- a/pkg/volume/util/operationexecutor/operation_generator.go +++ b/pkg/volume/util/operationexecutor/operation_generator.go @@ -28,6 +28,7 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" + expandcache "k8s.io/kubernetes/pkg/controller/volume/expand/cache" "k8s.io/kubernetes/pkg/features" kevents "k8s.io/kubernetes/pkg/kubelet/events" "k8s.io/kubernetes/pkg/util/mount" @@ -100,6 +101,8 @@ type OperationGenerator interface { map[types.NodeName][]*volume.Spec, string, map[*volume.Spec]v1.UniqueVolumeName, ActualStateOfWorldAttacherUpdater) (func() error, error) + + GenerateExpandVolumeFunc(*expandcache.PVCWithResizeRequest, expandcache.VolumeResizeMap) (func() error, string, error) } func (og *operationGenerator) GenerateVolumesAreAttachedFunc( @@ -726,6 +729,59 @@ func (og *operationGenerator) verifyVolumeIsSafeToDetach( return nil } +func (og *operationGenerator) GenerateExpandVolumeFunc( + pvcWithResizeRequest *expandcache.PVCWithResizeRequest, + resizeMap expandcache.VolumeResizeMap) (func() error, string, error) { + + volumeSpec := volume.NewSpecFromPersistentVolume(pvcWithResizeRequest.PersistentVolume, false) + + volumePlugin, err := og.volumePluginMgr.FindExpandablePluginBySpec(volumeSpec) + + if err != nil { + return nil, "", fmt.Errorf("Error finding plugin for expanding volume: %q with error %v", pvcWithResizeRequest.QualifiedName(), err) + } + + expandFunc := func() error { + newSize := pvcWithResizeRequest.ExpectedSize + pvSize := pvcWithResizeRequest.PersistentVolume.Spec.Capacity[v1.ResourceStorage] + if pvSize.Cmp(newSize) < 0 { + updatedSize, expandErr := volumePlugin.ExpandVolumeDevice( + volumeSpec, + pvcWithResizeRequest.ExpectedSize, + pvcWithResizeRequest.CurrentSize) + + if expandErr != nil { + glog.Errorf("Error expanding volume %q of plugin %s : %v", pvcWithResizeRequest.QualifiedName(), volumePlugin.GetPluginName(), expandErr) + og.recorder.Eventf(pvcWithResizeRequest.PVC, v1.EventTypeWarning, kevents.VolumeResizeFailed, expandErr.Error()) + return expandErr + } + newSize = updatedSize + updateErr := resizeMap.UpdatePVSize(pvcWithResizeRequest, newSize) + + if updateErr != nil { + glog.V(4).Infof("Error updating PV spec capacity for volume %q with : %v", pvcWithResizeRequest.QualifiedName(), updateErr) + og.recorder.Eventf(pvcWithResizeRequest.PVC, v1.EventTypeWarning, kevents.VolumeResizeFailed, updateErr.Error()) + return updateErr + } + } + + // No Cloudprovider resize needed, lets mark resizing as done + if !volumePlugin.RequiresFSResize() { + glog.V(4).Infof("Controller resizing done for PVC %s", pvcWithResizeRequest.QualifiedName()) + err := resizeMap.MarkAsResized(pvcWithResizeRequest, newSize) + + if err != nil { + glog.Errorf("Error marking pvc %s as resized : %v", pvcWithResizeRequest.QualifiedName(), err) + og.recorder.Eventf(pvcWithResizeRequest.PVC, v1.EventTypeWarning, kevents.VolumeResizeFailed, err.Error()) + return err + } + } + return nil + + } + return expandFunc, volumePlugin.GetPluginName(), nil +} + func checkMountOptionSupport(og *operationGenerator, volumeToMount VolumeToMount, plugin volume.VolumePlugin) error { mountOptions := volume.MountOptionFromSpec(volumeToMount.VolumeSpec) diff --git a/pkg/volume/util/types/types.go b/pkg/volume/util/types/types.go index 90bbdc4e21f..9375ad6750c 100644 --- a/pkg/volume/util/types/types.go +++ b/pkg/volume/util/types/types.go @@ -21,3 +21,6 @@ import "k8s.io/apimachinery/pkg/types" // UniquePodName defines the type to key pods off of type UniquePodName types.UID + +// UniquePVCName defines the type to key pvc off +type UniquePVCName types.UID diff --git a/plugin/BUILD b/plugin/BUILD index 0fa7c38696f..f6fece455fa 100644 --- a/plugin/BUILD +++ b/plugin/BUILD @@ -28,6 +28,7 @@ filegroup( "//plugin/pkg/admission/namespace/exists:all-srcs", "//plugin/pkg/admission/noderestriction:all-srcs", "//plugin/pkg/admission/persistentvolume/label:all-srcs", + "//plugin/pkg/admission/persistentvolume/resize:all-srcs", "//plugin/pkg/admission/podnodeselector:all-srcs", "//plugin/pkg/admission/podpreset:all-srcs", "//plugin/pkg/admission/podtolerationrestriction:all-srcs", diff --git a/plugin/pkg/admission/persistentvolume/resize/BUILD b/plugin/pkg/admission/persistentvolume/resize/BUILD new file mode 100644 index 00000000000..37289faba64 --- /dev/null +++ b/plugin/pkg/admission/persistentvolume/resize/BUILD @@ -0,0 +1,55 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["admission_test.go"], + library = ":go_default_library", + tags = ["automanaged"], + deps = [ + "//pkg/api:go_default_library", + "//pkg/apis/storage:go_default_library", + "//pkg/client/informers/informers_generated/internalversion:go_default_library", + "//pkg/controller:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = ["admission.go"], + tags = ["automanaged"], + deps = [ + "//pkg/api:go_default_library", + "//pkg/api/helper:go_default_library", + "//pkg/client/informers/informers_generated/internalversion:go_default_library", + "//pkg/client/listers/core/internalversion:go_default_library", + "//pkg/client/listers/storage/internalversion:go_default_library", + "//pkg/kubeapiserver/admission:go_default_library", + "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/plugin/pkg/admission/persistentvolume/resize/admission.go b/plugin/pkg/admission/persistentvolume/resize/admission.go new file mode 100644 index 00000000000..65909370560 --- /dev/null +++ b/plugin/pkg/admission/persistentvolume/resize/admission.go @@ -0,0 +1,146 @@ +/* +Copyright 2017 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 resize + +import ( + "fmt" + "io" + + "k8s.io/apiserver/pkg/admission" + "k8s.io/kubernetes/pkg/api" + apihelper "k8s.io/kubernetes/pkg/api/helper" + informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion" + pvlister "k8s.io/kubernetes/pkg/client/listers/core/internalversion" + storagelisters "k8s.io/kubernetes/pkg/client/listers/storage/internalversion" + kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission" +) + +const ( + // PluginName is the name of pvc resize admission plugin + PluginName = "PersistentVolumeClaimResize" +) + +// Register registers a plugin +func Register(plugins *admission.Plugins) { + plugins.Register(PluginName, func(config io.Reader) (admission.Interface, error) { + plugin := newPlugin() + return plugin, nil + }) +} + +var _ admission.Interface = &persistentVolumeClaimResize{} +var _ = kubeapiserveradmission.WantsInternalKubeInformerFactory(&persistentVolumeClaimResize{}) + +type persistentVolumeClaimResize struct { + *admission.Handler + + pvLister pvlister.PersistentVolumeLister + scLister storagelisters.StorageClassLister +} + +func newPlugin() *persistentVolumeClaimResize { + return &persistentVolumeClaimResize{ + Handler: admission.NewHandler(admission.Update), + } +} + +func (pvcr *persistentVolumeClaimResize) SetInternalKubeInformerFactory(f informers.SharedInformerFactory) { + pvcInformer := f.Core().InternalVersion().PersistentVolumes() + pvcr.pvLister = pvcInformer.Lister() + scInformer := f.Storage().InternalVersion().StorageClasses() + pvcr.scLister = scInformer.Lister() + pvcr.SetReadyFunc(func() bool { + return pvcInformer.Informer().HasSynced() && scInformer.Informer().HasSynced() + }) +} + +// Validate ensures lister is set. +func (pvcr *persistentVolumeClaimResize) Validate() error { + if pvcr.pvLister == nil { + return fmt.Errorf("missing persistent volume lister") + } + if pvcr.scLister == nil { + return fmt.Errorf("missing storageclass lister") + } + return nil +} + +func (pvcr *persistentVolumeClaimResize) Admit(a admission.Attributes) error { + if a.GetResource().GroupResource() != api.Resource("persistentvolumeclaims") { + return nil + } + + if len(a.GetSubresource()) != 0 { + return nil + } + + pvc, ok := a.GetObject().(*api.PersistentVolumeClaim) + // if we can't convert then we don't handle this object so just return + if !ok { + return nil + } + oldPvc, ok := a.GetOldObject().(*api.PersistentVolumeClaim) + if !ok { + return nil + } + + // Growing Persistent volumes is only allowed for PVCs for which their StorageClass + // explicitly allows it + if !pvcr.allowResize(pvc, oldPvc) { + return admission.NewForbidden(a, fmt.Errorf("only dynamically provisioned pvc can be resized and "+ + "the storageclass that provisions the pvc must support resize")) + } + + // volume plugin must support resize + pv, err := pvcr.pvLister.Get(pvc.Spec.VolumeName) + if err != nil { + return nil + } + + if !pvcr.checkVolumePlugin(pv) { + return admission.NewForbidden(a, fmt.Errorf("volume plugin does not support resize")) + } + + return nil +} + +// Growing Persistent volumes is only allowed for PVCs for which their StorageClass +// explicitly allows it. +func (pvcr *persistentVolumeClaimResize) allowResize(pvc, oldPvc *api.PersistentVolumeClaim) bool { + pvcStorageClass := apihelper.GetPersistentVolumeClaimClass(pvc) + oldPvcStorageClass := apihelper.GetPersistentVolumeClaimClass(oldPvc) + if pvcStorageClass == "" || oldPvcStorageClass == "" || pvcStorageClass != oldPvcStorageClass { + return false + } + sc, err := pvcr.scLister.Get(pvcStorageClass) + if err != nil { + return false + } + if sc.AllowVolumeExpansion != nil { + return *sc.AllowVolumeExpansion + } + return false +} + +// checkVolumePlugin checks whether the volume plugin supports resize +func (pvcr *persistentVolumeClaimResize) checkVolumePlugin(pv *api.PersistentVolume) bool { + if pv.Spec.Glusterfs != nil { + return true + } + return false + +} diff --git a/plugin/pkg/admission/persistentvolume/resize/admission_test.go b/plugin/pkg/admission/persistentvolume/resize/admission_test.go new file mode 100644 index 00000000000..66ca4142169 --- /dev/null +++ b/plugin/pkg/admission/persistentvolume/resize/admission_test.go @@ -0,0 +1,265 @@ +/* +Copyright 2017 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 resize + +import ( + "fmt" + "strings" + "testing" + + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/admission" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/apis/storage" + informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion" + "k8s.io/kubernetes/pkg/controller" +) + +func getResourceList(storage string) api.ResourceList { + res := api.ResourceList{} + if storage != "" { + res[api.ResourceStorage] = resource.MustParse(storage) + } + return res +} + +func TestPVCResizeAdmission(t *testing.T) { + goldClassName := "gold" + trueVal := true + falseVar := false + goldClass := &storage.StorageClass{ + TypeMeta: metav1.TypeMeta{ + Kind: "StorageClass", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: goldClassName, + }, + Provisioner: "kubernetes.io/glusterfs", + AllowVolumeExpansion: &trueVal, + } + silverClassName := "silver" + silverClass := &storage.StorageClass{ + TypeMeta: metav1.TypeMeta{ + Kind: "StorageClass", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: silverClassName, + }, + Provisioner: "kubernetes.io/glusterfs", + AllowVolumeExpansion: &falseVar, + } + expectNoError := func(err error) bool { + return err == nil + } + expectDynamicallyProvisionedError := func(err error) bool { + return strings.Contains(err.Error(), "only dynamically provisioned pvc can be resized and "+ + "the storageclass that provisions the pvc must support resize") + } + expectVolumePluginError := func(err error) bool { + return strings.Contains(err.Error(), "volume plugin does not support resize") + } + tests := []struct { + name string + resource schema.GroupVersionResource + subresource string + oldObj runtime.Object + newObj runtime.Object + + checkError func(error) bool + }{ + { + name: "pvc-resize, update, no error", + resource: api.SchemeGroupVersion.WithResource("persistentvolumeclaims"), + oldObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "volume1", + Resources: api.ResourceRequirements{ + Requests: getResourceList("1Gi"), + }, + StorageClassName: &goldClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("1Gi"), + }, + }, + newObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "volume1", + Resources: api.ResourceRequirements{ + Requests: getResourceList("2Gi"), + }, + StorageClassName: &goldClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("2Gi"), + }, + }, + checkError: expectNoError, + }, + { + name: "pvc-resize, update, volume plugin error", + resource: api.SchemeGroupVersion.WithResource("persistentvolumeclaims"), + oldObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "volume2", + Resources: api.ResourceRequirements{ + Requests: getResourceList("1Gi"), + }, + StorageClassName: &goldClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("1Gi"), + }, + }, + newObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "volume2", + Resources: api.ResourceRequirements{ + Requests: getResourceList("2Gi"), + }, + StorageClassName: &goldClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("2Gi"), + }, + }, + checkError: expectVolumePluginError, + }, + { + name: "pvc-resize, update, dynamically provisioned error", + resource: api.SchemeGroupVersion.WithResource("persistentvolumeclaims"), + oldObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "volume3", + Resources: api.ResourceRequirements{ + Requests: getResourceList("1Gi"), + }, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("1Gi"), + }, + }, + newObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "volume3", + Resources: api.ResourceRequirements{ + Requests: getResourceList("2Gi"), + }, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("2Gi"), + }, + }, + checkError: expectDynamicallyProvisionedError, + }, + { + name: "pvc-resize, update, dynamically provisioned error", + resource: api.SchemeGroupVersion.WithResource("persistentvolumeclaims"), + oldObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "volume4", + Resources: api.ResourceRequirements{ + Requests: getResourceList("1Gi"), + }, + StorageClassName: &silverClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("1Gi"), + }, + }, + newObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "volume4", + Resources: api.ResourceRequirements{ + Requests: getResourceList("2Gi"), + }, + StorageClassName: &silverClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("2Gi"), + }, + }, + checkError: expectDynamicallyProvisionedError, + }, + } + + ctrl := newPlugin() + informerFactory := informers.NewSharedInformerFactory(nil, controller.NoResyncPeriodFunc()) + ctrl.SetInternalKubeInformerFactory(informerFactory) + err := ctrl.Validate() + if err != nil { + t.Fatalf("neither pv lister nor storageclass lister can be nil") + } + + pv1 := &api.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{Name: "volume1"}, + Spec: api.PersistentVolumeSpec{ + PersistentVolumeSource: api.PersistentVolumeSource{ + Glusterfs: &api.GlusterfsVolumeSource{ + EndpointsName: "http://localhost:8080/", + Path: "/heketi", + ReadOnly: false, + }, + }, + StorageClassName: goldClassName, + }, + } + pv2 := &api.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{Name: "volume2"}, + Spec: api.PersistentVolumeSpec{ + PersistentVolumeSource: api.PersistentVolumeSource{ + HostPath: &api.HostPathVolumeSource{}, + }, + StorageClassName: goldClassName, + }, + } + + pvs := []*api.PersistentVolume{} + pvs = append(pvs, pv1, pv2) + + for _, pv := range pvs { + err := informerFactory.Core().InternalVersion().PersistentVolumes().Informer().GetStore().Add(pv) + if err != nil { + fmt.Println("add pv error: ", err) + } + } + + scs := []*storage.StorageClass{} + scs = append(scs, goldClass, silverClass) + for _, sc := range scs { + err := informerFactory.Storage().InternalVersion().StorageClasses().Informer().GetStore().Add(sc) + if err != nil { + fmt.Println("add storageclass error: ", err) + } + } + + for _, tc := range tests { + operation := admission.Update + attributes := admission.NewAttributesRecord(tc.newObj, tc.oldObj, schema.GroupVersionKind{}, metav1.NamespaceDefault, "foo", tc.resource, tc.subresource, operation, nil) + + err := ctrl.Admit(attributes) + fmt.Println(tc.name) + fmt.Println(err) + if !tc.checkError(err) { + t.Errorf("%v: unexpected err: %v", tc.name, err) + } + } + +} diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go index 6aa07e23d8b..178cf8ff453 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go @@ -22,7 +22,9 @@ import ( "github.com/golang/glog" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" rbac "k8s.io/kubernetes/pkg/apis/rbac" + "k8s.io/kubernetes/pkg/features" ) const saRolePrefix = "system:controller:" @@ -121,6 +123,23 @@ func buildControllerRoles() ([]rbac.ClusterRole, []rbac.ClusterRoleBinding) { eventsRule(), }, }) + + if utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { + addControllerRole(&controllerRoles, &controllerRoleBindings, rbac.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "expand-controller"}, + Rules: []rbac.PolicyRule{ + rbac.NewRule("get", "list", "watch", "update", "patch").Groups(legacyGroup).Resources("persistentvolumes").RuleOrDie(), + rbac.NewRule("update", "patch").Groups(legacyGroup).Resources("persistentvolumeclaims/status").RuleOrDie(), + rbac.NewRule("get", "list", "watch").Groups(legacyGroup).Resources("persistentvolumeclaims").RuleOrDie(), + // glusterfs + rbac.NewRule("get", "list", "watch").Groups(storageGroup).Resources("storageclasses").RuleOrDie(), + rbac.NewRule("get").Groups(legacyGroup).Resources("services", "endpoints").RuleOrDie(), + rbac.NewRule("get").Groups(legacyGroup).Resources("secrets").RuleOrDie(), + eventsRule(), + }, + }) + } + addControllerRole(&controllerRoles, &controllerRoleBindings, rbac.ClusterRole{ ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "generic-garbage-collector"}, Rules: []rbac.PolicyRule{ diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 2efac0eb90c..6db917375e4 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -122,6 +122,7 @@ limitations under the License. ObjectReference PersistentVolume PersistentVolumeClaim + PersistentVolumeClaimCondition PersistentVolumeClaimList PersistentVolumeClaimSpec PersistentVolumeClaimStatus @@ -635,354 +636,360 @@ func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolu func (*PersistentVolumeClaim) ProtoMessage() {} func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} } +func (m *PersistentVolumeClaimCondition) Reset() { *m = PersistentVolumeClaimCondition{} } +func (*PersistentVolumeClaimCondition) ProtoMessage() {} +func (*PersistentVolumeClaimCondition) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{97} +} + func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{97} + return fileDescriptorGenerated, []int{98} } func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{98} + return fileDescriptorGenerated, []int{99} } func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{99} + return fileDescriptorGenerated, []int{100} } func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{100} + return fileDescriptorGenerated, []int{101} } func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} -func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{101} } +func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{102} } func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{102} + return fileDescriptorGenerated, []int{103} } func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} -func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{103} } +func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{104} } func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{104} + return fileDescriptorGenerated, []int{105} } func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{105} + return fileDescriptorGenerated, []int{106} } func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} -func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } +func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} -func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } +func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} -func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } +func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} -func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } +func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} -func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } +func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} -func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } +func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} -func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } +func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} -func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } +func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} -func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } +func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} -func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } +func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} -func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } +func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} -func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } +func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} -func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } +func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} -func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } +func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} -func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } +func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} -func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } +func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} -func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } +func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} -func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } +func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} -func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } +func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} -func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } +func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} -func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } +func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{128} + return fileDescriptorGenerated, []int{129} } func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} -func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } +func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} -func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } +func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} -func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } +func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} -func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } +func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} -func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } +func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} } func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} -func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} } +func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} } func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{135} + return fileDescriptorGenerated, []int{136} } func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{136} + return fileDescriptorGenerated, []int{137} } func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{137} + return fileDescriptorGenerated, []int{138} } func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{138} + return fileDescriptorGenerated, []int{139} } func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} -func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } +func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} -func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} -func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} -func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} -func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} -func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} -func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} -func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} -func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } func (*SessionAffinityConfig) ProtoMessage() {} -func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } +func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{165} + return fileDescriptorGenerated, []int{166} } func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} -func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } +func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{175} + return fileDescriptorGenerated, []int{176} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{176} + return fileDescriptorGenerated, []int{177} } func init() { @@ -1083,6 +1090,7 @@ func init() { proto.RegisterType((*ObjectReference)(nil), "k8s.io.api.core.v1.ObjectReference") proto.RegisterType((*PersistentVolume)(nil), "k8s.io.api.core.v1.PersistentVolume") proto.RegisterType((*PersistentVolumeClaim)(nil), "k8s.io.api.core.v1.PersistentVolumeClaim") + proto.RegisterType((*PersistentVolumeClaimCondition)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimCondition") proto.RegisterType((*PersistentVolumeClaimList)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimList") proto.RegisterType((*PersistentVolumeClaimSpec)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimSpec") proto.RegisterType((*PersistentVolumeClaimStatus)(nil), "k8s.io.api.core.v1.PersistentVolumeClaimStatus") @@ -5538,6 +5546,56 @@ func (m *PersistentVolumeClaim) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *PersistentVolumeClaimCondition) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PersistentVolumeClaimCondition) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size())) + n94, err := m.LastProbeTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n94 + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) + n95, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n95 + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) + i += copy(dAtA[i:], m.Reason) + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) + i += copy(dAtA[i:], m.Message) + return i, nil +} + func (m *PersistentVolumeClaimList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5556,11 +5614,11 @@ func (m *PersistentVolumeClaimList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n94, err := m.ListMeta.MarshalTo(dAtA[i:]) + n96, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n94 + i += n96 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -5609,11 +5667,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Resources.Size())) - n95, err := m.Resources.MarshalTo(dAtA[i:]) + n97, err := m.Resources.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n95 + i += n97 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.VolumeName))) @@ -5622,11 +5680,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) - n96, err := m.Selector.MarshalTo(dAtA[i:]) + n98, err := m.Selector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n96 + i += n98 } if m.StorageClassName != nil { dAtA[i] = 0x2a @@ -5695,11 +5753,23 @@ func (m *PersistentVolumeClaimStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n97, err := (&v).MarshalTo(dAtA[i:]) + n99, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n97 + i += n99 + } + } + if len(m.Conditions) > 0 { + for _, msg := range m.Conditions { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } return i, nil @@ -5753,11 +5823,11 @@ func (m *PersistentVolumeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n98, err := m.ListMeta.MarshalTo(dAtA[i:]) + n100, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n98 + i += n100 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -5792,163 +5862,163 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n99, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n99 - } - if m.AWSElasticBlockStore != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n100, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n100 - } - if m.HostPath != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n101, err := m.HostPath.MarshalTo(dAtA[i:]) + n101, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n101 } - if m.Glusterfs != nil { - dAtA[i] = 0x22 + if m.AWSElasticBlockStore != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n102, err := m.Glusterfs.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) + n102, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n102 } - if m.NFS != nil { - dAtA[i] = 0x2a + if m.HostPath != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n103, err := m.NFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) + n103, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n103 } - if m.RBD != nil { - dAtA[i] = 0x32 + if m.Glusterfs != nil { + dAtA[i] = 0x22 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n104, err := m.RBD.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) + n104, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n104 } - if m.ISCSI != nil { - dAtA[i] = 0x3a + if m.NFS != nil { + dAtA[i] = 0x2a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n105, err := m.ISCSI.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) + n105, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n105 } - if m.Cinder != nil { - dAtA[i] = 0x42 + if m.RBD != nil { + dAtA[i] = 0x32 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n106, err := m.Cinder.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) + n106, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n106 } - if m.CephFS != nil { - dAtA[i] = 0x4a + if m.ISCSI != nil { + dAtA[i] = 0x3a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n107, err := m.CephFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) + n107, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n107 } - if m.FC != nil { - dAtA[i] = 0x52 + if m.Cinder != nil { + dAtA[i] = 0x42 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n108, err := m.FC.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) + n108, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n108 } - if m.Flocker != nil { - dAtA[i] = 0x5a + if m.CephFS != nil { + dAtA[i] = 0x4a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n109, err := m.Flocker.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) + n109, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n109 } - if m.FlexVolume != nil { - dAtA[i] = 0x62 + if m.FC != nil { + dAtA[i] = 0x52 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n110, err := m.FlexVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) + n110, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n110 } - if m.AzureFile != nil { - dAtA[i] = 0x6a + if m.Flocker != nil { + dAtA[i] = 0x5a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n111, err := m.AzureFile.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) + n111, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n111 } - if m.VsphereVolume != nil { - dAtA[i] = 0x72 + if m.FlexVolume != nil { + dAtA[i] = 0x62 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n112, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) + n112, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n112 } - if m.Quobyte != nil { - dAtA[i] = 0x7a + if m.AzureFile != nil { + dAtA[i] = 0x6a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n113, err := m.Quobyte.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) + n113, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n113 } + if m.VsphereVolume != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) + n114, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n114 + } + if m.Quobyte != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) + n115, err := m.Quobyte.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n115 + } if m.AzureDisk != nil { dAtA[i] = 0x82 i++ dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n114, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n116, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n114 + i += n116 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0x8a @@ -5956,11 +6026,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n115, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n117, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n115 + i += n117 } if m.PortworxVolume != nil { dAtA[i] = 0x92 @@ -5968,11 +6038,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n116, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n118, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n116 + i += n118 } if m.ScaleIO != nil { dAtA[i] = 0x9a @@ -5980,11 +6050,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n117, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n119, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n117 + i += n119 } if m.Local != nil { dAtA[i] = 0xa2 @@ -5992,11 +6062,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Local.Size())) - n118, err := m.Local.MarshalTo(dAtA[i:]) + n120, err := m.Local.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n118 + i += n120 } if m.StorageOS != nil { dAtA[i] = 0xaa @@ -6004,11 +6074,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n119, err := m.StorageOS.MarshalTo(dAtA[i:]) + n121, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n119 + i += n121 } return i, nil } @@ -6052,21 +6122,21 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n120, err := (&v).MarshalTo(dAtA[i:]) + n122, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n120 + i += n122 } } dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeSource.Size())) - n121, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) + n123, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n121 + i += n123 if len(m.AccessModes) > 0 { for _, s := range m.AccessModes { dAtA[i] = 0x1a @@ -6086,11 +6156,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClaimRef.Size())) - n122, err := m.ClaimRef.MarshalTo(dAtA[i:]) + n124, err := m.ClaimRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n122 + i += n124 } dAtA[i] = 0x2a i++ @@ -6192,27 +6262,27 @@ func (m *Pod) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n123, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n123 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n124, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n124 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n125, err := m.Status.MarshalTo(dAtA[i:]) + n125, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n125 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n126, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n126 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n127, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n127 return i, nil } @@ -6277,11 +6347,11 @@ func (m *PodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LabelSelector.Size())) - n126, err := m.LabelSelector.MarshalTo(dAtA[i:]) + n128, err := m.LabelSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n126 + i += n128 } if len(m.Namespaces) > 0 { for _, s := range m.Namespaces { @@ -6427,19 +6497,19 @@ func (m *PodCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size())) - n127, err := m.LastProbeTime.MarshalTo(dAtA[i:]) + n129, err := m.LastProbeTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n127 + i += n129 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n128, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n130, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n128 + i += n130 dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -6538,11 +6608,11 @@ func (m *PodList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n129, err := m.ListMeta.MarshalTo(dAtA[i:]) + n131, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n129 + i += n131 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -6602,11 +6672,11 @@ func (m *PodLogOptions) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SinceTime.Size())) - n130, err := m.SinceTime.MarshalTo(dAtA[i:]) + n132, err := m.SinceTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n130 + i += n132 } dAtA[i] = 0x30 i++ @@ -6695,11 +6765,11 @@ func (m *PodSecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n131, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n133, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n131 + i += n133 } if m.RunAsUser != nil { dAtA[i] = 0x10 @@ -6750,11 +6820,11 @@ func (m *PodSignature) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodController.Size())) - n132, err := m.PodController.MarshalTo(dAtA[i:]) + n134, err := m.PodController.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n132 + i += n134 } return i, nil } @@ -6878,11 +6948,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size())) - n133, err := m.SecurityContext.MarshalTo(dAtA[i:]) + n135, err := m.SecurityContext.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n133 + i += n135 } if len(m.ImagePullSecrets) > 0 { for _, msg := range m.ImagePullSecrets { @@ -6914,11 +6984,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Affinity.Size())) - n134, err := m.Affinity.MarshalTo(dAtA[i:]) + n136, err := m.Affinity.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n134 + i += n136 } dAtA[i] = 0x9a i++ @@ -7047,11 +7117,11 @@ func (m *PodStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size())) - n135, err := m.StartTime.MarshalTo(dAtA[i:]) + n137, err := m.StartTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n135 + i += n137 } if len(m.ContainerStatuses) > 0 { for _, msg := range m.ContainerStatuses { @@ -7102,19 +7172,19 @@ func (m *PodStatusResult) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n136, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n138, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n136 + i += n138 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n137, err := m.Status.MarshalTo(dAtA[i:]) + n139, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n137 + i += n139 return i, nil } @@ -7136,19 +7206,19 @@ func (m *PodTemplate) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n138, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n140, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n138 + i += n140 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n139, err := m.Template.MarshalTo(dAtA[i:]) + n141, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n139 + i += n141 return i, nil } @@ -7170,11 +7240,11 @@ func (m *PodTemplateList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n140, err := m.ListMeta.MarshalTo(dAtA[i:]) + n142, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n140 + i += n142 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7208,19 +7278,19 @@ func (m *PodTemplateSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n141, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n143, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n141 + i += n143 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n142, err := m.Spec.MarshalTo(dAtA[i:]) + n144, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n142 + i += n144 return i, nil } @@ -7300,19 +7370,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodSignature.Size())) - n143, err := m.PodSignature.MarshalTo(dAtA[i:]) + n145, err := m.PodSignature.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n143 + i += n145 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EvictionTime.Size())) - n144, err := m.EvictionTime.MarshalTo(dAtA[i:]) + n146, err := m.EvictionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n144 + i += n146 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7345,11 +7415,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Preference.Size())) - n145, err := m.Preference.MarshalTo(dAtA[i:]) + n147, err := m.Preference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n145 + i += n147 return i, nil } @@ -7371,11 +7441,11 @@ func (m *Probe) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Handler.Size())) - n146, err := m.Handler.MarshalTo(dAtA[i:]) + n148, err := m.Handler.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n146 + i += n148 dAtA[i] = 0x10 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.InitialDelaySeconds)) @@ -7525,11 +7595,11 @@ func (m *RBDVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n147, err := m.SecretRef.MarshalTo(dAtA[i:]) + n149, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n147 + i += n149 } dAtA[i] = 0x40 i++ @@ -7560,11 +7630,11 @@ func (m *RangeAllocation) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n148, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n150, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n148 + i += n150 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Range))) @@ -7596,27 +7666,27 @@ func (m *ReplicationController) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n149, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n149 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n150, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n150 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n151, err := m.Status.MarshalTo(dAtA[i:]) + n151, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n151 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n152, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n152 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n153, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n153 return i, nil } @@ -7646,11 +7716,11 @@ func (m *ReplicationControllerCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n152, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n154, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n152 + i += n154 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7680,11 +7750,11 @@ func (m *ReplicationControllerList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n153, err := m.ListMeta.MarshalTo(dAtA[i:]) + n155, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n153 + i += n155 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7746,11 +7816,11 @@ func (m *ReplicationControllerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n154, err := m.Template.MarshalTo(dAtA[i:]) + n156, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n154 + i += n156 } dAtA[i] = 0x20 i++ @@ -7829,11 +7899,11 @@ func (m *ResourceFieldSelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Divisor.Size())) - n155, err := m.Divisor.MarshalTo(dAtA[i:]) + n157, err := m.Divisor.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n155 + i += n157 return i, nil } @@ -7855,27 +7925,27 @@ func (m *ResourceQuota) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n156, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n156 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n157, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n157 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n158, err := m.Status.MarshalTo(dAtA[i:]) + n158, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n158 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n159, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n159 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n160, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n160 return i, nil } @@ -7897,11 +7967,11 @@ func (m *ResourceQuotaList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n159, err := m.ListMeta.MarshalTo(dAtA[i:]) + n161, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n159 + i += n161 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7956,11 +8026,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n160, err := (&v).MarshalTo(dAtA[i:]) + n162, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n160 + i += n162 } } if len(m.Scopes) > 0 { @@ -8020,11 +8090,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n161, err := (&v).MarshalTo(dAtA[i:]) + n163, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n161 + i += n163 } } if len(m.Used) > 0 { @@ -8051,11 +8121,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n162, err := (&v).MarshalTo(dAtA[i:]) + n164, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n162 + i += n164 } } return i, nil @@ -8100,11 +8170,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n163, err := (&v).MarshalTo(dAtA[i:]) + n165, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n163 + i += n165 } } if len(m.Requests) > 0 { @@ -8131,11 +8201,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n164, err := (&v).MarshalTo(dAtA[i:]) + n166, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n164 + i += n166 } } return i, nil @@ -8202,11 +8272,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n165, err := m.SecretRef.MarshalTo(dAtA[i:]) + n167, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n165 + i += n167 } dAtA[i] = 0x20 i++ @@ -8265,11 +8335,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n166, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n168, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n166 + i += n168 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -8345,11 +8415,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n167, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n169, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n167 + i += n169 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -8381,11 +8451,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n168, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n170, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n168 + i += n170 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -8421,11 +8491,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n169, err := m.ListMeta.MarshalTo(dAtA[i:]) + n171, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n169 + i += n171 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8459,11 +8529,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n170, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n172, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n170 + i += n172 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8583,11 +8653,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size())) - n171, err := m.Capabilities.MarshalTo(dAtA[i:]) + n173, err := m.Capabilities.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n171 + i += n173 } if m.Privileged != nil { dAtA[i] = 0x10 @@ -8603,11 +8673,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n172, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n174, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n172 + i += n174 } if m.RunAsUser != nil { dAtA[i] = 0x20 @@ -8665,11 +8735,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size())) - n173, err := m.Reference.MarshalTo(dAtA[i:]) + n175, err := m.Reference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n173 + i += n175 return i, nil } @@ -8691,27 +8761,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n174, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n174 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n175, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n175 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n176, err := m.Status.MarshalTo(dAtA[i:]) + n176, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n176 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n177, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n177 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n178, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n178 return i, nil } @@ -8733,11 +8803,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n177, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n179, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n177 + i += n179 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { dAtA[i] = 0x12 @@ -8793,11 +8863,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n178, err := m.ListMeta.MarshalTo(dAtA[i:]) + n180, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n178 + i += n180 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8831,11 +8901,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n179, err := m.ListMeta.MarshalTo(dAtA[i:]) + n181, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n179 + i += n181 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8880,11 +8950,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size())) - n180, err := m.TargetPort.MarshalTo(dAtA[i:]) + n182, err := m.TargetPort.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n180 + i += n182 dAtA[i] = 0x28 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort)) @@ -9031,11 +9101,11 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SessionAffinityConfig.Size())) - n181, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) + n183, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n181 + i += n183 } return i, nil } @@ -9058,11 +9128,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size())) - n182, err := m.LoadBalancer.MarshalTo(dAtA[i:]) + n184, err := m.LoadBalancer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n182 + i += n184 return i, nil } @@ -9085,11 +9155,11 @@ func (m *SessionAffinityConfig) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClientIP.Size())) - n183, err := m.ClientIP.MarshalTo(dAtA[i:]) + n185, err := m.ClientIP.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n183 + i += n185 } return i, nil } @@ -9133,11 +9203,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n184, err := m.SecretRef.MarshalTo(dAtA[i:]) + n186, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n184 + i += n186 } return i, nil } @@ -9181,11 +9251,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n185, err := m.SecretRef.MarshalTo(dAtA[i:]) + n187, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n185 + i += n187 } return i, nil } @@ -9234,11 +9304,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n186, err := m.Port.MarshalTo(dAtA[i:]) + n188, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n186 + i += n188 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -9276,11 +9346,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size())) - n187, err := m.TimeAdded.MarshalTo(dAtA[i:]) + n189, err := m.TimeAdded.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n187 + i += n189 return i, nil } @@ -9345,11 +9415,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size())) - n188, err := m.VolumeSource.MarshalTo(dAtA[i:]) + n190, err := m.VolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n188 + i += n190 return i, nil } @@ -9416,31 +9486,31 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n189, err := m.Secret.MarshalTo(dAtA[i:]) + n191, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n189 + i += n191 } if m.DownwardAPI != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n190, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n192, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n190 + i += n192 } if m.ConfigMap != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n191, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n193, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n191 + i += n193 } return i, nil } @@ -9464,163 +9534,163 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n192, err := m.HostPath.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n192 - } - if m.EmptyDir != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) - n193, err := m.EmptyDir.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n193 - } - if m.GCEPersistentDisk != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n194, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + n194, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n194 } - if m.AWSElasticBlockStore != nil { - dAtA[i] = 0x22 + if m.EmptyDir != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n195, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) + n195, err := m.EmptyDir.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n195 } - if m.GitRepo != nil { - dAtA[i] = 0x2a + if m.GCEPersistentDisk != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) - n196, err := m.GitRepo.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) + n196, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n196 } - if m.Secret != nil { - dAtA[i] = 0x32 + if m.AWSElasticBlockStore != nil { + dAtA[i] = 0x22 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n197, err := m.Secret.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) + n197, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n197 } - if m.NFS != nil { - dAtA[i] = 0x3a + if m.GitRepo != nil { + dAtA[i] = 0x2a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n198, err := m.NFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) + n198, err := m.GitRepo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n198 } - if m.ISCSI != nil { - dAtA[i] = 0x42 + if m.Secret != nil { + dAtA[i] = 0x32 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n199, err := m.ISCSI.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) + n199, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n199 } - if m.Glusterfs != nil { - dAtA[i] = 0x4a + if m.NFS != nil { + dAtA[i] = 0x3a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n200, err := m.Glusterfs.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) + n200, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n200 } - if m.PersistentVolumeClaim != nil { - dAtA[i] = 0x52 + if m.ISCSI != nil { + dAtA[i] = 0x42 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) - n201, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) + n201, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n201 } - if m.RBD != nil { - dAtA[i] = 0x5a + if m.Glusterfs != nil { + dAtA[i] = 0x4a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n202, err := m.RBD.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) + n202, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n202 } - if m.FlexVolume != nil { - dAtA[i] = 0x62 + if m.PersistentVolumeClaim != nil { + dAtA[i] = 0x52 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n203, err := m.FlexVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) + n203, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n203 } - if m.Cinder != nil { - dAtA[i] = 0x6a + if m.RBD != nil { + dAtA[i] = 0x5a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n204, err := m.Cinder.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) + n204, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n204 } - if m.CephFS != nil { - dAtA[i] = 0x72 + if m.FlexVolume != nil { + dAtA[i] = 0x62 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n205, err := m.CephFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) + n205, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n205 } - if m.Flocker != nil { - dAtA[i] = 0x7a + if m.Cinder != nil { + dAtA[i] = 0x6a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n206, err := m.Flocker.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) + n206, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n206 } + if m.CephFS != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) + n207, err := m.CephFS.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n207 + } + if m.Flocker != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) + n208, err := m.Flocker.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n208 + } if m.DownwardAPI != nil { dAtA[i] = 0x82 i++ dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n207, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n209, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n207 + i += n209 } if m.FC != nil { dAtA[i] = 0x8a @@ -9628,11 +9698,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n208, err := m.FC.MarshalTo(dAtA[i:]) + n210, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n208 + i += n210 } if m.AzureFile != nil { dAtA[i] = 0x92 @@ -9640,11 +9710,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n209, err := m.AzureFile.MarshalTo(dAtA[i:]) + n211, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n209 + i += n211 } if m.ConfigMap != nil { dAtA[i] = 0x9a @@ -9652,11 +9722,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n210, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n212, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n210 + i += n212 } if m.VsphereVolume != nil { dAtA[i] = 0xa2 @@ -9664,11 +9734,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n211, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n213, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n211 + i += n213 } if m.Quobyte != nil { dAtA[i] = 0xaa @@ -9676,11 +9746,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n212, err := m.Quobyte.MarshalTo(dAtA[i:]) + n214, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n212 + i += n214 } if m.AzureDisk != nil { dAtA[i] = 0xb2 @@ -9688,11 +9758,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n213, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n215, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n213 + i += n215 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0xba @@ -9700,11 +9770,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n214, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n216, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n214 + i += n216 } if m.PortworxVolume != nil { dAtA[i] = 0xc2 @@ -9712,11 +9782,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n215, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n217, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n215 + i += n217 } if m.ScaleIO != nil { dAtA[i] = 0xca @@ -9724,11 +9794,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n216, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n218, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n216 + i += n218 } if m.Projected != nil { dAtA[i] = 0xd2 @@ -9736,11 +9806,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size())) - n217, err := m.Projected.MarshalTo(dAtA[i:]) + n219, err := m.Projected.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n217 + i += n219 } if m.StorageOS != nil { dAtA[i] = 0xda @@ -9748,11 +9818,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n218, err := m.StorageOS.MarshalTo(dAtA[i:]) + n220, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n218 + i += n220 } return i, nil } @@ -9812,11 +9882,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size())) - n219, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) + n221, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n219 + i += n221 return i, nil } @@ -11446,6 +11516,24 @@ func (m *PersistentVolumeClaim) Size() (n int) { return n } +func (m *PersistentVolumeClaimCondition) Size() (n int) { + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Status) + n += 1 + l + sovGenerated(uint64(l)) + l = m.LastProbeTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.LastTransitionTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Message) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *PersistentVolumeClaimList) Size() (n int) { var l int _ = l @@ -11504,6 +11592,12 @@ func (m *PersistentVolumeClaimStatus) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -14327,6 +14421,21 @@ func (this *PersistentVolumeClaim) String() string { }, "") return s } +func (this *PersistentVolumeClaimCondition) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PersistentVolumeClaimCondition{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Status:` + fmt.Sprintf("%v", this.Status) + `,`, + `LastProbeTime:` + strings.Replace(strings.Replace(this.LastProbeTime.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, + `LastTransitionTime:` + strings.Replace(strings.Replace(this.LastTransitionTime.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, + `Reason:` + fmt.Sprintf("%v", this.Reason) + `,`, + `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `}`, + }, "") + return s +} func (this *PersistentVolumeClaimList) String() string { if this == nil { return "nil" @@ -14370,6 +14479,7 @@ func (this *PersistentVolumeClaimStatus) String() string { `Phase:` + fmt.Sprintf("%v", this.Phase) + `,`, `AccessModes:` + fmt.Sprintf("%v", this.AccessModes) + `,`, `Capacity:` + mapStringForCapacity + `,`, + `Conditions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Conditions), "PersistentVolumeClaimCondition", "PersistentVolumeClaimCondition", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -30959,6 +31069,232 @@ func (m *PersistentVolumeClaim) Unmarshal(dAtA []byte) error { } return nil } +func (m *PersistentVolumeClaimCondition) 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: PersistentVolumeClaimCondition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PersistentVolumeClaimCondition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = PersistentVolumeClaimConditionType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = ConditionStatus(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastProbeTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastProbeTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastTransitionTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastTransitionTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PersistentVolumeClaimList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -31479,6 +31815,37 @@ func (m *PersistentVolumeClaimStatus) Unmarshal(dAtA []byte) error { m.Capacity[ResourceName(mapkey)] = mapvalue } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, PersistentVolumeClaimCondition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -45970,743 +46337,745 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11802 bytes of a gzipped FileDescriptorProto + // 11834 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xd7, - 0x75, 0x18, 0xac, 0x9e, 0xc1, 0x6b, 0x0e, 0xde, 0x77, 0xb1, 0xe4, 0x2c, 0x48, 0x2e, 0x96, 0x4d, - 0x89, 0x5c, 0xbe, 0x00, 0x71, 0x49, 0x8a, 0xb4, 0x48, 0x51, 0x02, 0x30, 0xc0, 0x2e, 0xb8, 0x8b, - 0xdd, 0xe1, 0x1d, 0xec, 0x52, 0xa4, 0x68, 0x7e, 0x6a, 0x4c, 0x5f, 0x00, 0x4d, 0x34, 0xba, 0x87, - 0xdd, 0x3d, 0xd8, 0x05, 0xcb, 0xaa, 0xfa, 0xa2, 0xc8, 0xca, 0x43, 0xfe, 0xe1, 0x4a, 0x5c, 0x89, - 0x63, 0xa9, 0x9c, 0xaa, 0x3c, 0xca, 0x56, 0xec, 0xa4, 0xe2, 0xc8, 0xb1, 0x1d, 0xc9, 0xa9, 0x38, - 0xce, 0xa3, 0xa4, 0x3f, 0x8a, 0x9d, 0x3f, 0x52, 0x55, 0x2a, 0xb0, 0xb5, 0x4a, 0x25, 0xe5, 0x1f, - 0x49, 0x25, 0xf1, 0x2f, 0x23, 0x4e, 0x94, 0xba, 0xcf, 0xbe, 0xb7, 0xa7, 0x7b, 0x66, 0xb0, 0xdc, - 0x05, 0x29, 0x55, 0xfe, 0xcd, 0x9c, 0x73, 0xee, 0xb9, 0xb7, 0xef, 0xe3, 0xdc, 0x73, 0xcf, 0x3d, - 0xe7, 0x5c, 0x78, 0x69, 0xf7, 0xc5, 0x78, 0xde, 0x0b, 0x17, 0x76, 0xdb, 0x9b, 0x24, 0x0a, 0x48, - 0x42, 0xe2, 0x85, 0x7d, 0x12, 0xb8, 0x61, 0xb4, 0x20, 0x10, 0x4e, 0xcb, 0x5b, 0x68, 0x86, 0x11, - 0x59, 0xd8, 0x7f, 0x66, 0x61, 0x9b, 0x04, 0x24, 0x72, 0x12, 0xe2, 0xce, 0xb7, 0xa2, 0x30, 0x09, - 0x11, 0xe2, 0x34, 0xf3, 0x4e, 0xcb, 0x9b, 0xa7, 0x34, 0xf3, 0xfb, 0xcf, 0xcc, 0x3e, 0xbd, 0xed, - 0x25, 0x3b, 0xed, 0xcd, 0xf9, 0x66, 0xb8, 0xb7, 0xb0, 0x1d, 0x6e, 0x87, 0x0b, 0x8c, 0x74, 0xb3, - 0xbd, 0xc5, 0xfe, 0xb1, 0x3f, 0xec, 0x17, 0x67, 0x31, 0xbb, 0x9e, 0x56, 0x43, 0x6e, 0x25, 0x24, - 0x88, 0xbd, 0x30, 0x88, 0x9f, 0x76, 0x5a, 0x5e, 0x4c, 0xa2, 0x7d, 0x12, 0x2d, 0xb4, 0x76, 0xb7, - 0x29, 0x2e, 0x36, 0x09, 0x16, 0xf6, 0x9f, 0xd9, 0x24, 0x89, 0xd3, 0xd1, 0xa2, 0xd9, 0xe7, 0x52, - 0x76, 0x7b, 0x4e, 0x73, 0xc7, 0x0b, 0x48, 0x74, 0x20, 0x79, 0x2c, 0x44, 0x24, 0x0e, 0xdb, 0x51, - 0x93, 0x1c, 0xab, 0x54, 0xbc, 0xb0, 0x47, 0x12, 0x27, 0xe7, 0xeb, 0x67, 0x17, 0x8a, 0x4a, 0x45, - 0xed, 0x20, 0xf1, 0xf6, 0x3a, 0xab, 0xf9, 0x44, 0xaf, 0x02, 0x71, 0x73, 0x87, 0xec, 0x39, 0x1d, - 0xe5, 0x9e, 0x2d, 0x2a, 0xd7, 0x4e, 0x3c, 0x7f, 0xc1, 0x0b, 0x92, 0x38, 0x89, 0xb2, 0x85, 0xec, - 0xef, 0x59, 0x70, 0x6e, 0xf1, 0xf5, 0xc6, 0x8a, 0xef, 0xc4, 0x89, 0xd7, 0x5c, 0xf2, 0xc3, 0xe6, - 0x6e, 0x23, 0x09, 0x23, 0x72, 0x23, 0xf4, 0xdb, 0x7b, 0xa4, 0xc1, 0x3a, 0x02, 0x3d, 0x05, 0x23, - 0xfb, 0xec, 0xff, 0x5a, 0xad, 0x6a, 0x9d, 0xb3, 0xce, 0x57, 0x96, 0xa6, 0xbe, 0x7d, 0x38, 0xf7, - 0x91, 0xdb, 0x87, 0x73, 0x23, 0x37, 0x04, 0x1c, 0x2b, 0x0a, 0xf4, 0x28, 0x0c, 0x6d, 0xc5, 0x1b, - 0x07, 0x2d, 0x52, 0x2d, 0x31, 0xda, 0x09, 0x41, 0x3b, 0xb4, 0xda, 0xa0, 0x50, 0x2c, 0xb0, 0x68, - 0x01, 0x2a, 0x2d, 0x27, 0x4a, 0xbc, 0xc4, 0x0b, 0x83, 0x6a, 0xf9, 0x9c, 0x75, 0x7e, 0x70, 0x69, - 0x5a, 0x90, 0x56, 0xea, 0x12, 0x81, 0x53, 0x1a, 0xda, 0x8c, 0x88, 0x38, 0xee, 0xb5, 0xc0, 0x3f, - 0xa8, 0x0e, 0x9c, 0xb3, 0xce, 0x8f, 0xa4, 0xcd, 0xc0, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0x4b, 0x25, - 0x18, 0x59, 0xdc, 0xda, 0xf2, 0x02, 0x2f, 0x39, 0x40, 0x37, 0x60, 0x2c, 0x08, 0x5d, 0x22, 0xff, - 0xb3, 0xaf, 0x18, 0xbd, 0x70, 0x6e, 0xbe, 0x73, 0x66, 0xce, 0x5f, 0xd5, 0xe8, 0x96, 0xa6, 0x6e, - 0x1f, 0xce, 0x8d, 0xe9, 0x10, 0x6c, 0xf0, 0x41, 0x18, 0x46, 0x5b, 0xa1, 0xab, 0xd8, 0x96, 0x18, - 0xdb, 0xb9, 0x3c, 0xb6, 0xf5, 0x94, 0x6c, 0x69, 0xf2, 0xf6, 0xe1, 0xdc, 0xa8, 0x06, 0xc0, 0x3a, - 0x13, 0xb4, 0x09, 0x93, 0xf4, 0x6f, 0x90, 0x78, 0x8a, 0x6f, 0x99, 0xf1, 0x7d, 0xa4, 0x88, 0xaf, - 0x46, 0xba, 0x74, 0xea, 0xf6, 0xe1, 0xdc, 0x64, 0x06, 0x88, 0xb3, 0x0c, 0xed, 0xf7, 0x60, 0x62, - 0x31, 0x49, 0x9c, 0xe6, 0x0e, 0x71, 0xf9, 0x08, 0xa2, 0xe7, 0x60, 0x20, 0x70, 0xf6, 0x88, 0x18, - 0xdf, 0x73, 0xa2, 0x63, 0x07, 0xae, 0x3a, 0x7b, 0xe4, 0xe8, 0x70, 0x6e, 0xea, 0x7a, 0xe0, 0xbd, - 0xdb, 0x16, 0xb3, 0x82, 0xc2, 0x30, 0xa3, 0x46, 0x17, 0x00, 0x5c, 0xb2, 0xef, 0x35, 0x49, 0xdd, - 0x49, 0x76, 0xc4, 0x78, 0x23, 0x51, 0x16, 0x6a, 0x0a, 0x83, 0x35, 0x2a, 0xfb, 0x16, 0x54, 0x16, - 0xf7, 0x43, 0xcf, 0xad, 0x87, 0x6e, 0x8c, 0x76, 0x61, 0xb2, 0x15, 0x91, 0x2d, 0x12, 0x29, 0x50, - 0xd5, 0x3a, 0x57, 0x3e, 0x3f, 0x7a, 0xe1, 0x7c, 0xee, 0xc7, 0x9a, 0xa4, 0x2b, 0x41, 0x12, 0x1d, - 0x2c, 0xdd, 0x2f, 0xea, 0x9b, 0xcc, 0x60, 0x71, 0x96, 0xb3, 0xfd, 0xaf, 0x4b, 0x70, 0x7a, 0xf1, - 0xbd, 0x76, 0x44, 0x6a, 0x5e, 0xbc, 0x9b, 0x9d, 0xe1, 0xae, 0x17, 0xef, 0x5e, 0x4d, 0x7b, 0x40, - 0x4d, 0xad, 0x9a, 0x80, 0x63, 0x45, 0x81, 0x9e, 0x86, 0x61, 0xfa, 0xfb, 0x3a, 0x5e, 0x13, 0x9f, - 0x7c, 0x4a, 0x10, 0x8f, 0xd6, 0x9c, 0xc4, 0xa9, 0x71, 0x14, 0x96, 0x34, 0x68, 0x1d, 0x46, 0x9b, - 0x6c, 0x41, 0x6e, 0xaf, 0x87, 0x2e, 0x61, 0x83, 0x59, 0x59, 0x7a, 0x92, 0x92, 0x2f, 0xa7, 0xe0, - 0xa3, 0xc3, 0xb9, 0x2a, 0x6f, 0x9b, 0x60, 0xa1, 0xe1, 0xb0, 0x5e, 0x1e, 0xd9, 0x6a, 0x7d, 0x0d, - 0x30, 0x4e, 0x90, 0xb3, 0xb6, 0xce, 0x6b, 0x4b, 0x65, 0x90, 0x2d, 0x95, 0xb1, 0xfc, 0x65, 0x82, - 0x9e, 0x81, 0x81, 0x5d, 0x2f, 0x70, 0xab, 0x43, 0x8c, 0xd7, 0x43, 0x74, 0xcc, 0x2f, 0x7b, 0x81, - 0x7b, 0x74, 0x38, 0x37, 0x6d, 0x34, 0x87, 0x02, 0x31, 0x23, 0xb5, 0xff, 0xd4, 0x82, 0x39, 0x86, - 0x5b, 0xf5, 0x7c, 0x52, 0x27, 0x51, 0xec, 0xc5, 0x09, 0x09, 0x12, 0xa3, 0x43, 0x2f, 0x00, 0xc4, - 0xa4, 0x19, 0x91, 0x44, 0xeb, 0x52, 0x35, 0x31, 0x1a, 0x0a, 0x83, 0x35, 0x2a, 0x2a, 0x10, 0xe2, - 0x1d, 0x27, 0x62, 0xf3, 0x4b, 0x74, 0xac, 0x12, 0x08, 0x0d, 0x89, 0xc0, 0x29, 0x8d, 0x21, 0x10, - 0xca, 0xbd, 0x04, 0x02, 0xfa, 0x14, 0x4c, 0xa6, 0x95, 0xc5, 0x2d, 0xa7, 0x29, 0x3b, 0x90, 0x2d, - 0x99, 0x86, 0x89, 0xc2, 0x59, 0x5a, 0xfb, 0x1f, 0x58, 0x62, 0xf2, 0xd0, 0xaf, 0xfe, 0x90, 0x7f, - 0xab, 0xfd, 0x3b, 0x16, 0x0c, 0x2f, 0x79, 0x81, 0xeb, 0x05, 0xdb, 0xe8, 0xf3, 0x30, 0x42, 0xf7, - 0x26, 0xd7, 0x49, 0x1c, 0x21, 0xf7, 0x3e, 0xae, 0xad, 0x2d, 0xb5, 0x55, 0xcc, 0xb7, 0x76, 0xb7, - 0x29, 0x20, 0x9e, 0xa7, 0xd4, 0x74, 0xb5, 0x5d, 0xdb, 0x7c, 0x87, 0x34, 0x93, 0x75, 0x92, 0x38, - 0xe9, 0xe7, 0xa4, 0x30, 0xac, 0xb8, 0xa2, 0xcb, 0x30, 0x94, 0x38, 0xd1, 0x36, 0x49, 0x84, 0x00, - 0xcc, 0x15, 0x54, 0xbc, 0x24, 0xa6, 0x2b, 0x92, 0x04, 0x4d, 0x92, 0x6e, 0x0b, 0x1b, 0xac, 0x28, - 0x16, 0x2c, 0xec, 0x26, 0x8c, 0x2d, 0x3b, 0x2d, 0x67, 0xd3, 0xf3, 0xbd, 0xc4, 0x23, 0x31, 0x7a, - 0x0c, 0xca, 0x8e, 0xeb, 0x32, 0xa9, 0x50, 0x59, 0x3a, 0x7d, 0xfb, 0x70, 0xae, 0xbc, 0xe8, 0xd2, - 0xe9, 0x09, 0x8a, 0xea, 0x00, 0x53, 0x0a, 0xf4, 0x04, 0x0c, 0xb8, 0x51, 0xd8, 0xaa, 0x96, 0x18, - 0xe5, 0x7d, 0x74, 0x26, 0xd7, 0xa2, 0xb0, 0x95, 0x21, 0x65, 0x34, 0xf6, 0xef, 0x95, 0xe0, 0xc1, - 0x65, 0xd2, 0xda, 0x59, 0x6d, 0x14, 0xcc, 0xdf, 0xf3, 0x30, 0xb2, 0x17, 0x06, 0x5e, 0x12, 0x46, - 0xb1, 0xa8, 0x9a, 0x2d, 0xa0, 0x75, 0x01, 0xc3, 0x0a, 0x8b, 0xce, 0xc1, 0x40, 0x2b, 0x15, 0x7e, - 0x63, 0x52, 0x70, 0x32, 0xb1, 0xc7, 0x30, 0x94, 0xa2, 0x1d, 0x93, 0x48, 0x2c, 0x7c, 0x45, 0x71, - 0x3d, 0x26, 0x11, 0x66, 0x98, 0x74, 0x06, 0xd1, 0xb9, 0x25, 0x66, 0x65, 0x66, 0x06, 0x51, 0x0c, - 0xd6, 0xa8, 0x50, 0x1d, 0x2a, 0xfc, 0x1f, 0x26, 0x5b, 0x6c, 0x8d, 0x17, 0xf4, 0x7b, 0x43, 0x12, - 0x89, 0x7e, 0x1f, 0x67, 0x53, 0x4c, 0x02, 0x71, 0xca, 0xc4, 0x98, 0x62, 0x43, 0x3d, 0xa7, 0xd8, - 0xb7, 0x4a, 0x80, 0x78, 0x17, 0xfe, 0x98, 0x75, 0xdc, 0xf5, 0xce, 0x8e, 0xcb, 0xdd, 0x6c, 0xae, - 0x84, 0x4d, 0xc7, 0xcf, 0xce, 0xda, 0xbb, 0xd5, 0x7b, 0xbf, 0x68, 0x01, 0x5a, 0xf6, 0x02, 0x97, - 0x44, 0x27, 0xa0, 0x69, 0x1d, 0x4f, 0x76, 0x5c, 0x81, 0x89, 0x65, 0xdf, 0x23, 0x41, 0xb2, 0x56, - 0x5f, 0x0e, 0x83, 0x2d, 0x6f, 0x1b, 0x7d, 0x12, 0x26, 0xa8, 0xe2, 0x19, 0xb6, 0x93, 0x06, 0x69, - 0x86, 0x01, 0xdb, 0xa3, 0xa9, 0xba, 0x86, 0x6e, 0x1f, 0xce, 0x4d, 0x6c, 0x18, 0x18, 0x9c, 0xa1, - 0xb4, 0xff, 0x03, 0xfd, 0xd0, 0x70, 0xaf, 0x15, 0x06, 0x24, 0x48, 0x96, 0xc3, 0xc0, 0xe5, 0xba, - 0xdc, 0x27, 0x61, 0x20, 0xa1, 0x0d, 0xe7, 0x1f, 0xf9, 0xa8, 0x1c, 0x5a, 0xda, 0xdc, 0xa3, 0xc3, - 0xb9, 0xfb, 0x3a, 0x4b, 0xb0, 0x0f, 0x62, 0x65, 0xd0, 0x4f, 0xc1, 0x50, 0x9c, 0x38, 0x49, 0x3b, - 0x16, 0x9f, 0xfd, 0xb0, 0xfc, 0xec, 0x06, 0x83, 0x1e, 0x1d, 0xce, 0x4d, 0xaa, 0x62, 0x1c, 0x84, - 0x45, 0x01, 0xf4, 0x38, 0x0c, 0xef, 0x91, 0x38, 0x76, 0xb6, 0xe5, 0x36, 0x3c, 0x29, 0xca, 0x0e, - 0xaf, 0x73, 0x30, 0x96, 0x78, 0xf4, 0x08, 0x0c, 0x92, 0x28, 0x0a, 0x23, 0x31, 0xab, 0xc6, 0x05, - 0xe1, 0xe0, 0x0a, 0x05, 0x62, 0x8e, 0xb3, 0xff, 0x9d, 0x05, 0x93, 0xaa, 0xad, 0xbc, 0xae, 0x13, - 0x90, 0xb7, 0x6f, 0x02, 0x34, 0xe5, 0x07, 0xc6, 0x4c, 0xde, 0x8d, 0x5e, 0x78, 0x34, 0x6f, 0x0a, - 0x77, 0x76, 0x63, 0xca, 0x59, 0x81, 0x62, 0xac, 0x71, 0xb3, 0xff, 0xb9, 0x05, 0xa7, 0x32, 0x5f, - 0x74, 0xc5, 0x8b, 0x13, 0xf4, 0x56, 0xc7, 0x57, 0xcd, 0xf7, 0xf7, 0x55, 0xb4, 0x34, 0xfb, 0x26, - 0x35, 0xe7, 0x24, 0x44, 0xfb, 0xa2, 0x4b, 0x30, 0xe8, 0x25, 0x64, 0x4f, 0x7e, 0xcc, 0x23, 0x5d, - 0x3f, 0x86, 0xb7, 0x2a, 0x1d, 0x91, 0x35, 0x5a, 0x12, 0x73, 0x06, 0xf6, 0xff, 0xb0, 0xa0, 0xc2, - 0xa7, 0xed, 0xba, 0xd3, 0x3a, 0x81, 0xb1, 0x58, 0x83, 0x01, 0xc6, 0x9d, 0x37, 0xfc, 0xb1, 0xfc, - 0x86, 0x8b, 0xe6, 0xcc, 0x53, 0x65, 0x8a, 0x2b, 0xad, 0x4a, 0x98, 0x51, 0x10, 0x66, 0x2c, 0x66, - 0x5f, 0x80, 0x8a, 0x22, 0x40, 0x53, 0x50, 0xde, 0x25, 0xfc, 0xa0, 0x52, 0xc1, 0xf4, 0x27, 0x9a, - 0x81, 0xc1, 0x7d, 0xc7, 0x6f, 0x8b, 0xc5, 0x8e, 0xf9, 0x9f, 0x4f, 0x96, 0x5e, 0xb4, 0xec, 0x6f, - 0xb2, 0x35, 0x26, 0x2a, 0x59, 0x09, 0xf6, 0x85, 0x30, 0x79, 0x0f, 0x66, 0xfc, 0x1c, 0x19, 0x26, - 0x3a, 0xa2, 0x7f, 0x99, 0xf7, 0xa0, 0x68, 0xeb, 0x4c, 0x1e, 0x16, 0xe7, 0xd6, 0x41, 0xb7, 0x81, - 0xb0, 0x45, 0x67, 0x94, 0xe3, 0xb3, 0xf6, 0x0a, 0x05, 0xf4, 0x9a, 0x80, 0x61, 0x85, 0xa5, 0x02, - 0x62, 0x46, 0x35, 0xfe, 0x32, 0x39, 0x68, 0x10, 0x9f, 0x34, 0x93, 0x30, 0xfa, 0x40, 0x9b, 0xff, - 0x10, 0xef, 0x7d, 0x2e, 0x5f, 0x46, 0x05, 0x83, 0xf2, 0x65, 0x72, 0xc0, 0x87, 0x42, 0xff, 0xba, - 0x72, 0xd7, 0xaf, 0xfb, 0x0d, 0x0b, 0xc6, 0xd5, 0xd7, 0x9d, 0xc0, 0x42, 0x5a, 0x32, 0x17, 0xd2, - 0x43, 0x5d, 0xe7, 0x63, 0xc1, 0x12, 0xfa, 0x11, 0x13, 0x01, 0x82, 0xa6, 0x1e, 0x85, 0xb4, 0x6b, - 0xa8, 0xcc, 0xfe, 0x20, 0x07, 0xa4, 0x9f, 0xef, 0xba, 0x4c, 0x0e, 0x36, 0x42, 0xaa, 0x3e, 0xe4, - 0x7f, 0x97, 0x31, 0x6a, 0x03, 0x5d, 0x47, 0xed, 0x37, 0x4b, 0x70, 0x5a, 0xf5, 0x80, 0xb1, 0x41, - 0xff, 0xb8, 0xf7, 0xc1, 0x33, 0x30, 0xea, 0x92, 0x2d, 0xa7, 0xed, 0x27, 0xea, 0x2c, 0x3a, 0xc8, - 0xed, 0x11, 0xb5, 0x14, 0x8c, 0x75, 0x9a, 0x63, 0x74, 0xdb, 0xbf, 0x01, 0x26, 0x7b, 0x13, 0x87, - 0xce, 0x60, 0xaa, 0xbd, 0x69, 0x16, 0x85, 0x31, 0xdd, 0xa2, 0x20, 0xac, 0x07, 0x8f, 0xc0, 0xa0, - 0xb7, 0x47, 0xf7, 0xe2, 0x92, 0xb9, 0xc5, 0xae, 0x51, 0x20, 0xe6, 0x38, 0xf4, 0x31, 0x18, 0x6e, - 0x86, 0x7b, 0x7b, 0x4e, 0xe0, 0x56, 0xcb, 0x4c, 0x9f, 0x1c, 0xa5, 0xdb, 0xf5, 0x32, 0x07, 0x61, - 0x89, 0x43, 0x0f, 0xc2, 0x80, 0x13, 0x6d, 0xc7, 0xd5, 0x01, 0x46, 0x33, 0x42, 0x6b, 0x5a, 0x8c, - 0xb6, 0x63, 0xcc, 0xa0, 0x54, 0x4f, 0xbc, 0x19, 0x46, 0xbb, 0x5e, 0xb0, 0x5d, 0xf3, 0x22, 0xa6, - 0xf4, 0x69, 0x7a, 0xe2, 0xeb, 0x0a, 0x83, 0x35, 0x2a, 0xb4, 0x0a, 0x83, 0xad, 0x30, 0x4a, 0xe2, - 0xea, 0x10, 0xeb, 0xee, 0x87, 0x0b, 0x96, 0x12, 0xff, 0xda, 0x7a, 0x18, 0x25, 0xe9, 0x07, 0xd0, - 0x7f, 0x31, 0xe6, 0xc5, 0xd1, 0x4f, 0x41, 0x99, 0x04, 0xfb, 0xd5, 0x61, 0xc6, 0x65, 0x36, 0x8f, - 0xcb, 0x4a, 0xb0, 0x7f, 0xc3, 0x89, 0x52, 0x39, 0xb3, 0x12, 0xec, 0x63, 0x5a, 0x06, 0xbd, 0x01, - 0x15, 0x69, 0x8d, 0x8c, 0xab, 0x23, 0xc5, 0x53, 0x0c, 0x0b, 0x22, 0x4c, 0xde, 0x6d, 0x7b, 0x11, - 0xd9, 0x23, 0x41, 0x12, 0xa7, 0xe7, 0x49, 0x89, 0x8d, 0x71, 0xca, 0x0d, 0xbd, 0x01, 0x63, 0x5c, - 0x8f, 0x5c, 0x0f, 0xdb, 0x41, 0x12, 0x57, 0x2b, 0xac, 0x79, 0xb9, 0xa6, 0xab, 0x1b, 0x29, 0xdd, - 0xd2, 0x8c, 0x60, 0x3a, 0xa6, 0x01, 0x63, 0x6c, 0xb0, 0x42, 0x18, 0xc6, 0x7d, 0x6f, 0x9f, 0x04, - 0x24, 0x8e, 0xeb, 0x51, 0xb8, 0x49, 0xaa, 0xc0, 0x5a, 0x7e, 0x26, 0xdf, 0xa2, 0x13, 0x6e, 0x92, - 0xa5, 0xe9, 0xdb, 0x87, 0x73, 0xe3, 0x57, 0xf4, 0x32, 0xd8, 0x64, 0x81, 0xae, 0xc3, 0x04, 0x55, - 0x50, 0xbd, 0x94, 0xe9, 0x68, 0x2f, 0xa6, 0x4c, 0x3b, 0xc5, 0x46, 0x21, 0x9c, 0x61, 0x82, 0x5e, - 0x85, 0x8a, 0xef, 0x6d, 0x91, 0xe6, 0x41, 0xd3, 0x27, 0xd5, 0x31, 0xc6, 0x31, 0x77, 0x59, 0x5d, - 0x91, 0x44, 0xfc, 0x00, 0xa0, 0xfe, 0xe2, 0xb4, 0x38, 0xba, 0x01, 0xf7, 0x25, 0x24, 0xda, 0xf3, - 0x02, 0x87, 0x2e, 0x07, 0xa1, 0x4f, 0x32, 0xbb, 0xd8, 0x38, 0x9b, 0x6f, 0x67, 0x45, 0xd7, 0xdd, - 0xb7, 0x91, 0x4b, 0x85, 0x0b, 0x4a, 0xa3, 0x6b, 0x30, 0xc9, 0x56, 0x42, 0xbd, 0xed, 0xfb, 0xf5, - 0xd0, 0xf7, 0x9a, 0x07, 0xd5, 0x09, 0xc6, 0xf0, 0x63, 0xd2, 0xf0, 0xb5, 0x66, 0xa2, 0xe9, 0x89, - 0x37, 0xfd, 0x87, 0xb3, 0xa5, 0xd1, 0x26, 0x33, 0x84, 0xb4, 0x23, 0x2f, 0x39, 0xa0, 0xf3, 0x97, - 0xdc, 0x4a, 0xaa, 0x93, 0x5d, 0xcf, 0x8f, 0x3a, 0xa9, 0xb2, 0x96, 0xe8, 0x40, 0x9c, 0x65, 0x48, - 0x97, 0x76, 0x9c, 0xb8, 0x5e, 0x50, 0x9d, 0x62, 0x12, 0x43, 0xad, 0x8c, 0x06, 0x05, 0x62, 0x8e, - 0x63, 0x46, 0x10, 0xfa, 0xe3, 0x1a, 0x95, 0xa0, 0xd3, 0x8c, 0x30, 0x35, 0x82, 0x48, 0x04, 0x4e, - 0x69, 0xe8, 0xb6, 0x9c, 0x24, 0x07, 0x55, 0xc4, 0x48, 0xd5, 0x72, 0xd9, 0xd8, 0x78, 0x03, 0x53, - 0x38, 0xba, 0x02, 0xc3, 0x24, 0xd8, 0x5f, 0x8d, 0xc2, 0xbd, 0xea, 0xa9, 0xe2, 0x35, 0xbb, 0xc2, - 0x49, 0xb8, 0x40, 0x4f, 0x0f, 0x00, 0x02, 0x8c, 0x25, 0x0b, 0x74, 0x0b, 0xaa, 0x39, 0x23, 0xc2, - 0x07, 0x60, 0x86, 0x0d, 0xc0, 0xcb, 0xa2, 0x6c, 0x75, 0xa3, 0x80, 0xee, 0xa8, 0x0b, 0x0e, 0x17, - 0x72, 0xb7, 0x37, 0x61, 0x42, 0x09, 0x16, 0x36, 0xb6, 0x68, 0x0e, 0x06, 0xa9, 0xc4, 0x94, 0x47, - 0xea, 0x0a, 0xed, 0x4a, 0x66, 0x9a, 0xc2, 0x1c, 0xce, 0xba, 0xd2, 0x7b, 0x8f, 0x2c, 0x1d, 0x24, - 0x84, 0x1f, 0x8b, 0xca, 0x5a, 0x57, 0x4a, 0x04, 0x4e, 0x69, 0xec, 0xff, 0xc3, 0x15, 0x93, 0x54, - 0x7a, 0xf5, 0x21, 0xaf, 0x9f, 0x82, 0x91, 0x9d, 0x30, 0x4e, 0x28, 0x35, 0xab, 0x63, 0x30, 0x55, - 0x45, 0x2e, 0x09, 0x38, 0x56, 0x14, 0xe8, 0x25, 0x18, 0x6f, 0xea, 0x15, 0x88, 0xcd, 0xe6, 0xb4, - 0x28, 0x62, 0xd6, 0x8e, 0x4d, 0x5a, 0xf4, 0x22, 0x8c, 0xb0, 0x0b, 0x8a, 0x66, 0xe8, 0x8b, 0x03, - 0x98, 0xdc, 0x31, 0x47, 0xea, 0x02, 0x7e, 0xa4, 0xfd, 0xc6, 0x8a, 0x9a, 0x1e, 0x8a, 0x69, 0x13, - 0xd6, 0xea, 0x42, 0xcc, 0xab, 0x43, 0xf1, 0x25, 0x06, 0xc5, 0x02, 0x6b, 0xff, 0xb5, 0x92, 0xd6, - 0xcb, 0xf4, 0x48, 0x41, 0x50, 0x1d, 0x86, 0x6f, 0x3a, 0x5e, 0xe2, 0x05, 0xdb, 0x62, 0x3f, 0x7f, - 0xbc, 0xab, 0xcc, 0x67, 0x85, 0x5e, 0xe7, 0x05, 0xf8, 0xae, 0x24, 0xfe, 0x60, 0xc9, 0x86, 0x72, - 0x8c, 0xda, 0x41, 0x40, 0x39, 0x96, 0xfa, 0xe5, 0x88, 0x79, 0x01, 0xce, 0x51, 0xfc, 0xc1, 0x92, - 0x0d, 0x7a, 0x0b, 0x40, 0xce, 0x1b, 0xe2, 0x8a, 0x8b, 0x81, 0xa7, 0x7a, 0x33, 0xdd, 0x50, 0x65, - 0x96, 0x26, 0xe8, 0x9e, 0x97, 0xfe, 0xc7, 0x1a, 0x3f, 0x3b, 0x61, 0x7a, 0x4f, 0x67, 0x63, 0xd0, - 0xe7, 0xe8, 0x52, 0x75, 0xa2, 0x84, 0xb8, 0x8b, 0x89, 0xe8, 0x9c, 0x27, 0xfa, 0x53, 0x5b, 0x37, - 0xbc, 0x3d, 0xa2, 0x2f, 0x6b, 0xc1, 0x04, 0xa7, 0xfc, 0xec, 0xdf, 0x2e, 0x43, 0xb5, 0xa8, 0xb9, - 0x74, 0xd2, 0x91, 0x5b, 0x5e, 0xb2, 0x4c, 0xd5, 0x15, 0xcb, 0x9c, 0x74, 0x2b, 0x02, 0x8e, 0x15, - 0x05, 0x1d, 0xfd, 0xd8, 0xdb, 0x96, 0xa7, 0x8e, 0xc1, 0x74, 0xf4, 0x1b, 0x0c, 0x8a, 0x05, 0x96, - 0xd2, 0x45, 0xc4, 0x89, 0xc5, 0xcd, 0x93, 0x36, 0x4b, 0x30, 0x83, 0x62, 0x81, 0xd5, 0x0d, 0x06, - 0x03, 0x3d, 0x0c, 0x06, 0x46, 0x17, 0x0d, 0xde, 0xdd, 0x2e, 0x42, 0x6f, 0x03, 0x6c, 0x79, 0x81, - 0x17, 0xef, 0x30, 0xee, 0x43, 0xc7, 0xe6, 0xae, 0x94, 0x9d, 0x55, 0xc5, 0x05, 0x6b, 0x1c, 0xd1, - 0xf3, 0x30, 0xaa, 0x16, 0xe0, 0x5a, 0xad, 0x3a, 0x6c, 0x5e, 0x6b, 0xa4, 0xd2, 0xa8, 0x86, 0x75, - 0x3a, 0xfb, 0x9d, 0xec, 0x7c, 0x11, 0x2b, 0x40, 0xeb, 0x5f, 0xab, 0xdf, 0xfe, 0x2d, 0x75, 0xef, - 0x5f, 0xfb, 0xf7, 0xcb, 0x30, 0x69, 0x54, 0xd6, 0x8e, 0xfb, 0x90, 0x59, 0x17, 0xe9, 0x46, 0xe4, - 0x24, 0x44, 0xac, 0x3f, 0xbb, 0xf7, 0x52, 0xd1, 0x37, 0x2b, 0xba, 0x02, 0x78, 0x79, 0xf4, 0x36, - 0x54, 0x7c, 0x27, 0x66, 0xc6, 0x07, 0x22, 0xd6, 0x5d, 0x3f, 0xcc, 0x52, 0x45, 0xdf, 0x89, 0x13, - 0x6d, 0x2f, 0xe0, 0xbc, 0x53, 0x96, 0x74, 0xc7, 0xa4, 0xca, 0x89, 0xbc, 0xda, 0x54, 0x8d, 0xa0, - 0x1a, 0xcc, 0x01, 0xe6, 0x38, 0xf4, 0x22, 0x8c, 0x45, 0x84, 0xcd, 0x8a, 0x65, 0xaa, 0x6b, 0xb1, - 0x69, 0x36, 0x98, 0x2a, 0x65, 0x58, 0xc3, 0x61, 0x83, 0x32, 0xd5, 0xb5, 0x87, 0xba, 0xe8, 0xda, - 0x8f, 0xc3, 0x30, 0xfb, 0xa1, 0x66, 0x80, 0x1a, 0x8d, 0x35, 0x0e, 0xc6, 0x12, 0x9f, 0x9d, 0x30, - 0x23, 0x7d, 0x4e, 0x98, 0x27, 0x60, 0xa2, 0xe6, 0x90, 0xbd, 0x30, 0x58, 0x09, 0xdc, 0x56, 0xe8, - 0x05, 0x09, 0xaa, 0xc2, 0x00, 0xdb, 0x1d, 0xf8, 0xda, 0x1e, 0xa0, 0x1c, 0xf0, 0x00, 0xd5, 0x9c, - 0xed, 0x3f, 0x2c, 0xc1, 0x78, 0x8d, 0xf8, 0x24, 0x21, 0xfc, 0xac, 0x11, 0xa3, 0x55, 0x40, 0xdb, - 0x91, 0xd3, 0x24, 0x75, 0x12, 0x79, 0xa1, 0xab, 0x1b, 0x23, 0xcb, 0xcc, 0xe0, 0x8f, 0x2e, 0x76, - 0x60, 0x71, 0x4e, 0x09, 0xf4, 0x26, 0x8c, 0xb7, 0x22, 0x62, 0xd8, 0xd0, 0xac, 0x22, 0x75, 0xa1, - 0xae, 0x13, 0x72, 0x4d, 0xd5, 0x00, 0x61, 0x93, 0x15, 0xfa, 0x0c, 0x4c, 0x85, 0x51, 0x6b, 0xc7, - 0x09, 0x6a, 0xa4, 0x45, 0x02, 0x97, 0xaa, 0xe2, 0xc2, 0x46, 0x30, 0x73, 0xfb, 0x70, 0x6e, 0xea, - 0x5a, 0x06, 0x87, 0x3b, 0xa8, 0xd1, 0x9b, 0x30, 0xdd, 0x8a, 0xc2, 0x96, 0xb3, 0xcd, 0x26, 0x8a, - 0xd0, 0x38, 0xb8, 0xf4, 0x79, 0xea, 0xf6, 0xe1, 0xdc, 0x74, 0x3d, 0x8b, 0x3c, 0x3a, 0x9c, 0x3b, - 0xc5, 0x3a, 0x8a, 0x42, 0x52, 0x24, 0xee, 0x64, 0x63, 0x6f, 0xc3, 0xe9, 0x5a, 0x78, 0x33, 0xb8, - 0xe9, 0x44, 0xee, 0x62, 0x7d, 0x4d, 0x3b, 0xdc, 0x5f, 0x95, 0x87, 0x4b, 0x7e, 0xfd, 0x9a, 0xbb, - 0x4f, 0x69, 0x25, 0xb9, 0xfa, 0xbf, 0xea, 0xf9, 0xa4, 0xc0, 0x88, 0xf0, 0x37, 0x4b, 0x46, 0x4d, - 0x29, 0xbd, 0xb2, 0xfb, 0x5b, 0x85, 0x76, 0xff, 0xd7, 0x60, 0x64, 0xcb, 0x23, 0xbe, 0x8b, 0xc9, - 0x96, 0x18, 0x99, 0xc7, 0x8a, 0x6f, 0x94, 0x56, 0x29, 0xa5, 0x34, 0x1a, 0xf1, 0xa3, 0xe9, 0xaa, - 0x28, 0x8c, 0x15, 0x1b, 0xb4, 0x0b, 0x53, 0xf2, 0xec, 0x23, 0xb1, 0x62, 0x11, 0x3f, 0xde, 0xed, - 0x40, 0x65, 0x32, 0x67, 0x03, 0x88, 0x33, 0x6c, 0x70, 0x07, 0x63, 0x7a, 0x16, 0xdd, 0xa3, 0xdb, - 0xd5, 0x00, 0x9b, 0xd2, 0xec, 0x2c, 0xca, 0x8e, 0xd5, 0x0c, 0x6a, 0x7f, 0xcd, 0x82, 0xfb, 0x3b, - 0x7a, 0x46, 0x98, 0x17, 0xee, 0xf2, 0x28, 0x64, 0x8f, 0xfb, 0xa5, 0xde, 0xc7, 0x7d, 0xfb, 0xd7, - 0x2d, 0x98, 0x59, 0xd9, 0x6b, 0x25, 0x07, 0x35, 0xcf, 0xbc, 0x9b, 0x78, 0x01, 0x86, 0xf6, 0x88, - 0xeb, 0xb5, 0xf7, 0xc4, 0xc8, 0xcd, 0x49, 0x91, 0xbe, 0xce, 0xa0, 0x47, 0x87, 0x73, 0xe3, 0x8d, - 0x24, 0x8c, 0x9c, 0x6d, 0xc2, 0x01, 0x58, 0x90, 0xb3, 0x8d, 0xd1, 0x7b, 0x8f, 0x5c, 0xf1, 0xf6, - 0x3c, 0x79, 0x43, 0xd8, 0xd5, 0xe4, 0x35, 0x2f, 0x3b, 0x74, 0xfe, 0xb5, 0xb6, 0x13, 0x24, 0x5e, - 0x72, 0x20, 0xae, 0x5d, 0x24, 0x13, 0x9c, 0xf2, 0xb3, 0xbf, 0x67, 0xc1, 0xa4, 0x94, 0x25, 0x8b, - 0xae, 0x1b, 0x91, 0x38, 0x46, 0xb3, 0x50, 0xf2, 0x5a, 0xa2, 0x95, 0x20, 0x5a, 0x59, 0x5a, 0xab, - 0xe3, 0x92, 0xd7, 0x42, 0x75, 0xa8, 0xf0, 0x8b, 0xc6, 0x74, 0x72, 0xf5, 0x75, 0x5d, 0xc9, 0x5a, - 0xb0, 0x21, 0x4b, 0xe2, 0x94, 0x89, 0xd4, 0x8a, 0xd9, 0x3e, 0x54, 0x36, 0xef, 0x6c, 0x2e, 0x09, - 0x38, 0x56, 0x14, 0xe8, 0x3c, 0x8c, 0x04, 0xa1, 0xcb, 0xef, 0x7d, 0xf9, 0x9a, 0x66, 0x53, 0xf6, - 0xaa, 0x80, 0x61, 0x85, 0xb5, 0x7f, 0xce, 0x82, 0x31, 0xf9, 0x65, 0x7d, 0x2a, 0xe8, 0x74, 0x69, - 0xa5, 0xca, 0x79, 0xba, 0xb4, 0xa8, 0x82, 0xcd, 0x30, 0x86, 0x5e, 0x5d, 0x3e, 0x8e, 0x5e, 0x6d, - 0x7f, 0xb5, 0x04, 0x13, 0xb2, 0x39, 0x8d, 0xf6, 0x66, 0x4c, 0x12, 0xb4, 0x01, 0x15, 0x87, 0x77, - 0x39, 0x91, 0x33, 0xf6, 0x91, 0xfc, 0x13, 0x97, 0x31, 0x3e, 0xa9, 0xaa, 0xb3, 0x28, 0x4b, 0xe3, - 0x94, 0x11, 0xf2, 0x61, 0x3a, 0x08, 0x13, 0xb6, 0xed, 0x29, 0x7c, 0xb7, 0x7b, 0x81, 0x2c, 0xf7, - 0x33, 0x82, 0xfb, 0xf4, 0xd5, 0x2c, 0x17, 0xdc, 0xc9, 0x18, 0xad, 0x48, 0x2b, 0x4f, 0x99, 0xd5, - 0x70, 0xae, 0x5b, 0x0d, 0xc5, 0x46, 0x1e, 0xfb, 0x77, 0x2d, 0xa8, 0x48, 0xb2, 0x93, 0xb8, 0x02, - 0x5a, 0x87, 0xe1, 0x98, 0x0d, 0x82, 0xec, 0x1a, 0xbb, 0x5b, 0xc3, 0xf9, 0x78, 0xa5, 0xbb, 0x39, - 0xff, 0x1f, 0x63, 0xc9, 0x83, 0x99, 0xa9, 0x55, 0xf3, 0x3f, 0x24, 0x66, 0x6a, 0xd5, 0x9e, 0x82, - 0x1d, 0xe6, 0xbf, 0xb0, 0x36, 0x6b, 0x67, 0x79, 0xaa, 0x74, 0xb6, 0x22, 0xb2, 0xe5, 0xdd, 0xca, - 0x2a, 0x9d, 0x75, 0x06, 0xc5, 0x02, 0x8b, 0xde, 0x82, 0xb1, 0xa6, 0xb4, 0xee, 0xa6, 0x62, 0xe0, - 0xd1, 0xae, 0xb6, 0x72, 0x75, 0xad, 0xc2, 0x7d, 0xc2, 0x96, 0xb5, 0xf2, 0xd8, 0xe0, 0x66, 0x5e, - 0xcc, 0x97, 0x7b, 0x5d, 0xcc, 0xa7, 0x7c, 0x0b, 0xaf, 0x96, 0xed, 0x5f, 0xb6, 0x60, 0x88, 0xdb, - 0x08, 0xfb, 0x33, 0xaa, 0x6a, 0xd7, 0x44, 0x69, 0xdf, 0xdd, 0xa0, 0x40, 0x71, 0x6b, 0x84, 0xd6, - 0xa1, 0xc2, 0x7e, 0x30, 0x5b, 0x49, 0xb9, 0xd8, 0x19, 0x8e, 0xd7, 0xaa, 0x37, 0xf0, 0x86, 0x2c, - 0x86, 0x53, 0x0e, 0xf6, 0x2f, 0x94, 0xa9, 0xa8, 0x4a, 0x49, 0x8d, 0x1d, 0xdc, 0xba, 0x77, 0x3b, - 0x78, 0xe9, 0x5e, 0xed, 0xe0, 0xdb, 0x30, 0xd9, 0xd4, 0xee, 0xa4, 0xd2, 0x91, 0x3c, 0xdf, 0x75, - 0x92, 0x68, 0xd7, 0x57, 0xdc, 0x4e, 0xb6, 0x6c, 0x32, 0xc1, 0x59, 0xae, 0xe8, 0x73, 0x30, 0xc6, - 0xc7, 0x59, 0xd4, 0x32, 0xc0, 0x6a, 0xf9, 0x58, 0xf1, 0x7c, 0xd1, 0xab, 0x60, 0x33, 0xb1, 0xa1, - 0x15, 0xc7, 0x06, 0x33, 0xfb, 0xcb, 0x83, 0x30, 0xb8, 0xb2, 0x4f, 0x82, 0xe4, 0x04, 0x04, 0x52, - 0x13, 0x26, 0xbc, 0x60, 0x3f, 0xf4, 0xf7, 0x89, 0xcb, 0xf1, 0xc7, 0xd9, 0x5c, 0xef, 0x13, 0xac, - 0x27, 0xd6, 0x0c, 0x16, 0x38, 0xc3, 0xf2, 0x5e, 0x9c, 0xda, 0x2f, 0xc2, 0x10, 0x1f, 0x7b, 0x71, - 0x64, 0xcf, 0xb5, 0x80, 0xb3, 0x4e, 0x14, 0xab, 0x20, 0xb5, 0x28, 0x70, 0x93, 0xbb, 0x28, 0x8e, - 0xde, 0x81, 0x89, 0x2d, 0x2f, 0x8a, 0x13, 0x7a, 0xdc, 0x8e, 0x13, 0x67, 0xaf, 0x75, 0x07, 0xa7, - 0x74, 0xd5, 0x0f, 0xab, 0x06, 0x27, 0x9c, 0xe1, 0x8c, 0xb6, 0x61, 0x9c, 0x1e, 0x1c, 0xd3, 0xaa, - 0x86, 0x8f, 0x5d, 0x95, 0x32, 0xc3, 0x5d, 0xd1, 0x19, 0x61, 0x93, 0x2f, 0x15, 0x26, 0x4d, 0x76, - 0xd0, 0x1c, 0x61, 0x1a, 0x85, 0x12, 0x26, 0xfc, 0x84, 0xc9, 0x71, 0x54, 0x26, 0x31, 0x5f, 0x8e, - 0x8a, 0x29, 0x93, 0x52, 0x8f, 0x0d, 0xfb, 0xeb, 0x74, 0x77, 0xa4, 0x7d, 0x78, 0x02, 0x5b, 0xcb, - 0x2b, 0xe6, 0xd6, 0x72, 0xa6, 0x70, 0x3c, 0x0b, 0xb6, 0x95, 0xcf, 0xc3, 0xa8, 0x36, 0xdc, 0x68, - 0x01, 0x2a, 0x4d, 0xe9, 0x78, 0x20, 0xa4, 0xae, 0x52, 0x5f, 0x94, 0x47, 0x02, 0x4e, 0x69, 0x68, - 0x6f, 0x50, 0x65, 0x2f, 0xeb, 0xd6, 0x44, 0x55, 0x41, 0xcc, 0x30, 0xf6, 0xb3, 0x00, 0x2b, 0xb7, - 0x48, 0x73, 0x91, 0x1f, 0xbc, 0xb4, 0xfb, 0x2d, 0xab, 0xf8, 0x7e, 0xcb, 0xfe, 0xf7, 0x16, 0x4c, - 0xac, 0x2e, 0x1b, 0x0a, 0xf9, 0x3c, 0x00, 0xd7, 0x42, 0x5f, 0x7f, 0xfd, 0xaa, 0xb4, 0x0c, 0x73, - 0xe3, 0x9e, 0x82, 0x62, 0x8d, 0x02, 0x9d, 0x81, 0xb2, 0xdf, 0x0e, 0x84, 0x72, 0x38, 0x7c, 0xfb, - 0x70, 0xae, 0x7c, 0xa5, 0x1d, 0x60, 0x0a, 0xd3, 0x3c, 0x89, 0xca, 0x7d, 0x7b, 0x12, 0xf5, 0x74, - 0xc1, 0x46, 0x73, 0x30, 0x78, 0xf3, 0xa6, 0xe7, 0xc6, 0xd5, 0xc1, 0xd4, 0x6a, 0xfd, 0xfa, 0xeb, - 0x6b, 0xb5, 0x18, 0x73, 0xb8, 0xfd, 0x17, 0xca, 0x30, 0xb5, 0xea, 0x93, 0x5b, 0xc6, 0x67, 0x3d, - 0x0a, 0x43, 0x6e, 0xe4, 0xed, 0x93, 0x28, 0xbb, 0x8b, 0xd7, 0x18, 0x14, 0x0b, 0x6c, 0xdf, 0xde, - 0x4f, 0xd7, 0x3b, 0xf7, 0xe3, 0xbb, 0xed, 0xef, 0xd5, 0xbb, 0x2b, 0xde, 0x82, 0x61, 0x7e, 0x4d, - 0xca, 0x3b, 0x63, 0xf4, 0xc2, 0x33, 0x79, 0x4d, 0xc8, 0xf6, 0xc5, 0xbc, 0x30, 0x7c, 0x70, 0x9f, - 0x11, 0x25, 0xc4, 0x04, 0x14, 0x4b, 0x96, 0xb3, 0x9f, 0x84, 0x31, 0x9d, 0xf2, 0x58, 0xce, 0x23, - 0x7f, 0xd1, 0x82, 0x53, 0xab, 0x7e, 0xd8, 0xdc, 0xcd, 0xb8, 0xa2, 0x3d, 0x0f, 0xa3, 0x74, 0x3d, - 0xc5, 0x86, 0x5b, 0xab, 0xe1, 0xe8, 0x2c, 0x50, 0x58, 0xa7, 0xd3, 0x8a, 0x5d, 0xbf, 0xbe, 0x56, - 0xcb, 0xf3, 0x8f, 0x16, 0x28, 0xac, 0xd3, 0xd9, 0xdf, 0xb5, 0xe0, 0xa1, 0x8b, 0xcb, 0x2b, 0xa9, - 0x37, 0x66, 0x87, 0x8b, 0x36, 0x55, 0xee, 0x5c, 0xad, 0x29, 0xa9, 0x72, 0x57, 0x63, 0xad, 0x10, - 0xd8, 0x0f, 0x4b, 0xf8, 0xc1, 0xaf, 0x5a, 0x70, 0xea, 0xa2, 0x97, 0x60, 0xd2, 0x0a, 0xb3, 0xce, - 0xc2, 0x11, 0x69, 0x85, 0xb1, 0x97, 0x84, 0xd1, 0x41, 0xd6, 0x59, 0x18, 0x2b, 0x0c, 0xd6, 0xa8, - 0x78, 0xcd, 0xfb, 0x5e, 0x4c, 0x5b, 0x5a, 0x32, 0x4f, 0x98, 0x58, 0xc0, 0xb1, 0xa2, 0xa0, 0x1f, - 0xe6, 0x7a, 0x11, 0xd3, 0x10, 0x0e, 0xc4, 0x72, 0x56, 0x1f, 0x56, 0x93, 0x08, 0x9c, 0xd2, 0xd8, - 0x5f, 0xb3, 0xe0, 0xf4, 0x45, 0xbf, 0x1d, 0x27, 0x24, 0xda, 0x8a, 0x8d, 0xc6, 0x3e, 0x0b, 0x15, - 0x22, 0xb5, 0x70, 0xd1, 0x56, 0xb5, 0x6f, 0x28, 0xf5, 0x9c, 0x7b, 0x2a, 0x2b, 0xba, 0x3e, 0xfc, - 0x3a, 0x8f, 0xe7, 0x8f, 0xf8, 0x8d, 0x12, 0x8c, 0x5f, 0xda, 0xd8, 0xa8, 0x5f, 0x24, 0x89, 0x10, - 0x99, 0xbd, 0x2d, 0x48, 0x58, 0x3b, 0x08, 0x77, 0xd3, 0x75, 0xda, 0x89, 0xe7, 0xcf, 0xf3, 0xd0, - 0x98, 0xf9, 0xb5, 0x20, 0xb9, 0x16, 0x35, 0x92, 0xc8, 0x0b, 0xb6, 0x73, 0x8f, 0xce, 0x52, 0xb0, - 0x97, 0x8b, 0x04, 0x3b, 0x7a, 0x16, 0x86, 0x58, 0x6c, 0x8e, 0xd4, 0x3a, 0x1e, 0x50, 0xaa, 0x02, - 0x83, 0x1e, 0x1d, 0xce, 0x55, 0xae, 0xe3, 0x35, 0xfe, 0x07, 0x0b, 0x52, 0x74, 0x1d, 0x46, 0x77, - 0x92, 0xa4, 0x75, 0x89, 0x38, 0x2e, 0x89, 0xa4, 0x74, 0x38, 0x9b, 0x27, 0x1d, 0x68, 0x27, 0x70, - 0xb2, 0x74, 0x41, 0xa5, 0xb0, 0x18, 0xeb, 0x7c, 0xec, 0x06, 0x40, 0x8a, 0xbb, 0x4b, 0xc7, 0x06, - 0xfb, 0x87, 0x16, 0x0c, 0x5f, 0x72, 0x02, 0xd7, 0x27, 0x11, 0x7a, 0x19, 0x06, 0xc8, 0x2d, 0xd2, - 0x14, 0x3b, 0x78, 0x6e, 0x83, 0xd3, 0x5d, 0x8e, 0x1b, 0xc1, 0xe8, 0x7f, 0xcc, 0x4a, 0xa1, 0x4b, - 0x30, 0x4c, 0x5b, 0x7b, 0x51, 0xf9, 0x8c, 0x3f, 0x5c, 0xf4, 0xc5, 0x6a, 0xd8, 0xf9, 0xc6, 0x28, - 0x40, 0x58, 0x16, 0x67, 0x06, 0x9d, 0x66, 0xab, 0x41, 0x05, 0x58, 0xd2, 0xed, 0xb8, 0xb5, 0xb1, - 0x5c, 0xe7, 0x44, 0x82, 0x1b, 0x37, 0xe8, 0x48, 0x20, 0x4e, 0x99, 0xd8, 0x1b, 0x50, 0xa1, 0x83, - 0xba, 0xe8, 0x7b, 0x4e, 0x77, 0x5b, 0xd2, 0x93, 0x50, 0x91, 0x76, 0x9d, 0x58, 0xb8, 0x9d, 0x33, - 0xae, 0xd2, 0xec, 0x13, 0xe3, 0x14, 0x6f, 0x6f, 0xc1, 0x0c, 0xbb, 0x24, 0x75, 0x92, 0x1d, 0x63, - 0x8d, 0xf5, 0x9e, 0xcc, 0x4f, 0x09, 0xfd, 0x8a, 0x8f, 0x4c, 0x55, 0xf3, 0x93, 0x1d, 0x93, 0x1c, - 0x35, 0x5d, 0xeb, 0x3f, 0x0d, 0xc0, 0xf4, 0x5a, 0x63, 0xb9, 0x61, 0x1a, 0x16, 0x5f, 0x84, 0x31, - 0xae, 0x09, 0xd0, 0x09, 0xed, 0xf8, 0xa2, 0x36, 0x75, 0x71, 0xb0, 0xa1, 0xe1, 0xb0, 0x41, 0x89, - 0x1e, 0x82, 0xb2, 0xf7, 0x6e, 0x90, 0x75, 0x85, 0x5b, 0x7b, 0xed, 0x2a, 0xa6, 0x70, 0x8a, 0xa6, - 0x4a, 0x05, 0x17, 0xa0, 0x0a, 0xad, 0x14, 0x8b, 0x57, 0x60, 0xc2, 0x8b, 0x9b, 0xb1, 0xb7, 0x16, - 0x50, 0xe9, 0x92, 0xc6, 0x5c, 0xa4, 0x1a, 0x3f, 0x6d, 0xaa, 0xc2, 0xe2, 0x0c, 0xb5, 0x26, 0xcd, - 0x07, 0xfb, 0x56, 0x4c, 0x7a, 0x7a, 0x5f, 0x53, 0x9d, 0xab, 0xc5, 0xbe, 0x2e, 0x66, 0x6e, 0x39, - 0x42, 0xe7, 0xe2, 0x1f, 0x1c, 0x63, 0x89, 0x43, 0x17, 0x61, 0xba, 0xb9, 0xe3, 0xb4, 0x16, 0xdb, - 0xc9, 0x4e, 0xcd, 0x8b, 0x9b, 0xe1, 0x3e, 0x89, 0x0e, 0x98, 0x26, 0x3c, 0x92, 0x1a, 0x99, 0x14, - 0x62, 0xf9, 0xd2, 0x62, 0x9d, 0x52, 0xe2, 0xce, 0x32, 0xa6, 0x0a, 0x02, 0x77, 0x4d, 0x05, 0x59, - 0x84, 0x49, 0x59, 0x57, 0x83, 0xc4, 0x6c, 0x7b, 0x18, 0x65, 0xad, 0x53, 0x21, 0x51, 0x02, 0xac, - 0xda, 0x96, 0xa5, 0x47, 0x2f, 0xc0, 0xb8, 0x17, 0x78, 0x89, 0xe7, 0x24, 0x61, 0xc4, 0x36, 0xd7, - 0x31, 0xbe, 0x61, 0x50, 0x09, 0xbf, 0xa6, 0x23, 0xb0, 0x49, 0x67, 0xbf, 0x03, 0x15, 0xe5, 0x6b, - 0x26, 0xdd, 0x25, 0xad, 0x02, 0x77, 0xc9, 0xde, 0x3b, 0x82, 0xb4, 0x98, 0x97, 0x73, 0x2d, 0xe6, - 0x7f, 0xcb, 0x82, 0xd4, 0xe5, 0x06, 0x5d, 0x82, 0x4a, 0x2b, 0x64, 0xb7, 0x66, 0x91, 0xbc, 0x8a, - 0x7e, 0x20, 0x57, 0x78, 0x70, 0x41, 0xc5, 0xfb, 0xaf, 0x2e, 0x4b, 0xe0, 0xb4, 0x30, 0x5a, 0x82, - 0xe1, 0x56, 0x44, 0x1a, 0x09, 0x0b, 0x1a, 0xe9, 0xc9, 0x87, 0xcf, 0x11, 0x4e, 0x8f, 0x65, 0x41, - 0xfb, 0x37, 0x2d, 0x00, 0x6e, 0x94, 0x76, 0x82, 0x6d, 0x72, 0x02, 0x07, 0xed, 0x1a, 0x0c, 0xc4, - 0x2d, 0xd2, 0xec, 0x76, 0x9f, 0x99, 0xb6, 0xa7, 0xd1, 0x22, 0xcd, 0xb4, 0xc3, 0xe9, 0x3f, 0xcc, - 0x4a, 0xdb, 0x3f, 0x0b, 0x30, 0x91, 0x92, 0xd1, 0x03, 0x10, 0x7a, 0xda, 0x70, 0xc9, 0x3f, 0x93, - 0x71, 0xc9, 0xaf, 0x30, 0x6a, 0xcd, 0x0b, 0xff, 0x1d, 0x28, 0xef, 0x39, 0xb7, 0xc4, 0x29, 0xeb, - 0xc9, 0xee, 0xcd, 0xa0, 0xfc, 0xe7, 0xd7, 0x9d, 0x5b, 0x5c, 0x8f, 0x7d, 0x52, 0x4e, 0x90, 0x75, - 0xe7, 0xd6, 0x11, 0xbf, 0xb5, 0x64, 0x42, 0x8a, 0x1e, 0xe6, 0xbe, 0xf8, 0x47, 0xe9, 0x7f, 0x36, - 0xed, 0x68, 0x25, 0xac, 0x2e, 0x2f, 0x10, 0x26, 0xda, 0xbe, 0xea, 0xf2, 0x82, 0x6c, 0x5d, 0x5e, - 0xd0, 0x47, 0x5d, 0x5e, 0x80, 0xde, 0x83, 0x61, 0x71, 0x1d, 0xc2, 0x7c, 0x09, 0x47, 0x2f, 0x2c, - 0xf4, 0x51, 0x9f, 0xb8, 0x4d, 0xe1, 0x75, 0x2e, 0x48, 0x3d, 0x5d, 0x40, 0x7b, 0xd6, 0x2b, 0x2b, - 0x44, 0x7f, 0xc3, 0x82, 0x09, 0xf1, 0x1b, 0x93, 0x77, 0xdb, 0x24, 0x4e, 0x84, 0x3e, 0xf0, 0x89, - 0xfe, 0xdb, 0x20, 0x0a, 0xf2, 0xa6, 0x7c, 0x42, 0x8a, 0x59, 0x13, 0xd9, 0xb3, 0x45, 0x99, 0x56, - 0xa0, 0x7f, 0x64, 0xc1, 0xcc, 0x9e, 0x73, 0x8b, 0xd7, 0xc8, 0x61, 0xd8, 0x49, 0xbc, 0x50, 0xf8, - 0x46, 0xbe, 0xdc, 0xdf, 0xf0, 0x77, 0x14, 0xe7, 0x8d, 0x94, 0x6e, 0x54, 0x33, 0x79, 0x24, 0x3d, - 0x9b, 0x9a, 0xdb, 0xae, 0xd9, 0x2d, 0x18, 0x91, 0xf3, 0x2d, 0xe7, 0x34, 0x54, 0xd3, 0x95, 0x9d, - 0x63, 0xdf, 0x46, 0x69, 0xa7, 0x27, 0x56, 0x8f, 0x98, 0x6b, 0xf7, 0xb4, 0x9e, 0x77, 0x60, 0x4c, - 0x9f, 0x63, 0xf7, 0xb4, 0xae, 0x77, 0xe1, 0x54, 0xce, 0x5c, 0xba, 0xa7, 0x55, 0xde, 0x84, 0x33, - 0x85, 0xf3, 0xe3, 0x5e, 0x56, 0x6c, 0x7f, 0xc3, 0xd2, 0xe5, 0xe0, 0x09, 0x98, 0xa7, 0x96, 0x4d, - 0xf3, 0xd4, 0xd9, 0xee, 0x2b, 0xa7, 0xc0, 0x46, 0xf5, 0x96, 0xde, 0x68, 0x2a, 0xd5, 0xd1, 0xab, - 0x30, 0xe4, 0x53, 0x88, 0xbc, 0x87, 0xb3, 0x7b, 0xaf, 0xc8, 0x54, 0x97, 0x62, 0xf0, 0x18, 0x0b, - 0x0e, 0xf6, 0xef, 0x58, 0x30, 0x70, 0x02, 0x3d, 0x81, 0xcd, 0x9e, 0x78, 0xba, 0x90, 0xb5, 0xc8, - 0x7b, 0x30, 0x8f, 0x9d, 0x9b, 0x2b, 0x32, 0xb7, 0x43, 0x41, 0xc7, 0xfc, 0xef, 0x12, 0x8c, 0xd2, - 0xaa, 0xa4, 0xc3, 0xc8, 0x4b, 0x30, 0xee, 0x3b, 0x9b, 0xc4, 0x97, 0x26, 0xf3, 0xec, 0x21, 0xf6, - 0x8a, 0x8e, 0xc4, 0x26, 0x2d, 0x2d, 0xbc, 0xa5, 0xdf, 0x1e, 0x08, 0xfd, 0x45, 0x15, 0x36, 0xae, - 0x16, 0xb0, 0x49, 0x4b, 0xcf, 0x53, 0x37, 0x9d, 0xa4, 0xb9, 0x23, 0x0e, 0xb8, 0xaa, 0xb9, 0xaf, - 0x53, 0x20, 0xe6, 0x38, 0xaa, 0xc0, 0xc9, 0xd9, 0x79, 0x83, 0x44, 0x4c, 0x81, 0xe3, 0xea, 0xb1, - 0x52, 0xe0, 0xb0, 0x89, 0xc6, 0x59, 0xfa, 0x9c, 0xd8, 0xbc, 0x41, 0xe6, 0x0e, 0xd3, 0x47, 0x6c, - 0x1e, 0xaa, 0xc3, 0x8c, 0x17, 0x34, 0xfd, 0xb6, 0x4b, 0xae, 0x07, 0x5c, 0xbb, 0xf3, 0xbd, 0xf7, - 0x88, 0x2b, 0x14, 0x68, 0xe5, 0xb9, 0xb4, 0x96, 0x43, 0x83, 0x73, 0x4b, 0xda, 0xff, 0x1f, 0x9c, - 0xba, 0x12, 0x3a, 0xee, 0x92, 0xe3, 0x3b, 0x41, 0x93, 0x44, 0x6b, 0xc1, 0x76, 0xcf, 0x0b, 0x79, - 0xfd, 0xfa, 0xbc, 0xd4, 0xeb, 0xfa, 0xdc, 0xde, 0x01, 0xa4, 0x57, 0x20, 0xdc, 0xc0, 0x30, 0x0c, - 0x7b, 0xbc, 0x2a, 0x31, 0xfd, 0x1f, 0xcb, 0xd7, 0xae, 0x3b, 0x5a, 0xa6, 0x39, 0x38, 0x71, 0x00, - 0x96, 0x8c, 0xec, 0x17, 0x21, 0x37, 0x36, 0xa3, 0xf7, 0x51, 0xda, 0x7e, 0x1e, 0xa6, 0x59, 0xc9, - 0xe3, 0x1d, 0xf3, 0xec, 0xbf, 0x62, 0xc1, 0xe4, 0xd5, 0x4c, 0x34, 0xed, 0xa3, 0x30, 0xc4, 0x33, - 0x9c, 0x64, 0x8d, 0x5e, 0x0d, 0x06, 0xc5, 0x02, 0x7b, 0xd7, 0x6d, 0x2e, 0x3f, 0xb2, 0xa0, 0xa2, - 0x42, 0xdf, 0x4f, 0x40, 0xa9, 0x5d, 0x36, 0x94, 0xda, 0x5c, 0x5b, 0x80, 0x6a, 0x4e, 0x91, 0x4e, - 0x8b, 0x2e, 0xab, 0xb8, 0xd0, 0x2e, 0x66, 0x80, 0x94, 0x0d, 0x8f, 0x22, 0x9c, 0x30, 0x83, 0x47, - 0x65, 0xa4, 0x28, 0xbb, 0x11, 0x57, 0xb4, 0x1f, 0x92, 0x1b, 0x71, 0xd5, 0x9e, 0x02, 0xe9, 0x57, - 0xd7, 0x9a, 0xcc, 0x76, 0x85, 0x4f, 0x33, 0xaf, 0x51, 0xb6, 0x36, 0x55, 0x38, 0xf6, 0x9c, 0xf0, - 0x02, 0x15, 0xd0, 0x23, 0x26, 0xc8, 0xc4, 0x3f, 0x9e, 0xa6, 0x20, 0x2d, 0x62, 0x5f, 0x82, 0xc9, - 0x4c, 0x87, 0xa1, 0xe7, 0x61, 0xb0, 0xb5, 0xe3, 0xc4, 0x24, 0xe3, 0x05, 0x34, 0x58, 0xa7, 0xc0, - 0xa3, 0xc3, 0xb9, 0x09, 0x55, 0x80, 0x41, 0x30, 0xa7, 0xb6, 0xff, 0xbb, 0x05, 0x03, 0x57, 0x43, - 0xf7, 0x24, 0x26, 0xd3, 0x2b, 0xc6, 0x64, 0x7a, 0xb0, 0x28, 0xc9, 0x4b, 0xe1, 0x3c, 0x5a, 0xcd, - 0xcc, 0xa3, 0xb3, 0x85, 0x1c, 0xba, 0x4f, 0xa1, 0x3d, 0x18, 0x65, 0xa9, 0x63, 0x84, 0x57, 0xd2, - 0xb3, 0xc6, 0xf9, 0x6a, 0x2e, 0x73, 0xbe, 0x9a, 0xd4, 0x48, 0xb5, 0x53, 0xd6, 0xe3, 0x30, 0x2c, - 0x3c, 0x63, 0xb2, 0xfe, 0xb1, 0x82, 0x16, 0x4b, 0xbc, 0xfd, 0xcb, 0x65, 0x30, 0x52, 0xd5, 0xa0, - 0xdf, 0xb5, 0x60, 0x3e, 0xe2, 0x11, 0x41, 0x6e, 0xad, 0x1d, 0x79, 0xc1, 0x76, 0xa3, 0xb9, 0x43, - 0xdc, 0xb6, 0xef, 0x05, 0xdb, 0x6b, 0xdb, 0x41, 0xa8, 0xc0, 0x2b, 0xb7, 0x48, 0xb3, 0xcd, 0xec, - 0xe0, 0x3d, 0xf2, 0xe2, 0xa8, 0x9b, 0xe7, 0x0b, 0xb7, 0x0f, 0xe7, 0xe6, 0xf1, 0xb1, 0x78, 0xe3, - 0x63, 0xb6, 0x05, 0x7d, 0xd7, 0x82, 0x05, 0x9e, 0xc1, 0xa5, 0xff, 0xf6, 0x77, 0x39, 0x8d, 0xd6, - 0x25, 0xab, 0x94, 0xc9, 0x06, 0x89, 0xf6, 0x96, 0x5e, 0x10, 0x1d, 0xba, 0x50, 0x3f, 0x5e, 0x5d, - 0xf8, 0xb8, 0x8d, 0xb3, 0xff, 0x65, 0x19, 0xc6, 0x69, 0x2f, 0xa6, 0x51, 0xf0, 0xcf, 0x1b, 0x53, - 0xe2, 0xe1, 0xcc, 0x94, 0x98, 0x36, 0x88, 0xef, 0x4e, 0x00, 0x7c, 0x0c, 0xd3, 0xbe, 0x13, 0x27, - 0x97, 0x88, 0x13, 0x25, 0x9b, 0xc4, 0x61, 0x57, 0xbd, 0x62, 0x9a, 0x1f, 0xe7, 0xf6, 0x58, 0x99, - 0xbf, 0xae, 0x64, 0x99, 0xe1, 0x4e, 0xfe, 0x68, 0x1f, 0x10, 0xbb, 0x56, 0x8e, 0x9c, 0x20, 0xe6, - 0xdf, 0xe2, 0x09, 0x1b, 0xf9, 0xf1, 0x6a, 0x9d, 0x15, 0xb5, 0xa2, 0x2b, 0x1d, 0xdc, 0x70, 0x4e, - 0x0d, 0x9a, 0xbb, 0xc0, 0x60, 0xbf, 0xee, 0x02, 0x43, 0x3d, 0x9c, 0xd0, 0xf7, 0x60, 0x4a, 0x8c, - 0xca, 0x96, 0xb7, 0x2d, 0x36, 0xe9, 0x37, 0x32, 0xee, 0x44, 0x56, 0xff, 0x8e, 0x0f, 0x3d, 0x7c, - 0x89, 0xec, 0x9f, 0x81, 0x53, 0xb4, 0x3a, 0xd3, 0x65, 0x3a, 0x46, 0x04, 0x26, 0x77, 0xdb, 0x9b, - 0xc4, 0x27, 0x89, 0x84, 0x89, 0x4a, 0x73, 0xd5, 0x7e, 0xb3, 0x74, 0xaa, 0x5b, 0x5e, 0x36, 0x59, - 0xe0, 0x2c, 0x4f, 0xfb, 0x57, 0x2c, 0x60, 0x8e, 0x89, 0x27, 0xb0, 0xfd, 0x7d, 0xca, 0xdc, 0xfe, - 0xaa, 0x45, 0x12, 0xa8, 0x60, 0xe7, 0x7b, 0x8e, 0x0f, 0x4b, 0x3d, 0x0a, 0x6f, 0x1d, 0x48, 0xdd, - 0xbf, 0xb7, 0xc6, 0xf5, 0xbf, 0x2c, 0xbe, 0x20, 0x55, 0x80, 0x24, 0xfa, 0x02, 0x8c, 0x34, 0x9d, - 0x96, 0xd3, 0xe4, 0x39, 0xc2, 0x0a, 0xad, 0x3f, 0x46, 0xa1, 0xf9, 0x65, 0x51, 0x82, 0x5b, 0x33, - 0x3e, 0x2e, 0xbf, 0x52, 0x82, 0x7b, 0x5a, 0x30, 0x54, 0x95, 0xb3, 0xbb, 0x30, 0x6e, 0x30, 0xbb, - 0xa7, 0x47, 0xdf, 0x2f, 0xf0, 0xed, 0x42, 0x9d, 0x58, 0xf6, 0x60, 0x3a, 0xd0, 0xfe, 0x53, 0xe1, - 0x28, 0xd5, 0xe9, 0x8f, 0xf6, 0xda, 0x10, 0x98, 0x24, 0xd5, 0x1c, 0x2f, 0x33, 0x6c, 0x70, 0x27, + 0x75, 0x18, 0xac, 0x9e, 0xc1, 0x6b, 0x0e, 0xde, 0x77, 0xb1, 0xe4, 0x10, 0x24, 0x17, 0xcb, 0xa6, + 0x44, 0x2e, 0x5f, 0x80, 0xb8, 0x24, 0x45, 0x5a, 0xa4, 0x68, 0x03, 0x18, 0x60, 0x17, 0xdc, 0xc5, + 0xee, 0xf0, 0x0e, 0x76, 0x69, 0x52, 0x34, 0x3f, 0x35, 0xa6, 0x2f, 0x80, 0x26, 0x1a, 0xdd, 0xc3, + 0xee, 0x1e, 0xec, 0x82, 0x65, 0x57, 0x7d, 0x51, 0x64, 0xe5, 0x21, 0xff, 0x70, 0x25, 0xaa, 0xc4, + 0xb1, 0x54, 0x4e, 0x55, 0x1e, 0x65, 0x2b, 0x4e, 0x52, 0x71, 0xe4, 0xd8, 0x8e, 0xe4, 0x54, 0x1c, + 0xe7, 0x51, 0xf2, 0x1f, 0xc5, 0xce, 0x1f, 0xa9, 0x2a, 0x15, 0xd8, 0x5a, 0xa5, 0x92, 0xf2, 0x8f, + 0xa4, 0x92, 0xf8, 0x97, 0x11, 0x27, 0x4a, 0xdd, 0x67, 0xdf, 0xdb, 0xd3, 0x3d, 0x33, 0x58, 0x62, + 0x41, 0x4a, 0xe5, 0x7f, 0x33, 0xe7, 0x9c, 0x7b, 0xee, 0xed, 0xfb, 0x38, 0xf7, 0xdc, 0x73, 0xcf, + 0x39, 0x17, 0x5e, 0xde, 0x7d, 0x29, 0x9e, 0xf7, 0xc2, 0x85, 0xdd, 0xf6, 0x26, 0x89, 0x02, 0x92, + 0x90, 0x78, 0x61, 0x9f, 0x04, 0x6e, 0x18, 0x2d, 0x08, 0x84, 0xd3, 0xf2, 0x16, 0x9a, 0x61, 0x44, + 0x16, 0xf6, 0x9f, 0x5d, 0xd8, 0x26, 0x01, 0x89, 0x9c, 0x84, 0xb8, 0xf3, 0xad, 0x28, 0x4c, 0x42, + 0x84, 0x38, 0xcd, 0xbc, 0xd3, 0xf2, 0xe6, 0x29, 0xcd, 0xfc, 0xfe, 0xb3, 0xb3, 0xcf, 0x6c, 0x7b, + 0xc9, 0x4e, 0x7b, 0x73, 0xbe, 0x19, 0xee, 0x2d, 0x6c, 0x87, 0xdb, 0xe1, 0x02, 0x23, 0xdd, 0x6c, + 0x6f, 0xb1, 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x59, 0xcc, 0xae, 0xa7, 0xd5, 0x90, 0xdb, 0x09, 0x09, + 0x62, 0x2f, 0x0c, 0xe2, 0x67, 0x9c, 0x96, 0x17, 0x93, 0x68, 0x9f, 0x44, 0x0b, 0xad, 0xdd, 0x6d, + 0x8a, 0x8b, 0x4d, 0x82, 0x85, 0xfd, 0x67, 0x37, 0x49, 0xe2, 0x74, 0xb4, 0x68, 0xf6, 0xf9, 0x94, + 0xdd, 0x9e, 0xd3, 0xdc, 0xf1, 0x02, 0x12, 0x1d, 0x48, 0x1e, 0x0b, 0x11, 0x89, 0xc3, 0x76, 0xd4, + 0x24, 0xc7, 0x2a, 0x15, 0x2f, 0xec, 0x91, 0xc4, 0xc9, 0xf9, 0xfa, 0xd9, 0x85, 0xa2, 0x52, 0x51, + 0x3b, 0x48, 0xbc, 0xbd, 0xce, 0x6a, 0x3e, 0xd5, 0xab, 0x40, 0xdc, 0xdc, 0x21, 0x7b, 0x4e, 0x47, + 0xb9, 0xe7, 0x8a, 0xca, 0xb5, 0x13, 0xcf, 0x5f, 0xf0, 0x82, 0x24, 0x4e, 0xa2, 0x6c, 0x21, 0xfb, + 0x3b, 0x16, 0x9c, 0x5f, 0x7c, 0xa3, 0xb1, 0xe2, 0x3b, 0x71, 0xe2, 0x35, 0x97, 0xfc, 0xb0, 0xb9, + 0xdb, 0x48, 0xc2, 0x88, 0xdc, 0x0c, 0xfd, 0xf6, 0x1e, 0x69, 0xb0, 0x8e, 0x40, 0x4f, 0xc3, 0xc8, + 0x3e, 0xfb, 0xbf, 0x56, 0xab, 0x5a, 0xe7, 0xad, 0x0b, 0x95, 0xa5, 0xa9, 0x6f, 0x1d, 0xce, 0x7d, + 0xec, 0xce, 0xe1, 0xdc, 0xc8, 0x4d, 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x06, 0x43, 0x5b, 0xf1, 0xc6, + 0x41, 0x8b, 0x54, 0x4b, 0x8c, 0x76, 0x42, 0xd0, 0x0e, 0xad, 0x36, 0x28, 0x14, 0x0b, 0x2c, 0x5a, + 0x80, 0x4a, 0xcb, 0x89, 0x12, 0x2f, 0xf1, 0xc2, 0xa0, 0x5a, 0x3e, 0x6f, 0x5d, 0x18, 0x5c, 0x9a, + 0x16, 0xa4, 0x95, 0xba, 0x44, 0xe0, 0x94, 0x86, 0x36, 0x23, 0x22, 0x8e, 0x7b, 0x3d, 0xf0, 0x0f, + 0xaa, 0x03, 0xe7, 0xad, 0x0b, 0x23, 0x69, 0x33, 0xb0, 0x80, 0x63, 0x45, 0x61, 0xff, 0x62, 0x09, + 0x46, 0x16, 0xb7, 0xb6, 0xbc, 0xc0, 0x4b, 0x0e, 0xd0, 0x4d, 0x18, 0x0b, 0x42, 0x97, 0xc8, 0xff, + 0xec, 0x2b, 0x46, 0x2f, 0x9e, 0x9f, 0xef, 0x9c, 0x99, 0xf3, 0xd7, 0x34, 0xba, 0xa5, 0xa9, 0x3b, + 0x87, 0x73, 0x63, 0x3a, 0x04, 0x1b, 0x7c, 0x10, 0x86, 0xd1, 0x56, 0xe8, 0x2a, 0xb6, 0x25, 0xc6, + 0x76, 0x2e, 0x8f, 0x6d, 0x3d, 0x25, 0x5b, 0x9a, 0xbc, 0x73, 0x38, 0x37, 0xaa, 0x01, 0xb0, 0xce, + 0x04, 0x6d, 0xc2, 0x24, 0xfd, 0x1b, 0x24, 0x9e, 0xe2, 0x5b, 0x66, 0x7c, 0x1f, 0x2d, 0xe2, 0xab, + 0x91, 0x2e, 0x9d, 0xb9, 0x73, 0x38, 0x37, 0x99, 0x01, 0xe2, 0x2c, 0x43, 0xfb, 0x7d, 0x98, 0x58, + 0x4c, 0x12, 0xa7, 0xb9, 0x43, 0x5c, 0x3e, 0x82, 0xe8, 0x79, 0x18, 0x08, 0x9c, 0x3d, 0x22, 0xc6, + 0xf7, 0xbc, 0xe8, 0xd8, 0x81, 0x6b, 0xce, 0x1e, 0x39, 0x3a, 0x9c, 0x9b, 0xba, 0x11, 0x78, 0xef, + 0xb5, 0xc5, 0xac, 0xa0, 0x30, 0xcc, 0xa8, 0xd1, 0x45, 0x00, 0x97, 0xec, 0x7b, 0x4d, 0x52, 0x77, + 0x92, 0x1d, 0x31, 0xde, 0x48, 0x94, 0x85, 0x9a, 0xc2, 0x60, 0x8d, 0xca, 0xbe, 0x0d, 0x95, 0xc5, + 0xfd, 0xd0, 0x73, 0xeb, 0xa1, 0x1b, 0xa3, 0x5d, 0x98, 0x6c, 0x45, 0x64, 0x8b, 0x44, 0x0a, 0x54, + 0xb5, 0xce, 0x97, 0x2f, 0x8c, 0x5e, 0xbc, 0x90, 0xfb, 0xb1, 0x26, 0xe9, 0x4a, 0x90, 0x44, 0x07, + 0x4b, 0xf7, 0x8b, 0xfa, 0x26, 0x33, 0x58, 0x9c, 0xe5, 0x6c, 0xff, 0x9b, 0x12, 0x9c, 0x5d, 0x7c, + 0xbf, 0x1d, 0x91, 0x9a, 0x17, 0xef, 0x66, 0x67, 0xb8, 0xeb, 0xc5, 0xbb, 0xd7, 0xd2, 0x1e, 0x50, + 0x53, 0xab, 0x26, 0xe0, 0x58, 0x51, 0xa0, 0x67, 0x60, 0x98, 0xfe, 0xbe, 0x81, 0xd7, 0xc4, 0x27, + 0x9f, 0x11, 0xc4, 0xa3, 0x35, 0x27, 0x71, 0x6a, 0x1c, 0x85, 0x25, 0x0d, 0x5a, 0x87, 0xd1, 0x26, + 0x5b, 0x90, 0xdb, 0xeb, 0xa1, 0x4b, 0xd8, 0x60, 0x56, 0x96, 0x9e, 0xa2, 0xe4, 0xcb, 0x29, 0xf8, + 0xe8, 0x70, 0xae, 0xca, 0xdb, 0x26, 0x58, 0x68, 0x38, 0xac, 0x97, 0x47, 0xb6, 0x5a, 0x5f, 0x03, + 0x8c, 0x13, 0xe4, 0xac, 0xad, 0x0b, 0xda, 0x52, 0x19, 0x64, 0x4b, 0x65, 0x2c, 0x7f, 0x99, 0xa0, + 0x67, 0x61, 0x60, 0xd7, 0x0b, 0xdc, 0xea, 0x10, 0xe3, 0xf5, 0x30, 0x1d, 0xf3, 0x2b, 0x5e, 0xe0, + 0x1e, 0x1d, 0xce, 0x4d, 0x1b, 0xcd, 0xa1, 0x40, 0xcc, 0x48, 0xed, 0x3f, 0xb1, 0x60, 0x8e, 0xe1, + 0x56, 0x3d, 0x9f, 0xd4, 0x49, 0x14, 0x7b, 0x71, 0x42, 0x82, 0xc4, 0xe8, 0xd0, 0x8b, 0x00, 0x31, + 0x69, 0x46, 0x24, 0xd1, 0xba, 0x54, 0x4d, 0x8c, 0x86, 0xc2, 0x60, 0x8d, 0x8a, 0x0a, 0x84, 0x78, + 0xc7, 0x89, 0xd8, 0xfc, 0x12, 0x1d, 0xab, 0x04, 0x42, 0x43, 0x22, 0x70, 0x4a, 0x63, 0x08, 0x84, + 0x72, 0x2f, 0x81, 0x80, 0x3e, 0x03, 0x93, 0x69, 0x65, 0x71, 0xcb, 0x69, 0xca, 0x0e, 0x64, 0x4b, + 0xa6, 0x61, 0xa2, 0x70, 0x96, 0xd6, 0xfe, 0x07, 0x96, 0x98, 0x3c, 0xf4, 0xab, 0x3f, 0xe2, 0xdf, + 0x6a, 0xff, 0x96, 0x05, 0xc3, 0x4b, 0x5e, 0xe0, 0x7a, 0xc1, 0x36, 0xfa, 0x1c, 0x8c, 0xd0, 0xbd, + 0xc9, 0x75, 0x12, 0x47, 0xc8, 0xbd, 0x4f, 0x6a, 0x6b, 0x4b, 0x6d, 0x15, 0xf3, 0xad, 0xdd, 0x6d, + 0x0a, 0x88, 0xe7, 0x29, 0x35, 0x5d, 0x6d, 0xd7, 0x37, 0xdf, 0x25, 0xcd, 0x64, 0x9d, 0x24, 0x4e, + 0xfa, 0x39, 0x29, 0x0c, 0x2b, 0xae, 0xe8, 0x0a, 0x0c, 0x25, 0x4e, 0xb4, 0x4d, 0x12, 0x21, 0x00, + 0x73, 0x05, 0x15, 0x2f, 0x89, 0xe9, 0x8a, 0x24, 0x41, 0x93, 0xa4, 0xdb, 0xc2, 0x06, 0x2b, 0x8a, + 0x05, 0x0b, 0xbb, 0x09, 0x63, 0xcb, 0x4e, 0xcb, 0xd9, 0xf4, 0x7c, 0x2f, 0xf1, 0x48, 0x8c, 0x1e, + 0x87, 0xb2, 0xe3, 0xba, 0x4c, 0x2a, 0x54, 0x96, 0xce, 0xde, 0x39, 0x9c, 0x2b, 0x2f, 0xba, 0x74, + 0x7a, 0x82, 0xa2, 0x3a, 0xc0, 0x94, 0x02, 0x3d, 0x09, 0x03, 0x6e, 0x14, 0xb6, 0xaa, 0x25, 0x46, + 0x79, 0x1f, 0x9d, 0xc9, 0xb5, 0x28, 0x6c, 0x65, 0x48, 0x19, 0x8d, 0xfd, 0x3b, 0x25, 0x78, 0x68, + 0x99, 0xb4, 0x76, 0x56, 0x1b, 0x05, 0xf3, 0xf7, 0x02, 0x8c, 0xec, 0x85, 0x81, 0x97, 0x84, 0x51, + 0x2c, 0xaa, 0x66, 0x0b, 0x68, 0x5d, 0xc0, 0xb0, 0xc2, 0xa2, 0xf3, 0x30, 0xd0, 0x4a, 0x85, 0xdf, + 0x98, 0x14, 0x9c, 0x4c, 0xec, 0x31, 0x0c, 0xa5, 0x68, 0xc7, 0x24, 0x12, 0x0b, 0x5f, 0x51, 0xdc, + 0x88, 0x49, 0x84, 0x19, 0x26, 0x9d, 0x41, 0x74, 0x6e, 0x89, 0x59, 0x99, 0x99, 0x41, 0x14, 0x83, + 0x35, 0x2a, 0x54, 0x87, 0x0a, 0xff, 0x87, 0xc9, 0x16, 0x5b, 0xe3, 0x05, 0xfd, 0xde, 0x90, 0x44, + 0xa2, 0xdf, 0xc7, 0xd9, 0x14, 0x93, 0x40, 0x9c, 0x32, 0x31, 0xa6, 0xd8, 0x50, 0xcf, 0x29, 0xf6, + 0xcd, 0x12, 0x20, 0xde, 0x85, 0x3f, 0x64, 0x1d, 0x77, 0xa3, 0xb3, 0xe3, 0x72, 0x37, 0x9b, 0xab, + 0x61, 0xd3, 0xf1, 0xb3, 0xb3, 0xf6, 0xa4, 0x7a, 0xef, 0x17, 0x2c, 0x40, 0xcb, 0x5e, 0xe0, 0x92, + 0xe8, 0x14, 0x34, 0xad, 0xe3, 0xc9, 0x8e, 0xab, 0x30, 0xb1, 0xec, 0x7b, 0x24, 0x48, 0xd6, 0xea, + 0xcb, 0x61, 0xb0, 0xe5, 0x6d, 0xa3, 0x4f, 0xc3, 0x04, 0x55, 0x3c, 0xc3, 0x76, 0xd2, 0x20, 0xcd, + 0x30, 0x60, 0x7b, 0x34, 0x55, 0xd7, 0xd0, 0x9d, 0xc3, 0xb9, 0x89, 0x0d, 0x03, 0x83, 0x33, 0x94, + 0xf6, 0x7f, 0xa4, 0x1f, 0x1a, 0xee, 0xb5, 0xc2, 0x80, 0x04, 0xc9, 0x72, 0x18, 0xb8, 0x5c, 0x97, + 0xfb, 0x34, 0x0c, 0x24, 0xb4, 0xe1, 0xfc, 0x23, 0x1f, 0x93, 0x43, 0x4b, 0x9b, 0x7b, 0x74, 0x38, + 0x77, 0x5f, 0x67, 0x09, 0xf6, 0x41, 0xac, 0x0c, 0xfa, 0x31, 0x18, 0x8a, 0x13, 0x27, 0x69, 0xc7, + 0xe2, 0xb3, 0x1f, 0x91, 0x9f, 0xdd, 0x60, 0xd0, 0xa3, 0xc3, 0xb9, 0x49, 0x55, 0x8c, 0x83, 0xb0, + 0x28, 0x80, 0x9e, 0x80, 0xe1, 0x3d, 0x12, 0xc7, 0xce, 0xb6, 0xdc, 0x86, 0x27, 0x45, 0xd9, 0xe1, + 0x75, 0x0e, 0xc6, 0x12, 0x8f, 0x1e, 0x85, 0x41, 0x12, 0x45, 0x61, 0x24, 0x66, 0xd5, 0xb8, 0x20, + 0x1c, 0x5c, 0xa1, 0x40, 0xcc, 0x71, 0xf6, 0xbf, 0xb7, 0x60, 0x52, 0xb5, 0x95, 0xd7, 0x75, 0x0a, + 0xf2, 0xf6, 0x2d, 0x80, 0xa6, 0xfc, 0xc0, 0x98, 0xc9, 0xbb, 0xd1, 0x8b, 0x8f, 0xe5, 0x4d, 0xe1, + 0xce, 0x6e, 0x4c, 0x39, 0x2b, 0x50, 0x8c, 0x35, 0x6e, 0xf6, 0xbf, 0xb0, 0xe0, 0x4c, 0xe6, 0x8b, + 0xae, 0x7a, 0x71, 0x82, 0xde, 0xee, 0xf8, 0xaa, 0xf9, 0xfe, 0xbe, 0x8a, 0x96, 0x66, 0xdf, 0xa4, + 0xe6, 0x9c, 0x84, 0x68, 0x5f, 0x74, 0x19, 0x06, 0xbd, 0x84, 0xec, 0xc9, 0x8f, 0x79, 0xb4, 0xeb, + 0xc7, 0xf0, 0x56, 0xa5, 0x23, 0xb2, 0x46, 0x4b, 0x62, 0xce, 0xc0, 0xfe, 0x9f, 0x16, 0x54, 0xf8, + 0xb4, 0x5d, 0x77, 0x5a, 0xa7, 0x30, 0x16, 0x6b, 0x30, 0xc0, 0xb8, 0xf3, 0x86, 0x3f, 0x9e, 0xdf, + 0x70, 0xd1, 0x9c, 0x79, 0xaa, 0x4c, 0x71, 0xa5, 0x55, 0x09, 0x33, 0x0a, 0xc2, 0x8c, 0xc5, 0xec, + 0x8b, 0x50, 0x51, 0x04, 0x68, 0x0a, 0xca, 0xbb, 0x84, 0x1f, 0x54, 0x2a, 0x98, 0xfe, 0x44, 0x33, + 0x30, 0xb8, 0xef, 0xf8, 0x6d, 0xb1, 0xd8, 0x31, 0xff, 0xf3, 0xe9, 0xd2, 0x4b, 0x96, 0xfd, 0x0d, + 0xb6, 0xc6, 0x44, 0x25, 0x2b, 0xc1, 0xbe, 0x10, 0x26, 0xef, 0xc3, 0x8c, 0x9f, 0x23, 0xc3, 0x44, + 0x47, 0xf4, 0x2f, 0xf3, 0x1e, 0x12, 0x6d, 0x9d, 0xc9, 0xc3, 0xe2, 0xdc, 0x3a, 0xe8, 0x36, 0x10, + 0xb6, 0xe8, 0x8c, 0x72, 0x7c, 0xd6, 0x5e, 0xa1, 0x80, 0x5e, 0x17, 0x30, 0xac, 0xb0, 0x54, 0x40, + 0xcc, 0xa8, 0xc6, 0x5f, 0x21, 0x07, 0x0d, 0xe2, 0x93, 0x66, 0x12, 0x46, 0x1f, 0x6a, 0xf3, 0x1f, + 0xe6, 0xbd, 0xcf, 0xe5, 0xcb, 0xa8, 0x60, 0x50, 0xbe, 0x42, 0x0e, 0xf8, 0x50, 0xe8, 0x5f, 0x57, + 0xee, 0xfa, 0x75, 0xbf, 0x66, 0xc1, 0xb8, 0xfa, 0xba, 0x53, 0x58, 0x48, 0x4b, 0xe6, 0x42, 0x7a, + 0xb8, 0xeb, 0x7c, 0x2c, 0x58, 0x42, 0x3f, 0x60, 0x22, 0x40, 0xd0, 0xd4, 0xa3, 0x90, 0x76, 0x0d, + 0x95, 0xd9, 0x1f, 0xe6, 0x80, 0xf4, 0xf3, 0x5d, 0x57, 0xc8, 0xc1, 0x46, 0x48, 0xd5, 0x87, 0xfc, + 0xef, 0x32, 0x46, 0x6d, 0xa0, 0xeb, 0xa8, 0xfd, 0x7a, 0x09, 0xce, 0xaa, 0x1e, 0x30, 0x36, 0xe8, + 0x1f, 0xf6, 0x3e, 0x78, 0x16, 0x46, 0x5d, 0xb2, 0xe5, 0xb4, 0xfd, 0x44, 0x9d, 0x45, 0x07, 0xb9, + 0x3d, 0xa2, 0x96, 0x82, 0xb1, 0x4e, 0x73, 0x8c, 0x6e, 0xfb, 0xb7, 0xc0, 0x64, 0x6f, 0xe2, 0xd0, + 0x19, 0x4c, 0xb5, 0x37, 0xcd, 0xa2, 0x30, 0xa6, 0x5b, 0x14, 0x84, 0xf5, 0xe0, 0x51, 0x18, 0xf4, + 0xf6, 0xe8, 0x5e, 0x5c, 0x32, 0xb7, 0xd8, 0x35, 0x0a, 0xc4, 0x1c, 0x87, 0x3e, 0x01, 0xc3, 0xcd, + 0x70, 0x6f, 0xcf, 0x09, 0xdc, 0x6a, 0x99, 0xe9, 0x93, 0xa3, 0x74, 0xbb, 0x5e, 0xe6, 0x20, 0x2c, + 0x71, 0xe8, 0x21, 0x18, 0x70, 0xa2, 0xed, 0xb8, 0x3a, 0xc0, 0x68, 0x46, 0x68, 0x4d, 0x8b, 0xd1, + 0x76, 0x8c, 0x19, 0x94, 0xea, 0x89, 0xb7, 0xc2, 0x68, 0xd7, 0x0b, 0xb6, 0x6b, 0x5e, 0xc4, 0x94, + 0x3e, 0x4d, 0x4f, 0x7c, 0x43, 0x61, 0xb0, 0x46, 0x85, 0x56, 0x61, 0xb0, 0x15, 0x46, 0x49, 0x5c, + 0x1d, 0x62, 0xdd, 0xfd, 0x48, 0xc1, 0x52, 0xe2, 0x5f, 0x5b, 0x0f, 0xa3, 0x24, 0xfd, 0x00, 0xfa, + 0x2f, 0xc6, 0xbc, 0x38, 0xfa, 0x31, 0x28, 0x93, 0x60, 0xbf, 0x3a, 0xcc, 0xb8, 0xcc, 0xe6, 0x71, + 0x59, 0x09, 0xf6, 0x6f, 0x3a, 0x51, 0x2a, 0x67, 0x56, 0x82, 0x7d, 0x4c, 0xcb, 0xa0, 0x37, 0xa1, + 0x22, 0xad, 0x91, 0x71, 0x75, 0xa4, 0x78, 0x8a, 0x61, 0x41, 0x84, 0xc9, 0x7b, 0x6d, 0x2f, 0x22, + 0x7b, 0x24, 0x48, 0xe2, 0xf4, 0x3c, 0x29, 0xb1, 0x31, 0x4e, 0xb9, 0xa1, 0x37, 0x61, 0x8c, 0xeb, + 0x91, 0xeb, 0x61, 0x3b, 0x48, 0xe2, 0x6a, 0x85, 0x35, 0x2f, 0xd7, 0x74, 0x75, 0x33, 0xa5, 0x5b, + 0x9a, 0x11, 0x4c, 0xc7, 0x34, 0x60, 0x8c, 0x0d, 0x56, 0x08, 0xc3, 0xb8, 0xef, 0xed, 0x93, 0x80, + 0xc4, 0x71, 0x3d, 0x0a, 0x37, 0x49, 0x15, 0x58, 0xcb, 0x1f, 0xc8, 0xb7, 0xe8, 0x84, 0x9b, 0x64, + 0x69, 0xfa, 0xce, 0xe1, 0xdc, 0xf8, 0x55, 0xbd, 0x0c, 0x36, 0x59, 0xa0, 0x1b, 0x30, 0x41, 0x15, + 0x54, 0x2f, 0x65, 0x3a, 0xda, 0x8b, 0x29, 0xd3, 0x4e, 0xb1, 0x51, 0x08, 0x67, 0x98, 0xa0, 0xd7, + 0xa0, 0xe2, 0x7b, 0x5b, 0xa4, 0x79, 0xd0, 0xf4, 0x49, 0x75, 0x8c, 0x71, 0xcc, 0x5d, 0x56, 0x57, + 0x25, 0x11, 0x3f, 0x00, 0xa8, 0xbf, 0x38, 0x2d, 0x8e, 0x6e, 0xc2, 0x7d, 0x09, 0x89, 0xf6, 0xbc, + 0xc0, 0xa1, 0xcb, 0x41, 0xe8, 0x93, 0xcc, 0x2e, 0x36, 0xce, 0xe6, 0xdb, 0x39, 0xd1, 0x75, 0xf7, + 0x6d, 0xe4, 0x52, 0xe1, 0x82, 0xd2, 0xe8, 0x3a, 0x4c, 0xb2, 0x95, 0x50, 0x6f, 0xfb, 0x7e, 0x3d, + 0xf4, 0xbd, 0xe6, 0x41, 0x75, 0x82, 0x31, 0xfc, 0x84, 0x34, 0x7c, 0xad, 0x99, 0x68, 0x7a, 0xe2, + 0x4d, 0xff, 0xe1, 0x6c, 0x69, 0xb4, 0xc9, 0x0c, 0x21, 0xed, 0xc8, 0x4b, 0x0e, 0xe8, 0xfc, 0x25, + 0xb7, 0x93, 0xea, 0x64, 0xd7, 0xf3, 0xa3, 0x4e, 0xaa, 0xac, 0x25, 0x3a, 0x10, 0x67, 0x19, 0xd2, + 0xa5, 0x1d, 0x27, 0xae, 0x17, 0x54, 0xa7, 0x98, 0xc4, 0x50, 0x2b, 0xa3, 0x41, 0x81, 0x98, 0xe3, + 0x98, 0x11, 0x84, 0xfe, 0xb8, 0x4e, 0x25, 0xe8, 0x34, 0x23, 0x4c, 0x8d, 0x20, 0x12, 0x81, 0x53, + 0x1a, 0xba, 0x2d, 0x27, 0xc9, 0x41, 0x15, 0x31, 0x52, 0xb5, 0x5c, 0x36, 0x36, 0xde, 0xc4, 0x14, + 0x8e, 0xae, 0xc2, 0x30, 0x09, 0xf6, 0x57, 0xa3, 0x70, 0xaf, 0x7a, 0xa6, 0x78, 0xcd, 0xae, 0x70, + 0x12, 0x2e, 0xd0, 0xd3, 0x03, 0x80, 0x00, 0x63, 0xc9, 0x02, 0xdd, 0x86, 0x6a, 0xce, 0x88, 0xf0, + 0x01, 0x98, 0x61, 0x03, 0xf0, 0x8a, 0x28, 0x5b, 0xdd, 0x28, 0xa0, 0x3b, 0xea, 0x82, 0xc3, 0x85, + 0xdc, 0xed, 0x4d, 0x98, 0x50, 0x82, 0x85, 0x8d, 0x2d, 0x9a, 0x83, 0x41, 0x2a, 0x31, 0xe5, 0x91, + 0xba, 0x42, 0xbb, 0x92, 0x99, 0xa6, 0x30, 0x87, 0xb3, 0xae, 0xf4, 0xde, 0x27, 0x4b, 0x07, 0x09, + 0xe1, 0xc7, 0xa2, 0xb2, 0xd6, 0x95, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0xff, 0x72, 0xc5, 0x24, 0x95, + 0x5e, 0x7d, 0xc8, 0xeb, 0xa7, 0x61, 0x64, 0x27, 0x8c, 0x13, 0x4a, 0xcd, 0xea, 0x18, 0x4c, 0x55, + 0x91, 0xcb, 0x02, 0x8e, 0x15, 0x05, 0x7a, 0x19, 0xc6, 0x9b, 0x7a, 0x05, 0x62, 0xb3, 0x39, 0x2b, + 0x8a, 0x98, 0xb5, 0x63, 0x93, 0x16, 0xbd, 0x04, 0x23, 0xec, 0x82, 0xa2, 0x19, 0xfa, 0xe2, 0x00, + 0x26, 0x77, 0xcc, 0x91, 0xba, 0x80, 0x1f, 0x69, 0xbf, 0xb1, 0xa2, 0xa6, 0x87, 0x62, 0xda, 0x84, + 0xb5, 0xba, 0x10, 0xf3, 0xea, 0x50, 0x7c, 0x99, 0x41, 0xb1, 0xc0, 0xda, 0x7f, 0xad, 0xa4, 0xf5, + 0x32, 0x3d, 0x52, 0x10, 0x54, 0x87, 0xe1, 0x5b, 0x8e, 0x97, 0x78, 0xc1, 0xb6, 0xd8, 0xcf, 0x9f, + 0xe8, 0x2a, 0xf3, 0x59, 0xa1, 0x37, 0x78, 0x01, 0xbe, 0x2b, 0x89, 0x3f, 0x58, 0xb2, 0xa1, 0x1c, + 0xa3, 0x76, 0x10, 0x50, 0x8e, 0xa5, 0x7e, 0x39, 0x62, 0x5e, 0x80, 0x73, 0x14, 0x7f, 0xb0, 0x64, + 0x83, 0xde, 0x06, 0x90, 0xf3, 0x86, 0xb8, 0xe2, 0x62, 0xe0, 0xe9, 0xde, 0x4c, 0x37, 0x54, 0x99, + 0xa5, 0x09, 0xba, 0xe7, 0xa5, 0xff, 0xb1, 0xc6, 0xcf, 0x4e, 0x98, 0xde, 0xd3, 0xd9, 0x18, 0xf4, + 0x59, 0xba, 0x54, 0x9d, 0x28, 0x21, 0xee, 0x62, 0x22, 0x3a, 0xe7, 0xc9, 0xfe, 0xd4, 0xd6, 0x0d, + 0x6f, 0x8f, 0xe8, 0xcb, 0x5a, 0x30, 0xc1, 0x29, 0x3f, 0xfb, 0x37, 0xcb, 0x50, 0x2d, 0x6a, 0x2e, + 0x9d, 0x74, 0xe4, 0xb6, 0x97, 0x2c, 0x53, 0x75, 0xc5, 0x32, 0x27, 0xdd, 0x8a, 0x80, 0x63, 0x45, + 0x41, 0x47, 0x3f, 0xf6, 0xb6, 0xe5, 0xa9, 0x63, 0x30, 0x1d, 0xfd, 0x06, 0x83, 0x62, 0x81, 0xa5, + 0x74, 0x11, 0x71, 0x62, 0x71, 0xf3, 0xa4, 0xcd, 0x12, 0xcc, 0xa0, 0x58, 0x60, 0x75, 0x83, 0xc1, + 0x40, 0x0f, 0x83, 0x81, 0xd1, 0x45, 0x83, 0x27, 0xdb, 0x45, 0xe8, 0x1d, 0x80, 0x2d, 0x2f, 0xf0, + 0xe2, 0x1d, 0xc6, 0x7d, 0xe8, 0xd8, 0xdc, 0x95, 0xb2, 0xb3, 0xaa, 0xb8, 0x60, 0x8d, 0x23, 0x7a, + 0x01, 0x46, 0xd5, 0x02, 0x5c, 0xab, 0x55, 0x87, 0xcd, 0x6b, 0x8d, 0x54, 0x1a, 0xd5, 0xb0, 0x4e, + 0x67, 0xbf, 0x9b, 0x9d, 0x2f, 0x62, 0x05, 0x68, 0xfd, 0x6b, 0xf5, 0xdb, 0xbf, 0xa5, 0xee, 0xfd, + 0x6b, 0xff, 0x6e, 0x19, 0x26, 0x8d, 0xca, 0xda, 0x71, 0x1f, 0x32, 0xeb, 0x12, 0xdd, 0x88, 0x9c, + 0x84, 0x88, 0xf5, 0x67, 0xf7, 0x5e, 0x2a, 0xfa, 0x66, 0x45, 0x57, 0x00, 0x2f, 0x8f, 0xde, 0x81, + 0x8a, 0xef, 0xc4, 0xcc, 0xf8, 0x40, 0xc4, 0xba, 0xeb, 0x87, 0x59, 0xaa, 0xe8, 0x3b, 0x71, 0xa2, + 0xed, 0x05, 0x9c, 0x77, 0xca, 0x92, 0xee, 0x98, 0x54, 0x39, 0x91, 0x57, 0x9b, 0xaa, 0x11, 0x54, + 0x83, 0x39, 0xc0, 0x1c, 0x87, 0x5e, 0x82, 0xb1, 0x88, 0xb0, 0x59, 0xb1, 0x4c, 0x75, 0x2d, 0x36, + 0xcd, 0x06, 0x53, 0xa5, 0x0c, 0x6b, 0x38, 0x6c, 0x50, 0xa6, 0xba, 0xf6, 0x50, 0x17, 0x5d, 0xfb, + 0x09, 0x18, 0x66, 0x3f, 0xd4, 0x0c, 0x50, 0xa3, 0xb1, 0xc6, 0xc1, 0x58, 0xe2, 0xb3, 0x13, 0x66, + 0xa4, 0xcf, 0x09, 0xf3, 0x24, 0x4c, 0xd4, 0x1c, 0xb2, 0x17, 0x06, 0x2b, 0x81, 0xdb, 0x0a, 0xbd, + 0x20, 0x41, 0x55, 0x18, 0x60, 0xbb, 0x03, 0x5f, 0xdb, 0x03, 0x94, 0x03, 0x1e, 0xa0, 0x9a, 0xb3, + 0xfd, 0x07, 0x25, 0x18, 0xaf, 0x11, 0x9f, 0x24, 0x84, 0x9f, 0x35, 0x62, 0xb4, 0x0a, 0x68, 0x3b, + 0x72, 0x9a, 0xa4, 0x4e, 0x22, 0x2f, 0x74, 0x75, 0x63, 0x64, 0x99, 0x19, 0xfc, 0xd1, 0xa5, 0x0e, + 0x2c, 0xce, 0x29, 0x81, 0xde, 0x82, 0xf1, 0x56, 0x44, 0x0c, 0x1b, 0x9a, 0x55, 0xa4, 0x2e, 0xd4, + 0x75, 0x42, 0xae, 0xa9, 0x1a, 0x20, 0x6c, 0xb2, 0x42, 0x3f, 0x01, 0x53, 0x61, 0xd4, 0xda, 0x71, + 0x82, 0x1a, 0x69, 0x91, 0xc0, 0xa5, 0xaa, 0xb8, 0xb0, 0x11, 0xcc, 0xdc, 0x39, 0x9c, 0x9b, 0xba, + 0x9e, 0xc1, 0xe1, 0x0e, 0x6a, 0xf4, 0x16, 0x4c, 0xb7, 0xa2, 0xb0, 0xe5, 0x6c, 0xb3, 0x89, 0x22, + 0x34, 0x0e, 0x2e, 0x7d, 0x9e, 0xbe, 0x73, 0x38, 0x37, 0x5d, 0xcf, 0x22, 0x8f, 0x0e, 0xe7, 0xce, + 0xb0, 0x8e, 0xa2, 0x90, 0x14, 0x89, 0x3b, 0xd9, 0xd8, 0xdb, 0x70, 0xb6, 0x16, 0xde, 0x0a, 0x6e, + 0x39, 0x91, 0xbb, 0x58, 0x5f, 0xd3, 0x0e, 0xf7, 0xd7, 0xe4, 0xe1, 0x92, 0x5f, 0xbf, 0xe6, 0xee, + 0x53, 0x5a, 0x49, 0xae, 0xfe, 0xaf, 0x7a, 0x3e, 0x29, 0x30, 0x22, 0xfc, 0xcd, 0x92, 0x51, 0x53, + 0x4a, 0xaf, 0xec, 0xfe, 0x56, 0xa1, 0xdd, 0xff, 0x75, 0x18, 0xd9, 0xf2, 0x88, 0xef, 0x62, 0xb2, + 0x25, 0x46, 0xe6, 0xf1, 0xe2, 0x1b, 0xa5, 0x55, 0x4a, 0x29, 0x8d, 0x46, 0xfc, 0x68, 0xba, 0x2a, + 0x0a, 0x63, 0xc5, 0x06, 0xed, 0xc2, 0x94, 0x3c, 0xfb, 0x48, 0xac, 0x58, 0xc4, 0x4f, 0x74, 0x3b, + 0x50, 0x99, 0xcc, 0xd9, 0x00, 0xe2, 0x0c, 0x1b, 0xdc, 0xc1, 0x98, 0x9e, 0x45, 0xf7, 0xe8, 0x76, + 0x35, 0xc0, 0xa6, 0x34, 0x3b, 0x8b, 0xb2, 0x63, 0x35, 0x83, 0xda, 0x5f, 0xb5, 0xe0, 0xfe, 0x8e, + 0x9e, 0x11, 0xe6, 0x85, 0x13, 0x1e, 0x85, 0xec, 0x71, 0xbf, 0xd4, 0xfb, 0xb8, 0x6f, 0xff, 0x43, + 0x0b, 0x66, 0x56, 0xf6, 0x5a, 0xc9, 0x41, 0xcd, 0x33, 0xef, 0x26, 0x5e, 0x84, 0xa1, 0x3d, 0xe2, + 0x7a, 0xed, 0x3d, 0x31, 0x72, 0x73, 0x52, 0xa4, 0xaf, 0x33, 0xe8, 0xd1, 0xe1, 0xdc, 0x78, 0x23, + 0x09, 0x23, 0x67, 0x9b, 0x70, 0x00, 0x16, 0xe4, 0x6c, 0x63, 0xf4, 0xde, 0x27, 0x57, 0xbd, 0x3d, + 0x4f, 0xde, 0x10, 0x76, 0x35, 0x79, 0xcd, 0xcb, 0x0e, 0x9d, 0x7f, 0xbd, 0xed, 0x04, 0x89, 0x97, + 0x1c, 0x88, 0x6b, 0x17, 0xc9, 0x04, 0xa7, 0xfc, 0xec, 0xef, 0x58, 0x30, 0x29, 0x65, 0xc9, 0xa2, + 0xeb, 0x46, 0x24, 0x8e, 0xd1, 0x2c, 0x94, 0xbc, 0x96, 0x68, 0x25, 0x88, 0x56, 0x96, 0xd6, 0xea, + 0xb8, 0xe4, 0xb5, 0x50, 0x1d, 0x2a, 0xfc, 0xa2, 0x31, 0x9d, 0x5c, 0x7d, 0x5d, 0x57, 0xb2, 0x16, + 0x6c, 0xc8, 0x92, 0x38, 0x65, 0x22, 0xb5, 0x62, 0xb6, 0x0f, 0x95, 0xcd, 0x3b, 0x9b, 0xcb, 0x02, + 0x8e, 0x15, 0x05, 0xba, 0x00, 0x23, 0x41, 0xe8, 0xf2, 0x7b, 0x5f, 0xbe, 0xa6, 0xd9, 0x94, 0xbd, + 0x26, 0x60, 0x58, 0x61, 0xed, 0x9f, 0xb3, 0x60, 0x4c, 0x7e, 0x59, 0x9f, 0x0a, 0x3a, 0x5d, 0x5a, + 0xa9, 0x72, 0x9e, 0x2e, 0x2d, 0xaa, 0x60, 0x33, 0x8c, 0xa1, 0x57, 0x97, 0x8f, 0xa3, 0x57, 0xdb, + 0x5f, 0x29, 0xc1, 0x84, 0x6c, 0x4e, 0xa3, 0xbd, 0x19, 0x93, 0x04, 0x6d, 0x40, 0xc5, 0xe1, 0x5d, + 0x4e, 0xe4, 0x8c, 0x7d, 0x34, 0xff, 0xc4, 0x65, 0x8c, 0x4f, 0xaa, 0xea, 0x2c, 0xca, 0xd2, 0x38, + 0x65, 0x84, 0x7c, 0x98, 0x0e, 0xc2, 0x84, 0x6d, 0x7b, 0x0a, 0xdf, 0xed, 0x5e, 0x20, 0xcb, 0xfd, + 0x01, 0xc1, 0x7d, 0xfa, 0x5a, 0x96, 0x0b, 0xee, 0x64, 0x8c, 0x56, 0xa4, 0x95, 0xa7, 0xcc, 0x6a, + 0x38, 0xdf, 0xad, 0x86, 0x62, 0x23, 0x8f, 0xfd, 0xdb, 0x16, 0x54, 0x24, 0xd9, 0x69, 0x5c, 0x01, + 0xad, 0xc3, 0x70, 0xcc, 0x06, 0x41, 0x76, 0x8d, 0xdd, 0xad, 0xe1, 0x7c, 0xbc, 0xd2, 0xdd, 0x9c, + 0xff, 0x8f, 0xb1, 0xe4, 0xc1, 0xcc, 0xd4, 0xaa, 0xf9, 0x1f, 0x11, 0x33, 0xb5, 0x6a, 0x4f, 0xc1, + 0x0e, 0xf3, 0x5f, 0x59, 0x9b, 0xb5, 0xb3, 0x3c, 0x55, 0x3a, 0x5b, 0x11, 0xd9, 0xf2, 0x6e, 0x67, + 0x95, 0xce, 0x3a, 0x83, 0x62, 0x81, 0x45, 0x6f, 0xc3, 0x58, 0x53, 0x5a, 0x77, 0x53, 0x31, 0xf0, + 0x58, 0x57, 0x5b, 0xb9, 0xba, 0x56, 0xe1, 0x3e, 0x61, 0xcb, 0x5a, 0x79, 0x6c, 0x70, 0x33, 0x2f, + 0xe6, 0xcb, 0xbd, 0x2e, 0xe6, 0x53, 0xbe, 0x85, 0x57, 0xcb, 0xf6, 0x2f, 0x59, 0x30, 0xc4, 0x6d, + 0x84, 0xfd, 0x19, 0x55, 0xb5, 0x6b, 0xa2, 0xb4, 0xef, 0x6e, 0x52, 0xa0, 0xb8, 0x35, 0x42, 0xeb, + 0x50, 0x61, 0x3f, 0x98, 0xad, 0xa4, 0x5c, 0xec, 0x0c, 0xc7, 0x6b, 0xd5, 0x1b, 0x78, 0x53, 0x16, + 0xc3, 0x29, 0x07, 0xfb, 0xcb, 0x65, 0x2a, 0xaa, 0x52, 0x52, 0x63, 0x07, 0xb7, 0xee, 0xdd, 0x0e, + 0x5e, 0xba, 0x57, 0x3b, 0xf8, 0x36, 0x4c, 0x36, 0xb5, 0x3b, 0xa9, 0x74, 0x24, 0x2f, 0x74, 0x9d, + 0x24, 0xda, 0xf5, 0x15, 0xb7, 0x93, 0x2d, 0x9b, 0x4c, 0x70, 0x96, 0x2b, 0xfa, 0x2c, 0x8c, 0xf1, + 0x71, 0x16, 0xb5, 0x0c, 0xb0, 0x5a, 0x3e, 0x51, 0x3c, 0x5f, 0xf4, 0x2a, 0xd8, 0x4c, 0x6c, 0x68, + 0xc5, 0xb1, 0xc1, 0xcc, 0xfe, 0xe2, 0x20, 0x0c, 0xae, 0xec, 0x93, 0x20, 0x39, 0x05, 0x81, 0xd4, + 0x84, 0x09, 0x2f, 0xd8, 0x0f, 0xfd, 0x7d, 0xe2, 0x72, 0xfc, 0x71, 0x36, 0xd7, 0xfb, 0x04, 0xeb, + 0x89, 0x35, 0x83, 0x05, 0xce, 0xb0, 0xbc, 0x17, 0xa7, 0xf6, 0x4b, 0x30, 0xc4, 0xc7, 0x5e, 0x1c, + 0xd9, 0x73, 0x2d, 0xe0, 0xac, 0x13, 0xc5, 0x2a, 0x48, 0x2d, 0x0a, 0xdc, 0xe4, 0x2e, 0x8a, 0xa3, + 0x77, 0x61, 0x62, 0xcb, 0x8b, 0xe2, 0x84, 0x1e, 0xb7, 0xe3, 0xc4, 0xd9, 0x6b, 0xdd, 0xc5, 0x29, + 0x5d, 0xf5, 0xc3, 0xaa, 0xc1, 0x09, 0x67, 0x38, 0xa3, 0x6d, 0x18, 0xa7, 0x07, 0xc7, 0xb4, 0xaa, + 0xe1, 0x63, 0x57, 0xa5, 0xcc, 0x70, 0x57, 0x75, 0x46, 0xd8, 0xe4, 0x4b, 0x85, 0x49, 0x93, 0x1d, + 0x34, 0x47, 0x98, 0x46, 0xa1, 0x84, 0x09, 0x3f, 0x61, 0x72, 0x1c, 0x95, 0x49, 0xcc, 0x97, 0xa3, + 0x62, 0xca, 0xa4, 0xd4, 0x63, 0xc3, 0xfe, 0x1a, 0xdd, 0x1d, 0x69, 0x1f, 0x9e, 0xc2, 0xd6, 0xf2, + 0xaa, 0xb9, 0xb5, 0x3c, 0x50, 0x38, 0x9e, 0x05, 0xdb, 0xca, 0xe7, 0x60, 0x54, 0x1b, 0x6e, 0xb4, + 0x00, 0x95, 0xa6, 0x74, 0x3c, 0x10, 0x52, 0x57, 0xa9, 0x2f, 0xca, 0x23, 0x01, 0xa7, 0x34, 0xb4, + 0x37, 0xa8, 0xb2, 0x97, 0x75, 0x6b, 0xa2, 0xaa, 0x20, 0x66, 0x18, 0xfb, 0x39, 0x80, 0x95, 0xdb, + 0xa4, 0xb9, 0xc8, 0x0f, 0x5e, 0xda, 0xfd, 0x96, 0x55, 0x7c, 0xbf, 0x65, 0xff, 0x07, 0x0b, 0x26, + 0x56, 0x97, 0x0d, 0x85, 0x7c, 0x1e, 0x80, 0x6b, 0xa1, 0x6f, 0xbc, 0x71, 0x4d, 0x5a, 0x86, 0xb9, + 0x71, 0x4f, 0x41, 0xb1, 0x46, 0x81, 0x1e, 0x80, 0xb2, 0xdf, 0x0e, 0x84, 0x72, 0x38, 0x7c, 0xe7, + 0x70, 0xae, 0x7c, 0xb5, 0x1d, 0x60, 0x0a, 0xd3, 0x3c, 0x89, 0xca, 0x7d, 0x7b, 0x12, 0xf5, 0x74, + 0xc1, 0x46, 0x73, 0x30, 0x78, 0xeb, 0x96, 0xe7, 0xc6, 0xd5, 0xc1, 0xd4, 0x6a, 0xfd, 0xc6, 0x1b, + 0x6b, 0xb5, 0x18, 0x73, 0xb8, 0xfd, 0x17, 0xca, 0x30, 0xb5, 0xea, 0x93, 0xdb, 0xc6, 0x67, 0x3d, + 0x06, 0x43, 0x6e, 0xe4, 0xed, 0x93, 0x28, 0xbb, 0x8b, 0xd7, 0x18, 0x14, 0x0b, 0x6c, 0xdf, 0xde, + 0x4f, 0x37, 0x3a, 0xf7, 0xe3, 0x93, 0xf6, 0xf7, 0xea, 0xdd, 0x15, 0x6f, 0xc3, 0x30, 0xbf, 0x26, + 0xe5, 0x9d, 0x31, 0x7a, 0xf1, 0xd9, 0xbc, 0x26, 0x64, 0xfb, 0x62, 0x5e, 0x18, 0x3e, 0xb8, 0xcf, + 0x88, 0x12, 0x62, 0x02, 0x8a, 0x25, 0xcb, 0xd9, 0x4f, 0xc3, 0x98, 0x4e, 0x79, 0x2c, 0xe7, 0x91, + 0xbf, 0x68, 0xc1, 0x99, 0x55, 0x3f, 0x6c, 0xee, 0x66, 0x5c, 0xd1, 0x5e, 0x80, 0x51, 0xba, 0x9e, + 0x62, 0xc3, 0xad, 0xd5, 0x70, 0x74, 0x16, 0x28, 0xac, 0xd3, 0x69, 0xc5, 0x6e, 0xdc, 0x58, 0xab, + 0xe5, 0xf9, 0x47, 0x0b, 0x14, 0xd6, 0xe9, 0xec, 0x6f, 0x5b, 0xf0, 0xf0, 0xa5, 0xe5, 0x95, 0xd4, + 0x1b, 0xb3, 0xc3, 0x45, 0x9b, 0x2a, 0x77, 0xae, 0xd6, 0x94, 0x54, 0xb9, 0xab, 0xb1, 0x56, 0x08, + 0xec, 0x47, 0x25, 0xfc, 0xe0, 0x57, 0x2c, 0x38, 0x73, 0xc9, 0x4b, 0x30, 0x69, 0x85, 0x59, 0x67, + 0xe1, 0x88, 0xb4, 0xc2, 0xd8, 0x4b, 0xc2, 0xe8, 0x20, 0xeb, 0x2c, 0x8c, 0x15, 0x06, 0x6b, 0x54, + 0xbc, 0xe6, 0x7d, 0x2f, 0xa6, 0x2d, 0x2d, 0x99, 0x27, 0x4c, 0x2c, 0xe0, 0x58, 0x51, 0xd0, 0x0f, + 0x73, 0xbd, 0x88, 0x69, 0x08, 0x07, 0x62, 0x39, 0xab, 0x0f, 0xab, 0x49, 0x04, 0x4e, 0x69, 0xec, + 0xaf, 0x5a, 0x70, 0xf6, 0x92, 0xdf, 0x8e, 0x13, 0x12, 0x6d, 0xc5, 0x46, 0x63, 0x9f, 0x83, 0x0a, + 0x91, 0x5a, 0xb8, 0x68, 0xab, 0xda, 0x37, 0x94, 0x7a, 0xce, 0x3d, 0x95, 0x15, 0x5d, 0x1f, 0x7e, + 0x9d, 0xc7, 0xf3, 0x47, 0xfc, 0x7a, 0x09, 0xc6, 0x2f, 0x6f, 0x6c, 0xd4, 0x2f, 0x91, 0x44, 0x88, + 0xcc, 0xde, 0x16, 0x24, 0xac, 0x1d, 0x84, 0xbb, 0xe9, 0x3a, 0xed, 0xc4, 0xf3, 0xe7, 0x79, 0x68, + 0xcc, 0xfc, 0x5a, 0x90, 0x5c, 0x8f, 0x1a, 0x49, 0xe4, 0x05, 0xdb, 0xb9, 0x47, 0x67, 0x29, 0xd8, + 0xcb, 0x45, 0x82, 0x1d, 0x3d, 0x07, 0x43, 0x2c, 0x36, 0x47, 0x6a, 0x1d, 0x0f, 0x2a, 0x55, 0x81, + 0x41, 0x8f, 0x0e, 0xe7, 0x2a, 0x37, 0xf0, 0x1a, 0xff, 0x83, 0x05, 0x29, 0xba, 0x01, 0xa3, 0x3b, + 0x49, 0xd2, 0xba, 0x4c, 0x1c, 0x97, 0x44, 0x52, 0x3a, 0x9c, 0xcb, 0x93, 0x0e, 0xb4, 0x13, 0x38, + 0x59, 0xba, 0xa0, 0x52, 0x58, 0x8c, 0x75, 0x3e, 0x76, 0x03, 0x20, 0xc5, 0x9d, 0xd0, 0xb1, 0xc1, + 0xfe, 0xbe, 0x05, 0xc3, 0x97, 0x9d, 0xc0, 0xf5, 0x49, 0x84, 0x5e, 0x81, 0x01, 0x72, 0x9b, 0x34, + 0xc5, 0x0e, 0x9e, 0xdb, 0xe0, 0x74, 0x97, 0xe3, 0x46, 0x30, 0xfa, 0x1f, 0xb3, 0x52, 0xe8, 0x32, + 0x0c, 0xd3, 0xd6, 0x5e, 0x52, 0x3e, 0xe3, 0x8f, 0x14, 0x7d, 0xb1, 0x1a, 0x76, 0xbe, 0x31, 0x0a, + 0x10, 0x96, 0xc5, 0x99, 0x41, 0xa7, 0xd9, 0x6a, 0x50, 0x01, 0x96, 0x74, 0x3b, 0x6e, 0x6d, 0x2c, + 0xd7, 0x39, 0x91, 0xe0, 0xc6, 0x0d, 0x3a, 0x12, 0x88, 0x53, 0x26, 0xf6, 0x06, 0x54, 0xe8, 0xa0, + 0x2e, 0xfa, 0x9e, 0xd3, 0xdd, 0x96, 0xf4, 0x14, 0x54, 0xa4, 0x5d, 0x27, 0x16, 0x6e, 0xe7, 0x8c, + 0xab, 0x34, 0xfb, 0xc4, 0x38, 0xc5, 0xdb, 0x5b, 0x30, 0xc3, 0x2e, 0x49, 0x9d, 0x64, 0xc7, 0x58, + 0x63, 0xbd, 0x27, 0xf3, 0xd3, 0x42, 0xbf, 0xe2, 0x23, 0x53, 0xd5, 0xfc, 0x64, 0xc7, 0x24, 0x47, + 0x4d, 0xd7, 0xfa, 0xcf, 0x03, 0x30, 0xbd, 0xd6, 0x58, 0x6e, 0x98, 0x86, 0xc5, 0x97, 0x60, 0x8c, + 0x6b, 0x02, 0x74, 0x42, 0x3b, 0xbe, 0xa8, 0x4d, 0x5d, 0x1c, 0x6c, 0x68, 0x38, 0x6c, 0x50, 0xa2, + 0x87, 0xa1, 0xec, 0xbd, 0x17, 0x64, 0x5d, 0xe1, 0xd6, 0x5e, 0xbf, 0x86, 0x29, 0x9c, 0xa2, 0xa9, + 0x52, 0xc1, 0x05, 0xa8, 0x42, 0x2b, 0xc5, 0xe2, 0x55, 0x98, 0xf0, 0xe2, 0x66, 0xec, 0xad, 0x05, + 0x54, 0xba, 0xa4, 0x31, 0x17, 0xa9, 0xc6, 0x4f, 0x9b, 0xaa, 0xb0, 0x38, 0x43, 0xad, 0x49, 0xf3, + 0xc1, 0xbe, 0x15, 0x93, 0x9e, 0xde, 0xd7, 0x54, 0xe7, 0x6a, 0xb1, 0xaf, 0x8b, 0x99, 0x5b, 0x8e, + 0xd0, 0xb9, 0xf8, 0x07, 0xc7, 0x58, 0xe2, 0xd0, 0x25, 0x98, 0x6e, 0xee, 0x38, 0xad, 0xc5, 0x76, + 0xb2, 0x53, 0xf3, 0xe2, 0x66, 0xb8, 0x4f, 0xa2, 0x03, 0xa6, 0x09, 0x8f, 0xa4, 0x46, 0x26, 0x85, + 0x58, 0xbe, 0xbc, 0x58, 0xa7, 0x94, 0xb8, 0xb3, 0x8c, 0xa9, 0x82, 0xc0, 0x89, 0xa9, 0x20, 0x8b, + 0x30, 0x29, 0xeb, 0x6a, 0x90, 0x98, 0x6d, 0x0f, 0xa3, 0xac, 0x75, 0x2a, 0x24, 0x4a, 0x80, 0x55, + 0xdb, 0xb2, 0xf4, 0xe8, 0x45, 0x18, 0xf7, 0x02, 0x2f, 0xf1, 0x9c, 0x24, 0x8c, 0xd8, 0xe6, 0x3a, + 0xc6, 0x37, 0x0c, 0x2a, 0xe1, 0xd7, 0x74, 0x04, 0x36, 0xe9, 0xec, 0x77, 0xa1, 0xa2, 0x7c, 0xcd, + 0xa4, 0xbb, 0xa4, 0x55, 0xe0, 0x2e, 0xd9, 0x7b, 0x47, 0x90, 0x16, 0xf3, 0x72, 0xae, 0xc5, 0xfc, + 0x6f, 0x59, 0x90, 0xba, 0xdc, 0xa0, 0xcb, 0x50, 0x69, 0x85, 0xec, 0xd6, 0x2c, 0x92, 0x57, 0xd1, + 0x0f, 0xe6, 0x0a, 0x0f, 0x2e, 0xa8, 0x78, 0xff, 0xd5, 0x65, 0x09, 0x9c, 0x16, 0x46, 0x4b, 0x30, + 0xdc, 0x8a, 0x48, 0x23, 0x61, 0x41, 0x23, 0x3d, 0xf9, 0xf0, 0x39, 0xc2, 0xe9, 0xb1, 0x2c, 0x68, + 0xff, 0xba, 0x05, 0xc0, 0x8d, 0xd2, 0x4e, 0xb0, 0x4d, 0x4e, 0xe1, 0xa0, 0x5d, 0x83, 0x81, 0xb8, + 0x45, 0x9a, 0xdd, 0xee, 0x33, 0xd3, 0xf6, 0x34, 0x5a, 0xa4, 0x99, 0x76, 0x38, 0xfd, 0x87, 0x59, + 0x69, 0xfb, 0x67, 0x01, 0x26, 0x52, 0x32, 0x7a, 0x00, 0x42, 0xcf, 0x18, 0x2e, 0xf9, 0x0f, 0x64, + 0x5c, 0xf2, 0x2b, 0x8c, 0x5a, 0xf3, 0xc2, 0x7f, 0x17, 0xca, 0x7b, 0xce, 0x6d, 0x71, 0xca, 0x7a, + 0xaa, 0x7b, 0x33, 0x28, 0xff, 0xf9, 0x75, 0xe7, 0x36, 0xd7, 0x63, 0x9f, 0x92, 0x13, 0x64, 0xdd, + 0xb9, 0x7d, 0xc4, 0x6f, 0x2d, 0x99, 0x90, 0xa2, 0x87, 0xb9, 0xcf, 0xff, 0x61, 0xfa, 0x9f, 0x4d, + 0x3b, 0x5a, 0x09, 0xab, 0xcb, 0x0b, 0x84, 0x89, 0xb6, 0xaf, 0xba, 0xbc, 0x20, 0x5b, 0x97, 0x17, + 0xf4, 0x51, 0x97, 0x17, 0xa0, 0xf7, 0x61, 0x58, 0x5c, 0x87, 0x30, 0x5f, 0xc2, 0xd1, 0x8b, 0x0b, + 0x7d, 0xd4, 0x27, 0x6e, 0x53, 0x78, 0x9d, 0x0b, 0x52, 0x4f, 0x17, 0xd0, 0x9e, 0xf5, 0xca, 0x0a, + 0xd1, 0xdf, 0xb0, 0x60, 0x42, 0xfc, 0xc6, 0xe4, 0xbd, 0x36, 0x89, 0x13, 0xa1, 0x0f, 0x7c, 0xaa, + 0xff, 0x36, 0x88, 0x82, 0xbc, 0x29, 0x9f, 0x92, 0x62, 0xd6, 0x44, 0xf6, 0x6c, 0x51, 0xa6, 0x15, + 0xe8, 0x1f, 0x5b, 0x30, 0xb3, 0xe7, 0xdc, 0xe6, 0x35, 0x72, 0x18, 0x76, 0x12, 0x2f, 0x14, 0xbe, + 0x91, 0xaf, 0xf4, 0x37, 0xfc, 0x1d, 0xc5, 0x79, 0x23, 0xa5, 0x1b, 0xd5, 0x4c, 0x1e, 0x49, 0xcf, + 0xa6, 0xe6, 0xb6, 0x6b, 0x76, 0x0b, 0x46, 0xe4, 0x7c, 0xcb, 0x39, 0x0d, 0xd5, 0x74, 0x65, 0xe7, + 0xd8, 0xb7, 0x51, 0xda, 0xe9, 0x89, 0xd5, 0x23, 0xe6, 0xda, 0x3d, 0xad, 0xe7, 0x5d, 0x18, 0xd3, + 0xe7, 0xd8, 0x3d, 0xad, 0xeb, 0x3d, 0x38, 0x93, 0x33, 0x97, 0xee, 0x69, 0x95, 0xb7, 0xe0, 0x81, + 0xc2, 0xf9, 0x71, 0x2f, 0x2b, 0xb6, 0xbf, 0x6e, 0xe9, 0x72, 0xf0, 0x14, 0xcc, 0x53, 0xcb, 0xa6, + 0x79, 0xea, 0x5c, 0xf7, 0x95, 0x53, 0x60, 0xa3, 0x7a, 0x5b, 0x6f, 0x34, 0x95, 0xea, 0xe8, 0x35, + 0x18, 0xf2, 0x29, 0x44, 0xde, 0xc3, 0xd9, 0xbd, 0x57, 0x64, 0xaa, 0x4b, 0x31, 0x78, 0x8c, 0x05, + 0x07, 0xfb, 0xb7, 0x2c, 0x18, 0x38, 0x85, 0x9e, 0xc0, 0x66, 0x4f, 0x3c, 0x53, 0xc8, 0x5a, 0xe4, + 0x3d, 0x98, 0xc7, 0xce, 0xad, 0x15, 0x99, 0xdb, 0xa1, 0xa0, 0x63, 0xfe, 0x4f, 0x09, 0x46, 0x69, + 0x55, 0xd2, 0x61, 0xe4, 0x65, 0x18, 0xf7, 0x9d, 0x4d, 0xe2, 0x4b, 0x93, 0x79, 0xf6, 0x10, 0x7b, + 0x55, 0x47, 0x62, 0x93, 0x96, 0x16, 0xde, 0xd2, 0x6f, 0x0f, 0x84, 0xfe, 0xa2, 0x0a, 0x1b, 0x57, + 0x0b, 0xd8, 0xa4, 0xa5, 0xe7, 0xa9, 0x5b, 0x4e, 0xd2, 0xdc, 0x11, 0x07, 0x5c, 0xd5, 0xdc, 0x37, + 0x28, 0x10, 0x73, 0x1c, 0x55, 0xe0, 0xe4, 0xec, 0xbc, 0x49, 0x22, 0xa6, 0xc0, 0x71, 0xf5, 0x58, + 0x29, 0x70, 0xd8, 0x44, 0xe3, 0x2c, 0x7d, 0x4e, 0x6c, 0xde, 0x20, 0x73, 0x87, 0xe9, 0x23, 0x36, + 0x0f, 0xd5, 0x61, 0xc6, 0x0b, 0x9a, 0x7e, 0xdb, 0x25, 0x37, 0x02, 0xae, 0xdd, 0xf9, 0xde, 0xfb, + 0xc4, 0x15, 0x0a, 0xb4, 0xf2, 0x5c, 0x5a, 0xcb, 0xa1, 0xc1, 0xb9, 0x25, 0xed, 0xff, 0x0f, 0xce, + 0x5c, 0x0d, 0x1d, 0x77, 0xc9, 0xf1, 0x9d, 0xa0, 0x49, 0xa2, 0xb5, 0x60, 0xbb, 0xe7, 0x85, 0xbc, + 0x7e, 0x7d, 0x5e, 0xea, 0x75, 0x7d, 0x6e, 0xef, 0x00, 0xd2, 0x2b, 0x10, 0x6e, 0x60, 0x18, 0x86, + 0x3d, 0x5e, 0x95, 0x98, 0xfe, 0x8f, 0xe7, 0x6b, 0xd7, 0x1d, 0x2d, 0xd3, 0x1c, 0x9c, 0x38, 0x00, + 0x4b, 0x46, 0xf6, 0x4b, 0x90, 0x1b, 0x9b, 0xd1, 0xfb, 0x28, 0x6d, 0xbf, 0x00, 0xd3, 0xac, 0xe4, + 0xf1, 0x8e, 0x79, 0xf6, 0x5f, 0xb1, 0x60, 0xf2, 0x5a, 0x26, 0x9a, 0xf6, 0x31, 0x18, 0xe2, 0x19, + 0x4e, 0xb2, 0x46, 0xaf, 0x06, 0x83, 0x62, 0x81, 0x3d, 0x71, 0x9b, 0xcb, 0x0f, 0x2c, 0xa8, 0xa8, + 0xd0, 0xf7, 0x53, 0x50, 0x6a, 0x97, 0x0d, 0xa5, 0x36, 0xd7, 0x16, 0xa0, 0x9a, 0x53, 0xa4, 0xd3, + 0xa2, 0x2b, 0x2a, 0x2e, 0xb4, 0x8b, 0x19, 0x20, 0x65, 0xc3, 0xa3, 0x08, 0x27, 0xcc, 0xe0, 0x51, + 0x19, 0x29, 0xca, 0x6e, 0xc4, 0x15, 0xed, 0x47, 0xe4, 0x46, 0x5c, 0xb5, 0xa7, 0x40, 0xfa, 0xd5, + 0xb5, 0x26, 0xb3, 0x5d, 0xe1, 0xc7, 0x99, 0xd7, 0x28, 0x5b, 0x9b, 0x2a, 0x1c, 0x7b, 0x4e, 0x78, + 0x81, 0x0a, 0xe8, 0x11, 0x13, 0x64, 0xe2, 0x1f, 0x4f, 0x53, 0x90, 0x16, 0xb1, 0x2f, 0xc3, 0x64, + 0xa6, 0xc3, 0xd0, 0x0b, 0x30, 0xd8, 0xda, 0x71, 0x62, 0x92, 0xf1, 0x02, 0x1a, 0xac, 0x53, 0xe0, + 0xd1, 0xe1, 0xdc, 0x84, 0x2a, 0xc0, 0x20, 0x98, 0x53, 0xdb, 0xff, 0xc3, 0x82, 0x81, 0x6b, 0xa1, + 0x7b, 0x1a, 0x93, 0xe9, 0x55, 0x63, 0x32, 0x3d, 0x54, 0x94, 0xe4, 0xa5, 0x70, 0x1e, 0xad, 0x66, + 0xe6, 0xd1, 0xb9, 0x42, 0x0e, 0xdd, 0xa7, 0xd0, 0x1e, 0x8c, 0xb2, 0xd4, 0x31, 0xc2, 0x2b, 0xe9, + 0x39, 0xe3, 0x7c, 0x35, 0x97, 0x39, 0x5f, 0x4d, 0x6a, 0xa4, 0xda, 0x29, 0xeb, 0x09, 0x18, 0x16, + 0x9e, 0x31, 0x59, 0xff, 0x58, 0x41, 0x8b, 0x25, 0xde, 0xfe, 0xa5, 0x32, 0x18, 0xa9, 0x6a, 0xd0, + 0x6f, 0x5b, 0x30, 0x1f, 0xf1, 0x88, 0x20, 0xb7, 0xd6, 0x8e, 0xbc, 0x60, 0xbb, 0xd1, 0xdc, 0x21, + 0x6e, 0xdb, 0xf7, 0x82, 0xed, 0xb5, 0xed, 0x20, 0x54, 0xe0, 0x95, 0xdb, 0xa4, 0xd9, 0x66, 0x76, + 0xf0, 0x1e, 0x79, 0x71, 0xd4, 0xcd, 0xf3, 0xc5, 0x3b, 0x87, 0x73, 0xf3, 0xf8, 0x58, 0xbc, 0xf1, + 0x31, 0xdb, 0x82, 0xbe, 0x6d, 0xc1, 0x02, 0xcf, 0xe0, 0xd2, 0x7f, 0xfb, 0xbb, 0x9c, 0x46, 0xeb, + 0x92, 0x55, 0xca, 0x64, 0x83, 0x44, 0x7b, 0x4b, 0x2f, 0x8a, 0x0e, 0x5d, 0xa8, 0x1f, 0xaf, 0x2e, + 0x7c, 0xdc, 0xc6, 0xd9, 0xff, 0xaa, 0x0c, 0xe3, 0xb4, 0x17, 0xd3, 0x28, 0xf8, 0x17, 0x8c, 0x29, + 0xf1, 0x48, 0x66, 0x4a, 0x4c, 0x1b, 0xc4, 0x27, 0x13, 0x00, 0x1f, 0xc3, 0xb4, 0xef, 0xc4, 0xc9, + 0x65, 0xe2, 0x44, 0xc9, 0x26, 0x71, 0xd8, 0x55, 0xaf, 0x98, 0xe6, 0xc7, 0xb9, 0x3d, 0x56, 0xe6, + 0xaf, 0xab, 0x59, 0x66, 0xb8, 0x93, 0x3f, 0xda, 0x07, 0xc4, 0xae, 0x95, 0x23, 0x27, 0x88, 0xf9, + 0xb7, 0x78, 0xc2, 0x46, 0x7e, 0xbc, 0x5a, 0x67, 0x45, 0xad, 0xe8, 0x6a, 0x07, 0x37, 0x9c, 0x53, + 0x83, 0xe6, 0x2e, 0x30, 0xd8, 0xaf, 0xbb, 0xc0, 0x50, 0x0f, 0x27, 0xf4, 0x3d, 0x98, 0x12, 0xa3, + 0xb2, 0xe5, 0x6d, 0x8b, 0x4d, 0xfa, 0xcd, 0x8c, 0x3b, 0x91, 0xd5, 0xbf, 0xe3, 0x43, 0x0f, 0x5f, + 0x22, 0xfb, 0xa7, 0xe1, 0x0c, 0xad, 0xce, 0x74, 0x99, 0x8e, 0x11, 0x81, 0xc9, 0xdd, 0xf6, 0x26, + 0xf1, 0x49, 0x22, 0x61, 0xa2, 0xd2, 0x5c, 0xb5, 0xdf, 0x2c, 0x9d, 0xea, 0x96, 0x57, 0x4c, 0x16, + 0x38, 0xcb, 0xd3, 0xfe, 0x65, 0x0b, 0x98, 0x63, 0xe2, 0x29, 0x6c, 0x7f, 0x9f, 0x31, 0xb7, 0xbf, + 0x6a, 0x91, 0x04, 0x2a, 0xd8, 0xf9, 0x9e, 0xe7, 0xc3, 0x52, 0x8f, 0xc2, 0xdb, 0x07, 0x52, 0xf7, + 0xef, 0xad, 0x71, 0xfd, 0x6f, 0x8b, 0x2f, 0x48, 0x15, 0x20, 0x89, 0x7e, 0x06, 0x46, 0x9a, 0x4e, + 0xcb, 0x69, 0xf2, 0x1c, 0x61, 0x85, 0xd6, 0x1f, 0xa3, 0xd0, 0xfc, 0xb2, 0x28, 0xc1, 0xad, 0x19, + 0x9f, 0x94, 0x5f, 0x29, 0xc1, 0x3d, 0x2d, 0x18, 0xaa, 0xca, 0xd9, 0x5d, 0x18, 0x37, 0x98, 0xdd, + 0xd3, 0xa3, 0xef, 0xcf, 0xf0, 0xed, 0x42, 0x9d, 0x58, 0xf6, 0x60, 0x3a, 0xd0, 0xfe, 0x53, 0xe1, + 0x28, 0xd5, 0xe9, 0x8f, 0xf7, 0xda, 0x10, 0x98, 0x24, 0xd5, 0x1c, 0x2f, 0x33, 0x6c, 0x70, 0x27, 0x67, 0xfb, 0xef, 0x58, 0x70, 0xbf, 0x4e, 0xa8, 0xc5, 0xae, 0xf6, 0xb2, 0x27, 0xd7, 0x60, 0x24, - 0x6c, 0x91, 0xc8, 0x49, 0xcf, 0x64, 0xe7, 0x65, 0xa7, 0x5f, 0x13, 0xf0, 0xa3, 0xc3, 0xb9, 0x19, + 0x6c, 0x91, 0xc8, 0x49, 0xcf, 0x64, 0x17, 0x64, 0xa7, 0x5f, 0x17, 0xf0, 0xa3, 0xc3, 0xb9, 0x19, 0x9d, 0xbb, 0x84, 0x63, 0x55, 0x12, 0xd9, 0x30, 0xc4, 0x3a, 0x23, 0x16, 0x71, 0xc5, 0x2c, 0x8f, - 0x16, 0xbb, 0xee, 0x8a, 0xb1, 0xc0, 0xd8, 0x3f, 0x6b, 0xf1, 0x89, 0xa5, 0x37, 0x1d, 0xbd, 0x0b, - 0x53, 0x7b, 0xf4, 0xf8, 0xb6, 0x72, 0xab, 0x15, 0x71, 0x33, 0xba, 0xec, 0xa7, 0x27, 0x7b, 0xf5, - 0x93, 0xf6, 0x91, 0x4b, 0x55, 0xd1, 0xe6, 0xa9, 0xf5, 0x0c, 0x33, 0xdc, 0xc1, 0xde, 0xfe, 0xb3, - 0x12, 0x5f, 0x89, 0x4c, 0xab, 0x7b, 0x1c, 0x86, 0x5b, 0xa1, 0xbb, 0xbc, 0x56, 0xc3, 0xa2, 0x87, - 0x94, 0xb8, 0xaa, 0x73, 0x30, 0x96, 0x78, 0x74, 0x01, 0x80, 0xdc, 0x4a, 0x48, 0x14, 0x38, 0xbe, + 0x16, 0xbb, 0xee, 0x8a, 0xb1, 0xc0, 0xd8, 0x3f, 0x6b, 0xf1, 0x89, 0xa5, 0x37, 0x1d, 0xbd, 0x07, + 0x53, 0x7b, 0xf4, 0xf8, 0xb6, 0x72, 0xbb, 0x15, 0x71, 0x33, 0xba, 0xec, 0xa7, 0xa7, 0x7a, 0xf5, + 0x93, 0xf6, 0x91, 0x4b, 0x55, 0xd1, 0xe6, 0xa9, 0xf5, 0x0c, 0x33, 0xdc, 0xc1, 0xde, 0xfe, 0xd3, + 0x12, 0x5f, 0x89, 0x4c, 0xab, 0x7b, 0x02, 0x86, 0x5b, 0xa1, 0xbb, 0xbc, 0x56, 0xc3, 0xa2, 0x87, + 0x94, 0xb8, 0xaa, 0x73, 0x30, 0x96, 0x78, 0x74, 0x11, 0x80, 0xdc, 0x4e, 0x48, 0x14, 0x38, 0xbe, 0xba, 0x8c, 0x57, 0xca, 0xd3, 0x8a, 0xc2, 0x60, 0x8d, 0x8a, 0x96, 0x69, 0x45, 0xe1, 0xbe, 0xe7, 0xb2, 0xc0, 0x8e, 0xb2, 0x59, 0xa6, 0xae, 0x30, 0x58, 0xa3, 0xa2, 0x47, 0xe5, 0x76, 0x10, 0xf3, - 0x0d, 0xd0, 0xd9, 0x14, 0xa9, 0x78, 0x46, 0xd2, 0xa3, 0xf2, 0x75, 0x1d, 0x89, 0x4d, 0x5a, 0xb4, + 0x0d, 0xd0, 0xd9, 0x14, 0xa9, 0x78, 0x46, 0xd2, 0xa3, 0xf2, 0x0d, 0x1d, 0x89, 0x4d, 0x5a, 0xb4, 0x08, 0x43, 0x89, 0xc3, 0xae, 0x98, 0x07, 0x8b, 0x5d, 0x76, 0x36, 0x28, 0x85, 0x9e, 0x34, 0x8a, - 0x16, 0xc0, 0xa2, 0x20, 0x7a, 0x53, 0x8a, 0x60, 0x2e, 0x92, 0x85, 0xeb, 0x55, 0xe1, 0xb4, 0xd5, - 0xc5, 0xb7, 0x2e, 0x83, 0x85, 0x4b, 0x97, 0xc1, 0xcb, 0xfe, 0x52, 0x05, 0x20, 0xd5, 0xf6, 0xd0, - 0x7b, 0x1d, 0x22, 0xe2, 0xa9, 0xee, 0xfa, 0xe1, 0xdd, 0x93, 0x0f, 0xe8, 0xcb, 0x16, 0x8c, 0x3a, - 0xbe, 0x1f, 0x36, 0x9d, 0x84, 0xf5, 0x72, 0xa9, 0xbb, 0x88, 0x12, 0xf5, 0x2f, 0xa6, 0x25, 0x78, - 0x13, 0x9e, 0x95, 0xb7, 0xc7, 0x1a, 0xa6, 0x67, 0x2b, 0xf4, 0x8a, 0xd1, 0xc7, 0xe5, 0x21, 0x80, - 0x4f, 0x8f, 0xd9, 0xec, 0x21, 0xa0, 0xc2, 0xa4, 0xb1, 0xa6, 0xff, 0xa3, 0xeb, 0x46, 0xce, 0x9a, - 0x81, 0xe2, 0xf0, 0x5c, 0x43, 0xe9, 0xe9, 0x95, 0xae, 0x06, 0xd5, 0x75, 0x17, 0xf4, 0xc1, 0xe2, - 0x18, 0x76, 0x4d, 0xbb, 0xee, 0xe1, 0x7e, 0xfe, 0x0e, 0x4c, 0xba, 0xe6, 0x76, 0x2b, 0x66, 0xd3, - 0x63, 0x45, 0x7c, 0x33, 0xbb, 0x73, 0xba, 0xc1, 0x66, 0x10, 0x38, 0xcb, 0x18, 0xd5, 0x79, 0x30, - 0xc0, 0x5a, 0xb0, 0x15, 0x0a, 0x17, 0x3e, 0xbb, 0x70, 0x2c, 0x0f, 0xe2, 0x84, 0xec, 0x51, 0xca, - 0x74, 0x1f, 0xbd, 0x2a, 0xca, 0x62, 0xc5, 0x05, 0xbd, 0x0a, 0x43, 0x2c, 0x42, 0x2b, 0xae, 0x8e, - 0x14, 0xdb, 0x01, 0xcd, 0xe0, 0xe2, 0x74, 0x51, 0xb1, 0xbf, 0x31, 0x16, 0x1c, 0xd0, 0x25, 0x99, - 0x22, 0x20, 0x5e, 0x0b, 0xae, 0xc7, 0x84, 0xa5, 0x08, 0xa8, 0x2c, 0x7d, 0x34, 0x8d, 0xfe, 0xe7, - 0xf0, 0xdc, 0xf4, 0x90, 0x46, 0x49, 0xaa, 0xaf, 0x88, 0xff, 0x32, 0xeb, 0x64, 0x15, 0x8a, 0x9b, - 0x67, 0x66, 0xa6, 0x4c, 0xbb, 0xf3, 0x86, 0xc9, 0x02, 0x67, 0x79, 0x9e, 0xe8, 0xf6, 0x39, 0x1b, - 0xc0, 0x54, 0x76, 0x61, 0xdd, 0xd3, 0xed, 0xfa, 0x87, 0x03, 0x30, 0x61, 0x4e, 0x04, 0xb4, 0x00, - 0x15, 0xc1, 0x44, 0xa5, 0x0b, 0x53, 0x73, 0x7b, 0x5d, 0x22, 0x70, 0x4a, 0xc3, 0xd2, 0xa5, 0xb1, - 0xe2, 0x9a, 0x6f, 0x56, 0x9a, 0x2e, 0x4d, 0x61, 0xb0, 0x46, 0x45, 0x95, 0xe8, 0xcd, 0x30, 0x4c, - 0xd4, 0x56, 0xa0, 0x66, 0xcb, 0x12, 0x83, 0x62, 0x81, 0xa5, 0x5b, 0xc0, 0x2e, 0x89, 0x02, 0xe2, - 0x9b, 0x96, 0x4c, 0xb5, 0x05, 0x5c, 0xd6, 0x91, 0xd8, 0xa4, 0xa5, 0x5b, 0x5a, 0x18, 0xb3, 0xe9, - 0x27, 0x54, 0xf5, 0xd4, 0xd7, 0xad, 0xc1, 0x23, 0x14, 0x25, 0x1e, 0xbd, 0x01, 0xf7, 0xab, 0x80, - 0x42, 0xcc, 0x2d, 0xc3, 0xb2, 0xc6, 0x21, 0xe3, 0x64, 0x7d, 0xff, 0x72, 0x3e, 0x19, 0x2e, 0x2a, - 0x8f, 0x5e, 0x81, 0x09, 0xa1, 0x02, 0x4b, 0x8e, 0xc3, 0xa6, 0xb3, 0xc2, 0x65, 0x03, 0x8b, 0x33, - 0xd4, 0xa8, 0x06, 0x53, 0x14, 0xc2, 0xb4, 0x50, 0xc9, 0x81, 0x07, 0x46, 0xaa, 0xbd, 0xfe, 0x72, - 0x06, 0x8f, 0x3b, 0x4a, 0xa0, 0x45, 0x98, 0xe4, 0x3a, 0x0a, 0x3d, 0x53, 0xb2, 0x71, 0x10, 0x9e, - 0xb5, 0x6a, 0x21, 0x5c, 0x33, 0xd1, 0x38, 0x4b, 0x8f, 0x5e, 0x84, 0x31, 0x27, 0x6a, 0xee, 0x78, - 0x09, 0x69, 0x26, 0xed, 0x88, 0x27, 0xe0, 0xd0, 0xbc, 0x3d, 0x16, 0x35, 0x1c, 0x36, 0x28, 0xed, - 0xf7, 0xe0, 0x54, 0x8e, 0x53, 0x3e, 0x9d, 0x38, 0x4e, 0xcb, 0x93, 0xdf, 0x94, 0xf1, 0x5a, 0x5b, - 0xac, 0xaf, 0xc9, 0xaf, 0xd1, 0xa8, 0xe8, 0xec, 0x64, 0x26, 0x71, 0x2d, 0x35, 0xac, 0x9a, 0x9d, - 0xab, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0x3b, 0x00, 0x9a, 0x41, 0xa7, 0x0f, 0x9f, 0xa5, 0x17, 0x61, - 0x4c, 0xe6, 0x33, 0xd6, 0xf2, 0x68, 0xaa, 0xcf, 0xbc, 0xa8, 0xe1, 0xb0, 0x41, 0x49, 0xdb, 0x16, - 0xa8, 0x2c, 0xa0, 0x19, 0x1f, 0xb9, 0x34, 0x07, 0x68, 0x4a, 0x83, 0x9e, 0x82, 0x91, 0x98, 0xf8, - 0x5b, 0x57, 0xbc, 0x60, 0x57, 0x4c, 0x6c, 0x25, 0x85, 0x1b, 0x02, 0x8e, 0x15, 0x05, 0x5a, 0x82, - 0x72, 0xdb, 0x73, 0xc5, 0x54, 0x96, 0x1b, 0x7e, 0xf9, 0xfa, 0x5a, 0xed, 0xe8, 0x70, 0xee, 0xe1, + 0x16, 0xc0, 0xa2, 0x20, 0x7a, 0x4b, 0x8a, 0x60, 0x2e, 0x92, 0x85, 0xeb, 0x55, 0xe1, 0xb4, 0xd5, + 0xc5, 0xb7, 0x2e, 0x83, 0x85, 0x4b, 0x97, 0xc1, 0xcb, 0xfe, 0x42, 0x05, 0x20, 0xd5, 0xf6, 0xd0, + 0xfb, 0x1d, 0x22, 0xe2, 0xe9, 0xee, 0xfa, 0xe1, 0xc9, 0xc9, 0x07, 0xf4, 0x45, 0x0b, 0x46, 0x1d, + 0xdf, 0x0f, 0x9b, 0x4e, 0xc2, 0x7a, 0xb9, 0xd4, 0x5d, 0x44, 0x89, 0xfa, 0x17, 0xd3, 0x12, 0xbc, + 0x09, 0xcf, 0xc9, 0xdb, 0x63, 0x0d, 0xd3, 0xb3, 0x15, 0x7a, 0xc5, 0xe8, 0x93, 0xf2, 0x10, 0xc0, + 0xa7, 0xc7, 0x6c, 0xf6, 0x10, 0x50, 0x61, 0xd2, 0x58, 0xd3, 0xff, 0xd1, 0x0d, 0x23, 0x67, 0xcd, + 0x40, 0x71, 0x78, 0xae, 0xa1, 0xf4, 0xf4, 0x4a, 0x57, 0x83, 0xea, 0xba, 0x0b, 0xfa, 0x60, 0x71, + 0x0c, 0xbb, 0xa6, 0x5d, 0xf7, 0x70, 0x3f, 0x7f, 0x17, 0x26, 0x5d, 0x73, 0xbb, 0x15, 0xb3, 0xe9, + 0xf1, 0x22, 0xbe, 0x99, 0xdd, 0x39, 0xdd, 0x60, 0x33, 0x08, 0x9c, 0x65, 0x8c, 0xea, 0x3c, 0x18, + 0x60, 0x2d, 0xd8, 0x0a, 0x85, 0x0b, 0x9f, 0x5d, 0x38, 0x96, 0x07, 0x71, 0x42, 0xf6, 0x28, 0x65, + 0xba, 0x8f, 0x5e, 0x13, 0x65, 0xb1, 0xe2, 0x82, 0x5e, 0x83, 0x21, 0x16, 0xa1, 0x15, 0x57, 0x47, + 0x8a, 0xed, 0x80, 0x66, 0x70, 0x71, 0xba, 0xa8, 0xd8, 0xdf, 0x18, 0x0b, 0x0e, 0xe8, 0xb2, 0x4c, + 0x11, 0x10, 0xaf, 0x05, 0x37, 0x62, 0xc2, 0x52, 0x04, 0x54, 0x96, 0x3e, 0x9e, 0x46, 0xff, 0x73, + 0x78, 0x6e, 0x7a, 0x48, 0xa3, 0x24, 0xd5, 0x57, 0xc4, 0x7f, 0x99, 0x75, 0xb2, 0x0a, 0xc5, 0xcd, + 0x33, 0x33, 0x53, 0xa6, 0xdd, 0x79, 0xd3, 0x64, 0x81, 0xb3, 0x3c, 0x4f, 0x75, 0xfb, 0x9c, 0x0d, + 0x60, 0x2a, 0xbb, 0xb0, 0xee, 0xe9, 0x76, 0xfd, 0xfd, 0x01, 0x98, 0x30, 0x27, 0x02, 0x5a, 0x80, + 0x8a, 0x60, 0xa2, 0xd2, 0x85, 0xa9, 0xb9, 0xbd, 0x2e, 0x11, 0x38, 0xa5, 0x61, 0xe9, 0xd2, 0x58, + 0x71, 0xcd, 0x37, 0x2b, 0x4d, 0x97, 0xa6, 0x30, 0x58, 0xa3, 0xa2, 0x4a, 0xf4, 0x66, 0x18, 0x26, + 0x6a, 0x2b, 0x50, 0xb3, 0x65, 0x89, 0x41, 0xb1, 0xc0, 0xd2, 0x2d, 0x60, 0x97, 0x44, 0x01, 0xf1, + 0x4d, 0x4b, 0xa6, 0xda, 0x02, 0xae, 0xe8, 0x48, 0x6c, 0xd2, 0xd2, 0x2d, 0x2d, 0x8c, 0xd9, 0xf4, + 0x13, 0xaa, 0x7a, 0xea, 0xeb, 0xd6, 0xe0, 0x11, 0x8a, 0x12, 0x8f, 0xde, 0x84, 0xfb, 0x55, 0x40, + 0x21, 0xe6, 0x96, 0x61, 0x59, 0xe3, 0x90, 0x71, 0xb2, 0xbe, 0x7f, 0x39, 0x9f, 0x0c, 0x17, 0x95, + 0x47, 0xaf, 0xc2, 0x84, 0x50, 0x81, 0x25, 0xc7, 0x61, 0xd3, 0x59, 0xe1, 0x8a, 0x81, 0xc5, 0x19, + 0x6a, 0x54, 0x83, 0x29, 0x0a, 0x61, 0x5a, 0xa8, 0xe4, 0xc0, 0x03, 0x23, 0xd5, 0x5e, 0x7f, 0x25, + 0x83, 0xc7, 0x1d, 0x25, 0xd0, 0x22, 0x4c, 0x72, 0x1d, 0x85, 0x9e, 0x29, 0xd9, 0x38, 0x08, 0xcf, + 0x5a, 0xb5, 0x10, 0xae, 0x9b, 0x68, 0x9c, 0xa5, 0x47, 0x2f, 0xc1, 0x98, 0x13, 0x35, 0x77, 0xbc, + 0x84, 0x34, 0x93, 0x76, 0xc4, 0x13, 0x70, 0x68, 0xde, 0x1e, 0x8b, 0x1a, 0x0e, 0x1b, 0x94, 0xf6, + 0xfb, 0x70, 0x26, 0xc7, 0x29, 0x9f, 0x4e, 0x1c, 0xa7, 0xe5, 0xc9, 0x6f, 0xca, 0x78, 0xad, 0x2d, + 0xd6, 0xd7, 0xe4, 0xd7, 0x68, 0x54, 0x74, 0x76, 0x32, 0x93, 0xb8, 0x96, 0x1a, 0x56, 0xcd, 0xce, + 0x55, 0x89, 0xc0, 0x29, 0x8d, 0xfd, 0x7b, 0x00, 0x9a, 0x41, 0xa7, 0x0f, 0x9f, 0xa5, 0x97, 0x60, + 0x4c, 0xe6, 0x33, 0xd6, 0xf2, 0x68, 0xaa, 0xcf, 0xbc, 0xa4, 0xe1, 0xb0, 0x41, 0x49, 0xdb, 0x16, + 0xa8, 0x2c, 0xa0, 0x19, 0x1f, 0xb9, 0x34, 0x07, 0x68, 0x4a, 0x83, 0x9e, 0x86, 0x91, 0x98, 0xf8, + 0x5b, 0x57, 0xbd, 0x60, 0x57, 0x4c, 0x6c, 0x25, 0x85, 0x1b, 0x02, 0x8e, 0x15, 0x05, 0x5a, 0x82, + 0x72, 0xdb, 0x73, 0xc5, 0x54, 0x96, 0x1b, 0x7e, 0xf9, 0xc6, 0x5a, 0xed, 0xe8, 0x70, 0xee, 0x91, 0xa2, 0x34, 0xcd, 0xf4, 0x68, 0x1f, 0xcf, 0xd3, 0xe5, 0x47, 0x0b, 0xe7, 0xdd, 0x0d, 0x0c, 0x1d, - 0xf3, 0x6e, 0xe0, 0x02, 0x80, 0xf8, 0x6a, 0x39, 0x97, 0xcb, 0xe9, 0xa8, 0x5d, 0x54, 0x18, 0xac, - 0x51, 0xa1, 0x18, 0xa6, 0x9b, 0x11, 0x71, 0xe4, 0x19, 0x9a, 0xbb, 0x97, 0x8f, 0xdc, 0xb9, 0x81, + 0xf3, 0x6e, 0xe0, 0x22, 0x80, 0xf8, 0x6a, 0x39, 0x97, 0xcb, 0xe9, 0xa8, 0x5d, 0x52, 0x18, 0xac, + 0x51, 0xa1, 0x18, 0xa6, 0x9b, 0x11, 0x71, 0xe4, 0x19, 0x9a, 0xbb, 0x97, 0x8f, 0xdc, 0xbd, 0x81, 0x60, 0x39, 0xcb, 0x0c, 0x77, 0xf2, 0x47, 0x21, 0x4c, 0xbb, 0x22, 0x7e, 0x35, 0xad, 0xb4, 0x72, - 0x7c, 0x9f, 0x76, 0xe6, 0x90, 0x93, 0x65, 0x84, 0x3b, 0x79, 0xa3, 0xb7, 0x61, 0x56, 0x02, 0x3b, - 0x43, 0x86, 0xd9, 0x72, 0x29, 0x2f, 0x9d, 0xbd, 0x7d, 0x38, 0x37, 0x5b, 0x2b, 0xa4, 0xc2, 0x5d, - 0x38, 0x20, 0x0c, 0x43, 0xec, 0x2e, 0x29, 0xae, 0x8e, 0xb2, 0x7d, 0xee, 0x89, 0x62, 0x63, 0x00, + 0x7c, 0x9f, 0x76, 0xe6, 0x90, 0x93, 0x65, 0x84, 0x3b, 0x79, 0xa3, 0x77, 0x60, 0x56, 0x02, 0x3b, + 0x43, 0x86, 0xd9, 0x72, 0x29, 0x2f, 0x9d, 0xbb, 0x73, 0x38, 0x37, 0x5b, 0x2b, 0xa4, 0xc2, 0x5d, + 0x38, 0x20, 0x0c, 0x43, 0xec, 0x2e, 0x29, 0xae, 0x8e, 0xb2, 0x7d, 0xee, 0xc9, 0x62, 0x63, 0x00, 0x9d, 0xeb, 0xf3, 0xec, 0x1e, 0x4a, 0xb8, 0xf9, 0xa6, 0xd7, 0x72, 0x0c, 0x88, 0x05, 0x27, 0xb4, 0x05, 0xa3, 0x4e, 0x10, 0x84, 0x89, 0xc3, 0x55, 0xa8, 0xb1, 0x62, 0xdd, 0x4f, 0x63, 0xbc, 0x98, - 0x96, 0xe0, 0xdc, 0x95, 0xe7, 0xa0, 0x86, 0xc1, 0x3a, 0x63, 0x74, 0x13, 0x26, 0xc3, 0x9b, 0x54, - 0x38, 0x4a, 0x2b, 0x45, 0x5c, 0x1d, 0x67, 0x75, 0x3d, 0xd7, 0xa7, 0x9d, 0xd6, 0x28, 0xac, 0x49, + 0x96, 0xe0, 0xdc, 0x95, 0xe7, 0xa0, 0x86, 0xc1, 0x3a, 0x63, 0x74, 0x0b, 0x26, 0xc3, 0x5b, 0x54, + 0x38, 0x4a, 0x2b, 0x45, 0x5c, 0x1d, 0x67, 0x75, 0x3d, 0xdf, 0xa7, 0x9d, 0xd6, 0x28, 0xac, 0x49, 0x2d, 0x93, 0x29, 0xce, 0xd6, 0x82, 0xe6, 0x0d, 0x6b, 0xf5, 0x44, 0xea, 0xcf, 0x9e, 0x5a, 0xab, 0x75, 0xe3, 0x34, 0x0b, 0x41, 0xe7, 0x6e, 0xab, 0x6c, 0xf5, 0x4f, 0x66, 0x42, 0xd0, 0x53, 0x14, - 0xd6, 0xe9, 0xd0, 0x0e, 0x8c, 0xa5, 0x57, 0x56, 0x51, 0xcc, 0x32, 0xd4, 0x8c, 0x5e, 0xb8, 0xd0, - 0xdf, 0xc7, 0xad, 0x69, 0x25, 0xf9, 0xc9, 0x41, 0x87, 0x60, 0x83, 0xf3, 0xec, 0x4f, 0xc1, 0xa8, - 0x36, 0xb0, 0xc7, 0xf1, 0xca, 0x9e, 0x7d, 0x05, 0xa6, 0xb2, 0x43, 0x77, 0x2c, 0xaf, 0xee, 0xff, - 0x59, 0x82, 0xc9, 0x9c, 0x9b, 0x2b, 0x96, 0xea, 0x39, 0x23, 0x50, 0xd3, 0xcc, 0xce, 0xa6, 0x58, - 0x2c, 0xf5, 0x21, 0x16, 0xa5, 0x8c, 0x2e, 0x17, 0xca, 0x68, 0x21, 0x0a, 0x07, 0xde, 0x8f, 0x28, - 0x34, 0x77, 0x9f, 0xc1, 0xbe, 0x76, 0x9f, 0xbb, 0x20, 0x3e, 0x8d, 0x0d, 0x6c, 0xb8, 0x8f, 0x0d, - 0xec, 0x17, 0x4a, 0x30, 0x95, 0xcd, 0x27, 0x7c, 0x02, 0xf7, 0x1d, 0xaf, 0x1a, 0xf7, 0x1d, 0xf9, - 0x89, 0xd3, 0xb3, 0x59, 0x8e, 0x8b, 0xee, 0x3e, 0x70, 0xe6, 0xee, 0xe3, 0x89, 0xbe, 0xb8, 0x75, - 0xbf, 0x07, 0xf9, 0xbb, 0x25, 0x38, 0x9d, 0x2d, 0xb2, 0xec, 0x3b, 0xde, 0xde, 0x09, 0xf4, 0xcd, - 0x35, 0xa3, 0x6f, 0x9e, 0xee, 0xe7, 0x6b, 0x58, 0xd3, 0x0a, 0x3b, 0xe8, 0xf5, 0x4c, 0x07, 0x2d, - 0xf4, 0xcf, 0xb2, 0x7b, 0x2f, 0x7d, 0xc7, 0x82, 0x33, 0xb9, 0xe5, 0x4e, 0xc0, 0xfa, 0x7a, 0xd5, - 0xb4, 0xbe, 0x3e, 0xde, 0xf7, 0x37, 0x15, 0x98, 0x63, 0xbf, 0x56, 0x2e, 0xf8, 0x16, 0x66, 0xbf, - 0xba, 0x06, 0xa3, 0x4e, 0xb3, 0x49, 0xe2, 0x78, 0x3d, 0x74, 0x55, 0x4a, 0xab, 0xa7, 0xd9, 0x9e, - 0x94, 0x82, 0x8f, 0x0e, 0xe7, 0x66, 0xb3, 0x2c, 0x52, 0x34, 0xd6, 0x39, 0x98, 0x69, 0xf2, 0x4a, - 0x77, 0x35, 0x4d, 0xde, 0x05, 0x80, 0x7d, 0x75, 0xaa, 0xcd, 0x1a, 0xc3, 0xb4, 0xf3, 0xae, 0x46, - 0x85, 0x7e, 0x9a, 0xe9, 0x8a, 0xdc, 0x65, 0x84, 0x5f, 0x72, 0x3c, 0xdb, 0xe7, 0x58, 0xe9, 0xee, - 0x27, 0x3c, 0x10, 0x56, 0x19, 0x0e, 0x15, 0x4b, 0xf4, 0x19, 0x98, 0x8a, 0x79, 0x9e, 0x85, 0x65, - 0xdf, 0x89, 0x59, 0xf8, 0x85, 0x90, 0x89, 0x2c, 0xba, 0xb5, 0x91, 0xc1, 0xe1, 0x0e, 0x6a, 0xfb, - 0xd7, 0xcb, 0xf0, 0x40, 0x97, 0x29, 0x8a, 0x16, 0xcd, 0x2b, 0xde, 0x27, 0xb3, 0xd6, 0x9d, 0xd9, - 0xdc, 0xc2, 0x86, 0xb9, 0x27, 0x33, 0xc6, 0xa5, 0xf7, 0x3d, 0xc6, 0x5f, 0xb1, 0x34, 0xbb, 0x1b, - 0x77, 0x04, 0xfd, 0xd4, 0x31, 0x97, 0xde, 0x8f, 0xab, 0xa1, 0xfe, 0x8b, 0x16, 0x3c, 0x9c, 0xfb, - 0x59, 0x86, 0xab, 0xc8, 0x02, 0x54, 0x9a, 0x14, 0xa8, 0x85, 0x48, 0xa5, 0x81, 0x8a, 0x12, 0x81, - 0x53, 0x1a, 0xc3, 0x23, 0xa4, 0xd4, 0xd3, 0x23, 0xe4, 0x5f, 0x58, 0x30, 0x93, 0x6d, 0xc4, 0x09, - 0x48, 0xa6, 0x35, 0x53, 0x32, 0x7d, 0xb4, 0x9f, 0x21, 0x2f, 0x10, 0x4a, 0x7f, 0x32, 0x01, 0xf7, - 0x15, 0x64, 0xfb, 0xdf, 0x87, 0xe9, 0xed, 0x26, 0x31, 0x83, 0xcf, 0xc4, 0xc7, 0xe4, 0xc6, 0xe9, - 0x75, 0x8d, 0x54, 0xe3, 0xc7, 0x90, 0x0e, 0x12, 0xdc, 0x59, 0x05, 0xfa, 0xa2, 0x05, 0x33, 0xce, - 0xcd, 0xb8, 0xe3, 0xf5, 0x1d, 0x31, 0x67, 0x9e, 0xcb, 0xb5, 0x8e, 0xf5, 0x78, 0xad, 0x87, 0x05, - 0x88, 0xcc, 0xe4, 0x51, 0xe1, 0xdc, 0xba, 0x10, 0x16, 0x59, 0xfd, 0xa8, 0x96, 0xd3, 0x25, 0x3c, - 0x32, 0x2f, 0x78, 0x85, 0xcb, 0x28, 0x89, 0xc1, 0x8a, 0x0f, 0xba, 0x01, 0x95, 0x6d, 0x19, 0x51, - 0x26, 0x64, 0x60, 0xee, 0xa6, 0x92, 0x1b, 0x76, 0xc6, 0x3d, 0xf6, 0x15, 0x0a, 0xa7, 0xac, 0xd0, - 0x2b, 0x50, 0x0e, 0xb6, 0xe2, 0x6e, 0xcf, 0x1d, 0x64, 0x3c, 0xa8, 0x78, 0x9c, 0xeb, 0xd5, 0xd5, - 0x06, 0xa6, 0x05, 0x69, 0xf9, 0x68, 0xd3, 0x15, 0x06, 0xdd, 0xdc, 0xf2, 0x78, 0xa9, 0xd6, 0x59, - 0x1e, 0x2f, 0xd5, 0x30, 0x2d, 0x88, 0x56, 0x61, 0x90, 0x05, 0xa8, 0x08, 0x6b, 0x6d, 0x6e, 0x9c, - 0x7e, 0x47, 0xf0, 0x0d, 0x0f, 0x7c, 0x65, 0x60, 0xcc, 0x8b, 0xa3, 0x57, 0x61, 0xa8, 0xc9, 0xb2, - 0xff, 0x8b, 0xa3, 0x75, 0x7e, 0xee, 0x89, 0x8e, 0xf7, 0x01, 0xf8, 0x1d, 0x15, 0x87, 0x63, 0xc1, - 0x01, 0x6d, 0xc0, 0x50, 0x93, 0xb4, 0x76, 0xb6, 0x62, 0x71, 0x62, 0xfe, 0x78, 0x2e, 0xaf, 0x2e, - 0x8f, 0x5d, 0x08, 0xae, 0x8c, 0x02, 0x0b, 0x5e, 0xe8, 0x93, 0x50, 0xda, 0x6a, 0x8a, 0x58, 0x95, - 0x5c, 0x2b, 0xad, 0x19, 0x8c, 0xbc, 0x34, 0x74, 0xfb, 0x70, 0xae, 0xb4, 0xba, 0x8c, 0x4b, 0x5b, - 0x4d, 0x74, 0x15, 0x86, 0xb7, 0x78, 0x44, 0xa9, 0xc8, 0xd2, 0xfa, 0x58, 0x7e, 0xb0, 0x6b, 0x47, - 0xd0, 0x29, 0x8f, 0xb1, 0x10, 0x08, 0x2c, 0x99, 0xa0, 0x0d, 0x80, 0x2d, 0x15, 0x19, 0x2b, 0xd2, - 0xb4, 0x7e, 0xb4, 0x9f, 0xf8, 0x59, 0x71, 0x7c, 0x54, 0x50, 0xac, 0xf1, 0x41, 0x9f, 0x87, 0x8a, - 0x23, 0xdf, 0x73, 0x61, 0x29, 0x5a, 0xcd, 0x7d, 0x3a, 0x5d, 0x70, 0xdd, 0x9f, 0xba, 0xe1, 0xb3, - 0x55, 0x11, 0xe1, 0x94, 0x29, 0xda, 0x85, 0xf1, 0xfd, 0xb8, 0xb5, 0x43, 0xe4, 0x02, 0x65, 0x79, - 0x5b, 0xcd, 0xa3, 0x66, 0x9a, 0x64, 0x57, 0x10, 0x7a, 0x51, 0xd2, 0x76, 0xfc, 0x0e, 0x99, 0xc2, - 0x02, 0x72, 0x6e, 0xe8, 0xcc, 0xb0, 0xc9, 0x9b, 0x76, 0xfa, 0xbb, 0xed, 0x70, 0xf3, 0x20, 0x21, - 0x22, 0x9b, 0x6b, 0x6e, 0xa7, 0xbf, 0xc6, 0x49, 0x3a, 0x3b, 0x5d, 0x20, 0xb0, 0x64, 0x42, 0x97, - 0xb0, 0x23, 0xdf, 0x4a, 0x12, 0x67, 0xe4, 0xc7, 0x0b, 0xbb, 0xa7, 0xa3, 0xbd, 0x69, 0xa7, 0x30, - 0xd9, 0x97, 0xb2, 0x62, 0x32, 0xaf, 0xb5, 0x13, 0x26, 0x61, 0x90, 0x91, 0xb7, 0xd3, 0xc5, 0x32, - 0xaf, 0x9e, 0x43, 0xdf, 0x29, 0xf3, 0xf2, 0xa8, 0x70, 0x6e, 0x5d, 0xc8, 0x85, 0x89, 0x56, 0x18, - 0x25, 0x37, 0xc3, 0x48, 0xce, 0x2a, 0xd4, 0xe5, 0xf0, 0x64, 0x50, 0x8a, 0x1a, 0x99, 0x7f, 0xad, - 0x89, 0xc1, 0x19, 0x9e, 0x74, 0x48, 0xe2, 0xa6, 0xe3, 0x93, 0xb5, 0x6b, 0xd5, 0x53, 0xc5, 0x43, - 0xd2, 0xe0, 0x24, 0x9d, 0x43, 0x22, 0x10, 0x58, 0x32, 0xa1, 0xd2, 0x87, 0x25, 0x06, 0x67, 0xe9, - 0x67, 0x0b, 0xa4, 0x4f, 0x87, 0xe7, 0x29, 0x97, 0x3e, 0x0c, 0x8c, 0x79, 0x71, 0x3a, 0xf3, 0x85, - 0x4e, 0x18, 0xc6, 0xd5, 0xd3, 0xc5, 0x33, 0x5f, 0xa8, 0x92, 0xd7, 0x1a, 0xdd, 0x66, 0xbe, 0x22, - 0xc2, 0x29, 0x53, 0xfb, 0x9b, 0x43, 0x9d, 0xda, 0x02, 0xd3, 0xfd, 0xbf, 0x64, 0x75, 0x5c, 0x9f, - 0x7e, 0xa2, 0xdf, 0x03, 0xeb, 0x5d, 0xbc, 0x48, 0xfd, 0xa2, 0x05, 0xf7, 0xb5, 0x72, 0x3f, 0x4a, - 0x6c, 0xbd, 0xfd, 0x9d, 0x7b, 0x79, 0x37, 0xa8, 0xc4, 0xce, 0xf9, 0x78, 0x5c, 0x50, 0x53, 0x56, - 0x47, 0x2e, 0xbf, 0x6f, 0x1d, 0x79, 0x1d, 0x46, 0x98, 0x7a, 0x97, 0x26, 0x92, 0xe9, 0xcb, 0x09, - 0x89, 0x6d, 0xe2, 0xcb, 0xa2, 0x20, 0x56, 0x2c, 0xd0, 0xcf, 0x59, 0xf0, 0x50, 0xb6, 0xe9, 0x98, - 0x30, 0xb4, 0x48, 0x4a, 0xc8, 0x8f, 0x1d, 0xab, 0xe2, 0xfb, 0x1f, 0xaa, 0x77, 0x23, 0x3e, 0xea, - 0x45, 0x80, 0xbb, 0x57, 0x86, 0x6a, 0x39, 0xe7, 0x9e, 0x21, 0xf3, 0x76, 0xa5, 0xf7, 0xd9, 0x07, - 0x3d, 0x07, 0x63, 0x7b, 0x61, 0x3b, 0x90, 0x11, 0x02, 0x22, 0xfe, 0x93, 0x59, 0xf2, 0xd6, 0x35, - 0x38, 0x36, 0xa8, 0x4e, 0x56, 0xdf, 0xff, 0xba, 0x95, 0xa3, 0xa8, 0xf2, 0x93, 0xd9, 0xcb, 0xe6, - 0xc9, 0xec, 0xd1, 0xec, 0xc9, 0xac, 0xc3, 0xce, 0x62, 0x1c, 0xca, 0xfa, 0x4f, 0xb6, 0xda, 0x6f, - 0xa6, 0x1d, 0xdb, 0x87, 0x73, 0xbd, 0x84, 0x33, 0x73, 0xc4, 0x72, 0xd5, 0x0d, 0x65, 0xea, 0x88, - 0xe5, 0xae, 0xd5, 0x30, 0xc3, 0xf4, 0x9b, 0xb3, 0xc1, 0xfe, 0xaf, 0x16, 0x94, 0xeb, 0xa1, 0x7b, - 0x02, 0x76, 0xa3, 0x4f, 0x19, 0x76, 0xa3, 0x07, 0x0a, 0x5e, 0x5e, 0x2c, 0xb4, 0x12, 0xad, 0x64, - 0xac, 0x44, 0x0f, 0x15, 0x31, 0xe8, 0x6e, 0x13, 0xfa, 0x7b, 0x65, 0xd0, 0xdf, 0x89, 0x44, 0xff, - 0xea, 0x4e, 0x3c, 0x7a, 0xcb, 0xdd, 0x9e, 0x8e, 0x14, 0x9c, 0x99, 0xff, 0x96, 0x0c, 0x16, 0xfc, - 0x31, 0x73, 0xec, 0x7d, 0x9d, 0x78, 0xdb, 0x3b, 0x09, 0x71, 0xb3, 0x9f, 0x73, 0x72, 0x8e, 0xbd, - 0xff, 0xd9, 0x82, 0xc9, 0x4c, 0xed, 0xc8, 0xcf, 0x8b, 0x3c, 0xba, 0x43, 0x4b, 0xd0, 0x74, 0xcf, - 0x50, 0xa5, 0x79, 0x00, 0x65, 0x94, 0x97, 0xd6, 0x16, 0xa6, 0xfb, 0x2a, 0xab, 0x7d, 0x8c, 0x35, - 0x0a, 0xf4, 0x3c, 0x8c, 0x26, 0x61, 0x2b, 0xf4, 0xc3, 0xed, 0x83, 0xcb, 0x44, 0x66, 0x09, 0x51, - 0x57, 0x27, 0x1b, 0x29, 0x0a, 0xeb, 0x74, 0xf6, 0xaf, 0x96, 0x21, 0xfb, 0xb6, 0xe8, 0xff, 0x9b, - 0x93, 0x1f, 0xce, 0x39, 0xf9, 0x3d, 0x0b, 0xa6, 0x68, 0xed, 0xcc, 0x37, 0x46, 0xba, 0xc4, 0xaa, - 0x57, 0x19, 0xac, 0x2e, 0xaf, 0x32, 0x3c, 0x4a, 0x65, 0x97, 0x1b, 0xb6, 0x13, 0x61, 0x15, 0xd2, - 0x84, 0x13, 0x85, 0x62, 0x81, 0x15, 0x74, 0x24, 0x8a, 0x44, 0x3c, 0x91, 0x4e, 0x47, 0xa2, 0x08, - 0x0b, 0xac, 0x7c, 0xb4, 0x61, 0xa0, 0xe0, 0xd1, 0x06, 0x96, 0x60, 0x4b, 0xf8, 0x63, 0x08, 0x85, - 0x42, 0x4b, 0xb0, 0x25, 0x1d, 0x35, 0x52, 0x1a, 0xfb, 0x1b, 0x65, 0x18, 0xab, 0x87, 0x6e, 0xea, - 0x45, 0xff, 0x9c, 0xe1, 0x45, 0x7f, 0x2e, 0xe3, 0x45, 0x3f, 0xa5, 0xd3, 0xde, 0x1d, 0x27, 0x7a, - 0x91, 0x7e, 0x8d, 0x3d, 0x21, 0x72, 0x87, 0x0e, 0xf4, 0x46, 0xfa, 0x35, 0xc5, 0x08, 0x9b, 0x7c, - 0x7f, 0x92, 0x1c, 0xe7, 0xff, 0xdc, 0x82, 0x89, 0x7a, 0xe8, 0xd2, 0x09, 0xfa, 0x93, 0x34, 0x1b, - 0xf5, 0xf4, 0x6d, 0x43, 0x5d, 0xd2, 0xb7, 0xfd, 0x7d, 0x0b, 0x86, 0xeb, 0xa1, 0x7b, 0x02, 0x16, - 0xd3, 0x97, 0x4d, 0x8b, 0xe9, 0xfd, 0x05, 0x52, 0xb6, 0xc0, 0x48, 0xfa, 0x5b, 0x65, 0x18, 0xa7, - 0xed, 0x0c, 0xb7, 0xe5, 0x28, 0x19, 0x3d, 0x62, 0xf5, 0xd1, 0x23, 0x54, 0x99, 0x0b, 0x7d, 0x3f, - 0xbc, 0x99, 0x1d, 0xb1, 0x55, 0x06, 0xc5, 0x02, 0x8b, 0x9e, 0x82, 0x91, 0x56, 0x44, 0xf6, 0xbd, - 0xb0, 0x1d, 0x67, 0x23, 0x12, 0xeb, 0x02, 0x8e, 0x15, 0x05, 0xd5, 0xdb, 0x63, 0x2f, 0x68, 0x12, - 0xe9, 0xa3, 0x31, 0xc0, 0x7c, 0x34, 0x78, 0x06, 0x4c, 0x0d, 0x8e, 0x0d, 0x2a, 0xf4, 0x3a, 0x54, - 0xd8, 0x7f, 0xb6, 0x6e, 0x8e, 0xff, 0x26, 0x83, 0x48, 0x3b, 0x2d, 0x18, 0xe0, 0x94, 0x17, 0xba, - 0x00, 0x90, 0x48, 0x6f, 0x92, 0x58, 0x04, 0xcc, 0x2a, 0x8d, 0x52, 0xf9, 0x99, 0xc4, 0x58, 0xa3, - 0x42, 0x4f, 0x42, 0x25, 0x71, 0x3c, 0xff, 0x8a, 0x17, 0x90, 0x58, 0x78, 0xe3, 0x88, 0xac, 0xd2, - 0x02, 0x88, 0x53, 0x3c, 0xdd, 0xd1, 0x59, 0x38, 0x36, 0x7f, 0xd1, 0x65, 0x84, 0x51, 0xb3, 0x1d, - 0xfd, 0x8a, 0x82, 0x62, 0x8d, 0xc2, 0x7e, 0x11, 0x4e, 0xd7, 0x43, 0xb7, 0x1e, 0x46, 0xc9, 0x6a, - 0x18, 0xdd, 0x74, 0x22, 0x57, 0x8e, 0xdf, 0x9c, 0x4c, 0x70, 0x4c, 0x77, 0xdd, 0x41, 0x6e, 0x0d, - 0x30, 0x52, 0x17, 0x3f, 0xcb, 0xf6, 0xf4, 0x63, 0x86, 0x4e, 0xfc, 0xdb, 0x12, 0xa0, 0x3a, 0xf3, - 0x77, 0x31, 0x9e, 0xfd, 0x79, 0x1b, 0x26, 0x62, 0x72, 0xc5, 0x0b, 0xda, 0xb7, 0xe4, 0xf9, 0xaa, - 0x4b, 0x5c, 0x4a, 0x63, 0x45, 0xa7, 0xe4, 0x16, 0x15, 0x13, 0x86, 0x33, 0xdc, 0x68, 0x17, 0x46, - 0xed, 0x60, 0x31, 0xbe, 0x1e, 0x93, 0x48, 0x3c, 0x73, 0xc3, 0xba, 0x10, 0x4b, 0x20, 0x4e, 0xf1, - 0x74, 0xca, 0xb0, 0x3f, 0x57, 0xc3, 0x00, 0x87, 0x61, 0x22, 0x27, 0x19, 0x7b, 0x28, 0x41, 0x83, - 0x63, 0x83, 0x0a, 0xad, 0x02, 0x8a, 0xdb, 0xad, 0x96, 0xcf, 0xae, 0x07, 0x1d, 0xff, 0x62, 0x14, - 0xb6, 0x5b, 0xdc, 0x61, 0x59, 0xbc, 0x31, 0xd0, 0xe8, 0xc0, 0xe2, 0x9c, 0x12, 0x54, 0x30, 0x6c, - 0xc5, 0xec, 0xb7, 0x88, 0xc8, 0xe6, 0xb6, 0xcd, 0x06, 0x03, 0x61, 0x89, 0xb3, 0xbf, 0xc0, 0x36, - 0x33, 0xf6, 0x3a, 0x49, 0xd2, 0x8e, 0x08, 0xda, 0x83, 0xf1, 0x16, 0xdb, 0xb0, 0x92, 0x28, 0xf4, - 0x7d, 0x22, 0xf5, 0xc6, 0x3b, 0xf3, 0xbd, 0xe1, 0xaf, 0x15, 0xe8, 0xec, 0xb0, 0xc9, 0xdd, 0xfe, - 0xd2, 0x24, 0x93, 0x4b, 0x0d, 0x7e, 0x68, 0x19, 0x16, 0x1e, 0xb5, 0x42, 0x43, 0x9b, 0x2d, 0x7e, - 0x0d, 0x2c, 0x95, 0xf4, 0xc2, 0x2b, 0x17, 0xcb, 0xb2, 0xe8, 0x35, 0xe6, 0xe9, 0xcd, 0x85, 0x41, - 0xaf, 0x77, 0x08, 0x39, 0x95, 0xe1, 0xe5, 0x2d, 0x0a, 0x62, 0x8d, 0x09, 0xba, 0x02, 0xe3, 0xe2, - 0x31, 0x0b, 0x61, 0x78, 0x28, 0x1b, 0xc7, 0xdf, 0x71, 0xac, 0x23, 0x8f, 0xb2, 0x00, 0x6c, 0x16, - 0x46, 0xdb, 0xf0, 0x90, 0xf6, 0xf4, 0x52, 0x8e, 0xff, 0x17, 0x97, 0x2d, 0x0f, 0xdf, 0x3e, 0x9c, - 0x7b, 0x68, 0xa3, 0x1b, 0x21, 0xee, 0xce, 0x07, 0x5d, 0x83, 0xd3, 0x4e, 0x33, 0xf1, 0xf6, 0x49, - 0x8d, 0x38, 0xae, 0xef, 0x05, 0xc4, 0x0c, 0xd1, 0x3f, 0x73, 0xfb, 0x70, 0xee, 0xf4, 0x62, 0x1e, - 0x01, 0xce, 0x2f, 0x87, 0x5e, 0x86, 0x8a, 0x1b, 0xc4, 0xa2, 0x0f, 0x86, 0x8c, 0x57, 0xc5, 0x2a, - 0xb5, 0xab, 0x0d, 0xf5, 0xfd, 0xe9, 0x1f, 0x9c, 0x16, 0x40, 0xdb, 0x30, 0xa6, 0x87, 0xe1, 0x88, - 0x17, 0xe9, 0x9e, 0xee, 0x72, 0xb6, 0x35, 0x62, 0x57, 0xb8, 0xd5, 0x4d, 0x79, 0x57, 0x1a, 0x61, - 0x2d, 0x06, 0x63, 0xf4, 0x2a, 0xa0, 0x98, 0x44, 0xfb, 0x5e, 0x93, 0x2c, 0x36, 0x59, 0x8a, 0x58, - 0x66, 0xab, 0x19, 0x31, 0x42, 0x05, 0x50, 0xa3, 0x83, 0x02, 0xe7, 0x94, 0x42, 0x97, 0xa8, 0x44, - 0xd1, 0xa1, 0xc2, 0x19, 0x56, 0xaa, 0x79, 0xd5, 0x1a, 0x69, 0x45, 0xa4, 0xe9, 0x24, 0xc4, 0x35, - 0x39, 0xe2, 0x4c, 0x39, 0xba, 0xdf, 0xa8, 0xcc, 0xfb, 0x60, 0xba, 0x70, 0x76, 0x66, 0xdf, 0xa7, - 0x27, 0xa4, 0x9d, 0x30, 0x4e, 0xae, 0x92, 0xe4, 0x66, 0x18, 0xed, 0x8a, 0xbc, 0x5a, 0x69, 0xda, - 0xbd, 0x14, 0x85, 0x75, 0x3a, 0xaa, 0x11, 0xb1, 0x4b, 0xb0, 0xb5, 0x1a, 0xbb, 0xa7, 0x18, 0x49, - 0xd7, 0xc9, 0x25, 0x0e, 0xc6, 0x12, 0x2f, 0x49, 0xd7, 0xea, 0xcb, 0xec, 0xf6, 0x21, 0x43, 0xba, - 0x56, 0x5f, 0xc6, 0x12, 0x8f, 0x48, 0xe7, 0x8b, 0x6d, 0x13, 0xc5, 0xf7, 0x46, 0x9d, 0x72, 0xb9, - 0xcf, 0x47, 0xdb, 0x02, 0x98, 0x52, 0x6f, 0xc5, 0xf1, 0x84, 0x63, 0x71, 0x75, 0x92, 0x4d, 0x92, - 0xfe, 0xb3, 0x95, 0x29, 0x5b, 0xdc, 0x5a, 0x86, 0x13, 0xee, 0xe0, 0x6d, 0xa4, 0x7e, 0x98, 0xea, - 0xf9, 0x72, 0xc2, 0x02, 0x54, 0xe2, 0xf6, 0xa6, 0x1b, 0xee, 0x39, 0x5e, 0xc0, 0x2e, 0x0b, 0xf4, - 0x27, 0xf3, 0x25, 0x02, 0xa7, 0x34, 0x68, 0x15, 0x46, 0x1c, 0x71, 0xf8, 0x12, 0xe6, 0xfd, 0xdc, - 0x58, 0x70, 0x79, 0x40, 0xe3, 0x76, 0x50, 0xf9, 0x0f, 0xab, 0xb2, 0xe8, 0x25, 0x18, 0x17, 0xe1, - 0x4a, 0xc2, 0xd3, 0xf0, 0x94, 0xe9, 0xd9, 0xde, 0xd0, 0x91, 0xd8, 0xa4, 0x45, 0x3f, 0x0d, 0x13, - 0x94, 0x4b, 0x2a, 0xd8, 0xaa, 0x33, 0xfd, 0x48, 0x44, 0x2d, 0x23, 0xb6, 0x5e, 0x18, 0x67, 0x98, - 0x21, 0x17, 0x1e, 0x74, 0xda, 0x49, 0xc8, 0x8c, 0x95, 0xe6, 0xfc, 0xdf, 0x08, 0x77, 0x49, 0xc0, - 0xac, 0xfb, 0x23, 0x4b, 0xe7, 0x6e, 0x1f, 0xce, 0x3d, 0xb8, 0xd8, 0x85, 0x0e, 0x77, 0xe5, 0x82, - 0xae, 0xc3, 0x68, 0x12, 0xfa, 0xc2, 0x45, 0x38, 0xae, 0xde, 0x57, 0x9c, 0xba, 0x66, 0x43, 0x91, - 0xe9, 0xe6, 0x04, 0x55, 0x14, 0xeb, 0x7c, 0xd0, 0x06, 0x5f, 0x63, 0x2c, 0xd1, 0x22, 0x89, 0xab, - 0xf7, 0x17, 0x77, 0x8c, 0xca, 0xc7, 0x68, 0x2e, 0x41, 0x51, 0x12, 0xeb, 0x6c, 0xd0, 0x45, 0x98, - 0x6e, 0x45, 0x5e, 0xc8, 0x26, 0xb6, 0x32, 0x14, 0x57, 0x8d, 0xa4, 0x66, 0xd3, 0xf5, 0x2c, 0x01, - 0xee, 0x2c, 0x83, 0xce, 0x53, 0x05, 0x95, 0x03, 0xab, 0x67, 0xf8, 0x8b, 0x1a, 0x5c, 0x39, 0xe5, - 0x30, 0xac, 0xb0, 0xb3, 0x9f, 0x86, 0xe9, 0x0e, 0x49, 0x79, 0x2c, 0x77, 0xcd, 0x7f, 0x3c, 0x08, - 0x15, 0x65, 0x0e, 0x44, 0x0b, 0xa6, 0x95, 0xf7, 0x4c, 0xd6, 0xca, 0x3b, 0x42, 0xf5, 0x35, 0xdd, - 0xb0, 0xbb, 0x91, 0xf3, 0x20, 0xf8, 0xb9, 0x02, 0xd1, 0xd0, 0x7f, 0x6c, 0xd5, 0x31, 0x1e, 0x4b, - 0x4f, 0x0f, 0x8c, 0x03, 0x5d, 0x0f, 0x8c, 0x7d, 0x3e, 0xce, 0x47, 0x8f, 0x86, 0xad, 0xd0, 0x5d, - 0xab, 0x67, 0x5f, 0xab, 0xaa, 0x53, 0x20, 0xe6, 0x38, 0xa6, 0xdc, 0xd3, 0x6d, 0x9d, 0x29, 0xf7, - 0xc3, 0x77, 0xa8, 0xdc, 0x4b, 0x06, 0x38, 0xe5, 0x85, 0x7c, 0x98, 0x6e, 0x9a, 0x0f, 0x8d, 0xa9, - 0x78, 0xaa, 0x47, 0x7a, 0x3e, 0xf9, 0xd5, 0xd6, 0x5e, 0x20, 0x59, 0xce, 0x72, 0xc1, 0x9d, 0x8c, - 0xd1, 0x4b, 0x30, 0xf2, 0x6e, 0x18, 0xb3, 0x69, 0x27, 0xf6, 0x36, 0x19, 0xc1, 0x32, 0xf2, 0xda, - 0xb5, 0x06, 0x83, 0x1f, 0x1d, 0xce, 0x8d, 0xd6, 0x43, 0x57, 0xfe, 0xc5, 0xaa, 0x00, 0xba, 0x05, - 0xa7, 0x0d, 0x89, 0xa0, 0x9a, 0x0b, 0xfd, 0x37, 0xf7, 0x21, 0x51, 0xdd, 0xe9, 0xb5, 0x3c, 0x4e, - 0x38, 0xbf, 0x02, 0xfb, 0x9b, 0xdc, 0xe8, 0x29, 0x4c, 0x23, 0x24, 0x6e, 0xfb, 0x27, 0xf1, 0xcc, - 0xc0, 0x8a, 0x61, 0xb5, 0xb9, 0x63, 0xc3, 0xfa, 0xef, 0x5b, 0xcc, 0xb0, 0xbe, 0x41, 0xf6, 0x5a, - 0xbe, 0x93, 0x9c, 0x84, 0x93, 0xee, 0x6b, 0x30, 0x92, 0x88, 0xda, 0xba, 0xbd, 0x8c, 0xa0, 0x35, - 0x8a, 0x5d, 0x2e, 0xa8, 0x0d, 0x51, 0x42, 0xb1, 0x62, 0x63, 0xff, 0x53, 0x3e, 0x02, 0x12, 0x73, - 0x02, 0xb6, 0x85, 0x9a, 0x69, 0x5b, 0x98, 0xeb, 0xf1, 0x05, 0x05, 0x36, 0x86, 0x7f, 0x62, 0xb6, - 0x9b, 0x9d, 0x3d, 0x3e, 0xec, 0x37, 0x3a, 0xf6, 0x2f, 0x59, 0x30, 0x93, 0xe7, 0x08, 0x40, 0x95, - 0x18, 0x7e, 0xf2, 0x51, 0x37, 0x5c, 0xaa, 0x07, 0x6f, 0x08, 0x38, 0x56, 0x14, 0x7d, 0x67, 0x27, - 0x3f, 0x5e, 0xba, 0xa6, 0x6b, 0x60, 0xbe, 0x49, 0x87, 0x5e, 0xe1, 0x5e, 0xf7, 0x96, 0x7a, 0x34, - 0xee, 0x78, 0x1e, 0xf7, 0xf6, 0xaf, 0x95, 0x60, 0x86, 0x9b, 0xa8, 0x17, 0xf7, 0x43, 0xcf, 0xad, - 0x87, 0xae, 0x88, 0x41, 0x78, 0x13, 0xc6, 0x5a, 0xda, 0x71, 0xb5, 0x5b, 0xc2, 0x18, 0xfd, 0x58, - 0x9b, 0x1e, 0x1b, 0x74, 0x28, 0x36, 0x78, 0x21, 0x17, 0xc6, 0xc8, 0xbe, 0xd7, 0x54, 0x76, 0xce, - 0xd2, 0xb1, 0x45, 0xba, 0xaa, 0x65, 0x45, 0xe3, 0x83, 0x0d, 0xae, 0xf7, 0xe0, 0x0d, 0x11, 0xfb, - 0xab, 0x16, 0xdc, 0x5f, 0x90, 0x5e, 0x86, 0x56, 0x77, 0x93, 0x5d, 0x06, 0x88, 0x07, 0x0e, 0x55, - 0x75, 0xfc, 0x8a, 0x00, 0x0b, 0x2c, 0xfa, 0x2c, 0x00, 0x37, 0xf1, 0xb3, 0xe7, 0xe4, 0x4b, 0xdd, - 0xe3, 0xd7, 0x8d, 0xb4, 0x0b, 0x5a, 0x6c, 0xbe, 0x7a, 0x40, 0x5e, 0xe3, 0x65, 0xff, 0x4a, 0x19, - 0x06, 0xf9, 0x6b, 0xd7, 0xab, 0x30, 0xbc, 0xc3, 0x93, 0xd9, 0xf6, 0x93, 0x37, 0x37, 0x3d, 0x8e, - 0x70, 0x00, 0x96, 0x85, 0xd1, 0x3a, 0x9c, 0x12, 0x71, 0x2e, 0x35, 0xe2, 0x3b, 0x07, 0xf2, 0x54, - 0xcb, 0x1f, 0x96, 0x90, 0x49, 0xcf, 0x4f, 0xad, 0x75, 0x92, 0xe0, 0xbc, 0x72, 0xe8, 0x95, 0x8e, - 0x14, 0x76, 0x3c, 0x0d, 0xb0, 0xd2, 0x81, 0x7b, 0xa4, 0xb1, 0x7b, 0x09, 0xc6, 0x5b, 0x1d, 0xe7, - 0x77, 0xed, 0xa1, 0x61, 0xf3, 0xcc, 0x6e, 0xd2, 0x32, 0xaf, 0x82, 0x36, 0xf3, 0xa1, 0xd8, 0xd8, - 0x89, 0x48, 0xbc, 0x13, 0xfa, 0xae, 0x78, 0x55, 0x33, 0xf5, 0x2a, 0xc8, 0xe0, 0x71, 0x47, 0x09, - 0xca, 0x65, 0xcb, 0xf1, 0xfc, 0x76, 0x44, 0x52, 0x2e, 0x43, 0x26, 0x97, 0xd5, 0x0c, 0x1e, 0x77, - 0x94, 0xa0, 0xf3, 0xe8, 0xb4, 0x78, 0x92, 0x51, 0x46, 0x3f, 0x2b, 0x57, 0x91, 0x61, 0xe9, 0xdf, - 0xde, 0x25, 0x23, 0x87, 0xb8, 0xf2, 0x57, 0x8f, 0x3a, 0x6a, 0x0f, 0x7e, 0x09, 0xcf, 0x76, 0xc9, - 0xe5, 0x4e, 0x1e, 0x06, 0xfc, 0x63, 0x0b, 0x4e, 0xe5, 0xb8, 0x8f, 0x71, 0x51, 0xb5, 0xed, 0xc5, - 0x89, 0x7a, 0xcf, 0x40, 0x13, 0x55, 0x1c, 0x8e, 0x15, 0x05, 0x5d, 0x0f, 0x5c, 0x18, 0x66, 0x05, - 0xa0, 0x70, 0xf9, 0x10, 0xd8, 0xe3, 0x09, 0x40, 0x74, 0x0e, 0x06, 0xda, 0x31, 0x89, 0xe4, 0x8b, - 0x7a, 0x52, 0x7e, 0x33, 0x8b, 0x20, 0xc3, 0x50, 0x8d, 0x72, 0x5b, 0x19, 0xe3, 0x34, 0x8d, 0x92, - 0x9b, 0xe3, 0x38, 0xce, 0xfe, 0x4a, 0x19, 0x26, 0x33, 0x0e, 0xa0, 0xb4, 0x21, 0x7b, 0x61, 0xe0, - 0x25, 0xa1, 0xca, 0xa0, 0xc6, 0x13, 0x46, 0x90, 0xd6, 0xce, 0xba, 0x80, 0x63, 0x45, 0x81, 0x1e, - 0x95, 0xcf, 0xac, 0x66, 0xdf, 0x69, 0x58, 0xaa, 0x19, 0x2f, 0xad, 0xf6, 0xfb, 0xe0, 0xca, 0x23, - 0x30, 0xd0, 0x0a, 0xd5, 0x1b, 0xd8, 0x6a, 0x3c, 0xf1, 0x52, 0xad, 0x1e, 0x86, 0x3e, 0x66, 0x48, - 0xf4, 0x31, 0xf1, 0xf5, 0x99, 0xfb, 0x0a, 0xec, 0xb8, 0x61, 0xac, 0x75, 0xc1, 0xe3, 0x30, 0xbc, - 0x4b, 0x0e, 0x22, 0x2f, 0xd8, 0xce, 0xde, 0xd6, 0x5c, 0xe6, 0x60, 0x2c, 0xf1, 0x66, 0xc2, 0xf2, - 0xe1, 0x7b, 0xf2, 0x66, 0xca, 0x48, 0xcf, 0x5d, 0xed, 0xb7, 0x2c, 0x98, 0x64, 0xd9, 0x4a, 0x45, - 0x9c, 0xbd, 0x17, 0x06, 0x27, 0xa0, 0x27, 0x3c, 0x02, 0x83, 0x11, 0xad, 0x34, 0xfb, 0x10, 0x02, - 0x6b, 0x09, 0xe6, 0x38, 0xf4, 0x20, 0x0c, 0xb0, 0x26, 0xd0, 0xc1, 0x1b, 0xe3, 0xf9, 0xca, 0x6b, - 0x4e, 0xe2, 0x60, 0x06, 0x65, 0x01, 0x4f, 0x98, 0xb4, 0x7c, 0x8f, 0x37, 0x3a, 0x35, 0xb7, 0x7e, - 0x38, 0x02, 0x9e, 0x72, 0x9b, 0xf6, 0xfe, 0x02, 0x9e, 0xf2, 0x59, 0x76, 0xd7, 0xc1, 0xff, 0x5b, - 0x09, 0xce, 0xe6, 0x96, 0x4b, 0x6f, 0x76, 0x57, 0x8d, 0x9b, 0xdd, 0x0b, 0x99, 0x9b, 0x5d, 0xbb, - 0x7b, 0xe9, 0xbb, 0x73, 0xd7, 0x9b, 0x7f, 0x05, 0x5b, 0x3e, 0xc1, 0x2b, 0xd8, 0x81, 0x7e, 0xd5, - 0x94, 0xc1, 0x1e, 0x6a, 0xca, 0x77, 0x2c, 0x38, 0x93, 0xdb, 0x65, 0x1f, 0x92, 0x08, 0xb3, 0xdc, - 0xb6, 0x15, 0x9c, 0x21, 0x7e, 0x54, 0x2a, 0xf8, 0x16, 0x76, 0x9a, 0x38, 0x4f, 0xe5, 0x0c, 0x43, - 0xc6, 0x42, 0xed, 0x1a, 0xe3, 0x32, 0x86, 0xc3, 0xb0, 0xc2, 0x22, 0x4f, 0x8b, 0xd5, 0xe2, 0x4d, - 0x7b, 0xe9, 0x58, 0x4b, 0x66, 0xde, 0xb4, 0x8e, 0xeb, 0x49, 0x01, 0xb2, 0x71, 0x5b, 0xeb, 0xda, - 0x09, 0xb0, 0xdc, 0xff, 0x09, 0x70, 0x2c, 0xff, 0xf4, 0x87, 0x16, 0x61, 0x72, 0xcf, 0x0b, 0xd8, - 0x6b, 0xa6, 0xa6, 0xde, 0xa3, 0x02, 0x5c, 0xd7, 0x4d, 0x34, 0xce, 0xd2, 0xcf, 0xbe, 0x04, 0xe3, - 0x77, 0x6e, 0xb2, 0xfa, 0x5e, 0x19, 0x1e, 0xe8, 0xb2, 0xec, 0xb9, 0xac, 0x37, 0xc6, 0x40, 0x93, - 0xf5, 0x1d, 0xe3, 0x50, 0x87, 0x99, 0xad, 0xb6, 0xef, 0x1f, 0x30, 0x2f, 0x27, 0xe2, 0x4a, 0x0a, - 0xa1, 0x98, 0xa8, 0x54, 0xc4, 0xab, 0x39, 0x34, 0x38, 0xb7, 0x24, 0x7a, 0x15, 0x50, 0xb8, 0xc9, - 0xd2, 0xe3, 0xba, 0x69, 0xaa, 0x03, 0xd6, 0xf1, 0xe5, 0x74, 0x31, 0x5e, 0xeb, 0xa0, 0xc0, 0x39, - 0xa5, 0xa8, 0x86, 0xc9, 0xde, 0x5f, 0x57, 0xcd, 0xca, 0x68, 0x98, 0x58, 0x47, 0x62, 0x93, 0x16, - 0x5d, 0x84, 0x69, 0x67, 0xdf, 0xf1, 0x78, 0xea, 0x2b, 0xc9, 0x80, 0xab, 0x98, 0xca, 0x50, 0xb4, - 0x98, 0x25, 0xc0, 0x9d, 0x65, 0xd0, 0x96, 0x61, 0xe5, 0xe3, 0x99, 0xf7, 0x2f, 0xf4, 0x3d, 0x5b, - 0xfb, 0xb6, 0xfb, 0xd9, 0xff, 0xd1, 0xa2, 0xdb, 0x57, 0xce, 0xf3, 0x99, 0xb4, 0x1f, 0x94, 0xfd, - 0x4a, 0x8b, 0x33, 0x53, 0xfd, 0xb0, 0xac, 0x23, 0xb1, 0x49, 0xcb, 0x27, 0x44, 0x9c, 0x3a, 0x59, - 0x1b, 0x7a, 0xa2, 0x08, 0xcc, 0x54, 0x14, 0xe8, 0x0d, 0x18, 0x76, 0xbd, 0x7d, 0x2f, 0x0e, 0x23, - 0xb1, 0x58, 0x8e, 0xfb, 0x64, 0xb4, 0x92, 0x83, 0x35, 0xce, 0x06, 0x4b, 0x7e, 0xf6, 0x57, 0x4a, - 0x30, 0x2e, 0x6b, 0x7c, 0xad, 0x1d, 0x26, 0xce, 0x09, 0x6c, 0xcb, 0x17, 0x8d, 0x6d, 0xf9, 0x63, - 0xdd, 0xa2, 0x53, 0x59, 0x93, 0x0a, 0xb7, 0xe3, 0x6b, 0x99, 0xed, 0xf8, 0xb1, 0xde, 0xac, 0xba, - 0x6f, 0xc3, 0xff, 0xcc, 0x82, 0x69, 0x83, 0xfe, 0x04, 0x76, 0x83, 0x55, 0x73, 0x37, 0x78, 0xb8, - 0xe7, 0x37, 0x14, 0xec, 0x02, 0x5f, 0x2f, 0x65, 0xda, 0xce, 0xa4, 0xff, 0xbb, 0x30, 0xb0, 0xe3, - 0x44, 0x6e, 0xb7, 0x04, 0x8e, 0x1d, 0x85, 0xe6, 0x2f, 0x39, 0x91, 0xcb, 0x65, 0xf8, 0x53, 0xea, - 0x65, 0x2f, 0x27, 0x72, 0x7b, 0xc6, 0x14, 0xb0, 0xaa, 0xd0, 0x8b, 0x30, 0x14, 0x37, 0xc3, 0x96, - 0xf2, 0xbd, 0x3c, 0xc7, 0x5f, 0xfd, 0xa2, 0x90, 0xa3, 0xc3, 0x39, 0x64, 0x56, 0x47, 0xc1, 0x58, - 0xd0, 0xcf, 0x6e, 0x43, 0x45, 0x55, 0x7d, 0x4f, 0xbd, 0xca, 0xff, 0xb0, 0x0c, 0xa7, 0x72, 0xe6, - 0x05, 0x8a, 0x8d, 0xde, 0x7a, 0xa6, 0xcf, 0xe9, 0xf4, 0x3e, 0xfb, 0x2b, 0x66, 0x27, 0x16, 0x57, - 0x8c, 0x7f, 0xdf, 0x95, 0x5e, 0x8f, 0x49, 0xb6, 0x52, 0x0a, 0xea, 0x5d, 0x29, 0xad, 0xec, 0xc4, - 0xba, 0x9a, 0x56, 0xa4, 0x5a, 0x7a, 0x4f, 0xc7, 0xf4, 0x4f, 0xcb, 0x30, 0x93, 0x17, 0xd4, 0x8e, - 0x7e, 0x26, 0xf3, 0x1c, 0xc4, 0x73, 0xfd, 0x86, 0xc3, 0xf3, 0x37, 0x22, 0x44, 0xae, 0x98, 0x79, - 0xf3, 0x81, 0x88, 0x9e, 0xdd, 0x2c, 0xea, 0x64, 0x41, 0x3e, 0x11, 0x7f, 0xc6, 0x43, 0x2e, 0xf1, - 0x4f, 0xf4, 0xdd, 0x00, 0xf1, 0xfe, 0x47, 0x9c, 0x09, 0xf2, 0x91, 0xe0, 0xde, 0x41, 0x3e, 0xb2, - 0xe6, 0x59, 0x0f, 0x46, 0xb5, 0xaf, 0xb9, 0xa7, 0x23, 0xbe, 0x4b, 0x77, 0x14, 0xad, 0xdd, 0xf7, - 0x74, 0xd4, 0xbf, 0x6a, 0x41, 0xc6, 0x4f, 0x4a, 0xd9, 0x3f, 0xac, 0x42, 0xfb, 0xc7, 0x39, 0x18, - 0x88, 0x42, 0x9f, 0x64, 0x5f, 0x08, 0xc0, 0xa1, 0x4f, 0x30, 0xc3, 0xa8, 0x67, 0x7c, 0xcb, 0x45, - 0xcf, 0xf8, 0xd2, 0xa3, 0xb1, 0x4f, 0xf6, 0x89, 0xb4, 0x46, 0x28, 0x99, 0x7c, 0x85, 0x02, 0x31, - 0xc7, 0xd9, 0xbf, 0x31, 0x00, 0xa7, 0x72, 0x42, 0xda, 0xe8, 0x41, 0x65, 0xdb, 0x49, 0xc8, 0x4d, - 0xe7, 0x20, 0x9b, 0xb5, 0xf4, 0x22, 0x07, 0x63, 0x89, 0x67, 0xbe, 0x9c, 0x3c, 0xf1, 0x59, 0xc6, - 0x46, 0x24, 0xf2, 0x9d, 0x09, 0xec, 0xbd, 0x7a, 0xd9, 0xf5, 0x02, 0x40, 0x1c, 0xfb, 0x2b, 0x01, - 0x55, 0xbe, 0x5c, 0xe1, 0x29, 0x9a, 0x66, 0xc9, 0x6b, 0x5c, 0x11, 0x18, 0xac, 0x51, 0xa1, 0x1a, - 0x4c, 0xb5, 0xa2, 0x30, 0xe1, 0x76, 0xb7, 0x1a, 0xf7, 0x51, 0x18, 0x34, 0x83, 0x93, 0xea, 0x19, - 0x3c, 0xee, 0x28, 0x81, 0x9e, 0x87, 0x51, 0x11, 0xb0, 0x54, 0x0f, 0x43, 0x5f, 0x58, 0x69, 0xd4, - 0x8d, 0x77, 0x23, 0x45, 0x61, 0x9d, 0x4e, 0x2b, 0xc6, 0x8c, 0x79, 0xc3, 0xb9, 0xc5, 0xb8, 0x41, - 0x4f, 0xa3, 0xcb, 0xe4, 0xb6, 0x18, 0xe9, 0x2b, 0xb7, 0x45, 0x6a, 0xb7, 0xaa, 0xf4, 0x7d, 0x7f, - 0x01, 0x3d, 0x2d, 0x3d, 0xdf, 0x2c, 0xc3, 0x10, 0x1f, 0x8a, 0x13, 0x50, 0xc5, 0x56, 0x85, 0xed, - 0xa6, 0x4b, 0x46, 0x01, 0xde, 0x96, 0xf9, 0x9a, 0x93, 0x38, 0x5c, 0x0c, 0xa9, 0xd5, 0x90, 0x5a, - 0x79, 0xd0, 0xbc, 0xb1, 0x5e, 0x66, 0x33, 0xc6, 0x09, 0xe0, 0x3c, 0xb4, 0xd5, 0xf3, 0x36, 0x40, - 0xcc, 0x5e, 0x17, 0xa5, 0x3c, 0x44, 0x06, 0xd4, 0x27, 0xba, 0xd4, 0xde, 0x50, 0xc4, 0xbc, 0x0d, - 0xe9, 0x14, 0x54, 0x08, 0xac, 0x71, 0x9c, 0x7d, 0x01, 0x2a, 0x8a, 0xb8, 0xd7, 0x49, 0x6e, 0x4c, - 0x17, 0x5e, 0x9f, 0x82, 0xc9, 0x4c, 0x5d, 0xc7, 0x3a, 0x08, 0xfe, 0xb6, 0x05, 0x93, 0xbc, 0xc9, - 0x2b, 0xc1, 0xbe, 0x58, 0xec, 0xef, 0xc1, 0x8c, 0x9f, 0xb3, 0xe8, 0xc4, 0x88, 0xf6, 0xbf, 0x48, - 0xd5, 0xc1, 0x2f, 0x0f, 0x8b, 0x73, 0xeb, 0xa0, 0x87, 0x7f, 0xfe, 0x2e, 0xb2, 0xe3, 0x0b, 0x0f, - 0xe4, 0x31, 0x9e, 0x19, 0x9a, 0xc3, 0xb0, 0xc2, 0xda, 0xdf, 0xb7, 0x60, 0xba, 0xe3, 0x55, 0xfd, - 0x0f, 0xb4, 0xed, 0x22, 0xf1, 0x75, 0xa9, 0x20, 0xf1, 0xb5, 0xfe, 0x69, 0xe5, 0xae, 0x9f, 0xf6, - 0x6b, 0x16, 0x88, 0x19, 0x78, 0x02, 0xea, 0xfc, 0xa7, 0x4d, 0x75, 0x7e, 0xb6, 0x78, 0x52, 0x17, - 0xe8, 0xf1, 0x7f, 0x6e, 0xc1, 0x14, 0x27, 0x48, 0x2f, 0x2f, 0x3e, 0xd0, 0x71, 0xe8, 0xe7, 0x35, - 0x16, 0xf5, 0xfc, 0x65, 0xfe, 0x47, 0x19, 0x83, 0x35, 0xd0, 0x75, 0xb0, 0x5c, 0xb9, 0x80, 0x8e, - 0xf1, 0xca, 0xd0, 0xb1, 0x73, 0xb5, 0xd9, 0x7f, 0x62, 0x01, 0xe2, 0xd5, 0x64, 0x1f, 0xa4, 0xe6, - 0x5b, 0x9f, 0x76, 0xa0, 0x4f, 0x45, 0x8d, 0xc2, 0x60, 0x8d, 0xea, 0xae, 0x74, 0x4f, 0xe6, 0x06, - 0xaa, 0xdc, 0xfb, 0x06, 0xea, 0x18, 0x3d, 0xfa, 0x57, 0x07, 0x20, 0xeb, 0xee, 0x88, 0x6e, 0xc0, - 0x58, 0xd3, 0x69, 0x39, 0x9b, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0xbb, 0x5d, 0x5d, 0x2f, 0x6b, 0x74, - 0xe2, 0xba, 0x47, 0x83, 0x60, 0x83, 0x0f, 0x9a, 0x07, 0x68, 0x45, 0xde, 0xbe, 0xe7, 0x93, 0x6d, - 0x76, 0xa2, 0x61, 0x31, 0x0f, 0xfc, 0x3e, 0x56, 0x42, 0xb1, 0x46, 0x91, 0xe3, 0x23, 0x5f, 0xbe, - 0x77, 0x3e, 0xf2, 0x03, 0xc7, 0xf4, 0x91, 0x1f, 0xec, 0xcb, 0x47, 0x1e, 0xc3, 0x7d, 0x72, 0xef, - 0xa6, 0xff, 0x57, 0x3d, 0x9f, 0x08, 0x85, 0x8d, 0x47, 0x42, 0xcc, 0xde, 0x3e, 0x9c, 0xbb, 0x0f, - 0xe7, 0x52, 0xe0, 0x82, 0x92, 0xe8, 0xb3, 0x50, 0x75, 0x7c, 0x3f, 0xbc, 0xa9, 0x7a, 0x6d, 0x25, - 0x6e, 0x3a, 0x7e, 0x9a, 0xba, 0x74, 0x64, 0xe9, 0xc1, 0xdb, 0x87, 0x73, 0xd5, 0xc5, 0x02, 0x1a, - 0x5c, 0x58, 0xda, 0xde, 0x85, 0x53, 0x0d, 0x12, 0xc9, 0x87, 0xcb, 0xd4, 0x12, 0xdb, 0x80, 0x4a, - 0x94, 0x11, 0x2a, 0x7d, 0x85, 0xcb, 0x6b, 0x09, 0xc3, 0xa4, 0x10, 0x49, 0x19, 0xd9, 0x7f, 0x66, - 0xc1, 0xb0, 0x70, 0xa1, 0x3c, 0x01, 0x5d, 0x66, 0xd1, 0x30, 0x2b, 0xcd, 0xe5, 0x0b, 0x5e, 0xd6, - 0x98, 0x42, 0x83, 0xd2, 0x5a, 0xc6, 0xa0, 0xf4, 0x70, 0x37, 0x26, 0xdd, 0x4d, 0x49, 0xbf, 0x58, - 0x86, 0x09, 0xd3, 0x7d, 0xf4, 0x04, 0xba, 0xe0, 0x2a, 0x0c, 0xc7, 0xc2, 0x57, 0xb9, 0x54, 0xec, - 0xf3, 0x96, 0x1d, 0xc4, 0xf4, 0x66, 0x5c, 0x78, 0x27, 0x4b, 0x26, 0xb9, 0x4e, 0xd0, 0xe5, 0x7b, - 0xe8, 0x04, 0xdd, 0xcb, 0x83, 0x77, 0xe0, 0x6e, 0x78, 0xf0, 0xda, 0xdf, 0x62, 0xc2, 0x5f, 0x87, - 0x9f, 0x80, 0x5e, 0x70, 0xd1, 0xdc, 0x26, 0xec, 0x2e, 0x33, 0x4b, 0x34, 0xaa, 0x40, 0x3f, 0xf8, - 0x87, 0x16, 0x8c, 0x0a, 0xc2, 0x13, 0x68, 0xf6, 0x67, 0xcc, 0x66, 0x3f, 0xd0, 0xa5, 0xd9, 0x05, - 0xed, 0xfd, 0xdb, 0x25, 0xd5, 0xde, 0x7a, 0x18, 0x25, 0x7d, 0xa5, 0xb2, 0x1e, 0xa1, 0xa7, 0xc1, - 0xb0, 0x19, 0xfa, 0x62, 0x33, 0x7f, 0x30, 0x0d, 0x86, 0xe3, 0xf0, 0x23, 0xed, 0x37, 0x56, 0xd4, - 0x2c, 0x56, 0x2b, 0x8c, 0x12, 0xb1, 0x81, 0xa6, 0xb1, 0x5a, 0x61, 0x94, 0x60, 0x86, 0x41, 0x2e, - 0x40, 0xfa, 0xa2, 0xbb, 0x88, 0x1e, 0x2d, 0x5e, 0x85, 0xed, 0xc4, 0xf3, 0xe7, 0xbd, 0x20, 0x89, - 0x93, 0x68, 0x7e, 0x2d, 0x48, 0xae, 0x45, 0xfc, 0x6c, 0xa0, 0x45, 0xb7, 0x29, 0x5e, 0x58, 0xe3, - 0x2b, 0xc3, 0x2b, 0x58, 0x1d, 0x83, 0xe6, 0x7d, 0xcf, 0x55, 0x01, 0xc7, 0x8a, 0xc2, 0x7e, 0x81, - 0xc9, 0x64, 0xd6, 0x41, 0xc7, 0x0b, 0x3c, 0xfb, 0xee, 0x88, 0xea, 0x5a, 0x66, 0xec, 0xad, 0xe9, - 0xe1, 0x6d, 0xdd, 0x45, 0x20, 0xad, 0x58, 0x77, 0x25, 0x4e, 0x63, 0xe0, 0xd0, 0xe7, 0x3a, 0xae, - 0x01, 0x9f, 0xee, 0x21, 0x4b, 0x8f, 0x71, 0xf1, 0xc7, 0x32, 0xf3, 0xb1, 0x0c, 0x66, 0x6b, 0xf5, - 0x6c, 0xb2, 0xf1, 0x65, 0x89, 0xc0, 0x29, 0x0d, 0x5a, 0x10, 0x27, 0x4b, 0x6e, 0x66, 0x79, 0x20, - 0x73, 0xb2, 0x94, 0x9f, 0xaf, 0x1d, 0x2d, 0x9f, 0x81, 0x51, 0xf5, 0x80, 0x4b, 0x9d, 0xbf, 0x83, - 0x51, 0xe1, 0xba, 0xd4, 0x4a, 0x0a, 0xc6, 0x3a, 0x0d, 0xda, 0x80, 0xc9, 0x98, 0xbf, 0x2e, 0x23, - 0x23, 0x1e, 0x84, 0xdd, 0xe0, 0x89, 0xcc, 0xdb, 0xf1, 0x12, 0x7d, 0xc4, 0x40, 0x7c, 0xb1, 0xca, - 0x18, 0x89, 0x2c, 0x0b, 0xf4, 0x0a, 0x4c, 0xf8, 0xfa, 0x2b, 0x9b, 0x75, 0x61, 0x56, 0x50, 0xae, - 0x5c, 0xc6, 0x1b, 0x9c, 0x75, 0x9c, 0xa1, 0xa6, 0x4a, 0x80, 0x0e, 0x11, 0x09, 0x74, 0x9c, 0x60, - 0x9b, 0xc4, 0xe2, 0xf9, 0x09, 0xa6, 0x04, 0x5c, 0x29, 0xa0, 0xc1, 0x85, 0xa5, 0xd1, 0x8b, 0x30, - 0x26, 0x3f, 0x5f, 0x8b, 0x00, 0x4a, 0x1d, 0x06, 0x35, 0x1c, 0x36, 0x28, 0xd1, 0x4d, 0x38, 0x2d, - 0xff, 0x6f, 0x44, 0xce, 0xd6, 0x96, 0xd7, 0x14, 0x01, 0x58, 0xa3, 0x8c, 0xc5, 0xa2, 0xf4, 0x9e, - 0x5e, 0xc9, 0x23, 0x3a, 0x3a, 0x9c, 0x3b, 0x27, 0x7a, 0x2d, 0x17, 0xcf, 0x06, 0x31, 0x9f, 0x3f, - 0x5a, 0x87, 0x53, 0x3b, 0xc4, 0xf1, 0x93, 0x9d, 0xe5, 0x1d, 0xd2, 0xdc, 0x95, 0x8b, 0x88, 0xc5, - 0x15, 0x69, 0x6e, 0x76, 0x97, 0x3a, 0x49, 0x70, 0x5e, 0x39, 0xf4, 0x16, 0x54, 0x5b, 0xed, 0x4d, - 0xdf, 0x8b, 0x77, 0xae, 0x86, 0x09, 0xbb, 0xb1, 0x54, 0xef, 0x9f, 0x88, 0x00, 0x24, 0x15, 0x53, - 0x55, 0x2f, 0xa0, 0xc3, 0x85, 0x1c, 0xd0, 0x7b, 0x70, 0x3a, 0x33, 0x19, 0xf8, 0x93, 0x3a, 0x22, - 0x50, 0xe9, 0xf1, 0xfc, 0xe5, 0x94, 0x53, 0x80, 0x87, 0xc5, 0xe5, 0xa2, 0x70, 0x7e, 0x15, 0xef, - 0xef, 0x1e, 0xfb, 0x5d, 0x5a, 0x58, 0xd3, 0x6e, 0xd0, 0xe7, 0x61, 0x4c, 0x9f, 0x45, 0x62, 0x83, - 0x79, 0xb4, 0xd7, 0x8b, 0xb2, 0x42, 0x37, 0x52, 0x33, 0x4a, 0xc7, 0x61, 0x83, 0xa3, 0x4d, 0x20, - 0xff, 0xfb, 0xd0, 0x15, 0x18, 0x69, 0xfa, 0x1e, 0x09, 0x92, 0xb5, 0x7a, 0xb7, 0xc0, 0xd9, 0x65, - 0x41, 0x23, 0x3a, 0x4c, 0xe4, 0x6f, 0xe2, 0x30, 0xac, 0x38, 0xd8, 0xbf, 0x57, 0x82, 0xb9, 0x1e, - 0x29, 0xbc, 0x32, 0x36, 0x40, 0xab, 0x2f, 0x1b, 0xe0, 0xa2, 0x7c, 0xcd, 0xe5, 0x6a, 0xe6, 0xfc, - 0x99, 0x79, 0xa9, 0x25, 0x3d, 0x85, 0x66, 0xe9, 0xfb, 0x76, 0x7f, 0xd3, 0xcd, 0x88, 0x03, 0x3d, - 0xbd, 0x00, 0xeb, 0xba, 0x3d, 0x78, 0xb0, 0x7f, 0x8d, 0xbe, 0xd0, 0x14, 0x6c, 0x7f, 0xab, 0x04, - 0xa7, 0x55, 0x17, 0xfe, 0xe4, 0x76, 0xdc, 0xf5, 0xce, 0x8e, 0xbb, 0x0b, 0x86, 0x74, 0xfb, 0x1a, - 0x0c, 0x35, 0x0e, 0xe2, 0x66, 0xe2, 0xf7, 0xa1, 0x00, 0x3d, 0x62, 0x2c, 0xd0, 0x74, 0x9b, 0x66, - 0x0f, 0xb2, 0x89, 0xf5, 0x6a, 0xff, 0x25, 0x0b, 0x26, 0x37, 0x96, 0xeb, 0x8d, 0xb0, 0xb9, 0x4b, - 0x92, 0x45, 0x6e, 0x26, 0xc2, 0x42, 0xff, 0xb1, 0xee, 0x50, 0xaf, 0xc9, 0xd3, 0x98, 0xce, 0xc1, - 0xc0, 0x4e, 0x18, 0x27, 0xd9, 0xcb, 0x92, 0x4b, 0x61, 0x9c, 0x60, 0x86, 0xb1, 0xff, 0xc8, 0x82, - 0x41, 0xf6, 0x06, 0x59, 0xaf, 0xb7, 0xea, 0xfa, 0xf9, 0x2e, 0xf4, 0x3c, 0x0c, 0x91, 0xad, 0x2d, - 0xd2, 0x4c, 0xc4, 0xa8, 0xca, 0x88, 0x9c, 0xa1, 0x15, 0x06, 0xa5, 0x9b, 0x3e, 0xab, 0x8c, 0xff, - 0xc5, 0x82, 0x18, 0x7d, 0x0e, 0x2a, 0x89, 0xb7, 0x47, 0x16, 0x5d, 0x57, 0xdc, 0x53, 0x1c, 0xcf, - 0x25, 0x4d, 0x29, 0x21, 0x1b, 0x92, 0x09, 0x4e, 0xf9, 0xd9, 0x3f, 0x5f, 0x02, 0x48, 0x23, 0xf7, - 0x7a, 0x7d, 0xe6, 0x52, 0xc7, 0x93, 0x7c, 0x8f, 0xe6, 0x3c, 0xc9, 0x87, 0x52, 0x86, 0x39, 0x0f, - 0xf2, 0xa9, 0xae, 0x2a, 0xf7, 0xd5, 0x55, 0x03, 0xc7, 0xe9, 0xaa, 0x65, 0x98, 0x4e, 0x23, 0x0f, - 0xcd, 0x30, 0x6c, 0x96, 0xae, 0x77, 0x23, 0x8b, 0xc4, 0x9d, 0xf4, 0xf6, 0x97, 0x2d, 0x10, 0x6e, - 0xca, 0x7d, 0x4c, 0xe8, 0x37, 0xe5, 0xeb, 0x59, 0x46, 0x5e, 0xc1, 0x73, 0xc5, 0x7e, 0xdb, 0x22, - 0x9b, 0xa0, 0xda, 0x40, 0x8c, 0x1c, 0x82, 0x06, 0x2f, 0xfb, 0xaf, 0x97, 0x60, 0x94, 0xa3, 0x59, - 0xce, 0xba, 0x3e, 0x5a, 0x73, 0xac, 0x64, 0xcf, 0xec, 0x61, 0x29, 0xca, 0x58, 0xe5, 0x04, 0xd6, - 0x1f, 0x96, 0x92, 0x08, 0x9c, 0xd2, 0xa0, 0xc7, 0x61, 0x38, 0x6e, 0x6f, 0x32, 0xf2, 0x8c, 0xa7, - 0x72, 0x83, 0x83, 0xb1, 0xc4, 0xa3, 0xcf, 0xc2, 0x14, 0x2f, 0x17, 0x85, 0x2d, 0x67, 0x9b, 0xdb, - 0x77, 0x06, 0x55, 0x9c, 0xca, 0xd4, 0x7a, 0x06, 0x77, 0x74, 0x38, 0x37, 0x93, 0x85, 0x31, 0xcb, - 0x60, 0x07, 0x17, 0x3a, 0x63, 0xa7, 0xb2, 0x2e, 0xf0, 0xe8, 0x12, 0x0c, 0x71, 0x81, 0x24, 0x04, - 0x44, 0x97, 0xfb, 0x1e, 0xcd, 0x71, 0x1e, 0xf8, 0x1b, 0xeb, 0x4c, 0x90, 0x89, 0xf2, 0xe8, 0x2d, - 0x18, 0x75, 0xc3, 0x9b, 0xc1, 0x4d, 0x27, 0x72, 0x17, 0xeb, 0x6b, 0x62, 0x3c, 0x73, 0xf5, 0x9a, - 0x5a, 0x4a, 0xa6, 0x3b, 0xe3, 0x33, 0xdb, 0x66, 0x8a, 0xc2, 0x3a, 0x3b, 0xb4, 0xc1, 0xd2, 0xac, - 0xf0, 0x97, 0x5f, 0xbb, 0xb9, 0xf6, 0xa8, 0xc7, 0x62, 0x35, 0xce, 0xe3, 0x22, 0x17, 0x8b, 0x78, - 0x37, 0x36, 0x65, 0x64, 0x7f, 0xf1, 0x14, 0x18, 0xf3, 0xc8, 0x48, 0xf6, 0x6c, 0xdd, 0xa5, 0x64, - 0xcf, 0x18, 0x46, 0xc8, 0x5e, 0x2b, 0x39, 0xa8, 0x79, 0x51, 0xb7, 0xec, 0xfb, 0x2b, 0x82, 0xa6, - 0x93, 0xa7, 0xc4, 0x60, 0xc5, 0x27, 0x3f, 0x23, 0x77, 0xf9, 0x03, 0xcc, 0xc8, 0x3d, 0x70, 0x82, - 0x19, 0xb9, 0xaf, 0xc2, 0xf0, 0xb6, 0x97, 0x60, 0xd2, 0x0a, 0xc5, 0x66, 0x9c, 0x3b, 0x13, 0x2e, - 0x72, 0x92, 0xce, 0xbc, 0xb1, 0x02, 0x81, 0x25, 0x13, 0xf4, 0xaa, 0x5a, 0x03, 0x43, 0xc5, 0xba, - 0x6c, 0xe7, 0xd5, 0x40, 0xee, 0x2a, 0x10, 0x19, 0xb8, 0x87, 0xef, 0x34, 0x03, 0xb7, 0xca, 0xa0, - 0x3d, 0xf2, 0xfe, 0x32, 0x68, 0x1b, 0x19, 0xc6, 0x2b, 0x77, 0x2f, 0xc3, 0xf8, 0x97, 0x2d, 0x38, - 0xdd, 0xca, 0x4b, 0xb6, 0x2f, 0x72, 0x61, 0x3f, 0xdf, 0xf7, 0xa3, 0x03, 0x46, 0x85, 0xec, 0x50, - 0x93, 0x4b, 0x86, 0xf3, 0xab, 0x93, 0xa9, 0xca, 0x47, 0xef, 0x34, 0x55, 0xf9, 0xbd, 0x49, 0x9a, - 0x9d, 0x26, 0x2e, 0x1f, 0x7f, 0xdf, 0x89, 0xcb, 0x5f, 0x55, 0x89, 0xcb, 0xbb, 0x24, 0xb3, 0xe0, - 0x69, 0xc9, 0x7b, 0xa6, 0x2b, 0xd7, 0x52, 0x8e, 0x4f, 0xde, 0x8d, 0x94, 0xe3, 0x6f, 0x9b, 0xc2, - 0x9e, 0xe7, 0xbf, 0x7e, 0xb2, 0x87, 0xb0, 0x37, 0xf8, 0x76, 0x17, 0xf7, 0x3c, 0xbd, 0xfa, 0xf4, - 0x1d, 0xa5, 0x57, 0xbf, 0xa1, 0x27, 0x2e, 0x47, 0x3d, 0x32, 0x73, 0x53, 0xa2, 0x3e, 0xd3, 0x95, - 0xdf, 0xd0, 0xb7, 0xa0, 0x53, 0xc5, 0x7c, 0xd5, 0x4e, 0xd3, 0xc9, 0x37, 0x6f, 0x13, 0xea, 0x4c, - 0x83, 0x3e, 0x73, 0x32, 0x69, 0xd0, 0x4f, 0xdf, 0xf5, 0x34, 0xe8, 0xf7, 0x9d, 0x40, 0x1a, 0xf4, - 0xfb, 0x3f, 0xd0, 0x34, 0xe8, 0xd5, 0x7b, 0x9b, 0x06, 0xfd, 0xcc, 0xdd, 0x48, 0x83, 0x7e, 0x03, - 0x2a, 0x2d, 0x19, 0x25, 0x59, 0x9d, 0x2d, 0x1e, 0x92, 0xdc, 0x50, 0x4a, 0x3e, 0x24, 0x0a, 0x85, - 0x53, 0x56, 0x94, 0x6f, 0x9a, 0x16, 0xfd, 0x81, 0x2e, 0x66, 0xab, 0x3c, 0x83, 0x40, 0x97, 0x64, - 0xe8, 0x7f, 0xb9, 0x04, 0x67, 0xbb, 0xcf, 0xeb, 0xd4, 0x9a, 0x50, 0x4f, 0xad, 0xdf, 0x19, 0x6b, - 0x02, 0x53, 0xba, 0x34, 0xaa, 0xbe, 0x43, 0xc9, 0x2f, 0xc2, 0xb4, 0x72, 0x16, 0xf3, 0xbd, 0xe6, - 0x81, 0xf6, 0x92, 0x91, 0x8a, 0x3f, 0x68, 0x64, 0x09, 0x70, 0x67, 0x19, 0xb4, 0x08, 0x93, 0x06, - 0x70, 0xad, 0x26, 0x94, 0x7d, 0x65, 0xbe, 0x68, 0x98, 0x68, 0x9c, 0xa5, 0xb7, 0xbf, 0x6e, 0xc1, - 0xfd, 0x05, 0xb9, 0x51, 0xfb, 0x8e, 0x94, 0xde, 0x82, 0xc9, 0x96, 0x59, 0xb4, 0x47, 0x42, 0x05, - 0x23, 0x03, 0xab, 0x6a, 0x6b, 0x06, 0x81, 0xb3, 0x4c, 0x97, 0xce, 0x7f, 0xfb, 0x07, 0x67, 0x3f, - 0xf2, 0x07, 0x3f, 0x38, 0xfb, 0x91, 0xef, 0xff, 0xe0, 0xec, 0x47, 0xfe, 0xff, 0xdb, 0x67, 0xad, - 0x6f, 0xdf, 0x3e, 0x6b, 0xfd, 0xc1, 0xed, 0xb3, 0xd6, 0xf7, 0x6f, 0x9f, 0xb5, 0xfe, 0xf8, 0xf6, - 0x59, 0xeb, 0xe7, 0x7f, 0x78, 0xf6, 0x23, 0x6f, 0x96, 0xf6, 0x9f, 0xf9, 0xbf, 0x01, 0x00, 0x00, - 0xff, 0xff, 0x38, 0x93, 0x28, 0xc3, 0x1e, 0xcf, 0x00, 0x00, + 0xd6, 0xe9, 0xd0, 0x0e, 0x8c, 0xa5, 0x57, 0x56, 0x51, 0xcc, 0x32, 0xd4, 0x8c, 0x5e, 0xbc, 0xd8, + 0xdf, 0xc7, 0xad, 0x69, 0x25, 0xf9, 0xc9, 0x41, 0x87, 0x60, 0x83, 0xf3, 0xec, 0x8f, 0xc1, 0xa8, + 0x36, 0xb0, 0xc7, 0xf1, 0xca, 0x9e, 0x7d, 0x15, 0xa6, 0xb2, 0x43, 0x77, 0x2c, 0xaf, 0xee, 0xff, + 0x55, 0x82, 0xc9, 0x9c, 0x9b, 0x2b, 0x96, 0xea, 0x39, 0x23, 0x50, 0xd3, 0xcc, 0xce, 0xa6, 0x58, + 0x2c, 0xf5, 0x21, 0x16, 0xa5, 0x8c, 0x2e, 0x17, 0xca, 0x68, 0x21, 0x0a, 0x07, 0x3e, 0x88, 0x28, + 0x34, 0x77, 0x9f, 0xc1, 0xbe, 0x76, 0x9f, 0x13, 0x10, 0x9f, 0xc6, 0x06, 0x36, 0xdc, 0xc7, 0x06, + 0xf6, 0xe5, 0x12, 0x4c, 0x65, 0xf3, 0x09, 0x9f, 0xc2, 0x7d, 0xc7, 0x6b, 0xc6, 0x7d, 0x47, 0x7e, + 0xe2, 0xf4, 0x6c, 0x96, 0xe3, 0xa2, 0xbb, 0x0f, 0x9c, 0xb9, 0xfb, 0x78, 0xb2, 0x2f, 0x6e, 0xdd, + 0xef, 0x41, 0xfe, 0x6e, 0x09, 0xce, 0x66, 0x8b, 0x2c, 0xfb, 0x8e, 0xb7, 0x77, 0x0a, 0x7d, 0x73, + 0xdd, 0xe8, 0x9b, 0x67, 0xfa, 0xf9, 0x1a, 0xd6, 0xb4, 0xc2, 0x0e, 0x7a, 0x23, 0xd3, 0x41, 0x0b, + 0xfd, 0xb3, 0xec, 0xde, 0x4b, 0xdf, 0x29, 0xc3, 0xb9, 0xdc, 0x72, 0xe9, 0x75, 0xc1, 0xaa, 0x71, + 0x5d, 0x70, 0x31, 0x73, 0x5d, 0x60, 0x77, 0x2f, 0x7d, 0x32, 0xf7, 0x07, 0x22, 0xf2, 0x8c, 0x65, + 0x4f, 0xbb, 0xcb, 0xbb, 0x03, 0x23, 0xf2, 0x4c, 0x31, 0xc2, 0x26, 0xdf, 0x1f, 0xa5, 0x3b, 0x83, + 0xdf, 0xb3, 0xe0, 0x81, 0xdc, 0xb1, 0x39, 0x05, 0xbb, 0xfa, 0x35, 0xd3, 0xae, 0xfe, 0x44, 0xdf, + 0xb3, 0xb5, 0xc0, 0xd0, 0xfe, 0xd5, 0x72, 0xc1, 0xb7, 0x30, 0xcb, 0xe4, 0x75, 0x18, 0x75, 0x9a, + 0x4d, 0x12, 0xc7, 0xeb, 0xa1, 0xab, 0x92, 0x95, 0x3d, 0xc3, 0xb4, 0x8d, 0x14, 0x7c, 0x74, 0x38, + 0x37, 0x9b, 0x65, 0x91, 0xa2, 0xb1, 0xce, 0xc1, 0x4c, 0x80, 0x58, 0x3a, 0xd1, 0x04, 0x88, 0x17, + 0x01, 0xf6, 0x95, 0xbd, 0x22, 0x6b, 0xe6, 0xd4, 0x2c, 0x19, 0x1a, 0x15, 0xfa, 0x29, 0x76, 0x0a, + 0xe0, 0xce, 0x40, 0x7c, 0x2a, 0x3e, 0xd7, 0xe7, 0x58, 0xe9, 0x8e, 0x45, 0x3c, 0xc4, 0x59, 0x99, + 0x84, 0x15, 0x4b, 0xf4, 0x13, 0x30, 0x15, 0xf3, 0x0c, 0x1a, 0xcb, 0xbe, 0x13, 0xb3, 0xc0, 0x1a, + 0x31, 0x0b, 0x59, 0xdc, 0x72, 0x23, 0x83, 0xc3, 0x1d, 0xd4, 0xf6, 0x97, 0x07, 0xe0, 0xc1, 0x2e, + 0xc2, 0x07, 0x2d, 0x9a, 0x97, 0xf7, 0x4f, 0x65, 0xed, 0x76, 0xb3, 0xb9, 0x85, 0x0d, 0x43, 0x5e, + 0x66, 0x8c, 0x4b, 0x1f, 0x78, 0x8c, 0xbf, 0x64, 0x69, 0x16, 0x55, 0xee, 0xe2, 0xfb, 0x99, 0x63, + 0x0a, 0xd5, 0x13, 0x34, 0xb1, 0x6e, 0xe5, 0xd8, 0x29, 0x2f, 0xf6, 0xdd, 0x9c, 0xbe, 0x0d, 0x97, + 0xa7, 0x7b, 0xd5, 0xf3, 0x79, 0x0b, 0x1e, 0xc9, 0x6d, 0xaf, 0xe1, 0x6c, 0xb4, 0x00, 0x95, 0x26, + 0x05, 0x6a, 0x41, 0x76, 0x69, 0xa8, 0xab, 0x44, 0xe0, 0x94, 0xc6, 0xf0, 0x29, 0x2a, 0xf5, 0xf4, + 0x29, 0xfa, 0x97, 0x16, 0xcc, 0x64, 0x1b, 0x71, 0x0a, 0x12, 0x70, 0xcd, 0x94, 0x80, 0x1f, 0xef, + 0x67, 0x2c, 0x0b, 0x84, 0xdf, 0x1f, 0x4f, 0xc0, 0x7d, 0x05, 0xef, 0x45, 0xec, 0xc3, 0xf4, 0x76, + 0x93, 0x98, 0xe1, 0x8b, 0xe2, 0x63, 0x72, 0x23, 0x3d, 0xbb, 0xc6, 0x3a, 0xf2, 0x83, 0x6c, 0x07, + 0x09, 0xee, 0xac, 0x02, 0x7d, 0xde, 0x82, 0x19, 0xe7, 0x56, 0xdc, 0xf1, 0x7e, 0x93, 0x98, 0x33, + 0xcf, 0xe7, 0xda, 0x57, 0x7b, 0xbc, 0xf7, 0xc4, 0x42, 0x8c, 0x66, 0xf2, 0xa8, 0x70, 0x6e, 0x5d, + 0x08, 0x8b, 0xbc, 0x90, 0x54, 0x4f, 0xee, 0x12, 0x60, 0x9b, 0x17, 0xfe, 0xc4, 0x65, 0xa1, 0xc4, + 0x60, 0xc5, 0x07, 0xdd, 0x84, 0xca, 0xb6, 0x8c, 0x49, 0x14, 0xb2, 0x36, 0x77, 0xf3, 0xca, 0x0d, + 0x5c, 0xe4, 0x31, 0x1f, 0x0a, 0x85, 0x53, 0x56, 0xe8, 0x55, 0x28, 0x07, 0x5b, 0x71, 0xb7, 0x07, + 0x33, 0x32, 0x3e, 0x78, 0x3c, 0x52, 0xfa, 0xda, 0x6a, 0x03, 0xd3, 0x82, 0xb4, 0x7c, 0xb4, 0xe9, + 0x8a, 0x2b, 0x81, 0xdc, 0xf2, 0x78, 0xa9, 0xd6, 0x59, 0x1e, 0x2f, 0xd5, 0x30, 0x2d, 0x88, 0x56, + 0x61, 0x90, 0x85, 0x38, 0x09, 0x7b, 0x7f, 0x6e, 0xa6, 0x87, 0x8e, 0xf0, 0x2d, 0x1e, 0x3a, 0xcd, + 0xc0, 0x98, 0x17, 0x47, 0xaf, 0xc1, 0x50, 0x93, 0xbd, 0x1f, 0x21, 0x8c, 0x33, 0xf9, 0xd9, 0x4b, + 0x3a, 0x5e, 0x98, 0xe0, 0xb7, 0x9c, 0x1c, 0x8e, 0x05, 0x07, 0xb4, 0x01, 0x43, 0x4d, 0xd2, 0xda, + 0xd9, 0x8a, 0x85, 0xcd, 0xe5, 0x93, 0xb9, 0xbc, 0xba, 0x3c, 0x97, 0x22, 0xb8, 0x32, 0x0a, 0x2c, + 0x78, 0xa1, 0x4f, 0x43, 0x69, 0xab, 0x29, 0xa2, 0x9d, 0x72, 0xed, 0xfc, 0x66, 0x38, 0xfb, 0xd2, + 0xd0, 0x9d, 0xc3, 0xb9, 0xd2, 0xea, 0x32, 0x2e, 0x6d, 0x35, 0xd1, 0x35, 0x18, 0xde, 0xe2, 0x31, + 0xc9, 0x22, 0xcf, 0xef, 0xe3, 0xf9, 0xe1, 0xd2, 0x1d, 0x61, 0xcb, 0x3c, 0x4a, 0x47, 0x20, 0xb0, + 0x64, 0x82, 0x36, 0x00, 0xb6, 0x54, 0x6c, 0xb5, 0x48, 0xf4, 0xfb, 0xf1, 0x7e, 0x22, 0xb0, 0x85, + 0x01, 0x42, 0x41, 0xb1, 0xc6, 0x07, 0x7d, 0x0e, 0x2a, 0x8e, 0x7c, 0x11, 0x88, 0x25, 0xf9, 0x35, + 0xf5, 0x81, 0x74, 0xc1, 0x75, 0x7f, 0x2c, 0x89, 0xcf, 0x56, 0x45, 0x84, 0x53, 0xa6, 0x68, 0x17, + 0xc6, 0xf7, 0xe3, 0xd6, 0x0e, 0x91, 0x0b, 0x94, 0x65, 0xfe, 0x2d, 0xd8, 0x90, 0x6e, 0x0a, 0x42, + 0x2f, 0x4a, 0xda, 0x8e, 0xdf, 0x21, 0x53, 0x58, 0x48, 0xd7, 0x4d, 0x9d, 0x19, 0x36, 0x79, 0xd3, + 0x4e, 0x7f, 0xaf, 0x1d, 0x6e, 0x1e, 0x24, 0x44, 0xe4, 0x03, 0xce, 0xed, 0xf4, 0xd7, 0x39, 0x49, + 0x67, 0xa7, 0x0b, 0x04, 0x96, 0x4c, 0xe8, 0x12, 0x76, 0xe4, 0x6b, 0x5b, 0xc2, 0xca, 0xf2, 0x44, + 0x61, 0xf7, 0x74, 0xb4, 0x37, 0xed, 0x14, 0x26, 0xfb, 0x52, 0x56, 0x4c, 0xe6, 0xb5, 0x76, 0xc2, + 0x24, 0x0c, 0x32, 0xf2, 0x76, 0xba, 0x58, 0xe6, 0xd5, 0x73, 0xe8, 0x3b, 0x65, 0x5e, 0x1e, 0x15, + 0xce, 0xad, 0x0b, 0xb9, 0x30, 0xd1, 0x0a, 0xa3, 0xe4, 0x56, 0x18, 0xc9, 0x59, 0x85, 0xba, 0x1c, + 0xbf, 0x0d, 0x4a, 0x51, 0x23, 0xf3, 0xd0, 0x36, 0x31, 0x38, 0xc3, 0x93, 0x0e, 0x49, 0xdc, 0x74, + 0x7c, 0xb2, 0x76, 0xbd, 0x7a, 0xa6, 0x78, 0x48, 0x1a, 0x9c, 0xa4, 0x73, 0x48, 0x04, 0x02, 0x4b, + 0x26, 0x54, 0xfa, 0xb0, 0xd4, 0xf2, 0x2c, 0x81, 0x71, 0x81, 0xf4, 0xe9, 0xf0, 0x5d, 0xe6, 0xd2, + 0x87, 0x81, 0x31, 0x2f, 0x4e, 0x67, 0xbe, 0xd0, 0x3d, 0xc3, 0xb8, 0x7a, 0xb6, 0x78, 0xe6, 0x0b, + 0x95, 0xf5, 0x7a, 0xa3, 0xdb, 0xcc, 0x57, 0x44, 0x38, 0x65, 0x6a, 0x7f, 0x63, 0xa8, 0x53, 0x5b, + 0x60, 0x67, 0x8c, 0x2f, 0x58, 0x1d, 0x17, 0xf0, 0x9f, 0xea, 0xd7, 0xe4, 0x71, 0x82, 0x7a, 0xe2, + 0xe7, 0x2d, 0xb8, 0xaf, 0x95, 0xfb, 0x51, 0x62, 0xeb, 0xed, 0xcf, 0x72, 0xc2, 0xbb, 0x41, 0xa5, + 0x06, 0xcf, 0xc7, 0xe3, 0x82, 0x9a, 0xb2, 0xba, 0x78, 0xf9, 0x03, 0xeb, 0xe2, 0xeb, 0x30, 0xc2, + 0xd4, 0xbb, 0x34, 0x15, 0x51, 0x5f, 0x6e, 0x6c, 0x6c, 0x13, 0x5f, 0x16, 0x05, 0xb1, 0x62, 0x81, + 0x7e, 0xce, 0x82, 0x87, 0xb3, 0x4d, 0xc7, 0x84, 0xa1, 0x45, 0x5a, 0x4b, 0x7e, 0xbc, 0x59, 0x15, + 0xdf, 0xff, 0x70, 0xbd, 0x1b, 0xf1, 0x51, 0x2f, 0x02, 0xdc, 0xbd, 0x32, 0x54, 0xcb, 0x39, 0x5f, + 0x0d, 0x99, 0xf7, 0x73, 0xbd, 0xcf, 0x58, 0xe8, 0x79, 0x18, 0xdb, 0x0b, 0xdb, 0x81, 0x8c, 0x31, + 0x11, 0x11, 0xc4, 0xcc, 0x16, 0xbc, 0xae, 0xc1, 0xb1, 0x41, 0x75, 0xba, 0xfa, 0xfe, 0xd7, 0xac, + 0x1c, 0x45, 0x95, 0x9f, 0x00, 0x5f, 0x31, 0x4f, 0x80, 0x8f, 0x65, 0x4f, 0x80, 0x1d, 0x96, 0x3a, + 0xe3, 0xf0, 0xd7, 0x7f, 0xba, 0xde, 0x7e, 0x73, 0x35, 0xd9, 0x3e, 0x9c, 0xef, 0x25, 0x9c, 0x99, + 0x2b, 0x9f, 0xab, 0xee, 0xb8, 0x53, 0x57, 0x3e, 0x77, 0xad, 0x86, 0x19, 0xa6, 0xdf, 0xac, 0x1f, + 0xf6, 0x7f, 0xb3, 0xa0, 0x5c, 0x0f, 0xdd, 0x53, 0xb0, 0x3c, 0x7e, 0xc6, 0xb0, 0x3c, 0x3e, 0x58, + 0xf0, 0x76, 0x67, 0xa1, 0x9d, 0x71, 0x25, 0x63, 0x67, 0x7c, 0xb8, 0x88, 0x41, 0x77, 0xab, 0xe2, + 0xdf, 0x2b, 0x83, 0xfe, 0xd2, 0x28, 0xfa, 0xd7, 0x77, 0xe3, 0x13, 0x5e, 0xee, 0xf6, 0xf8, 0xa8, + 0xe0, 0xcc, 0x3c, 0x00, 0x65, 0xb8, 0xe9, 0x0f, 0x99, 0x6b, 0xf8, 0x1b, 0xc4, 0xdb, 0xde, 0x49, + 0x88, 0x9b, 0xfd, 0x9c, 0xd3, 0x73, 0x0d, 0xff, 0x2f, 0x16, 0x4c, 0x66, 0x6a, 0x47, 0x7e, 0x5e, + 0xec, 0xda, 0x5d, 0x5a, 0x9c, 0xa6, 0x7b, 0x06, 0xbb, 0xcd, 0x03, 0xa8, 0x6b, 0x1d, 0x69, 0xd5, + 0x61, 0xba, 0xaf, 0xba, 0xf7, 0x89, 0xb1, 0x46, 0x81, 0x5e, 0x80, 0xd1, 0x24, 0x6c, 0x85, 0x7e, + 0xb8, 0x7d, 0x70, 0x85, 0xc8, 0x3c, 0x33, 0xea, 0xf2, 0x6d, 0x23, 0x45, 0x61, 0x9d, 0xce, 0xfe, + 0x95, 0x32, 0x64, 0x5f, 0xa7, 0xfd, 0xf3, 0x39, 0xf9, 0xd1, 0x9c, 0x93, 0xdf, 0xb1, 0x60, 0x8a, + 0xd6, 0xce, 0xbc, 0xab, 0xa4, 0x53, 0xb5, 0x7a, 0xd7, 0xc3, 0xea, 0xf2, 0xae, 0xc7, 0x63, 0x54, + 0x76, 0xb9, 0x61, 0x3b, 0x11, 0x56, 0x21, 0x4d, 0x38, 0x51, 0x28, 0x16, 0x58, 0x41, 0x47, 0xa2, + 0x48, 0x44, 0xa4, 0xe9, 0x74, 0x24, 0x8a, 0xb0, 0xc0, 0xca, 0x67, 0x3f, 0x06, 0x0a, 0x9e, 0xfd, + 0x60, 0x29, 0xda, 0x84, 0x47, 0x8f, 0x50, 0x28, 0xb4, 0x14, 0x6d, 0xd2, 0xd5, 0x27, 0xa5, 0xb1, + 0xbf, 0x5e, 0x86, 0xb1, 0x7a, 0xe8, 0xa6, 0x17, 0x2b, 0xcf, 0x1b, 0x17, 0x2b, 0xe7, 0x33, 0x17, + 0x2b, 0x53, 0x3a, 0xed, 0x9f, 0x5f, 0xa3, 0x7c, 0x58, 0xd7, 0x28, 0x7f, 0x66, 0xc1, 0x44, 0x3d, + 0x74, 0xe9, 0x04, 0xfd, 0x51, 0x9a, 0x8d, 0x7a, 0x02, 0xc0, 0xa1, 0x2e, 0x09, 0x00, 0xff, 0xbe, + 0x05, 0xc3, 0xf5, 0xd0, 0x3d, 0x05, 0x8b, 0xe9, 0x2b, 0xa6, 0xc5, 0xf4, 0xfe, 0x02, 0x29, 0x5b, + 0x60, 0x24, 0xfd, 0x8d, 0x32, 0x8c, 0xd3, 0x76, 0x86, 0xdb, 0x72, 0x94, 0x8c, 0x1e, 0xb1, 0xfa, + 0xe8, 0x11, 0xaa, 0xcc, 0x85, 0xbe, 0x1f, 0xde, 0xca, 0x8e, 0xd8, 0x2a, 0x83, 0x62, 0x81, 0x45, + 0x4f, 0xc3, 0x48, 0x2b, 0x22, 0xfb, 0x5e, 0xd8, 0x8e, 0xb3, 0x31, 0xad, 0x75, 0x01, 0xc7, 0x8a, + 0x82, 0xea, 0xed, 0xb1, 0x17, 0x34, 0x89, 0xf4, 0xf2, 0x19, 0x60, 0x5e, 0x3e, 0x3c, 0x87, 0xaa, + 0x06, 0xc7, 0x06, 0x15, 0x7a, 0x03, 0x2a, 0xec, 0x3f, 0x5b, 0x37, 0xc7, 0x7f, 0xd5, 0x43, 0x24, + 0x2e, 0x17, 0x0c, 0x70, 0xca, 0x0b, 0x5d, 0x04, 0x48, 0xa4, 0x3f, 0x52, 0x2c, 0x42, 0xae, 0x95, + 0x46, 0xa9, 0x3c, 0x95, 0x62, 0xac, 0x51, 0xa1, 0xa7, 0xa0, 0x92, 0x38, 0x9e, 0x7f, 0xd5, 0x0b, + 0x48, 0x2c, 0xfc, 0xb9, 0x44, 0x5e, 0x72, 0x01, 0xc4, 0x29, 0x9e, 0xee, 0xe8, 0x2c, 0xa0, 0x9f, + 0xbf, 0x09, 0x34, 0xc2, 0xa8, 0xd9, 0x8e, 0x7e, 0x55, 0x41, 0xb1, 0x46, 0x61, 0xbf, 0x04, 0x67, + 0xeb, 0xa1, 0x5b, 0x0f, 0xa3, 0x64, 0x35, 0x8c, 0x6e, 0x39, 0x91, 0x2b, 0xc7, 0x6f, 0x4e, 0xa6, + 0xc8, 0xa6, 0xbb, 0xee, 0x20, 0xb7, 0x06, 0x18, 0xc9, 0xaf, 0x9f, 0x63, 0x7b, 0xfa, 0x31, 0x83, + 0x6f, 0xfe, 0x5d, 0x09, 0x50, 0x9d, 0x79, 0x4c, 0x19, 0x0f, 0x47, 0xbd, 0x03, 0x13, 0x31, 0xb9, + 0xea, 0x05, 0xed, 0xdb, 0xf2, 0x7c, 0xd5, 0x25, 0xb2, 0xa9, 0xb1, 0xa2, 0x53, 0x72, 0x8b, 0x8a, + 0x09, 0xc3, 0x19, 0x6e, 0xb4, 0x0b, 0xa3, 0x76, 0xb0, 0x18, 0xdf, 0x88, 0x49, 0x24, 0x1e, 0x4a, + 0x62, 0x5d, 0x88, 0x25, 0x10, 0xa7, 0x78, 0x3a, 0x65, 0xd8, 0x9f, 0x6b, 0x61, 0x80, 0xc3, 0x30, + 0x91, 0x93, 0x8c, 0x3d, 0xb5, 0xa1, 0xc1, 0xb1, 0x41, 0x85, 0x56, 0x01, 0xc5, 0xed, 0x56, 0xcb, + 0x67, 0xd7, 0x90, 0x8e, 0x7f, 0x29, 0x0a, 0xdb, 0x2d, 0x7e, 0x95, 0x24, 0x5e, 0xa9, 0x68, 0x74, + 0x60, 0x71, 0x4e, 0x09, 0x2a, 0x18, 0xb6, 0x62, 0xf6, 0x5b, 0xc4, 0xf4, 0x73, 0xdb, 0x66, 0x83, + 0x81, 0xb0, 0xc4, 0xd9, 0x3f, 0xc3, 0x36, 0x33, 0xf6, 0xbe, 0x4d, 0xd2, 0x8e, 0x08, 0xda, 0x83, + 0xf1, 0x16, 0xdb, 0xb0, 0x92, 0x28, 0xf4, 0x7d, 0x22, 0xf5, 0xc6, 0xbb, 0xf3, 0xde, 0xe2, 0xef, + 0x5d, 0xe8, 0xec, 0xb0, 0xc9, 0xdd, 0xfe, 0xc2, 0x24, 0x93, 0x4b, 0x0d, 0x7e, 0x68, 0x19, 0x16, + 0x3e, 0xd9, 0x42, 0x43, 0x9b, 0x2d, 0x7e, 0x4f, 0x2e, 0x95, 0xf4, 0xc2, 0xaf, 0x1b, 0xcb, 0xb2, + 0xe8, 0x75, 0x76, 0x07, 0xc7, 0x85, 0x41, 0xaf, 0x97, 0x2c, 0x39, 0x95, 0x71, 0xdd, 0x26, 0x0a, + 0x62, 0x8d, 0x09, 0xba, 0x0a, 0xe3, 0xe2, 0x39, 0x14, 0x61, 0x78, 0x28, 0x1b, 0xc7, 0xdf, 0x71, + 0xac, 0x23, 0x8f, 0xb2, 0x00, 0x6c, 0x16, 0x46, 0xdb, 0xf0, 0xb0, 0xf6, 0x78, 0x57, 0x8e, 0x07, + 0x21, 0x97, 0x2d, 0x8f, 0xdc, 0x39, 0x9c, 0x7b, 0x78, 0xa3, 0x1b, 0x21, 0xee, 0xce, 0x07, 0x5d, + 0x87, 0xb3, 0x4e, 0x33, 0xf1, 0xf6, 0x49, 0x8d, 0x38, 0xae, 0xef, 0x05, 0xc4, 0x4c, 0xf2, 0xf0, + 0xc0, 0x9d, 0xc3, 0xb9, 0xb3, 0x8b, 0x79, 0x04, 0x38, 0xbf, 0x1c, 0x7a, 0x05, 0x2a, 0x6e, 0x10, + 0x8b, 0x3e, 0x18, 0x32, 0xde, 0xa5, 0xab, 0xd4, 0xae, 0x35, 0xd4, 0xf7, 0xa7, 0x7f, 0x70, 0x5a, + 0x00, 0x6d, 0xc3, 0x98, 0x1e, 0xc8, 0x25, 0xde, 0x34, 0x7c, 0xa6, 0xcb, 0xd9, 0xd6, 0x88, 0x7e, + 0xe2, 0x56, 0x37, 0xe5, 0x9f, 0x6b, 0x04, 0x46, 0x19, 0x8c, 0xd1, 0x6b, 0x80, 0x62, 0x12, 0xed, + 0x7b, 0x4d, 0xb2, 0xd8, 0x64, 0x49, 0x86, 0x99, 0xad, 0x66, 0xc4, 0x08, 0x36, 0x41, 0x8d, 0x0e, + 0x0a, 0x9c, 0x53, 0x0a, 0x5d, 0xa6, 0x12, 0x45, 0x87, 0x0a, 0x77, 0x6a, 0xa9, 0xe6, 0x55, 0x6b, + 0xa4, 0x15, 0x91, 0xa6, 0x93, 0x10, 0xd7, 0xe4, 0x88, 0x33, 0xe5, 0xe8, 0x7e, 0xa3, 0xde, 0x6e, + 0x00, 0xd3, 0x09, 0xb8, 0xf3, 0xfd, 0x06, 0x7a, 0x42, 0xda, 0x09, 0xe3, 0xe4, 0x1a, 0x49, 0x6e, + 0x85, 0xd1, 0xae, 0xc8, 0xcc, 0x96, 0x26, 0x6e, 0x4c, 0x51, 0x58, 0xa7, 0xa3, 0x1a, 0x11, 0xbb, + 0x04, 0x5b, 0xab, 0xb1, 0x7b, 0x8a, 0x91, 0x74, 0x9d, 0x5c, 0xe6, 0x60, 0x2c, 0xf1, 0x92, 0x74, + 0xad, 0xbe, 0xcc, 0x6e, 0x1f, 0x32, 0xa4, 0x6b, 0xf5, 0x65, 0x2c, 0xf1, 0x88, 0x74, 0xbe, 0xf9, + 0x37, 0x51, 0x7c, 0x6f, 0xd4, 0x29, 0x97, 0xfb, 0x7c, 0xf6, 0x2f, 0x80, 0x29, 0xf5, 0xda, 0x20, + 0x4f, 0x59, 0x17, 0x57, 0x27, 0xd9, 0x24, 0xe9, 0x3f, 0xdf, 0x9d, 0xb2, 0xc5, 0xad, 0x65, 0x38, + 0xe1, 0x0e, 0xde, 0x46, 0xf2, 0x90, 0xa9, 0x9e, 0x6f, 0x6f, 0x2c, 0x40, 0x25, 0x6e, 0x6f, 0xba, + 0xe1, 0x9e, 0xe3, 0x05, 0xec, 0xb2, 0x40, 0x53, 0x44, 0x1a, 0x12, 0x81, 0x53, 0x1a, 0xb4, 0x0a, + 0x23, 0x8e, 0x38, 0x7c, 0x09, 0xf3, 0x7e, 0x6e, 0x36, 0x01, 0x79, 0x40, 0xe3, 0x76, 0x50, 0xf9, + 0x0f, 0xab, 0xb2, 0xe8, 0x65, 0x18, 0x17, 0x01, 0x6f, 0xc2, 0x57, 0xf5, 0x8c, 0x19, 0x1b, 0xd1, + 0xd0, 0x91, 0xd8, 0xa4, 0x45, 0x3f, 0x05, 0x13, 0x94, 0x4b, 0x2a, 0xd8, 0xaa, 0x33, 0xfd, 0x48, + 0x44, 0x2d, 0xa7, 0xba, 0x5e, 0x18, 0x67, 0x98, 0x21, 0x17, 0x1e, 0x72, 0xda, 0x49, 0xc8, 0x8c, + 0x95, 0xe6, 0xfc, 0xdf, 0x08, 0x77, 0x49, 0xc0, 0xac, 0xfb, 0x23, 0x4b, 0xe7, 0xef, 0x1c, 0xce, + 0x3d, 0xb4, 0xd8, 0x85, 0x0e, 0x77, 0xe5, 0x82, 0x6e, 0xc0, 0x68, 0x12, 0xfa, 0xc2, 0xc9, 0x3c, + 0xae, 0xde, 0x57, 0x9c, 0xfc, 0x68, 0x43, 0x91, 0xe9, 0xe6, 0x04, 0x55, 0x14, 0xeb, 0x7c, 0xd0, + 0x06, 0x5f, 0x63, 0x2c, 0x55, 0x27, 0x89, 0xab, 0xf7, 0x17, 0x77, 0x8c, 0xca, 0xe8, 0x69, 0x2e, + 0x41, 0x51, 0x12, 0xeb, 0x6c, 0xd0, 0x25, 0x98, 0x6e, 0x45, 0x5e, 0xc8, 0x26, 0xb6, 0x32, 0x14, + 0x57, 0x8d, 0xb4, 0x78, 0xd3, 0xf5, 0x2c, 0x01, 0xee, 0x2c, 0x83, 0x2e, 0x50, 0x05, 0x95, 0x03, + 0xab, 0x0f, 0xf0, 0x37, 0x59, 0xb8, 0x72, 0xca, 0x61, 0x58, 0x61, 0x67, 0x7f, 0x1c, 0xa6, 0x3b, + 0x24, 0xe5, 0xb1, 0x1c, 0x7e, 0xff, 0xc9, 0x20, 0x54, 0x94, 0x39, 0x10, 0x2d, 0x98, 0x56, 0xde, + 0x07, 0xb2, 0x56, 0xde, 0x11, 0xaa, 0xaf, 0xe9, 0x86, 0xdd, 0x8d, 0x9c, 0x27, 0xe5, 0xcf, 0x17, + 0x88, 0x86, 0xfe, 0xa3, 0xf3, 0x8e, 0xf1, 0xdc, 0x7e, 0x7a, 0x60, 0x1c, 0xe8, 0x7a, 0x60, 0xec, + 0xf3, 0x79, 0x47, 0x7a, 0x34, 0x6c, 0x85, 0xee, 0x5a, 0x3d, 0xfb, 0xde, 0x59, 0x9d, 0x02, 0x31, + 0xc7, 0x31, 0xe5, 0x9e, 0x6e, 0xeb, 0x4c, 0xb9, 0x1f, 0xbe, 0x4b, 0xe5, 0x5e, 0x32, 0xc0, 0x29, + 0x2f, 0xe4, 0xc3, 0x74, 0xd3, 0x7c, 0xaa, 0x4e, 0x45, 0xe4, 0x3d, 0xda, 0xf3, 0xd1, 0xb8, 0xb6, + 0xf6, 0x86, 0xcd, 0x72, 0x96, 0x0b, 0xee, 0x64, 0x8c, 0x5e, 0x86, 0x91, 0xf7, 0xc2, 0x98, 0x4d, + 0x3b, 0xb1, 0xb7, 0xc9, 0x18, 0xa8, 0x91, 0xd7, 0xaf, 0x37, 0x18, 0xfc, 0xe8, 0x70, 0x6e, 0xb4, + 0x1e, 0xba, 0xf2, 0x2f, 0x56, 0x05, 0xd0, 0x6d, 0x38, 0x6b, 0x48, 0x04, 0xd5, 0x5c, 0xe8, 0xbf, + 0xb9, 0x0f, 0x8b, 0xea, 0xce, 0xae, 0xe5, 0x71, 0xc2, 0xf9, 0x15, 0xd8, 0xdf, 0xe0, 0x46, 0x4f, + 0x61, 0x1a, 0x21, 0x71, 0xdb, 0x3f, 0x8d, 0x87, 0x2a, 0x56, 0x0c, 0xab, 0xcd, 0x5d, 0x1b, 0xd6, + 0x7f, 0xd7, 0x62, 0x86, 0xf5, 0x0d, 0xb2, 0xd7, 0xf2, 0x9d, 0xe4, 0x34, 0xdc, 0xbc, 0x5f, 0x87, + 0x91, 0x44, 0xd4, 0xd6, 0xed, 0x6d, 0x0d, 0xad, 0x51, 0xec, 0x72, 0x41, 0x6d, 0x88, 0x12, 0x8a, + 0x15, 0x1b, 0xfb, 0x9f, 0xf1, 0x11, 0x90, 0x98, 0x53, 0xb0, 0x2d, 0xd4, 0x4c, 0xdb, 0xc2, 0x5c, + 0x8f, 0x2f, 0x28, 0xb0, 0x31, 0xfc, 0x53, 0xb3, 0xdd, 0xec, 0xec, 0xf1, 0x51, 0xbf, 0xd1, 0xb1, + 0x7f, 0xd1, 0x82, 0x99, 0x3c, 0x47, 0x00, 0xaa, 0xc4, 0xf0, 0x93, 0x8f, 0xba, 0xe1, 0x52, 0x3d, + 0x78, 0x53, 0xc0, 0xb1, 0xa2, 0xe8, 0x3b, 0xbf, 0xfd, 0xf1, 0x12, 0x7e, 0x5d, 0x07, 0xf3, 0x55, + 0x43, 0xf4, 0x2a, 0x8f, 0xdb, 0xb0, 0xd4, 0xb3, 0x83, 0xc7, 0x8b, 0xd9, 0xb0, 0x7f, 0xb5, 0x04, + 0x33, 0xdc, 0x44, 0xbd, 0xb8, 0x1f, 0x7a, 0x6e, 0x3d, 0x74, 0x45, 0x14, 0xcb, 0x5b, 0x30, 0xd6, + 0xd2, 0x8e, 0xab, 0xdd, 0x52, 0x0e, 0xe9, 0xc7, 0xda, 0xf4, 0xd8, 0xa0, 0x43, 0xb1, 0xc1, 0x0b, + 0xb9, 0x30, 0x46, 0xf6, 0xbd, 0xa6, 0xb2, 0x73, 0x96, 0x8e, 0x2d, 0xd2, 0x55, 0x2d, 0x2b, 0x1a, + 0x1f, 0x6c, 0x70, 0xbd, 0x07, 0xaf, 0xd0, 0xd8, 0x5f, 0xb1, 0xe0, 0xfe, 0x82, 0x04, 0x45, 0xb4, + 0xba, 0x5b, 0xec, 0x32, 0x40, 0x3c, 0x91, 0xa9, 0xaa, 0xe3, 0x57, 0x04, 0x58, 0x60, 0xd1, 0x4f, + 0x02, 0x70, 0x13, 0x3f, 0xd5, 0xa2, 0xc5, 0xa7, 0xf7, 0x97, 0xb8, 0x43, 0xcb, 0xee, 0x20, 0xcb, + 0x63, 0x8d, 0x97, 0xfd, 0xcb, 0x65, 0x18, 0xe4, 0xef, 0xa5, 0xaf, 0xc2, 0xf0, 0x0e, 0x4f, 0x87, + 0xdc, 0x4f, 0xe6, 0xe5, 0xf4, 0x38, 0xc2, 0x01, 0x58, 0x16, 0x46, 0xeb, 0x70, 0x46, 0x44, 0x4a, + 0xd5, 0x88, 0xef, 0x1c, 0xc8, 0x53, 0x2d, 0x7f, 0x9a, 0x44, 0xa6, 0xcd, 0x3f, 0xb3, 0xd6, 0x49, + 0x82, 0xf3, 0xca, 0xa1, 0x57, 0x3b, 0x92, 0x20, 0xf2, 0x44, 0xd2, 0x4a, 0x07, 0xee, 0x91, 0x08, + 0xf1, 0x65, 0x18, 0x6f, 0x75, 0x9c, 0xdf, 0xb5, 0xa7, 0xaa, 0xcd, 0x33, 0xbb, 0x49, 0xcb, 0xbc, + 0x0a, 0xda, 0xcc, 0x87, 0x62, 0x63, 0x27, 0x22, 0xf1, 0x4e, 0xe8, 0xbb, 0xe2, 0x5d, 0xd6, 0xd4, + 0xab, 0x20, 0x83, 0xc7, 0x1d, 0x25, 0x28, 0x97, 0x2d, 0xc7, 0xf3, 0xdb, 0x11, 0x49, 0xb9, 0x0c, + 0x99, 0x5c, 0x56, 0x33, 0x78, 0xdc, 0x51, 0x82, 0xce, 0xa3, 0xb3, 0xe2, 0x51, 0x4f, 0x19, 0x3f, + 0xaf, 0x5c, 0x45, 0x86, 0xa5, 0x1f, 0x7d, 0x97, 0x9c, 0x2e, 0xe2, 0xca, 0x5f, 0x3d, 0x0b, 0xaa, + 0x3d, 0x19, 0x27, 0x3c, 0xe8, 0x25, 0x97, 0xbb, 0x79, 0x5a, 0xf2, 0x8f, 0x2c, 0x38, 0x93, 0xe3, + 0x3e, 0xc6, 0x45, 0xd5, 0xb6, 0x17, 0x27, 0xea, 0x45, 0x0c, 0x4d, 0x54, 0x71, 0x38, 0x56, 0x14, + 0x74, 0x3d, 0x70, 0x61, 0x98, 0x15, 0x80, 0xc2, 0xe5, 0x43, 0x60, 0x8f, 0x27, 0x00, 0xd1, 0x79, + 0x18, 0x68, 0xc7, 0x24, 0x92, 0x6f, 0x32, 0x4a, 0xf9, 0xcd, 0x2c, 0x82, 0x0c, 0x43, 0x35, 0xca, + 0x6d, 0x65, 0x8c, 0xd3, 0x34, 0x4a, 0x6e, 0x8e, 0xe3, 0x38, 0xfb, 0x4b, 0x65, 0x98, 0xcc, 0x38, + 0x80, 0xd2, 0x86, 0xec, 0x85, 0x81, 0x97, 0x84, 0x2a, 0x07, 0x1f, 0x4f, 0x39, 0x42, 0x5a, 0x3b, + 0xeb, 0x02, 0x8e, 0x15, 0x05, 0x7a, 0x4c, 0x3e, 0xd4, 0x9b, 0x7d, 0xe9, 0x63, 0xa9, 0x66, 0xbc, + 0xd5, 0xdb, 0xef, 0x93, 0x3d, 0x8f, 0xc2, 0x40, 0x2b, 0x54, 0xaf, 0xa8, 0xab, 0xf1, 0xc4, 0x4b, + 0xb5, 0x7a, 0x18, 0xfa, 0x98, 0x21, 0xd1, 0x27, 0xc4, 0xd7, 0x67, 0xee, 0x2b, 0xb0, 0xe3, 0x86, + 0xb1, 0xd6, 0x05, 0x4f, 0xc0, 0xf0, 0x2e, 0x39, 0x88, 0xbc, 0x60, 0x3b, 0x7b, 0x5b, 0x73, 0x85, + 0x83, 0xb1, 0xc4, 0x9b, 0x29, 0xef, 0x87, 0xef, 0xc9, 0xab, 0x3b, 0x23, 0x3d, 0x77, 0xb5, 0xdf, + 0xb0, 0x60, 0x92, 0xe5, 0xbb, 0x15, 0x99, 0x1a, 0xbc, 0x30, 0x38, 0x05, 0x3d, 0xe1, 0x51, 0x18, + 0x8c, 0x68, 0xa5, 0xd9, 0xa7, 0x34, 0x58, 0x4b, 0x30, 0xc7, 0xa1, 0x87, 0x60, 0x80, 0x35, 0x81, + 0x0e, 0xde, 0x18, 0xcf, 0x78, 0x5f, 0x73, 0x12, 0x07, 0x33, 0x28, 0x0b, 0x99, 0xc3, 0xa4, 0xe5, + 0x7b, 0xbc, 0xd1, 0xa9, 0xb9, 0xf5, 0xa3, 0x11, 0x32, 0x97, 0xdb, 0xb4, 0x0f, 0x16, 0x32, 0x97, + 0xcf, 0xb2, 0xbb, 0x0e, 0xfe, 0xdf, 0x4b, 0x70, 0x2e, 0xb7, 0x5c, 0xdf, 0x21, 0x73, 0xdd, 0x4b, + 0x9f, 0xcc, 0x5d, 0x6f, 0xfe, 0x15, 0x6c, 0xf9, 0x14, 0xaf, 0x60, 0x07, 0xfa, 0x55, 0x53, 0x06, + 0xfb, 0x88, 0x64, 0xcb, 0xed, 0xb2, 0x8f, 0x48, 0x24, 0x5b, 0x6e, 0xdb, 0x0a, 0xce, 0x10, 0x3f, + 0x28, 0x15, 0x7c, 0x0b, 0x3b, 0x4d, 0x5c, 0xa0, 0x72, 0x86, 0x21, 0x63, 0xa1, 0x76, 0x8d, 0x71, + 0x19, 0xc3, 0x61, 0x58, 0x61, 0x91, 0xa7, 0xc5, 0x84, 0xf1, 0xa6, 0xbd, 0x7c, 0xac, 0x25, 0x33, + 0x6f, 0x5a, 0xc7, 0xf5, 0xb4, 0x12, 0xd9, 0xf8, 0xb0, 0x75, 0xed, 0x04, 0x58, 0xee, 0xff, 0x04, + 0x38, 0x96, 0x7f, 0xfa, 0x43, 0x8b, 0x30, 0xb9, 0xe7, 0x05, 0xec, 0x3d, 0x5c, 0x53, 0xef, 0x51, + 0x21, 0xd2, 0xeb, 0x26, 0x1a, 0x67, 0xe9, 0x67, 0x5f, 0x86, 0xf1, 0xbb, 0x37, 0x59, 0x7d, 0xa7, + 0x0c, 0x0f, 0x76, 0x59, 0xf6, 0x5c, 0xd6, 0x1b, 0x63, 0xa0, 0xc9, 0xfa, 0x8e, 0x71, 0xa8, 0xc3, + 0xcc, 0x56, 0xdb, 0xf7, 0x0f, 0x98, 0x97, 0x13, 0x71, 0x25, 0x85, 0x50, 0x4c, 0x54, 0x32, 0xeb, + 0xd5, 0x1c, 0x1a, 0x9c, 0x5b, 0x12, 0xbd, 0x06, 0x28, 0xdc, 0x64, 0x09, 0x96, 0xdd, 0x34, 0x59, + 0x06, 0xeb, 0xf8, 0x72, 0xba, 0x18, 0xaf, 0x77, 0x50, 0xe0, 0x9c, 0x52, 0x54, 0xc3, 0x64, 0x2f, + 0xf8, 0xab, 0x66, 0x65, 0x34, 0x4c, 0xac, 0x23, 0xb1, 0x49, 0x8b, 0x2e, 0xc1, 0xb4, 0xb3, 0xef, + 0x78, 0x3c, 0x79, 0x9a, 0x64, 0xc0, 0x55, 0x4c, 0x65, 0x28, 0x5a, 0xcc, 0x12, 0xe0, 0xce, 0x32, + 0x99, 0xe0, 0xb6, 0xa1, 0xe2, 0xe0, 0xb6, 0xee, 0x72, 0xb1, 0x97, 0xdd, 0xcf, 0xfe, 0x4f, 0x16, + 0xdd, 0xbe, 0x72, 0x1e, 0x60, 0xa5, 0xfd, 0xa0, 0xec, 0x57, 0x5a, 0x9c, 0x99, 0xea, 0x87, 0x65, + 0x1d, 0x89, 0x4d, 0x5a, 0x3e, 0x21, 0xe2, 0xd4, 0xc9, 0xda, 0xd0, 0x13, 0x45, 0x00, 0xa8, 0xa2, + 0x40, 0x6f, 0xc2, 0xb0, 0xeb, 0xed, 0x7b, 0x71, 0x18, 0x89, 0xc5, 0x72, 0xdc, 0x47, 0xc7, 0x95, + 0x1c, 0xac, 0x71, 0x36, 0x58, 0xf2, 0xb3, 0xbf, 0x54, 0x82, 0x71, 0x59, 0xe3, 0xeb, 0xed, 0x30, + 0x71, 0x4e, 0x61, 0x5b, 0xbe, 0x64, 0x6c, 0xcb, 0x9f, 0xe8, 0x16, 0x05, 0xcb, 0x9a, 0x54, 0xb8, + 0x1d, 0x5f, 0xcf, 0x6c, 0xc7, 0x8f, 0xf7, 0x66, 0xd5, 0x7d, 0x1b, 0xfe, 0xe7, 0x16, 0x4c, 0x1b, + 0xf4, 0xa7, 0xb0, 0x1b, 0xac, 0x9a, 0xbb, 0xc1, 0x23, 0x3d, 0xbf, 0xa1, 0x60, 0x17, 0xf8, 0x5a, + 0x29, 0xd3, 0x76, 0x26, 0xfd, 0xdf, 0x83, 0x81, 0x1d, 0x27, 0x72, 0xbb, 0xa5, 0x00, 0xed, 0x28, + 0x34, 0x7f, 0xd9, 0x89, 0x5c, 0x2e, 0xc3, 0x9f, 0x56, 0x6f, 0xc3, 0x39, 0x91, 0xdb, 0x33, 0xa6, + 0x80, 0x55, 0x85, 0x5e, 0x82, 0xa1, 0xb8, 0x19, 0xb6, 0x94, 0xef, 0xe5, 0x79, 0xfe, 0x6e, 0x1c, + 0x85, 0x1c, 0x1d, 0xce, 0x21, 0xb3, 0x3a, 0x0a, 0xc6, 0x82, 0x7e, 0x76, 0x1b, 0x2a, 0xaa, 0xea, + 0x7b, 0xea, 0x55, 0xfe, 0x07, 0x65, 0x38, 0x93, 0x33, 0x2f, 0x50, 0x6c, 0xf4, 0xd6, 0xb3, 0x7d, + 0x4e, 0xa7, 0x0f, 0xd8, 0x5f, 0x31, 0x3b, 0xb1, 0xb8, 0x62, 0xfc, 0xfb, 0xae, 0xf4, 0x46, 0x4c, + 0xb2, 0x95, 0x52, 0x50, 0xef, 0x4a, 0x69, 0x65, 0xa7, 0xd6, 0xd5, 0xb4, 0x22, 0xd5, 0xd2, 0x7b, + 0x3a, 0xa6, 0x7f, 0x52, 0x86, 0x99, 0xbc, 0xe0, 0x79, 0xf4, 0xd3, 0x99, 0x07, 0x45, 0x9e, 0xef, + 0x37, 0xec, 0x9e, 0xbf, 0x32, 0x22, 0xb2, 0x0d, 0xcd, 0x9b, 0x4f, 0x8c, 0xf4, 0xec, 0x66, 0x51, + 0x27, 0x0b, 0xf2, 0x89, 0xf8, 0x43, 0x30, 0x72, 0x89, 0x7f, 0xaa, 0xef, 0x06, 0x88, 0x17, 0x64, + 0xe2, 0x4c, 0x90, 0x8f, 0x04, 0xf7, 0x0e, 0xf2, 0x91, 0x35, 0xcf, 0x7a, 0x30, 0xaa, 0x7d, 0xcd, + 0x3d, 0x1d, 0xf1, 0x5d, 0xba, 0xa3, 0x68, 0xed, 0xbe, 0xa7, 0xa3, 0xfe, 0x15, 0x0b, 0x32, 0x7e, + 0x52, 0xca, 0xfe, 0x61, 0x15, 0xda, 0x3f, 0xce, 0xc3, 0x40, 0x14, 0xfa, 0x24, 0xfb, 0xc6, 0x04, + 0x0e, 0x7d, 0x82, 0x19, 0x46, 0x3d, 0x04, 0x5d, 0x2e, 0x7a, 0x08, 0x9a, 0x1e, 0x8d, 0x7d, 0xb2, + 0x4f, 0xa4, 0x35, 0x42, 0xc9, 0xe4, 0xab, 0x14, 0x88, 0x39, 0xce, 0xfe, 0xb5, 0x01, 0x38, 0x93, + 0x13, 0xd2, 0x46, 0x0f, 0x2a, 0xdb, 0x4e, 0x42, 0x6e, 0x39, 0x07, 0xd9, 0xbc, 0xb7, 0x97, 0x38, + 0x18, 0x4b, 0x3c, 0xf3, 0xe5, 0xe4, 0xa9, 0xf3, 0x32, 0x36, 0x22, 0x91, 0x31, 0x4f, 0x60, 0xef, + 0xd5, 0xdb, 0xc0, 0x17, 0x01, 0xe2, 0xd8, 0x5f, 0x09, 0xa8, 0xf2, 0xe5, 0x0a, 0x4f, 0xd1, 0x34, + 0xcf, 0x62, 0xe3, 0xaa, 0xc0, 0x60, 0x8d, 0x0a, 0xd5, 0x60, 0xaa, 0x15, 0x85, 0x09, 0xb7, 0xbb, + 0xd5, 0xb8, 0x8f, 0xc2, 0xa0, 0x19, 0x9c, 0x54, 0xcf, 0xe0, 0x71, 0x47, 0x09, 0xf4, 0x02, 0x8c, + 0x8a, 0x80, 0xa5, 0x7a, 0x18, 0xfa, 0xc2, 0x4a, 0xa3, 0x6e, 0xbc, 0x1b, 0x29, 0x0a, 0xeb, 0x74, + 0x5a, 0x31, 0x66, 0xcc, 0x1b, 0xce, 0x2d, 0xc6, 0x0d, 0x7a, 0x1a, 0x5d, 0x26, 0x87, 0xc6, 0x48, + 0x5f, 0x39, 0x34, 0x52, 0xbb, 0x55, 0xa5, 0xef, 0xfb, 0x0b, 0xe8, 0x69, 0xe9, 0xf9, 0x46, 0x19, + 0x86, 0xf8, 0x50, 0x9c, 0x82, 0x2a, 0xb6, 0x2a, 0x6c, 0x37, 0x5d, 0x32, 0x0a, 0xf0, 0xb6, 0xcc, + 0xd7, 0x9c, 0xc4, 0xe1, 0x62, 0x48, 0xad, 0x86, 0xd4, 0xca, 0x83, 0xe6, 0x8d, 0xf5, 0x32, 0x9b, + 0x31, 0x4e, 0x00, 0xe7, 0xa1, 0xad, 0x9e, 0x77, 0x00, 0x62, 0xf6, 0x3e, 0x2d, 0xe5, 0x21, 0x72, + 0x53, 0x3c, 0xd9, 0xa5, 0xf6, 0x86, 0x22, 0xe6, 0x6d, 0x48, 0xa7, 0xa0, 0x42, 0x60, 0x8d, 0xe3, + 0xec, 0x8b, 0x50, 0x51, 0xc4, 0xbd, 0x4e, 0x72, 0x63, 0xba, 0xf0, 0xfa, 0x0c, 0x4c, 0x66, 0xea, + 0x3a, 0xd6, 0x41, 0xf0, 0x37, 0x2d, 0x98, 0xe4, 0x4d, 0x5e, 0x09, 0xf6, 0xc5, 0x62, 0x7f, 0x1f, + 0x66, 0xfc, 0x9c, 0x45, 0x27, 0x46, 0xb4, 0xff, 0x45, 0xaa, 0x0e, 0x7e, 0x79, 0x58, 0x9c, 0x5b, + 0x07, 0x3d, 0xfc, 0xf3, 0x97, 0xb5, 0x1d, 0x5f, 0x78, 0x20, 0x8f, 0xf1, 0xdc, 0xe2, 0x1c, 0x86, + 0x15, 0xd6, 0xfe, 0xae, 0x05, 0xd3, 0xbc, 0xe5, 0x57, 0xc8, 0x81, 0x3a, 0xe4, 0x7c, 0x98, 0x6d, + 0x17, 0xa9, 0xd3, 0x4b, 0x05, 0xa9, 0xd3, 0xf5, 0x4f, 0x2b, 0x77, 0xfd, 0xb4, 0x5f, 0xb5, 0x40, + 0xcc, 0xc0, 0x53, 0x50, 0xe7, 0x7f, 0xdc, 0x54, 0xe7, 0x67, 0x8b, 0x27, 0x75, 0x81, 0x1e, 0xff, + 0x67, 0x16, 0x4c, 0x71, 0x82, 0xf4, 0xf2, 0xe2, 0x43, 0x1d, 0x87, 0x7e, 0xde, 0xf3, 0x51, 0x0f, + 0xa8, 0xe6, 0x7f, 0x94, 0x31, 0x58, 0x03, 0x5d, 0x07, 0xcb, 0x95, 0x0b, 0xe8, 0x18, 0xef, 0x54, + 0x1d, 0x3b, 0xdb, 0x9f, 0xfd, 0xc7, 0x16, 0x20, 0x5e, 0x4d, 0xf6, 0x49, 0x73, 0xbe, 0xf5, 0x69, + 0x07, 0xfa, 0x54, 0xd4, 0x28, 0x0c, 0xd6, 0xa8, 0x4e, 0xa4, 0x7b, 0x32, 0x37, 0x50, 0xe5, 0xde, + 0x37, 0x50, 0xc7, 0xe8, 0xd1, 0xbf, 0x3a, 0x00, 0x59, 0x77, 0x47, 0x74, 0x13, 0xc6, 0x9a, 0x4e, + 0xcb, 0xd9, 0xf4, 0x7c, 0x2f, 0xf1, 0x48, 0xdc, 0xed, 0xea, 0x7a, 0x59, 0xa3, 0x13, 0xd7, 0x3d, + 0x1a, 0x04, 0x1b, 0x7c, 0xd0, 0x3c, 0x40, 0x2b, 0xf2, 0xf6, 0x3d, 0x9f, 0x6c, 0xb3, 0x13, 0x0d, + 0x8b, 0x79, 0xe0, 0xf7, 0xb1, 0x12, 0x8a, 0x35, 0x8a, 0x1c, 0x1f, 0xf9, 0xf2, 0xbd, 0xf3, 0x91, + 0x1f, 0x38, 0xa6, 0x8f, 0xfc, 0x60, 0x5f, 0x3e, 0xf2, 0x18, 0xee, 0x93, 0x7b, 0x37, 0xfd, 0xbf, + 0xea, 0xf9, 0x44, 0x28, 0x6c, 0x3c, 0x12, 0x62, 0xf6, 0xce, 0xe1, 0xdc, 0x7d, 0x38, 0x97, 0x02, + 0x17, 0x94, 0x44, 0x3f, 0x09, 0x55, 0xc7, 0xf7, 0xc3, 0x5b, 0xaa, 0xd7, 0x56, 0xe2, 0xa6, 0xe3, + 0xa7, 0xc9, 0x6f, 0x47, 0x96, 0x1e, 0xba, 0x73, 0x38, 0x57, 0x5d, 0x2c, 0xa0, 0xc1, 0x85, 0xa5, + 0xed, 0x5d, 0x38, 0xd3, 0x20, 0x91, 0x7c, 0xfa, 0x4e, 0x2d, 0xb1, 0x0d, 0xa8, 0x44, 0x19, 0xa1, + 0xd2, 0x57, 0xb8, 0xbc, 0x96, 0x98, 0x4c, 0x0a, 0x91, 0x94, 0x91, 0xfd, 0xa7, 0x16, 0x0c, 0x0b, + 0x17, 0xca, 0x53, 0xd0, 0x65, 0x16, 0x0d, 0xb3, 0xd2, 0x5c, 0xbe, 0xe0, 0x65, 0x8d, 0x29, 0x34, + 0x28, 0xad, 0x65, 0x0c, 0x4a, 0x8f, 0x74, 0x63, 0xd2, 0xdd, 0x94, 0xf4, 0x0b, 0x65, 0x98, 0x30, + 0xdd, 0x47, 0x4f, 0xa1, 0x0b, 0xae, 0xc1, 0x70, 0x2c, 0x7c, 0x95, 0x4b, 0xc5, 0x3e, 0x6f, 0xd9, + 0x41, 0x4c, 0x6f, 0xc6, 0x85, 0x77, 0xb2, 0x64, 0x92, 0xeb, 0x04, 0x5d, 0xbe, 0x87, 0x4e, 0xd0, + 0xbd, 0x3c, 0x78, 0x07, 0x4e, 0xc2, 0x83, 0xd7, 0xfe, 0x26, 0x13, 0xfe, 0x3a, 0xfc, 0x14, 0xf4, + 0x82, 0x4b, 0xe6, 0x36, 0x61, 0x77, 0x99, 0x59, 0xa2, 0x51, 0x05, 0xfa, 0xc1, 0x3f, 0xb2, 0x60, + 0x54, 0x10, 0x9e, 0x42, 0xb3, 0x7f, 0xc2, 0x6c, 0xf6, 0x83, 0x5d, 0x9a, 0x5d, 0xd0, 0xde, 0xbf, + 0x5d, 0x52, 0xed, 0xad, 0x87, 0x51, 0xd2, 0x57, 0x32, 0xf4, 0x11, 0x7a, 0x1a, 0x0c, 0x9b, 0xa1, + 0x2f, 0x36, 0xf3, 0x87, 0xd2, 0x60, 0x38, 0x0e, 0x3f, 0xd2, 0x7e, 0x63, 0x45, 0xcd, 0x62, 0xb5, + 0xc2, 0x28, 0x11, 0x1b, 0x68, 0x1a, 0xab, 0x15, 0x46, 0x09, 0x66, 0x18, 0xe4, 0x02, 0x24, 0x4e, + 0xb4, 0x4d, 0x12, 0x0a, 0x13, 0xd1, 0xa3, 0xc5, 0xab, 0xb0, 0x9d, 0x78, 0xfe, 0xbc, 0x17, 0x24, + 0x71, 0x12, 0xcd, 0xaf, 0x05, 0xc9, 0xf5, 0x88, 0x9f, 0x0d, 0xb4, 0xe8, 0x36, 0xc5, 0x0b, 0x6b, + 0x7c, 0x65, 0x78, 0x05, 0xab, 0x63, 0xd0, 0xbc, 0xef, 0xb9, 0x26, 0xe0, 0x58, 0x51, 0xd8, 0x2f, + 0x32, 0x99, 0xcc, 0x3a, 0xe8, 0x78, 0x81, 0x67, 0xdf, 0x1e, 0x51, 0x5d, 0xcb, 0x8c, 0xbd, 0x35, + 0x3d, 0xbc, 0xad, 0xbb, 0x08, 0xa4, 0x15, 0xeb, 0xae, 0xc4, 0x69, 0x0c, 0x1c, 0xfa, 0x6c, 0xc7, + 0x35, 0xe0, 0x33, 0x3d, 0x64, 0xe9, 0x31, 0x2e, 0xfe, 0x58, 0x66, 0x3e, 0x96, 0xc1, 0x6c, 0xad, + 0x9e, 0x4d, 0x57, 0xbf, 0x2c, 0x11, 0x38, 0xa5, 0x41, 0x0b, 0xe2, 0x64, 0xc9, 0xcd, 0x2c, 0x0f, + 0x66, 0x4e, 0x96, 0xf2, 0xf3, 0xb5, 0xa3, 0xe5, 0xb3, 0x30, 0xaa, 0x9e, 0x00, 0xaa, 0xf3, 0x97, + 0x54, 0x2a, 0x5c, 0x97, 0x5a, 0x49, 0xc1, 0x58, 0xa7, 0x41, 0x1b, 0x30, 0x19, 0xf3, 0xf7, 0x89, + 0x64, 0xc4, 0x83, 0xb0, 0x1b, 0x3c, 0x29, 0xaf, 0x0f, 0x1b, 0x26, 0xfa, 0x88, 0x81, 0xf8, 0x62, + 0x95, 0x31, 0x12, 0x59, 0x16, 0xe8, 0x55, 0x98, 0xf0, 0xf5, 0x77, 0x5a, 0xeb, 0xc2, 0xac, 0xa0, + 0x5c, 0xb9, 0x8c, 0x57, 0x5c, 0xeb, 0x38, 0x43, 0x4d, 0x95, 0x00, 0x1d, 0x22, 0x12, 0xe8, 0x38, + 0xc1, 0x36, 0x89, 0xc5, 0x03, 0x26, 0x4c, 0x09, 0xb8, 0x5a, 0x40, 0x83, 0x0b, 0x4b, 0xa3, 0x97, + 0x60, 0x4c, 0x7e, 0xbe, 0x16, 0x01, 0x94, 0x3a, 0x0c, 0x6a, 0x38, 0x6c, 0x50, 0xa2, 0x5b, 0x70, + 0x56, 0xfe, 0xdf, 0x88, 0x9c, 0xad, 0x2d, 0xaf, 0x29, 0x02, 0xb0, 0x46, 0x19, 0x8b, 0x45, 0xe9, + 0x3d, 0xbd, 0x92, 0x47, 0x74, 0x74, 0x38, 0x77, 0x5e, 0xf4, 0x5a, 0x2e, 0x9e, 0x0d, 0x62, 0x3e, + 0x7f, 0xb4, 0x0e, 0x67, 0x76, 0x88, 0xe3, 0x27, 0x3b, 0xcb, 0x3b, 0xa4, 0xb9, 0x2b, 0x17, 0x11, + 0x8b, 0x2b, 0xd2, 0xdc, 0xec, 0x2e, 0x77, 0x92, 0xe0, 0xbc, 0x72, 0xe8, 0x6d, 0xa8, 0xb6, 0xda, + 0x9b, 0xbe, 0x17, 0xef, 0x5c, 0x0b, 0x13, 0x76, 0x63, 0xa9, 0x5e, 0xd0, 0x11, 0x01, 0x48, 0x2a, + 0xa6, 0xaa, 0x5e, 0x40, 0x87, 0x0b, 0x39, 0xa0, 0xf7, 0xe1, 0x6c, 0x66, 0x32, 0xf0, 0x47, 0x99, + 0x44, 0xa0, 0xd2, 0x13, 0xf9, 0xcb, 0x29, 0xa7, 0x00, 0x0f, 0x8b, 0xcb, 0x45, 0xe1, 0xfc, 0x2a, + 0x3e, 0xd8, 0x3d, 0xf6, 0x7b, 0xb4, 0xb0, 0xa6, 0xdd, 0xa0, 0xcf, 0xc1, 0x98, 0x3e, 0x8b, 0xc4, + 0x06, 0xf3, 0x58, 0xaf, 0x37, 0x89, 0x85, 0x6e, 0xa4, 0x66, 0x94, 0x8e, 0xc3, 0x06, 0x47, 0x9b, + 0x40, 0xfe, 0xf7, 0xa1, 0xab, 0x30, 0xd2, 0xf4, 0x3d, 0x12, 0x24, 0x6b, 0xf5, 0x6e, 0x81, 0xb3, + 0xcb, 0x82, 0x46, 0x74, 0x98, 0xc8, 0xdf, 0xc4, 0x61, 0x58, 0x71, 0xb0, 0x7f, 0xa7, 0x04, 0x73, + 0x3d, 0x52, 0x78, 0x65, 0x6c, 0x80, 0x56, 0x5f, 0x36, 0xc0, 0x45, 0xf9, 0x1e, 0xd0, 0xb5, 0xcc, + 0xf9, 0x33, 0xf3, 0xd6, 0x4f, 0x7a, 0x0a, 0xcd, 0xd2, 0xf7, 0xed, 0xfe, 0xa6, 0x9b, 0x11, 0x07, + 0x7a, 0x7a, 0x01, 0xd6, 0x75, 0x7b, 0xf0, 0x60, 0xff, 0x1a, 0x7d, 0xa1, 0x29, 0xd8, 0xfe, 0x66, + 0x09, 0xce, 0xaa, 0x2e, 0xfc, 0xd1, 0xed, 0xb8, 0x1b, 0x9d, 0x1d, 0x77, 0x02, 0x86, 0x74, 0xfb, + 0x3a, 0x0c, 0x35, 0x0e, 0xe2, 0x66, 0xe2, 0xf7, 0xa1, 0x00, 0x3d, 0x6a, 0x2c, 0xd0, 0x74, 0x9b, + 0x66, 0x4f, 0xfa, 0x89, 0xf5, 0x6a, 0xff, 0x25, 0x0b, 0x26, 0x37, 0x96, 0xeb, 0x8d, 0xb0, 0xb9, + 0x4b, 0x92, 0x45, 0x6e, 0x26, 0xc2, 0x42, 0xff, 0xb1, 0xee, 0x52, 0xaf, 0xc9, 0xd3, 0x98, 0xce, + 0xc3, 0xc0, 0x4e, 0x18, 0x27, 0xd9, 0xcb, 0x92, 0xcb, 0x61, 0x9c, 0x60, 0x86, 0xb1, 0xff, 0xd0, + 0x82, 0x41, 0xf6, 0x8a, 0x5d, 0xaf, 0xd7, 0x0e, 0xfb, 0xf9, 0x2e, 0xf4, 0x02, 0x0c, 0x91, 0xad, + 0x2d, 0xd2, 0x4c, 0xc4, 0xa8, 0xca, 0x88, 0x9c, 0xa1, 0x15, 0x06, 0xa5, 0x9b, 0x3e, 0xab, 0x8c, + 0xff, 0xc5, 0x82, 0x18, 0x7d, 0x16, 0x2a, 0x89, 0xb7, 0x47, 0x16, 0x5d, 0x57, 0xdc, 0x53, 0x1c, + 0xcf, 0x25, 0x4d, 0x29, 0x21, 0x1b, 0x92, 0x09, 0x4e, 0xf9, 0xd9, 0x3f, 0x5f, 0x02, 0x48, 0x23, + 0xf7, 0x7a, 0x7d, 0xe6, 0x52, 0xc7, 0xa3, 0x8e, 0x8f, 0xe5, 0x3c, 0xea, 0x88, 0x52, 0x86, 0x39, + 0x4f, 0x3a, 0xaa, 0xae, 0x2a, 0xf7, 0xd5, 0x55, 0x03, 0xc7, 0xe9, 0xaa, 0x65, 0x98, 0x4e, 0x23, + 0x0f, 0xcd, 0x30, 0x6c, 0x96, 0xae, 0x77, 0x23, 0x8b, 0xc4, 0x9d, 0xf4, 0xf6, 0x17, 0x2d, 0x10, + 0x6e, 0xca, 0x7d, 0x4c, 0xe8, 0xb7, 0xe4, 0xfb, 0x6b, 0x46, 0x5e, 0xc1, 0xf3, 0xc5, 0x7e, 0xdb, + 0x22, 0x9b, 0xa0, 0xda, 0x40, 0x8c, 0x1c, 0x82, 0x06, 0x2f, 0xfb, 0xaf, 0x97, 0x60, 0x94, 0xa3, + 0x59, 0xce, 0xba, 0x3e, 0x5a, 0x73, 0xac, 0x64, 0xcf, 0xec, 0x69, 0x32, 0xca, 0x58, 0xe5, 0x04, + 0xd6, 0x9f, 0x26, 0x93, 0x08, 0x9c, 0xd2, 0xa0, 0x27, 0x60, 0x38, 0x6e, 0x6f, 0x32, 0xf2, 0x8c, + 0xa7, 0x72, 0x83, 0x83, 0xb1, 0xc4, 0xa3, 0x9f, 0x84, 0x29, 0x5e, 0x2e, 0x0a, 0x5b, 0xce, 0x36, + 0xb7, 0xef, 0x0c, 0xaa, 0x38, 0x95, 0xa9, 0xf5, 0x0c, 0xee, 0xe8, 0x70, 0x6e, 0x26, 0x0b, 0x63, + 0x96, 0xc1, 0x0e, 0x2e, 0x74, 0xc6, 0x4e, 0x65, 0x5d, 0xe0, 0xd1, 0x65, 0x18, 0xe2, 0x02, 0x49, + 0x08, 0x88, 0x2e, 0xf7, 0x3d, 0x9a, 0xe3, 0x3c, 0xf0, 0x57, 0xfa, 0x99, 0x20, 0x13, 0xe5, 0xd1, + 0xdb, 0x30, 0xea, 0x86, 0xb7, 0x82, 0x5b, 0x4e, 0xe4, 0x2e, 0xd6, 0xd7, 0xc4, 0x78, 0xe6, 0xea, + 0x35, 0xb5, 0x94, 0x4c, 0x77, 0xc6, 0x67, 0xb6, 0xcd, 0x14, 0x85, 0x75, 0x76, 0x68, 0x83, 0xa5, + 0x59, 0xe1, 0x6f, 0x07, 0x77, 0x73, 0xed, 0x51, 0xcf, 0x0d, 0x6b, 0x9c, 0xc7, 0x45, 0x2e, 0x16, + 0xf1, 0xf2, 0x70, 0xca, 0xc8, 0xfe, 0xfc, 0x19, 0x30, 0xe6, 0x91, 0x91, 0xec, 0xd9, 0x3a, 0xa1, + 0x64, 0xcf, 0x18, 0x46, 0xc8, 0x5e, 0x2b, 0x39, 0xa8, 0x79, 0x51, 0xb7, 0x2c, 0xff, 0x2b, 0x82, + 0xa6, 0x93, 0xa7, 0xc4, 0x60, 0xc5, 0x27, 0x3f, 0x23, 0x77, 0xf9, 0x43, 0xcc, 0xc8, 0x3d, 0x70, + 0x8a, 0x19, 0xb9, 0xaf, 0xc1, 0xf0, 0xb6, 0x97, 0x60, 0xd2, 0x0a, 0xc5, 0x66, 0x9c, 0x3b, 0x13, + 0x2e, 0x71, 0x92, 0xce, 0xbc, 0xb1, 0x02, 0x81, 0x25, 0x13, 0xf4, 0x9a, 0x5a, 0x03, 0x43, 0xc5, + 0xba, 0x6c, 0xe7, 0xd5, 0x40, 0xee, 0x2a, 0x10, 0x19, 0xb8, 0x87, 0xef, 0x36, 0x03, 0xb7, 0xca, + 0xa0, 0x3d, 0xf2, 0xc1, 0x32, 0x68, 0x1b, 0x19, 0xc6, 0x2b, 0x27, 0x97, 0x61, 0xfc, 0x8b, 0x16, + 0x9c, 0x6d, 0xe5, 0x25, 0xdb, 0x17, 0xb9, 0xb0, 0x5f, 0xe8, 0xfb, 0x35, 0x01, 0xa3, 0x42, 0x76, + 0xa8, 0xc9, 0x25, 0xc3, 0xf9, 0xd5, 0xc9, 0x54, 0xe5, 0xa3, 0x77, 0x9b, 0xaa, 0xfc, 0xde, 0x24, + 0xcd, 0x4e, 0x13, 0x97, 0x8f, 0x7f, 0xe0, 0xc4, 0xe5, 0xaf, 0xa9, 0xc4, 0xe5, 0x5d, 0x92, 0x59, + 0xf0, 0xb4, 0xe4, 0x3d, 0xd3, 0x95, 0x6b, 0x29, 0xc7, 0x27, 0x4f, 0x22, 0xe5, 0xf8, 0x3b, 0xa6, + 0xb0, 0xe7, 0xf9, 0xaf, 0x9f, 0xea, 0x21, 0xec, 0x0d, 0xbe, 0xdd, 0xc5, 0x3d, 0x4f, 0xaf, 0x3e, + 0x7d, 0x57, 0xe9, 0xd5, 0x6f, 0xea, 0x89, 0xcb, 0x51, 0x8f, 0xcc, 0xdc, 0x94, 0xa8, 0xcf, 0x74, + 0xe5, 0x37, 0xf5, 0x2d, 0xe8, 0x4c, 0x31, 0x5f, 0xb5, 0xd3, 0x74, 0xf2, 0xcd, 0xdb, 0x84, 0x3a, + 0xd3, 0xa0, 0xcf, 0x9c, 0x4e, 0x1a, 0xf4, 0xb3, 0x27, 0x9e, 0x06, 0xfd, 0xbe, 0x53, 0x48, 0x83, + 0x7e, 0xff, 0x87, 0x9a, 0x06, 0xbd, 0x7a, 0x6f, 0xd3, 0xa0, 0x3f, 0x70, 0x12, 0x69, 0xd0, 0x6f, + 0x42, 0xa5, 0x25, 0xa3, 0x24, 0xab, 0xb3, 0xc5, 0x43, 0x92, 0x1b, 0x4a, 0xc9, 0x87, 0x44, 0xa1, + 0x70, 0xca, 0x8a, 0xf2, 0x4d, 0xd3, 0xa2, 0x3f, 0xd8, 0xc5, 0x6c, 0x95, 0x67, 0x10, 0xe8, 0x92, + 0x0c, 0xfd, 0x2f, 0x97, 0xe0, 0x5c, 0xf7, 0x79, 0x9d, 0x5a, 0x13, 0xea, 0xa9, 0xf5, 0x3b, 0x63, + 0x4d, 0x60, 0x4a, 0x97, 0x46, 0xd5, 0x77, 0x28, 0xf9, 0x25, 0x98, 0x56, 0xce, 0x62, 0xbe, 0xd7, + 0x3c, 0xd0, 0x5e, 0x4c, 0x52, 0xf1, 0x07, 0x8d, 0x2c, 0x01, 0xee, 0x2c, 0x83, 0x16, 0x61, 0xd2, + 0x00, 0xae, 0xd5, 0x84, 0xb2, 0xaf, 0xcc, 0x17, 0x0d, 0x13, 0x8d, 0xb3, 0xf4, 0xf6, 0xd7, 0x2c, + 0xb8, 0xbf, 0x20, 0x37, 0x6a, 0xdf, 0x91, 0xd2, 0x5b, 0x30, 0xd9, 0x32, 0x8b, 0xf6, 0x48, 0xa8, + 0x60, 0x64, 0x60, 0x55, 0x6d, 0xcd, 0x20, 0x70, 0x96, 0xe9, 0xd2, 0x85, 0x6f, 0x7d, 0xef, 0xdc, + 0xc7, 0x7e, 0xff, 0x7b, 0xe7, 0x3e, 0xf6, 0xdd, 0xef, 0x9d, 0xfb, 0xd8, 0xff, 0x7f, 0xe7, 0x9c, + 0xf5, 0xad, 0x3b, 0xe7, 0xac, 0xdf, 0xbf, 0x73, 0xce, 0xfa, 0xee, 0x9d, 0x73, 0xd6, 0x1f, 0xdd, + 0x39, 0x67, 0xfd, 0xfc, 0xf7, 0xcf, 0x7d, 0xec, 0xad, 0xd2, 0xfe, 0xb3, 0xff, 0x2f, 0x00, 0x00, + 0xff, 0xff, 0x98, 0xcc, 0x13, 0x07, 0x60, 0xd1, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 5e0f3848dcf..344fc87fb87 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -2133,6 +2133,31 @@ message PersistentVolumeClaim { optional PersistentVolumeClaimStatus status = 3; } +// PersistentVolumeClaimCondition contails details about state of pvc +message PersistentVolumeClaimCondition { + optional string type = 1; + + optional string status = 2; + + // Last time we probed the condition. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastProbeTime = 3; + + // Last time the condition transitioned from one status to another. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastTransitionTime = 4; + + // Unique, this should be a short, machine understandable string that gives the reason + // for condition's last transition. If it reports "ResizeStarted" that means the underlying + // persistent volume is being resized. + // +optional + optional string reason = 5; + + // Human-readable message indicating details about last transition. + // +optional + optional string message = 6; +} + // PersistentVolumeClaimList is a list of PersistentVolumeClaim items. message PersistentVolumeClaimList { // Standard list metadata. @@ -2186,6 +2211,13 @@ message PersistentVolumeClaimStatus { // Represents the actual resources of the underlying volume. // +optional map capacity = 3; + + // Current Condition of persistent volume claim. If underlying persistent volume is being + // resized then the Condition will be set to 'ResizeStarted'. + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + repeated PersistentVolumeClaimCondition conditions = 4; } // PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 7e8959a58b5..4520cc6d5b0 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -630,6 +630,34 @@ type PersistentVolumeClaimSpec struct { StorageClassName *string `json:"storageClassName,omitempty" protobuf:"bytes,5,opt,name=storageClassName"` } +// PersistentVolumeClaimConditionType is a valid value of PersistentVolumeClaimCondition.Type +type PersistentVolumeClaimConditionType string + +const ( + // PersistentVolumeClaimResizing - a user trigger resize of pvc has been started + PersistentVolumeClaimResizing PersistentVolumeClaimConditionType = "Resizing" +) + +// PersistentVolumeClaimCondition contails details about state of pvc +type PersistentVolumeClaimCondition struct { + Type PersistentVolumeClaimConditionType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=PersistentVolumeClaimConditionType"` + Status ConditionStatus `json:"status" protobuf:"bytes,2,opt,name=status,casttype=ConditionStatus"` + // Last time we probed the condition. + // +optional + LastProbeTime metav1.Time `json:"lastProbeTime,omitempty" protobuf:"bytes,3,opt,name=lastProbeTime"` + // Last time the condition transitioned from one status to another. + // +optional + LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty" protobuf:"bytes,4,opt,name=lastTransitionTime"` + // Unique, this should be a short, machine understandable string that gives the reason + // for condition's last transition. If it reports "ResizeStarted" that means the underlying + // persistent volume is being resized. + // +optional + Reason string `json:"reason,omitempty" protobuf:"bytes,5,opt,name=reason"` + // Human-readable message indicating details about last transition. + // +optional + Message string `json:"message,omitempty" protobuf:"bytes,6,opt,name=message"` +} + // PersistentVolumeClaimStatus is the current status of a persistent volume claim. type PersistentVolumeClaimStatus struct { // Phase represents the current phase of PersistentVolumeClaim. @@ -642,6 +670,12 @@ type PersistentVolumeClaimStatus struct { // Represents the actual resources of the underlying volume. // +optional Capacity ResourceList `json:"capacity,omitempty" protobuf:"bytes,3,rep,name=capacity,casttype=ResourceList,castkey=ResourceName"` + // Current Condition of persistent volume claim. If underlying persistent volume is being + // resized then the Condition will be set to 'ResizeStarted'. + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + Conditions []PersistentVolumeClaimCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,4,rep,name=conditions"` } type PersistentVolumeAccessMode string diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index 55bb4ffeabf..7676b004753 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1122,6 +1122,18 @@ func (PersistentVolumeClaim) SwaggerDoc() map[string]string { return map_PersistentVolumeClaim } +var map_PersistentVolumeClaimCondition = map[string]string{ + "": "PersistentVolumeClaimCondition contails details about state of pvc", + "lastProbeTime": "Last time we probed the condition.", + "lastTransitionTime": "Last time the condition transitioned from one status to another.", + "reason": "Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized.", + "message": "Human-readable message indicating details about last transition.", +} + +func (PersistentVolumeClaimCondition) SwaggerDoc() map[string]string { + return map_PersistentVolumeClaimCondition +} + var map_PersistentVolumeClaimList = map[string]string{ "": "PersistentVolumeClaimList is a list of PersistentVolumeClaim items.", "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", @@ -1150,6 +1162,7 @@ var map_PersistentVolumeClaimStatus = map[string]string{ "phase": "Phase represents the current phase of PersistentVolumeClaim.", "accessModes": "AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", "capacity": "Represents the actual resources of the underlying volume.", + "conditions": "Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.", } func (PersistentVolumeClaimStatus) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index 8133d135b27..66d4e8e1fa7 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -427,6 +427,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*PersistentVolumeClaim).DeepCopyInto(out.(*PersistentVolumeClaim)) return nil }, InType: reflect.TypeOf(&PersistentVolumeClaim{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*PersistentVolumeClaimCondition).DeepCopyInto(out.(*PersistentVolumeClaimCondition)) + return nil + }, InType: reflect.TypeOf(&PersistentVolumeClaimCondition{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*PersistentVolumeClaimList).DeepCopyInto(out.(*PersistentVolumeClaimList)) return nil @@ -3499,6 +3503,24 @@ func (in *PersistentVolumeClaim) DeepCopyObject() runtime.Object { } } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PersistentVolumeClaimCondition) DeepCopyInto(out *PersistentVolumeClaimCondition) { + *out = *in + in.LastProbeTime.DeepCopyInto(&out.LastProbeTime) + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaimCondition. +func (in *PersistentVolumeClaimCondition) DeepCopy() *PersistentVolumeClaimCondition { + if in == nil { + return nil + } + out := new(PersistentVolumeClaimCondition) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PersistentVolumeClaimList) DeepCopyInto(out *PersistentVolumeClaimList) { *out = *in @@ -3588,6 +3610,13 @@ func (in *PersistentVolumeClaimStatus) DeepCopyInto(out *PersistentVolumeClaimSt (*out)[key] = val.DeepCopy() } } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]PersistentVolumeClaimCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/staging/src/k8s.io/api/storage/v1/generated.pb.go b/staging/src/k8s.io/api/storage/v1/generated.pb.go index 9a024884bb0..4befedff1ef 100644 --- a/staging/src/k8s.io/api/storage/v1/generated.pb.go +++ b/staging/src/k8s.io/api/storage/v1/generated.pb.go @@ -136,6 +136,16 @@ func (m *StorageClass) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], s) } } + if m.AllowVolumeExpansion != nil { + dAtA[i] = 0x30 + i++ + if *m.AllowVolumeExpansion { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } return i, nil } @@ -229,6 +239,9 @@ func (m *StorageClass) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.AllowVolumeExpansion != nil { + n += 2 + } return n } @@ -279,6 +292,7 @@ func (this *StorageClass) String() string { `Parameters:` + mapStringForParameters + `,`, `ReclaimPolicy:` + valueToStringGenerated(this.ReclaimPolicy) + `,`, `MountOptions:` + fmt.Sprintf("%v", this.MountOptions) + `,`, + `AllowVolumeExpansion:` + valueToStringGenerated(this.AllowVolumeExpansion) + `,`, `}`, }, "") return s @@ -565,6 +579,27 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { } m.MountOptions = append(m.MountOptions, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowVolumeExpansion", 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 + } + } + b := bool(v != 0) + m.AllowVolumeExpansion = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -807,40 +842,43 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 558 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0xcd, 0x6e, 0xd3, 0x40, - 0x10, 0x8e, 0x13, 0x22, 0x35, 0x9b, 0x44, 0x44, 0x06, 0x24, 0x2b, 0x07, 0x27, 0x2a, 0x97, 0x08, - 0x89, 0xdd, 0xa6, 0x2d, 0xa8, 0x42, 0x82, 0x43, 0x50, 0x25, 0x90, 0xa8, 0x1a, 0x19, 0x89, 0x03, - 0xe2, 0xc0, 0xc6, 0x19, 0x9c, 0xc5, 0x3f, 0x6b, 0xed, 0xae, 0x2d, 0xe5, 0xc6, 0x23, 0xf0, 0x3c, - 0x3c, 0x41, 0x8e, 0x3d, 0xf6, 0x14, 0x11, 0xf3, 0x06, 0x1c, 0x39, 0x21, 0xdb, 0x21, 0x76, 0x9a, - 0x54, 0xf4, 0xb6, 0x33, 0xf3, 0x7d, 0xdf, 0xce, 0xcc, 0x37, 0xe8, 0x95, 0x7b, 0x26, 0x31, 0xe3, - 0xc4, 0x8d, 0x26, 0x20, 0x02, 0x50, 0x20, 0x49, 0x0c, 0xc1, 0x94, 0x0b, 0xb2, 0x2e, 0xd0, 0x90, - 0x11, 0xa9, 0xb8, 0xa0, 0x0e, 0x90, 0x78, 0x48, 0x1c, 0x08, 0x40, 0x50, 0x05, 0x53, 0x1c, 0x0a, - 0xae, 0xb8, 0xfe, 0x28, 0x87, 0x61, 0x1a, 0x32, 0xbc, 0x86, 0xe1, 0x78, 0xd8, 0x7d, 0xea, 0x30, - 0x35, 0x8b, 0x26, 0xd8, 0xe6, 0x3e, 0x71, 0xb8, 0xc3, 0x49, 0x86, 0x9e, 0x44, 0x5f, 0xb2, 0x28, - 0x0b, 0xb2, 0x57, 0xae, 0xd2, 0x7d, 0xb2, 0xf7, 0xb3, 0x09, 0x28, 0xba, 0xf3, 0x63, 0xf7, 0xb4, - 0xc0, 0xfa, 0xd4, 0x9e, 0xb1, 0x00, 0xc4, 0x9c, 0x84, 0xae, 0x93, 0x26, 0x24, 0xf1, 0x41, 0xd1, - 0x3d, 0x7d, 0x76, 0xc9, 0x6d, 0x2c, 0x11, 0x05, 0x8a, 0xf9, 0xb0, 0x43, 0x78, 0xfe, 0x3f, 0x82, - 0xb4, 0x67, 0xe0, 0xd3, 0x1d, 0xde, 0xc9, 0x6d, 0xbc, 0x48, 0x31, 0x8f, 0xb0, 0x40, 0x49, 0x25, - 0x6e, 0x92, 0x0e, 0x7f, 0xd7, 0x50, 0xeb, 0x7d, 0x3e, 0xf7, 0x6b, 0x8f, 0x4a, 0xa9, 0x7f, 0x46, - 0x07, 0xe9, 0x24, 0x53, 0xaa, 0xa8, 0xa1, 0xf5, 0xb5, 0x41, 0xf3, 0xf8, 0x08, 0x17, 0x9b, 0xde, - 0x08, 0xe3, 0xd0, 0x75, 0xd2, 0x84, 0xc4, 0x29, 0x1a, 0xc7, 0x43, 0x7c, 0x39, 0xf9, 0x0a, 0xb6, - 0xba, 0x00, 0x45, 0x47, 0xfa, 0x62, 0xd9, 0xab, 0x24, 0xcb, 0x1e, 0x2a, 0x72, 0xd6, 0x46, 0x55, - 0x7f, 0x86, 0x9a, 0xa1, 0xe0, 0x31, 0x93, 0x8c, 0x07, 0x20, 0x8c, 0x6a, 0x5f, 0x1b, 0x34, 0x46, - 0x0f, 0xd6, 0x94, 0xe6, 0xb8, 0x28, 0x59, 0x65, 0x9c, 0xee, 0x20, 0x14, 0x52, 0x41, 0x7d, 0x50, - 0x20, 0xa4, 0x51, 0xeb, 0xd7, 0x06, 0xcd, 0xe3, 0x13, 0xbc, 0xf7, 0x08, 0x70, 0x79, 0x22, 0x3c, - 0xde, 0xb0, 0xce, 0x03, 0x25, 0xe6, 0x45, 0x77, 0x45, 0xc1, 0x2a, 0x49, 0xeb, 0x2e, 0x6a, 0x0b, - 0xb0, 0x3d, 0xca, 0xfc, 0x31, 0xf7, 0x98, 0x3d, 0x37, 0xee, 0x65, 0x1d, 0x9e, 0x27, 0xcb, 0x5e, - 0xdb, 0x2a, 0x17, 0xfe, 0x2c, 0x7b, 0x47, 0xa5, 0xf3, 0xb1, 0xb9, 0x48, 0x6f, 0x07, 0x8f, 0x41, - 0x48, 0x26, 0x15, 0x04, 0xea, 0x03, 0xf7, 0x22, 0x1f, 0xb6, 0x38, 0xd6, 0xb6, 0xb6, 0x7e, 0x8a, - 0x5a, 0x3e, 0x8f, 0x02, 0x75, 0x19, 0x2a, 0xc6, 0x03, 0x69, 0xd4, 0xfb, 0xb5, 0x41, 0x63, 0xd4, - 0x49, 0x96, 0xbd, 0xd6, 0x45, 0x29, 0x6f, 0x6d, 0xa1, 0xba, 0x2f, 0xd1, 0xfd, 0x1b, 0x53, 0xe9, - 0x1d, 0x54, 0x73, 0x61, 0x9e, 0x59, 0xd6, 0xb0, 0xd2, 0xa7, 0xfe, 0x10, 0xd5, 0x63, 0xea, 0x45, - 0x90, 0x6f, 0xd8, 0xca, 0x83, 0x17, 0xd5, 0x33, 0xed, 0xf0, 0x87, 0x86, 0x3a, 0xe5, 0x15, 0xbd, - 0x63, 0x52, 0xe9, 0x9f, 0x76, 0x8c, 0xc7, 0x77, 0x33, 0x3e, 0x65, 0x67, 0xb6, 0x77, 0xd6, 0x8b, - 0x3d, 0xf8, 0x97, 0x29, 0x99, 0xfe, 0x06, 0xd5, 0x99, 0x02, 0x5f, 0x1a, 0xd5, 0xcc, 0xb8, 0xc7, - 0x77, 0x30, 0x6e, 0xd4, 0x5e, 0xeb, 0xd5, 0xdf, 0xa6, 0x4c, 0x2b, 0x17, 0x18, 0x0d, 0x16, 0x2b, - 0xb3, 0x72, 0xb5, 0x32, 0x2b, 0xd7, 0x2b, 0xb3, 0xf2, 0x2d, 0x31, 0xb5, 0x45, 0x62, 0x6a, 0x57, - 0x89, 0xa9, 0x5d, 0x27, 0xa6, 0xf6, 0x33, 0x31, 0xb5, 0xef, 0xbf, 0xcc, 0xca, 0xc7, 0x6a, 0x3c, - 0xfc, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xbf, 0xb4, 0xf1, 0xb4, 0x62, 0x04, 0x00, 0x00, + // 593 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x6f, 0xd3, 0x3e, + 0x18, 0xc6, 0x9b, 0x76, 0xfd, 0x6b, 0x73, 0x37, 0xfd, 0xab, 0x30, 0xa4, 0xa8, 0x87, 0xb4, 0x1a, + 0x97, 0x0a, 0x09, 0x7b, 0xdd, 0x06, 0x9a, 0x90, 0x40, 0xa2, 0x68, 0x12, 0x48, 0x9b, 0x56, 0x05, + 0x89, 0x03, 0xe2, 0x80, 0x9b, 0xbd, 0x64, 0x26, 0x89, 0x1d, 0xd9, 0x4e, 0xa0, 0x37, 0x3e, 0x02, + 0x9f, 0x87, 0x13, 0xc7, 0x1d, 0x77, 0xdc, 0x29, 0x62, 0xe1, 0x5b, 0x70, 0x42, 0x49, 0xca, 0x92, + 0xad, 0x9d, 0xd8, 0xcd, 0x7e, 0xdf, 0xe7, 0xf7, 0xd8, 0x7e, 0xfd, 0xa0, 0xe7, 0xfe, 0xbe, 0xc2, + 0x4c, 0x10, 0x3f, 0x9e, 0x82, 0xe4, 0xa0, 0x41, 0x91, 0x04, 0xf8, 0x89, 0x90, 0x64, 0xde, 0xa0, + 0x11, 0x23, 0x4a, 0x0b, 0x49, 0x3d, 0x20, 0xc9, 0x88, 0x78, 0xc0, 0x41, 0x52, 0x0d, 0x27, 0x38, + 0x92, 0x42, 0x0b, 0xf3, 0x7e, 0x29, 0xc3, 0x34, 0x62, 0x78, 0x2e, 0xc3, 0xc9, 0xa8, 0xf7, 0xc8, + 0x63, 0xfa, 0x34, 0x9e, 0x62, 0x57, 0x84, 0xc4, 0x13, 0x9e, 0x20, 0x85, 0x7a, 0x1a, 0x7f, 0x2c, + 0x76, 0xc5, 0xa6, 0x58, 0x95, 0x2e, 0xbd, 0x87, 0x4b, 0x0f, 0x9b, 0x82, 0xa6, 0x0b, 0x27, 0xf6, + 0xf6, 0x2a, 0x6d, 0x48, 0xdd, 0x53, 0xc6, 0x41, 0xce, 0x48, 0xe4, 0x7b, 0x79, 0x41, 0x91, 0x10, + 0x34, 0x5d, 0x72, 0xcf, 0x1e, 0xb9, 0x8d, 0x92, 0x31, 0xd7, 0x2c, 0x84, 0x05, 0xe0, 0xc9, 0xbf, + 0x00, 0xe5, 0x9e, 0x42, 0x48, 0x17, 0xb8, 0xdd, 0xdb, 0xb8, 0x58, 0xb3, 0x80, 0x30, 0xae, 0x95, + 0x96, 0x37, 0xa1, 0xad, 0x1f, 0x2b, 0x68, 0xfd, 0x4d, 0xf9, 0xee, 0x97, 0x01, 0x55, 0xca, 0xfc, + 0x80, 0x56, 0xf3, 0x97, 0x9c, 0x50, 0x4d, 0x2d, 0x63, 0x60, 0x0c, 0x3b, 0x3b, 0xdb, 0xb8, 0x9a, + 0xf4, 0x95, 0x31, 0x8e, 0x7c, 0x2f, 0x2f, 0x28, 0x9c, 0xab, 0x71, 0x32, 0xc2, 0xc7, 0xd3, 0x4f, + 0xe0, 0xea, 0x23, 0xd0, 0x74, 0x6c, 0x9e, 0xa5, 0xfd, 0x46, 0x96, 0xf6, 0x51, 0x55, 0x73, 0xae, + 0x5c, 0xcd, 0xc7, 0xa8, 0x13, 0x49, 0x91, 0x30, 0xc5, 0x04, 0x07, 0x69, 0x35, 0x07, 0xc6, 0x70, + 0x6d, 0x7c, 0x6f, 0x8e, 0x74, 0x26, 0x55, 0xcb, 0xa9, 0xeb, 0x4c, 0x0f, 0xa1, 0x88, 0x4a, 0x1a, + 0x82, 0x06, 0xa9, 0xac, 0xd6, 0xa0, 0x35, 0xec, 0xec, 0xec, 0xe2, 0xa5, 0x21, 0xc0, 0xf5, 0x17, + 0xe1, 0xc9, 0x15, 0x75, 0xc0, 0xb5, 0x9c, 0x55, 0xb7, 0xab, 0x1a, 0x4e, 0xcd, 0xda, 0xf4, 0xd1, + 0x86, 0x04, 0x37, 0xa0, 0x2c, 0x9c, 0x88, 0x80, 0xb9, 0x33, 0x6b, 0xa5, 0xb8, 0xe1, 0x41, 0x96, + 0xf6, 0x37, 0x9c, 0x7a, 0xe3, 0x77, 0xda, 0xdf, 0xae, 0xc5, 0xc7, 0x15, 0x32, 0xcf, 0x0e, 0x9e, + 0x80, 0x54, 0x4c, 0x69, 0xe0, 0xfa, 0xad, 0x08, 0xe2, 0x10, 0xae, 0x31, 0xce, 0x75, 0x6f, 0x73, + 0x0f, 0xad, 0x87, 0x22, 0xe6, 0xfa, 0x38, 0xd2, 0x4c, 0x70, 0x65, 0xb5, 0x07, 0xad, 0xe1, 0xda, + 0xb8, 0x9b, 0xa5, 0xfd, 0xf5, 0xa3, 0x5a, 0xdd, 0xb9, 0xa6, 0x32, 0x0f, 0xd1, 0x26, 0x0d, 0x02, + 0xf1, 0xb9, 0x3c, 0xe0, 0xe0, 0x4b, 0x44, 0x79, 0x3e, 0x25, 0xeb, 0xbf, 0x81, 0x31, 0x5c, 0x1d, + 0x5b, 0x59, 0xda, 0xdf, 0x7c, 0xb1, 0xa4, 0xef, 0x2c, 0xa5, 0x7a, 0xcf, 0xd0, 0xff, 0x37, 0x66, + 0x64, 0x76, 0x51, 0xcb, 0x87, 0x59, 0x11, 0x80, 0x35, 0x27, 0x5f, 0x9a, 0x9b, 0xa8, 0x9d, 0xd0, + 0x20, 0x86, 0xf2, 0xbf, 0x9c, 0x72, 0xf3, 0xb4, 0xb9, 0x6f, 0x6c, 0x7d, 0x37, 0x50, 0xb7, 0x3e, + 0xf0, 0x43, 0xa6, 0xb4, 0xf9, 0x7e, 0x21, 0x46, 0xf8, 0x6e, 0x31, 0xca, 0xe9, 0x22, 0x44, 0xdd, + 0xf9, 0x37, 0xad, 0xfe, 0xad, 0xd4, 0x22, 0xf4, 0x0a, 0xb5, 0x99, 0x86, 0x50, 0x59, 0xcd, 0x22, + 0x06, 0x0f, 0xee, 0x10, 0x83, 0xf1, 0xc6, 0xdc, 0xaf, 0xfd, 0x3a, 0x27, 0x9d, 0xd2, 0x60, 0x3c, + 0x3c, 0xbb, 0xb4, 0x1b, 0xe7, 0x97, 0x76, 0xe3, 0xe2, 0xd2, 0x6e, 0x7c, 0xcd, 0x6c, 0xe3, 0x2c, + 0xb3, 0x8d, 0xf3, 0xcc, 0x36, 0x2e, 0x32, 0xdb, 0xf8, 0x99, 0xd9, 0xc6, 0xb7, 0x5f, 0x76, 0xe3, + 0x5d, 0x33, 0x19, 0xfd, 0x09, 0x00, 0x00, 0xff, 0xff, 0xbb, 0x57, 0xe7, 0x15, 0xb0, 0x04, 0x00, + 0x00, } diff --git a/staging/src/k8s.io/api/storage/v1/generated.proto b/staging/src/k8s.io/api/storage/v1/generated.proto index b7143c12f58..6a335e5268a 100644 --- a/staging/src/k8s.io/api/storage/v1/generated.proto +++ b/staging/src/k8s.io/api/storage/v1/generated.proto @@ -59,6 +59,10 @@ message StorageClass { // mount of the PVs will simply fail if one is invalid. // +optional repeated string mountOptions = 5; + + // AllowVolumeExpansion shows whether the storage class allow volume expand + // +optional + optional bool allowVolumeExpansion = 6; } // StorageClassList is a collection of storage classes. diff --git a/staging/src/k8s.io/api/storage/v1/types.go b/staging/src/k8s.io/api/storage/v1/types.go index e843c085a89..9afdafb62ac 100644 --- a/staging/src/k8s.io/api/storage/v1/types.go +++ b/staging/src/k8s.io/api/storage/v1/types.go @@ -55,6 +55,10 @@ type StorageClass struct { // mount of the PVs will simply fail if one is invalid. // +optional MountOptions []string `json:"mountOptions,omitempty" protobuf:"bytes,5,opt,name=mountOptions"` + + // AllowVolumeExpansion shows whether the storage class allow volume expand + // +optional + AllowVolumeExpansion *bool `json:"allowVolumeExpansion,omitempty" protobuf:"varint,6,opt,name=allowVolumeExpansion"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/staging/src/k8s.io/api/storage/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/storage/v1/types_swagger_doc_generated.go index 7afb7c2265c..b4be857dd1a 100644 --- a/staging/src/k8s.io/api/storage/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/storage/v1/types_swagger_doc_generated.go @@ -28,12 +28,13 @@ package v1 // AUTO-GENERATED FUNCTIONS START HERE var map_StorageClass = map[string]string{ - "": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", - "provisioner": "Provisioner indicates the type of the provisioner.", - "parameters": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", - "reclaimPolicy": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.", - "mountOptions": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", + "": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "provisioner": "Provisioner indicates the type of the provisioner.", + "parameters": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", + "reclaimPolicy": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.", + "mountOptions": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", + "allowVolumeExpansion": "AllowVolumeExpansion shows whether the storage class allow volume expand", } func (StorageClass) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/storage/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/storage/v1/zz_generated.deepcopy.go index 838d2536cd7..50c707abb9d 100644 --- a/staging/src/k8s.io/api/storage/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/storage/v1/zz_generated.deepcopy.go @@ -74,6 +74,15 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.AllowVolumeExpansion != nil { + in, out := &in.AllowVolumeExpansion, &out.AllowVolumeExpansion + if *in == nil { + *out = nil + } else { + *out = new(bool) + **out = **in + } + } return } diff --git a/staging/src/k8s.io/api/storage/v1beta1/generated.pb.go b/staging/src/k8s.io/api/storage/v1beta1/generated.pb.go index 1887e80f970..b31d6f12296 100644 --- a/staging/src/k8s.io/api/storage/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/storage/v1beta1/generated.pb.go @@ -136,6 +136,16 @@ func (m *StorageClass) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], s) } } + if m.AllowVolumeExpansion != nil { + dAtA[i] = 0x30 + i++ + if *m.AllowVolumeExpansion { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } return i, nil } @@ -229,6 +239,9 @@ func (m *StorageClass) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.AllowVolumeExpansion != nil { + n += 2 + } return n } @@ -279,6 +292,7 @@ func (this *StorageClass) String() string { `Parameters:` + mapStringForParameters + `,`, `ReclaimPolicy:` + valueToStringGenerated(this.ReclaimPolicy) + `,`, `MountOptions:` + fmt.Sprintf("%v", this.MountOptions) + `,`, + `AllowVolumeExpansion:` + valueToStringGenerated(this.AllowVolumeExpansion) + `,`, `}`, }, "") return s @@ -565,6 +579,27 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { } m.MountOptions = append(m.MountOptions, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowVolumeExpansion", 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 + } + } + b := bool(v != 0) + m.AllowVolumeExpansion = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -807,40 +842,42 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 554 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x3f, 0x8f, 0x12, 0x41, - 0x18, 0xc6, 0xd9, 0x43, 0xe2, 0xdd, 0x00, 0x91, 0xac, 0x16, 0x1b, 0x8a, 0x85, 0x50, 0xd1, 0xdc, - 0xcc, 0x71, 0x9e, 0x86, 0x98, 0xd8, 0x70, 0xb9, 0xc2, 0x44, 0x72, 0x64, 0x4d, 0x2c, 0x8c, 0x85, - 0xc3, 0xf2, 0xba, 0x8c, 0xfb, 0x67, 0x36, 0x33, 0xb3, 0x24, 0x74, 0x7e, 0x04, 0xbf, 0x91, 0x2d, - 0xe5, 0x95, 0x57, 0x11, 0x59, 0x3f, 0x84, 0x89, 0x95, 0xd9, 0x3f, 0xb2, 0x0b, 0x48, 0xbc, 0x6e, - 0xe6, 0x7d, 0x9f, 0xdf, 0x33, 0x33, 0xef, 0x33, 0xe8, 0xda, 0x1d, 0x4a, 0xcc, 0x38, 0x71, 0xa3, - 0x29, 0x88, 0x00, 0x14, 0x48, 0xb2, 0x80, 0x60, 0xc6, 0x05, 0xc9, 0x1b, 0x34, 0x64, 0x44, 0x2a, - 0x2e, 0xa8, 0x03, 0x64, 0x31, 0x98, 0x82, 0xa2, 0x03, 0xe2, 0x40, 0x00, 0x82, 0x2a, 0x98, 0xe1, - 0x50, 0x70, 0xc5, 0xf5, 0x76, 0xa6, 0xc5, 0x34, 0x64, 0x38, 0xd7, 0xe2, 0x5c, 0xdb, 0x3e, 0x77, - 0x98, 0x9a, 0x47, 0x53, 0x6c, 0x73, 0x9f, 0x38, 0xdc, 0xe1, 0x24, 0x45, 0xa6, 0xd1, 0xe7, 0x74, - 0x97, 0x6e, 0xd2, 0x55, 0x66, 0xd5, 0xee, 0x95, 0x8e, 0xb5, 0xb9, 0x48, 0xce, 0xdc, 0x3f, 0xae, - 0x7d, 0x55, 0x68, 0x7c, 0x6a, 0xcf, 0x59, 0x00, 0x62, 0x49, 0x42, 0xd7, 0x49, 0x0a, 0x92, 0xf8, - 0xa0, 0xe8, 0xbf, 0x28, 0x72, 0x8c, 0x12, 0x51, 0xa0, 0x98, 0x0f, 0x07, 0xc0, 0xcb, 0xff, 0x01, - 0xd2, 0x9e, 0x83, 0x4f, 0x0f, 0xb8, 0xe7, 0xc7, 0xb8, 0x48, 0x31, 0x8f, 0xb0, 0x40, 0x49, 0x25, - 0xf6, 0xa1, 0xde, 0xaf, 0x2a, 0x6a, 0xbc, 0xcb, 0x46, 0x77, 0xed, 0x51, 0x29, 0xf5, 0x4f, 0xe8, - 0x34, 0x79, 0xc9, 0x8c, 0x2a, 0x6a, 0x68, 0x5d, 0xad, 0x5f, 0xbf, 0xbc, 0xc0, 0xc5, 0x98, 0xb7, - 0xc6, 0x38, 0x74, 0x9d, 0xa4, 0x20, 0x71, 0xa2, 0xc6, 0x8b, 0x01, 0xbe, 0x9d, 0x7e, 0x01, 0x5b, - 0x8d, 0x41, 0xd1, 0x91, 0xbe, 0x5a, 0x77, 0x2a, 0xf1, 0xba, 0x83, 0x8a, 0x9a, 0xb5, 0x75, 0xd5, - 0x5f, 0xa0, 0x7a, 0x28, 0xf8, 0x82, 0x49, 0xc6, 0x03, 0x10, 0xc6, 0x49, 0x57, 0xeb, 0x9f, 0x8d, - 0x9e, 0xe6, 0x48, 0x7d, 0x52, 0xb4, 0xac, 0xb2, 0x4e, 0xf7, 0x10, 0x0a, 0xa9, 0xa0, 0x3e, 0x28, - 0x10, 0xd2, 0xa8, 0x76, 0xab, 0xfd, 0xfa, 0xe5, 0x10, 0x1f, 0xff, 0x01, 0xb8, 0xfc, 0x2c, 0x3c, - 0xd9, 0xa2, 0x37, 0x81, 0x12, 0xcb, 0xe2, 0x8a, 0x45, 0xc3, 0x2a, 0xf9, 0xeb, 0x2e, 0x6a, 0x0a, - 0xb0, 0x3d, 0xca, 0xfc, 0x09, 0xf7, 0x98, 0xbd, 0x34, 0x1e, 0xa5, 0xd7, 0xbc, 0x89, 0xd7, 0x9d, - 0xa6, 0x55, 0x6e, 0xfc, 0x5e, 0x77, 0x2e, 0x0e, 0xff, 0x0e, 0x9e, 0x80, 0x90, 0x4c, 0x2a, 0x08, - 0xd4, 0x7b, 0xee, 0x45, 0x3e, 0xec, 0x30, 0xd6, 0xae, 0xb7, 0x7e, 0x85, 0x1a, 0x3e, 0x8f, 0x02, - 0x75, 0x1b, 0x2a, 0xc6, 0x03, 0x69, 0xd4, 0xba, 0xd5, 0xfe, 0xd9, 0xa8, 0x15, 0xaf, 0x3b, 0x8d, - 0x71, 0xa9, 0x6e, 0xed, 0xa8, 0xda, 0xaf, 0xd1, 0x93, 0xbd, 0x57, 0xe9, 0x2d, 0x54, 0x75, 0x61, - 0x99, 0xe6, 0x76, 0x66, 0x25, 0x4b, 0xfd, 0x19, 0xaa, 0x2d, 0xa8, 0x17, 0x41, 0x36, 0x66, 0x2b, - 0xdb, 0xbc, 0x3a, 0x19, 0x6a, 0xbd, 0xef, 0x1a, 0x6a, 0x95, 0x47, 0xf4, 0x96, 0x49, 0xa5, 0x7f, - 0x3c, 0x48, 0x1f, 0x3f, 0x2c, 0xfd, 0x84, 0x4e, 0xb3, 0x6f, 0xe5, 0x83, 0x3d, 0xfd, 0x5b, 0x29, - 0x25, 0x3f, 0x46, 0x35, 0xa6, 0xc0, 0x97, 0xc6, 0x49, 0x9a, 0x5e, 0xff, 0xa1, 0xe9, 0x8d, 0x9a, - 0xb9, 0x69, 0xed, 0x4d, 0x82, 0x5b, 0x99, 0xcb, 0xe8, 0x7c, 0xb5, 0x31, 0x2b, 0x77, 0x1b, 0xb3, - 0x72, 0xbf, 0x31, 0x2b, 0x5f, 0x63, 0x53, 0x5b, 0xc5, 0xa6, 0x76, 0x17, 0x9b, 0xda, 0x7d, 0x6c, - 0x6a, 0x3f, 0x62, 0x53, 0xfb, 0xf6, 0xd3, 0xac, 0x7c, 0x78, 0x9c, 0x3b, 0xfe, 0x09, 0x00, 0x00, - 0xff, 0xff, 0x2a, 0xfd, 0x7a, 0x0a, 0x73, 0x04, 0x00, 0x00, + // 589 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x4f, 0x4f, 0xd4, 0x40, + 0x18, 0xc6, 0xb7, 0x2c, 0xab, 0x30, 0x0b, 0x71, 0x53, 0x39, 0x34, 0x7b, 0xe8, 0x6e, 0x38, 0xf5, + 0xc2, 0x0c, 0x20, 0x1a, 0x62, 0xe2, 0xc1, 0x12, 0x0e, 0x26, 0x10, 0x36, 0x35, 0xf1, 0x60, 0x3c, + 0x38, 0x5b, 0x5e, 0xcb, 0xd8, 0x76, 0xa6, 0x99, 0x99, 0xae, 0xee, 0xcd, 0x8f, 0xe0, 0x37, 0xf2, + 0x64, 0xc2, 0x91, 0x23, 0xa7, 0x46, 0xea, 0xb7, 0xf0, 0x64, 0xfa, 0x47, 0x5a, 0x58, 0x88, 0xdc, + 0x3a, 0xef, 0xfb, 0xfc, 0x9e, 0xb7, 0xf3, 0xce, 0x83, 0x0e, 0xc2, 0x7d, 0x85, 0x99, 0x20, 0x61, + 0x3a, 0x05, 0xc9, 0x41, 0x83, 0x22, 0x33, 0xe0, 0xa7, 0x42, 0x92, 0xba, 0x41, 0x13, 0x46, 0x94, + 0x16, 0x92, 0x06, 0x40, 0x66, 0x3b, 0x53, 0xd0, 0x74, 0x87, 0x04, 0xc0, 0x41, 0x52, 0x0d, 0xa7, + 0x38, 0x91, 0x42, 0x0b, 0x73, 0x58, 0x69, 0x31, 0x4d, 0x18, 0xae, 0xb5, 0xb8, 0xd6, 0x0e, 0xb7, + 0x02, 0xa6, 0xcf, 0xd2, 0x29, 0xf6, 0x45, 0x4c, 0x02, 0x11, 0x08, 0x52, 0x22, 0xd3, 0xf4, 0x53, + 0x79, 0x2a, 0x0f, 0xe5, 0x57, 0x65, 0x35, 0xdc, 0x6c, 0x8d, 0xf5, 0x85, 0x2c, 0x66, 0xde, 0x1e, + 0x37, 0xdc, 0x6b, 0x34, 0x31, 0xf5, 0xcf, 0x18, 0x07, 0x39, 0x27, 0x49, 0x18, 0x14, 0x05, 0x45, + 0x62, 0xd0, 0xf4, 0x2e, 0x8a, 0xdc, 0x47, 0xc9, 0x94, 0x6b, 0x16, 0xc3, 0x02, 0xf0, 0xe2, 0x7f, + 0x80, 0xf2, 0xcf, 0x20, 0xa6, 0x0b, 0xdc, 0xb3, 0xfb, 0xb8, 0x54, 0xb3, 0x88, 0x30, 0xae, 0x95, + 0x96, 0xb7, 0xa1, 0xcd, 0x9f, 0xcb, 0x68, 0xed, 0x6d, 0xb5, 0xba, 0x83, 0x88, 0x2a, 0x65, 0x7e, + 0x44, 0x2b, 0xc5, 0x4d, 0x4e, 0xa9, 0xa6, 0x96, 0x31, 0x36, 0x9c, 0xfe, 0xee, 0x36, 0x6e, 0xd6, + 0x7c, 0x6d, 0x8c, 0x93, 0x30, 0x28, 0x0a, 0x0a, 0x17, 0x6a, 0x3c, 0xdb, 0xc1, 0x27, 0xd3, 0xcf, + 0xe0, 0xeb, 0x63, 0xd0, 0xd4, 0x35, 0xcf, 0xb3, 0x51, 0x27, 0xcf, 0x46, 0xa8, 0xa9, 0x79, 0xd7, + 0xae, 0xe6, 0x73, 0xd4, 0x4f, 0xa4, 0x98, 0x31, 0xc5, 0x04, 0x07, 0x69, 0x2d, 0x8d, 0x0d, 0x67, + 0xd5, 0x7d, 0x5a, 0x23, 0xfd, 0x49, 0xd3, 0xf2, 0xda, 0x3a, 0x33, 0x42, 0x28, 0xa1, 0x92, 0xc6, + 0xa0, 0x41, 0x2a, 0xab, 0x3b, 0xee, 0x3a, 0xfd, 0xdd, 0x7d, 0x7c, 0x7f, 0x02, 0x70, 0xfb, 0x5a, + 0x78, 0x72, 0x8d, 0x1e, 0x72, 0x2d, 0xe7, 0xcd, 0x2f, 0x36, 0x0d, 0xaf, 0xe5, 0x6f, 0x86, 0x68, + 0x5d, 0x82, 0x1f, 0x51, 0x16, 0x4f, 0x44, 0xc4, 0xfc, 0xb9, 0xb5, 0x5c, 0xfe, 0xe6, 0x61, 0x9e, + 0x8d, 0xd6, 0xbd, 0x76, 0xe3, 0x4f, 0x36, 0xda, 0x5e, 0xcc, 0x0e, 0x9e, 0x80, 0x54, 0x4c, 0x69, + 0xe0, 0xfa, 0x9d, 0x88, 0xd2, 0x18, 0x6e, 0x30, 0xde, 0x4d, 0x6f, 0x73, 0x0f, 0xad, 0xc5, 0x22, + 0xe5, 0xfa, 0x24, 0xd1, 0x4c, 0x70, 0x65, 0xf5, 0xc6, 0x5d, 0x67, 0xd5, 0x1d, 0xe4, 0xd9, 0x68, + 0xed, 0xb8, 0x55, 0xf7, 0x6e, 0xa8, 0xcc, 0x23, 0xb4, 0x41, 0xa3, 0x48, 0x7c, 0xa9, 0x06, 0x1c, + 0x7e, 0x4d, 0x28, 0x2f, 0x56, 0x65, 0x3d, 0x1a, 0x1b, 0xce, 0x8a, 0x6b, 0xe5, 0xd9, 0x68, 0xe3, + 0xf5, 0x1d, 0x7d, 0xef, 0x4e, 0x6a, 0xf8, 0x0a, 0x3d, 0xb9, 0xb5, 0x23, 0x73, 0x80, 0xba, 0x21, + 0xcc, 0xcb, 0x14, 0xac, 0x7a, 0xc5, 0xa7, 0xb9, 0x81, 0x7a, 0x33, 0x1a, 0xa5, 0x50, 0x3d, 0x9a, + 0x57, 0x1d, 0x5e, 0x2e, 0xed, 0x1b, 0x9b, 0x3f, 0x0c, 0x34, 0x68, 0x2f, 0xfc, 0x88, 0x29, 0x6d, + 0x7e, 0x58, 0xc8, 0x12, 0x7e, 0x58, 0x96, 0x0a, 0xba, 0x4c, 0xd2, 0xa0, 0x7e, 0xa6, 0x95, 0x7f, + 0x95, 0x56, 0x8e, 0x8e, 0x51, 0x8f, 0x69, 0x88, 0x95, 0xb5, 0x54, 0x66, 0xc1, 0x79, 0x68, 0x16, + 0xdc, 0xf5, 0xda, 0xb4, 0xf7, 0xa6, 0xc0, 0xbd, 0xca, 0xc5, 0xdd, 0x3a, 0xbf, 0xb2, 0x3b, 0x17, + 0x57, 0x76, 0xe7, 0xf2, 0xca, 0xee, 0x7c, 0xcb, 0x6d, 0xe3, 0x3c, 0xb7, 0x8d, 0x8b, 0xdc, 0x36, + 0x2e, 0x73, 0xdb, 0xf8, 0x95, 0xdb, 0xc6, 0xf7, 0xdf, 0x76, 0xe7, 0xfd, 0xe3, 0xda, 0xf1, 0x6f, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xae, 0x44, 0x72, 0xc1, 0x04, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/storage/v1beta1/generated.proto b/staging/src/k8s.io/api/storage/v1beta1/generated.proto index 4332d3fbcd5..f8070b67cf4 100644 --- a/staging/src/k8s.io/api/storage/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/storage/v1beta1/generated.proto @@ -59,6 +59,10 @@ message StorageClass { // mount of the PVs will simply fail if one is invalid. // +optional repeated string mountOptions = 5; + + // AllowVolumeExpansion shows whether the storage class allow volume expand + // +optional + optional bool allowVolumeExpansion = 6; } // StorageClassList is a collection of storage classes. diff --git a/staging/src/k8s.io/api/storage/v1beta1/types.go b/staging/src/k8s.io/api/storage/v1beta1/types.go index d5e2fe585e2..e5036b55b33 100644 --- a/staging/src/k8s.io/api/storage/v1beta1/types.go +++ b/staging/src/k8s.io/api/storage/v1beta1/types.go @@ -55,6 +55,10 @@ type StorageClass struct { // mount of the PVs will simply fail if one is invalid. // +optional MountOptions []string `json:"mountOptions,omitempty" protobuf:"bytes,5,opt,name=mountOptions"` + + // AllowVolumeExpansion shows whether the storage class allow volume expand + // +optional + AllowVolumeExpansion *bool `json:"allowVolumeExpansion,omitempty" protobuf:"varint,6,opt,name=allowVolumeExpansion"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/staging/src/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go index ca5c041a03b..e2148c231f4 100644 --- a/staging/src/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go @@ -28,12 +28,13 @@ package v1beta1 // AUTO-GENERATED FUNCTIONS START HERE var map_StorageClass = map[string]string{ - "": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", - "provisioner": "Provisioner indicates the type of the provisioner.", - "parameters": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", - "reclaimPolicy": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.", - "mountOptions": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", + "": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "provisioner": "Provisioner indicates the type of the provisioner.", + "parameters": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", + "reclaimPolicy": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.", + "mountOptions": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", + "allowVolumeExpansion": "AllowVolumeExpansion shows whether the storage class allow volume expand", } func (StorageClass) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go index cca5a200b02..bf1f91a67d7 100644 --- a/staging/src/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go @@ -74,6 +74,15 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.AllowVolumeExpansion != nil { + in, out := &in.AllowVolumeExpansion, &out.AllowVolumeExpansion + if *in == nil { + *out = nil + } else { + *out = new(bool) + **out = **in + } + } return }