From 1d6ee52203f2babe5cc949da1f946df470a48f4a Mon Sep 17 00:00:00 2001 From: Vladimir Vivien Date: Tue, 24 Oct 2017 22:44:48 -0400 Subject: [PATCH 1/2] CSI - API source code implementation This commit tracks source code update for the CSI volume plugin implementation. --- cmd/kube-controller-manager/app/plugins.go | 3 + cmd/kubelet/app/plugins.go | 2 + hack/.golint_failures | 1 + pkg/apis/core/types.go | 34 + pkg/apis/core/validation/validation.go | 22 + pkg/apis/core/validation/validation_test.go | 46 + pkg/apis/extensions/types.go | 1 + pkg/printers/internalversion/describe.go | 10 + pkg/security/podsecuritypolicy/util/util.go | 1 + pkg/volume/csi/csi_attacher.go | 147 ++ pkg/volume/csi/csi_attacher_test.go | 168 ++ pkg/volume/csi/csi_client.go | 182 ++ pkg/volume/csi/csi_client_test.go | 116 + pkg/volume/csi/csi_mounter.go | 142 ++ pkg/volume/csi/csi_mounter_test.go | 128 + pkg/volume/csi/csi_plugin.go | 193 ++ pkg/volume/csi/csi_plugin_test.go | 218 ++ pkg/volume/csi/fake/fake_client.go | 125 + pkg/volume/csi/proto/csi.proto | 630 +++++ pkg/volume/csi/proto/csi/csi.pb.go | 2548 +++++++++++++++++++ staging/src/k8s.io/api/core/v1/types.go | 33 + 21 files changed, 4750 insertions(+) create mode 100644 pkg/volume/csi/csi_attacher.go create mode 100644 pkg/volume/csi/csi_attacher_test.go create mode 100644 pkg/volume/csi/csi_client.go create mode 100644 pkg/volume/csi/csi_client_test.go create mode 100644 pkg/volume/csi/csi_mounter.go create mode 100644 pkg/volume/csi/csi_mounter_test.go create mode 100644 pkg/volume/csi/csi_plugin.go create mode 100644 pkg/volume/csi/csi_plugin_test.go create mode 100644 pkg/volume/csi/fake/fake_client.go create mode 100644 pkg/volume/csi/proto/csi.proto create mode 100644 pkg/volume/csi/proto/csi/csi.pb.go diff --git a/cmd/kube-controller-manager/app/plugins.go b/cmd/kube-controller-manager/app/plugins.go index 716539b9fe07c..2e5d67f19bdc2 100644 --- a/cmd/kube-controller-manager/app/plugins.go +++ b/cmd/kube-controller-manager/app/plugins.go @@ -41,6 +41,7 @@ import ( "k8s.io/kubernetes/pkg/volume/azure_dd" "k8s.io/kubernetes/pkg/volume/azure_file" "k8s.io/kubernetes/pkg/volume/cinder" + "k8s.io/kubernetes/pkg/volume/csi" "k8s.io/kubernetes/pkg/volume/fc" "k8s.io/kubernetes/pkg/volume/flexvolume" "k8s.io/kubernetes/pkg/volume/flocker" @@ -79,6 +80,7 @@ func ProbeAttachableVolumePlugins() []volume.VolumePlugin { allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...) allPlugins = append(allPlugins, iscsi.ProbeVolumePlugins()...) allPlugins = append(allPlugins, rbd.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, csi.ProbeVolumePlugins()...) return allPlugins } @@ -105,6 +107,7 @@ func ProbeExpandableVolumePlugins(config componentconfig.VolumeConfiguration) [] allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...) allPlugins = append(allPlugins, storageos.ProbeVolumePlugins()...) allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, csi.ProbeVolumePlugins()...) return allPlugins } diff --git a/cmd/kubelet/app/plugins.go b/cmd/kubelet/app/plugins.go index e14513a18b2ef..7aef104e48b6e 100644 --- a/cmd/kubelet/app/plugins.go +++ b/cmd/kubelet/app/plugins.go @@ -35,6 +35,7 @@ import ( "k8s.io/kubernetes/pkg/volume/cephfs" "k8s.io/kubernetes/pkg/volume/cinder" "k8s.io/kubernetes/pkg/volume/configmap" + "k8s.io/kubernetes/pkg/volume/csi" "k8s.io/kubernetes/pkg/volume/downwardapi" "k8s.io/kubernetes/pkg/volume/empty_dir" "k8s.io/kubernetes/pkg/volume/fc" @@ -96,6 +97,7 @@ func ProbeVolumePlugins() []volume.VolumePlugin { allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...) allPlugins = append(allPlugins, local.ProbeVolumePlugins()...) allPlugins = append(allPlugins, storageos.ProbeVolumePlugins()...) + allPlugins = append(allPlugins, csi.ProbeVolumePlugins()...) return allPlugins } diff --git a/hack/.golint_failures b/hack/.golint_failures index b5895160c3605..0136486e58abb 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -376,6 +376,7 @@ pkg/volume/azure_file pkg/volume/cephfs pkg/volume/cinder pkg/volume/configmap +pkg/volume/csi/proto/csi/ pkg/volume/empty_dir pkg/volume/fc pkg/volume/flexvolume diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index f861925cc7432..2876e9ea9ffe7 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -391,6 +391,9 @@ type PersistentVolumeSource struct { // More info: https://releases.k8s.io/HEAD/examples/volumes/storageos/README.md // +optional StorageOS *StorageOSPersistentVolumeSource + // CSI (Container Storage Interface) represents storage that handled by an external CSI driver + // +optional + CSI *CSIPersistentVolumeSource } type PersistentVolumeClaimVolumeSource struct { @@ -1503,6 +1506,37 @@ type LocalVolumeSource struct { Path string } +// Represents storage that is managed by an external CSI volume driver +type CSIPersistentVolumeSource struct { + // Driver is the name of the driver to use for this volume. + // Required. + Driver string + + // VolumeHandle is the unique volume name returned by the CSI volume + // plugin’s CreateVolume to refer to the volume on all subsequent calls. + // Required. + VolumeHandle string + + // Optional: MountSecretRef is a reference to the secret object containing + // sensitive information to pass to the CSI driver during NodePublish. + // This may be empty if no secret is required. If the secret object contains + // more than one secret, all secrets are passed. + // +optional + MountSecretRef *SecretReference + + // Optional: AttachSecretRef is a reference to the secret object containing + // sensitive information to pass to the CSI driver during ControllerPublish. + // This may be empty if no secret is required. If the secret object contains + // more than one secret, all secrets are passed. + // +optional + AttachSecretRef *SecretReference + + // Optional: The value to pass to ControllerPublishVolumeRequest. + // Defaults to false (read/write). + // +optional + ReadOnly bool +} + // ContainerPort represents a network port in a single container type ContainerPort struct { // Optional: If specified, this must be an IANA_SVC_NAME Each named port diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index 8fe283ddfeb21..e7ccebc06315c 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -1318,6 +1318,19 @@ func validateStorageOSPersistentVolumeSource(storageos *core.StorageOSPersistent return allErrs } +func validateCSIPersistentVolumeSource(csi *api.CSIPersistentVolumeSource, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if len(csi.Driver) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("driver"), "")) + } + + if len(csi.VolumeHandle) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("volumeHandle"), "")) + } + + return allErrs +} + // ValidatePersistentVolumeName checks that a name is appropriate for a // PersistentVolumeName object. var ValidatePersistentVolumeName = NameIsDNSSubdomain @@ -1541,6 +1554,15 @@ func ValidatePersistentVolume(pv *core.PersistentVolume) field.ErrorList { } } + if pv.Spec.CSI != nil { + if numVolumes > 0 { + allErrs = append(allErrs, field.Forbidden(specPath.Child("csi"), "may not specify more than 1 volume type")) + } else { + numVolumes++ + allErrs = append(allErrs, validateCSIPersistentVolumeSource(pv.Spec.CSI, specPath.Child("csi"))...) + } + } + if numVolumes == 0 { allErrs = append(allErrs, field.Required(specPath, "must specify a volume type")) } diff --git a/pkg/apis/core/validation/validation_test.go b/pkg/apis/core/validation/validation_test.go index 3a6121715ced6..2c00479ce744d 100644 --- a/pkg/apis/core/validation/validation_test.go +++ b/pkg/apis/core/validation/validation_test.go @@ -1353,6 +1353,52 @@ func TestValidateGlusterfs(t *testing.T) { } } +func TestValidateCSIVolumeSource(t *testing.T) { + testCases := []struct { + name string + csi *api.CSIPersistentVolumeSource + errtype field.ErrorType + errfield string + }{ + { + name: "all required fields ok", + csi: &api.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true}, + }, + { + name: "with default values ok", + csi: &api.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123"}, + }, + { + name: "missing driver name", + csi: &api.CSIPersistentVolumeSource{VolumeHandle: "test-123"}, + errtype: field.ErrorTypeRequired, + errfield: "driver", + }, + { + name: "missing volume handle", + csi: &api.CSIPersistentVolumeSource{Driver: "my-driver"}, + errtype: field.ErrorTypeRequired, + errfield: "volumeHandle", + }, + } + + for i, tc := range testCases { + errs := validateCSIPersistentVolumeSource(tc.csi, field.NewPath("field")) + + if len(errs) > 0 && tc.errtype == "" { + t.Errorf("[%d: %q] unexpected error(s): %v", i, tc.name, errs) + } else if len(errs) == 0 && tc.errtype != "" { + t.Errorf("[%d: %q] expected error type %v", i, tc.name, tc.errtype) + } else if len(errs) >= 1 { + if errs[0].Type != tc.errtype { + t.Errorf("[%d: %q] expected error type %v, got %v", i, tc.name, tc.errtype, errs[0].Type) + } else if !strings.HasSuffix(errs[0].Field, "."+tc.errfield) { + t.Errorf("[%d: %q] expected error on field %q, got %q", i, tc.name, tc.errfield, errs[0].Field) + } + } + } +} + // helper func newInt32(val int) *int32 { p := new(int32) diff --git a/pkg/apis/extensions/types.go b/pkg/apis/extensions/types.go index 01c6de7dcd1e9..79694aae5c8dd 100644 --- a/pkg/apis/extensions/types.go +++ b/pkg/apis/extensions/types.go @@ -919,6 +919,7 @@ var ( Projected FSType = "projected" PortworxVolume FSType = "portworxVolume" ScaleIO FSType = "scaleIO" + CSI FSType = "csi" All FSType = "*" ) diff --git a/pkg/printers/internalversion/describe.go b/pkg/printers/internalversion/describe.go index 4392e8e7dbb94..4d660de81ec88 100644 --- a/pkg/printers/internalversion/describe.go +++ b/pkg/printers/internalversion/describe.go @@ -1073,6 +1073,14 @@ func printFlockerVolumeSource(flocker *api.FlockerVolumeSource, w PrefixWriter) flocker.DatasetName, flocker.DatasetUUID) } +func printCSIPersistentVolumeSource(csi *api.CSIPersistentVolumeSource, w PrefixWriter) { + w.Write(LEVEL_2, "Type:\tCSI (a Container Storage Interface (CSI) volume source)\n"+ + " Driver:\t%v\n"+ + " VolumeHandle:\t%v\n", + " ReadOnly:\t%v\n", + csi.Driver, csi.VolumeHandle, csi.ReadOnly) +} + type PersistentVolumeDescriber struct { clientset.Interface } @@ -1156,6 +1164,8 @@ func describePersistentVolume(pv *api.PersistentVolume, events *api.EventList) ( printFlexVolumeSource(pv.Spec.FlexVolume, w) case pv.Spec.Flocker != nil: printFlockerVolumeSource(pv.Spec.Flocker, w) + case pv.Spec.CSI != nil: + printCSIPersistentVolumeSource(pv.Spec.CSI, w) default: w.Write(LEVEL_1, "\n") } diff --git a/pkg/security/podsecuritypolicy/util/util.go b/pkg/security/podsecuritypolicy/util/util.go index 1e5b673dc3a29..d654f88c77fa3 100644 --- a/pkg/security/podsecuritypolicy/util/util.go +++ b/pkg/security/podsecuritypolicy/util/util.go @@ -67,6 +67,7 @@ func GetAllFSTypesAsSet() sets.String { string(extensions.Projected), string(extensions.PortworxVolume), string(extensions.ScaleIO), + string(extensions.CSI), ) return fstypes } diff --git a/pkg/volume/csi/csi_attacher.go b/pkg/volume/csi/csi_attacher.go new file mode 100644 index 0000000000000..463842de91f00 --- /dev/null +++ b/pkg/volume/csi/csi_attacher.go @@ -0,0 +1,147 @@ +/* +Copyright 2014 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 csi + +import ( + "crypto/sha256" + "errors" + "fmt" + "time" + + "github.com/golang/glog" + + "k8s.io/api/core/v1" + storage "k8s.io/api/storage/v1alpha1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/pkg/volume" +) + +type csiAttacher struct { + plugin *csiPlugin + k8s kubernetes.Interface + waitSleepTime time.Duration +} + +// volume.Attacher methods +var _ volume.Attacher = &csiAttacher{} + +func (c *csiAttacher) Attach(spec *volume.Spec, nodeName types.NodeName) (string, error) { + if spec == nil { + return "", errors.New("missing spec") + } + + if spec.PersistentVolume == nil { + return "", errors.New("missing persistent volume") + } + + // namespace := spec.PersistentVolume.GetObjectMeta().GetNamespace() + pvName := spec.PersistentVolume.GetName() + attachID := fmt.Sprintf("pv-%s", hashAttachmentName(pvName, string(nodeName))) + + attachment := &storage.VolumeAttachment{ + ObjectMeta: meta.ObjectMeta{ + Name: attachID, + // Namespace: namespace, TODO should VolumeAttachment namespaced ? + }, + Spec: storage.VolumeAttachmentSpec{ + NodeName: string(nodeName), + Attacher: csiPluginName, + Source: storage.VolumeAttachmentSource{ + PersistentVolumeName: &pvName, + }, + }, + } + attach, err := c.k8s.StorageV1alpha1().VolumeAttachments().Create(attachment) + if err != nil { + glog.Error(log("attacher.Attach failed: %v", err)) + return "", err + } + glog.V(4).Info(log("volume attachment sent: [%v]", attach.GetName())) + + return attach.GetName(), nil +} + +func (c *csiAttacher) WaitForAttach(spec *volume.Spec, attachID string, pod *v1.Pod, timeout time.Duration) (string, error) { + glog.V(4).Info(log("waiting for attachment update from CSI driver [attachment.ID=%v]", attachID)) + + source, err := getCSISourceFromSpec(spec) + if err != nil { + glog.Error(log("attach.WaitForAttach failed to get volume source: %v", err)) + return "", err + } + + ticker := time.NewTicker(c.waitSleepTime) + defer ticker.Stop() + + timer := time.NewTimer(timeout) + defer timer.Stop() + + for { + select { + case <-ticker.C: + glog.V(4).Info(log("probing VolumeAttachment [id=%v]", attachID)) + attach, err := c.k8s.StorageV1alpha1().VolumeAttachments().Get(attachID, meta.GetOptions{}) + if err != nil { + // log error, but continue to check again + glog.Error(log("attacher.WaitForAttach failed (will continue to try): %v", err)) + } + // attachment OK + if attach.Status.Attached { + return attachID, nil + } + // driver reports attach error + attachErr := attach.Status.AttachError + if attachErr != nil { + glog.Error(log("attachment for %v failed: %v", source.VolumeHandle, attachErr.Message)) + return "", errors.New(attachErr.Message) + } + case <-timer.C: + glog.Error(log("attacher.WaitForAttach timeout after %v [volume=%v; attachment.ID=%v]", timeout, source.VolumeHandle, attachID)) + return "", fmt.Errorf("attachment timeout for volume %v", source.VolumeHandle) + } + + } +} + +func (c *csiAttacher) VolumesAreAttached(specs []*volume.Spec, nodeName types.NodeName) (map[*volume.Spec]bool, error) { + return nil, errors.New("unimplemented") +} + +func (c *csiAttacher) GetDeviceMountPath(spec *volume.Spec) (string, error) { + return "", errors.New("unimplemented") +} + +func (c *csiAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { + return errors.New("unimplemented") +} + +var _ volume.Detacher = &csiAttacher{} + +func (c *csiAttacher) Detach(deviceName string, nodeName types.NodeName) error { + return errors.New("unimplemented") +} + +func (c *csiAttacher) UnmountDevice(deviceMountPath string) error { + return errors.New("unimplemented") +} + +func hashAttachmentName(pvName, nodeName string) string { + result := sha256.Sum256([]byte(fmt.Sprintf("%s%s", pvName, nodeName))) + return fmt.Sprintf("%x", result) +} diff --git a/pkg/volume/csi/csi_attacher_test.go b/pkg/volume/csi/csi_attacher_test.go new file mode 100644 index 0000000000000..20b2f77475f7e --- /dev/null +++ b/pkg/volume/csi/csi_attacher_test.go @@ -0,0 +1,168 @@ +/* +Copyright 2014 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 csi + +import ( + "crypto/sha256" + "fmt" + "os" + "testing" + "time" + + "k8s.io/api/core/v1" + storage "k8s.io/api/storage/v1alpha1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/volume" +) + +func makeTestAttachment(attachID, nodeName, pvName string) *storage.VolumeAttachment { + return &storage.VolumeAttachment{ + ObjectMeta: meta.ObjectMeta{ + Name: attachID, + }, + Spec: storage.VolumeAttachmentSpec{ + NodeName: nodeName, + Attacher: csiPluginName, + Source: storage.VolumeAttachmentSource{ + PersistentVolumeName: &pvName, + }, + }, + Status: storage.VolumeAttachmentStatus{ + Attached: false, + AttachError: nil, + DetachError: nil, + }, + } +} + +func TestAttacherAttach(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + attacher, err := plug.NewAttacher() + if err != nil { + t.Fatalf("failed to create new attacher: %v", err) + } + + csiAttacher := attacher.(*csiAttacher) + + testCases := []struct { + name string + pv *v1.PersistentVolume + nodeName string + attachHash [32]byte + shouldFail bool + }{ + { + name: "test ok 1", + pv: makeTestPV("test-pv-001", 10, testDriver, testVol), + nodeName: "test-node", + attachHash: sha256.Sum256([]byte(fmt.Sprintf("%s%s", "test-pv-001", "test-node"))), + }, + { + name: "test ok 2", + pv: makeTestPV("test-pv-002", 10, testDriver, testVol), + nodeName: "test-node", + attachHash: sha256.Sum256([]byte(fmt.Sprintf("%s%s", "test-pv-002", "test-node"))), + }, + { + name: "missing spec", + pv: nil, + nodeName: "test-node", + attachHash: sha256.Sum256([]byte(fmt.Sprintf("%s%s", "test-pv-002", "test-node"))), + shouldFail: true, + }, + } + + for _, tc := range testCases { + var spec *volume.Spec = nil + if tc.pv != nil { + spec = volume.NewSpecFromPersistentVolume(tc.pv, tc.pv.Spec.PersistentVolumeSource.CSI.ReadOnly) + } + + attachID, err := csiAttacher.Attach(spec, types.NodeName(tc.nodeName)) + if tc.shouldFail && err == nil { + t.Error("expected failure, but got nil err") + } + if attachID != "" { + expectedID := fmt.Sprintf("pv-%x", tc.attachHash) + if attachID != expectedID { + t.Errorf("expecting attachID %v, got %v", expectedID, attachID) + } + } + } +} + +func TestAttacherWaitForAttach(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + attacher, err := plug.NewAttacher() + if err != nil { + t.Fatalf("failed to create new attacher: %v", err) + } + csiAttacher := attacher.(*csiAttacher) + nodeName := "test-node" + pod := &v1.Pod{ObjectMeta: meta.ObjectMeta{UID: testPodUID, Namespace: testns}} + + testCases := []struct { + name string + attached bool + attachErr *storage.VolumeError + sleepTime time.Duration + timeout time.Duration + shouldFail bool + }{ + {name: "attach ok", attached: true, sleepTime: 10 * time.Millisecond, timeout: 100 * time.Millisecond}, + {name: "attachment error", attachErr: &storage.VolumeError{Message: "missing volume"}, sleepTime: 10 * time.Millisecond, timeout: 100 * time.Millisecond}, + {name: "time ran out", attached: false, sleepTime: 1 * time.Millisecond, timeout: 10 * time.Millisecond}, + } + + for i, tc := range testCases { + t.Logf("running test: %v", tc.name) + pvName := fmt.Sprintf("test-pv-%d", i) + attachID := fmt.Sprintf("pv-%s", hashAttachmentName(pvName, nodeName)) + pv := makeTestPV(pvName, 10, testDriver, testVol) + spec := volume.NewSpecFromPersistentVolume(pv, pv.Spec.PersistentVolumeSource.CSI.ReadOnly) + + attachment := makeTestAttachment(attachID, nodeName, pvName) + attachment.Status.Attached = tc.attached + attachment.Status.AttachError = tc.attachErr + csiAttacher.waitSleepTime = tc.sleepTime + + go func() { + _, err := csiAttacher.k8s.StorageV1alpha1().VolumeAttachments().Create(attachment) + if err != nil { + t.Fatalf("failed to attach: %v", err) + } + }() + + retID, err := csiAttacher.WaitForAttach(spec, attachID, pod, tc.timeout) + if tc.shouldFail && err == nil { + t.Error("expecting failure, but err is nil") + } + if tc.attachErr != nil { + if tc.attachErr.Message != err.Error() { + t.Errorf("expecting error [%v], got [%v]", tc.attachErr.Message, err.Error()) + } + } + if err == nil && retID != attachID { + t.Errorf("attacher.WaitForAttach not returning attachment ID") + } + } +} diff --git a/pkg/volume/csi/csi_client.go b/pkg/volume/csi/csi_client.go new file mode 100644 index 0000000000000..f647cc04f70fb --- /dev/null +++ b/pkg/volume/csi/csi_client.go @@ -0,0 +1,182 @@ +/* +Copyright 2014 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 csi + +import ( + "errors" + "fmt" + "net" + "time" + + "github.com/golang/glog" + grpctx "golang.org/x/net/context" + "google.golang.org/grpc" + api "k8s.io/api/core/v1" + csipb "k8s.io/kubernetes/pkg/volume/csi/proto/csi" +) + +type csiClient interface { + AssertSupportedVersion(ctx grpctx.Context, ver *csipb.Version) error + NodePublishVolume( + ctx grpctx.Context, + volumeid string, + readOnly bool, + targetPath string, + accessMode api.PersistentVolumeAccessMode, + fsType string, + ) error + NodeUnpublishVolume(ctx grpctx.Context, volId string, targetPath string) error +} + +// csiClient encapsulates all csi-plugin methods +type csiDriverClient struct { + network string + addr string + conn *grpc.ClientConn + idClient csipb.IdentityClient + nodeClient csipb.NodeClient +} + +func newCsiDriverClient(network, addr string) *csiDriverClient { + return &csiDriverClient{network: network, addr: addr} +} + +// assertConnection ensures a valid connection has been established +// if not, it creates a new connection and associated clients +func (c *csiDriverClient) assertConnection() error { + if c.conn == nil { + conn, err := grpc.Dial( + c.addr, + grpc.WithInsecure(), + grpc.WithDialer(func(target string, timeout time.Duration) (net.Conn, error) { + return net.Dial(c.network, target) + }), + ) + if err != nil { + return err + } + c.conn = conn + c.idClient = csipb.NewIdentityClient(conn) + c.nodeClient = csipb.NewNodeClient(conn) + } + + return nil +} + +// AssertCSIVersion determines if driver supports specified version +func (c *csiDriverClient) AssertSupportedVersion(ctx grpctx.Context, ver *csipb.Version) error { + if err := c.assertConnection(); err != nil { + return err + } + + rsp, err := c.idClient.GetSupportedVersions(ctx, &csipb.GetSupportedVersionsRequest{}) + if err != nil { + return err + } + supported := false + vers := rsp.GetSupportedVersions() + for _, v := range vers { + if v.GetMajor() == ver.GetMajor() && + v.GetMinor() == ver.GetMinor() && + v.GetPatch() == ver.GetPatch() { + supported = true + } + } + if !supported { + return fmt.Errorf("version %d.%d.%d not supported", ver.GetMajor(), ver.GetMinor(), ver.GetPatch()) + } + glog.V(4).Infof(log("version %d.%d.%d supported", ver.GetMajor(), ver.GetMinor(), ver.GetPatch())) + return nil +} + +func (c *csiDriverClient) NodePublishVolume( + ctx grpctx.Context, + volId string, + readOnly bool, + targetPath string, + accessMode api.PersistentVolumeAccessMode, + fsType string, +) error { + + if volId == "" { + return errors.New("missing volume id") + } + if targetPath == "" { + return errors.New("missing target path") + } + if err := c.assertConnection(); err != nil { + glog.Errorf("%v: failed to assert a connection: %v", csiPluginName, err) + return err + } + + req := &csipb.NodePublishVolumeRequest{ + Version: csiVersion, + VolumeId: volId, + TargetPath: targetPath, + Readonly: readOnly, + PublishVolumeInfo: map[string]string{"device": "/dev/null"}, //TODO where is this from + + VolumeCapability: &csipb.VolumeCapability{ + AccessMode: &csipb.VolumeCapability_AccessMode{ + Mode: asCSIAccessMode(accessMode), + }, + AccessType: &csipb.VolumeCapability_Mount{ + Mount: &csipb.VolumeCapability_MountVolume{ + FsType: fsType, + }, + }, + }, + } + + _, err := c.nodeClient.NodePublishVolume(ctx, req) + return err +} + +func (c *csiDriverClient) NodeUnpublishVolume(ctx grpctx.Context, volId string, targetPath string) error { + + if volId == "" { + return errors.New("missing volume id") + } + if targetPath == "" { + return errors.New("missing target path") + } + if err := c.assertConnection(); err != nil { + glog.Errorf("%v: failed to assert a connection: %v", csiPluginName, err) + return err + } + + req := &csipb.NodeUnpublishVolumeRequest{ + Version: csiVersion, + VolumeId: volId, + TargetPath: targetPath, + } + + _, err := c.nodeClient.NodeUnpublishVolume(ctx, req) + return err +} + +func asCSIAccessMode(am api.PersistentVolumeAccessMode) csipb.VolumeCapability_AccessMode_Mode { + switch am { + case api.ReadWriteOnce: + return csipb.VolumeCapability_AccessMode_SINGLE_NODE_WRITER + case api.ReadOnlyMany: + return csipb.VolumeCapability_AccessMode_MULTI_NODE_SINGLE_WRITER + case api.ReadWriteMany: + return csipb.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER + } + return csipb.VolumeCapability_AccessMode_UNKNOWN +} diff --git a/pkg/volume/csi/csi_client_test.go b/pkg/volume/csi/csi_client_test.go new file mode 100644 index 0000000000000..3f8cd3d0008a7 --- /dev/null +++ b/pkg/volume/csi/csi_client_test.go @@ -0,0 +1,116 @@ +/* +Copyright 2014 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 csi + +import ( + "errors" + "testing" + + grpctx "golang.org/x/net/context" + "google.golang.org/grpc" + api "k8s.io/api/core/v1" + "k8s.io/kubernetes/pkg/volume/csi/fake" + csipb "k8s.io/kubernetes/pkg/volume/csi/proto/csi" +) + +func setupClient(t *testing.T) *csiDriverClient { + client := newCsiDriverClient("unix", "/tmp/test.sock") + client.conn = new(grpc.ClientConn) //avoids creating conn object + + // setup mock grpc clients + client.idClient = fake.NewIdentityClient() + client.nodeClient = fake.NewNodeClient() + + return client +} + +func TestClientAssertSupportedVersion(t *testing.T) { + testCases := []struct { + testName string + ver *csipb.Version + mustFail bool + err error + }{ + {testName: "supported version", ver: &csipb.Version{Major: 0, Minor: 1, Patch: 0}}, + {testName: "unsupported version", ver: &csipb.Version{Major: 0, Minor: 0, Patch: 0}, mustFail: true}, + {testName: "grpc error", ver: &csipb.Version{Major: 0, Minor: 1, Patch: 0}, mustFail: true, err: errors.New("grpc error")}, + } + client := setupClient(t) + + for _, tc := range testCases { + t.Log("case: ", tc.testName) + client.idClient.(*fake.FakeIdentityClient).SetNextError(tc.err) + err := client.AssertSupportedVersion(grpctx.Background(), tc.ver) + if tc.mustFail && err == nil { + t.Error("must fail, but err = nil") + } + } +} + +func TestClientNodePublishVolume(t *testing.T) { + testCases := []struct { + name string + volID string + targetPath string + fsType string + mustFail bool + err error + }{ + {name: "test ok", volID: "vol-test", targetPath: "/test/path"}, + {name: "missing volID", targetPath: "/test/path", mustFail: true}, + {name: "missing target path", volID: "vol-test", mustFail: true}, + {name: "bad fs", volID: "vol-test", targetPath: "/test/path", fsType: "badfs", mustFail: true}, + {name: "grpc error", volID: "vol-test", targetPath: "/test/path", mustFail: true, err: errors.New("grpc error")}, + } + + client := setupClient(t) + + for _, tc := range testCases { + t.Log("case: ", tc.name) + client.nodeClient.(*fake.FakeNodeClient).SetNextError(tc.err) + err := client.NodePublishVolume(grpctx.Background(), tc.volID, false, tc.targetPath, api.ReadWriteOnce, tc.fsType) + if tc.mustFail && err == nil { + t.Error("must fail, but err is nil: ", err) + } + } +} + +func TestClientNodeUnpublishVolume(t *testing.T) { + testCases := []struct { + name string + volID string + targetPath string + mustFail bool + err error + }{ + {name: "test ok", volID: "vol-test", targetPath: "/test/path"}, + {name: "missing volID", targetPath: "/test/path", mustFail: true}, + {name: "missing target path", volID: "vol-test", mustFail: true}, + {name: "grpc error", volID: "vol-test", targetPath: "/test/path", mustFail: true, err: errors.New("grpc error")}, + } + + client := setupClient(t) + + for _, tc := range testCases { + t.Log("case: ", tc.name) + client.nodeClient.(*fake.FakeNodeClient).SetNextError(tc.err) + err := client.NodeUnpublishVolume(grpctx.Background(), tc.volID, tc.targetPath) + if tc.mustFail && err == nil { + t.Error("must fail, but err is nil: ", err) + } + } +} diff --git a/pkg/volume/csi/csi_mounter.go b/pkg/volume/csi/csi_mounter.go new file mode 100644 index 0000000000000..b621b54a20e44 --- /dev/null +++ b/pkg/volume/csi/csi_mounter.go @@ -0,0 +1,142 @@ +/* +Copyright 2014 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 csi + +import ( + "fmt" + "path" + + "github.com/golang/glog" + grpctx "golang.org/x/net/context" + api "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + kstrings "k8s.io/kubernetes/pkg/util/strings" + "k8s.io/kubernetes/pkg/volume" +) + +type csiMountMgr struct { + csiClient csiClient + plugin *csiPlugin + driverName string + volumeID string + readOnly bool + spec *volume.Spec + pod *api.Pod + podUID types.UID + options volume.VolumeOptions + volume.MetricsNil +} + +// volume.Volume methods +var _ volume.Volume = &csiMountMgr{} + +func (c *csiMountMgr) GetPath() string { + driverPath := fmt.Sprintf("%s/%s", c.driverName, c.volumeID) + return getTargetPath(c.podUID, driverPath, c.plugin.host) +} + +func getTargetPath(uid types.UID, driverPath string, host volume.VolumeHost) string { + return host.GetPodVolumeDir(uid, kstrings.EscapeQualifiedNameForDisk(csiPluginName), driverPath) +} + +// volume.Mounter methods +var _ volume.Mounter = &csiMountMgr{} + +func (c *csiMountMgr) CanMount() error { + return nil +} + +func (c *csiMountMgr) SetUp(fsGroup *int64) error { + return c.SetUpAt(c.GetPath(), fsGroup) +} + +func (c *csiMountMgr) SetUpAt(dir string, fsGroup *int64) error { + glog.V(4).Infof(log("Mounter.SetUpAt(%s)", dir)) + + ctx, cancel := grpctx.WithTimeout(grpctx.Background(), csiTimeout) + defer cancel() + + csi := c.csiClient + + if err := csi.AssertSupportedVersion(ctx, csiVersion); err != nil { + glog.Errorf(log("failed to assert version: %v", err)) + return err + } + + accessMode := api.ReadWriteOnce + if c.spec.PersistentVolume.Spec.AccessModes != nil { + accessMode = c.spec.PersistentVolume.Spec.AccessModes[0] + } + + err := csi.NodePublishVolume( + ctx, + c.volumeID, + c.readOnly, + dir, + accessMode, + "ext4", //TODO needs to be sourced from PV or somewhere else + ) + + if err != nil { + glog.Errorf(log("Mounter.Setup failed: %v", err)) + return err + } + glog.V(4).Infof(log("successfully mounted %s", dir)) + + return nil +} + +func (c *csiMountMgr) GetAttributes() volume.Attributes { + return volume.Attributes{ + ReadOnly: c.readOnly, + Managed: !c.readOnly, + SupportsSELinux: true, + } +} + +// volume.Unmounter methods +var _ volume.Unmounter = &csiMountMgr{} + +func (c *csiMountMgr) TearDown() error { + return c.TearDownAt(c.GetPath()) +} +func (c *csiMountMgr) TearDownAt(dir string) error { + glog.V(4).Infof(log("Unmounter.TearDown(%s)", dir)) + + ctx, cancel := grpctx.WithTimeout(grpctx.Background(), csiTimeout) + defer cancel() + + csi := c.csiClient + + if err := csi.AssertSupportedVersion(ctx, csiVersion); err != nil { + glog.Errorf(log("failed to assert version: %v", err)) + return err + } + + _, volID := path.Split(dir) + + err := csi.NodeUnpublishVolume(ctx, volID, dir) + + if err != nil { + glog.Errorf(log("Mounter.Setup failed: %v", err)) + return err + } + + glog.V(4).Infof(log("successfully unmounted %s", dir)) + + return nil +} diff --git a/pkg/volume/csi/csi_mounter_test.go b/pkg/volume/csi/csi_mounter_test.go new file mode 100644 index 0000000000000..ab606878056aa --- /dev/null +++ b/pkg/volume/csi/csi_mounter_test.go @@ -0,0 +1,128 @@ +/* +Copyright 2014 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 csi + +import ( + "fmt" + "os" + "path" + "testing" + + api "k8s.io/api/core/v1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/volume" + "k8s.io/kubernetes/pkg/volume/csi/fake" +) + +var ( + testDriver = "test-driver" + testVol = "vol-123" + testns = "test-ns" + testPodUID = types.UID("test-pod") +) + +func TestMounterGetPath(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + pv := makeTestPV("test-pv", 10, testDriver, testVol) + + mounter, err := plug.NewMounter( + volume.NewSpecFromPersistentVolume(pv, pv.Spec.PersistentVolumeSource.CSI.ReadOnly), + &api.Pod{ObjectMeta: meta.ObjectMeta{UID: testPodUID, Namespace: testns}}, + volume.VolumeOptions{}, + ) + if err != nil { + t.Fatalf("Failed to make a new Mounter: %v", err) + } + csiMounter := mounter.(*csiMountMgr) + expectedPath := path.Join(tmpDir, fmt.Sprintf( + "pods/%s/volumes/kubernetes.io~csi/%s/%s", + testPodUID, + csiMounter.driverName, + csiMounter.volumeID, + )) + mountPath := csiMounter.GetPath() + if mountPath != expectedPath { + t.Errorf("Got unexpected path: %s", mountPath) + } + +} + +func TestMounterSetUp(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + pv := makeTestPV("test-pv", 10, testDriver, testVol) + + mounter, err := plug.NewMounter( + volume.NewSpecFromPersistentVolume(pv, pv.Spec.PersistentVolumeSource.CSI.ReadOnly), + &api.Pod{ObjectMeta: meta.ObjectMeta{UID: testPodUID, Namespace: testns}}, + volume.VolumeOptions{}, + ) + if err != nil { + t.Fatalf("Failed to make a new Mounter: %v", err) + } + + if mounter == nil { + t.Fatal("failed to create CSI mounter") + } + + csiMounter := mounter.(*csiMountMgr) + csiMounter.csiClient = setupClient(t) + + // Mounter.SetUp() + if err := csiMounter.SetUp(nil); err != nil { + t.Fatal("mounter.Setup failed: %v", err) + } + + // ensure call went all the way + pubs := csiMounter.csiClient.(*csiDriverClient).nodeClient.(*fake.FakeNodeClient).GetNodePublishedVolumes() + if pubs[csiMounter.volumeID] != csiMounter.GetPath() { + t.Error("csi server may not have received NodePublishVolume call") + } +} + +func TestUnmounterTeardown(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + pv := makeTestPV("test-pv", 10, testDriver, testVol) + + unmounter, err := plug.NewUnmounter(pv.ObjectMeta.Name, testPodUID) + if err != nil { + t.Fatalf("failed to make a new Unmounter: %v", err) + } + + csiUnmounter := unmounter.(*csiMountMgr) + csiUnmounter.csiClient = setupClient(t) + + dir := csiUnmounter.GetPath() + + err = csiUnmounter.TearDownAt(dir) + if err != nil { + t.Fatal(err) + } + + // ensure csi client call + pubs := csiUnmounter.csiClient.(*csiDriverClient).nodeClient.(*fake.FakeNodeClient).GetNodePublishedVolumes() + if _, ok := pubs[csiUnmounter.volumeID]; ok { + t.Error("csi server may not have received NodeUnpublishVolume call") + } + +} diff --git a/pkg/volume/csi/csi_plugin.go b/pkg/volume/csi/csi_plugin.go new file mode 100644 index 0000000000000..7ff5e97b9a15b --- /dev/null +++ b/pkg/volume/csi/csi_plugin.go @@ -0,0 +1,193 @@ +/* +Copyright 2014 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 csi + +import ( + "errors" + "fmt" + "path" + "time" + + "github.com/golang/glog" + api "k8s.io/api/core/v1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/util/mount" + "k8s.io/kubernetes/pkg/volume" + csipb "k8s.io/kubernetes/pkg/volume/csi/proto/csi" +) + +const ( + csiName = "csi" + csiPluginName = "kubernetes.io/csi" + //csiAddrTemplate = "/var/lib/kubelet/plugins/csi/sockets/%v/kubeletproxy.sock" + csiAddrTemplate = "/tmp/kubeletproxy.sock" + csiTimeout = 15 * time.Second +) + +var ( + // csiVersion supported csi version + csiVersion = &csipb.Version{Major: 0, Minor: 1, Patch: 0} +) + +type csiPlugin struct { + host volume.VolumeHost +} + +// ProbeVolumePlugins returns implemented plugins +func ProbeVolumePlugins() []volume.VolumePlugin { + p := &csiPlugin{ + host: nil, + } + return []volume.VolumePlugin{p} +} + +// volume.VolumePlugin methods +var _ volume.VolumePlugin = &csiPlugin{} + +func (p *csiPlugin) Init(host volume.VolumeHost) error { + glog.Info(log("plugin initializing...")) + p.host = host + return nil +} + +func (p *csiPlugin) GetPluginName() string { + return csiPluginName +} + +func (p *csiPlugin) GetVolumeName(spec *volume.Spec) (string, error) { + csi, err := getCSISourceFromSpec(spec) + if err != nil { + return "", err + } + return csi.VolumeHandle, nil +} + +func (p *csiPlugin) CanSupport(spec *volume.Spec) bool { + return spec.PersistentVolume != nil && spec.PersistentVolume.Spec.CSI != nil +} + +func (p *csiPlugin) RequiresRemount() bool { + return false +} + +func (p *csiPlugin) NewMounter( + spec *volume.Spec, + pod *api.Pod, + _ volume.VolumeOptions) (volume.Mounter, error) { + pvSource, err := getCSISourceFromSpec(spec) + if err != nil { + return nil, err + } + //addr := fmt.Sprintf(csiAddrTemplate, pvSource.Driver) + glog.V(4).Infof(log("setting up mounter for [volume=%v,driver=%v]", pvSource.VolumeHandle, pvSource.Driver)) + addr := csiAddrTemplate + client := newCsiDriverClient("unix", addr) + mounter := &csiMountMgr{ + plugin: p, + spec: spec, + pod: pod, + podUID: pod.UID, + driverName: pvSource.Driver, + volumeID: pvSource.VolumeHandle, + csiClient: client, + } + return mounter, nil +} + +func (p *csiPlugin) NewUnmounter(specName string, podUID types.UID) (volume.Unmounter, error) { + glog.V(4).Infof(log("setting up unmounter for [name=%v, podUID=%v]", specName, podUID)) + addr := csiAddrTemplate + client := newCsiDriverClient("unix", addr) + unmounter := &csiMountMgr{ + plugin: p, + podUID: podUID, + csiClient: client, + } + return unmounter, nil +} + +func (p *csiPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { + glog.V(4).Infof(log("constructing volume spec [vol=%v, path=%v]", volumeName, mountPath)) + + // extract driverName/volumeId from end of mountPath + dir, volID := path.Split(mountPath) + driverName := path.Base(dir) + + pv := &api.PersistentVolume{ + ObjectMeta: meta.ObjectMeta{ + Name: volumeName, + }, + Spec: api.PersistentVolumeSpec{ + PersistentVolumeSource: api.PersistentVolumeSource{ + CSI: &api.CSIPersistentVolumeSource{ + Driver: driverName, + VolumeHandle: volID, + }, + }, + }, + } + return volume.NewSpecFromPersistentVolume(pv, false), nil +} + +func (p *csiPlugin) SupportsMountOption() bool { + return false +} + +func (p *csiPlugin) SupportsBulkVolumeVerification() bool { + return false +} + +// volume.AttachableVolumePlugin methods +var _ volume.AttachableVolumePlugin = &csiPlugin{} + +func (p *csiPlugin) NewAttacher() (volume.Attacher, error) { + k8s := p.host.GetKubeClient() + if k8s == nil { + glog.Error(log("unable to get kubernetes client from host")) + return nil, errors.New("unable to get Kubernetes client") + } + + return &csiAttacher{ + plugin: p, + k8s: k8s, + waitSleepTime: 1 * time.Second, + }, nil +} + +func (p *csiPlugin) NewDetacher() (volume.Detacher, error) { + return nil, errors.New("unimplemented") +} + +func (p *csiPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { + m := p.host.GetMounter(p.GetPluginName()) + return mount.GetMountRefs(m, deviceMountPath) +} + +func getCSISourceFromSpec(spec *volume.Spec) (*api.CSIPersistentVolumeSource, error) { + if spec.PersistentVolume != nil && + spec.PersistentVolume.Spec.CSI != nil { + return spec.PersistentVolume.Spec.CSI, nil + } + + return nil, fmt.Errorf("CSIPersistentVolumeSource not defined in spec") +} + +// log prepends log string with `kubernetes.io/csi` +func log(msg string, parts ...interface{}) string { + return fmt.Sprintf(fmt.Sprintf("%s: %s", csiPluginName, msg), parts...) +} diff --git a/pkg/volume/csi/csi_plugin_test.go b/pkg/volume/csi/csi_plugin_test.go new file mode 100644 index 0000000000000..01a869e6b0ff0 --- /dev/null +++ b/pkg/volume/csi/csi_plugin_test.go @@ -0,0 +1,218 @@ +/* +Copyright 2014 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 csi + +import ( + "fmt" + "os" + "path" + "testing" + + api "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + fakeclient "k8s.io/client-go/kubernetes/fake" + utiltesting "k8s.io/client-go/util/testing" + "k8s.io/kubernetes/pkg/volume" + volumetest "k8s.io/kubernetes/pkg/volume/testing" +) + +// create a plugin mgr to load plugins and setup a fake client +func newTestPlugin(t *testing.T) (*csiPlugin, string) { + tmpDir, err := utiltesting.MkTmpdir("csi-test") + if err != nil { + t.Fatalf("can't create temp dir: %v", err) + } + + fakeClient := fakeclient.NewSimpleClientset() + host := volumetest.NewFakeVolumeHost( + tmpDir, + fakeClient, + nil, + ) + plugMgr := &volume.VolumePluginMgr{} + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) + + plug, err := plugMgr.FindPluginByName(csiPluginName) + if err != nil { + t.Fatalf("can't find plugin %v", csiPluginName) + } + + csiPlug, ok := plug.(*csiPlugin) + if !ok { + t.Fatalf("cannot assert plugin to be type csiPlugin") + } + + return csiPlug, tmpDir +} + +func makeTestPV(name string, sizeGig int, driverName, volID string) *api.PersistentVolume { + return &api.PersistentVolume{ + ObjectMeta: meta.ObjectMeta{ + Name: name, + Namespace: testns, + }, + Spec: api.PersistentVolumeSpec{ + AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, + Capacity: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse( + fmt.Sprintf("%dGi", sizeGig), + ), + }, + PersistentVolumeSource: api.PersistentVolumeSource{ + CSI: &api.CSIPersistentVolumeSource{ + Driver: driverName, + VolumeHandle: volID, + ReadOnly: false, + }, + }, + }, + } +} + +func TestPluginGetPluginName(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + if plug.GetPluginName() != "kubernetes.io/csi" { + t.Errorf("unexpected plugin name %v", plug.GetPluginName()) + } +} + +func TestPluginGetVolumeName(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + pv := makeTestPV("test-pv", 10, testDriver, testVol) + spec := volume.NewSpecFromPersistentVolume(pv, false) + name, err := plug.GetVolumeName(spec) + if err != nil { + t.Fatalf("GetVolumeName failed: %v", err) + } + if name != testVol { + t.Errorf("unexpected volume name %s", name) + } +} + +func TestPluginCanSupport(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + pv := makeTestPV("test-pv", 10, testDriver, testVol) + spec := volume.NewSpecFromPersistentVolume(pv, false) + + if !plug.CanSupport(spec) { + t.Errorf("should support CSI spec") + } +} + +func TestPluginConstructVolumeSpec(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + pv := makeTestPV("test-pv", 10, testDriver, testVol) + + dir := path.Join(tmpDir, fmt.Sprintf( + "pods/%s/volumes/kubernetes.io~csi/%s/%s", + testPodUID, testDriver, testVol, + )) + + // rebuild spec + spec, err := plug.ConstructVolumeSpec(pv.Name, dir) + if err != nil { + t.Fatalf("ConstructVolumeSpec failed %v", err) + } + if spec.Name() != "test-pv" { + t.Errorf("Unexpected spec name %s", spec.Name()) + } + if spec.PersistentVolume.Spec.CSI.Driver != testDriver { + t.Errorf("unexpected CSI.Driver %v", spec.PersistentVolume.Spec.CSI.Driver) + } +} + +func TestPluginNewMounter(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + pv := makeTestPV("test-pv", 10, testDriver, testVol) + mounter, err := plug.NewMounter( + volume.NewSpecFromPersistentVolume(pv, pv.Spec.PersistentVolumeSource.CSI.ReadOnly), + &api.Pod{ObjectMeta: meta.ObjectMeta{UID: testPodUID, Namespace: testns}}, + volume.VolumeOptions{}, + ) + if err != nil { + t.Fatalf("Failed to make a new Mounter: %v", err) + } + + if mounter == nil { + t.Fatal("failed to create CSI mounter") + } + csiMounter := mounter.(*csiMountMgr) + + // validate mounter fields + if csiMounter.driverName != testDriver { + t.Error("mounter driver name not set") + } + if csiMounter.volumeID != testVol { + t.Error("mounter volume id not set") + } + if csiMounter.pod == nil { + t.Error("mounter pod not set") + } + if csiMounter.podUID == types.UID("") { + t.Error("mounter podUID mot set") + } +} + +func TestPluginNewUnmounter(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + pv := makeTestPV("test-pv", 10, testDriver, testVol) + + unmounter, err := plug.NewUnmounter(pv.ObjectMeta.Name, testPodUID) + csiUnmounter := unmounter.(*csiMountMgr) + + if err != nil { + t.Fatalf("Failed to make a new Mounter: %v", err) + } + + if csiUnmounter == nil { + t.Fatal("failed to create CSI mounter") + } + + if csiUnmounter.podUID != testPodUID { + t.Error("podUID not set") + } +} + +func TestPluginNewAttacher(t *testing.T) { + plug, tmpDir := newTestPlugin(t) + defer os.RemoveAll(tmpDir) + + attacher, err := plug.NewAttacher() + if err != nil { + t.Fatalf("failed to create new attacher: %v", err) + } + + csiAttacher := attacher.(*csiAttacher) + if csiAttacher.plugin == nil { + t.Error("plugin not set for attacher") + } + if csiAttacher.k8s == nil { + t.Error("Kubernetes client not set for attacher") + } +} diff --git a/pkg/volume/csi/fake/fake_client.go b/pkg/volume/csi/fake/fake_client.go new file mode 100644 index 0000000000000..c78a0ae76a960 --- /dev/null +++ b/pkg/volume/csi/fake/fake_client.go @@ -0,0 +1,125 @@ +/* +Copyright 2014 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 fake + +import ( + "context" + "errors" + "strings" + + "google.golang.org/grpc" + + grpctx "golang.org/x/net/context" + csipb "k8s.io/kubernetes/pkg/volume/csi/proto/csi" +) + +type FakeIdentityClient struct { + nextErr error +} + +func NewIdentityClient() *FakeIdentityClient { + return &FakeIdentityClient{} +} + +func (f *FakeIdentityClient) SetNextError(err error) { + f.nextErr = err +} + +func (f *FakeIdentityClient) GetSupportedVersions(ctx grpctx.Context, req *csipb.GetSupportedVersionsRequest, opts ...grpc.CallOption) (*csipb.GetSupportedVersionsResponse, error) { + // short circuit with an error + if f.nextErr != nil { + return nil, f.nextErr + } + + rsp := &csipb.GetSupportedVersionsResponse{ + SupportedVersions: []*csipb.Version{ + {Major: 0, Minor: 0, Patch: 1}, + {Major: 0, Minor: 1, Patch: 0}, + {Major: 1, Minor: 0, Patch: 0}, + {Major: 1, Minor: 0, Patch: 1}, + {Major: 1, Minor: 1, Patch: 1}, + }, + } + return rsp, nil +} + +func (f *FakeIdentityClient) GetPluginInfo(ctx context.Context, in *csipb.GetPluginInfoRequest, opts ...grpc.CallOption) (*csipb.GetPluginInfoResponse, error) { + return nil, nil +} + +type FakeNodeClient struct { + nodePublishedVolumes map[string]string + nextErr error +} + +func NewNodeClient() *FakeNodeClient { + return &FakeNodeClient{nodePublishedVolumes: make(map[string]string)} +} + +func (f *FakeNodeClient) SetNextError(err error) { + f.nextErr = err +} + +func (f *FakeNodeClient) GetNodePublishedVolumes() map[string]string { + return f.nodePublishedVolumes +} + +func (f *FakeNodeClient) NodePublishVolume(ctx grpctx.Context, req *csipb.NodePublishVolumeRequest, opts ...grpc.CallOption) (*csipb.NodePublishVolumeResponse, error) { + + if f.nextErr != nil { + return nil, f.nextErr + } + + if req.GetVolumeId() == "" { + return nil, errors.New("missing volume id") + } + if req.GetTargetPath() == "" { + return nil, errors.New("missing target path") + } + fsTypes := "ext4|xfs|zfs" + fsType := req.GetVolumeCapability().GetMount().GetFsType() + if !strings.Contains(fsTypes, fsType) { + return nil, errors.New("invlid fstype") + } + f.nodePublishedVolumes[req.GetVolumeId()] = req.GetTargetPath() + return &csipb.NodePublishVolumeResponse{}, nil +} + +func (f *FakeNodeClient) NodeUnpublishVolume(ctx context.Context, req *csipb.NodeUnpublishVolumeRequest, opts ...grpc.CallOption) (*csipb.NodeUnpublishVolumeResponse, error) { + if f.nextErr != nil { + return nil, f.nextErr + } + + if req.GetVolumeId() == "" { + return nil, errors.New("missing volume id") + } + if req.GetTargetPath() == "" { + return nil, errors.New("missing target path") + } + delete(f.nodePublishedVolumes, req.GetVolumeId()) + return &csipb.NodeUnpublishVolumeResponse{}, nil +} + +func (f *FakeNodeClient) GetNodeID(ctx context.Context, in *csipb.GetNodeIDRequest, opts ...grpc.CallOption) (*csipb.GetNodeIDResponse, error) { + return nil, nil +} +func (f *FakeNodeClient) NodeProbe(ctx context.Context, in *csipb.NodeProbeRequest, opts ...grpc.CallOption) (*csipb.NodeProbeResponse, error) { + return nil, nil +} +func (f *FakeNodeClient) NodeGetCapabilities(ctx context.Context, in *csipb.NodeGetCapabilitiesRequest, opts ...grpc.CallOption) (*csipb.NodeGetCapabilitiesResponse, error) { + return nil, nil +} diff --git a/pkg/volume/csi/proto/csi.proto b/pkg/volume/csi/proto/csi.proto new file mode 100644 index 0000000000000..36f9533d62a48 --- /dev/null +++ b/pkg/volume/csi/proto/csi.proto @@ -0,0 +1,630 @@ +//////// +syntax = "proto3"; +package csi; +//////// +//////// +service Identity { + rpc GetSupportedVersions (GetSupportedVersionsRequest) + returns (GetSupportedVersionsResponse) {} + + rpc GetPluginInfo(GetPluginInfoRequest) + returns (GetPluginInfoResponse) {} +} + +service Controller { + rpc CreateVolume (CreateVolumeRequest) + returns (CreateVolumeResponse) {} + + rpc DeleteVolume (DeleteVolumeRequest) + returns (DeleteVolumeResponse) {} + + rpc ControllerPublishVolume (ControllerPublishVolumeRequest) + returns (ControllerPublishVolumeResponse) {} + + rpc ControllerUnpublishVolume (ControllerUnpublishVolumeRequest) + returns (ControllerUnpublishVolumeResponse) {} + + rpc ValidateVolumeCapabilities (ValidateVolumeCapabilitiesRequest) + returns (ValidateVolumeCapabilitiesResponse) {} + + rpc ListVolumes (ListVolumesRequest) + returns (ListVolumesResponse) {} + + rpc GetCapacity (GetCapacityRequest) + returns (GetCapacityResponse) {} + + rpc ControllerProbe (ControllerProbeRequest) + returns (ControllerProbeResponse) {} + + rpc ControllerGetCapabilities (ControllerGetCapabilitiesRequest) + returns (ControllerGetCapabilitiesResponse) {} +} + +service Node { + rpc NodePublishVolume (NodePublishVolumeRequest) + returns (NodePublishVolumeResponse) {} + + rpc NodeUnpublishVolume (NodeUnpublishVolumeRequest) + returns (NodeUnpublishVolumeResponse) {} + + rpc GetNodeID (GetNodeIDRequest) + returns (GetNodeIDResponse) {} + + rpc NodeProbe (NodeProbeRequest) + returns (NodeProbeResponse) {} + + rpc NodeGetCapabilities (NodeGetCapabilitiesRequest) + returns (NodeGetCapabilitiesResponse) {} +} +//////// +//////// +message GetSupportedVersionsRequest { +} + +message GetSupportedVersionsResponse { + // All the CSI versions that the Plugin supports. This field is + // REQUIRED. + repeated Version supported_versions = 1; +} + +// Specifies a version in Semantic Version 2.0 format. +// (http://semver.org/spec/v2.0.0.html) +message Version { + uint32 major = 1; // This field is REQUIRED. + uint32 minor = 2; // This field is REQUIRED. + uint32 patch = 3; // This field is REQUIRED. +} +//////// +//////// +message GetPluginInfoRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; +} + +message GetPluginInfoResponse { + // This field is REQUIRED. + string name = 1; + + // This field is REQUIRED. Value of this field is opaque to the CO. + string vendor_version = 2; + + // This field is OPTIONAL. Values are opaque to the CO. + map manifest = 3; +} +//////// +//////// +message CreateVolumeRequest { + // The API version assumed by the CO. This field is REQUIRED. + Version version = 1; + + // The suggested name for the storage space. This field is REQUIRED. + // It serves two purposes: + // 1) Idempotency - This name is generated by the CO to achieve + // idempotency. If `CreateVolume` fails, the volume may or may not + // be provisioned. In this case, the CO may call `CreateVolume` + // again, with the same name, to ensure the volume exists. The + // Plugin should ensure that multiple `CreateVolume` calls for the + // same name do not result in more than one piece of storage + // provisioned corresponding to that name. If a Plugin is unable to + // enforce idempotency, the CO's error recovery logic could result + // in multiple (unused) volumes being provisioned. + // 2) Suggested name - Some storage systems allow callers to specify + // an identifier by which to refer to the newly provisioned + // storage. If a storage system supports this, it can optionally + // use this name as the identifier for the new volume. + string name = 2; + + // This field is OPTIONAL. This allows the CO to specify the capacity + // requirement of the volume to be provisioned. If not specified, the + // Plugin MAY choose an implementation-defined capacity range. + CapacityRange capacity_range = 3; + + // The capabilities that the provisioned volume MUST have: the Plugin + // MUST provision a volume that could satisfy ALL of the + // capabilities specified in this list. The Plugin MUST assume that + // the CO MAY use the provisioned volume later with ANY of the + // capabilities specified in this list. This also enables the CO to do + // early validation: if ANY of the specified volume capabilities are + // not supported by the Plugin, the call SHALL fail. This field is + // REQUIRED. + repeated VolumeCapability volume_capabilities = 4; + + // Plugin specific parameters passed in as opaque key-value pairs. + // This field is OPTIONAL. The Plugin is responsible for parsing and + // validating these parameters. COs will treat these as opaque. + map parameters = 5; + + // End user credentials used to authenticate/authorize volume creation + // request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + map user_credentials = 6; +} + +message CreateVolumeResponse { + // Contains all attributes of the newly created volume that are + // relevant to the CO along with information required by the Plugin + // to uniquely identify the volume. This field is REQUIRED. + VolumeInfo volume_info = 1; +} + +// Specify a capability of a volume. +message VolumeCapability { + // Indicate that the volume will be accessed via the block device API. + message BlockVolume { + // Intentionally empty, for now. + } + + // Indicate that the volume will be accessed via the filesystem API. + message MountVolume { + // The filesystem type. This field is OPTIONAL. + // An empty string is equal to an unspecified field value. + string fs_type = 1; + + // The mount options that can be used for the volume. This field is + // OPTIONAL. `mount_flags` MAY contain sensitive information. + // Therefore, the CO and the Plugin MUST NOT leak this information + // to untrusted entities. The total size of this repeated field + // SHALL NOT exceed 4 KiB. + repeated string mount_flags = 2; + } + + // Specify how a volume can be accessed. + message AccessMode { + enum Mode { + UNKNOWN = 0; + + // Can be published as read/write at one node at a time. + SINGLE_NODE_WRITER = 1; + + // Can be published as readonly at one node at a time. + SINGLE_NODE_READER_ONLY = 2; + + // Can be published as readonly at multiple nodes simultaneously. + MULTI_NODE_READER_ONLY = 3; + + // Can be published at multiple nodes simultaneously. Only one of + // the node can be used as read/write. The rest will be readonly. + MULTI_NODE_SINGLE_WRITER = 4; + + // Can be published as read/write at multiple nodes + // simultaneously. + MULTI_NODE_MULTI_WRITER = 5; + } + + // This field is REQUIRED. + Mode mode = 1; + } + + // Specifies what API the volume will be accessed using. One of the + // following fields MUST be specified. + oneof access_type { + BlockVolume block = 1; + MountVolume mount = 2; + } + + // This is a REQUIRED field. + AccessMode access_mode = 3; +} + +// The capacity of the storage space in bytes. To specify an exact size, +// `required_bytes` and `limit_bytes` can be set to the same value. At +// least one of the these fields MUST be specified. +message CapacityRange { + // Volume must be at least this big. This field is OPTIONAL. + // A value of 0 is equal to an unspecified field value. + uint64 required_bytes = 1; + + // Volume must not be bigger than this. This field is OPTIONAL. + // A value of 0 is equal to an unspecified field value. + uint64 limit_bytes = 2; +} + +// The information about a provisioned volume. +message VolumeInfo { + // The capacity of the volume in bytes. This field is OPTIONAL. If not + // set (value of 0), it indicates that the capacity of the volume is + // unknown (e.g., NFS share). + uint64 capacity_bytes = 1; + + // Contains identity information for the created volume. This field is + // REQUIRED. The identity information will be used by the CO in + // subsequent calls to refer to the provisioned volume. + string id = 2; + + // Attributes reflect static properties of a volume and MUST be passed + // to volume validation and publishing calls. + // Attributes SHALL be opaque to a CO. Attributes SHALL NOT be mutable + // and SHALL be safe for the CO to cache. Attributes SHOULD NOT + // contain sensitive information. Attributes MAY NOT uniquely identify + // a volume. A volume uniquely identified by `id` SHALL always report + // the same attributes. This field is OPTIONAL and when present MUST + // be passed to volume validation and publishing calls. + map attributes = 3; +} +//////// +//////// +message DeleteVolumeRequest { + // The API version assumed by the CO. This field is REQUIRED. + Version version = 1; + + // The ID of the volume to be deprovisioned. + // This field is REQUIRED. + string volume_id = 2; + + // End user credentials used to authenticate/authorize volume deletion + // request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + map user_credentials = 3; +} + +message DeleteVolumeResponse {} +//////// +//////// +message ControllerPublishVolumeRequest { + // The API version assumed by the CO. This field is REQUIRED. + Version version = 1; + + // The ID of the volume to be used on a node. + // This field is REQUIRED. + string volume_id = 2; + + // The ID of the node. This field is OPTIONAL. The CO SHALL set (or + // clear) this field to match the node ID returned by `GetNodeID`. + // `GetNodeID` is allowed to omit node ID from a successful response; + // in such cases the CO SHALL NOT specify this field. + string node_id = 3; + + // The capability of the volume the CO expects the volume to have. + // This is a REQUIRED field. + VolumeCapability volume_capability = 4; + + // Whether to publish the volume in readonly mode. This field is + // REQUIRED. + bool readonly = 5; + + // End user credentials used to authenticate/authorize controller + // publish request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + map user_credentials = 6; + + // Attributes of the volume to be used on a node. This field is + // OPTIONAL and MUST match the attributes of the VolumeInfo identified + // by `volume_id`. + map volume_attributes = 7; +} + +message ControllerPublishVolumeResponse { + // The SP specific information that will be passed to the Plugin in + // the subsequent `NodePublishVolume` call for the given volume. + // This information is opaque to the CO. This field is OPTIONAL. + map publish_volume_info = 1; +} +//////// +//////// +message ControllerUnpublishVolumeRequest { + // The API version assumed by the CO. This field is REQUIRED. + Version version = 1; + + // The ID of the volume. This field is REQUIRED. + string volume_id = 2; + + // The ID of the node. This field is OPTIONAL. The CO SHALL set (or + // clear) this field to match the node ID returned by `GetNodeID`. + // `GetNodeID` is allowed to omit node ID from a successful response; + // in such cases the CO SHALL NOT specify this field. + // + // If `GetNodeID` does not omit node ID from a successful response, + // the CO MAY omit this field as well, indicating that it does not + // know which node the volume was previously used. The Plugin SHOULD + // return an Error if this is not supported. + string node_id = 3; + + // End user credentials used to authenticate/authorize controller + // unpublish request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + map user_credentials = 4; +} + +message ControllerUnpublishVolumeResponse {} +//////// +//////// +message ValidateVolumeCapabilitiesRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; + + // The ID of the volume to check. This field is REQUIRED. + string volume_id = 2; + + // The capabilities that the CO wants to check for the volume. This + // call SHALL return "supported" only if all the volume capabilities + // specified below are supported. This field is REQUIRED. + repeated VolumeCapability volume_capabilities = 3; + + // Attributes of the volume to check. This field is OPTIONAL and MUST + // match the attributes of the VolumeInfo identified by `volume_id`. + map volume_attributes = 4; +} + +message ValidateVolumeCapabilitiesResponse { + // True if the Plugin supports the specified capabilities for the + // given volume. This field is REQUIRED. + bool supported = 1; + + // Message to the CO if `supported` above is false. This field is + // OPTIONAL. + // An empty string is equal to an unspecified field value. + string message = 2; +} +//////// +//////// +message ListVolumesRequest { + // The API version assumed by the CO. This field is REQUIRED. + Version version = 1; + + // If specified (non-zero value), the Plugin MUST NOT return more + // entries than this number in the response. If the actual number of + // entries is more than this number, the Plugin MUST set `next_token` + // in the response which can be used to get the next page of entries + // in the subsequent `ListVolumes` call. This field is OPTIONAL. If + // not specified (zero value), it means there is no restriction on the + // number of entries that can be returned. + uint32 max_entries = 2; + + // A token to specify where to start paginating. Set this field to + // `next_token` returned by a previous `ListVolumes` call to get the + // next page of entries. This field is OPTIONAL. + // An empty string is equal to an unspecified field value. + string starting_token = 3; +} + +message ListVolumesResponse { + message Entry { + VolumeInfo volume_info = 1; + } + + repeated Entry entries = 1; + + // This token allows you to get the next page of entries for + // `ListVolumes` request. If the number of entries is larger than + // `max_entries`, use the `next_token` as a value for the + // `starting_token` field in the next `ListVolumes` request. This + // field is OPTIONAL. + // An empty string is equal to an unspecified field value. + string next_token = 2; +} +//////// +//////// +message GetCapacityRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; + + // If specified, the Plugin SHALL report the capacity of the storage + // that can be used to provision volumes that satisfy ALL of the + // specified `volume_capabilities`. These are the same + // `volume_capabilities` the CO will use in `CreateVolumeRequest`. + // This field is OPTIONAL. + repeated VolumeCapability volume_capabilities = 2; + + // If specified, the Plugin SHALL report the capacity of the storage + // that can be used to provision volumes with the given Plugin + // specific `parameters`. These are the same `parameters` the CO will + // use in `CreateVolumeRequest`. This field is OPTIONAL. + map parameters = 3; +} + +message GetCapacityResponse { + // The available capacity of the storage that can be used to + // provision volumes. If `volume_capabilities` or `parameters` is + // specified in the request, the Plugin SHALL take those into + // consideration when calculating the available capacity of the + // storage. This field is REQUIRED. + uint64 available_capacity = 1; +} +//////// +//////// +message ControllerProbeRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; +} + +message ControllerProbeResponse {} +//////// +//////// +message ControllerGetCapabilitiesRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; +} + +message ControllerGetCapabilitiesResponse { + // All the capabilities that the controller service supports. This + // field is OPTIONAL. + repeated ControllerServiceCapability capabilities = 2; +} + +// Specifies a capability of the controller service. +message ControllerServiceCapability { + message RPC { + enum Type { + UNKNOWN = 0; + CREATE_DELETE_VOLUME = 1; + PUBLISH_UNPUBLISH_VOLUME = 2; + LIST_VOLUMES = 3; + GET_CAPACITY = 4; + } + + Type type = 1; + } + + oneof type { + // RPC that the controller supports. + RPC rpc = 1; + } +} +//////// +//////// +message NodePublishVolumeRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; + + // The ID of the volume to publish. This field is REQUIRED. + string volume_id = 2; + + // The CO SHALL set this field to the value returned by + // `ControllerPublishVolume` if the corresponding Controller Plugin + // has `PUBLISH_UNPUBLISH_VOLUME` controller capability, and SHALL be + // left unset if the corresponding Controller Plugin does not have + // this capability. This is an OPTIONAL field. + map publish_volume_info = 3; + + // The path to which the volume will be published. It MUST be an + // absolute path in the root filesystem of the process serving this + // request. The CO SHALL ensure uniqueness of target_path per volume. + // This is a REQUIRED field. + string target_path = 4; + + // The capability of the volume the CO expects the volume to have. + // This is a REQUIRED field. + VolumeCapability volume_capability = 5; + + // Whether to publish the volume in readonly mode. This field is + // REQUIRED. + bool readonly = 6; + + // End user credentials used to authenticate/authorize node + // publish request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + map user_credentials = 7; + + // Attributes of the volume to publish. This field is OPTIONAL and + // MUST match the attributes of the VolumeInfo identified by + // `volume_id`. + map volume_attributes = 8; +} + +message NodePublishVolumeResponse {} +//////// +//////// +message NodeUnpublishVolumeRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; + + // The ID of the volume. This field is REQUIRED. + string volume_id = 2; + + // The path at which the volume was published. It MUST be an absolute + // path in the root filesystem of the process serving this request. + // This is a REQUIRED field. + string target_path = 3; + + // End user credentials used to authenticate/authorize node + // unpublish request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + map user_credentials = 4; +} + +message NodeUnpublishVolumeResponse {} +//////// +//////// +message GetNodeIDRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; +} + +message GetNodeIDResponse { + // The ID of the node which SHALL be used by CO in + // `ControllerPublishVolume`. This is an OPTIONAL field. If unset, + // the CO SHALL leave the `node_id` field unset in + // `ControllerPublishVolume`. + string node_id = 1; +} +//////// +//////// +message NodeProbeRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; +} + +message NodeProbeResponse {} +//////// +//////// +message NodeGetCapabilitiesRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; +} + +message NodeGetCapabilitiesResponse { + // All the capabilities that the node service supports. This field + // is OPTIONAL. + repeated NodeServiceCapability capabilities = 1; +} + +// Specifies a capability of the node service. +message NodeServiceCapability { + message RPC { + enum Type { + UNKNOWN = 0; + } + + Type type = 1; + } + + oneof type { + // RPC that the controller supports. + RPC rpc = 1; + } +} +//////// diff --git a/pkg/volume/csi/proto/csi/csi.pb.go b/pkg/volume/csi/proto/csi/csi.pb.go new file mode 100644 index 0000000000000..eb043bd964247 --- /dev/null +++ b/pkg/volume/csi/proto/csi/csi.pb.go @@ -0,0 +1,2548 @@ +/* +Copyright 2014 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. +*/ + +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: csi.proto + +/* +Package csi is a generated protocol buffer package. + +It is generated from these files: + csi.proto + +It has these top-level messages: + GetSupportedVersionsRequest + GetSupportedVersionsResponse + Version + GetPluginInfoRequest + GetPluginInfoResponse + CreateVolumeRequest + CreateVolumeResponse + VolumeCapability + CapacityRange + VolumeInfo + DeleteVolumeRequest + DeleteVolumeResponse + ControllerPublishVolumeRequest + ControllerPublishVolumeResponse + ControllerUnpublishVolumeRequest + ControllerUnpublishVolumeResponse + ValidateVolumeCapabilitiesRequest + ValidateVolumeCapabilitiesResponse + ListVolumesRequest + ListVolumesResponse + GetCapacityRequest + GetCapacityResponse + ControllerProbeRequest + ControllerProbeResponse + ControllerGetCapabilitiesRequest + ControllerGetCapabilitiesResponse + ControllerServiceCapability + NodePublishVolumeRequest + NodePublishVolumeResponse + NodeUnpublishVolumeRequest + NodeUnpublishVolumeResponse + GetNodeIDRequest + GetNodeIDResponse + NodeProbeRequest + NodeProbeResponse + NodeGetCapabilitiesRequest + NodeGetCapabilitiesResponse + NodeServiceCapability +*/ +package csi + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +import ( + context "golang.org/x/net/context" + grpc "google.golang.org/grpc" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type VolumeCapability_AccessMode_Mode int32 + +const ( + VolumeCapability_AccessMode_UNKNOWN VolumeCapability_AccessMode_Mode = 0 + // Can be published as read/write at one node at a time. + VolumeCapability_AccessMode_SINGLE_NODE_WRITER VolumeCapability_AccessMode_Mode = 1 + // Can be published as readonly at one node at a time. + VolumeCapability_AccessMode_SINGLE_NODE_READER_ONLY VolumeCapability_AccessMode_Mode = 2 + // Can be published as readonly at multiple nodes simultaneously. + VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY VolumeCapability_AccessMode_Mode = 3 + // Can be published at multiple nodes simultaneously. Only one of + // the node can be used as read/write. The rest will be readonly. + VolumeCapability_AccessMode_MULTI_NODE_SINGLE_WRITER VolumeCapability_AccessMode_Mode = 4 + // Can be published as read/write at multiple nodes + // simultaneously. + VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER VolumeCapability_AccessMode_Mode = 5 +) + +var VolumeCapability_AccessMode_Mode_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SINGLE_NODE_WRITER", + 2: "SINGLE_NODE_READER_ONLY", + 3: "MULTI_NODE_READER_ONLY", + 4: "MULTI_NODE_SINGLE_WRITER", + 5: "MULTI_NODE_MULTI_WRITER", +} +var VolumeCapability_AccessMode_Mode_value = map[string]int32{ + "UNKNOWN": 0, + "SINGLE_NODE_WRITER": 1, + "SINGLE_NODE_READER_ONLY": 2, + "MULTI_NODE_READER_ONLY": 3, + "MULTI_NODE_SINGLE_WRITER": 4, + "MULTI_NODE_MULTI_WRITER": 5, +} + +func (x VolumeCapability_AccessMode_Mode) String() string { + return proto.EnumName(VolumeCapability_AccessMode_Mode_name, int32(x)) +} +func (VolumeCapability_AccessMode_Mode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{7, 2, 0} +} + +type ControllerServiceCapability_RPC_Type int32 + +const ( + ControllerServiceCapability_RPC_UNKNOWN ControllerServiceCapability_RPC_Type = 0 + ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME ControllerServiceCapability_RPC_Type = 1 + ControllerServiceCapability_RPC_PUBLISH_UNPUBLISH_VOLUME ControllerServiceCapability_RPC_Type = 2 + ControllerServiceCapability_RPC_LIST_VOLUMES ControllerServiceCapability_RPC_Type = 3 + ControllerServiceCapability_RPC_GET_CAPACITY ControllerServiceCapability_RPC_Type = 4 +) + +var ControllerServiceCapability_RPC_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "CREATE_DELETE_VOLUME", + 2: "PUBLISH_UNPUBLISH_VOLUME", + 3: "LIST_VOLUMES", + 4: "GET_CAPACITY", +} +var ControllerServiceCapability_RPC_Type_value = map[string]int32{ + "UNKNOWN": 0, + "CREATE_DELETE_VOLUME": 1, + "PUBLISH_UNPUBLISH_VOLUME": 2, + "LIST_VOLUMES": 3, + "GET_CAPACITY": 4, +} + +func (x ControllerServiceCapability_RPC_Type) String() string { + return proto.EnumName(ControllerServiceCapability_RPC_Type_name, int32(x)) +} +func (ControllerServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{26, 0, 0} +} + +type NodeServiceCapability_RPC_Type int32 + +const ( + NodeServiceCapability_RPC_UNKNOWN NodeServiceCapability_RPC_Type = 0 +) + +var NodeServiceCapability_RPC_Type_name = map[int32]string{ + 0: "UNKNOWN", +} +var NodeServiceCapability_RPC_Type_value = map[string]int32{ + "UNKNOWN": 0, +} + +func (x NodeServiceCapability_RPC_Type) String() string { + return proto.EnumName(NodeServiceCapability_RPC_Type_name, int32(x)) +} +func (NodeServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{37, 0, 0} +} + +// ////// +// ////// +type GetSupportedVersionsRequest struct { +} + +func (m *GetSupportedVersionsRequest) Reset() { *m = GetSupportedVersionsRequest{} } +func (m *GetSupportedVersionsRequest) String() string { return proto.CompactTextString(m) } +func (*GetSupportedVersionsRequest) ProtoMessage() {} +func (*GetSupportedVersionsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +type GetSupportedVersionsResponse struct { + // All the CSI versions that the Plugin supports. This field is + // REQUIRED. + SupportedVersions []*Version `protobuf:"bytes,1,rep,name=supported_versions,json=supportedVersions" json:"supported_versions,omitempty"` +} + +func (m *GetSupportedVersionsResponse) Reset() { *m = GetSupportedVersionsResponse{} } +func (m *GetSupportedVersionsResponse) String() string { return proto.CompactTextString(m) } +func (*GetSupportedVersionsResponse) ProtoMessage() {} +func (*GetSupportedVersionsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *GetSupportedVersionsResponse) GetSupportedVersions() []*Version { + if m != nil { + return m.SupportedVersions + } + return nil +} + +// Specifies a version in Semantic Version 2.0 format. +// (http://semver.org/spec/v2.0.0.html) +type Version struct { + Major uint32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"` + Minor uint32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"` + Patch uint32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"` +} + +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *Version) GetMajor() uint32 { + if m != nil { + return m.Major + } + return 0 +} + +func (m *Version) GetMinor() uint32 { + if m != nil { + return m.Minor + } + return 0 +} + +func (m *Version) GetPatch() uint32 { + if m != nil { + return m.Patch + } + return 0 +} + +// ////// +// ////// +type GetPluginInfoRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` +} + +func (m *GetPluginInfoRequest) Reset() { *m = GetPluginInfoRequest{} } +func (m *GetPluginInfoRequest) String() string { return proto.CompactTextString(m) } +func (*GetPluginInfoRequest) ProtoMessage() {} +func (*GetPluginInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *GetPluginInfoRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +type GetPluginInfoResponse struct { + // This field is REQUIRED. + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // This field is REQUIRED. Value of this field is opaque to the CO. + VendorVersion string `protobuf:"bytes,2,opt,name=vendor_version,json=vendorVersion" json:"vendor_version,omitempty"` + // This field is OPTIONAL. Values are opaque to the CO. + Manifest map[string]string `protobuf:"bytes,3,rep,name=manifest" json:"manifest,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *GetPluginInfoResponse) Reset() { *m = GetPluginInfoResponse{} } +func (m *GetPluginInfoResponse) String() string { return proto.CompactTextString(m) } +func (*GetPluginInfoResponse) ProtoMessage() {} +func (*GetPluginInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *GetPluginInfoResponse) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *GetPluginInfoResponse) GetVendorVersion() string { + if m != nil { + return m.VendorVersion + } + return "" +} + +func (m *GetPluginInfoResponse) GetManifest() map[string]string { + if m != nil { + return m.Manifest + } + return nil +} + +// ////// +// ////// +type CreateVolumeRequest struct { + // The API version assumed by the CO. This field is REQUIRED. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // The suggested name for the storage space. This field is REQUIRED. + // It serves two purposes: + // 1) Idempotency - This name is generated by the CO to achieve + // idempotency. If `CreateVolume` fails, the volume may or may not + // be provisioned. In this case, the CO may call `CreateVolume` + // again, with the same name, to ensure the volume exists. The + // Plugin should ensure that multiple `CreateVolume` calls for the + // same name do not result in more than one piece of storage + // provisioned corresponding to that name. If a Plugin is unable to + // enforce idempotency, the CO's error recovery logic could result + // in multiple (unused) volumes being provisioned. + // 2) Suggested name - Some storage systems allow callers to specify + // an identifier by which to refer to the newly provisioned + // storage. If a storage system supports this, it can optionally + // use this name as the identifier for the new volume. + Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + // This field is OPTIONAL. This allows the CO to specify the capacity + // requirement of the volume to be provisioned. If not specified, the + // Plugin MAY choose an implementation-defined capacity range. + CapacityRange *CapacityRange `protobuf:"bytes,3,opt,name=capacity_range,json=capacityRange" json:"capacity_range,omitempty"` + // The capabilities that the provisioned volume MUST have: the Plugin + // MUST provision a volume that could satisfy ALL of the + // capabilities specified in this list. The Plugin MUST assume that + // the CO MAY use the provisioned volume later with ANY of the + // capabilities specified in this list. This also enables the CO to do + // early validation: if ANY of the specified volume capabilities are + // not supported by the Plugin, the call SHALL fail. This field is + // REQUIRED. + VolumeCapabilities []*VolumeCapability `protobuf:"bytes,4,rep,name=volume_capabilities,json=volumeCapabilities" json:"volume_capabilities,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + // This field is OPTIONAL. The Plugin is responsible for parsing and + // validating these parameters. COs will treat these as opaque. + Parameters map[string]string `protobuf:"bytes,5,rep,name=parameters" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // End user credentials used to authenticate/authorize volume creation + // request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + UserCredentials map[string]string `protobuf:"bytes,6,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *CreateVolumeRequest) Reset() { *m = CreateVolumeRequest{} } +func (m *CreateVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*CreateVolumeRequest) ProtoMessage() {} +func (*CreateVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *CreateVolumeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *CreateVolumeRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *CreateVolumeRequest) GetCapacityRange() *CapacityRange { + if m != nil { + return m.CapacityRange + } + return nil +} + +func (m *CreateVolumeRequest) GetVolumeCapabilities() []*VolumeCapability { + if m != nil { + return m.VolumeCapabilities + } + return nil +} + +func (m *CreateVolumeRequest) GetParameters() map[string]string { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *CreateVolumeRequest) GetUserCredentials() map[string]string { + if m != nil { + return m.UserCredentials + } + return nil +} + +type CreateVolumeResponse struct { + // Contains all attributes of the newly created volume that are + // relevant to the CO along with information required by the Plugin + // to uniquely identify the volume. This field is REQUIRED. + VolumeInfo *VolumeInfo `protobuf:"bytes,1,opt,name=volume_info,json=volumeInfo" json:"volume_info,omitempty"` +} + +func (m *CreateVolumeResponse) Reset() { *m = CreateVolumeResponse{} } +func (m *CreateVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*CreateVolumeResponse) ProtoMessage() {} +func (*CreateVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *CreateVolumeResponse) GetVolumeInfo() *VolumeInfo { + if m != nil { + return m.VolumeInfo + } + return nil +} + +// Specify a capability of a volume. +type VolumeCapability struct { + // Specifies what API the volume will be accessed using. One of the + // following fields MUST be specified. + // + // Types that are valid to be assigned to AccessType: + // *VolumeCapability_Block + // *VolumeCapability_Mount + AccessType isVolumeCapability_AccessType `protobuf_oneof:"access_type"` + // This is a REQUIRED field. + AccessMode *VolumeCapability_AccessMode `protobuf:"bytes,3,opt,name=access_mode,json=accessMode" json:"access_mode,omitempty"` +} + +func (m *VolumeCapability) Reset() { *m = VolumeCapability{} } +func (m *VolumeCapability) String() string { return proto.CompactTextString(m) } +func (*VolumeCapability) ProtoMessage() {} +func (*VolumeCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +type isVolumeCapability_AccessType interface { + isVolumeCapability_AccessType() +} + +type VolumeCapability_Block struct { + Block *VolumeCapability_BlockVolume `protobuf:"bytes,1,opt,name=block,oneof"` +} +type VolumeCapability_Mount struct { + Mount *VolumeCapability_MountVolume `protobuf:"bytes,2,opt,name=mount,oneof"` +} + +func (*VolumeCapability_Block) isVolumeCapability_AccessType() {} +func (*VolumeCapability_Mount) isVolumeCapability_AccessType() {} + +func (m *VolumeCapability) GetAccessType() isVolumeCapability_AccessType { + if m != nil { + return m.AccessType + } + return nil +} + +func (m *VolumeCapability) GetBlock() *VolumeCapability_BlockVolume { + if x, ok := m.GetAccessType().(*VolumeCapability_Block); ok { + return x.Block + } + return nil +} + +func (m *VolumeCapability) GetMount() *VolumeCapability_MountVolume { + if x, ok := m.GetAccessType().(*VolumeCapability_Mount); ok { + return x.Mount + } + return nil +} + +func (m *VolumeCapability) GetAccessMode() *VolumeCapability_AccessMode { + if m != nil { + return m.AccessMode + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*VolumeCapability) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _VolumeCapability_OneofMarshaler, _VolumeCapability_OneofUnmarshaler, _VolumeCapability_OneofSizer, []interface{}{ + (*VolumeCapability_Block)(nil), + (*VolumeCapability_Mount)(nil), + } +} + +func _VolumeCapability_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*VolumeCapability) + // access_type + switch x := m.AccessType.(type) { + case *VolumeCapability_Block: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Block); err != nil { + return err + } + case *VolumeCapability_Mount: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Mount); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("VolumeCapability.AccessType has unexpected type %T", x) + } + return nil +} + +func _VolumeCapability_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*VolumeCapability) + switch tag { + case 1: // access_type.block + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(VolumeCapability_BlockVolume) + err := b.DecodeMessage(msg) + m.AccessType = &VolumeCapability_Block{msg} + return true, err + case 2: // access_type.mount + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(VolumeCapability_MountVolume) + err := b.DecodeMessage(msg) + m.AccessType = &VolumeCapability_Mount{msg} + return true, err + default: + return false, nil + } +} + +func _VolumeCapability_OneofSizer(msg proto.Message) (n int) { + m := msg.(*VolumeCapability) + // access_type + switch x := m.AccessType.(type) { + case *VolumeCapability_Block: + s := proto.Size(x.Block) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *VolumeCapability_Mount: + s := proto.Size(x.Mount) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// Indicate that the volume will be accessed via the block device API. +type VolumeCapability_BlockVolume struct { +} + +func (m *VolumeCapability_BlockVolume) Reset() { *m = VolumeCapability_BlockVolume{} } +func (m *VolumeCapability_BlockVolume) String() string { return proto.CompactTextString(m) } +func (*VolumeCapability_BlockVolume) ProtoMessage() {} +func (*VolumeCapability_BlockVolume) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} } + +// Indicate that the volume will be accessed via the filesystem API. +type VolumeCapability_MountVolume struct { + // The filesystem type. This field is OPTIONAL. + // An empty string is equal to an unspecified field value. + FsType string `protobuf:"bytes,1,opt,name=fs_type,json=fsType" json:"fs_type,omitempty"` + // The mount options that can be used for the volume. This field is + // OPTIONAL. `mount_flags` MAY contain sensitive information. + // Therefore, the CO and the Plugin MUST NOT leak this information + // to untrusted entities. The total size of this repeated field + // SHALL NOT exceed 4 KiB. + MountFlags []string `protobuf:"bytes,2,rep,name=mount_flags,json=mountFlags" json:"mount_flags,omitempty"` +} + +func (m *VolumeCapability_MountVolume) Reset() { *m = VolumeCapability_MountVolume{} } +func (m *VolumeCapability_MountVolume) String() string { return proto.CompactTextString(m) } +func (*VolumeCapability_MountVolume) ProtoMessage() {} +func (*VolumeCapability_MountVolume) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 1} } + +func (m *VolumeCapability_MountVolume) GetFsType() string { + if m != nil { + return m.FsType + } + return "" +} + +func (m *VolumeCapability_MountVolume) GetMountFlags() []string { + if m != nil { + return m.MountFlags + } + return nil +} + +// Specify how a volume can be accessed. +type VolumeCapability_AccessMode struct { + // This field is REQUIRED. + Mode VolumeCapability_AccessMode_Mode `protobuf:"varint,1,opt,name=mode,enum=csi.VolumeCapability_AccessMode_Mode" json:"mode,omitempty"` +} + +func (m *VolumeCapability_AccessMode) Reset() { *m = VolumeCapability_AccessMode{} } +func (m *VolumeCapability_AccessMode) String() string { return proto.CompactTextString(m) } +func (*VolumeCapability_AccessMode) ProtoMessage() {} +func (*VolumeCapability_AccessMode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 2} } + +func (m *VolumeCapability_AccessMode) GetMode() VolumeCapability_AccessMode_Mode { + if m != nil { + return m.Mode + } + return VolumeCapability_AccessMode_UNKNOWN +} + +// The capacity of the storage space in bytes. To specify an exact size, +// `required_bytes` and `limit_bytes` can be set to the same value. At +// least one of the these fields MUST be specified. +type CapacityRange struct { + // Volume must be at least this big. This field is OPTIONAL. + // A value of 0 is equal to an unspecified field value. + RequiredBytes uint64 `protobuf:"varint,1,opt,name=required_bytes,json=requiredBytes" json:"required_bytes,omitempty"` + // Volume must not be bigger than this. This field is OPTIONAL. + // A value of 0 is equal to an unspecified field value. + LimitBytes uint64 `protobuf:"varint,2,opt,name=limit_bytes,json=limitBytes" json:"limit_bytes,omitempty"` +} + +func (m *CapacityRange) Reset() { *m = CapacityRange{} } +func (m *CapacityRange) String() string { return proto.CompactTextString(m) } +func (*CapacityRange) ProtoMessage() {} +func (*CapacityRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *CapacityRange) GetRequiredBytes() uint64 { + if m != nil { + return m.RequiredBytes + } + return 0 +} + +func (m *CapacityRange) GetLimitBytes() uint64 { + if m != nil { + return m.LimitBytes + } + return 0 +} + +// The information about a provisioned volume. +type VolumeInfo struct { + // The capacity of the volume in bytes. This field is OPTIONAL. If not + // set (value of 0), it indicates that the capacity of the volume is + // unknown (e.g., NFS share). + CapacityBytes uint64 `protobuf:"varint,1,opt,name=capacity_bytes,json=capacityBytes" json:"capacity_bytes,omitempty"` + // Contains identity information for the created volume. This field is + // REQUIRED. The identity information will be used by the CO in + // subsequent calls to refer to the provisioned volume. + Id string `protobuf:"bytes,2,opt,name=id" json:"id,omitempty"` + // Attributes reflect static properties of a volume and MUST be passed + // to volume validation and publishing calls. + // Attributes SHALL be opaque to a CO. Attributes SHALL NOT be mutable + // and SHALL be safe for the CO to cache. Attributes SHOULD NOT + // contain sensitive information. Attributes MAY NOT uniquely identify + // a volume. A volume uniquely identified by `id` SHALL always report + // the same attributes. This field is OPTIONAL and when present MUST + // be passed to volume validation and publishing calls. + Attributes map[string]string `protobuf:"bytes,3,rep,name=attributes" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *VolumeInfo) Reset() { *m = VolumeInfo{} } +func (m *VolumeInfo) String() string { return proto.CompactTextString(m) } +func (*VolumeInfo) ProtoMessage() {} +func (*VolumeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +func (m *VolumeInfo) GetCapacityBytes() uint64 { + if m != nil { + return m.CapacityBytes + } + return 0 +} + +func (m *VolumeInfo) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *VolumeInfo) GetAttributes() map[string]string { + if m != nil { + return m.Attributes + } + return nil +} + +// ////// +// ////// +type DeleteVolumeRequest struct { + // The API version assumed by the CO. This field is REQUIRED. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // The ID of the volume to be deprovisioned. + // This field is REQUIRED. + VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` + // End user credentials used to authenticate/authorize volume deletion + // request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + UserCredentials map[string]string `protobuf:"bytes,3,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *DeleteVolumeRequest) Reset() { *m = DeleteVolumeRequest{} } +func (m *DeleteVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*DeleteVolumeRequest) ProtoMessage() {} +func (*DeleteVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +func (m *DeleteVolumeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *DeleteVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *DeleteVolumeRequest) GetUserCredentials() map[string]string { + if m != nil { + return m.UserCredentials + } + return nil +} + +type DeleteVolumeResponse struct { +} + +func (m *DeleteVolumeResponse) Reset() { *m = DeleteVolumeResponse{} } +func (m *DeleteVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*DeleteVolumeResponse) ProtoMessage() {} +func (*DeleteVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +// ////// +// ////// +type ControllerPublishVolumeRequest struct { + // The API version assumed by the CO. This field is REQUIRED. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // The ID of the volume to be used on a node. + // This field is REQUIRED. + VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` + // The ID of the node. This field is OPTIONAL. The CO SHALL set (or + // clear) this field to match the node ID returned by `GetNodeID`. + // `GetNodeID` is allowed to omit node ID from a successful response; + // in such cases the CO SHALL NOT specify this field. + NodeId string `protobuf:"bytes,3,opt,name=node_id,json=nodeId" json:"node_id,omitempty"` + // The capability of the volume the CO expects the volume to have. + // This is a REQUIRED field. + VolumeCapability *VolumeCapability `protobuf:"bytes,4,opt,name=volume_capability,json=volumeCapability" json:"volume_capability,omitempty"` + // Whether to publish the volume in readonly mode. This field is + // REQUIRED. + Readonly bool `protobuf:"varint,5,opt,name=readonly" json:"readonly,omitempty"` + // End user credentials used to authenticate/authorize controller + // publish request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + UserCredentials map[string]string `protobuf:"bytes,6,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Attributes of the volume to be used on a node. This field is + // OPTIONAL and MUST match the attributes of the VolumeInfo identified + // by `volume_id`. + VolumeAttributes map[string]string `protobuf:"bytes,7,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *ControllerPublishVolumeRequest) Reset() { *m = ControllerPublishVolumeRequest{} } +func (m *ControllerPublishVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*ControllerPublishVolumeRequest) ProtoMessage() {} +func (*ControllerPublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +func (m *ControllerPublishVolumeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *ControllerPublishVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *ControllerPublishVolumeRequest) GetNodeId() string { + if m != nil { + return m.NodeId + } + return "" +} + +func (m *ControllerPublishVolumeRequest) GetVolumeCapability() *VolumeCapability { + if m != nil { + return m.VolumeCapability + } + return nil +} + +func (m *ControllerPublishVolumeRequest) GetReadonly() bool { + if m != nil { + return m.Readonly + } + return false +} + +func (m *ControllerPublishVolumeRequest) GetUserCredentials() map[string]string { + if m != nil { + return m.UserCredentials + } + return nil +} + +func (m *ControllerPublishVolumeRequest) GetVolumeAttributes() map[string]string { + if m != nil { + return m.VolumeAttributes + } + return nil +} + +type ControllerPublishVolumeResponse struct { + // The SP specific information that will be passed to the Plugin in + // the subsequent `NodePublishVolume` call for the given volume. + // This information is opaque to the CO. This field is OPTIONAL. + PublishVolumeInfo map[string]string `protobuf:"bytes,1,rep,name=publish_volume_info,json=publishVolumeInfo" json:"publish_volume_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *ControllerPublishVolumeResponse) Reset() { *m = ControllerPublishVolumeResponse{} } +func (m *ControllerPublishVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*ControllerPublishVolumeResponse) ProtoMessage() {} +func (*ControllerPublishVolumeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{13} +} + +func (m *ControllerPublishVolumeResponse) GetPublishVolumeInfo() map[string]string { + if m != nil { + return m.PublishVolumeInfo + } + return nil +} + +// ////// +// ////// +type ControllerUnpublishVolumeRequest struct { + // The API version assumed by the CO. This field is REQUIRED. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // The ID of the volume. This field is REQUIRED. + VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` + // The ID of the node. This field is OPTIONAL. The CO SHALL set (or + // clear) this field to match the node ID returned by `GetNodeID`. + // `GetNodeID` is allowed to omit node ID from a successful response; + // in such cases the CO SHALL NOT specify this field. + // + // If `GetNodeID` does not omit node ID from a successful response, + // the CO MAY omit this field as well, indicating that it does not + // know which node the volume was previously used. The Plugin SHOULD + // return an Error if this is not supported. + NodeId string `protobuf:"bytes,3,opt,name=node_id,json=nodeId" json:"node_id,omitempty"` + // End user credentials used to authenticate/authorize controller + // unpublish request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + UserCredentials map[string]string `protobuf:"bytes,4,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *ControllerUnpublishVolumeRequest) Reset() { *m = ControllerUnpublishVolumeRequest{} } +func (m *ControllerUnpublishVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*ControllerUnpublishVolumeRequest) ProtoMessage() {} +func (*ControllerUnpublishVolumeRequest) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{14} +} + +func (m *ControllerUnpublishVolumeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *ControllerUnpublishVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *ControllerUnpublishVolumeRequest) GetNodeId() string { + if m != nil { + return m.NodeId + } + return "" +} + +func (m *ControllerUnpublishVolumeRequest) GetUserCredentials() map[string]string { + if m != nil { + return m.UserCredentials + } + return nil +} + +type ControllerUnpublishVolumeResponse struct { +} + +func (m *ControllerUnpublishVolumeResponse) Reset() { *m = ControllerUnpublishVolumeResponse{} } +func (m *ControllerUnpublishVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*ControllerUnpublishVolumeResponse) ProtoMessage() {} +func (*ControllerUnpublishVolumeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{15} +} + +// ////// +// ////// +type ValidateVolumeCapabilitiesRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // The ID of the volume to check. This field is REQUIRED. + VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` + // The capabilities that the CO wants to check for the volume. This + // call SHALL return "supported" only if all the volume capabilities + // specified below are supported. This field is REQUIRED. + VolumeCapabilities []*VolumeCapability `protobuf:"bytes,3,rep,name=volume_capabilities,json=volumeCapabilities" json:"volume_capabilities,omitempty"` + // Attributes of the volume to check. This field is OPTIONAL and MUST + // match the attributes of the VolumeInfo identified by `volume_id`. + VolumeAttributes map[string]string `protobuf:"bytes,4,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *ValidateVolumeCapabilitiesRequest) Reset() { *m = ValidateVolumeCapabilitiesRequest{} } +func (m *ValidateVolumeCapabilitiesRequest) String() string { return proto.CompactTextString(m) } +func (*ValidateVolumeCapabilitiesRequest) ProtoMessage() {} +func (*ValidateVolumeCapabilitiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{16} +} + +func (m *ValidateVolumeCapabilitiesRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *ValidateVolumeCapabilitiesRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *ValidateVolumeCapabilitiesRequest) GetVolumeCapabilities() []*VolumeCapability { + if m != nil { + return m.VolumeCapabilities + } + return nil +} + +func (m *ValidateVolumeCapabilitiesRequest) GetVolumeAttributes() map[string]string { + if m != nil { + return m.VolumeAttributes + } + return nil +} + +type ValidateVolumeCapabilitiesResponse struct { + // True if the Plugin supports the specified capabilities for the + // given volume. This field is REQUIRED. + Supported bool `protobuf:"varint,1,opt,name=supported" json:"supported,omitempty"` + // Message to the CO if `supported` above is false. This field is + // OPTIONAL. + // An empty string is equal to an unspecified field value. + Message string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` +} + +func (m *ValidateVolumeCapabilitiesResponse) Reset() { *m = ValidateVolumeCapabilitiesResponse{} } +func (m *ValidateVolumeCapabilitiesResponse) String() string { return proto.CompactTextString(m) } +func (*ValidateVolumeCapabilitiesResponse) ProtoMessage() {} +func (*ValidateVolumeCapabilitiesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{17} +} + +func (m *ValidateVolumeCapabilitiesResponse) GetSupported() bool { + if m != nil { + return m.Supported + } + return false +} + +func (m *ValidateVolumeCapabilitiesResponse) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + +// ////// +// ////// +type ListVolumesRequest struct { + // The API version assumed by the CO. This field is REQUIRED. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // If specified (non-zero value), the Plugin MUST NOT return more + // entries than this number in the response. If the actual number of + // entries is more than this number, the Plugin MUST set `next_token` + // in the response which can be used to get the next page of entries + // in the subsequent `ListVolumes` call. This field is OPTIONAL. If + // not specified (zero value), it means there is no restriction on the + // number of entries that can be returned. + MaxEntries uint32 `protobuf:"varint,2,opt,name=max_entries,json=maxEntries" json:"max_entries,omitempty"` + // A token to specify where to start paginating. Set this field to + // `next_token` returned by a previous `ListVolumes` call to get the + // next page of entries. This field is OPTIONAL. + // An empty string is equal to an unspecified field value. + StartingToken string `protobuf:"bytes,3,opt,name=starting_token,json=startingToken" json:"starting_token,omitempty"` +} + +func (m *ListVolumesRequest) Reset() { *m = ListVolumesRequest{} } +func (m *ListVolumesRequest) String() string { return proto.CompactTextString(m) } +func (*ListVolumesRequest) ProtoMessage() {} +func (*ListVolumesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } + +func (m *ListVolumesRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *ListVolumesRequest) GetMaxEntries() uint32 { + if m != nil { + return m.MaxEntries + } + return 0 +} + +func (m *ListVolumesRequest) GetStartingToken() string { + if m != nil { + return m.StartingToken + } + return "" +} + +type ListVolumesResponse struct { + Entries []*ListVolumesResponse_Entry `protobuf:"bytes,1,rep,name=entries" json:"entries,omitempty"` + // This token allows you to get the next page of entries for + // `ListVolumes` request. If the number of entries is larger than + // `max_entries`, use the `next_token` as a value for the + // `starting_token` field in the next `ListVolumes` request. This + // field is OPTIONAL. + // An empty string is equal to an unspecified field value. + NextToken string `protobuf:"bytes,2,opt,name=next_token,json=nextToken" json:"next_token,omitempty"` +} + +func (m *ListVolumesResponse) Reset() { *m = ListVolumesResponse{} } +func (m *ListVolumesResponse) String() string { return proto.CompactTextString(m) } +func (*ListVolumesResponse) ProtoMessage() {} +func (*ListVolumesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } + +func (m *ListVolumesResponse) GetEntries() []*ListVolumesResponse_Entry { + if m != nil { + return m.Entries + } + return nil +} + +func (m *ListVolumesResponse) GetNextToken() string { + if m != nil { + return m.NextToken + } + return "" +} + +type ListVolumesResponse_Entry struct { + VolumeInfo *VolumeInfo `protobuf:"bytes,1,opt,name=volume_info,json=volumeInfo" json:"volume_info,omitempty"` +} + +func (m *ListVolumesResponse_Entry) Reset() { *m = ListVolumesResponse_Entry{} } +func (m *ListVolumesResponse_Entry) String() string { return proto.CompactTextString(m) } +func (*ListVolumesResponse_Entry) ProtoMessage() {} +func (*ListVolumesResponse_Entry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19, 0} } + +func (m *ListVolumesResponse_Entry) GetVolumeInfo() *VolumeInfo { + if m != nil { + return m.VolumeInfo + } + return nil +} + +// ////// +// ////// +type GetCapacityRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // If specified, the Plugin SHALL report the capacity of the storage + // that can be used to provision volumes that satisfy ALL of the + // specified `volume_capabilities`. These are the same + // `volume_capabilities` the CO will use in `CreateVolumeRequest`. + // This field is OPTIONAL. + VolumeCapabilities []*VolumeCapability `protobuf:"bytes,2,rep,name=volume_capabilities,json=volumeCapabilities" json:"volume_capabilities,omitempty"` + // If specified, the Plugin SHALL report the capacity of the storage + // that can be used to provision volumes with the given Plugin + // specific `parameters`. These are the same `parameters` the CO will + // use in `CreateVolumeRequest`. This field is OPTIONAL. + Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *GetCapacityRequest) Reset() { *m = GetCapacityRequest{} } +func (m *GetCapacityRequest) String() string { return proto.CompactTextString(m) } +func (*GetCapacityRequest) ProtoMessage() {} +func (*GetCapacityRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } + +func (m *GetCapacityRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *GetCapacityRequest) GetVolumeCapabilities() []*VolumeCapability { + if m != nil { + return m.VolumeCapabilities + } + return nil +} + +func (m *GetCapacityRequest) GetParameters() map[string]string { + if m != nil { + return m.Parameters + } + return nil +} + +type GetCapacityResponse struct { + // The available capacity of the storage that can be used to + // provision volumes. If `volume_capabilities` or `parameters` is + // specified in the request, the Plugin SHALL take those into + // consideration when calculating the available capacity of the + // storage. This field is REQUIRED. + AvailableCapacity uint64 `protobuf:"varint,1,opt,name=available_capacity,json=availableCapacity" json:"available_capacity,omitempty"` +} + +func (m *GetCapacityResponse) Reset() { *m = GetCapacityResponse{} } +func (m *GetCapacityResponse) String() string { return proto.CompactTextString(m) } +func (*GetCapacityResponse) ProtoMessage() {} +func (*GetCapacityResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } + +func (m *GetCapacityResponse) GetAvailableCapacity() uint64 { + if m != nil { + return m.AvailableCapacity + } + return 0 +} + +// ////// +// ////// +type ControllerProbeRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` +} + +func (m *ControllerProbeRequest) Reset() { *m = ControllerProbeRequest{} } +func (m *ControllerProbeRequest) String() string { return proto.CompactTextString(m) } +func (*ControllerProbeRequest) ProtoMessage() {} +func (*ControllerProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } + +func (m *ControllerProbeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +type ControllerProbeResponse struct { +} + +func (m *ControllerProbeResponse) Reset() { *m = ControllerProbeResponse{} } +func (m *ControllerProbeResponse) String() string { return proto.CompactTextString(m) } +func (*ControllerProbeResponse) ProtoMessage() {} +func (*ControllerProbeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } + +// ////// +// ////// +type ControllerGetCapabilitiesRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` +} + +func (m *ControllerGetCapabilitiesRequest) Reset() { *m = ControllerGetCapabilitiesRequest{} } +func (m *ControllerGetCapabilitiesRequest) String() string { return proto.CompactTextString(m) } +func (*ControllerGetCapabilitiesRequest) ProtoMessage() {} +func (*ControllerGetCapabilitiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{24} +} + +func (m *ControllerGetCapabilitiesRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +type ControllerGetCapabilitiesResponse struct { + // All the capabilities that the controller service supports. This + // field is OPTIONAL. + Capabilities []*ControllerServiceCapability `protobuf:"bytes,2,rep,name=capabilities" json:"capabilities,omitempty"` +} + +func (m *ControllerGetCapabilitiesResponse) Reset() { *m = ControllerGetCapabilitiesResponse{} } +func (m *ControllerGetCapabilitiesResponse) String() string { return proto.CompactTextString(m) } +func (*ControllerGetCapabilitiesResponse) ProtoMessage() {} +func (*ControllerGetCapabilitiesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{25} +} + +func (m *ControllerGetCapabilitiesResponse) GetCapabilities() []*ControllerServiceCapability { + if m != nil { + return m.Capabilities + } + return nil +} + +// Specifies a capability of the controller service. +type ControllerServiceCapability struct { + // Types that are valid to be assigned to Type: + // *ControllerServiceCapability_Rpc + Type isControllerServiceCapability_Type `protobuf_oneof:"type"` +} + +func (m *ControllerServiceCapability) Reset() { *m = ControllerServiceCapability{} } +func (m *ControllerServiceCapability) String() string { return proto.CompactTextString(m) } +func (*ControllerServiceCapability) ProtoMessage() {} +func (*ControllerServiceCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } + +type isControllerServiceCapability_Type interface { + isControllerServiceCapability_Type() +} + +type ControllerServiceCapability_Rpc struct { + Rpc *ControllerServiceCapability_RPC `protobuf:"bytes,1,opt,name=rpc,oneof"` +} + +func (*ControllerServiceCapability_Rpc) isControllerServiceCapability_Type() {} + +func (m *ControllerServiceCapability) GetType() isControllerServiceCapability_Type { + if m != nil { + return m.Type + } + return nil +} + +func (m *ControllerServiceCapability) GetRpc() *ControllerServiceCapability_RPC { + if x, ok := m.GetType().(*ControllerServiceCapability_Rpc); ok { + return x.Rpc + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*ControllerServiceCapability) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _ControllerServiceCapability_OneofMarshaler, _ControllerServiceCapability_OneofUnmarshaler, _ControllerServiceCapability_OneofSizer, []interface{}{ + (*ControllerServiceCapability_Rpc)(nil), + } +} + +func _ControllerServiceCapability_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*ControllerServiceCapability) + // type + switch x := m.Type.(type) { + case *ControllerServiceCapability_Rpc: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Rpc); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("ControllerServiceCapability.Type has unexpected type %T", x) + } + return nil +} + +func _ControllerServiceCapability_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*ControllerServiceCapability) + switch tag { + case 1: // type.rpc + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ControllerServiceCapability_RPC) + err := b.DecodeMessage(msg) + m.Type = &ControllerServiceCapability_Rpc{msg} + return true, err + default: + return false, nil + } +} + +func _ControllerServiceCapability_OneofSizer(msg proto.Message) (n int) { + m := msg.(*ControllerServiceCapability) + // type + switch x := m.Type.(type) { + case *ControllerServiceCapability_Rpc: + s := proto.Size(x.Rpc) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type ControllerServiceCapability_RPC struct { + Type ControllerServiceCapability_RPC_Type `protobuf:"varint,1,opt,name=type,enum=csi.ControllerServiceCapability_RPC_Type" json:"type,omitempty"` +} + +func (m *ControllerServiceCapability_RPC) Reset() { *m = ControllerServiceCapability_RPC{} } +func (m *ControllerServiceCapability_RPC) String() string { return proto.CompactTextString(m) } +func (*ControllerServiceCapability_RPC) ProtoMessage() {} +func (*ControllerServiceCapability_RPC) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{26, 0} +} + +func (m *ControllerServiceCapability_RPC) GetType() ControllerServiceCapability_RPC_Type { + if m != nil { + return m.Type + } + return ControllerServiceCapability_RPC_UNKNOWN +} + +// ////// +// ////// +type NodePublishVolumeRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // The ID of the volume to publish. This field is REQUIRED. + VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` + // The CO SHALL set this field to the value returned by + // `ControllerPublishVolume` if the corresponding Controller Plugin + // has `PUBLISH_UNPUBLISH_VOLUME` controller capability, and SHALL be + // left unset if the corresponding Controller Plugin does not have + // this capability. This is an OPTIONAL field. + PublishVolumeInfo map[string]string `protobuf:"bytes,3,rep,name=publish_volume_info,json=publishVolumeInfo" json:"publish_volume_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // The path to which the volume will be published. It MUST be an + // absolute path in the root filesystem of the process serving this + // request. The CO SHALL ensure uniqueness of target_path per volume. + // This is a REQUIRED field. + TargetPath string `protobuf:"bytes,4,opt,name=target_path,json=targetPath" json:"target_path,omitempty"` + // The capability of the volume the CO expects the volume to have. + // This is a REQUIRED field. + VolumeCapability *VolumeCapability `protobuf:"bytes,5,opt,name=volume_capability,json=volumeCapability" json:"volume_capability,omitempty"` + // Whether to publish the volume in readonly mode. This field is + // REQUIRED. + Readonly bool `protobuf:"varint,6,opt,name=readonly" json:"readonly,omitempty"` + // End user credentials used to authenticate/authorize node + // publish request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + UserCredentials map[string]string `protobuf:"bytes,7,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Attributes of the volume to publish. This field is OPTIONAL and + // MUST match the attributes of the VolumeInfo identified by + // `volume_id`. + VolumeAttributes map[string]string `protobuf:"bytes,8,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *NodePublishVolumeRequest) Reset() { *m = NodePublishVolumeRequest{} } +func (m *NodePublishVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*NodePublishVolumeRequest) ProtoMessage() {} +func (*NodePublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } + +func (m *NodePublishVolumeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *NodePublishVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodePublishVolumeRequest) GetPublishVolumeInfo() map[string]string { + if m != nil { + return m.PublishVolumeInfo + } + return nil +} + +func (m *NodePublishVolumeRequest) GetTargetPath() string { + if m != nil { + return m.TargetPath + } + return "" +} + +func (m *NodePublishVolumeRequest) GetVolumeCapability() *VolumeCapability { + if m != nil { + return m.VolumeCapability + } + return nil +} + +func (m *NodePublishVolumeRequest) GetReadonly() bool { + if m != nil { + return m.Readonly + } + return false +} + +func (m *NodePublishVolumeRequest) GetUserCredentials() map[string]string { + if m != nil { + return m.UserCredentials + } + return nil +} + +func (m *NodePublishVolumeRequest) GetVolumeAttributes() map[string]string { + if m != nil { + return m.VolumeAttributes + } + return nil +} + +type NodePublishVolumeResponse struct { +} + +func (m *NodePublishVolumeResponse) Reset() { *m = NodePublishVolumeResponse{} } +func (m *NodePublishVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*NodePublishVolumeResponse) ProtoMessage() {} +func (*NodePublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } + +// ////// +// ////// +type NodeUnpublishVolumeRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // The ID of the volume. This field is REQUIRED. + VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` + // The path at which the volume was published. It MUST be an absolute + // path in the root filesystem of the process serving this request. + // This is a REQUIRED field. + TargetPath string `protobuf:"bytes,3,opt,name=target_path,json=targetPath" json:"target_path,omitempty"` + // End user credentials used to authenticate/authorize node + // unpublish request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // users to pass through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + // The total bytes this field must be less than 1 Mebibyte. + UserCredentials map[string]string `protobuf:"bytes,4,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *NodeUnpublishVolumeRequest) Reset() { *m = NodeUnpublishVolumeRequest{} } +func (m *NodeUnpublishVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*NodeUnpublishVolumeRequest) ProtoMessage() {} +func (*NodeUnpublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } + +func (m *NodeUnpublishVolumeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *NodeUnpublishVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodeUnpublishVolumeRequest) GetTargetPath() string { + if m != nil { + return m.TargetPath + } + return "" +} + +func (m *NodeUnpublishVolumeRequest) GetUserCredentials() map[string]string { + if m != nil { + return m.UserCredentials + } + return nil +} + +type NodeUnpublishVolumeResponse struct { +} + +func (m *NodeUnpublishVolumeResponse) Reset() { *m = NodeUnpublishVolumeResponse{} } +func (m *NodeUnpublishVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*NodeUnpublishVolumeResponse) ProtoMessage() {} +func (*NodeUnpublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } + +// ////// +// ////// +type GetNodeIDRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` +} + +func (m *GetNodeIDRequest) Reset() { *m = GetNodeIDRequest{} } +func (m *GetNodeIDRequest) String() string { return proto.CompactTextString(m) } +func (*GetNodeIDRequest) ProtoMessage() {} +func (*GetNodeIDRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } + +func (m *GetNodeIDRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +type GetNodeIDResponse struct { + // The ID of the node which SHALL be used by CO in + // `ControllerPublishVolume`. This is an OPTIONAL field. If unset, + // the CO SHALL leave the `node_id` field unset in + // `ControllerPublishVolume`. + NodeId string `protobuf:"bytes,1,opt,name=node_id,json=nodeId" json:"node_id,omitempty"` +} + +func (m *GetNodeIDResponse) Reset() { *m = GetNodeIDResponse{} } +func (m *GetNodeIDResponse) String() string { return proto.CompactTextString(m) } +func (*GetNodeIDResponse) ProtoMessage() {} +func (*GetNodeIDResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } + +func (m *GetNodeIDResponse) GetNodeId() string { + if m != nil { + return m.NodeId + } + return "" +} + +// ////// +// ////// +type NodeProbeRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` +} + +func (m *NodeProbeRequest) Reset() { *m = NodeProbeRequest{} } +func (m *NodeProbeRequest) String() string { return proto.CompactTextString(m) } +func (*NodeProbeRequest) ProtoMessage() {} +func (*NodeProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } + +func (m *NodeProbeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +type NodeProbeResponse struct { +} + +func (m *NodeProbeResponse) Reset() { *m = NodeProbeResponse{} } +func (m *NodeProbeResponse) String() string { return proto.CompactTextString(m) } +func (*NodeProbeResponse) ProtoMessage() {} +func (*NodeProbeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } + +// ////// +// ////// +type NodeGetCapabilitiesRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` +} + +func (m *NodeGetCapabilitiesRequest) Reset() { *m = NodeGetCapabilitiesRequest{} } +func (m *NodeGetCapabilitiesRequest) String() string { return proto.CompactTextString(m) } +func (*NodeGetCapabilitiesRequest) ProtoMessage() {} +func (*NodeGetCapabilitiesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } + +func (m *NodeGetCapabilitiesRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +type NodeGetCapabilitiesResponse struct { + // All the capabilities that the node service supports. This field + // is OPTIONAL. + Capabilities []*NodeServiceCapability `protobuf:"bytes,1,rep,name=capabilities" json:"capabilities,omitempty"` +} + +func (m *NodeGetCapabilitiesResponse) Reset() { *m = NodeGetCapabilitiesResponse{} } +func (m *NodeGetCapabilitiesResponse) String() string { return proto.CompactTextString(m) } +func (*NodeGetCapabilitiesResponse) ProtoMessage() {} +func (*NodeGetCapabilitiesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } + +func (m *NodeGetCapabilitiesResponse) GetCapabilities() []*NodeServiceCapability { + if m != nil { + return m.Capabilities + } + return nil +} + +// Specifies a capability of the node service. +type NodeServiceCapability struct { + // Types that are valid to be assigned to Type: + // *NodeServiceCapability_Rpc + Type isNodeServiceCapability_Type `protobuf_oneof:"type"` +} + +func (m *NodeServiceCapability) Reset() { *m = NodeServiceCapability{} } +func (m *NodeServiceCapability) String() string { return proto.CompactTextString(m) } +func (*NodeServiceCapability) ProtoMessage() {} +func (*NodeServiceCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } + +type isNodeServiceCapability_Type interface { + isNodeServiceCapability_Type() +} + +type NodeServiceCapability_Rpc struct { + Rpc *NodeServiceCapability_RPC `protobuf:"bytes,1,opt,name=rpc,oneof"` +} + +func (*NodeServiceCapability_Rpc) isNodeServiceCapability_Type() {} + +func (m *NodeServiceCapability) GetType() isNodeServiceCapability_Type { + if m != nil { + return m.Type + } + return nil +} + +func (m *NodeServiceCapability) GetRpc() *NodeServiceCapability_RPC { + if x, ok := m.GetType().(*NodeServiceCapability_Rpc); ok { + return x.Rpc + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*NodeServiceCapability) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _NodeServiceCapability_OneofMarshaler, _NodeServiceCapability_OneofUnmarshaler, _NodeServiceCapability_OneofSizer, []interface{}{ + (*NodeServiceCapability_Rpc)(nil), + } +} + +func _NodeServiceCapability_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*NodeServiceCapability) + // type + switch x := m.Type.(type) { + case *NodeServiceCapability_Rpc: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Rpc); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("NodeServiceCapability.Type has unexpected type %T", x) + } + return nil +} + +func _NodeServiceCapability_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*NodeServiceCapability) + switch tag { + case 1: // type.rpc + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(NodeServiceCapability_RPC) + err := b.DecodeMessage(msg) + m.Type = &NodeServiceCapability_Rpc{msg} + return true, err + default: + return false, nil + } +} + +func _NodeServiceCapability_OneofSizer(msg proto.Message) (n int) { + m := msg.(*NodeServiceCapability) + // type + switch x := m.Type.(type) { + case *NodeServiceCapability_Rpc: + s := proto.Size(x.Rpc) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type NodeServiceCapability_RPC struct { + Type NodeServiceCapability_RPC_Type `protobuf:"varint,1,opt,name=type,enum=csi.NodeServiceCapability_RPC_Type" json:"type,omitempty"` +} + +func (m *NodeServiceCapability_RPC) Reset() { *m = NodeServiceCapability_RPC{} } +func (m *NodeServiceCapability_RPC) String() string { return proto.CompactTextString(m) } +func (*NodeServiceCapability_RPC) ProtoMessage() {} +func (*NodeServiceCapability_RPC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37, 0} } + +func (m *NodeServiceCapability_RPC) GetType() NodeServiceCapability_RPC_Type { + if m != nil { + return m.Type + } + return NodeServiceCapability_RPC_UNKNOWN +} + +func init() { + proto.RegisterType((*GetSupportedVersionsRequest)(nil), "csi.GetSupportedVersionsRequest") + proto.RegisterType((*GetSupportedVersionsResponse)(nil), "csi.GetSupportedVersionsResponse") + proto.RegisterType((*Version)(nil), "csi.Version") + proto.RegisterType((*GetPluginInfoRequest)(nil), "csi.GetPluginInfoRequest") + proto.RegisterType((*GetPluginInfoResponse)(nil), "csi.GetPluginInfoResponse") + proto.RegisterType((*CreateVolumeRequest)(nil), "csi.CreateVolumeRequest") + proto.RegisterType((*CreateVolumeResponse)(nil), "csi.CreateVolumeResponse") + proto.RegisterType((*VolumeCapability)(nil), "csi.VolumeCapability") + proto.RegisterType((*VolumeCapability_BlockVolume)(nil), "csi.VolumeCapability.BlockVolume") + proto.RegisterType((*VolumeCapability_MountVolume)(nil), "csi.VolumeCapability.MountVolume") + proto.RegisterType((*VolumeCapability_AccessMode)(nil), "csi.VolumeCapability.AccessMode") + proto.RegisterType((*CapacityRange)(nil), "csi.CapacityRange") + proto.RegisterType((*VolumeInfo)(nil), "csi.VolumeInfo") + proto.RegisterType((*DeleteVolumeRequest)(nil), "csi.DeleteVolumeRequest") + proto.RegisterType((*DeleteVolumeResponse)(nil), "csi.DeleteVolumeResponse") + proto.RegisterType((*ControllerPublishVolumeRequest)(nil), "csi.ControllerPublishVolumeRequest") + proto.RegisterType((*ControllerPublishVolumeResponse)(nil), "csi.ControllerPublishVolumeResponse") + proto.RegisterType((*ControllerUnpublishVolumeRequest)(nil), "csi.ControllerUnpublishVolumeRequest") + proto.RegisterType((*ControllerUnpublishVolumeResponse)(nil), "csi.ControllerUnpublishVolumeResponse") + proto.RegisterType((*ValidateVolumeCapabilitiesRequest)(nil), "csi.ValidateVolumeCapabilitiesRequest") + proto.RegisterType((*ValidateVolumeCapabilitiesResponse)(nil), "csi.ValidateVolumeCapabilitiesResponse") + proto.RegisterType((*ListVolumesRequest)(nil), "csi.ListVolumesRequest") + proto.RegisterType((*ListVolumesResponse)(nil), "csi.ListVolumesResponse") + proto.RegisterType((*ListVolumesResponse_Entry)(nil), "csi.ListVolumesResponse.Entry") + proto.RegisterType((*GetCapacityRequest)(nil), "csi.GetCapacityRequest") + proto.RegisterType((*GetCapacityResponse)(nil), "csi.GetCapacityResponse") + proto.RegisterType((*ControllerProbeRequest)(nil), "csi.ControllerProbeRequest") + proto.RegisterType((*ControllerProbeResponse)(nil), "csi.ControllerProbeResponse") + proto.RegisterType((*ControllerGetCapabilitiesRequest)(nil), "csi.ControllerGetCapabilitiesRequest") + proto.RegisterType((*ControllerGetCapabilitiesResponse)(nil), "csi.ControllerGetCapabilitiesResponse") + proto.RegisterType((*ControllerServiceCapability)(nil), "csi.ControllerServiceCapability") + proto.RegisterType((*ControllerServiceCapability_RPC)(nil), "csi.ControllerServiceCapability.RPC") + proto.RegisterType((*NodePublishVolumeRequest)(nil), "csi.NodePublishVolumeRequest") + proto.RegisterType((*NodePublishVolumeResponse)(nil), "csi.NodePublishVolumeResponse") + proto.RegisterType((*NodeUnpublishVolumeRequest)(nil), "csi.NodeUnpublishVolumeRequest") + proto.RegisterType((*NodeUnpublishVolumeResponse)(nil), "csi.NodeUnpublishVolumeResponse") + proto.RegisterType((*GetNodeIDRequest)(nil), "csi.GetNodeIDRequest") + proto.RegisterType((*GetNodeIDResponse)(nil), "csi.GetNodeIDResponse") + proto.RegisterType((*NodeProbeRequest)(nil), "csi.NodeProbeRequest") + proto.RegisterType((*NodeProbeResponse)(nil), "csi.NodeProbeResponse") + proto.RegisterType((*NodeGetCapabilitiesRequest)(nil), "csi.NodeGetCapabilitiesRequest") + proto.RegisterType((*NodeGetCapabilitiesResponse)(nil), "csi.NodeGetCapabilitiesResponse") + proto.RegisterType((*NodeServiceCapability)(nil), "csi.NodeServiceCapability") + proto.RegisterType((*NodeServiceCapability_RPC)(nil), "csi.NodeServiceCapability.RPC") + proto.RegisterEnum("csi.VolumeCapability_AccessMode_Mode", VolumeCapability_AccessMode_Mode_name, VolumeCapability_AccessMode_Mode_value) + proto.RegisterEnum("csi.ControllerServiceCapability_RPC_Type", ControllerServiceCapability_RPC_Type_name, ControllerServiceCapability_RPC_Type_value) + proto.RegisterEnum("csi.NodeServiceCapability_RPC_Type", NodeServiceCapability_RPC_Type_name, NodeServiceCapability_RPC_Type_value) +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// Client API for Identity service + +type IdentityClient interface { + GetSupportedVersions(ctx context.Context, in *GetSupportedVersionsRequest, opts ...grpc.CallOption) (*GetSupportedVersionsResponse, error) + GetPluginInfo(ctx context.Context, in *GetPluginInfoRequest, opts ...grpc.CallOption) (*GetPluginInfoResponse, error) +} + +type identityClient struct { + cc *grpc.ClientConn +} + +func NewIdentityClient(cc *grpc.ClientConn) IdentityClient { + return &identityClient{cc} +} + +func (c *identityClient) GetSupportedVersions(ctx context.Context, in *GetSupportedVersionsRequest, opts ...grpc.CallOption) (*GetSupportedVersionsResponse, error) { + out := new(GetSupportedVersionsResponse) + err := grpc.Invoke(ctx, "/csi.Identity/GetSupportedVersions", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *identityClient) GetPluginInfo(ctx context.Context, in *GetPluginInfoRequest, opts ...grpc.CallOption) (*GetPluginInfoResponse, error) { + out := new(GetPluginInfoResponse) + err := grpc.Invoke(ctx, "/csi.Identity/GetPluginInfo", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Identity service + +type IdentityServer interface { + GetSupportedVersions(context.Context, *GetSupportedVersionsRequest) (*GetSupportedVersionsResponse, error) + GetPluginInfo(context.Context, *GetPluginInfoRequest) (*GetPluginInfoResponse, error) +} + +func RegisterIdentityServer(s *grpc.Server, srv IdentityServer) { + s.RegisterService(&_Identity_serviceDesc, srv) +} + +func _Identity_GetSupportedVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSupportedVersionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IdentityServer).GetSupportedVersions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Identity/GetSupportedVersions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IdentityServer).GetSupportedVersions(ctx, req.(*GetSupportedVersionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Identity_GetPluginInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetPluginInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IdentityServer).GetPluginInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Identity/GetPluginInfo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IdentityServer).GetPluginInfo(ctx, req.(*GetPluginInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Identity_serviceDesc = grpc.ServiceDesc{ + ServiceName: "csi.Identity", + HandlerType: (*IdentityServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSupportedVersions", + Handler: _Identity_GetSupportedVersions_Handler, + }, + { + MethodName: "GetPluginInfo", + Handler: _Identity_GetPluginInfo_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "csi.proto", +} + +// Client API for Controller service + +type ControllerClient interface { + CreateVolume(ctx context.Context, in *CreateVolumeRequest, opts ...grpc.CallOption) (*CreateVolumeResponse, error) + DeleteVolume(ctx context.Context, in *DeleteVolumeRequest, opts ...grpc.CallOption) (*DeleteVolumeResponse, error) + ControllerPublishVolume(ctx context.Context, in *ControllerPublishVolumeRequest, opts ...grpc.CallOption) (*ControllerPublishVolumeResponse, error) + ControllerUnpublishVolume(ctx context.Context, in *ControllerUnpublishVolumeRequest, opts ...grpc.CallOption) (*ControllerUnpublishVolumeResponse, error) + ValidateVolumeCapabilities(ctx context.Context, in *ValidateVolumeCapabilitiesRequest, opts ...grpc.CallOption) (*ValidateVolumeCapabilitiesResponse, error) + ListVolumes(ctx context.Context, in *ListVolumesRequest, opts ...grpc.CallOption) (*ListVolumesResponse, error) + GetCapacity(ctx context.Context, in *GetCapacityRequest, opts ...grpc.CallOption) (*GetCapacityResponse, error) + ControllerProbe(ctx context.Context, in *ControllerProbeRequest, opts ...grpc.CallOption) (*ControllerProbeResponse, error) + ControllerGetCapabilities(ctx context.Context, in *ControllerGetCapabilitiesRequest, opts ...grpc.CallOption) (*ControllerGetCapabilitiesResponse, error) +} + +type controllerClient struct { + cc *grpc.ClientConn +} + +func NewControllerClient(cc *grpc.ClientConn) ControllerClient { + return &controllerClient{cc} +} + +func (c *controllerClient) CreateVolume(ctx context.Context, in *CreateVolumeRequest, opts ...grpc.CallOption) (*CreateVolumeResponse, error) { + out := new(CreateVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Controller/CreateVolume", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) DeleteVolume(ctx context.Context, in *DeleteVolumeRequest, opts ...grpc.CallOption) (*DeleteVolumeResponse, error) { + out := new(DeleteVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Controller/DeleteVolume", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) ControllerPublishVolume(ctx context.Context, in *ControllerPublishVolumeRequest, opts ...grpc.CallOption) (*ControllerPublishVolumeResponse, error) { + out := new(ControllerPublishVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Controller/ControllerPublishVolume", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) ControllerUnpublishVolume(ctx context.Context, in *ControllerUnpublishVolumeRequest, opts ...grpc.CallOption) (*ControllerUnpublishVolumeResponse, error) { + out := new(ControllerUnpublishVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Controller/ControllerUnpublishVolume", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) ValidateVolumeCapabilities(ctx context.Context, in *ValidateVolumeCapabilitiesRequest, opts ...grpc.CallOption) (*ValidateVolumeCapabilitiesResponse, error) { + out := new(ValidateVolumeCapabilitiesResponse) + err := grpc.Invoke(ctx, "/csi.Controller/ValidateVolumeCapabilities", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) ListVolumes(ctx context.Context, in *ListVolumesRequest, opts ...grpc.CallOption) (*ListVolumesResponse, error) { + out := new(ListVolumesResponse) + err := grpc.Invoke(ctx, "/csi.Controller/ListVolumes", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) GetCapacity(ctx context.Context, in *GetCapacityRequest, opts ...grpc.CallOption) (*GetCapacityResponse, error) { + out := new(GetCapacityResponse) + err := grpc.Invoke(ctx, "/csi.Controller/GetCapacity", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) ControllerProbe(ctx context.Context, in *ControllerProbeRequest, opts ...grpc.CallOption) (*ControllerProbeResponse, error) { + out := new(ControllerProbeResponse) + err := grpc.Invoke(ctx, "/csi.Controller/ControllerProbe", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) ControllerGetCapabilities(ctx context.Context, in *ControllerGetCapabilitiesRequest, opts ...grpc.CallOption) (*ControllerGetCapabilitiesResponse, error) { + out := new(ControllerGetCapabilitiesResponse) + err := grpc.Invoke(ctx, "/csi.Controller/ControllerGetCapabilities", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Controller service + +type ControllerServer interface { + CreateVolume(context.Context, *CreateVolumeRequest) (*CreateVolumeResponse, error) + DeleteVolume(context.Context, *DeleteVolumeRequest) (*DeleteVolumeResponse, error) + ControllerPublishVolume(context.Context, *ControllerPublishVolumeRequest) (*ControllerPublishVolumeResponse, error) + ControllerUnpublishVolume(context.Context, *ControllerUnpublishVolumeRequest) (*ControllerUnpublishVolumeResponse, error) + ValidateVolumeCapabilities(context.Context, *ValidateVolumeCapabilitiesRequest) (*ValidateVolumeCapabilitiesResponse, error) + ListVolumes(context.Context, *ListVolumesRequest) (*ListVolumesResponse, error) + GetCapacity(context.Context, *GetCapacityRequest) (*GetCapacityResponse, error) + ControllerProbe(context.Context, *ControllerProbeRequest) (*ControllerProbeResponse, error) + ControllerGetCapabilities(context.Context, *ControllerGetCapabilitiesRequest) (*ControllerGetCapabilitiesResponse, error) +} + +func RegisterControllerServer(s *grpc.Server, srv ControllerServer) { + s.RegisterService(&_Controller_serviceDesc, srv) +} + +func _Controller_CreateVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).CreateVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Controller/CreateVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).CreateVolume(ctx, req.(*CreateVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_DeleteVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).DeleteVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Controller/DeleteVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).DeleteVolume(ctx, req.(*DeleteVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_ControllerPublishVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControllerPublishVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).ControllerPublishVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Controller/ControllerPublishVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).ControllerPublishVolume(ctx, req.(*ControllerPublishVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_ControllerUnpublishVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControllerUnpublishVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).ControllerUnpublishVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Controller/ControllerUnpublishVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).ControllerUnpublishVolume(ctx, req.(*ControllerUnpublishVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_ValidateVolumeCapabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ValidateVolumeCapabilitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).ValidateVolumeCapabilities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Controller/ValidateVolumeCapabilities", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).ValidateVolumeCapabilities(ctx, req.(*ValidateVolumeCapabilitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_ListVolumes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListVolumesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).ListVolumes(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Controller/ListVolumes", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).ListVolumes(ctx, req.(*ListVolumesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_GetCapacity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCapacityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).GetCapacity(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Controller/GetCapacity", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).GetCapacity(ctx, req.(*GetCapacityRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_ControllerProbe_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControllerProbeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).ControllerProbe(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Controller/ControllerProbe", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).ControllerProbe(ctx, req.(*ControllerProbeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_ControllerGetCapabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControllerGetCapabilitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).ControllerGetCapabilities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Controller/ControllerGetCapabilities", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).ControllerGetCapabilities(ctx, req.(*ControllerGetCapabilitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Controller_serviceDesc = grpc.ServiceDesc{ + ServiceName: "csi.Controller", + HandlerType: (*ControllerServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateVolume", + Handler: _Controller_CreateVolume_Handler, + }, + { + MethodName: "DeleteVolume", + Handler: _Controller_DeleteVolume_Handler, + }, + { + MethodName: "ControllerPublishVolume", + Handler: _Controller_ControllerPublishVolume_Handler, + }, + { + MethodName: "ControllerUnpublishVolume", + Handler: _Controller_ControllerUnpublishVolume_Handler, + }, + { + MethodName: "ValidateVolumeCapabilities", + Handler: _Controller_ValidateVolumeCapabilities_Handler, + }, + { + MethodName: "ListVolumes", + Handler: _Controller_ListVolumes_Handler, + }, + { + MethodName: "GetCapacity", + Handler: _Controller_GetCapacity_Handler, + }, + { + MethodName: "ControllerProbe", + Handler: _Controller_ControllerProbe_Handler, + }, + { + MethodName: "ControllerGetCapabilities", + Handler: _Controller_ControllerGetCapabilities_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "csi.proto", +} + +// Client API for Node service + +type NodeClient interface { + NodePublishVolume(ctx context.Context, in *NodePublishVolumeRequest, opts ...grpc.CallOption) (*NodePublishVolumeResponse, error) + NodeUnpublishVolume(ctx context.Context, in *NodeUnpublishVolumeRequest, opts ...grpc.CallOption) (*NodeUnpublishVolumeResponse, error) + GetNodeID(ctx context.Context, in *GetNodeIDRequest, opts ...grpc.CallOption) (*GetNodeIDResponse, error) + NodeProbe(ctx context.Context, in *NodeProbeRequest, opts ...grpc.CallOption) (*NodeProbeResponse, error) + NodeGetCapabilities(ctx context.Context, in *NodeGetCapabilitiesRequest, opts ...grpc.CallOption) (*NodeGetCapabilitiesResponse, error) +} + +type nodeClient struct { + cc *grpc.ClientConn +} + +func NewNodeClient(cc *grpc.ClientConn) NodeClient { + return &nodeClient{cc} +} + +func (c *nodeClient) NodePublishVolume(ctx context.Context, in *NodePublishVolumeRequest, opts ...grpc.CallOption) (*NodePublishVolumeResponse, error) { + out := new(NodePublishVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodePublishVolume", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeClient) NodeUnpublishVolume(ctx context.Context, in *NodeUnpublishVolumeRequest, opts ...grpc.CallOption) (*NodeUnpublishVolumeResponse, error) { + out := new(NodeUnpublishVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodeUnpublishVolume", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeClient) GetNodeID(ctx context.Context, in *GetNodeIDRequest, opts ...grpc.CallOption) (*GetNodeIDResponse, error) { + out := new(GetNodeIDResponse) + err := grpc.Invoke(ctx, "/csi.Node/GetNodeID", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeClient) NodeProbe(ctx context.Context, in *NodeProbeRequest, opts ...grpc.CallOption) (*NodeProbeResponse, error) { + out := new(NodeProbeResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodeProbe", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeClient) NodeGetCapabilities(ctx context.Context, in *NodeGetCapabilitiesRequest, opts ...grpc.CallOption) (*NodeGetCapabilitiesResponse, error) { + out := new(NodeGetCapabilitiesResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodeGetCapabilities", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Node service + +type NodeServer interface { + NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error) + NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error) + GetNodeID(context.Context, *GetNodeIDRequest) (*GetNodeIDResponse, error) + NodeProbe(context.Context, *NodeProbeRequest) (*NodeProbeResponse, error) + NodeGetCapabilities(context.Context, *NodeGetCapabilitiesRequest) (*NodeGetCapabilitiesResponse, error) +} + +func RegisterNodeServer(s *grpc.Server, srv NodeServer) { + s.RegisterService(&_Node_serviceDesc, srv) +} + +func _Node_NodePublishVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodePublishVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).NodePublishVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Node/NodePublishVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).NodePublishVolume(ctx, req.(*NodePublishVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Node_NodeUnpublishVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodeUnpublishVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).NodeUnpublishVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Node/NodeUnpublishVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).NodeUnpublishVolume(ctx, req.(*NodeUnpublishVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Node_GetNodeID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetNodeIDRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).GetNodeID(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Node/GetNodeID", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).GetNodeID(ctx, req.(*GetNodeIDRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Node_NodeProbe_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodeProbeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).NodeProbe(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Node/NodeProbe", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).NodeProbe(ctx, req.(*NodeProbeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Node_NodeGetCapabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodeGetCapabilitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).NodeGetCapabilities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Node/NodeGetCapabilities", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).NodeGetCapabilities(ctx, req.(*NodeGetCapabilitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Node_serviceDesc = grpc.ServiceDesc{ + ServiceName: "csi.Node", + HandlerType: (*NodeServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "NodePublishVolume", + Handler: _Node_NodePublishVolume_Handler, + }, + { + MethodName: "NodeUnpublishVolume", + Handler: _Node_NodeUnpublishVolume_Handler, + }, + { + MethodName: "GetNodeID", + Handler: _Node_GetNodeID_Handler, + }, + { + MethodName: "NodeProbe", + Handler: _Node_NodeProbe_Handler, + }, + { + MethodName: "NodeGetCapabilities", + Handler: _Node_NodeGetCapabilities_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "csi.proto", +} + +func init() { proto.RegisterFile("csi.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 1993 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x4b, 0x73, 0xe3, 0x58, + 0x15, 0xb6, 0x6c, 0xe7, 0xe1, 0xe3, 0x38, 0xed, 0x5c, 0xe7, 0xa1, 0x28, 0xfd, 0x70, 0xab, 0xa7, + 0x7b, 0x42, 0x15, 0xe3, 0xa2, 0x3c, 0x54, 0xd1, 0xe9, 0x9e, 0x19, 0x48, 0x6c, 0x4f, 0x62, 0x26, + 0x71, 0xa7, 0x14, 0xa7, 0x9b, 0x01, 0xa6, 0x84, 0x62, 0xdf, 0xa4, 0x45, 0xcb, 0x92, 0x47, 0x92, + 0x5d, 0xed, 0x3d, 0x4b, 0x16, 0xec, 0xd8, 0xc1, 0x72, 0xa0, 0x58, 0x02, 0xbf, 0x80, 0xbf, 0x00, + 0xac, 0xd9, 0xf2, 0x0f, 0xa8, 0x62, 0x43, 0xdd, 0x87, 0x64, 0x49, 0x96, 0x1c, 0x3b, 0x93, 0x1e, + 0x66, 0x27, 0x9d, 0xc7, 0x77, 0xcf, 0xe3, 0xde, 0x73, 0xce, 0x95, 0x20, 0xd7, 0x71, 0xf4, 0x4a, + 0xdf, 0xb6, 0x5c, 0x0b, 0x65, 0x3a, 0x8e, 0x2e, 0xdf, 0x83, 0x9d, 0x43, 0xec, 0x9e, 0x0d, 0xfa, + 0x7d, 0xcb, 0x76, 0x71, 0xf7, 0x25, 0xb6, 0x1d, 0xdd, 0x32, 0x1d, 0x05, 0x7f, 0x39, 0xc0, 0x8e, + 0x2b, 0xff, 0x0c, 0xee, 0xc6, 0xb3, 0x9d, 0xbe, 0x65, 0x3a, 0x18, 0x3d, 0x07, 0xe4, 0x78, 0x4c, + 0x75, 0xc8, 0xb9, 0xa2, 0x50, 0xce, 0xec, 0xe6, 0xab, 0x2b, 0x15, 0xb2, 0x16, 0x57, 0x51, 0xd6, + 0x9c, 0x28, 0x88, 0xfc, 0x19, 0x2c, 0xf1, 0x67, 0xb4, 0x0e, 0x0b, 0x3d, 0xed, 0x97, 0x96, 0x2d, + 0x0a, 0x65, 0x61, 0xb7, 0xa0, 0xb0, 0x17, 0x4a, 0xd5, 0x4d, 0xcb, 0x16, 0xd3, 0x9c, 0x4a, 0x5e, + 0x08, 0xb5, 0xaf, 0xb9, 0x9d, 0xd7, 0x62, 0x86, 0x51, 0xe9, 0x8b, 0xfc, 0x09, 0xac, 0x1f, 0x62, + 0xf7, 0xd4, 0x18, 0x5c, 0xe9, 0x66, 0xd3, 0xbc, 0xb4, 0xb8, 0x07, 0xe8, 0x09, 0x2c, 0x71, 0xbb, + 0x28, 0x76, 0xd4, 0x2c, 0x8f, 0x29, 0xff, 0x43, 0x80, 0x8d, 0x08, 0x00, 0xf7, 0x11, 0x41, 0xd6, + 0xd4, 0x7a, 0x98, 0xaa, 0xe7, 0x14, 0xfa, 0x8c, 0x1e, 0xc3, 0xea, 0x10, 0x9b, 0x5d, 0xcb, 0xf6, + 0x9c, 0xa6, 0x26, 0xe6, 0x94, 0x02, 0xa3, 0x7a, 0x6e, 0xd5, 0x61, 0xb9, 0xa7, 0x99, 0xfa, 0x25, + 0x76, 0x5c, 0x31, 0x43, 0x83, 0xb2, 0x4b, 0x57, 0x8f, 0x5d, 0xa8, 0x72, 0xc2, 0x45, 0x1b, 0xa6, + 0x6b, 0x8f, 0x14, 0x5f, 0x53, 0x7a, 0x0e, 0x85, 0x10, 0x0b, 0x15, 0x21, 0xf3, 0x06, 0x8f, 0xb8, + 0x41, 0xe4, 0x91, 0xc4, 0x64, 0xa8, 0x19, 0x03, 0xcc, 0xcd, 0x60, 0x2f, 0xcf, 0xd2, 0x4f, 0x05, + 0xf9, 0xbf, 0x19, 0x28, 0xd5, 0x6c, 0xac, 0xb9, 0xf8, 0xa5, 0x65, 0x0c, 0x7a, 0x78, 0xce, 0xb8, + 0xf8, 0xde, 0xa7, 0x03, 0xde, 0xef, 0xc1, 0x6a, 0x47, 0xeb, 0x6b, 0x1d, 0xdd, 0x1d, 0xa9, 0xb6, + 0x66, 0x5e, 0x61, 0x9a, 0x8a, 0x7c, 0x15, 0x51, 0x88, 0x1a, 0x67, 0x29, 0x84, 0xa3, 0x14, 0x3a, + 0xc1, 0x57, 0xf4, 0x29, 0x94, 0x86, 0xd4, 0x0e, 0x95, 0xd0, 0x2f, 0x74, 0x43, 0x77, 0x75, 0xec, + 0x88, 0x59, 0x1a, 0x9c, 0x0d, 0x66, 0x02, 0xe5, 0xd7, 0x3c, 0xf6, 0x48, 0x41, 0xc3, 0x30, 0x45, + 0xc7, 0x0e, 0x3a, 0x02, 0xe8, 0x6b, 0xb6, 0xd6, 0xc3, 0x2e, 0xb6, 0x1d, 0x71, 0x21, 0x10, 0xdb, + 0x18, 0x67, 0x2b, 0xa7, 0xbe, 0x28, 0x8b, 0x6d, 0x40, 0x17, 0xfd, 0x04, 0x8a, 0x03, 0x07, 0xdb, + 0x6a, 0xc7, 0xc6, 0x5d, 0x6c, 0xba, 0xba, 0x66, 0x38, 0xe2, 0x22, 0xc5, 0xfb, 0x20, 0x11, 0xef, + 0xdc, 0xc1, 0x76, 0x6d, 0x2c, 0xcf, 0x40, 0xef, 0x0c, 0xc2, 0x54, 0xe9, 0x63, 0xb8, 0x13, 0x59, + 0x78, 0x9e, 0xcc, 0x49, 0x07, 0xb0, 0x1e, 0xb7, 0xce, 0x5c, 0xd9, 0x3f, 0x82, 0xf5, 0xb0, 0xfd, + 0x7c, 0x4f, 0x7f, 0x0f, 0xf2, 0x3c, 0x0d, 0xba, 0x79, 0x69, 0xf1, 0x1d, 0x70, 0x27, 0x10, 0x7e, + 0xba, 0x31, 0x61, 0xe8, 0x3f, 0xcb, 0xbf, 0xcb, 0x42, 0x31, 0x9a, 0x19, 0xb4, 0x07, 0x0b, 0x17, + 0x86, 0xd5, 0x79, 0xc3, 0x01, 0x1e, 0xc6, 0xe6, 0xaf, 0x72, 0x40, 0x44, 0x18, 0xf5, 0x28, 0xa5, + 0x30, 0x0d, 0xa2, 0xda, 0xb3, 0x06, 0xa6, 0x4b, 0x6d, 0x4e, 0x54, 0x3d, 0x21, 0x22, 0x63, 0x55, + 0xaa, 0x81, 0xf6, 0x21, 0xaf, 0x75, 0x3a, 0xd8, 0x71, 0xd4, 0x9e, 0xd5, 0xf5, 0xf6, 0x5e, 0x39, + 0x1e, 0x60, 0x9f, 0x0a, 0x9e, 0x58, 0x5d, 0xac, 0x80, 0xe6, 0x3f, 0x4b, 0x05, 0xc8, 0x07, 0xac, + 0x92, 0x0e, 0x21, 0x1f, 0x58, 0x09, 0x6d, 0xc1, 0xd2, 0xa5, 0xa3, 0xba, 0xa3, 0xbe, 0x77, 0xe8, + 0x17, 0x2f, 0x9d, 0xf6, 0xa8, 0x8f, 0xd1, 0x03, 0xc8, 0x53, 0x13, 0xd4, 0x4b, 0x43, 0xbb, 0x72, + 0xc4, 0x74, 0x39, 0xb3, 0x9b, 0x53, 0x80, 0x92, 0x3e, 0x25, 0x14, 0xe9, 0xdf, 0x02, 0xc0, 0x78, + 0x49, 0xb4, 0x07, 0x59, 0x6a, 0x22, 0x41, 0x59, 0xad, 0x3e, 0xbe, 0xce, 0xc4, 0x0a, 0xb5, 0x93, + 0xaa, 0xc8, 0xbf, 0x17, 0x20, 0x4b, 0x31, 0xf2, 0xb0, 0x74, 0xde, 0xfa, 0xac, 0xf5, 0xe2, 0x55, + 0xab, 0x98, 0x42, 0x9b, 0x80, 0xce, 0x9a, 0xad, 0xc3, 0xe3, 0x86, 0xda, 0x7a, 0x51, 0x6f, 0xa8, + 0xaf, 0x94, 0x66, 0xbb, 0xa1, 0x14, 0x05, 0xb4, 0x03, 0x5b, 0x41, 0xba, 0xd2, 0xd8, 0xaf, 0x37, + 0x14, 0xf5, 0x45, 0xeb, 0xf8, 0xf3, 0x62, 0x1a, 0x49, 0xb0, 0x79, 0x72, 0x7e, 0xdc, 0x6e, 0x4e, + 0xf2, 0x32, 0xe8, 0x2e, 0x88, 0x01, 0x1e, 0xc7, 0xe0, 0xb0, 0x59, 0x02, 0x1b, 0xe0, 0xb2, 0x47, + 0xce, 0x5c, 0x38, 0x28, 0xf8, 0x69, 0x20, 0x91, 0x92, 0x5f, 0x41, 0x21, 0x74, 0xf2, 0x49, 0x8d, + 0xb4, 0xf1, 0x97, 0x03, 0xdd, 0xc6, 0x5d, 0xf5, 0x62, 0xe4, 0x62, 0x87, 0x86, 0x21, 0xab, 0x14, + 0x3c, 0xea, 0x01, 0x21, 0x92, 0x98, 0x1a, 0x7a, 0x4f, 0x77, 0xb9, 0x4c, 0x9a, 0xca, 0x00, 0x25, + 0x51, 0x01, 0xf9, 0x6f, 0x02, 0xc0, 0x78, 0x53, 0x12, 0x58, 0xbf, 0xf8, 0x84, 0x60, 0x3d, 0x2a, + 0x83, 0x5d, 0x85, 0xb4, 0xde, 0xe5, 0x07, 0x22, 0xad, 0x77, 0xd1, 0x0f, 0x01, 0x34, 0xd7, 0xb5, + 0xf5, 0x8b, 0x01, 0x51, 0x61, 0xc5, 0xf8, 0x41, 0x64, 0xc3, 0x57, 0xf6, 0x7d, 0x09, 0x5e, 0x27, + 0xc6, 0x2a, 0xe4, 0x34, 0x47, 0xd8, 0x73, 0x9d, 0xc4, 0xff, 0x08, 0x50, 0xaa, 0x63, 0x03, 0xdf, + 0xb4, 0x0e, 0xef, 0x40, 0xce, 0x3b, 0xb1, 0x9e, 0x5b, 0xcb, 0xfc, 0x78, 0x76, 0x63, 0x6b, 0x58, + 0x26, 0x50, 0xc3, 0x62, 0x16, 0x9e, 0xb1, 0x86, 0xdd, 0x46, 0x11, 0xda, 0x84, 0xf5, 0xb0, 0x01, + 0xac, 0x08, 0xc9, 0x7f, 0xc9, 0xc2, 0xfd, 0x9a, 0x65, 0xba, 0xb6, 0x65, 0x18, 0xd8, 0x3e, 0x1d, + 0x5c, 0x18, 0xba, 0xf3, 0xfa, 0x1d, 0x44, 0x67, 0x0b, 0x96, 0x4c, 0xab, 0x4b, 0x59, 0x19, 0x76, + 0x9c, 0xc9, 0x6b, 0xb3, 0x8b, 0x0e, 0x60, 0x2d, 0xda, 0x8c, 0x46, 0x62, 0x96, 0xae, 0x93, 0xd0, + 0x8a, 0x8a, 0xc3, 0x68, 0x09, 0x94, 0x60, 0xd9, 0xc6, 0x5a, 0xd7, 0x32, 0x8d, 0x91, 0xb8, 0x50, + 0x16, 0x76, 0x97, 0x15, 0xff, 0x1d, 0x75, 0x12, 0x5b, 0xcb, 0x53, 0xd6, 0x5a, 0xa6, 0x3a, 0x3f, + 0x5b, 0x86, 0xd0, 0xa5, 0xef, 0x44, 0x60, 0x7f, 0x2f, 0xd1, 0x55, 0xf6, 0x66, 0x59, 0x85, 0xbd, + 0x45, 0x77, 0x3e, 0x77, 0x74, 0x4c, 0xbe, 0x8d, 0x9d, 0x20, 0xd5, 0x60, 0x23, 0x76, 0xb9, 0xb9, + 0xb6, 0xd3, 0xdf, 0x05, 0x78, 0x90, 0xe8, 0x13, 0xef, 0x6f, 0x6f, 0xa0, 0xd4, 0x67, 0x0c, 0x35, + 0xdc, 0xe7, 0x48, 0x58, 0x9e, 0x4f, 0x0f, 0x0b, 0x9f, 0xc6, 0x42, 0x54, 0x52, 0x1d, 0x58, 0x60, + 0xd6, 0xfa, 0x51, 0xba, 0x54, 0x87, 0xcd, 0x78, 0xe1, 0xb9, 0xdc, 0xfa, 0x53, 0x1a, 0xca, 0x63, + 0x9b, 0xce, 0xcd, 0xfe, 0x37, 0x7f, 0x1e, 0x70, 0xcc, 0x7e, 0x65, 0x93, 0xd9, 0xb3, 0x48, 0xc8, + 0xe2, 0xcd, 0xfb, 0x06, 0x6b, 0xca, 0x23, 0x78, 0x38, 0xc5, 0x1a, 0x5e, 0x60, 0xfe, 0x95, 0x86, + 0x87, 0x2f, 0x35, 0x43, 0xef, 0xfa, 0x03, 0x50, 0x70, 0x86, 0xbc, 0xd5, 0x98, 0x26, 0xcc, 0xb5, + 0x99, 0x79, 0xe7, 0x5a, 0x3d, 0xee, 0x34, 0xb3, 0x1c, 0x7c, 0xc4, 0x50, 0xae, 0xf3, 0x67, 0xe6, + 0x03, 0x7d, 0x2b, 0x87, 0xf1, 0xe7, 0x20, 0x4f, 0xb3, 0x88, 0x1f, 0xc7, 0xbb, 0x90, 0xf3, 0xaf, + 0x7f, 0x14, 0x77, 0x59, 0x19, 0x13, 0x90, 0x08, 0x4b, 0x3d, 0xec, 0x38, 0xda, 0x95, 0x87, 0xef, + 0xbd, 0xca, 0xbf, 0x12, 0x00, 0x1d, 0xeb, 0x0e, 0x9f, 0xcb, 0xe6, 0xce, 0x18, 0x19, 0xd7, 0xb4, + 0xb7, 0x2a, 0x36, 0x5d, 0x5b, 0xe7, 0xa3, 0x45, 0x41, 0x81, 0x9e, 0xf6, 0xb6, 0xc1, 0x28, 0x64, + 0x96, 0x70, 0x5c, 0xcd, 0x76, 0x75, 0xf3, 0x4a, 0x75, 0xad, 0x37, 0xd8, 0xe4, 0x07, 0xa2, 0xe0, + 0x51, 0xdb, 0x84, 0x28, 0xff, 0x51, 0x80, 0x52, 0xc8, 0x0c, 0xee, 0xd6, 0x53, 0x58, 0xf2, 0xb0, + 0x59, 0x65, 0xb9, 0x4f, 0xed, 0x88, 0x11, 0xad, 0xb0, 0x24, 0x78, 0xe2, 0xe8, 0x1e, 0x80, 0x89, + 0xdf, 0xba, 0x7c, 0x51, 0xe6, 0x75, 0x8e, 0x50, 0xe8, 0x82, 0xd2, 0x1e, 0x2c, 0xb0, 0x54, 0xcc, + 0x3f, 0xa7, 0xff, 0x3a, 0x0d, 0xe8, 0x10, 0xbb, 0xfe, 0x28, 0x36, 0x67, 0xc8, 0x12, 0xf6, 0x71, + 0x7a, 0xde, 0x7d, 0x7c, 0x18, 0xba, 0x9f, 0xb1, 0x63, 0xf0, 0xbe, 0x77, 0xf7, 0x8d, 0x18, 0x37, + 0xed, 0x7a, 0xf6, 0x35, 0x2f, 0x51, 0x72, 0x1d, 0x4a, 0xa1, 0x05, 0x79, 0xe6, 0x3e, 0x00, 0xa4, + 0x0d, 0x35, 0xdd, 0xd0, 0x2e, 0x0c, 0xe6, 0x29, 0xe1, 0xf2, 0x41, 0x72, 0xcd, 0xe7, 0x78, 0x6a, + 0xf2, 0x8f, 0x60, 0x33, 0xd0, 0x2e, 0x6c, 0xeb, 0x62, 0xde, 0x82, 0x2c, 0x6f, 0xc3, 0xd6, 0x04, + 0x02, 0xaf, 0x52, 0x3f, 0x0e, 0xd6, 0x7d, 0x6e, 0xec, 0x0d, 0x6b, 0x94, 0xac, 0x07, 0xcb, 0xe2, + 0x04, 0x16, 0x77, 0xbe, 0x0e, 0x2b, 0x31, 0xc9, 0x2d, 0x47, 0x4a, 0xfc, 0x19, 0xb6, 0x87, 0x7a, + 0x27, 0x98, 0xe7, 0x90, 0x96, 0xfc, 0xdb, 0x34, 0xec, 0x4c, 0x91, 0x46, 0x4f, 0x21, 0x63, 0xf7, + 0x3b, 0xdc, 0xdc, 0xf7, 0xae, 0x03, 0xaf, 0x28, 0xa7, 0xb5, 0xa3, 0x94, 0x42, 0x54, 0xa4, 0xbf, + 0x0a, 0x90, 0x51, 0x4e, 0x6b, 0xe8, 0x63, 0xc8, 0xfa, 0x77, 0xb0, 0xd5, 0xea, 0x77, 0x66, 0x81, + 0xa8, 0x90, 0x6b, 0x9a, 0x42, 0xd5, 0x64, 0x0b, 0xb2, 0xf4, 0xd2, 0x16, 0xba, 0x40, 0x89, 0xb0, + 0x5e, 0x53, 0x1a, 0xfb, 0xed, 0x86, 0x5a, 0x6f, 0x1c, 0x37, 0xda, 0x0d, 0xf5, 0xe5, 0x8b, 0xe3, + 0xf3, 0x93, 0x46, 0x51, 0x20, 0x37, 0xa1, 0xd3, 0xf3, 0x83, 0xe3, 0xe6, 0xd9, 0x91, 0x7a, 0xde, + 0xf2, 0x9e, 0x38, 0x37, 0x8d, 0x8a, 0xb0, 0x72, 0xdc, 0x3c, 0x6b, 0x73, 0xc2, 0x59, 0x31, 0x43, + 0x28, 0x87, 0x8d, 0xb6, 0x5a, 0xdb, 0x3f, 0xdd, 0xaf, 0x35, 0xdb, 0x9f, 0x17, 0xb3, 0x07, 0x8b, + 0xcc, 0x5e, 0xf9, 0x9f, 0x0b, 0x20, 0xb6, 0xac, 0x2e, 0x7e, 0x77, 0x13, 0x6d, 0x37, 0x7e, 0xbc, + 0x61, 0xc7, 0xec, 0xfb, 0x14, 0x30, 0xc9, 0x80, 0xd9, 0xe7, 0x1a, 0x52, 0x3e, 0x5d, 0xcd, 0xbe, + 0xc2, 0xae, 0xda, 0xd7, 0xdc, 0xd7, 0x74, 0x30, 0xce, 0x29, 0xc0, 0x48, 0xa7, 0x9a, 0xfb, 0x3a, + 0x7e, 0x7e, 0x5e, 0xb8, 0xf9, 0xfc, 0xbc, 0x18, 0x99, 0x9f, 0xbf, 0x88, 0x99, 0x47, 0xd8, 0x64, + 0x5b, 0x9d, 0xee, 0xe3, 0x6c, 0x93, 0xf3, 0x2f, 0xe2, 0x7a, 0xed, 0x32, 0xc5, 0xff, 0x70, 0x3a, + 0xfe, 0xac, 0x2d, 0xf6, 0x56, 0x26, 0xc3, 0x6f, 0xcf, 0xe4, 0xbd, 0x03, 0xdb, 0x31, 0x21, 0xe1, + 0x65, 0xec, 0xab, 0x34, 0x48, 0x84, 0xfb, 0x2e, 0x27, 0xd7, 0xc8, 0x8e, 0xcc, 0x4c, 0xec, 0x48, + 0x35, 0x71, 0x82, 0x1d, 0x9f, 0x8a, 0xff, 0xfb, 0xec, 0x7a, 0x0f, 0x76, 0x62, 0xed, 0xe0, 0x81, + 0x7c, 0x06, 0xc5, 0x43, 0xec, 0x12, 0x89, 0x66, 0x7d, 0xde, 0xfa, 0xff, 0x5d, 0x58, 0x0b, 0xe8, + 0xf2, 0x7a, 0x1f, 0x98, 0xf7, 0x85, 0xe0, 0xbc, 0x4f, 0x56, 0xa2, 0xf9, 0xbc, 0x49, 0x43, 0x2b, + 0xc1, 0x5a, 0x40, 0x97, 0x9b, 0x5e, 0x67, 0x5b, 0xe0, 0x6b, 0x36, 0xb1, 0x2f, 0x58, 0x7c, 0x92, + 0xda, 0xd7, 0x27, 0x91, 0xf6, 0xc5, 0x46, 0x2f, 0xc9, 0xcf, 0xef, 0x75, 0x8d, 0xeb, 0x0f, 0x02, + 0x6c, 0xc4, 0xca, 0xa1, 0x6a, 0xb0, 0x65, 0xdd, 0x4f, 0x06, 0x0c, 0x36, 0xab, 0x33, 0xd6, 0xab, + 0x7e, 0x10, 0xea, 0x55, 0x8f, 0xa6, 0xeb, 0x06, 0xbb, 0x54, 0x29, 0xa6, 0x4b, 0x79, 0x9d, 0xa4, + 0xfa, 0x67, 0x01, 0x96, 0x9b, 0x74, 0xa3, 0xb9, 0xa4, 0x1a, 0xae, 0xc7, 0xfd, 0x8b, 0x41, 0x65, + 0x6f, 0xac, 0x4a, 0xfa, 0x8b, 0x23, 0x3d, 0x9c, 0x22, 0xc1, 0x33, 0x97, 0x42, 0x47, 0x50, 0x08, + 0xfd, 0x96, 0x40, 0xdb, 0x71, 0xbf, 0x2a, 0x18, 0xa0, 0x94, 0xfc, 0x17, 0x43, 0x4e, 0x55, 0xbf, + 0x5a, 0x04, 0x18, 0xf7, 0x69, 0xd4, 0x80, 0x95, 0xe0, 0x37, 0x68, 0x24, 0x26, 0x7d, 0x56, 0x97, + 0xb6, 0x63, 0x38, 0xbe, 0x7d, 0x0d, 0x58, 0x09, 0x7e, 0x45, 0xe2, 0x30, 0x31, 0x5f, 0xb6, 0x38, + 0x4c, 0xec, 0x27, 0xa7, 0x14, 0xba, 0x0c, 0x0d, 0x62, 0xc1, 0x03, 0x88, 0x1e, 0xcd, 0xf0, 0xb9, + 0x44, 0x7a, 0x6f, 0x96, 0x8f, 0x07, 0x72, 0x0a, 0x19, 0xb0, 0x9d, 0x78, 0x41, 0x45, 0x8f, 0x67, + 0xba, 0x4e, 0x4b, 0x4f, 0xae, 0x13, 0xf3, 0x57, 0xb3, 0x40, 0x4a, 0xbe, 0x86, 0xa1, 0x27, 0xb3, + 0xdd, 0x1c, 0xa5, 0xf7, 0xaf, 0x95, 0xf3, 0x17, 0x3c, 0x80, 0x7c, 0xe0, 0x9a, 0x83, 0xb6, 0x26, + 0x2f, 0x3e, 0x0c, 0x52, 0x4c, 0xba, 0x11, 0x31, 0x8c, 0xc0, 0x6c, 0xce, 0x31, 0x26, 0xaf, 0x07, + 0x1c, 0x23, 0x66, 0x8c, 0x97, 0x53, 0xa8, 0x05, 0x77, 0x22, 0x73, 0x35, 0xda, 0x89, 0x66, 0x28, + 0x50, 0xde, 0xa4, 0xbb, 0xf1, 0xcc, 0xf8, 0xb4, 0x45, 0x2a, 0xd0, 0x44, 0xda, 0xe2, 0xeb, 0xdc, + 0x44, 0xda, 0x12, 0x0a, 0x99, 0x9c, 0xaa, 0xfe, 0x26, 0x03, 0x59, 0x52, 0x25, 0x50, 0x9b, 0x57, + 0xd3, 0xd0, 0x2e, 0xb9, 0x37, 0x75, 0x08, 0x91, 0xee, 0x27, 0xb1, 0x7d, 0x67, 0x7e, 0x0a, 0xa5, + 0x98, 0x46, 0x83, 0x1e, 0x5c, 0xd3, 0x0a, 0xa5, 0x72, 0xb2, 0x80, 0x8f, 0xfd, 0x11, 0xe4, 0xfc, + 0x4e, 0x83, 0x36, 0xbc, 0x0c, 0x85, 0xba, 0x96, 0xb4, 0x19, 0x25, 0x07, 0xb5, 0xfd, 0xee, 0xc1, + 0xb5, 0xa3, 0x9d, 0x88, 0x6b, 0x4f, 0x36, 0x19, 0xdf, 0xaf, 0x68, 0x7a, 0xc6, 0x7e, 0x25, 0x24, + 0xa6, 0x9c, 0x2c, 0xe0, 0x61, 0x5f, 0x2c, 0xd2, 0x9f, 0xe3, 0x1f, 0xfe, 0x2f, 0x00, 0x00, 0xff, + 0xff, 0x17, 0x25, 0x65, 0xbe, 0x29, 0x1f, 0x00, 0x00, +} diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index c5ad91e67d660..0f552589f48b6 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -448,6 +448,9 @@ type PersistentVolumeSource struct { // More info: https://releases.k8s.io/HEAD/examples/volumes/storageos/README.md // +optional StorageOS *StorageOSPersistentVolumeSource `json:"storageos,omitempty" protobuf:"bytes,21,opt,name=storageos"` + // CSI represents storage that handled by an external CSI driver + // +optional + CSI *CSIPersistentVolumeSource `json:"csi,omitempty" protobuf:"bytes,22,opt,name=csi"` } const ( @@ -1621,6 +1624,36 @@ type LocalVolumeSource struct { Path string `json:"path" protobuf:"bytes,1,opt,name=path"` } +// Represents storage that is managed by an external CSI volume driver +type CSIPersistentVolumeSource struct { + // Driver is the name of the driver to use for this volume. + // Required. + Driver string `json:"driver" protobuf:"bytes,1,opt,name=driver"` + + // VolumeHandle is the unique volume name returned by the CSI volume + // plugin’s CreateVolume to refer to the volume on all subsequent calls. + VolumeHandle string `json:"volumeHandle" protobuf:"bytes,2,opt,name=volumeHandle"` + + // Optional: MountSecretRef is a reference to the secret object containing + // sensitive information to pass to the CSI driver during NodePublish. + // This may be empty if no secret is required. If the secret object contains + // more than one secret, all secrets are passed. + // +optional + MountSecretRef *SecretReference `json:"mountSecretRef,omitempty" protobuf:"bytes,3,opt,name=mountSecretRef"` + + // Optional: AttachSecretRef is a reference to the secret object containing + // sensitive information to pass to the CSI driver during ControllerPublish. + // This may be empty if no secret is required. If the secret object contains + // more than one secret, all secrets are passed. + // +optional + AttachSecretRef *SecretReference `json:"attachSecretRef,omitempty" protobuf:"bytes,4,opt,name=attachSecretRef"` + + // Optional: The value to pass to ControllerPublishVolumeRequest. + // Defaults to false (read/write). + // +optional + ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,5,opt,name=readOnly"` +} + // ContainerPort represents a network port in a single container. type ContainerPort struct { // If specified, this must be an IANA_SVC_NAME and unique within the pod. Each From 9da51283b125afc315bc76fe02450f6013c2512e Mon Sep 17 00:00:00 2001 From: Vladimir Vivien Date: Tue, 24 Oct 2017 22:48:13 -0400 Subject: [PATCH 2/2] CSI - Generated source code This commit tracks all auto-generated sources. --- api/openapi-spec/swagger.json | 25 + api/swagger-spec/v1.json | 26 + cmd/kube-controller-manager/app/BUILD | 1 + cmd/kubelet/app/BUILD | 1 + docs/api-reference/v1/definitions.html | 55 + pkg/apis/core/types.go | 14 - pkg/apis/core/v1/zz_generated.conversion.go | 28 + pkg/apis/core/validation/validation.go | 2 +- pkg/apis/core/zz_generated.deepcopy.go | 25 + pkg/volume/BUILD | 1 + pkg/volume/csi/BUILD | 72 + pkg/volume/csi/fake/BUILD | 27 + pkg/volume/csi/proto/csi/BUILD | 27 + .../src/k8s.io/api/core/v1/generated.pb.go | 2489 +++++++++-------- .../src/k8s.io/api/core/v1/generated.proto | 20 + staging/src/k8s.io/api/core/v1/types.go | 16 +- .../core/v1/types_swagger_doc_generated.go | 12 + .../api/core/v1/zz_generated.deepcopy.go | 25 + 18 files changed, 1715 insertions(+), 1151 deletions(-) create mode 100644 pkg/volume/csi/BUILD create mode 100644 pkg/volume/csi/fake/BUILD create mode 100644 pkg/volume/csi/proto/csi/BUILD diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 329931c1101bb..adfedea56d94d 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -73464,6 +73464,27 @@ } ] }, + "io.k8s.api.core.v1.CSIPersistentVolumeSource": { + "description": "Represents storage that is managed by an external CSI volume driver", + "required": [ + "driver", + "volumeHandle" + ], + "properties": { + "driver": { + "description": "Driver is the name of the driver to use for this volume. Required.", + "type": "string" + }, + "readOnly": { + "description": "Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write).", + "type": "boolean" + }, + "volumeHandle": { + "description": "VolumeHandle is the unique volume name returned by the CSI volume plugin’s CreateVolume to refer to the volume on all subsequent calls.", + "type": "string" + } + } + }, "io.k8s.api.core.v1.Capabilities": { "description": "Adds and removes POSIX capabilities from running containers.", "properties": { @@ -75812,6 +75833,10 @@ "description": "ClaimRef is part of a bi-directional binding between PersistentVolume and PersistentVolumeClaim. Expected to be non-nil when bound. claim.VolumeName is the authoritative bind between PV and PVC. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#binding", "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference" }, + "csi": { + "description": "CSI represents storage that handled by an external CSI driver", + "$ref": "#/definitions/io.k8s.api.core.v1.CSIPersistentVolumeSource" + }, "fc": { "description": "FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod.", "$ref": "#/definitions/io.k8s.api.core.v1.FCVolumeSource" diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index de18ce7a9d5ef..41cb363e6d5d0 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -20592,6 +20592,10 @@ "$ref": "v1.StorageOSPersistentVolumeSource", "description": "StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod More info: https://releases.k8s.io/HEAD/examples/volumes/storageos/README.md" }, + "csi": { + "$ref": "v1.CSIPersistentVolumeSource", + "description": "CSI represents storage that handled by an external CSI driver" + }, "accessModes": { "type": "array", "items": { @@ -21250,6 +21254,28 @@ } } }, + "v1.CSIPersistentVolumeSource": { + "id": "v1.CSIPersistentVolumeSource", + "description": "Represents storage that is managed by an external CSI volume driver", + "required": [ + "driver", + "volumeHandle" + ], + "properties": { + "driver": { + "type": "string", + "description": "Driver is the name of the driver to use for this volume. Required." + }, + "volumeHandle": { + "type": "string", + "description": "VolumeHandle is the unique volume name returned by the CSI volume plugin’s CreateVolume to refer to the volume on all subsequent calls." + }, + "readOnly": { + "type": "boolean", + "description": "Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write)." + } + } + }, "v1.PersistentVolumeStatus": { "id": "v1.PersistentVolumeStatus", "description": "PersistentVolumeStatus is the current status of a persistent volume.", diff --git a/cmd/kube-controller-manager/app/BUILD b/cmd/kube-controller-manager/app/BUILD index 42436a545db1f..013a8b724c7d7 100644 --- a/cmd/kube-controller-manager/app/BUILD +++ b/cmd/kube-controller-manager/app/BUILD @@ -90,6 +90,7 @@ go_library( "//pkg/volume/azure_dd:go_default_library", "//pkg/volume/azure_file:go_default_library", "//pkg/volume/cinder:go_default_library", + "//pkg/volume/csi:go_default_library", "//pkg/volume/fc:go_default_library", "//pkg/volume/flexvolume:go_default_library", "//pkg/volume/flocker:go_default_library", diff --git a/cmd/kubelet/app/BUILD b/cmd/kubelet/app/BUILD index 14946f7c63500..0d033bd4550ab 100644 --- a/cmd/kubelet/app/BUILD +++ b/cmd/kubelet/app/BUILD @@ -77,6 +77,7 @@ go_library( "//pkg/volume/cephfs:go_default_library", "//pkg/volume/cinder:go_default_library", "//pkg/volume/configmap:go_default_library", + "//pkg/volume/csi:go_default_library", "//pkg/volume/downwardapi:go_default_library", "//pkg/volume/empty_dir:go_default_library", "//pkg/volume/fc:go_default_library", diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index b4770591dd4fe..8c8db25fdfa7f 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -3651,6 +3651,54 @@

v1.EndpointSubset

+ +
+

v1.CSIPersistentVolumeSource

+
+

Represents storage that is managed by an external CSI volume driver

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

driver

Driver is the name of the driver to use for this volume. Required.

true

string

volumeHandle

VolumeHandle is the unique volume name returned by the CSI volume plugin’s CreateVolume to refer to the volume on all subsequent calls.

true

string

readOnly

Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write).

false

boolean

false

+

v1.PersistentVolumeClaimCondition

@@ -7745,6 +7793,13 @@

v1.PersistentVolumeSpec

+

csi

+

CSI represents storage that handled by an external CSI driver

+

false

+

v1.CSIPersistentVolumeSource

+ + +

accessModes

AccessModes contains all ways the volume can be mounted. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes

false

diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index 2876e9ea9ffe7..58c19a79c9bf9 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -1517,20 +1517,6 @@ type CSIPersistentVolumeSource struct { // Required. VolumeHandle string - // Optional: MountSecretRef is a reference to the secret object containing - // sensitive information to pass to the CSI driver during NodePublish. - // This may be empty if no secret is required. If the secret object contains - // more than one secret, all secrets are passed. - // +optional - MountSecretRef *SecretReference - - // Optional: AttachSecretRef is a reference to the secret object containing - // sensitive information to pass to the CSI driver during ControllerPublish. - // This may be empty if no secret is required. If the secret object contains - // more than one secret, all secrets are passed. - // +optional - AttachSecretRef *SecretReference - // Optional: The value to pass to ControllerPublishVolumeRequest. // Defaults to false (read/write). // +optional diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index 22f7487db408b..2c086be3a0610 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -55,6 +55,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_core_AzureFileVolumeSource_To_v1_AzureFileVolumeSource, Convert_v1_Binding_To_core_Binding, Convert_core_Binding_To_v1_Binding, + Convert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource, + Convert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource, Convert_v1_Capabilities_To_core_Capabilities, Convert_core_Capabilities_To_v1_Capabilities, Convert_v1_CephFSPersistentVolumeSource_To_core_CephFSPersistentVolumeSource, @@ -600,6 +602,30 @@ func Convert_core_Binding_To_v1_Binding(in *core.Binding, out *v1.Binding, s con return autoConvert_core_Binding_To_v1_Binding(in, out, s) } +func autoConvert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource(in *v1.CSIPersistentVolumeSource, out *core.CSIPersistentVolumeSource, s conversion.Scope) error { + out.Driver = in.Driver + out.VolumeHandle = in.VolumeHandle + out.ReadOnly = in.ReadOnly + return nil +} + +// Convert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource is an autogenerated conversion function. +func Convert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource(in *v1.CSIPersistentVolumeSource, out *core.CSIPersistentVolumeSource, s conversion.Scope) error { + return autoConvert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource(in, out, s) +} + +func autoConvert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource(in *core.CSIPersistentVolumeSource, out *v1.CSIPersistentVolumeSource, s conversion.Scope) error { + out.Driver = in.Driver + out.VolumeHandle = in.VolumeHandle + out.ReadOnly = in.ReadOnly + return nil +} + +// Convert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource is an autogenerated conversion function. +func Convert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource(in *core.CSIPersistentVolumeSource, out *v1.CSIPersistentVolumeSource, s conversion.Scope) error { + return autoConvert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource(in, out, s) +} + func autoConvert_v1_Capabilities_To_core_Capabilities(in *v1.Capabilities, out *core.Capabilities, s conversion.Scope) error { out.Add = *(*[]core.Capability)(unsafe.Pointer(&in.Add)) out.Drop = *(*[]core.Capability)(unsafe.Pointer(&in.Drop)) @@ -3144,6 +3170,7 @@ func autoConvert_v1_PersistentVolumeSource_To_core_PersistentVolumeSource(in *v1 out.ScaleIO = (*core.ScaleIOPersistentVolumeSource)(unsafe.Pointer(in.ScaleIO)) out.Local = (*core.LocalVolumeSource)(unsafe.Pointer(in.Local)) out.StorageOS = (*core.StorageOSPersistentVolumeSource)(unsafe.Pointer(in.StorageOS)) + out.CSI = (*core.CSIPersistentVolumeSource)(unsafe.Pointer(in.CSI)) return nil } @@ -3174,6 +3201,7 @@ func autoConvert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource(in *co out.ScaleIO = (*v1.ScaleIOPersistentVolumeSource)(unsafe.Pointer(in.ScaleIO)) out.Local = (*v1.LocalVolumeSource)(unsafe.Pointer(in.Local)) out.StorageOS = (*v1.StorageOSPersistentVolumeSource)(unsafe.Pointer(in.StorageOS)) + out.CSI = (*v1.CSIPersistentVolumeSource)(unsafe.Pointer(in.CSI)) return nil } diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index e7ccebc06315c..59a922e5a8611 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -1318,7 +1318,7 @@ func validateStorageOSPersistentVolumeSource(storageos *core.StorageOSPersistent return allErrs } -func validateCSIPersistentVolumeSource(csi *api.CSIPersistentVolumeSource, fldPath *field.Path) field.ErrorList { +func validateCSIPersistentVolumeSource(csi *core.CSIPersistentVolumeSource, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} if len(csi.Driver) == 0 { allErrs = append(allErrs, field.Required(fldPath.Child("driver"), "")) diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index b149b365fb162..7945f5a54e4b3 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -246,6 +246,22 @@ func (in *Binding) DeepCopyObject() runtime.Object { } } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CSIPersistentVolumeSource) DeepCopyInto(out *CSIPersistentVolumeSource) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSIPersistentVolumeSource. +func (in *CSIPersistentVolumeSource) DeepCopy() *CSIPersistentVolumeSource { + if in == nil { + return nil + } + out := new(CSIPersistentVolumeSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Capabilities) DeepCopyInto(out *Capabilities) { *out = *in @@ -3159,6 +3175,15 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { (*in).DeepCopyInto(*out) } } + if in.CSI != nil { + in, out := &in.CSI, &out.CSI + if *in == nil { + *out = nil + } else { + *out = new(CSIPersistentVolumeSource) + **out = **in + } + } return } diff --git a/pkg/volume/BUILD b/pkg/volume/BUILD index 020a644d01bcb..8b7ef61afc3b3 100644 --- a/pkg/volume/BUILD +++ b/pkg/volume/BUILD @@ -108,6 +108,7 @@ filegroup( "//pkg/volume/cephfs:all-srcs", "//pkg/volume/cinder:all-srcs", "//pkg/volume/configmap:all-srcs", + "//pkg/volume/csi:all-srcs", "//pkg/volume/downwardapi:all-srcs", "//pkg/volume/empty_dir:all-srcs", "//pkg/volume/fc:all-srcs", diff --git a/pkg/volume/csi/BUILD b/pkg/volume/csi/BUILD new file mode 100644 index 0000000000000..8a2963e7e3f96 --- /dev/null +++ b/pkg/volume/csi/BUILD @@ -0,0 +1,72 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "csi_attacher.go", + "csi_client.go", + "csi_mounter.go", + "csi_plugin.go", + ], + importpath = "k8s.io/kubernetes/pkg/volume/csi", + visibility = ["//visibility:public"], + deps = [ + "//pkg/util/mount:go_default_library", + "//pkg/util/strings:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/csi/proto/csi:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/google.golang.org/grpc:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types: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", + "//pkg/volume/csi/fake:all-srcs", + "//pkg/volume/csi/proto/csi:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) + +go_test( + name = "go_default_test", + srcs = [ + "csi_attacher_test.go", + "csi_client_test.go", + "csi_mounter_test.go", + "csi_plugin_test.go", + ], + importpath = "k8s.io/kubernetes/pkg/volume/csi", + library = ":go_default_library", + deps = [ + "//pkg/volume:go_default_library", + "//pkg/volume/csi/fake:go_default_library", + "//pkg/volume/csi/proto/csi:go_default_library", + "//pkg/volume/testing:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/google.golang.org/grpc:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/api/storage/v1alpha1: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/types:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + "//vendor/k8s.io/client-go/util/testing:go_default_library", + ], +) diff --git a/pkg/volume/csi/fake/BUILD b/pkg/volume/csi/fake/BUILD new file mode 100644 index 0000000000000..b4935c1239aba --- /dev/null +++ b/pkg/volume/csi/fake/BUILD @@ -0,0 +1,27 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["fake_client.go"], + importpath = "k8s.io/kubernetes/pkg/volume/csi/fake", + visibility = ["//visibility:public"], + deps = [ + "//pkg/volume/csi/proto/csi:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/google.golang.org/grpc: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/volume/csi/proto/csi/BUILD b/pkg/volume/csi/proto/csi/BUILD new file mode 100644 index 0000000000000..87cbaa30e8b76 --- /dev/null +++ b/pkg/volume/csi/proto/csi/BUILD @@ -0,0 +1,27 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["csi.pb.go"], + importpath = "k8s.io/kubernetes/pkg/volume/csi/proto/csi", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/golang/protobuf/proto:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/google.golang.org/grpc: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/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 1cd0bdc71de70..bf325e7a4114a 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -33,6 +33,7 @@ limitations under the License. AzureFilePersistentVolumeSource AzureFileVolumeSource Binding + CSIPersistentVolumeSource Capabilities CephFSPersistentVolumeSource CephFSVolumeSource @@ -272,738 +273,744 @@ func (m *Binding) Reset() { *m = Binding{} } func (*Binding) ProtoMessage() {} func (*Binding) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{7} } +func (m *CSIPersistentVolumeSource) Reset() { *m = CSIPersistentVolumeSource{} } +func (*CSIPersistentVolumeSource) ProtoMessage() {} +func (*CSIPersistentVolumeSource) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{8} +} + func (m *Capabilities) Reset() { *m = Capabilities{} } func (*Capabilities) ProtoMessage() {} -func (*Capabilities) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } +func (*Capabilities) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } func (m *CephFSPersistentVolumeSource) Reset() { *m = CephFSPersistentVolumeSource{} } func (*CephFSPersistentVolumeSource) ProtoMessage() {} func (*CephFSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{9} + return fileDescriptorGenerated, []int{10} } func (m *CephFSVolumeSource) Reset() { *m = CephFSVolumeSource{} } func (*CephFSVolumeSource) ProtoMessage() {} -func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } +func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } func (m *CinderVolumeSource) Reset() { *m = CinderVolumeSource{} } func (*CinderVolumeSource) ProtoMessage() {} -func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } +func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } func (m *ClientIPConfig) Reset() { *m = ClientIPConfig{} } func (*ClientIPConfig) ProtoMessage() {} -func (*ClientIPConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } +func (*ClientIPConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } func (m *ComponentCondition) Reset() { *m = ComponentCondition{} } func (*ComponentCondition) ProtoMessage() {} -func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } +func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (m *ComponentStatus) Reset() { *m = ComponentStatus{} } func (*ComponentStatus) ProtoMessage() {} -func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } +func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (m *ComponentStatusList) Reset() { *m = ComponentStatusList{} } func (*ComponentStatusList) ProtoMessage() {} -func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } +func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } func (m *ConfigMap) Reset() { *m = ConfigMap{} } func (*ConfigMap) ProtoMessage() {} -func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } +func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } func (m *ConfigMapEnvSource) Reset() { *m = ConfigMapEnvSource{} } func (*ConfigMapEnvSource) ProtoMessage() {} -func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } +func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } func (m *ConfigMapKeySelector) Reset() { *m = ConfigMapKeySelector{} } func (*ConfigMapKeySelector) ProtoMessage() {} -func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } +func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (m *ConfigMapList) Reset() { *m = ConfigMapList{} } func (*ConfigMapList) ProtoMessage() {} -func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } +func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (m *ConfigMapProjection) Reset() { *m = ConfigMapProjection{} } func (*ConfigMapProjection) ProtoMessage() {} -func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } +func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } func (m *ConfigMapVolumeSource) Reset() { *m = ConfigMapVolumeSource{} } func (*ConfigMapVolumeSource) ProtoMessage() {} -func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (m *Container) Reset() { *m = Container{} } func (*Container) ProtoMessage() {} -func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *ContainerImage) Reset() { *m = ContainerImage{} } func (*ContainerImage) ProtoMessage() {} -func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *ContainerPort) Reset() { *m = ContainerPort{} } func (*ContainerPort) ProtoMessage() {} -func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *ContainerState) Reset() { *m = ContainerState{} } func (*ContainerState) ProtoMessage() {} -func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (m *ContainerStateRunning) Reset() { *m = ContainerStateRunning{} } func (*ContainerStateRunning) ProtoMessage() {} -func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *ContainerStateTerminated) Reset() { *m = ContainerStateTerminated{} } func (*ContainerStateTerminated) ProtoMessage() {} func (*ContainerStateTerminated) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{27} + return fileDescriptorGenerated, []int{28} } func (m *ContainerStateWaiting) Reset() { *m = ContainerStateWaiting{} } func (*ContainerStateWaiting) ProtoMessage() {} -func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } +func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } func (*ContainerStatus) ProtoMessage() {} -func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *DaemonEndpoint) Reset() { *m = DaemonEndpoint{} } func (*DaemonEndpoint) ProtoMessage() {} -func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *DeleteOptions) Reset() { *m = DeleteOptions{} } func (*DeleteOptions) ProtoMessage() {} -func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } +func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (m *DownwardAPIProjection) Reset() { *m = DownwardAPIProjection{} } func (*DownwardAPIProjection) ProtoMessage() {} -func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *DownwardAPIVolumeFile) Reset() { *m = DownwardAPIVolumeFile{} } func (*DownwardAPIVolumeFile) ProtoMessage() {} -func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } +func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (m *DownwardAPIVolumeSource) Reset() { *m = DownwardAPIVolumeSource{} } func (*DownwardAPIVolumeSource) ProtoMessage() {} func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{34} + return fileDescriptorGenerated, []int{35} } func (m *EmptyDirVolumeSource) Reset() { *m = EmptyDirVolumeSource{} } func (*EmptyDirVolumeSource) ProtoMessage() {} -func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } +func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (m *EndpointAddress) Reset() { *m = EndpointAddress{} } func (*EndpointAddress) ProtoMessage() {} -func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *EndpointPort) Reset() { *m = EndpointPort{} } func (*EndpointPort) ProtoMessage() {} -func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } +func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func (m *EndpointSubset) Reset() { *m = EndpointSubset{} } func (*EndpointSubset) ProtoMessage() {} -func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } +func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } func (m *Endpoints) Reset() { *m = Endpoints{} } func (*Endpoints) ProtoMessage() {} -func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } +func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } func (m *EndpointsList) Reset() { *m = EndpointsList{} } func (*EndpointsList) ProtoMessage() {} -func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } +func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } func (m *EnvFromSource) Reset() { *m = EnvFromSource{} } func (*EnvFromSource) ProtoMessage() {} -func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } +func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } func (m *EnvVar) Reset() { *m = EnvVar{} } func (*EnvVar) ProtoMessage() {} -func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } +func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } func (m *EnvVarSource) Reset() { *m = EnvVarSource{} } func (*EnvVarSource) ProtoMessage() {} -func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } +func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } +func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } func (m *EventList) Reset() { *m = EventList{} } func (*EventList) ProtoMessage() {} -func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } +func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } func (m *EventSource) Reset() { *m = EventSource{} } func (*EventSource) ProtoMessage() {} -func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } +func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } func (m *ExecAction) Reset() { *m = ExecAction{} } func (*ExecAction) ProtoMessage() {} -func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } +func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } func (m *FCVolumeSource) Reset() { *m = FCVolumeSource{} } func (*FCVolumeSource) ProtoMessage() {} -func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } +func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } func (m *FlexVolumeSource) Reset() { *m = FlexVolumeSource{} } func (*FlexVolumeSource) ProtoMessage() {} -func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } +func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } func (m *FlockerVolumeSource) Reset() { *m = FlockerVolumeSource{} } func (*FlockerVolumeSource) ProtoMessage() {} -func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } +func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } func (m *GCEPersistentDiskVolumeSource) Reset() { *m = GCEPersistentDiskVolumeSource{} } func (*GCEPersistentDiskVolumeSource) ProtoMessage() {} func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{51} + return fileDescriptorGenerated, []int{52} } func (m *GitRepoVolumeSource) Reset() { *m = GitRepoVolumeSource{} } func (*GitRepoVolumeSource) ProtoMessage() {} -func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } +func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } func (m *GlusterfsVolumeSource) Reset() { *m = GlusterfsVolumeSource{} } func (*GlusterfsVolumeSource) ProtoMessage() {} -func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } +func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } func (m *HTTPGetAction) Reset() { *m = HTTPGetAction{} } func (*HTTPGetAction) ProtoMessage() {} -func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } +func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } func (m *HTTPHeader) Reset() { *m = HTTPHeader{} } func (*HTTPHeader) ProtoMessage() {} -func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } +func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } func (m *Handler) Reset() { *m = Handler{} } func (*Handler) ProtoMessage() {} -func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } +func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } func (m *HostAlias) Reset() { *m = HostAlias{} } func (*HostAlias) ProtoMessage() {} -func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } +func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } func (m *HostPathVolumeSource) Reset() { *m = HostPathVolumeSource{} } func (*HostPathVolumeSource) ProtoMessage() {} -func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } +func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } func (m *ISCSIVolumeSource) Reset() { *m = ISCSIVolumeSource{} } func (*ISCSIVolumeSource) ProtoMessage() {} -func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } +func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } func (m *KeyToPath) Reset() { *m = KeyToPath{} } func (*KeyToPath) ProtoMessage() {} -func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } +func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } func (m *Lifecycle) Reset() { *m = Lifecycle{} } func (*Lifecycle) ProtoMessage() {} -func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } +func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } func (m *LimitRange) Reset() { *m = LimitRange{} } func (*LimitRange) ProtoMessage() {} -func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } +func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } func (m *LimitRangeItem) Reset() { *m = LimitRangeItem{} } func (*LimitRangeItem) ProtoMessage() {} -func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } +func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } func (m *LimitRangeList) Reset() { *m = LimitRangeList{} } func (*LimitRangeList) ProtoMessage() {} -func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } +func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } func (m *LimitRangeSpec) Reset() { *m = LimitRangeSpec{} } func (*LimitRangeSpec) ProtoMessage() {} -func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } +func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} -func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } +func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } func (m *ListOptions) Reset() { *m = ListOptions{} } func (*ListOptions) ProtoMessage() {} -func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } +func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } func (m *LoadBalancerIngress) Reset() { *m = LoadBalancerIngress{} } func (*LoadBalancerIngress) ProtoMessage() {} -func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } +func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } func (m *LoadBalancerStatus) Reset() { *m = LoadBalancerStatus{} } func (*LoadBalancerStatus) ProtoMessage() {} -func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } +func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } func (m *LocalObjectReference) Reset() { *m = LocalObjectReference{} } func (*LocalObjectReference) ProtoMessage() {} -func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } +func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } func (m *LocalVolumeSource) Reset() { *m = LocalVolumeSource{} } func (*LocalVolumeSource) ProtoMessage() {} -func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } +func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } func (m *NFSVolumeSource) Reset() { *m = NFSVolumeSource{} } func (*NFSVolumeSource) ProtoMessage() {} -func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } +func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } func (m *Namespace) Reset() { *m = Namespace{} } func (*Namespace) ProtoMessage() {} -func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } +func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } func (m *NamespaceList) Reset() { *m = NamespaceList{} } func (*NamespaceList) ProtoMessage() {} -func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } +func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (*NamespaceSpec) ProtoMessage() {} -func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } +func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } func (m *NamespaceStatus) Reset() { *m = NamespaceStatus{} } func (*NamespaceStatus) ProtoMessage() {} -func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } +func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } func (m *Node) Reset() { *m = Node{} } func (*Node) ProtoMessage() {} -func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } +func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (*NodeAddress) ProtoMessage() {} -func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } +func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } func (m *NodeAffinity) Reset() { *m = NodeAffinity{} } func (*NodeAffinity) ProtoMessage() {} -func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } +func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} -func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } +func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} } func (*NodeConfigSource) ProtoMessage() {} -func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } +func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} -func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } +func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} -func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } +func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} -func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } +func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } func (m *NodeResources) Reset() { *m = NodeResources{} } func (*NodeResources) ProtoMessage() {} -func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } +func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} -func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } +func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{87} + return fileDescriptorGenerated, []int{88} } func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} -func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } +func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} -func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } +func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} -func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } +func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} -func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } +func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} -func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } +func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } func (*ObjectMeta) ProtoMessage() {} -func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } +func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} -func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } +func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} } func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} -func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} } +func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} } func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} -func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} } +func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{97} } func (m *PersistentVolumeClaimCondition) Reset() { *m = PersistentVolumeClaimCondition{} } func (*PersistentVolumeClaimCondition) ProtoMessage() {} func (*PersistentVolumeClaimCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{97} + return fileDescriptorGenerated, []int{98} } func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{98} + return fileDescriptorGenerated, []int{99} } func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{99} + return fileDescriptorGenerated, []int{100} } func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{100} + return fileDescriptorGenerated, []int{101} } func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{101} + return fileDescriptorGenerated, []int{102} } func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} -func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{102} } +func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{103} } func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{103} + return fileDescriptorGenerated, []int{104} } func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} -func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{104} } +func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{105} + return fileDescriptorGenerated, []int{106} } func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{106} + return fileDescriptorGenerated, []int{107} } func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} -func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } +func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} -func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } +func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} -func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } +func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} -func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } +func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} -func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } +func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} -func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } +func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} -func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } +func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} -func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } +func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} -func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } +func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} -func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } +func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} -func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } +func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} -func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } +func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} -func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } +func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} -func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } +func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} -func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } +func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} -func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } +func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} -func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } +func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} -func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } +func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} -func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } +func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} -func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } +func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} -func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } +func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{129} + return fileDescriptorGenerated, []int{130} } func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} -func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } +func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} -func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } +func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} -func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } +func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } func (m *RBDPersistentVolumeSource) Reset() { *m = RBDPersistentVolumeSource{} } func (*RBDPersistentVolumeSource) ProtoMessage() {} func (*RBDPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{133} + return fileDescriptorGenerated, []int{134} } func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} -func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} } +func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} } func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} -func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} } +func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} -func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } +func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{137} + return fileDescriptorGenerated, []int{138} } func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{138} + return fileDescriptorGenerated, []int{139} } func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{139} + return fileDescriptorGenerated, []int{140} } func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{140} + return fileDescriptorGenerated, []int{141} } func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} -func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} -func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} -func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} -func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} -func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} -func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} -func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *ScaleIOPersistentVolumeSource) Reset() { *m = ScaleIOPersistentVolumeSource{} } func (*ScaleIOPersistentVolumeSource) ProtoMessage() {} func (*ScaleIOPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{148} + return fileDescriptorGenerated, []int{149} } func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} -func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} -func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } func (*SessionAffinityConfig) ProtoMessage() {} -func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } +func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{168} + return fileDescriptorGenerated, []int{169} } func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} -func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } +func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{178} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{178} + return fileDescriptorGenerated, []int{179} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{179} + return fileDescriptorGenerated, []int{180} } func init() { @@ -1015,6 +1022,7 @@ func init() { proto.RegisterType((*AzureFilePersistentVolumeSource)(nil), "k8s.io.api.core.v1.AzureFilePersistentVolumeSource") proto.RegisterType((*AzureFileVolumeSource)(nil), "k8s.io.api.core.v1.AzureFileVolumeSource") proto.RegisterType((*Binding)(nil), "k8s.io.api.core.v1.Binding") + proto.RegisterType((*CSIPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CSIPersistentVolumeSource") proto.RegisterType((*Capabilities)(nil), "k8s.io.api.core.v1.Capabilities") proto.RegisterType((*CephFSPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CephFSPersistentVolumeSource") proto.RegisterType((*CephFSVolumeSource)(nil), "k8s.io.api.core.v1.CephFSVolumeSource") @@ -1491,6 +1499,40 @@ func (m *Binding) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *CSIPersistentVolumeSource) 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 *CSIPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i += copy(dAtA[i:], m.Driver) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.VolumeHandle))) + i += copy(dAtA[i:], m.VolumeHandle) + dAtA[i] = 0x18 + i++ + if m.ReadOnly { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + return i, nil +} + func (m *Capabilities) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6096,6 +6138,18 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { } i += n121 } + if m.CSI != nil { + dAtA[i] = 0xb2 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.CSI.Size())) + n122, err := m.CSI.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n122 + } return i, nil } @@ -6138,21 +6192,21 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n122, err := (&v).MarshalTo(dAtA[i:]) + n123, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n122 + i += n123 } } dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeSource.Size())) - n123, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) + n124, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n123 + i += n124 if len(m.AccessModes) > 0 { for _, s := range m.AccessModes { dAtA[i] = 0x1a @@ -6172,11 +6226,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClaimRef.Size())) - n124, err := m.ClaimRef.MarshalTo(dAtA[i:]) + n125, err := m.ClaimRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n124 + i += n125 } dAtA[i] = 0x2a i++ @@ -6278,27 +6332,27 @@ func (m *Pod) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n125, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n126, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n125 + i += n126 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n126, err := m.Spec.MarshalTo(dAtA[i:]) + n127, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n126 + i += n127 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n127, err := m.Status.MarshalTo(dAtA[i:]) + n128, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n127 + i += n128 return i, nil } @@ -6363,11 +6417,11 @@ func (m *PodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LabelSelector.Size())) - n128, err := m.LabelSelector.MarshalTo(dAtA[i:]) + n129, err := m.LabelSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n128 + i += n129 } if len(m.Namespaces) > 0 { for _, s := range m.Namespaces { @@ -6513,19 +6567,19 @@ func (m *PodCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size())) - n129, err := m.LastProbeTime.MarshalTo(dAtA[i:]) + n130, err := m.LastProbeTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n129 + i += n130 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n130, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n131, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n130 + i += n131 dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -6624,11 +6678,11 @@ func (m *PodList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n131, err := m.ListMeta.MarshalTo(dAtA[i:]) + n132, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n131 + i += n132 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -6688,11 +6742,11 @@ func (m *PodLogOptions) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SinceTime.Size())) - n132, err := m.SinceTime.MarshalTo(dAtA[i:]) + n133, err := m.SinceTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n132 + i += n133 } dAtA[i] = 0x30 i++ @@ -6781,11 +6835,11 @@ func (m *PodSecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n133, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n134, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n133 + i += n134 } if m.RunAsUser != nil { dAtA[i] = 0x10 @@ -6836,11 +6890,11 @@ func (m *PodSignature) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodController.Size())) - n134, err := m.PodController.MarshalTo(dAtA[i:]) + n135, err := m.PodController.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n134 + i += n135 } return i, nil } @@ -6964,11 +7018,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size())) - n135, err := m.SecurityContext.MarshalTo(dAtA[i:]) + n136, err := m.SecurityContext.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n135 + i += n136 } if len(m.ImagePullSecrets) > 0 { for _, msg := range m.ImagePullSecrets { @@ -7000,11 +7054,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Affinity.Size())) - n136, err := m.Affinity.MarshalTo(dAtA[i:]) + n137, err := m.Affinity.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n136 + i += n137 } dAtA[i] = 0x9a i++ @@ -7133,11 +7187,11 @@ func (m *PodStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size())) - n137, err := m.StartTime.MarshalTo(dAtA[i:]) + n138, err := m.StartTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n137 + i += n138 } if len(m.ContainerStatuses) > 0 { for _, msg := range m.ContainerStatuses { @@ -7188,19 +7242,19 @@ func (m *PodStatusResult) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n138, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n139, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n138 + i += n139 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n139, err := m.Status.MarshalTo(dAtA[i:]) + n140, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n139 + i += n140 return i, nil } @@ -7222,19 +7276,19 @@ func (m *PodTemplate) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n140, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n141, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n140 + i += n141 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n141, err := m.Template.MarshalTo(dAtA[i:]) + n142, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n141 + i += n142 return i, nil } @@ -7256,11 +7310,11 @@ func (m *PodTemplateList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n142, err := m.ListMeta.MarshalTo(dAtA[i:]) + n143, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n142 + i += n143 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7294,19 +7348,19 @@ func (m *PodTemplateSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n143, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n144, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n143 + i += n144 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n144, err := m.Spec.MarshalTo(dAtA[i:]) + n145, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n144 + i += n145 return i, nil } @@ -7386,19 +7440,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodSignature.Size())) - n145, err := m.PodSignature.MarshalTo(dAtA[i:]) + n146, err := m.PodSignature.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n145 + i += n146 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EvictionTime.Size())) - n146, err := m.EvictionTime.MarshalTo(dAtA[i:]) + n147, err := m.EvictionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n146 + i += n147 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7431,11 +7485,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Preference.Size())) - n147, err := m.Preference.MarshalTo(dAtA[i:]) + n148, err := m.Preference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n147 + i += n148 return i, nil } @@ -7457,11 +7511,11 @@ func (m *Probe) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Handler.Size())) - n148, err := m.Handler.MarshalTo(dAtA[i:]) + n149, err := m.Handler.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n148 + i += n149 dAtA[i] = 0x10 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.InitialDelaySeconds)) @@ -7611,11 +7665,11 @@ func (m *RBDPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n149, err := m.SecretRef.MarshalTo(dAtA[i:]) + n150, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n149 + i += n150 } dAtA[i] = 0x40 i++ @@ -7682,11 +7736,11 @@ func (m *RBDVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n150, err := m.SecretRef.MarshalTo(dAtA[i:]) + n151, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n150 + i += n151 } dAtA[i] = 0x40 i++ @@ -7717,11 +7771,11 @@ func (m *RangeAllocation) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n151, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n152, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n151 + i += n152 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Range))) @@ -7753,27 +7807,27 @@ func (m *ReplicationController) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n152, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n153, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n152 + i += n153 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n153, err := m.Spec.MarshalTo(dAtA[i:]) + n154, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n153 + i += n154 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n154, err := m.Status.MarshalTo(dAtA[i:]) + n155, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n154 + i += n155 return i, nil } @@ -7803,11 +7857,11 @@ func (m *ReplicationControllerCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n155, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n156, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n155 + i += n156 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7837,11 +7891,11 @@ func (m *ReplicationControllerList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n156, err := m.ListMeta.MarshalTo(dAtA[i:]) + n157, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n156 + i += n157 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7903,11 +7957,11 @@ func (m *ReplicationControllerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n157, err := m.Template.MarshalTo(dAtA[i:]) + n158, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n157 + i += n158 } dAtA[i] = 0x20 i++ @@ -7986,11 +8040,11 @@ func (m *ResourceFieldSelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Divisor.Size())) - n158, err := m.Divisor.MarshalTo(dAtA[i:]) + n159, err := m.Divisor.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n158 + i += n159 return i, nil } @@ -8012,27 +8066,27 @@ func (m *ResourceQuota) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n159, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n160, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n159 + i += n160 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n160, err := m.Spec.MarshalTo(dAtA[i:]) + n161, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n160 + i += n161 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n161, err := m.Status.MarshalTo(dAtA[i:]) + n162, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n161 + i += n162 return i, nil } @@ -8054,11 +8108,11 @@ func (m *ResourceQuotaList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n162, err := m.ListMeta.MarshalTo(dAtA[i:]) + n163, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n162 + i += n163 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8113,11 +8167,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n163, err := (&v).MarshalTo(dAtA[i:]) + n164, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n163 + i += n164 } } if len(m.Scopes) > 0 { @@ -8177,11 +8231,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n164, err := (&v).MarshalTo(dAtA[i:]) + n165, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n164 + i += n165 } } if len(m.Used) > 0 { @@ -8208,11 +8262,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n165, err := (&v).MarshalTo(dAtA[i:]) + n166, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n165 + i += n166 } } return i, nil @@ -8257,11 +8311,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n166, err := (&v).MarshalTo(dAtA[i:]) + n167, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n166 + i += n167 } } if len(m.Requests) > 0 { @@ -8288,11 +8342,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n167, err := (&v).MarshalTo(dAtA[i:]) + n168, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n167 + i += n168 } } return i, nil @@ -8359,11 +8413,11 @@ func (m *ScaleIOPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n168, err := m.SecretRef.MarshalTo(dAtA[i:]) + n169, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n168 + i += n169 } dAtA[i] = 0x20 i++ @@ -8431,11 +8485,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n169, err := m.SecretRef.MarshalTo(dAtA[i:]) + n170, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n169 + i += n170 } dAtA[i] = 0x20 i++ @@ -8494,11 +8548,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n170, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n171, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n170 + i += n171 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -8574,11 +8628,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n171, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n172, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n171 + i += n172 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -8610,11 +8664,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n172, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n173, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n172 + i += n173 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -8650,11 +8704,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n173, err := m.ListMeta.MarshalTo(dAtA[i:]) + n174, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n173 + i += n174 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8688,11 +8742,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n174, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n175, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n174 + i += n175 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8812,11 +8866,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size())) - n175, err := m.Capabilities.MarshalTo(dAtA[i:]) + n176, err := m.Capabilities.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n175 + i += n176 } if m.Privileged != nil { dAtA[i] = 0x10 @@ -8832,11 +8886,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n176, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n177, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n176 + i += n177 } if m.RunAsUser != nil { dAtA[i] = 0x20 @@ -8894,11 +8948,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size())) - n177, err := m.Reference.MarshalTo(dAtA[i:]) + n178, err := m.Reference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n177 + i += n178 return i, nil } @@ -8920,27 +8974,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n178, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n179, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n178 + i += n179 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n179, err := m.Spec.MarshalTo(dAtA[i:]) + n180, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n179 + i += n180 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n180, err := m.Status.MarshalTo(dAtA[i:]) + n181, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n180 + i += n181 return i, nil } @@ -8962,11 +9016,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n181, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n182, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n181 + i += n182 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { dAtA[i] = 0x12 @@ -9022,11 +9076,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n182, err := m.ListMeta.MarshalTo(dAtA[i:]) + n183, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n182 + i += n183 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9060,11 +9114,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n183, err := m.ListMeta.MarshalTo(dAtA[i:]) + n184, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n183 + i += n184 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9109,11 +9163,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size())) - n184, err := m.TargetPort.MarshalTo(dAtA[i:]) + n185, err := m.TargetPort.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n184 + i += n185 dAtA[i] = 0x28 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort)) @@ -9260,11 +9314,11 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SessionAffinityConfig.Size())) - n185, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) + n186, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n185 + i += n186 } return i, nil } @@ -9287,11 +9341,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size())) - n186, err := m.LoadBalancer.MarshalTo(dAtA[i:]) + n187, err := m.LoadBalancer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n186 + i += n187 return i, nil } @@ -9314,11 +9368,11 @@ func (m *SessionAffinityConfig) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClientIP.Size())) - n187, err := m.ClientIP.MarshalTo(dAtA[i:]) + n188, err := m.ClientIP.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n187 + i += n188 } return i, nil } @@ -9362,11 +9416,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n188, err := m.SecretRef.MarshalTo(dAtA[i:]) + n189, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n188 + i += n189 } return i, nil } @@ -9410,11 +9464,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n189, err := m.SecretRef.MarshalTo(dAtA[i:]) + n190, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n189 + i += n190 } return i, nil } @@ -9463,11 +9517,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n190, err := m.Port.MarshalTo(dAtA[i:]) + n191, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n190 + i += n191 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -9506,11 +9560,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size())) - n191, err := m.TimeAdded.MarshalTo(dAtA[i:]) + n192, err := m.TimeAdded.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n191 + i += n192 } return i, nil } @@ -9576,11 +9630,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size())) - n192, err := m.VolumeSource.MarshalTo(dAtA[i:]) + n193, err := m.VolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n192 + i += n193 return i, nil } @@ -9647,31 +9701,31 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n193, err := m.Secret.MarshalTo(dAtA[i:]) + n194, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n193 + i += n194 } if m.DownwardAPI != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n194, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n195, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n194 + i += n195 } if m.ConfigMap != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n195, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n196, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n195 + i += n196 } return i, nil } @@ -9695,151 +9749,151 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n196, err := m.HostPath.MarshalTo(dAtA[i:]) + n197, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n196 + i += n197 } if m.EmptyDir != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) - n197, err := m.EmptyDir.MarshalTo(dAtA[i:]) + n198, err := m.EmptyDir.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n197 + i += n198 } if m.GCEPersistentDisk != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n198, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + n199, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n198 + i += n199 } if m.AWSElasticBlockStore != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n199, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + n200, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n199 + i += n200 } if m.GitRepo != nil { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) - n200, err := m.GitRepo.MarshalTo(dAtA[i:]) + n201, err := m.GitRepo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n200 + i += n201 } if m.Secret != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n201, err := m.Secret.MarshalTo(dAtA[i:]) + n202, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n201 + i += n202 } if m.NFS != nil { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n202, err := m.NFS.MarshalTo(dAtA[i:]) + n203, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n202 + i += n203 } if m.ISCSI != nil { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n203, err := m.ISCSI.MarshalTo(dAtA[i:]) + n204, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n203 + i += n204 } if m.Glusterfs != nil { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n204, err := m.Glusterfs.MarshalTo(dAtA[i:]) + n205, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n204 + i += n205 } if m.PersistentVolumeClaim != nil { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) - n205, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) + n206, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n205 + i += n206 } if m.RBD != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n206, err := m.RBD.MarshalTo(dAtA[i:]) + n207, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n206 + i += n207 } if m.FlexVolume != nil { dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n207, err := m.FlexVolume.MarshalTo(dAtA[i:]) + n208, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n207 + i += n208 } if m.Cinder != nil { dAtA[i] = 0x6a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n208, err := m.Cinder.MarshalTo(dAtA[i:]) + n209, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n208 + i += n209 } if m.CephFS != nil { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n209, err := m.CephFS.MarshalTo(dAtA[i:]) + n210, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n209 + i += n210 } if m.Flocker != nil { dAtA[i] = 0x7a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n210, err := m.Flocker.MarshalTo(dAtA[i:]) + n211, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n210 + i += n211 } if m.DownwardAPI != nil { dAtA[i] = 0x82 @@ -9847,11 +9901,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n211, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n212, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n211 + i += n212 } if m.FC != nil { dAtA[i] = 0x8a @@ -9859,11 +9913,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n212, err := m.FC.MarshalTo(dAtA[i:]) + n213, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n212 + i += n213 } if m.AzureFile != nil { dAtA[i] = 0x92 @@ -9871,11 +9925,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n213, err := m.AzureFile.MarshalTo(dAtA[i:]) + n214, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n213 + i += n214 } if m.ConfigMap != nil { dAtA[i] = 0x9a @@ -9883,11 +9937,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n214, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n215, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n214 + i += n215 } if m.VsphereVolume != nil { dAtA[i] = 0xa2 @@ -9895,11 +9949,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n215, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n216, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n215 + i += n216 } if m.Quobyte != nil { dAtA[i] = 0xaa @@ -9907,11 +9961,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n216, err := m.Quobyte.MarshalTo(dAtA[i:]) + n217, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n216 + i += n217 } if m.AzureDisk != nil { dAtA[i] = 0xb2 @@ -9919,11 +9973,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n217, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n218, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n217 + i += n218 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0xba @@ -9931,11 +9985,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n218, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n219, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n218 + i += n219 } if m.PortworxVolume != nil { dAtA[i] = 0xc2 @@ -9943,11 +9997,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n219, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n220, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n219 + i += n220 } if m.ScaleIO != nil { dAtA[i] = 0xca @@ -9955,11 +10009,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n220, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n221, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n220 + i += n221 } if m.Projected != nil { dAtA[i] = 0xd2 @@ -9967,11 +10021,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size())) - n221, err := m.Projected.MarshalTo(dAtA[i:]) + n222, err := m.Projected.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n221 + i += n222 } if m.StorageOS != nil { dAtA[i] = 0xda @@ -9979,11 +10033,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n222, err := m.StorageOS.MarshalTo(dAtA[i:]) + n223, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n222 + i += n223 } return i, nil } @@ -10043,11 +10097,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size())) - n223, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) + n224, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n223 + i += n224 return i, nil } @@ -10191,6 +10245,17 @@ func (m *Binding) Size() (n int) { return n } +func (m *CSIPersistentVolumeSource) Size() (n int) { + var l int + _ = l + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.VolumeHandle) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + return n +} + func (m *Capabilities) Size() (n int) { var l int _ = l @@ -11872,6 +11937,10 @@ func (m *PersistentVolumeSource) Size() (n int) { l = m.StorageOS.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.CSI != nil { + l = m.CSI.Size() + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -13407,6 +13476,18 @@ func (this *Binding) String() string { }, "") return s } +func (this *CSIPersistentVolumeSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CSIPersistentVolumeSource{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `VolumeHandle:` + fmt.Sprintf("%v", this.VolumeHandle) + `,`, + `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, + `}`, + }, "") + return s +} func (this *Capabilities) String() string { if this == nil { return "nil" @@ -14748,6 +14829,7 @@ func (this *PersistentVolumeSource) String() string { `ScaleIO:` + strings.Replace(fmt.Sprintf("%v", this.ScaleIO), "ScaleIOPersistentVolumeSource", "ScaleIOPersistentVolumeSource", 1) + `,`, `Local:` + strings.Replace(fmt.Sprintf("%v", this.Local), "LocalVolumeSource", "LocalVolumeSource", 1) + `,`, `StorageOS:` + strings.Replace(fmt.Sprintf("%v", this.StorageOS), "StorageOSPersistentVolumeSource", "StorageOSPersistentVolumeSource", 1) + `,`, + `CSI:` + strings.Replace(fmt.Sprintf("%v", this.CSI), "CSIPersistentVolumeSource", "CSIPersistentVolumeSource", 1) + `,`, `}`, }, "") return s @@ -16980,6 +17062,134 @@ func (m *Binding) Unmarshal(dAtA []byte) error { } return nil } +func (m *CSIPersistentVolumeSource) 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: CSIPersistentVolumeSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CSIPersistentVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", 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.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeHandle", 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.VolumeHandle = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadOnly = bool(v != 0) + 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 *Capabilities) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -33051,6 +33261,39 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CSI", 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 m.CSI == nil { + m.CSI = &CSIPersistentVolumeSource{} + } + if err := m.CSI.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -47195,749 +47438,753 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11903 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x70, 0x24, 0xc7, - 0x79, 0x98, 0x66, 0x17, 0xaf, 0xfd, 0xf0, 0xee, 0xc3, 0x91, 0x7b, 0x20, 0xef, 0x70, 0x1c, 0x4a, - 0xe4, 0xf1, 0x05, 0x88, 0x47, 0x52, 0xa4, 0x45, 0x8a, 0x36, 0x80, 0x05, 0xee, 0xc0, 0x3b, 0xdc, - 0x2d, 0x7b, 0x71, 0x77, 0x22, 0x4d, 0x33, 0x1a, 0xec, 0x36, 0x16, 0x43, 0x0c, 0x66, 0x96, 0x33, - 0xb3, 0xb8, 0x03, 0xcb, 0xaa, 0x4a, 0x14, 0x59, 0x79, 0xc8, 0x3f, 0x54, 0x89, 0x2a, 0x71, 0x2c, - 0x95, 0x53, 0x95, 0x47, 0xd9, 0x8a, 0x93, 0x54, 0x1c, 0x39, 0xb2, 0x23, 0x39, 0x15, 0xc7, 0x79, - 0x94, 0xfc, 0x47, 0xb1, 0xf3, 0x47, 0xaa, 0x72, 0x05, 0xb1, 0x4e, 0xa9, 0xa4, 0xf2, 0x23, 0xa9, - 0x24, 0xfe, 0x65, 0xc4, 0x89, 0x52, 0xfd, 0x9c, 0xee, 0xd9, 0x99, 0xdd, 0xc5, 0x11, 0x07, 0x52, - 0x2a, 0xfd, 0xdb, 0xed, 0xef, 0xeb, 0xaf, 0x7b, 0xfa, 0xf1, 0xf5, 0xd7, 0x5f, 0x7f, 0x0f, 0x78, - 0x79, 0xe7, 0xa5, 0x68, 0xde, 0x0d, 0x16, 0x76, 0xda, 0x9b, 0x24, 0xf4, 0x49, 0x4c, 0xa2, 0x85, - 0x3d, 0xe2, 0x37, 0x82, 0x70, 0x41, 0x00, 0x9c, 0x96, 0xbb, 0x50, 0x0f, 0x42, 0xb2, 0xb0, 0xf7, - 0xec, 0x42, 0x93, 0xf8, 0x24, 0x74, 0x62, 0xd2, 0x98, 0x6f, 0x85, 0x41, 0x1c, 0x20, 0xc4, 0x71, - 0xe6, 0x9d, 0x96, 0x3b, 0x4f, 0x71, 0xe6, 0xf7, 0x9e, 0x9d, 0x7d, 0xa6, 0xe9, 0xc6, 0xdb, 0xed, - 0xcd, 0xf9, 0x7a, 0xb0, 0xbb, 0xd0, 0x0c, 0x9a, 0xc1, 0x02, 0x43, 0xdd, 0x6c, 0x6f, 0xb1, 0x7f, - 0xec, 0x0f, 0xfb, 0xc5, 0x49, 0xcc, 0xae, 0x27, 0xcd, 0x90, 0x3b, 0x31, 0xf1, 0x23, 0x37, 0xf0, - 0xa3, 0x67, 0x9c, 0x96, 0x1b, 0x91, 0x70, 0x8f, 0x84, 0x0b, 0xad, 0x9d, 0x26, 0x85, 0x45, 0x26, - 0xc2, 0xc2, 0xde, 0xb3, 0x9b, 0x24, 0x76, 0x3a, 0x7a, 0x34, 0xfb, 0x7c, 0x42, 0x6e, 0xd7, 0xa9, - 0x6f, 0xbb, 0x3e, 0x09, 0xf7, 0x25, 0x8d, 0x85, 0x90, 0x44, 0x41, 0x3b, 0xac, 0x93, 0x23, 0xd5, - 0x8a, 0x16, 0x76, 0x49, 0xec, 0x64, 0x7c, 0xfd, 0xec, 0x42, 0x5e, 0xad, 0xb0, 0xed, 0xc7, 0xee, - 0x6e, 0x67, 0x33, 0x9f, 0xe8, 0x55, 0x21, 0xaa, 0x6f, 0x93, 0x5d, 0xa7, 0xa3, 0xde, 0x73, 0x79, - 0xf5, 0xda, 0xb1, 0xeb, 0x2d, 0xb8, 0x7e, 0x1c, 0xc5, 0x61, 0xba, 0x92, 0xfd, 0x5d, 0x0b, 0xce, - 0x2f, 0xde, 0xaa, 0xad, 0x78, 0x4e, 0x14, 0xbb, 0xf5, 0x25, 0x2f, 0xa8, 0xef, 0xd4, 0xe2, 0x20, - 0x24, 0x37, 0x03, 0xaf, 0xbd, 0x4b, 0x6a, 0x6c, 0x20, 0xd0, 0xd3, 0x30, 0xb2, 0xc7, 0xfe, 0xaf, - 0x55, 0xca, 0xd6, 0x79, 0xeb, 0x42, 0x69, 0x69, 0xea, 0xdb, 0x07, 0x73, 0x1f, 0xb9, 0x7b, 0x30, - 0x37, 0x72, 0x53, 0x94, 0x63, 0x85, 0x81, 0x1e, 0x83, 0xa1, 0xad, 0x68, 0x63, 0xbf, 0x45, 0xca, - 0x05, 0x86, 0x3b, 0x21, 0x70, 0x87, 0x56, 0x6b, 0xb4, 0x14, 0x0b, 0x28, 0x5a, 0x80, 0x52, 0xcb, - 0x09, 0x63, 0x37, 0x76, 0x03, 0xbf, 0x5c, 0x3c, 0x6f, 0x5d, 0x18, 0x5c, 0x9a, 0x16, 0xa8, 0xa5, - 0xaa, 0x04, 0xe0, 0x04, 0x87, 0x76, 0x23, 0x24, 0x4e, 0xe3, 0xba, 0xef, 0xed, 0x97, 0x07, 0xce, - 0x5b, 0x17, 0x46, 0x92, 0x6e, 0x60, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0xcb, 0x05, 0x18, 0x59, 0xdc, - 0xda, 0x72, 0x7d, 0x37, 0xde, 0x47, 0x37, 0x61, 0xcc, 0x0f, 0x1a, 0x44, 0xfe, 0x67, 0x5f, 0x31, - 0x7a, 0xf1, 0xfc, 0x7c, 0xe7, 0xca, 0x9c, 0xbf, 0xa6, 0xe1, 0x2d, 0x4d, 0xdd, 0x3d, 0x98, 0x1b, - 0xd3, 0x4b, 0xb0, 0x41, 0x07, 0x61, 0x18, 0x6d, 0x05, 0x0d, 0x45, 0xb6, 0xc0, 0xc8, 0xce, 0x65, - 0x91, 0xad, 0x26, 0x68, 0x4b, 0x93, 0x77, 0x0f, 0xe6, 0x46, 0xb5, 0x02, 0xac, 0x13, 0x41, 0x9b, - 0x30, 0x49, 0xff, 0xfa, 0xb1, 0xab, 0xe8, 0x16, 0x19, 0xdd, 0x47, 0xf3, 0xe8, 0x6a, 0xa8, 0x4b, - 0xa7, 0xee, 0x1e, 0xcc, 0x4d, 0xa6, 0x0a, 0x71, 0x9a, 0xa0, 0xfd, 0x1e, 0x4c, 0x2c, 0xc6, 0xb1, - 0x53, 0xdf, 0x26, 0x0d, 0x3e, 0x83, 0xe8, 0x79, 0x18, 0xf0, 0x9d, 0x5d, 0x22, 0xe6, 0xf7, 0xbc, - 0x18, 0xd8, 0x81, 0x6b, 0xce, 0x2e, 0x39, 0x3c, 0x98, 0x9b, 0xba, 0xe1, 0xbb, 0xef, 0xb6, 0xc5, - 0xaa, 0xa0, 0x65, 0x98, 0x61, 0xa3, 0x8b, 0x00, 0x0d, 0xb2, 0xe7, 0xd6, 0x49, 0xd5, 0x89, 0xb7, - 0xc5, 0x7c, 0x23, 0x51, 0x17, 0x2a, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x0e, 0x94, 0x16, 0xf7, 0x02, - 0xb7, 0x51, 0x0d, 0x1a, 0x11, 0xda, 0x81, 0xc9, 0x56, 0x48, 0xb6, 0x48, 0xa8, 0x8a, 0xca, 0xd6, - 0xf9, 0xe2, 0x85, 0xd1, 0x8b, 0x17, 0x32, 0x3f, 0xd6, 0x44, 0x5d, 0xf1, 0xe3, 0x70, 0x7f, 0xe9, - 0x41, 0xd1, 0xde, 0x64, 0x0a, 0x8a, 0xd3, 0x94, 0xed, 0x7f, 0x53, 0x80, 0xd3, 0x8b, 0xef, 0xb5, - 0x43, 0x52, 0x71, 0xa3, 0x9d, 0xf4, 0x0a, 0x6f, 0xb8, 0xd1, 0xce, 0xb5, 0x64, 0x04, 0xd4, 0xd2, - 0xaa, 0x88, 0x72, 0xac, 0x30, 0xd0, 0x33, 0x30, 0x4c, 0x7f, 0xdf, 0xc0, 0x6b, 0xe2, 0x93, 0x4f, - 0x09, 0xe4, 0xd1, 0x8a, 0x13, 0x3b, 0x15, 0x0e, 0xc2, 0x12, 0x07, 0xad, 0xc3, 0x68, 0x9d, 0x6d, - 0xc8, 0xe6, 0x7a, 0xd0, 0x20, 0x6c, 0x32, 0x4b, 0x4b, 0x4f, 0x51, 0xf4, 0xe5, 0xa4, 0xf8, 0xf0, - 0x60, 0xae, 0xcc, 0xfb, 0x26, 0x48, 0x68, 0x30, 0xac, 0xd7, 0x47, 0xb6, 0xda, 0x5f, 0x03, 0x8c, - 0x12, 0x64, 0xec, 0xad, 0x0b, 0xda, 0x56, 0x19, 0x64, 0x5b, 0x65, 0x2c, 0x7b, 0x9b, 0xa0, 0x67, - 0x61, 0x60, 0xc7, 0xf5, 0x1b, 0xe5, 0x21, 0x46, 0xeb, 0x2c, 0x9d, 0xf3, 0x2b, 0xae, 0xdf, 0x38, - 0x3c, 0x98, 0x9b, 0x36, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0xc4, 0x82, 0x39, 0x06, 0x5b, - 0x75, 0x3d, 0x52, 0x25, 0x61, 0xe4, 0x46, 0x31, 0xf1, 0x63, 0x63, 0x40, 0x2f, 0x02, 0x44, 0xa4, - 0x1e, 0x92, 0x58, 0x1b, 0x52, 0xb5, 0x30, 0x6a, 0x0a, 0x82, 0x35, 0x2c, 0xca, 0x10, 0xa2, 0x6d, - 0x27, 0x64, 0xeb, 0x4b, 0x0c, 0xac, 0x62, 0x08, 0x35, 0x09, 0xc0, 0x09, 0x8e, 0xc1, 0x10, 0x8a, - 0xbd, 0x18, 0x02, 0xfa, 0x14, 0x4c, 0x26, 0x8d, 0x45, 0x2d, 0xa7, 0x2e, 0x07, 0x90, 0x6d, 0x99, - 0x9a, 0x09, 0xc2, 0x69, 0x5c, 0xfb, 0x1f, 0x58, 0x62, 0xf1, 0xd0, 0xaf, 0xfe, 0x90, 0x7f, 0xab, - 0xfd, 0xdb, 0x16, 0x0c, 0x2f, 0xb9, 0x7e, 0xc3, 0xf5, 0x9b, 0xe8, 0x33, 0x30, 0x42, 0xcf, 0xa6, - 0x86, 0x13, 0x3b, 0x82, 0xef, 0x7d, 0x5c, 0xdb, 0x5b, 0xea, 0xa8, 0x98, 0x6f, 0xed, 0x34, 0x69, - 0x41, 0x34, 0x4f, 0xb1, 0xe9, 0x6e, 0xbb, 0xbe, 0xf9, 0x0e, 0xa9, 0xc7, 0xeb, 0x24, 0x76, 0x92, - 0xcf, 0x49, 0xca, 0xb0, 0xa2, 0x8a, 0xae, 0xc0, 0x50, 0xec, 0x84, 0x4d, 0x12, 0x0b, 0x06, 0x98, - 0xc9, 0xa8, 0x78, 0x4d, 0x4c, 0x77, 0x24, 0xf1, 0xeb, 0x24, 0x39, 0x16, 0x36, 0x58, 0x55, 0x2c, - 0x48, 0xd8, 0x75, 0x18, 0x5b, 0x76, 0x5a, 0xce, 0xa6, 0xeb, 0xb9, 0xb1, 0x4b, 0x22, 0xf4, 0x38, - 0x14, 0x9d, 0x46, 0x83, 0x71, 0x85, 0xd2, 0xd2, 0xe9, 0xbb, 0x07, 0x73, 0xc5, 0xc5, 0x06, 0x5d, - 0x9e, 0xa0, 0xb0, 0xf6, 0x31, 0xc5, 0x40, 0x4f, 0xc2, 0x40, 0x23, 0x0c, 0x5a, 0xe5, 0x02, 0xc3, - 0x7c, 0x80, 0xae, 0xe4, 0x4a, 0x18, 0xb4, 0x52, 0xa8, 0x0c, 0xc7, 0xfe, 0xdd, 0x02, 0x3c, 0xbc, - 0x4c, 0x5a, 0xdb, 0xab, 0xb5, 0x9c, 0xf5, 0x7b, 0x01, 0x46, 0x76, 0x03, 0xdf, 0x8d, 0x83, 0x30, - 0x12, 0x4d, 0xb3, 0x0d, 0xb4, 0x2e, 0xca, 0xb0, 0x82, 0xa2, 0xf3, 0x30, 0xd0, 0x4a, 0x98, 0xdf, - 0x98, 0x64, 0x9c, 0x8c, 0xed, 0x31, 0x08, 0xc5, 0x68, 0x47, 0x24, 0x14, 0x1b, 0x5f, 0x61, 0xdc, - 0x88, 0x48, 0x88, 0x19, 0x24, 0x59, 0x41, 0x74, 0x6d, 0x89, 0x55, 0x99, 0x5a, 0x41, 0x14, 0x82, - 0x35, 0x2c, 0x54, 0x85, 0x12, 0xff, 0x87, 0xc9, 0x16, 0xdb, 0xe3, 0x39, 0xe3, 0x5e, 0x93, 0x48, - 0x62, 0xdc, 0xc7, 0xd9, 0x12, 0x93, 0x85, 0x38, 0x21, 0x62, 0x2c, 0xb1, 0xa1, 0x9e, 0x4b, 0xec, - 0x5b, 0x05, 0x40, 0x7c, 0x08, 0x7f, 0xc4, 0x06, 0xee, 0x46, 0xe7, 0xc0, 0x65, 0x1e, 0x36, 0x57, - 0x83, 0xba, 0xe3, 0xa5, 0x57, 0xed, 0x71, 0x8d, 0xde, 0x2f, 0x59, 0x80, 0x96, 0x5d, 0xbf, 0x41, - 0xc2, 0x13, 0x90, 0xb4, 0x8e, 0xc6, 0x3b, 0xae, 0xc2, 0xc4, 0xb2, 0xe7, 0x12, 0x3f, 0x5e, 0xab, - 0x2e, 0x07, 0xfe, 0x96, 0xdb, 0x44, 0x9f, 0x84, 0x09, 0x2a, 0x78, 0x06, 0xed, 0xb8, 0x46, 0xea, - 0x81, 0xcf, 0xce, 0x68, 0x2a, 0xae, 0xa1, 0xbb, 0x07, 0x73, 0x13, 0x1b, 0x06, 0x04, 0xa7, 0x30, - 0xed, 0x3f, 0xa2, 0x1f, 0x1a, 0xec, 0xb6, 0x02, 0x9f, 0xf8, 0xf1, 0x72, 0xe0, 0x37, 0xb8, 0x2c, - 0xf7, 0x49, 0x18, 0x88, 0x69, 0xc7, 0xf9, 0x47, 0x3e, 0x26, 0xa7, 0x96, 0x76, 0xf7, 0xf0, 0x60, - 0xee, 0x81, 0xce, 0x1a, 0xec, 0x83, 0x58, 0x1d, 0xf4, 0x53, 0x30, 0x14, 0xc5, 0x4e, 0xdc, 0x8e, - 0xc4, 0x67, 0x3f, 0x22, 0x3f, 0xbb, 0xc6, 0x4a, 0x0f, 0x0f, 0xe6, 0x26, 0x55, 0x35, 0x5e, 0x84, - 0x45, 0x05, 0xf4, 0x04, 0x0c, 0xef, 0x92, 0x28, 0x72, 0x9a, 0xf2, 0x18, 0x9e, 0x14, 0x75, 0x87, - 0xd7, 0x79, 0x31, 0x96, 0x70, 0xf4, 0x28, 0x0c, 0x92, 0x30, 0x0c, 0x42, 0xb1, 0xaa, 0xc6, 0x05, - 0xe2, 0xe0, 0x0a, 0x2d, 0xc4, 0x1c, 0x66, 0xff, 0x7b, 0x0b, 0x26, 0x55, 0x5f, 0x79, 0x5b, 0x27, - 0xc0, 0x6f, 0xdf, 0x04, 0xa8, 0xcb, 0x0f, 0x8c, 0x18, 0xbf, 0x1b, 0xbd, 0xf8, 0x58, 0xd6, 0x12, - 0xee, 0x1c, 0xc6, 0x84, 0xb2, 0x2a, 0x8a, 0xb0, 0x46, 0xcd, 0xfe, 0x17, 0x16, 0x9c, 0x4a, 0x7d, - 0xd1, 0x55, 0x37, 0x8a, 0xd1, 0x5b, 0x1d, 0x5f, 0x35, 0xdf, 0xdf, 0x57, 0xd1, 0xda, 0xec, 0x9b, - 0xd4, 0x9a, 0x93, 0x25, 0xda, 0x17, 0x5d, 0x86, 0x41, 0x37, 0x26, 0xbb, 0xf2, 0x63, 0x1e, 0xed, - 0xfa, 0x31, 0xbc, 0x57, 0xc9, 0x8c, 0xac, 0xd1, 0x9a, 0x98, 0x13, 0xb0, 0xff, 0x97, 0x05, 0x25, - 0xbe, 0x6c, 0xd7, 0x9d, 0xd6, 0x09, 0xcc, 0xc5, 0x1a, 0x0c, 0x30, 0xea, 0xbc, 0xe3, 0x8f, 0x67, - 0x77, 0x5c, 0x74, 0x67, 0x9e, 0x0a, 0x53, 0x5c, 0x68, 0x55, 0xcc, 0x8c, 0x16, 0x61, 0x46, 0x62, - 0xf6, 0x45, 0x28, 0x29, 0x04, 0x34, 0x05, 0xc5, 0x1d, 0xc2, 0x2f, 0x2a, 0x25, 0x4c, 0x7f, 0xa2, - 0x19, 0x18, 0xdc, 0x73, 0xbc, 0xb6, 0xd8, 0xec, 0x98, 0xff, 0xf9, 0x64, 0xe1, 0x25, 0xcb, 0xfe, - 0x26, 0xdb, 0x63, 0xa2, 0x91, 0x15, 0x7f, 0x4f, 0x30, 0x93, 0xf7, 0x60, 0xc6, 0xcb, 0xe0, 0x61, - 0x62, 0x20, 0xfa, 0xe7, 0x79, 0x0f, 0x8b, 0xbe, 0xce, 0x64, 0x41, 0x71, 0x66, 0x1b, 0xf4, 0x18, - 0x08, 0x5a, 0x74, 0x45, 0x39, 0x1e, 0xeb, 0xaf, 0x10, 0x40, 0xaf, 0x8b, 0x32, 0xac, 0xa0, 0x94, - 0x41, 0xcc, 0xa8, 0xce, 0x5f, 0x21, 0xfb, 0x35, 0xe2, 0x91, 0x7a, 0x1c, 0x84, 0x1f, 0x68, 0xf7, - 0xcf, 0xf2, 0xd1, 0xe7, 0xfc, 0x65, 0x54, 0x10, 0x28, 0x5e, 0x21, 0xfb, 0x7c, 0x2a, 0xf4, 0xaf, - 0x2b, 0x76, 0xfd, 0xba, 0xdf, 0xb0, 0x60, 0x5c, 0x7d, 0xdd, 0x09, 0x6c, 0xa4, 0x25, 0x73, 0x23, - 0x9d, 0xed, 0xba, 0x1e, 0x73, 0xb6, 0xd0, 0x0f, 0x19, 0x0b, 0x10, 0x38, 0xd5, 0x30, 0xa0, 0x43, - 0x43, 0x79, 0xf6, 0x07, 0x39, 0x21, 0xfd, 0x7c, 0xd7, 0x15, 0xb2, 0xbf, 0x11, 0x50, 0xf1, 0x21, - 0xfb, 0xbb, 0x8c, 0x59, 0x1b, 0xe8, 0x3a, 0x6b, 0xbf, 0x59, 0x80, 0xd3, 0x6a, 0x04, 0x8c, 0x03, - 0xfa, 0x47, 0x7d, 0x0c, 0x9e, 0x85, 0xd1, 0x06, 0xd9, 0x72, 0xda, 0x5e, 0xac, 0xee, 0xa2, 0x83, - 0x5c, 0x1f, 0x51, 0x49, 0x8a, 0xb1, 0x8e, 0x73, 0x84, 0x61, 0xfb, 0xb7, 0xc0, 0x78, 0x6f, 0xec, - 0xd0, 0x15, 0x4c, 0xa5, 0x37, 0x4d, 0xa3, 0x30, 0xa6, 0x6b, 0x14, 0x84, 0xf6, 0xe0, 0x51, 0x18, - 0x74, 0x77, 0xe9, 0x59, 0x5c, 0x30, 0x8f, 0xd8, 0x35, 0x5a, 0x88, 0x39, 0x0c, 0x7d, 0x0c, 0x86, - 0xeb, 0xc1, 0xee, 0xae, 0xe3, 0x37, 0xca, 0x45, 0x26, 0x4f, 0x8e, 0xd2, 0xe3, 0x7a, 0x99, 0x17, - 0x61, 0x09, 0x43, 0x0f, 0xc3, 0x80, 0x13, 0x36, 0xa3, 0xf2, 0x00, 0xc3, 0x19, 0xa1, 0x2d, 0x2d, - 0x86, 0xcd, 0x08, 0xb3, 0x52, 0x2a, 0x27, 0xde, 0x0e, 0xc2, 0x1d, 0xd7, 0x6f, 0x56, 0xdc, 0x90, - 0x09, 0x7d, 0x9a, 0x9c, 0x78, 0x4b, 0x41, 0xb0, 0x86, 0x85, 0x56, 0x61, 0xb0, 0x15, 0x84, 0x71, - 0x54, 0x1e, 0x62, 0xc3, 0xfd, 0x48, 0xce, 0x56, 0xe2, 0x5f, 0x5b, 0x0d, 0xc2, 0x38, 0xf9, 0x00, - 0xfa, 0x2f, 0xc2, 0xbc, 0x3a, 0xfa, 0x29, 0x28, 0x12, 0x7f, 0xaf, 0x3c, 0xcc, 0xa8, 0xcc, 0x66, - 0x51, 0x59, 0xf1, 0xf7, 0x6e, 0x3a, 0x61, 0xc2, 0x67, 0x56, 0xfc, 0x3d, 0x4c, 0xeb, 0xa0, 0x37, - 0xa0, 0x24, 0xb5, 0x91, 0x51, 0x79, 0x24, 0x7f, 0x89, 0x61, 0x81, 0x84, 0xc9, 0xbb, 0x6d, 0x37, - 0x24, 0xbb, 0xc4, 0x8f, 0xa3, 0xe4, 0x3e, 0x29, 0xa1, 0x11, 0x4e, 0xa8, 0xa1, 0x37, 0x60, 0x8c, - 0xcb, 0x91, 0xeb, 0x41, 0xdb, 0x8f, 0xa3, 0x72, 0x89, 0x75, 0x2f, 0x53, 0x75, 0x75, 0x33, 0xc1, - 0x5b, 0x9a, 0x11, 0x44, 0xc7, 0xb4, 0xc2, 0x08, 0x1b, 0xa4, 0x10, 0x86, 0x71, 0xcf, 0xdd, 0x23, - 0x3e, 0x89, 0xa2, 0x6a, 0x18, 0x6c, 0x92, 0x32, 0xb0, 0x9e, 0x9f, 0xc9, 0xd6, 0xe8, 0x04, 0x9b, - 0x64, 0x69, 0xfa, 0xee, 0xc1, 0xdc, 0xf8, 0x55, 0xbd, 0x0e, 0x36, 0x49, 0xa0, 0x1b, 0x30, 0x41, - 0x05, 0x54, 0x37, 0x21, 0x3a, 0xda, 0x8b, 0x28, 0x93, 0x4e, 0xb1, 0x51, 0x09, 0xa7, 0x88, 0xa0, - 0xd7, 0xa0, 0xe4, 0xb9, 0x5b, 0xa4, 0xbe, 0x5f, 0xf7, 0x48, 0x79, 0x8c, 0x51, 0xcc, 0xdc, 0x56, - 0x57, 0x25, 0x12, 0xbf, 0x00, 0xa8, 0xbf, 0x38, 0xa9, 0x8e, 0x6e, 0xc2, 0x03, 0x31, 0x09, 0x77, - 0x5d, 0xdf, 0xa1, 0xdb, 0x41, 0xc8, 0x93, 0x4c, 0x2f, 0x36, 0xce, 0xd6, 0xdb, 0x39, 0x31, 0x74, - 0x0f, 0x6c, 0x64, 0x62, 0xe1, 0x9c, 0xda, 0xe8, 0x3a, 0x4c, 0xb2, 0x9d, 0x50, 0x6d, 0x7b, 0x5e, - 0x35, 0xf0, 0xdc, 0xfa, 0x7e, 0x79, 0x82, 0x11, 0xfc, 0x98, 0x54, 0x7c, 0xad, 0x99, 0x60, 0x7a, - 0xe3, 0x4d, 0xfe, 0xe1, 0x74, 0x6d, 0xb4, 0xc9, 0x14, 0x21, 0xed, 0xd0, 0x8d, 0xf7, 0xe9, 0xfa, - 0x25, 0x77, 0xe2, 0xf2, 0x64, 0xd7, 0xfb, 0xa3, 0x8e, 0xaa, 0xb4, 0x25, 0x7a, 0x21, 0x4e, 0x13, - 0xa4, 0x5b, 0x3b, 0x8a, 0x1b, 0xae, 0x5f, 0x9e, 0x62, 0x1c, 0x43, 0xed, 0x8c, 0x1a, 0x2d, 0xc4, - 0x1c, 0xc6, 0x94, 0x20, 0xf4, 0xc7, 0x75, 0xca, 0x41, 0xa7, 0x19, 0x62, 0xa2, 0x04, 0x91, 0x00, - 0x9c, 0xe0, 0xd0, 0x63, 0x39, 0x8e, 0xf7, 0xcb, 0x88, 0xa1, 0xaa, 0xed, 0xb2, 0xb1, 0xf1, 0x06, - 0xa6, 0xe5, 0xe8, 0x2a, 0x0c, 0x13, 0x7f, 0x6f, 0x35, 0x0c, 0x76, 0xcb, 0xa7, 0xf2, 0xf7, 0xec, - 0x0a, 0x47, 0xe1, 0x0c, 0x3d, 0xb9, 0x00, 0x88, 0x62, 0x2c, 0x49, 0xa0, 0x3b, 0x50, 0xce, 0x98, - 0x11, 0x3e, 0x01, 0x33, 0x6c, 0x02, 0x5e, 0x11, 0x75, 0xcb, 0x1b, 0x39, 0x78, 0x87, 0x5d, 0x60, - 0x38, 0x97, 0xba, 0xbd, 0x09, 0x13, 0x8a, 0xb1, 0xb0, 0xb9, 0x45, 0x73, 0x30, 0x48, 0x39, 0xa6, - 0xbc, 0x52, 0x97, 0xe8, 0x50, 0x32, 0xd5, 0x14, 0xe6, 0xe5, 0x6c, 0x28, 0xdd, 0xf7, 0xc8, 0xd2, - 0x7e, 0x4c, 0xf8, 0xb5, 0xa8, 0xa8, 0x0d, 0xa5, 0x04, 0xe0, 0x04, 0xc7, 0xfe, 0x7f, 0x5c, 0x30, - 0x49, 0xb8, 0x57, 0x1f, 0xfc, 0xfa, 0x69, 0x18, 0xd9, 0x0e, 0xa2, 0x98, 0x62, 0xb3, 0x36, 0x06, - 0x13, 0x51, 0xe4, 0xb2, 0x28, 0xc7, 0x0a, 0x03, 0xbd, 0x0c, 0xe3, 0x75, 0xbd, 0x01, 0x71, 0xd8, - 0x9c, 0x16, 0x55, 0xcc, 0xd6, 0xb1, 0x89, 0x8b, 0x5e, 0x82, 0x11, 0xf6, 0x40, 0x51, 0x0f, 0x3c, - 0x71, 0x01, 0x93, 0x27, 0xe6, 0x48, 0x55, 0x94, 0x1f, 0x6a, 0xbf, 0xb1, 0xc2, 0xa6, 0x97, 0x62, - 0xda, 0x85, 0xb5, 0xaa, 0x60, 0xf3, 0xea, 0x52, 0x7c, 0x99, 0x95, 0x62, 0x01, 0xb5, 0xff, 0x5a, - 0x41, 0x1b, 0x65, 0x7a, 0xa5, 0x20, 0xa8, 0x0a, 0xc3, 0xb7, 0x1d, 0x37, 0x76, 0xfd, 0xa6, 0x38, - 0xcf, 0x9f, 0xe8, 0xca, 0xf3, 0x59, 0xa5, 0x5b, 0xbc, 0x02, 0x3f, 0x95, 0xc4, 0x1f, 0x2c, 0xc9, - 0x50, 0x8a, 0x61, 0xdb, 0xf7, 0x29, 0xc5, 0x42, 0xbf, 0x14, 0x31, 0xaf, 0xc0, 0x29, 0x8a, 0x3f, - 0x58, 0x92, 0x41, 0x6f, 0x01, 0xc8, 0x75, 0x43, 0x1a, 0xe2, 0x61, 0xe0, 0xe9, 0xde, 0x44, 0x37, - 0x54, 0x9d, 0xa5, 0x09, 0x7a, 0xe6, 0x25, 0xff, 0xb1, 0x46, 0xcf, 0x8e, 0x99, 0xdc, 0xd3, 0xd9, - 0x19, 0xf4, 0xb3, 0x74, 0xab, 0x3a, 0x61, 0x4c, 0x1a, 0x8b, 0xb1, 0x18, 0x9c, 0x27, 0xfb, 0x13, - 0x5b, 0x37, 0xdc, 0x5d, 0xa2, 0x6f, 0x6b, 0x41, 0x04, 0x27, 0xf4, 0xec, 0xdf, 0x2a, 0x42, 0x39, - 0xaf, 0xbb, 0x74, 0xd1, 0x91, 0x3b, 0x6e, 0xbc, 0x4c, 0xc5, 0x15, 0xcb, 0x5c, 0x74, 0x2b, 0xa2, - 0x1c, 0x2b, 0x0c, 0x3a, 0xfb, 0x91, 0xdb, 0x94, 0xb7, 0x8e, 0xc1, 0x64, 0xf6, 0x6b, 0xac, 0x14, - 0x0b, 0x28, 0xc5, 0x0b, 0x89, 0x13, 0x89, 0x97, 0x27, 0x6d, 0x95, 0x60, 0x56, 0x8a, 0x05, 0x54, - 0x57, 0x18, 0x0c, 0xf4, 0x50, 0x18, 0x18, 0x43, 0x34, 0x78, 0xbc, 0x43, 0x84, 0xde, 0x06, 0xd8, - 0x72, 0x7d, 0x37, 0xda, 0x66, 0xd4, 0x87, 0x8e, 0x4c, 0x5d, 0x09, 0x3b, 0xab, 0x8a, 0x0a, 0xd6, - 0x28, 0xa2, 0x17, 0x60, 0x54, 0x6d, 0xc0, 0xb5, 0x4a, 0x79, 0xd8, 0x7c, 0xd6, 0x48, 0xb8, 0x51, - 0x05, 0xeb, 0x78, 0xf6, 0x3b, 0xe9, 0xf5, 0x22, 0x76, 0x80, 0x36, 0xbe, 0x56, 0xbf, 0xe3, 0x5b, - 0xe8, 0x3e, 0xbe, 0xf6, 0xef, 0x15, 0x61, 0xd2, 0x68, 0xac, 0x1d, 0xf5, 0xc1, 0xb3, 0x2e, 0xd1, - 0x83, 0xc8, 0x89, 0x89, 0xd8, 0x7f, 0x76, 0xef, 0xad, 0xa2, 0x1f, 0x56, 0x74, 0x07, 0xf0, 0xfa, - 0xe8, 0x6d, 0x28, 0x79, 0x4e, 0xc4, 0x94, 0x0f, 0x44, 0xec, 0xbb, 0x7e, 0x88, 0x25, 0x82, 0xbe, - 0x13, 0xc5, 0xda, 0x59, 0xc0, 0x69, 0x27, 0x24, 0xe9, 0x89, 0x49, 0x85, 0x13, 0xf9, 0xb4, 0xa9, - 0x3a, 0x41, 0x25, 0x98, 0x7d, 0xcc, 0x61, 0xe8, 0x25, 0x18, 0x0b, 0x09, 0x5b, 0x15, 0xcb, 0x54, - 0xd6, 0x62, 0xcb, 0x6c, 0x30, 0x11, 0xca, 0xb0, 0x06, 0xc3, 0x06, 0x66, 0x22, 0x6b, 0x0f, 0x75, - 0x91, 0xb5, 0x9f, 0x80, 0x61, 0xf6, 0x43, 0xad, 0x00, 0x35, 0x1b, 0x6b, 0xbc, 0x18, 0x4b, 0x78, - 0x7a, 0xc1, 0x8c, 0xf4, 0xb9, 0x60, 0x9e, 0x84, 0x89, 0x8a, 0x43, 0x76, 0x03, 0x7f, 0xc5, 0x6f, - 0xb4, 0x02, 0xd7, 0x8f, 0x51, 0x19, 0x06, 0xd8, 0xe9, 0xc0, 0xf7, 0xf6, 0x00, 0xa5, 0x80, 0x07, - 0xa8, 0xe4, 0x6c, 0xff, 0x61, 0x01, 0xc6, 0x2b, 0xc4, 0x23, 0x31, 0xe1, 0x77, 0x8d, 0x08, 0xad, - 0x02, 0x6a, 0x86, 0x4e, 0x9d, 0x54, 0x49, 0xe8, 0x06, 0x0d, 0x5d, 0x19, 0x59, 0x64, 0x0a, 0x7f, - 0x74, 0xa9, 0x03, 0x8a, 0x33, 0x6a, 0xa0, 0x37, 0x61, 0xbc, 0x15, 0x12, 0x43, 0x87, 0x66, 0xe5, - 0x89, 0x0b, 0x55, 0x1d, 0x91, 0x4b, 0xaa, 0x46, 0x11, 0x36, 0x49, 0xa1, 0x9f, 0x81, 0xa9, 0x20, - 0x6c, 0x6d, 0x3b, 0x7e, 0x85, 0xb4, 0x88, 0xdf, 0xa0, 0xa2, 0xb8, 0xd0, 0x11, 0xcc, 0xdc, 0x3d, - 0x98, 0x9b, 0xba, 0x9e, 0x82, 0xe1, 0x0e, 0x6c, 0xf4, 0x26, 0x4c, 0xb7, 0xc2, 0xa0, 0xe5, 0x34, - 0xd9, 0x42, 0x11, 0x12, 0x07, 0xe7, 0x3e, 0x4f, 0xdf, 0x3d, 0x98, 0x9b, 0xae, 0xa6, 0x81, 0x87, - 0x07, 0x73, 0xa7, 0xd8, 0x40, 0xd1, 0x92, 0x04, 0x88, 0x3b, 0xc9, 0xd8, 0x4d, 0x38, 0x5d, 0x09, - 0x6e, 0xfb, 0xb7, 0x9d, 0xb0, 0xb1, 0x58, 0x5d, 0xd3, 0x2e, 0xf7, 0xd7, 0xe4, 0xe5, 0x92, 0x3f, - 0xbf, 0x66, 0x9e, 0x53, 0x5a, 0x4d, 0x2e, 0xfe, 0xaf, 0xba, 0x1e, 0xc9, 0x51, 0x22, 0xfc, 0xcd, - 0x82, 0xd1, 0x52, 0x82, 0xaf, 0xf4, 0xfe, 0x56, 0xae, 0xde, 0xff, 0x75, 0x18, 0xd9, 0x72, 0x89, - 0xd7, 0xc0, 0x64, 0x4b, 0xcc, 0xcc, 0xe3, 0xf9, 0x2f, 0x4a, 0xab, 0x14, 0x53, 0x2a, 0x8d, 0xf8, - 0xd5, 0x74, 0x55, 0x54, 0xc6, 0x8a, 0x0c, 0xda, 0x81, 0x29, 0x79, 0xf7, 0x91, 0x50, 0xb1, 0x89, - 0x9f, 0xe8, 0x76, 0xa1, 0x32, 0x89, 0xb3, 0x09, 0xc4, 0x29, 0x32, 0xb8, 0x83, 0x30, 0xbd, 0x8b, - 0xee, 0xd2, 0xe3, 0x6a, 0x80, 0x2d, 0x69, 0x76, 0x17, 0x65, 0xd7, 0x6a, 0x56, 0x6a, 0x7f, 0xd5, - 0x82, 0x07, 0x3b, 0x46, 0x46, 0xa8, 0x17, 0x8e, 0x79, 0x16, 0xd2, 0xd7, 0xfd, 0x42, 0xef, 0xeb, - 0xbe, 0xfd, 0x0f, 0x2d, 0x98, 0x59, 0xd9, 0x6d, 0xc5, 0xfb, 0x15, 0xd7, 0x7c, 0x9b, 0x78, 0x11, - 0x86, 0x76, 0x49, 0xc3, 0x6d, 0xef, 0x8a, 0x99, 0x9b, 0x93, 0x2c, 0x7d, 0x9d, 0x95, 0x1e, 0x1e, - 0xcc, 0x8d, 0xd7, 0xe2, 0x20, 0x74, 0x9a, 0x84, 0x17, 0x60, 0x81, 0xce, 0x0e, 0x46, 0xf7, 0x3d, - 0x72, 0xd5, 0xdd, 0x75, 0xe5, 0x0b, 0x61, 0x57, 0x95, 0xd7, 0xbc, 0x1c, 0xd0, 0xf9, 0xd7, 0xdb, - 0x8e, 0x1f, 0xbb, 0xf1, 0xbe, 0x78, 0x76, 0x91, 0x44, 0x70, 0x42, 0xcf, 0xfe, 0xae, 0x05, 0x93, - 0x92, 0x97, 0x2c, 0x36, 0x1a, 0x21, 0x89, 0x22, 0x34, 0x0b, 0x05, 0xb7, 0x25, 0x7a, 0x09, 0xa2, - 0x97, 0x85, 0xb5, 0x2a, 0x2e, 0xb8, 0x2d, 0x54, 0x85, 0x12, 0x7f, 0x68, 0x4c, 0x16, 0x57, 0x5f, - 0xcf, 0x95, 0xac, 0x07, 0x1b, 0xb2, 0x26, 0x4e, 0x88, 0x48, 0xa9, 0x98, 0x9d, 0x43, 0x45, 0xf3, - 0xcd, 0xe6, 0xb2, 0x28, 0xc7, 0x0a, 0x03, 0x5d, 0x80, 0x11, 0x3f, 0x68, 0xf0, 0x77, 0x5f, 0xbe, - 0xa7, 0xd9, 0x92, 0xbd, 0x26, 0xca, 0xb0, 0x82, 0xda, 0xbf, 0x68, 0xc1, 0x98, 0xfc, 0xb2, 0x3e, - 0x05, 0x74, 0xba, 0xb5, 0x12, 0xe1, 0x3c, 0xd9, 0x5a, 0x54, 0xc0, 0x66, 0x10, 0x43, 0xae, 0x2e, - 0x1e, 0x45, 0xae, 0xb6, 0xbf, 0x52, 0x80, 0x09, 0xd9, 0x9d, 0x5a, 0x7b, 0x33, 0x22, 0x31, 0xda, - 0x80, 0x92, 0xc3, 0x87, 0x9c, 0xc8, 0x15, 0xfb, 0x68, 0xf6, 0x8d, 0xcb, 0x98, 0x9f, 0x44, 0xd4, - 0x59, 0x94, 0xb5, 0x71, 0x42, 0x08, 0x79, 0x30, 0xed, 0x07, 0x31, 0x3b, 0xf6, 0x14, 0xbc, 0xdb, - 0xbb, 0x40, 0x9a, 0xfa, 0x19, 0x41, 0x7d, 0xfa, 0x5a, 0x9a, 0x0a, 0xee, 0x24, 0x8c, 0x56, 0xa4, - 0x96, 0xa7, 0xc8, 0x5a, 0x38, 0xdf, 0xad, 0x85, 0x7c, 0x25, 0x8f, 0xfd, 0x3b, 0x16, 0x94, 0x24, - 0xda, 0x49, 0x3c, 0x01, 0xad, 0xc3, 0x70, 0xc4, 0x26, 0x41, 0x0e, 0x8d, 0xdd, 0xad, 0xe3, 0x7c, - 0xbe, 0x92, 0xd3, 0x9c, 0xff, 0x8f, 0xb0, 0xa4, 0xc1, 0xd4, 0xd4, 0xaa, 0xfb, 0x1f, 0x12, 0x35, - 0xb5, 0xea, 0x4f, 0xce, 0x09, 0xf3, 0x5f, 0x59, 0x9f, 0xb5, 0xbb, 0x3c, 0x15, 0x3a, 0x5b, 0x21, - 0xd9, 0x72, 0xef, 0xa4, 0x85, 0xce, 0x2a, 0x2b, 0xc5, 0x02, 0x8a, 0xde, 0x82, 0xb1, 0xba, 0xd4, - 0xee, 0x26, 0x6c, 0xe0, 0xb1, 0xae, 0xba, 0x72, 0xf5, 0xac, 0xc2, 0x6d, 0xc2, 0x96, 0xb5, 0xfa, - 0xd8, 0xa0, 0x66, 0x3e, 0xcc, 0x17, 0x7b, 0x3d, 0xcc, 0x27, 0x74, 0x73, 0x9f, 0x96, 0xed, 0x5f, - 0xb1, 0x60, 0x88, 0xeb, 0x08, 0xfb, 0x53, 0xaa, 0x6a, 0xcf, 0x44, 0xc9, 0xd8, 0xdd, 0xa4, 0x85, - 0xe2, 0xd5, 0x08, 0xad, 0x43, 0x89, 0xfd, 0x60, 0xba, 0x92, 0x62, 0xbe, 0x31, 0x1c, 0x6f, 0x55, - 0xef, 0xe0, 0x4d, 0x59, 0x0d, 0x27, 0x14, 0xec, 0x2f, 0x17, 0x29, 0xab, 0x4a, 0x50, 0x8d, 0x13, - 0xdc, 0xba, 0x7f, 0x27, 0x78, 0xe1, 0x7e, 0x9d, 0xe0, 0x4d, 0x98, 0xac, 0x6b, 0x6f, 0x52, 0xc9, - 0x4c, 0x5e, 0xe8, 0xba, 0x48, 0xb4, 0xe7, 0x2b, 0xae, 0x27, 0x5b, 0x36, 0x89, 0xe0, 0x34, 0x55, - 0xf4, 0xb3, 0x30, 0xc6, 0xe7, 0x59, 0xb4, 0x32, 0xc0, 0x5a, 0xf9, 0x58, 0xfe, 0x7a, 0xd1, 0x9b, - 0x60, 0x2b, 0xb1, 0xa6, 0x55, 0xc7, 0x06, 0x31, 0xfb, 0x0b, 0x83, 0x30, 0xb8, 0xb2, 0x47, 0xfc, - 0xf8, 0x04, 0x18, 0x52, 0x1d, 0x26, 0x5c, 0x7f, 0x2f, 0xf0, 0xf6, 0x48, 0x83, 0xc3, 0x8f, 0x72, - 0xb8, 0x3e, 0x20, 0x48, 0x4f, 0xac, 0x19, 0x24, 0x70, 0x8a, 0xe4, 0xfd, 0xb8, 0xb5, 0x5f, 0x82, - 0x21, 0x3e, 0xf7, 0xe2, 0xca, 0x9e, 0xa9, 0x01, 0x67, 0x83, 0x28, 0x76, 0x41, 0xa2, 0x51, 0xe0, - 0x2a, 0x77, 0x51, 0x1d, 0xbd, 0x03, 0x13, 0x5b, 0x6e, 0x18, 0xc5, 0xf4, 0xba, 0x1d, 0xc5, 0xce, - 0x6e, 0xeb, 0x1e, 0x6e, 0xe9, 0x6a, 0x1c, 0x56, 0x0d, 0x4a, 0x38, 0x45, 0x19, 0x35, 0x61, 0x9c, - 0x5e, 0x1c, 0x93, 0xa6, 0x86, 0x8f, 0xdc, 0x94, 0x52, 0xc3, 0x5d, 0xd5, 0x09, 0x61, 0x93, 0x2e, - 0x65, 0x26, 0x75, 0x76, 0xd1, 0x1c, 0x61, 0x12, 0x85, 0x62, 0x26, 0xfc, 0x86, 0xc9, 0x61, 0x94, - 0x27, 0x31, 0x5b, 0x8e, 0x92, 0xc9, 0x93, 0x12, 0x8b, 0x0d, 0xfb, 0x6b, 0xf4, 0x74, 0xa4, 0x63, - 0x78, 0x02, 0x47, 0xcb, 0xab, 0xe6, 0xd1, 0x72, 0x26, 0x77, 0x3e, 0x73, 0x8e, 0x95, 0xcf, 0xc0, - 0xa8, 0x36, 0xdd, 0x68, 0x01, 0x4a, 0x75, 0x69, 0x78, 0x20, 0xb8, 0xae, 0x12, 0x5f, 0x94, 0x45, - 0x02, 0x4e, 0x70, 0xe8, 0x68, 0x50, 0x61, 0x2f, 0x6d, 0xd6, 0x44, 0x45, 0x41, 0xcc, 0x20, 0xf6, - 0x73, 0x00, 0x2b, 0x77, 0x48, 0x7d, 0x91, 0x5f, 0xbc, 0xb4, 0xf7, 0x2d, 0x2b, 0xff, 0x7d, 0xcb, - 0xfe, 0x0f, 0x16, 0x4c, 0xac, 0x2e, 0x1b, 0x02, 0xf9, 0x3c, 0x00, 0x97, 0x42, 0x6f, 0xdd, 0xba, - 0x26, 0x35, 0xc3, 0x5c, 0xb9, 0xa7, 0x4a, 0xb1, 0x86, 0x81, 0xce, 0x40, 0xd1, 0x6b, 0xfb, 0x42, - 0x38, 0x1c, 0xbe, 0x7b, 0x30, 0x57, 0xbc, 0xda, 0xf6, 0x31, 0x2d, 0xd3, 0x2c, 0x89, 0x8a, 0x7d, - 0x5b, 0x12, 0xf5, 0x34, 0xc1, 0x46, 0x73, 0x30, 0x78, 0xfb, 0xb6, 0xdb, 0x88, 0xca, 0x83, 0x89, - 0xd6, 0xfa, 0xd6, 0xad, 0xb5, 0x4a, 0x84, 0x79, 0xb9, 0xfd, 0x17, 0x8a, 0x30, 0xb5, 0xea, 0x91, - 0x3b, 0xc6, 0x67, 0x3d, 0x06, 0x43, 0x8d, 0xd0, 0xdd, 0x23, 0x61, 0xfa, 0x14, 0xaf, 0xb0, 0x52, - 0x2c, 0xa0, 0x7d, 0x5b, 0x3f, 0xdd, 0xe8, 0x3c, 0x8f, 0x8f, 0xdb, 0xde, 0xab, 0xf7, 0x50, 0xbc, - 0x05, 0xc3, 0xfc, 0x99, 0x94, 0x0f, 0xc6, 0xe8, 0xc5, 0x67, 0xb3, 0xba, 0x90, 0x1e, 0x8b, 0x79, - 0xa1, 0xf8, 0xe0, 0x36, 0x23, 0x8a, 0x89, 0x89, 0x52, 0x2c, 0x49, 0xce, 0x7e, 0x12, 0xc6, 0x74, - 0xcc, 0x23, 0x19, 0x8f, 0xfc, 0x45, 0x0b, 0x4e, 0xad, 0x7a, 0x41, 0x7d, 0x27, 0x65, 0x8a, 0xf6, - 0x02, 0x8c, 0xd2, 0xfd, 0x14, 0x19, 0x66, 0xad, 0x86, 0xa1, 0xb3, 0x00, 0x61, 0x1d, 0x4f, 0xab, - 0x76, 0xe3, 0xc6, 0x5a, 0x25, 0xcb, 0x3e, 0x5a, 0x80, 0xb0, 0x8e, 0x67, 0x7f, 0xc7, 0x82, 0xb3, - 0x97, 0x96, 0x57, 0x12, 0x6b, 0xcc, 0x0e, 0x13, 0x6d, 0x2a, 0xdc, 0x35, 0xb4, 0xae, 0x24, 0xc2, - 0x5d, 0x85, 0xf5, 0x42, 0x40, 0x3f, 0x2c, 0xee, 0x07, 0xbf, 0x66, 0xc1, 0xa9, 0x4b, 0x6e, 0x8c, - 0x49, 0x2b, 0x48, 0x1b, 0x0b, 0x87, 0xa4, 0x15, 0x44, 0x6e, 0x1c, 0x84, 0xfb, 0x69, 0x63, 0x61, - 0xac, 0x20, 0x58, 0xc3, 0xe2, 0x2d, 0xef, 0xb9, 0x11, 0xed, 0x69, 0xc1, 0xbc, 0x61, 0x62, 0x51, - 0x8e, 0x15, 0x06, 0xfd, 0xb0, 0x86, 0x1b, 0x32, 0x09, 0x61, 0x5f, 0x6c, 0x67, 0xf5, 0x61, 0x15, - 0x09, 0xc0, 0x09, 0x8e, 0xfd, 0x55, 0x0b, 0x4e, 0x5f, 0xf2, 0xda, 0x51, 0x4c, 0xc2, 0xad, 0xc8, - 0xe8, 0xec, 0x73, 0x50, 0x22, 0x52, 0x0a, 0x17, 0x7d, 0x55, 0xe7, 0x86, 0x12, 0xcf, 0xb9, 0xa5, - 0xb2, 0xc2, 0xeb, 0xc3, 0xae, 0xf3, 0x68, 0xf6, 0x88, 0x5f, 0x2f, 0xc0, 0xf8, 0xe5, 0x8d, 0x8d, - 0xea, 0x25, 0x12, 0x0b, 0x96, 0xd9, 0x5b, 0x83, 0x84, 0xb5, 0x8b, 0x70, 0x37, 0x59, 0xa7, 0x1d, - 0xbb, 0xde, 0x3c, 0x77, 0x8d, 0x99, 0x5f, 0xf3, 0xe3, 0xeb, 0x61, 0x2d, 0x0e, 0x5d, 0xbf, 0x99, - 0x79, 0x75, 0x96, 0x8c, 0xbd, 0x98, 0xc7, 0xd8, 0xd1, 0x73, 0x30, 0xc4, 0x7c, 0x73, 0xa4, 0xd4, - 0xf1, 0x90, 0x12, 0x15, 0x58, 0xe9, 0xe1, 0xc1, 0x5c, 0xe9, 0x06, 0x5e, 0xe3, 0x7f, 0xb0, 0x40, - 0x45, 0x37, 0x60, 0x74, 0x3b, 0x8e, 0x5b, 0x97, 0x89, 0xd3, 0x20, 0xa1, 0xe4, 0x0e, 0xe7, 0xb2, - 0xb8, 0x03, 0x1d, 0x04, 0x8e, 0x96, 0x6c, 0xa8, 0xa4, 0x2c, 0xc2, 0x3a, 0x1d, 0xbb, 0x06, 0x90, - 0xc0, 0x8e, 0xe9, 0xda, 0x60, 0xff, 0xc0, 0x82, 0xe1, 0xcb, 0x8e, 0xdf, 0xf0, 0x48, 0x88, 0x5e, - 0x81, 0x01, 0x72, 0x87, 0xd4, 0xc5, 0x09, 0x9e, 0xd9, 0xe1, 0xe4, 0x94, 0xe3, 0x4a, 0x30, 0xfa, - 0x1f, 0xb3, 0x5a, 0xe8, 0x32, 0x0c, 0xd3, 0xde, 0x5e, 0x52, 0x36, 0xe3, 0x8f, 0xe4, 0x7d, 0xb1, - 0x9a, 0x76, 0x7e, 0x30, 0x8a, 0x22, 0x2c, 0xab, 0x33, 0x85, 0x4e, 0xbd, 0x55, 0xa3, 0x0c, 0x2c, - 0xee, 0x76, 0xdd, 0xda, 0x58, 0xae, 0x72, 0x24, 0x41, 0x8d, 0x2b, 0x74, 0x64, 0x21, 0x4e, 0x88, - 0xd8, 0x1b, 0x50, 0xa2, 0x93, 0xba, 0xe8, 0xb9, 0x4e, 0x77, 0x5d, 0xd2, 0x53, 0x50, 0x92, 0x7a, - 0x9d, 0x48, 0x98, 0x9d, 0x33, 0xaa, 0x52, 0xed, 0x13, 0xe1, 0x04, 0x6e, 0x6f, 0xc1, 0x0c, 0x7b, - 0x24, 0x75, 0xe2, 0x6d, 0x63, 0x8f, 0xf5, 0x5e, 0xcc, 0x4f, 0x0b, 0xf9, 0x8a, 0xcf, 0x4c, 0x59, - 0xb3, 0x93, 0x1d, 0x93, 0x14, 0x35, 0x59, 0xeb, 0x3f, 0x0f, 0xc0, 0xf4, 0x5a, 0x6d, 0xb9, 0x66, - 0x2a, 0x16, 0x5f, 0x82, 0x31, 0x2e, 0x09, 0xd0, 0x05, 0xed, 0x78, 0xa2, 0x35, 0xf5, 0x70, 0xb0, - 0xa1, 0xc1, 0xb0, 0x81, 0x89, 0xce, 0x42, 0xd1, 0x7d, 0xd7, 0x4f, 0x9b, 0xc2, 0xad, 0xbd, 0x7e, - 0x0d, 0xd3, 0x72, 0x0a, 0xa6, 0x42, 0x05, 0x67, 0xa0, 0x0a, 0xac, 0x04, 0x8b, 0x57, 0x61, 0xc2, - 0x8d, 0xea, 0x91, 0xbb, 0xe6, 0x53, 0xee, 0x92, 0xf8, 0x5c, 0x24, 0x12, 0x3f, 0xed, 0xaa, 0x82, - 0xe2, 0x14, 0xb6, 0xc6, 0xcd, 0x07, 0xfb, 0x16, 0x4c, 0x7a, 0x5a, 0x5f, 0x53, 0x99, 0xab, 0xc5, - 0xbe, 0x2e, 0x62, 0x66, 0x39, 0x42, 0xe6, 0xe2, 0x1f, 0x1c, 0x61, 0x09, 0x43, 0x97, 0x60, 0xba, - 0xbe, 0xed, 0xb4, 0x16, 0xdb, 0xf1, 0x76, 0xc5, 0x8d, 0xea, 0xc1, 0x1e, 0x09, 0xf7, 0x99, 0x24, - 0x3c, 0x92, 0x28, 0x99, 0x14, 0x60, 0xf9, 0xf2, 0x62, 0x95, 0x62, 0xe2, 0xce, 0x3a, 0xa6, 0x08, - 0x02, 0xc7, 0x26, 0x82, 0x2c, 0xc2, 0xa4, 0x6c, 0xab, 0x46, 0x22, 0x76, 0x3c, 0x8c, 0xb2, 0xde, - 0x29, 0x97, 0x28, 0x51, 0xac, 0xfa, 0x96, 0xc6, 0x47, 0x2f, 0xc2, 0xb8, 0xeb, 0xbb, 0xb1, 0xeb, - 0xc4, 0x41, 0xc8, 0x0e, 0xd7, 0x31, 0x7e, 0x60, 0x50, 0x0e, 0xbf, 0xa6, 0x03, 0xb0, 0x89, 0x67, - 0xbf, 0x03, 0x25, 0x65, 0x6b, 0x26, 0xcd, 0x25, 0xad, 0x1c, 0x73, 0xc9, 0xde, 0x27, 0x82, 0xd4, - 0x98, 0x17, 0x33, 0x35, 0xe6, 0x7f, 0xcb, 0x82, 0xc4, 0xe4, 0x06, 0x5d, 0x86, 0x52, 0x2b, 0x60, - 0xaf, 0x66, 0xa1, 0x7c, 0x8a, 0x7e, 0x28, 0x93, 0x79, 0x70, 0x46, 0xc5, 0xc7, 0xaf, 0x2a, 0x6b, - 0xe0, 0xa4, 0x32, 0x5a, 0x82, 0xe1, 0x56, 0x48, 0x6a, 0x31, 0x73, 0x1a, 0xe9, 0x49, 0x87, 0xaf, - 0x11, 0x8e, 0x8f, 0x65, 0x45, 0xfb, 0x37, 0x2d, 0x00, 0xae, 0x94, 0x76, 0xfc, 0x26, 0x39, 0x81, - 0x8b, 0x76, 0x05, 0x06, 0xa2, 0x16, 0xa9, 0x77, 0x7b, 0xcf, 0x4c, 0xfa, 0x53, 0x6b, 0x91, 0x7a, - 0x32, 0xe0, 0xf4, 0x1f, 0x66, 0xb5, 0xed, 0x5f, 0x00, 0x98, 0x48, 0xd0, 0xe8, 0x05, 0x08, 0x3d, - 0x63, 0x98, 0xe4, 0x9f, 0x49, 0x99, 0xe4, 0x97, 0x18, 0xb6, 0x66, 0x85, 0xff, 0x0e, 0x14, 0x77, - 0x9d, 0x3b, 0xe2, 0x96, 0xf5, 0x54, 0xf7, 0x6e, 0x50, 0xfa, 0xf3, 0xeb, 0xce, 0x1d, 0x2e, 0xc7, - 0x3e, 0x25, 0x17, 0xc8, 0xba, 0x73, 0xe7, 0x90, 0xbf, 0x5a, 0x32, 0x26, 0x45, 0x2f, 0x73, 0x9f, - 0xfb, 0x4f, 0xc9, 0x7f, 0xb6, 0xec, 0x68, 0x23, 0xac, 0x2d, 0xd7, 0x17, 0x2a, 0xda, 0xbe, 0xda, - 0x72, 0xfd, 0x74, 0x5b, 0xae, 0xdf, 0x47, 0x5b, 0xae, 0x8f, 0xde, 0x83, 0x61, 0xf1, 0x1c, 0xc2, - 0x6c, 0x09, 0x47, 0x2f, 0x2e, 0xf4, 0xd1, 0x9e, 0x78, 0x4d, 0xe1, 0x6d, 0x2e, 0x48, 0x39, 0x5d, - 0x94, 0xf6, 0x6c, 0x57, 0x36, 0x88, 0xfe, 0x86, 0x05, 0x13, 0xe2, 0x37, 0x26, 0xef, 0xb6, 0x49, - 0x14, 0x0b, 0x79, 0xe0, 0x13, 0xfd, 0xf7, 0x41, 0x54, 0xe4, 0x5d, 0xf9, 0x84, 0x64, 0xb3, 0x26, - 0xb0, 0x67, 0x8f, 0x52, 0xbd, 0x40, 0xff, 0xd8, 0x82, 0x99, 0x5d, 0xe7, 0x0e, 0x6f, 0x91, 0x97, - 0x61, 0x27, 0x76, 0x03, 0x61, 0x1b, 0xf9, 0x4a, 0x7f, 0xd3, 0xdf, 0x51, 0x9d, 0x77, 0x52, 0x9a, - 0x51, 0xcd, 0x64, 0xa1, 0xf4, 0xec, 0x6a, 0x66, 0xbf, 0x66, 0xb7, 0x60, 0x44, 0xae, 0xb7, 0x8c, - 0xdb, 0x50, 0x45, 0x17, 0x76, 0x8e, 0xfc, 0x1a, 0xa5, 0xdd, 0x9e, 0x58, 0x3b, 0x62, 0xad, 0xdd, - 0xd7, 0x76, 0xde, 0x81, 0x31, 0x7d, 0x8d, 0xdd, 0xd7, 0xb6, 0xde, 0x85, 0x53, 0x19, 0x6b, 0xe9, - 0xbe, 0x36, 0x79, 0x1b, 0xce, 0xe4, 0xae, 0x8f, 0xfb, 0xd9, 0xb0, 0xfd, 0x75, 0x4b, 0xe7, 0x83, - 0x27, 0xa0, 0x9e, 0x5a, 0x36, 0xd5, 0x53, 0xe7, 0xba, 0xef, 0x9c, 0x1c, 0x1d, 0xd5, 0x5b, 0x7a, - 0xa7, 0x29, 0x57, 0x47, 0xaf, 0xc1, 0x90, 0x47, 0x4b, 0xe4, 0x3b, 0x9c, 0xdd, 0x7b, 0x47, 0x26, - 0xb2, 0x14, 0x2b, 0x8f, 0xb0, 0xa0, 0x60, 0xff, 0xb6, 0x05, 0x03, 0x27, 0x30, 0x12, 0xd8, 0x1c, - 0x89, 0x67, 0x72, 0x49, 0x8b, 0xb8, 0x07, 0xf3, 0xd8, 0xb9, 0xbd, 0x22, 0x63, 0x3b, 0xe4, 0x0c, - 0xcc, 0xff, 0x2d, 0xc0, 0x28, 0x6d, 0x4a, 0x1a, 0x8c, 0xbc, 0x0c, 0xe3, 0x9e, 0xb3, 0x49, 0x3c, - 0xa9, 0x32, 0x4f, 0x5f, 0x62, 0xaf, 0xea, 0x40, 0x6c, 0xe2, 0xd2, 0xca, 0x5b, 0xfa, 0xeb, 0x81, - 0x90, 0x5f, 0x54, 0x65, 0xe3, 0x69, 0x01, 0x9b, 0xb8, 0xf4, 0x3e, 0x75, 0xdb, 0x89, 0xeb, 0xdb, - 0xe2, 0x82, 0xab, 0xba, 0x7b, 0x8b, 0x16, 0x62, 0x0e, 0xa3, 0x02, 0x9c, 0x5c, 0x9d, 0x37, 0x49, - 0xc8, 0x04, 0x38, 0x2e, 0x1e, 0x2b, 0x01, 0x0e, 0x9b, 0x60, 0x9c, 0xc6, 0xcf, 0xf0, 0xcd, 0x1b, - 0x64, 0xe6, 0x30, 0x7d, 0xf8, 0xe6, 0xa1, 0x2a, 0xcc, 0xb8, 0x7e, 0xdd, 0x6b, 0x37, 0xc8, 0x0d, - 0x9f, 0x4b, 0x77, 0x9e, 0xfb, 0x1e, 0x69, 0x08, 0x01, 0x5a, 0x59, 0x2e, 0xad, 0x65, 0xe0, 0xe0, - 0xcc, 0x9a, 0xf6, 0x9f, 0x83, 0x53, 0x57, 0x03, 0xa7, 0xb1, 0xe4, 0x78, 0x8e, 0x5f, 0x27, 0xe1, - 0x9a, 0xdf, 0xec, 0xf9, 0x20, 0xaf, 0x3f, 0x9f, 0x17, 0x7a, 0x3d, 0x9f, 0xdb, 0xdb, 0x80, 0xf4, - 0x06, 0x84, 0x19, 0x18, 0x86, 0x61, 0x97, 0x37, 0x25, 0x96, 0xff, 0xe3, 0xd9, 0xd2, 0x75, 0x47, - 0xcf, 0x34, 0x03, 0x27, 0x5e, 0x80, 0x25, 0x21, 0xfb, 0x25, 0xc8, 0xf4, 0xcd, 0xe8, 0x7d, 0x95, - 0xb6, 0x5f, 0x80, 0x69, 0x56, 0xf3, 0x68, 0xd7, 0x3c, 0xfb, 0xaf, 0x58, 0x30, 0x79, 0x2d, 0xe5, - 0x4d, 0xfb, 0x18, 0x0c, 0xf1, 0x08, 0x27, 0x69, 0xa5, 0x57, 0x8d, 0x95, 0x62, 0x01, 0x3d, 0x76, - 0x9d, 0xcb, 0x0f, 0x2d, 0x28, 0x29, 0xd7, 0xf7, 0x13, 0x10, 0x6a, 0x97, 0x0d, 0xa1, 0x36, 0x53, - 0x17, 0xa0, 0xba, 0x93, 0x27, 0xd3, 0xa2, 0x2b, 0xca, 0x2f, 0xb4, 0x8b, 0x1a, 0x20, 0x21, 0xc3, - 0xbd, 0x08, 0x27, 0x4c, 0xe7, 0x51, 0xe9, 0x29, 0xca, 0x5e, 0xc4, 0x15, 0xee, 0x87, 0xe4, 0x45, - 0x5c, 0xf5, 0x27, 0x87, 0xfb, 0x55, 0xb5, 0x2e, 0xb3, 0x53, 0xe1, 0xa7, 0x99, 0xd5, 0x28, 0xdb, - 0x9b, 0xca, 0x1d, 0x7b, 0x4e, 0x58, 0x81, 0x8a, 0xd2, 0x43, 0xc6, 0xc8, 0xc4, 0x3f, 0x1e, 0xa6, - 0x20, 0xa9, 0x62, 0x5f, 0x86, 0xc9, 0xd4, 0x80, 0xa1, 0x17, 0x60, 0xb0, 0xb5, 0xed, 0x44, 0x24, - 0x65, 0x05, 0x34, 0x58, 0xa5, 0x85, 0x87, 0x07, 0x73, 0x13, 0xaa, 0x02, 0x2b, 0xc1, 0x1c, 0xdb, - 0xfe, 0x9f, 0x16, 0x0c, 0x5c, 0x0b, 0x1a, 0x27, 0xb1, 0x98, 0x5e, 0x35, 0x16, 0xd3, 0xc3, 0x79, - 0x41, 0x5e, 0x72, 0xd7, 0xd1, 0x6a, 0x6a, 0x1d, 0x9d, 0xcb, 0xa5, 0xd0, 0x7d, 0x09, 0xed, 0xc2, - 0x28, 0x0b, 0x1d, 0x23, 0xac, 0x92, 0x9e, 0x33, 0xee, 0x57, 0x73, 0xa9, 0xfb, 0xd5, 0xa4, 0x86, - 0xaa, 0xdd, 0xb2, 0x9e, 0x80, 0x61, 0x61, 0x19, 0x93, 0xb6, 0x8f, 0x15, 0xb8, 0x58, 0xc2, 0xed, - 0x5f, 0x29, 0x82, 0x11, 0xaa, 0x06, 0xfd, 0x8e, 0x05, 0xf3, 0x21, 0xf7, 0x08, 0x6a, 0x54, 0xda, - 0xa1, 0xeb, 0x37, 0x6b, 0xf5, 0x6d, 0xd2, 0x68, 0x7b, 0xae, 0xdf, 0x5c, 0x6b, 0xfa, 0x81, 0x2a, - 0x5e, 0xb9, 0x43, 0xea, 0x6d, 0xa6, 0x07, 0xef, 0x11, 0x17, 0x47, 0xbd, 0x3c, 0x5f, 0xbc, 0x7b, - 0x30, 0x37, 0x8f, 0x8f, 0x44, 0x1b, 0x1f, 0xb1, 0x2f, 0xe8, 0x3b, 0x16, 0x2c, 0xf0, 0x08, 0x2e, - 0xfd, 0xf7, 0xbf, 0xcb, 0x6d, 0xb4, 0x2a, 0x49, 0x25, 0x44, 0x36, 0x48, 0xb8, 0xbb, 0xf4, 0xa2, - 0x18, 0xd0, 0x85, 0xea, 0xd1, 0xda, 0xc2, 0x47, 0xed, 0x9c, 0xfd, 0xaf, 0x8a, 0x30, 0x4e, 0x47, - 0x31, 0xf1, 0x82, 0x7f, 0xc1, 0x58, 0x12, 0x8f, 0xa4, 0x96, 0xc4, 0xb4, 0x81, 0x7c, 0x3c, 0x0e, - 0xf0, 0x11, 0x4c, 0x7b, 0x4e, 0x14, 0x5f, 0x26, 0x4e, 0x18, 0x6f, 0x12, 0x87, 0x3d, 0xf5, 0x8a, - 0x65, 0x7e, 0x94, 0xd7, 0x63, 0xa5, 0xfe, 0xba, 0x9a, 0x26, 0x86, 0x3b, 0xe9, 0xa3, 0x3d, 0x40, - 0xec, 0x59, 0x39, 0x74, 0xfc, 0x88, 0x7f, 0x8b, 0x2b, 0x74, 0xe4, 0x47, 0x6b, 0x75, 0x56, 0xb4, - 0x8a, 0xae, 0x76, 0x50, 0xc3, 0x19, 0x2d, 0x68, 0xe6, 0x02, 0x83, 0xfd, 0x9a, 0x0b, 0x0c, 0xf5, - 0x30, 0x42, 0xdf, 0x85, 0x29, 0x31, 0x2b, 0x5b, 0x6e, 0x53, 0x1c, 0xd2, 0x6f, 0xa4, 0xcc, 0x89, - 0xac, 0xfe, 0x0d, 0x1f, 0x7a, 0xd8, 0x12, 0xd9, 0x3f, 0x0f, 0xa7, 0x68, 0x73, 0xa6, 0xc9, 0x74, - 0x84, 0x08, 0x4c, 0xee, 0xb4, 0x37, 0x89, 0x47, 0x62, 0x59, 0x26, 0x1a, 0xcd, 0x14, 0xfb, 0xcd, - 0xda, 0x89, 0x6c, 0x79, 0xc5, 0x24, 0x81, 0xd3, 0x34, 0xed, 0x5f, 0xb5, 0x80, 0x19, 0x26, 0x9e, - 0xc0, 0xf1, 0xf7, 0x29, 0xf3, 0xf8, 0x2b, 0xe7, 0x71, 0xa0, 0x9c, 0x93, 0xef, 0x79, 0x3e, 0x2d, - 0xd5, 0x30, 0xb8, 0xb3, 0x2f, 0x65, 0xff, 0xde, 0x12, 0xd7, 0xff, 0xb1, 0xf8, 0x86, 0x54, 0x0e, - 0x92, 0xe8, 0xb3, 0x30, 0x52, 0x77, 0x5a, 0x4e, 0x9d, 0xc7, 0x08, 0xcb, 0xd5, 0xfe, 0x18, 0x95, - 0xe6, 0x97, 0x45, 0x0d, 0xae, 0xcd, 0xf8, 0xb8, 0xfc, 0x4a, 0x59, 0xdc, 0x53, 0x83, 0xa1, 0x9a, - 0x9c, 0xdd, 0x81, 0x71, 0x83, 0xd8, 0x7d, 0xbd, 0xfa, 0x7e, 0x96, 0x1f, 0x17, 0xea, 0xc6, 0xb2, - 0x0b, 0xd3, 0xbe, 0xf6, 0x9f, 0x32, 0x47, 0x29, 0x4e, 0x7f, 0xb4, 0xd7, 0x81, 0xc0, 0x38, 0xa9, - 0x66, 0x78, 0x99, 0x22, 0x83, 0x3b, 0x29, 0xdb, 0x7f, 0xc7, 0x82, 0x07, 0x75, 0x44, 0xcd, 0x77, - 0xb5, 0x97, 0x3e, 0xb9, 0x02, 0x23, 0x41, 0x8b, 0x84, 0x4e, 0x72, 0x27, 0xbb, 0x20, 0x07, 0xfd, - 0xba, 0x28, 0x3f, 0x3c, 0x98, 0x9b, 0xd1, 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0x22, 0x1b, 0x86, 0xd8, - 0x60, 0x44, 0xc2, 0xaf, 0x98, 0xc5, 0xd1, 0x62, 0xcf, 0x5d, 0x11, 0x16, 0x10, 0xfb, 0x17, 0x2c, - 0xbe, 0xb0, 0xf4, 0xae, 0xa3, 0x77, 0x61, 0x6a, 0x97, 0x5e, 0xdf, 0x56, 0xee, 0xb4, 0x42, 0xae, - 0x46, 0x97, 0xe3, 0xf4, 0x54, 0xaf, 0x71, 0xd2, 0x3e, 0x72, 0xa9, 0x2c, 0xfa, 0x3c, 0xb5, 0x9e, - 0x22, 0x86, 0x3b, 0xc8, 0xdb, 0x7f, 0x5a, 0xe0, 0x3b, 0x91, 0x49, 0x75, 0x4f, 0xc0, 0x70, 0x2b, - 0x68, 0x2c, 0xaf, 0x55, 0xb0, 0x18, 0x21, 0xc5, 0xae, 0xaa, 0xbc, 0x18, 0x4b, 0x38, 0xba, 0x08, - 0x40, 0xee, 0xc4, 0x24, 0xf4, 0x1d, 0x4f, 0x3d, 0xc6, 0x2b, 0xe1, 0x69, 0x45, 0x41, 0xb0, 0x86, - 0x45, 0xeb, 0xb4, 0xc2, 0x60, 0xcf, 0x6d, 0x30, 0xc7, 0x8e, 0xa2, 0x59, 0xa7, 0xaa, 0x20, 0x58, - 0xc3, 0xa2, 0x57, 0xe5, 0xb6, 0x1f, 0xf1, 0x03, 0xd0, 0xd9, 0x14, 0xa1, 0x78, 0x46, 0x92, 0xab, - 0xf2, 0x0d, 0x1d, 0x88, 0x4d, 0x5c, 0xb4, 0x08, 0x43, 0xb1, 0xc3, 0x9e, 0x98, 0x07, 0xf3, 0x4d, - 0x76, 0x36, 0x28, 0x86, 0x1e, 0x34, 0x8a, 0x56, 0xc0, 0xa2, 0x22, 0x7a, 0x53, 0xb2, 0x60, 0xce, - 0x92, 0x85, 0xe9, 0x55, 0xee, 0xb2, 0xd5, 0xd9, 0xb7, 0xce, 0x83, 0x85, 0x49, 0x97, 0x41, 0xcb, - 0xfe, 0x7c, 0x09, 0x20, 0x91, 0xf6, 0xd0, 0x7b, 0x1d, 0x2c, 0xe2, 0xe9, 0xee, 0xf2, 0xe1, 0xf1, - 0xf1, 0x07, 0xf4, 0x05, 0x0b, 0x46, 0x1d, 0xcf, 0x0b, 0xea, 0x4e, 0xcc, 0x46, 0xb9, 0xd0, 0x9d, - 0x45, 0x89, 0xf6, 0x17, 0x93, 0x1a, 0xbc, 0x0b, 0xcf, 0xc9, 0xd7, 0x63, 0x0d, 0xd2, 0xb3, 0x17, - 0x7a, 0xc3, 0xe8, 0xe3, 0xf2, 0x12, 0xc0, 0x97, 0xc7, 0x6c, 0xfa, 0x12, 0x50, 0x62, 0xdc, 0x58, - 0x93, 0xff, 0xd1, 0x0d, 0x23, 0x66, 0xcd, 0x40, 0xbe, 0x7b, 0xae, 0x21, 0xf4, 0xf4, 0x0a, 0x57, - 0x83, 0xaa, 0xba, 0x09, 0xfa, 0x60, 0xbe, 0x0f, 0xbb, 0x26, 0x5d, 0xf7, 0x30, 0x3f, 0x7f, 0x07, - 0x26, 0x1b, 0xe6, 0x71, 0x2b, 0x56, 0xd3, 0xe3, 0x79, 0x74, 0x53, 0xa7, 0x73, 0x72, 0xc0, 0xa6, - 0x00, 0x38, 0x4d, 0x18, 0x55, 0xb9, 0x33, 0xc0, 0x9a, 0xbf, 0x15, 0x08, 0x13, 0x3e, 0x3b, 0x77, - 0x2e, 0xf7, 0xa3, 0x98, 0xec, 0x52, 0xcc, 0xe4, 0x1c, 0xbd, 0x26, 0xea, 0x62, 0x45, 0x05, 0xbd, - 0x06, 0x43, 0xcc, 0x43, 0x2b, 0x2a, 0x8f, 0xe4, 0xeb, 0x01, 0x4d, 0xe7, 0xe2, 0x64, 0x53, 0xb1, - 0xbf, 0x11, 0x16, 0x14, 0xd0, 0x65, 0x19, 0x22, 0x20, 0x5a, 0xf3, 0x6f, 0x44, 0x84, 0x85, 0x08, - 0x28, 0x2d, 0x7d, 0x34, 0xf1, 0xfe, 0xe7, 0xe5, 0x99, 0xe1, 0x21, 0x8d, 0x9a, 0x54, 0x5e, 0x11, - 0xff, 0x65, 0xd4, 0xc9, 0x32, 0xe4, 0x77, 0xcf, 0x8c, 0x4c, 0x99, 0x0c, 0xe7, 0x4d, 0x93, 0x04, - 0x4e, 0xd3, 0x3c, 0xd1, 0xe3, 0x73, 0xd6, 0x87, 0xa9, 0xf4, 0xc6, 0xba, 0xaf, 0xc7, 0xf5, 0x0f, - 0x06, 0x60, 0xc2, 0x5c, 0x08, 0x68, 0x01, 0x4a, 0x82, 0x88, 0x0a, 0x17, 0xa6, 0xd6, 0xf6, 0xba, - 0x04, 0xe0, 0x04, 0x87, 0x85, 0x4b, 0x63, 0xd5, 0x35, 0xdb, 0xac, 0x24, 0x5c, 0x9a, 0x82, 0x60, - 0x0d, 0x8b, 0x0a, 0xd1, 0x9b, 0x41, 0x10, 0xab, 0xa3, 0x40, 0xad, 0x96, 0x25, 0x56, 0x8a, 0x05, - 0x94, 0x1e, 0x01, 0x3b, 0x24, 0xf4, 0x89, 0x67, 0x6a, 0x32, 0xd5, 0x11, 0x70, 0x45, 0x07, 0x62, - 0x13, 0x97, 0x1e, 0x69, 0x41, 0xc4, 0x96, 0x9f, 0x10, 0xd5, 0x13, 0x5b, 0xb7, 0x1a, 0xf7, 0x50, - 0x94, 0x70, 0xf4, 0x06, 0x3c, 0xa8, 0x1c, 0x0a, 0x31, 0xd7, 0x0c, 0xcb, 0x16, 0x87, 0x8c, 0x9b, - 0xf5, 0x83, 0xcb, 0xd9, 0x68, 0x38, 0xaf, 0x3e, 0x7a, 0x15, 0x26, 0x84, 0x08, 0x2c, 0x29, 0x0e, - 0x9b, 0xc6, 0x0a, 0x57, 0x0c, 0x28, 0x4e, 0x61, 0xa3, 0x0a, 0x4c, 0xd1, 0x12, 0x26, 0x85, 0x4a, - 0x0a, 0xdc, 0x31, 0x52, 0x9d, 0xf5, 0x57, 0x52, 0x70, 0xdc, 0x51, 0x03, 0x2d, 0xc2, 0x24, 0x97, - 0x51, 0xe8, 0x9d, 0x92, 0xcd, 0x83, 0xb0, 0xac, 0x55, 0x1b, 0xe1, 0xba, 0x09, 0xc6, 0x69, 0x7c, - 0xf4, 0x12, 0x8c, 0x39, 0x61, 0x7d, 0xdb, 0x8d, 0x49, 0x3d, 0x6e, 0x87, 0x3c, 0x00, 0x87, 0x66, - 0xed, 0xb1, 0xa8, 0xc1, 0xb0, 0x81, 0x69, 0xbf, 0x07, 0xa7, 0x32, 0x8c, 0xf2, 0xe9, 0xc2, 0x71, - 0x5a, 0xae, 0xfc, 0xa6, 0x94, 0xd5, 0xda, 0x62, 0x75, 0x4d, 0x7e, 0x8d, 0x86, 0x45, 0x57, 0x27, - 0x53, 0x89, 0x6b, 0xa1, 0x61, 0xd5, 0xea, 0x5c, 0x95, 0x00, 0x9c, 0xe0, 0xd8, 0xbf, 0x0f, 0xa0, - 0x29, 0x74, 0xfa, 0xb0, 0x59, 0x7a, 0x09, 0xc6, 0x64, 0x3c, 0x63, 0x2d, 0x8e, 0xa6, 0xfa, 0xcc, - 0x4b, 0x1a, 0x0c, 0x1b, 0x98, 0xb4, 0x6f, 0xbe, 0x8a, 0x02, 0x9a, 0xb2, 0x91, 0x4b, 0x62, 0x80, - 0x26, 0x38, 0xe8, 0x69, 0x18, 0x89, 0x88, 0xb7, 0x75, 0xd5, 0xf5, 0x77, 0xc4, 0xc2, 0x56, 0x5c, - 0xb8, 0x26, 0xca, 0xb1, 0xc2, 0x40, 0x4b, 0x50, 0x6c, 0xbb, 0x0d, 0xb1, 0x94, 0xe5, 0x81, 0x5f, - 0xbc, 0xb1, 0x56, 0x39, 0x3c, 0x98, 0x7b, 0x24, 0x2f, 0x4c, 0x33, 0xbd, 0xda, 0x47, 0xf3, 0x74, - 0xfb, 0xd1, 0xca, 0x59, 0x6f, 0x03, 0x43, 0x47, 0x7c, 0x1b, 0xb8, 0x08, 0x20, 0xbe, 0x5a, 0xae, - 0xe5, 0x62, 0x32, 0x6b, 0x97, 0x14, 0x04, 0x6b, 0x58, 0x28, 0x82, 0xe9, 0x7a, 0x48, 0x1c, 0x79, - 0x87, 0xe6, 0xe6, 0xe5, 0x23, 0xf7, 0xae, 0x20, 0x58, 0x4e, 0x13, 0xc3, 0x9d, 0xf4, 0x51, 0x00, - 0xd3, 0x0d, 0xe1, 0xbf, 0x9a, 0x34, 0x5a, 0x3a, 0xba, 0x4d, 0x3b, 0x33, 0xc8, 0x49, 0x13, 0xc2, - 0x9d, 0xb4, 0xd1, 0xdb, 0x30, 0x2b, 0x0b, 0x3b, 0x5d, 0x86, 0xd9, 0x76, 0x29, 0x2e, 0x9d, 0xbb, - 0x7b, 0x30, 0x37, 0x5b, 0xc9, 0xc5, 0xc2, 0x5d, 0x28, 0x20, 0x0c, 0x43, 0xec, 0x2d, 0x29, 0x2a, - 0x8f, 0xb2, 0x73, 0xee, 0xc9, 0x7c, 0x65, 0x00, 0x5d, 0xeb, 0xf3, 0xec, 0x1d, 0x4a, 0x98, 0xf9, - 0x26, 0xcf, 0x72, 0xac, 0x10, 0x0b, 0x4a, 0x68, 0x0b, 0x46, 0x1d, 0xdf, 0x0f, 0x62, 0x87, 0x8b, - 0x50, 0x63, 0xf9, 0xb2, 0x9f, 0x46, 0x78, 0x31, 0xa9, 0xc1, 0xa9, 0x2b, 0xcb, 0x41, 0x0d, 0x82, - 0x75, 0xc2, 0xe8, 0x36, 0x4c, 0x06, 0xb7, 0x29, 0x73, 0x94, 0x5a, 0x8a, 0xa8, 0x3c, 0xce, 0xda, - 0x7a, 0xbe, 0x4f, 0x3d, 0xad, 0x51, 0x59, 0xe3, 0x5a, 0x26, 0x51, 0x9c, 0x6e, 0x05, 0xcd, 0x1b, - 0xda, 0xea, 0x89, 0xc4, 0x9e, 0x3d, 0xd1, 0x56, 0xeb, 0xca, 0x69, 0xe6, 0x82, 0xce, 0xcd, 0x56, - 0xd9, 0xee, 0x9f, 0x4c, 0xb9, 0xa0, 0x27, 0x20, 0xac, 0xe3, 0xa1, 0x6d, 0x18, 0x4b, 0x9e, 0xac, - 0xc2, 0x88, 0x45, 0xa8, 0x19, 0xbd, 0x78, 0xb1, 0xbf, 0x8f, 0x5b, 0xd3, 0x6a, 0xf2, 0x9b, 0x83, - 0x5e, 0x82, 0x0d, 0xca, 0xb3, 0x3f, 0x05, 0xa3, 0xda, 0xc4, 0x1e, 0xc5, 0x2a, 0x7b, 0xf6, 0x55, - 0x98, 0x4a, 0x4f, 0xdd, 0x91, 0xac, 0xba, 0xff, 0x77, 0x01, 0x26, 0x33, 0x5e, 0xae, 0x58, 0xa8, - 0xe7, 0x14, 0x43, 0x4d, 0x22, 0x3b, 0x9b, 0x6c, 0xb1, 0xd0, 0x07, 0x5b, 0x94, 0x3c, 0xba, 0x98, - 0xcb, 0xa3, 0x05, 0x2b, 0x1c, 0x78, 0x3f, 0xac, 0xd0, 0x3c, 0x7d, 0x06, 0xfb, 0x3a, 0x7d, 0x8e, - 0x81, 0x7d, 0x1a, 0x07, 0xd8, 0x70, 0x1f, 0x07, 0xd8, 0x97, 0x0b, 0x30, 0x95, 0x8e, 0x27, 0x7c, - 0x02, 0xef, 0x1d, 0xaf, 0x19, 0xef, 0x1d, 0xd9, 0x81, 0xd3, 0xd3, 0x51, 0x8e, 0xf3, 0xde, 0x3e, - 0x70, 0xea, 0xed, 0xe3, 0xc9, 0xbe, 0xa8, 0x75, 0x7f, 0x07, 0xf9, 0xbb, 0x05, 0x38, 0x9d, 0xae, - 0xb2, 0xec, 0x39, 0xee, 0xee, 0x09, 0x8c, 0xcd, 0x75, 0x63, 0x6c, 0x9e, 0xe9, 0xe7, 0x6b, 0x58, - 0xd7, 0x72, 0x07, 0xe8, 0x56, 0x6a, 0x80, 0x16, 0xfa, 0x27, 0xd9, 0x7d, 0x94, 0xbe, 0x5b, 0x84, - 0x73, 0x99, 0xf5, 0x92, 0xe7, 0x82, 0x55, 0xe3, 0xb9, 0xe0, 0x62, 0xea, 0xb9, 0xc0, 0xee, 0x5e, - 0xfb, 0x78, 0xde, 0x0f, 0x84, 0xe7, 0x19, 0x8b, 0x9e, 0x76, 0x8f, 0x6f, 0x07, 0x86, 0xe7, 0x99, - 0x22, 0x84, 0x4d, 0xba, 0x3f, 0x4e, 0x6f, 0x06, 0xbf, 0x6f, 0xc1, 0x99, 0xcc, 0xb9, 0x39, 0x01, - 0xbd, 0xfa, 0x35, 0x53, 0xaf, 0xfe, 0x44, 0xdf, 0xab, 0x35, 0x47, 0xd1, 0xfe, 0xd5, 0x62, 0xce, - 0xb7, 0x30, 0xcd, 0xe4, 0x75, 0x18, 0x75, 0xea, 0x75, 0x12, 0x45, 0xeb, 0x41, 0x43, 0x05, 0x2b, - 0x7b, 0x86, 0x49, 0x1b, 0x49, 0xf1, 0xe1, 0xc1, 0xdc, 0x6c, 0x9a, 0x44, 0x02, 0xc6, 0x3a, 0x05, - 0x33, 0x00, 0x62, 0xe1, 0x58, 0x03, 0x20, 0x5e, 0x04, 0xd8, 0x53, 0xfa, 0x8a, 0xb4, 0x9a, 0x53, - 0xd3, 0x64, 0x68, 0x58, 0xe8, 0xe7, 0xd8, 0x2d, 0x80, 0x1b, 0x03, 0xf1, 0xa5, 0xf8, 0x5c, 0x9f, - 0x73, 0xa5, 0x1b, 0x16, 0x71, 0x17, 0x67, 0xa5, 0x12, 0x56, 0x24, 0xd1, 0xcf, 0xc0, 0x54, 0xc4, - 0x23, 0x68, 0x2c, 0x7b, 0x4e, 0xc4, 0x1c, 0x6b, 0xc4, 0x2a, 0x64, 0x7e, 0xcb, 0xb5, 0x14, 0x0c, - 0x77, 0x60, 0xdb, 0x5f, 0x1e, 0x80, 0x87, 0xba, 0x30, 0x1f, 0xb4, 0x68, 0x3e, 0xde, 0x3f, 0x95, - 0xd6, 0xdb, 0xcd, 0x66, 0x56, 0x36, 0x14, 0x79, 0xa9, 0x39, 0x2e, 0xbc, 0xef, 0x39, 0xfe, 0xa2, - 0xa5, 0x69, 0x54, 0xb9, 0x89, 0xef, 0xa7, 0x8e, 0xc8, 0x54, 0x8f, 0x51, 0xc5, 0xba, 0x95, 0xa1, - 0xa7, 0xbc, 0xd8, 0x77, 0x77, 0xfa, 0x56, 0x5c, 0x9e, 0xec, 0x53, 0xcf, 0xe7, 0x2c, 0x78, 0x24, - 0xb3, 0xbf, 0x86, 0xb1, 0xd1, 0x02, 0x94, 0xea, 0xb4, 0x50, 0x73, 0xb2, 0x4b, 0x5c, 0x5d, 0x25, - 0x00, 0x27, 0x38, 0x86, 0x4d, 0x51, 0xa1, 0xa7, 0x4d, 0xd1, 0xbf, 0xb4, 0x60, 0x26, 0xdd, 0x89, - 0x13, 0xe0, 0x80, 0x6b, 0x26, 0x07, 0xfc, 0x68, 0x3f, 0x73, 0x99, 0x67, 0x5d, 0x38, 0x01, 0x0f, - 0xe4, 0xe4, 0x8b, 0xd8, 0x83, 0xe9, 0x66, 0x9d, 0x98, 0xee, 0x8b, 0xe2, 0x63, 0x32, 0x3d, 0x3d, - 0xbb, 0xfa, 0x3a, 0xf2, 0x8b, 0x6c, 0x07, 0x0a, 0xee, 0x6c, 0x02, 0x7d, 0xce, 0x82, 0x19, 0xe7, - 0x76, 0xd4, 0x91, 0xbf, 0x49, 0xac, 0x99, 0xe7, 0x33, 0xf5, 0xab, 0x3d, 0xf2, 0x3d, 0x31, 0x17, - 0xa3, 0x99, 0x2c, 0x2c, 0x9c, 0xd9, 0x16, 0xc2, 0x22, 0x2e, 0x24, 0x95, 0x93, 0xbb, 0x38, 0xd8, - 0x66, 0xb9, 0x3f, 0x71, 0x5e, 0x28, 0x21, 0x58, 0xd1, 0x41, 0x37, 0xa1, 0xd4, 0x94, 0x3e, 0x89, - 0x82, 0xd7, 0x66, 0x1e, 0x5e, 0x99, 0x8e, 0x8b, 0xdc, 0xe7, 0x43, 0x81, 0x70, 0x42, 0x0a, 0xbd, - 0x0a, 0x45, 0x7f, 0x2b, 0xea, 0x96, 0x30, 0x23, 0x65, 0x83, 0xc7, 0x3d, 0xa5, 0xaf, 0xad, 0xd6, - 0x30, 0xad, 0x88, 0x2e, 0x43, 0x31, 0xdc, 0x6c, 0x88, 0x27, 0x81, 0x4c, 0x79, 0x12, 0x2f, 0x55, - 0xb2, 0x17, 0x09, 0xa7, 0x84, 0x97, 0x2a, 0x98, 0x92, 0x40, 0xab, 0x30, 0xc8, 0x9c, 0x9d, 0x84, - 0xe6, 0x3f, 0x33, 0xe6, 0x43, 0x87, 0x23, 0x17, 0x77, 0xa2, 0x66, 0xc5, 0x98, 0x57, 0x47, 0xaf, - 0xc1, 0x50, 0x9d, 0x65, 0x92, 0x10, 0x6a, 0x9a, 0xec, 0x38, 0x26, 0x1d, 0xb9, 0x26, 0xf8, 0x7b, - 0x27, 0x2f, 0xc7, 0x82, 0x02, 0xda, 0x80, 0xa1, 0x3a, 0x69, 0x6d, 0x6f, 0x45, 0x42, 0xfb, 0xf2, - 0xf1, 0x4c, 0x5a, 0x5d, 0x12, 0xa7, 0x08, 0xaa, 0x0c, 0x03, 0x0b, 0x5a, 0xe8, 0x93, 0x50, 0xd8, - 0xaa, 0x0b, 0xbf, 0xa7, 0x4c, 0x8d, 0xbf, 0xe9, 0xd8, 0xbe, 0x34, 0x74, 0xf7, 0x60, 0xae, 0xb0, - 0xba, 0x8c, 0x0b, 0x5b, 0x75, 0x74, 0x0d, 0x86, 0xb7, 0xb8, 0x77, 0xb2, 0x88, 0xf8, 0xfb, 0x78, - 0xb6, 0xe3, 0x74, 0x87, 0x03, 0x33, 0xf7, 0xd7, 0x11, 0x00, 0x2c, 0x89, 0xa0, 0x0d, 0x80, 0x2d, - 0xe5, 0x65, 0x2d, 0x42, 0xfe, 0x7e, 0xb4, 0x1f, 0x5f, 0x6c, 0xa1, 0x8a, 0x50, 0xa5, 0x58, 0xa3, - 0x83, 0x3e, 0x03, 0x25, 0x47, 0xe6, 0x06, 0x62, 0xe1, 0x7e, 0x4d, 0xc9, 0x20, 0xd9, 0x7a, 0xdd, - 0xd3, 0x26, 0xf1, 0x75, 0xab, 0x90, 0x70, 0x42, 0x14, 0xed, 0xc0, 0xf8, 0x5e, 0xd4, 0xda, 0x26, - 0x72, 0xab, 0xb2, 0x18, 0xc0, 0x39, 0x47, 0xd3, 0x4d, 0x81, 0xe8, 0x86, 0x71, 0xdb, 0xf1, 0x3a, - 0xb8, 0x0b, 0x73, 0xee, 0xba, 0xa9, 0x13, 0xc3, 0x26, 0x6d, 0x3a, 0xe8, 0xef, 0xb6, 0x83, 0xcd, - 0xfd, 0x98, 0x88, 0xc8, 0xc0, 0x99, 0x83, 0xfe, 0x3a, 0x47, 0xe9, 0x1c, 0x74, 0x01, 0xc0, 0x92, - 0x08, 0xdd, 0xcc, 0x8e, 0xcc, 0xbb, 0x25, 0xf4, 0x2d, 0x4f, 0xe4, 0x0e, 0x4f, 0x47, 0x7f, 0x93, - 0x41, 0x61, 0x5c, 0x30, 0x21, 0xc5, 0xb8, 0x5f, 0x6b, 0x3b, 0x88, 0x03, 0x3f, 0xc5, 0x79, 0xa7, - 0xf3, 0xb9, 0x5f, 0x35, 0x03, 0xbf, 0x93, 0xfb, 0x65, 0x61, 0xe1, 0xcc, 0xb6, 0x50, 0x03, 0x26, - 0x5a, 0x41, 0x18, 0xdf, 0x0e, 0x42, 0xb9, 0xaa, 0x50, 0x97, 0x8b, 0xb8, 0x81, 0x29, 0x5a, 0x64, - 0xb6, 0xda, 0x26, 0x04, 0xa7, 0x68, 0xa2, 0x4f, 0xc3, 0x70, 0x54, 0x77, 0x3c, 0xb2, 0x76, 0xbd, - 0x7c, 0x2a, 0xff, 0x58, 0xa9, 0x71, 0x94, 0x9c, 0xd5, 0xc5, 0x26, 0x47, 0xa0, 0x60, 0x49, 0x8e, - 0xf2, 0x21, 0x16, 0x6e, 0x9e, 0x05, 0x35, 0xce, 0xe1, 0x43, 0x1d, 0xf6, 0xcc, 0x9c, 0x0f, 0xb1, - 0x62, 0xcc, 0xab, 0xd3, 0x3d, 0x20, 0xe4, 0xd1, 0x20, 0x2a, 0x9f, 0xce, 0xdf, 0x03, 0x42, 0x8c, - 0xbd, 0x5e, 0xeb, 0xb6, 0x07, 0x14, 0x12, 0x4e, 0x88, 0xda, 0xdf, 0x1c, 0xea, 0x94, 0x20, 0xd8, - 0xbd, 0xe3, 0xf3, 0x56, 0xc7, 0xa3, 0xfc, 0x27, 0xfa, 0x55, 0x83, 0x1c, 0xa3, 0xec, 0xf8, 0x39, - 0x0b, 0x1e, 0x68, 0x65, 0x7e, 0x94, 0x38, 0x8e, 0xfb, 0xd3, 0xa6, 0xf0, 0x61, 0x50, 0xe1, 0xc2, - 0xb3, 0xe1, 0x38, 0xa7, 0xa5, 0xb4, 0x7c, 0x5e, 0x7c, 0xdf, 0xf2, 0xf9, 0x3a, 0x8c, 0x30, 0x91, - 0x2f, 0x09, 0x4f, 0xd4, 0x97, 0x69, 0x1b, 0x3b, 0xd8, 0x97, 0x45, 0x45, 0xac, 0x48, 0xa0, 0x5f, - 0xb4, 0xe0, 0x6c, 0xba, 0xeb, 0x98, 0x30, 0xb0, 0x08, 0x75, 0xc9, 0xaf, 0x3c, 0xab, 0xe2, 0xfb, - 0xcf, 0x56, 0xbb, 0x21, 0x1f, 0xf6, 0x42, 0xc0, 0xdd, 0x1b, 0x43, 0x95, 0x8c, 0x3b, 0xd7, 0x90, - 0xf9, 0x66, 0xd7, 0xfb, 0xde, 0x85, 0x9e, 0x87, 0xb1, 0xdd, 0xa0, 0xed, 0x4b, 0xbf, 0x13, 0xe1, - 0x55, 0xcc, 0xf4, 0xc3, 0xeb, 0x5a, 0x39, 0x36, 0xb0, 0x4e, 0xf6, 0x0e, 0xf0, 0x35, 0x2b, 0x43, - 0x78, 0xe5, 0xb7, 0xc2, 0x57, 0xcc, 0x5b, 0xe1, 0x63, 0xe9, 0x5b, 0x61, 0x87, 0xf6, 0xce, 0xb8, - 0x10, 0xf6, 0x1f, 0xc2, 0xb7, 0xdf, 0xf8, 0x4d, 0xb6, 0x07, 0xe7, 0x7b, 0xb1, 0x69, 0x66, 0xde, - 0xd7, 0x50, 0xef, 0xde, 0x89, 0x79, 0x5f, 0x63, 0xad, 0x82, 0x19, 0xa4, 0xdf, 0x48, 0x20, 0xf6, - 0x7f, 0xb7, 0xa0, 0x58, 0x0d, 0x1a, 0x27, 0xa0, 0x8d, 0xfc, 0x94, 0xa1, 0x8d, 0x7c, 0x28, 0x27, - 0x9f, 0x67, 0xae, 0xee, 0x71, 0x25, 0xa5, 0x7b, 0x3c, 0x9b, 0x47, 0xa0, 0xbb, 0xa6, 0xf1, 0xef, - 0x15, 0x41, 0xcf, 0x3e, 0x8a, 0xfe, 0xf5, 0xbd, 0xd8, 0x89, 0x17, 0xbb, 0x25, 0x24, 0x15, 0x94, - 0x99, 0x55, 0xa0, 0x74, 0x41, 0xfd, 0x11, 0x33, 0x17, 0xbf, 0x45, 0xdc, 0xe6, 0x76, 0x4c, 0x1a, - 0xe9, 0xcf, 0x39, 0x39, 0x73, 0xf1, 0xff, 0x62, 0xc1, 0x64, 0xaa, 0x75, 0xe4, 0x65, 0xf9, 0xb3, - 0xdd, 0xa3, 0x16, 0x6a, 0xba, 0xa7, 0x03, 0xdc, 0x3c, 0x80, 0x7a, 0xea, 0x91, 0x9a, 0x1e, 0x26, - 0x05, 0xab, 0xb7, 0xa0, 0x08, 0x6b, 0x18, 0xe8, 0x05, 0x18, 0x8d, 0x83, 0x56, 0xe0, 0x05, 0xcd, - 0xfd, 0x2b, 0x44, 0xc6, 0x9e, 0x51, 0x0f, 0x72, 0x1b, 0x09, 0x08, 0xeb, 0x78, 0xf6, 0xaf, 0x15, - 0x21, 0x9d, 0xb1, 0xf6, 0x27, 0x6b, 0xf2, 0xc3, 0xb9, 0x26, 0xbf, 0x6b, 0xc1, 0x14, 0x6d, 0x9d, - 0x59, 0x5c, 0x49, 0x43, 0x6b, 0x95, 0xeb, 0xc3, 0xea, 0x92, 0xeb, 0xe3, 0x31, 0xca, 0xbb, 0x1a, - 0x41, 0x3b, 0x16, 0x9a, 0x22, 0x8d, 0x39, 0xd1, 0x52, 0x2c, 0xa0, 0x02, 0x8f, 0x84, 0xa1, 0xf0, - 0x52, 0xd3, 0xf1, 0x48, 0x18, 0x62, 0x01, 0x95, 0xa9, 0x40, 0x06, 0x72, 0x52, 0x81, 0xb0, 0xb0, - 0x6d, 0xc2, 0xca, 0x47, 0x08, 0x14, 0x5a, 0xd8, 0x36, 0x69, 0xfe, 0x93, 0xe0, 0xd8, 0x5f, 0x2f, - 0xc2, 0x58, 0x35, 0x68, 0x24, 0x8f, 0x2d, 0xcf, 0x1b, 0x8f, 0x2d, 0xe7, 0x53, 0x8f, 0x2d, 0x53, - 0x3a, 0xee, 0x4f, 0x9e, 0x56, 0x3e, 0xa8, 0xa7, 0x95, 0x3f, 0xb3, 0x60, 0xa2, 0x1a, 0x34, 0xe8, - 0x02, 0xfd, 0x71, 0x5a, 0x8d, 0x7a, 0x50, 0xc0, 0xa1, 0x2e, 0x41, 0x01, 0xff, 0xbe, 0x05, 0xc3, - 0xd5, 0xa0, 0x71, 0x02, 0x5a, 0xd4, 0x57, 0x4c, 0x2d, 0xea, 0x83, 0x39, 0x5c, 0x36, 0x47, 0x71, - 0xfa, 0x8d, 0x22, 0x8c, 0xd3, 0x7e, 0x06, 0x4d, 0x39, 0x4b, 0xc6, 0x88, 0x58, 0x7d, 0x8c, 0x08, - 0x15, 0xe6, 0x02, 0xcf, 0x0b, 0x6e, 0xa7, 0x67, 0x6c, 0x95, 0x95, 0x62, 0x01, 0x45, 0x4f, 0xc3, - 0x48, 0x2b, 0x24, 0x7b, 0x6e, 0xd0, 0x8e, 0xd2, 0x7e, 0xae, 0x55, 0x51, 0x8e, 0x15, 0x06, 0x95, - 0xdb, 0x23, 0xd7, 0xaf, 0x13, 0x69, 0xf9, 0x33, 0xc0, 0x2c, 0x7f, 0x78, 0x5c, 0x55, 0xad, 0x1c, - 0x1b, 0x58, 0xe8, 0x16, 0x94, 0xd8, 0x7f, 0xb6, 0x6f, 0x8e, 0x9e, 0xe9, 0x43, 0x04, 0x33, 0x17, - 0x04, 0x70, 0x42, 0x0b, 0x5d, 0x04, 0x88, 0xa5, 0x8d, 0x52, 0x24, 0xdc, 0xb0, 0x95, 0x44, 0xa9, - 0xac, 0x97, 0x22, 0xac, 0x61, 0xa1, 0xa7, 0xa0, 0x14, 0x3b, 0xae, 0x77, 0xd5, 0xf5, 0x49, 0x24, - 0x6c, 0xbc, 0x44, 0xac, 0x72, 0x51, 0x88, 0x13, 0x38, 0x3d, 0xd1, 0x99, 0x93, 0x3f, 0xcf, 0x13, - 0x34, 0xc2, 0xb0, 0xd9, 0x89, 0x7e, 0x55, 0x95, 0x62, 0x0d, 0xc3, 0x7e, 0x09, 0x4e, 0x57, 0x83, - 0x46, 0x35, 0x08, 0xe3, 0xd5, 0x20, 0xbc, 0xed, 0x84, 0x0d, 0x39, 0x7f, 0x73, 0x32, 0x6c, 0x36, - 0x3d, 0x75, 0x07, 0xb9, 0x36, 0xc0, 0x08, 0x88, 0xfd, 0x1c, 0x3b, 0xd3, 0x8f, 0xe8, 0x90, 0xf3, - 0xef, 0x0a, 0x80, 0xaa, 0xcc, 0x8a, 0xca, 0x48, 0x26, 0xf5, 0x36, 0x4c, 0x44, 0xe4, 0xaa, 0xeb, - 0xb7, 0xef, 0xc8, 0xfb, 0x55, 0x17, 0x6f, 0xa7, 0xda, 0x8a, 0x8e, 0xc9, 0x75, 0x2b, 0x66, 0x19, - 0x4e, 0x51, 0xa3, 0x43, 0x18, 0xb6, 0xfd, 0xc5, 0xe8, 0x46, 0x44, 0x42, 0x91, 0x3c, 0x89, 0x0d, - 0x21, 0x96, 0x85, 0x38, 0x81, 0xd3, 0x25, 0xc3, 0xfe, 0x5c, 0x0b, 0x7c, 0x1c, 0x04, 0xb1, 0x5c, - 0x64, 0x2c, 0xfd, 0x86, 0x56, 0x8e, 0x0d, 0x2c, 0xb4, 0x0a, 0x28, 0x6a, 0xb7, 0x5a, 0x1e, 0x7b, - 0x9a, 0x74, 0xbc, 0x4b, 0x61, 0xd0, 0x6e, 0xf1, 0xe7, 0x25, 0x91, 0xb9, 0xa2, 0xd6, 0x01, 0xc5, - 0x19, 0x35, 0x28, 0x63, 0xd8, 0x8a, 0xd8, 0x6f, 0xe1, 0xe7, 0xcf, 0xb5, 0x9c, 0x35, 0x56, 0x84, - 0x25, 0xcc, 0xfe, 0x2c, 0x3b, 0xcc, 0x58, 0xce, 0x9b, 0xb8, 0x1d, 0x12, 0xb4, 0x0b, 0xe3, 0x2d, - 0x76, 0x60, 0xc5, 0x61, 0xe0, 0x79, 0x44, 0xca, 0x8d, 0xf7, 0x66, 0xd1, 0xc5, 0x73, 0x60, 0xe8, - 0xe4, 0xb0, 0x49, 0xdd, 0xfe, 0xfc, 0x24, 0xe3, 0x4b, 0x35, 0x7e, 0x69, 0x19, 0x16, 0x76, 0xda, - 0x42, 0x42, 0x9b, 0xcd, 0xcf, 0x31, 0x97, 0x70, 0x7a, 0x61, 0xeb, 0x8d, 0x65, 0x5d, 0xf4, 0x3a, - 0x7b, 0x97, 0xe3, 0xcc, 0xa0, 0x57, 0x76, 0x4b, 0x8e, 0x65, 0x3c, 0xc1, 0x89, 0x8a, 0x58, 0x23, - 0x82, 0xae, 0xc2, 0xb8, 0x48, 0x91, 0x22, 0x14, 0x0f, 0x45, 0xe3, 0xfa, 0x3b, 0x8e, 0x75, 0xe0, - 0x61, 0xba, 0x00, 0x9b, 0x95, 0x51, 0x13, 0xce, 0x6a, 0x09, 0xbd, 0x32, 0xac, 0x0a, 0x39, 0x6f, - 0x79, 0xe4, 0xee, 0xc1, 0xdc, 0xd9, 0x8d, 0x6e, 0x88, 0xb8, 0x3b, 0x1d, 0x74, 0x1d, 0x4e, 0x3b, - 0xf5, 0xd8, 0xdd, 0x23, 0x15, 0xe2, 0x34, 0x3c, 0xd7, 0x27, 0x66, 0xe0, 0x87, 0x33, 0x77, 0x0f, - 0xe6, 0x4e, 0x2f, 0x66, 0x21, 0xe0, 0xec, 0x7a, 0xe8, 0x15, 0x28, 0x35, 0xfc, 0x48, 0x8c, 0xc1, - 0x90, 0x91, 0xab, 0xae, 0x54, 0xb9, 0x56, 0x53, 0xdf, 0x9f, 0xfc, 0xc1, 0x49, 0x05, 0xd4, 0x84, - 0x31, 0xdd, 0xb9, 0x4b, 0xe4, 0x39, 0x7c, 0xa6, 0xcb, 0xdd, 0xd6, 0xf0, 0x88, 0xe2, 0x5a, 0x37, - 0x65, 0xb3, 0x6b, 0x38, 0x4b, 0x19, 0x84, 0xd1, 0x6b, 0x80, 0x22, 0x12, 0xee, 0xb9, 0x75, 0xb2, - 0x58, 0x67, 0x81, 0x87, 0x99, 0xae, 0x66, 0xc4, 0x70, 0x40, 0x41, 0xb5, 0x0e, 0x0c, 0x9c, 0x51, - 0x0b, 0x5d, 0xa6, 0x1c, 0x45, 0x2f, 0x15, 0x26, 0xd6, 0x52, 0xcc, 0x2b, 0x57, 0x48, 0x2b, 0x24, - 0x75, 0x27, 0x26, 0x0d, 0x93, 0x22, 0x4e, 0xd5, 0xa3, 0xe7, 0x8d, 0xca, 0xe7, 0x00, 0xa6, 0x61, - 0x70, 0x67, 0x4e, 0x07, 0x7a, 0x43, 0xda, 0x0e, 0xa2, 0xf8, 0x1a, 0x89, 0x6f, 0x07, 0xe1, 0x8e, - 0x88, 0xd6, 0x96, 0x04, 0x73, 0x4c, 0x40, 0x58, 0xc7, 0xa3, 0x12, 0x11, 0x7b, 0x18, 0x5b, 0xab, - 0xb0, 0x17, 0x8b, 0x91, 0x64, 0x9f, 0x5c, 0xe6, 0xc5, 0x58, 0xc2, 0x25, 0xea, 0x5a, 0x75, 0x99, - 0xbd, 0x43, 0xa4, 0x50, 0xd7, 0xaa, 0xcb, 0x58, 0xc2, 0x11, 0xe9, 0xcc, 0x03, 0x38, 0x91, 0xff, - 0x82, 0xd4, 0xc9, 0x97, 0xfb, 0x4c, 0x05, 0xe8, 0xc3, 0x94, 0xca, 0x40, 0xc8, 0xc3, 0xd8, 0x45, - 0xe5, 0x49, 0xb6, 0x48, 0xfa, 0x8f, 0x81, 0xa7, 0x74, 0x71, 0x6b, 0x29, 0x4a, 0xb8, 0x83, 0xb6, - 0x11, 0x50, 0x64, 0xaa, 0x67, 0x3e, 0x8e, 0x05, 0x28, 0x45, 0xed, 0xcd, 0x46, 0xb0, 0xeb, 0xb8, - 0x3e, 0x7b, 0x36, 0xd0, 0x04, 0x91, 0x9a, 0x04, 0xe0, 0x04, 0x07, 0xad, 0xc2, 0x88, 0x23, 0x2e, - 0x5f, 0x42, 0xd1, 0x9f, 0x19, 0x61, 0x40, 0x5e, 0xd0, 0xb8, 0x1e, 0x54, 0xfe, 0xc3, 0xaa, 0x2e, - 0x7a, 0x19, 0xc6, 0x85, 0x13, 0x9c, 0xb0, 0x5f, 0x3d, 0x65, 0xfa, 0x4b, 0xd4, 0x74, 0x20, 0x36, - 0x71, 0xd1, 0xcf, 0xc1, 0x04, 0xa5, 0x92, 0x30, 0xb6, 0xf2, 0x4c, 0x3f, 0x1c, 0x51, 0x8b, 0xb3, - 0xae, 0x57, 0xc6, 0x29, 0x62, 0xa8, 0x01, 0x0f, 0x3b, 0xed, 0x38, 0x60, 0xca, 0x4a, 0x73, 0xfd, - 0x6f, 0x04, 0x3b, 0xc4, 0x67, 0xda, 0xfd, 0x91, 0xa5, 0xf3, 0x77, 0x0f, 0xe6, 0x1e, 0x5e, 0xec, - 0x82, 0x87, 0xbb, 0x52, 0x41, 0x37, 0x60, 0x34, 0x0e, 0x3c, 0x61, 0x78, 0x1e, 0x95, 0x1f, 0xc8, - 0x0f, 0x88, 0xb4, 0xa1, 0xd0, 0x74, 0x75, 0x82, 0xaa, 0x8a, 0x75, 0x3a, 0x68, 0x83, 0xef, 0x31, - 0x16, 0xbe, 0x93, 0x44, 0xe5, 0x07, 0xf3, 0x07, 0x46, 0x45, 0xf9, 0x34, 0xb7, 0xa0, 0xa8, 0x89, - 0x75, 0x32, 0xe8, 0x12, 0x4c, 0xb7, 0x42, 0x37, 0x60, 0x0b, 0x5b, 0x29, 0x8a, 0xcb, 0x46, 0xa8, - 0xbc, 0xe9, 0x6a, 0x1a, 0x01, 0x77, 0xd6, 0x41, 0x17, 0xa8, 0x80, 0xca, 0x0b, 0xcb, 0x67, 0x78, - 0x9e, 0x16, 0x2e, 0x9c, 0xf2, 0x32, 0xac, 0xa0, 0xb3, 0x3f, 0x0d, 0xd3, 0x1d, 0x9c, 0xf2, 0x48, - 0x46, 0xc0, 0xff, 0x64, 0x10, 0x4a, 0x4a, 0x1d, 0x88, 0x16, 0x4c, 0x2d, 0xef, 0x99, 0xb4, 0x96, - 0x77, 0x84, 0xca, 0x6b, 0xba, 0x62, 0x77, 0x23, 0x23, 0xcd, 0xfc, 0xf9, 0x1c, 0xd6, 0xd0, 0xbf, - 0xc7, 0xde, 0x11, 0x52, 0xf0, 0x27, 0x17, 0xc6, 0x81, 0xae, 0x17, 0xc6, 0x3e, 0x53, 0x3e, 0xd2, - 0xab, 0x61, 0x2b, 0x68, 0xac, 0x55, 0xd3, 0x39, 0xd0, 0xaa, 0xb4, 0x10, 0x73, 0x18, 0x13, 0xee, - 0xe9, 0xb1, 0xce, 0x84, 0xfb, 0xe1, 0x7b, 0x14, 0xee, 0x25, 0x01, 0x9c, 0xd0, 0x42, 0x1e, 0x4c, - 0xd7, 0xcd, 0xf4, 0x75, 0xca, 0x4b, 0xef, 0xd1, 0x9e, 0x89, 0xe4, 0xda, 0x5a, 0x5e, 0x9b, 0xe5, - 0x34, 0x15, 0xdc, 0x49, 0x18, 0xbd, 0x0c, 0x23, 0xef, 0x06, 0x11, 0x5b, 0x76, 0xe2, 0x6c, 0x93, - 0x7e, 0x51, 0x23, 0xaf, 0x5f, 0xaf, 0xb1, 0xf2, 0xc3, 0x83, 0xb9, 0xd1, 0x6a, 0xd0, 0x90, 0x7f, - 0xb1, 0xaa, 0x80, 0xee, 0xc0, 0x69, 0x83, 0x23, 0xa8, 0xee, 0x42, 0xff, 0xdd, 0x3d, 0x2b, 0x9a, - 0x3b, 0xbd, 0x96, 0x45, 0x09, 0x67, 0x37, 0x60, 0x7f, 0x93, 0x2b, 0x3d, 0x85, 0x6a, 0x84, 0x44, - 0x6d, 0xef, 0x24, 0x92, 0x57, 0xac, 0x18, 0x5a, 0x9b, 0x7b, 0x56, 0xac, 0xff, 0x9e, 0xc5, 0x14, - 0xeb, 0x1b, 0x64, 0xb7, 0xe5, 0x39, 0xf1, 0x49, 0x98, 0x7e, 0xbf, 0x0e, 0x23, 0xb1, 0x68, 0xad, - 0x5b, 0xbe, 0x0d, 0xad, 0x53, 0xec, 0x71, 0x41, 0x1d, 0x88, 0xb2, 0x14, 0x2b, 0x32, 0xf6, 0x3f, - 0xe3, 0x33, 0x20, 0x21, 0x27, 0xa0, 0x5b, 0xa8, 0x98, 0xba, 0x85, 0xb9, 0x1e, 0x5f, 0x90, 0xa3, - 0x63, 0xf8, 0xa7, 0x66, 0xbf, 0xd9, 0xdd, 0xe3, 0xc3, 0xfe, 0xa2, 0x63, 0xff, 0xb2, 0x05, 0x33, - 0x59, 0x26, 0x01, 0x54, 0x88, 0xe1, 0x37, 0x1f, 0xf5, 0xc2, 0xa5, 0x46, 0xf0, 0xa6, 0x28, 0xc7, - 0x0a, 0xa3, 0xef, 0x98, 0xf7, 0x47, 0x0b, 0x02, 0x76, 0x1d, 0xcc, 0x4c, 0x87, 0xe8, 0x55, 0xee, - 0xcb, 0x61, 0xa9, 0x54, 0x84, 0x47, 0xf3, 0xe3, 0xb0, 0x7f, 0xbd, 0x00, 0x33, 0x5c, 0x45, 0xbd, - 0xb8, 0x17, 0xb8, 0x8d, 0x6a, 0xd0, 0x10, 0x9e, 0x2d, 0x6f, 0xc2, 0x58, 0x4b, 0xbb, 0xae, 0x76, - 0x0b, 0x43, 0xa4, 0x5f, 0x6b, 0x93, 0x6b, 0x83, 0x5e, 0x8a, 0x0d, 0x5a, 0xa8, 0x01, 0x63, 0x64, - 0xcf, 0xad, 0x2b, 0x3d, 0x67, 0xe1, 0xc8, 0x2c, 0x5d, 0xb5, 0xb2, 0xa2, 0xd1, 0xc1, 0x06, 0xd5, - 0xfb, 0x90, 0x99, 0xc6, 0xfe, 0x8a, 0x05, 0x0f, 0xe6, 0x04, 0x2d, 0xa2, 0xcd, 0xdd, 0x66, 0x8f, - 0x01, 0x22, 0x6d, 0xa6, 0x6a, 0x8e, 0x3f, 0x11, 0x60, 0x01, 0x45, 0x9f, 0x06, 0xe0, 0x2a, 0x7e, - 0x2a, 0x45, 0x8b, 0x4f, 0xef, 0x2f, 0x98, 0x87, 0x16, 0xf1, 0x41, 0xd6, 0xc7, 0x1a, 0x2d, 0xfb, - 0x57, 0x8b, 0x30, 0xc8, 0x73, 0xa8, 0xaf, 0xc2, 0xf0, 0x36, 0x0f, 0x91, 0xdc, 0x4f, 0x34, 0xe6, - 0xe4, 0x3a, 0xc2, 0x0b, 0xb0, 0xac, 0x8c, 0xd6, 0xe1, 0x94, 0xf0, 0x9e, 0xaa, 0x10, 0xcf, 0xd9, - 0x97, 0xb7, 0x5a, 0x9e, 0xae, 0x44, 0x86, 0xd2, 0x3f, 0xb5, 0xd6, 0x89, 0x82, 0xb3, 0xea, 0xa1, - 0x57, 0x3b, 0x02, 0x23, 0xf2, 0xe0, 0xd2, 0x4a, 0x06, 0xee, 0x11, 0x1c, 0xf1, 0x65, 0x18, 0x6f, - 0x75, 0xdc, 0xdf, 0xb5, 0xf4, 0xd5, 0xe6, 0x9d, 0xdd, 0xc4, 0x65, 0x56, 0x05, 0x6d, 0x66, 0x43, - 0xb1, 0xb1, 0x1d, 0x92, 0x68, 0x3b, 0xf0, 0x1a, 0x22, 0x57, 0x6b, 0x62, 0x55, 0x90, 0x82, 0xe3, - 0x8e, 0x1a, 0x94, 0xca, 0x96, 0xe3, 0x7a, 0xed, 0x90, 0x24, 0x54, 0x86, 0x4c, 0x2a, 0xab, 0x29, - 0x38, 0xee, 0xa8, 0x41, 0xd7, 0xd1, 0x69, 0x91, 0xe8, 0x53, 0xfa, 0xd4, 0x2b, 0x53, 0x91, 0x61, - 0x69, 0x5b, 0xdf, 0x25, 0xce, 0x8b, 0x78, 0xf2, 0x57, 0xa9, 0x42, 0xb5, 0x34, 0x72, 0xc2, 0xaa, - 0x5e, 0x52, 0xb9, 0x97, 0x74, 0x93, 0x7f, 0x6c, 0xc1, 0xa9, 0x0c, 0x43, 0x32, 0xce, 0xaa, 0x9a, - 0x6e, 0x14, 0xab, 0x2c, 0x19, 0x1a, 0xab, 0xe2, 0xe5, 0x58, 0x61, 0xd0, 0xfd, 0xc0, 0x99, 0x61, - 0x9a, 0x01, 0x0a, 0x93, 0x0f, 0x01, 0x3d, 0x1a, 0x03, 0x44, 0xe7, 0x61, 0xa0, 0x1d, 0x91, 0x50, - 0xe6, 0x69, 0x94, 0xfc, 0x9b, 0x69, 0x04, 0x19, 0x84, 0x4a, 0x94, 0x4d, 0xa5, 0x8c, 0xd3, 0x24, - 0x4a, 0xae, 0x8e, 0xe3, 0x30, 0xfb, 0x4b, 0x45, 0x38, 0x93, 0x6b, 0x14, 0x4a, 0xbb, 0xb4, 0x1b, - 0xf8, 0x6e, 0x1c, 0xa8, 0x08, 0x7d, 0x3c, 0x20, 0x09, 0x69, 0x6d, 0xaf, 0x8b, 0x72, 0xac, 0x30, - 0xd0, 0x63, 0x32, 0x8d, 0x6f, 0x3a, 0x0f, 0xc8, 0x52, 0xc5, 0xc8, 0xe4, 0xdb, 0x6f, 0x42, 0x9f, - 0x47, 0x61, 0xa0, 0x15, 0xa8, 0x1c, 0xeb, 0x6a, 0x66, 0x69, 0x77, 0x83, 0xc0, 0xc3, 0x0c, 0x88, - 0x3e, 0x26, 0xc6, 0x21, 0xf5, 0x72, 0x81, 0x9d, 0x46, 0x10, 0x69, 0x83, 0xf1, 0x04, 0x0c, 0xef, - 0x90, 0xfd, 0xd0, 0xf5, 0x9b, 0xe9, 0x77, 0x9b, 0x2b, 0xbc, 0x18, 0x4b, 0xb8, 0x99, 0x23, 0x6f, - 0xb8, 0x57, 0x8e, 0xbc, 0xa3, 0xa6, 0xe3, 0x19, 0xe9, 0x79, 0xb4, 0x7d, 0xb1, 0x08, 0x93, 0x78, - 0xa9, 0xf2, 0x93, 0x89, 0xb8, 0xd1, 0x39, 0x11, 0xc7, 0x9d, 0x1c, 0xa9, 0xf7, 0x6c, 0x7c, 0xc3, - 0x82, 0x49, 0x16, 0x96, 0x58, 0x04, 0xd4, 0x70, 0x03, 0xff, 0x04, 0x44, 0xb7, 0x47, 0x61, 0x30, - 0xa4, 0x8d, 0xa6, 0x33, 0x9e, 0xb0, 0x9e, 0x60, 0x0e, 0x43, 0x0f, 0xc3, 0x00, 0xeb, 0x02, 0x9d, - 0xbc, 0x31, 0x9e, 0x98, 0xa0, 0xe2, 0xc4, 0x0e, 0x66, 0xa5, 0xcc, 0xb3, 0x11, 0x93, 0x96, 0xe7, - 0xf2, 0x4e, 0x27, 0x1a, 0xf0, 0x0f, 0x87, 0x67, 0x63, 0x66, 0xd7, 0xde, 0x9f, 0x67, 0x63, 0x36, - 0xc9, 0xee, 0xd7, 0xa2, 0xff, 0x51, 0x80, 0x73, 0x99, 0xf5, 0xfa, 0xf6, 0x6c, 0xec, 0x5e, 0xfb, - 0x78, 0x9e, 0xdf, 0xb3, 0x5f, 0xc5, 0x8b, 0x27, 0xf8, 0x2a, 0x3e, 0xd0, 0xaf, 0xe4, 0x38, 0xd8, - 0x87, 0xc3, 0x61, 0xe6, 0x90, 0x7d, 0x48, 0x1c, 0x0e, 0x33, 0xfb, 0x96, 0x73, 0xad, 0xfb, 0x61, - 0x21, 0xe7, 0x5b, 0xd8, 0x05, 0xef, 0x02, 0xe5, 0x33, 0x0c, 0x18, 0x09, 0x49, 0x78, 0x8c, 0xf3, - 0x18, 0x5e, 0x86, 0x15, 0x14, 0xb9, 0x9a, 0xeb, 0x1e, 0xef, 0xda, 0xcb, 0x47, 0xda, 0x32, 0xf3, - 0xe6, 0x83, 0x85, 0x1e, 0xfd, 0x23, 0xed, 0xc6, 0xb7, 0xae, 0x5d, 0xca, 0x8b, 0xfd, 0x5f, 0xca, - 0xc7, 0xb2, 0x2f, 0xe4, 0x68, 0x11, 0x26, 0x77, 0x5d, 0x9f, 0xa5, 0x2d, 0x36, 0x45, 0x51, 0xe5, - 0xc9, 0xbe, 0x6e, 0x82, 0x71, 0x1a, 0x7f, 0xf6, 0x65, 0x18, 0xbf, 0x77, 0x2d, 0xe2, 0x77, 0x8b, - 0xf0, 0x50, 0x97, 0x6d, 0xcf, 0x79, 0xbd, 0x31, 0x07, 0x1a, 0xaf, 0xef, 0x98, 0x87, 0x2a, 0xcc, - 0x6c, 0xb5, 0x3d, 0x6f, 0x9f, 0x19, 0x9e, 0x91, 0x86, 0xc4, 0x10, 0xb2, 0xa2, 0x8a, 0x39, 0xbe, - 0x9a, 0x81, 0x83, 0x33, 0x6b, 0xa2, 0xd7, 0x00, 0x05, 0x9b, 0x2c, 0x0e, 0x76, 0x23, 0x89, 0x69, - 0xc2, 0x06, 0xbe, 0x98, 0x6c, 0xc6, 0xeb, 0x1d, 0x18, 0x38, 0xa3, 0x16, 0x15, 0xfa, 0xe9, 0xa9, - 0xb4, 0xaf, 0xba, 0x95, 0x12, 0xfa, 0xb1, 0x0e, 0xc4, 0x26, 0x2e, 0xba, 0x04, 0xd3, 0xce, 0x9e, - 0xe3, 0xf2, 0x18, 0x77, 0x92, 0x00, 0x97, 0xfa, 0x95, 0xee, 0x6e, 0x31, 0x8d, 0x80, 0x3b, 0xeb, - 0xa4, 0x7c, 0x10, 0x87, 0xf2, 0x7d, 0x10, 0xbb, 0xf3, 0xc5, 0x5e, 0xaa, 0x58, 0xfb, 0x3f, 0x5a, - 0xf4, 0xf8, 0xca, 0xc8, 0x93, 0x4b, 0xc7, 0x41, 0xa9, 0x14, 0x35, 0x77, 0x40, 0x35, 0x0e, 0xcb, - 0x3a, 0x10, 0x9b, 0xb8, 0x7c, 0x41, 0x44, 0x89, 0xdd, 0xbb, 0x21, 0xba, 0x0b, 0x3f, 0x5d, 0x85, - 0x81, 0xde, 0x80, 0xe1, 0x86, 0xbb, 0xe7, 0x46, 0x41, 0x28, 0x36, 0xcb, 0x51, 0x73, 0xc3, 0x2b, - 0x3e, 0x58, 0xe1, 0x64, 0xb0, 0xa4, 0x67, 0x7f, 0xb1, 0x00, 0xe3, 0xb2, 0xc5, 0xd7, 0xdb, 0x41, - 0xec, 0x9c, 0xc0, 0xb1, 0x7c, 0xc9, 0x38, 0x96, 0x3f, 0xd6, 0xcd, 0x59, 0x99, 0x75, 0x29, 0xf7, - 0x38, 0xbe, 0x9e, 0x3a, 0x8e, 0x1f, 0xef, 0x4d, 0xaa, 0xfb, 0x31, 0xfc, 0xcf, 0x2d, 0x98, 0x36, - 0xf0, 0x4f, 0xe0, 0x34, 0x58, 0x35, 0x4f, 0x83, 0x47, 0x7a, 0x7e, 0x43, 0xce, 0x29, 0xf0, 0xb5, - 0x42, 0xaa, 0xef, 0x8c, 0xfb, 0xbf, 0x0b, 0x03, 0xdb, 0x4e, 0xd8, 0xe8, 0x16, 0xa9, 0xb5, 0xa3, - 0xd2, 0xfc, 0x65, 0x27, 0x6c, 0x70, 0x1e, 0xfe, 0xb4, 0x4a, 0xe1, 0xe7, 0x84, 0x8d, 0x9e, 0x6e, - 0x1e, 0xac, 0x29, 0xf4, 0x12, 0x0c, 0x45, 0xf5, 0xa0, 0xa5, 0xcc, 0x61, 0xcf, 0xf3, 0xf4, 0x7e, - 0xb4, 0xe4, 0xf0, 0x60, 0x0e, 0x99, 0xcd, 0xd1, 0x62, 0x2c, 0xf0, 0x67, 0x9b, 0x50, 0x52, 0x4d, - 0xdf, 0x57, 0x43, 0xff, 0x3f, 0x2c, 0xc2, 0xa9, 0x8c, 0x75, 0x81, 0x22, 0x63, 0xb4, 0x9e, 0xed, - 0x73, 0x39, 0xbd, 0xcf, 0xf1, 0x8a, 0xd8, 0x8d, 0xa5, 0x21, 0xe6, 0xbf, 0xef, 0x46, 0x6f, 0x44, - 0x24, 0xdd, 0x28, 0x2d, 0xea, 0xdd, 0x28, 0x6d, 0xec, 0xc4, 0x86, 0x9a, 0x36, 0xa4, 0x7a, 0x7a, - 0x5f, 0xe7, 0xf4, 0x4f, 0x8a, 0x30, 0x93, 0x15, 0xe3, 0x00, 0xfd, 0x7c, 0x2a, 0xef, 0xcb, 0xf3, - 0xfd, 0x46, 0x47, 0xe0, 0xc9, 0x60, 0x44, 0x50, 0xa8, 0x79, 0x33, 0x13, 0x4c, 0xcf, 0x61, 0x16, - 0x6d, 0x32, 0xbf, 0xab, 0x90, 0xe7, 0xeb, 0x91, 0x5b, 0xfc, 0x13, 0x7d, 0x77, 0x40, 0x24, 0xfa, - 0x89, 0x52, 0x7e, 0x57, 0xb2, 0xb8, 0xb7, 0xdf, 0x95, 0x6c, 0x79, 0xd6, 0x85, 0x51, 0xed, 0x6b, - 0xee, 0xeb, 0x8c, 0xef, 0xd0, 0x13, 0x45, 0xeb, 0xf7, 0x7d, 0x9d, 0xf5, 0xaf, 0x58, 0x90, 0x32, - 0x5d, 0x53, 0x2a, 0x29, 0x2b, 0x57, 0x25, 0x75, 0x1e, 0x06, 0xc2, 0xc0, 0x23, 0xe9, 0x54, 0x20, - 0x38, 0xf0, 0x08, 0x66, 0x10, 0x95, 0xaf, 0xbb, 0x98, 0x97, 0xaf, 0x9b, 0x5e, 0x8d, 0x3d, 0xb2, - 0x47, 0xa4, 0x36, 0x42, 0xf1, 0xe4, 0xab, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0x8d, 0x01, 0x38, 0xdb, - 0xd5, 0xdf, 0x90, 0x5e, 0x59, 0x9a, 0x4e, 0x4c, 0x6e, 0x3b, 0xfb, 0xe9, 0x40, 0xc5, 0x97, 0x78, - 0x31, 0x96, 0x70, 0x66, 0x68, 0xcb, 0x63, 0x1d, 0xa6, 0x14, 0x78, 0x22, 0xc4, 0xa1, 0x80, 0x9a, - 0x8a, 0xa3, 0xe2, 0x71, 0x28, 0x8e, 0x2e, 0x02, 0x44, 0x91, 0xb7, 0xe2, 0x53, 0x09, 0xac, 0x21, - 0x2c, 0x78, 0x93, 0x98, 0x98, 0xb5, 0xab, 0x02, 0x82, 0x35, 0x2c, 0x54, 0x81, 0xa9, 0x56, 0x18, - 0xc4, 0x5c, 0x1f, 0x5a, 0xe1, 0xb6, 0x23, 0x83, 0xa6, 0xd3, 0x58, 0x35, 0x05, 0xc7, 0x1d, 0x35, - 0xd0, 0x0b, 0x30, 0x2a, 0x1c, 0xc9, 0xaa, 0x41, 0xe0, 0x09, 0x55, 0x8d, 0xb2, 0x44, 0xa8, 0x25, - 0x20, 0xac, 0xe3, 0x69, 0xd5, 0x98, 0x92, 0x75, 0x38, 0xb3, 0x1a, 0x57, 0xb4, 0x6a, 0x78, 0xa9, - 0x78, 0x27, 0x23, 0x7d, 0xc5, 0x3b, 0x49, 0x94, 0x57, 0xa5, 0xbe, 0xdf, 0x95, 0xa0, 0xa7, 0xba, - 0xe7, 0x37, 0x06, 0xe0, 0x94, 0x58, 0x38, 0xf7, 0x7b, 0xb9, 0xdc, 0xa7, 0xdc, 0xdf, 0x3f, 0x59, - 0x33, 0x27, 0xbd, 0x66, 0xbe, 0x59, 0x84, 0x21, 0x3e, 0x15, 0x27, 0x20, 0xc3, 0xaf, 0x0a, 0xa5, - 0x5f, 0x97, 0x88, 0x21, 0xbc, 0x2f, 0xf3, 0x15, 0x27, 0x76, 0xf8, 0xf9, 0xa5, 0xd8, 0x68, 0xa2, - 0x1e, 0x44, 0xf3, 0x06, 0xa3, 0x9d, 0x4d, 0x69, 0xb5, 0x80, 0xd3, 0xd0, 0xd8, 0xee, 0xdb, 0x00, - 0x11, 0xcb, 0x3f, 0x4d, 0x69, 0x88, 0xd8, 0x33, 0x4f, 0x76, 0x69, 0xbd, 0xa6, 0x90, 0x79, 0x1f, - 0x92, 0x25, 0xa8, 0x00, 0x58, 0xa3, 0x38, 0xfb, 0x22, 0x94, 0x14, 0x72, 0x2f, 0x15, 0xc0, 0x98, - 0x7e, 0xea, 0x7d, 0x0a, 0x26, 0x53, 0x6d, 0x1d, 0x49, 0x83, 0xf0, 0x5b, 0x16, 0x4c, 0xf2, 0x2e, - 0xaf, 0xf8, 0x7b, 0x62, 0xb3, 0xbf, 0x07, 0x33, 0x5e, 0xc6, 0xa6, 0x13, 0x33, 0xda, 0xff, 0x26, - 0x55, 0x1a, 0x83, 0x2c, 0x28, 0xce, 0x6c, 0x03, 0x5d, 0x80, 0x11, 0x9e, 0x39, 0xdf, 0xf1, 0x84, - 0x37, 0xc1, 0x18, 0xcf, 0x1d, 0xc0, 0xcb, 0xb0, 0x82, 0xda, 0xdf, 0xb3, 0x60, 0x9a, 0xf7, 0xfc, - 0x0a, 0xd9, 0x57, 0xb7, 0xe3, 0x0f, 0xb2, 0xef, 0x22, 0x35, 0x42, 0x21, 0x27, 0x35, 0x82, 0xfe, - 0x69, 0xc5, 0xae, 0x9f, 0xf6, 0xeb, 0x16, 0x88, 0x15, 0x78, 0x02, 0xf7, 0xc0, 0x9f, 0x36, 0xef, - 0x81, 0xb3, 0xf9, 0x8b, 0x3a, 0xe7, 0x02, 0xf8, 0x67, 0x16, 0x4c, 0x71, 0x84, 0xe4, 0x21, 0xf2, - 0x03, 0x9d, 0x87, 0x7e, 0xf2, 0x75, 0xa9, 0x04, 0xc9, 0xd9, 0x1f, 0x65, 0x4c, 0xd6, 0x40, 0xd7, - 0xc9, 0x6a, 0xc8, 0x0d, 0x74, 0x84, 0x3c, 0x74, 0x47, 0x8e, 0xe6, 0x69, 0xff, 0x37, 0x0b, 0x10, - 0x6f, 0xc6, 0x38, 0x97, 0xe9, 0x69, 0xc7, 0x4a, 0x35, 0x4d, 0x50, 0xc2, 0x6a, 0x14, 0x04, 0x6b, - 0x58, 0xc7, 0x32, 0x3c, 0xa9, 0xd7, 0xe4, 0x62, 0xef, 0xd7, 0xe4, 0x23, 0x8c, 0xe8, 0x5f, 0x1d, - 0x80, 0xb4, 0xe9, 0x32, 0xba, 0x09, 0x63, 0x75, 0xa7, 0xe5, 0x6c, 0xba, 0x9e, 0x1b, 0xbb, 0x24, - 0xea, 0x66, 0x86, 0xb2, 0xac, 0xe1, 0x89, 0x77, 0x42, 0xad, 0x04, 0x1b, 0x74, 0xd0, 0x3c, 0x40, - 0x2b, 0x74, 0xf7, 0x5c, 0x8f, 0x34, 0xd9, 0x55, 0x98, 0xf9, 0x2f, 0x71, 0xdb, 0x0a, 0x59, 0x8a, - 0x35, 0x8c, 0x0c, 0x7f, 0x97, 0xe2, 0xfd, 0xf3, 0x77, 0x19, 0x38, 0xa2, 0xbf, 0xcb, 0x60, 0x5f, - 0xfe, 0x2e, 0x18, 0x1e, 0x90, 0x67, 0x37, 0xfd, 0xbf, 0xea, 0x7a, 0x44, 0x08, 0x6c, 0xdc, 0xab, - 0x69, 0xf6, 0xee, 0xc1, 0xdc, 0x03, 0x38, 0x13, 0x03, 0xe7, 0xd4, 0x44, 0x9f, 0x86, 0xb2, 0xe3, - 0x79, 0xc1, 0x6d, 0x35, 0x6a, 0x2b, 0x51, 0xdd, 0xf1, 0x92, 0xe0, 0xd6, 0x23, 0x4b, 0x0f, 0xdf, - 0x3d, 0x98, 0x2b, 0x2f, 0xe6, 0xe0, 0xe0, 0xdc, 0xda, 0xf6, 0x0e, 0x9c, 0xaa, 0x91, 0x50, 0xa6, - 0xb6, 0x54, 0x5b, 0x6c, 0x03, 0x4a, 0x61, 0x8a, 0xa9, 0xf4, 0x15, 0xfa, 0x42, 0x0b, 0x3c, 0x28, - 0x99, 0x48, 0x42, 0xc8, 0xfe, 0x53, 0x0b, 0x86, 0x85, 0x39, 0xf4, 0x09, 0xc8, 0x32, 0x8b, 0x86, - 0x3e, 0x72, 0x2e, 0x9b, 0xf1, 0xb2, 0xce, 0xe4, 0x6a, 0x22, 0xd7, 0x52, 0x9a, 0xc8, 0x47, 0xba, - 0x11, 0xe9, 0xae, 0x83, 0xfc, 0xa5, 0x22, 0x4c, 0x98, 0xa6, 0xe0, 0x27, 0x30, 0x04, 0xd7, 0x60, - 0x38, 0x12, 0x7e, 0x07, 0x85, 0x7c, 0xfb, 0xd5, 0xf4, 0x24, 0x26, 0x56, 0x2e, 0xc2, 0xd3, 0x40, - 0x12, 0xc9, 0x74, 0x68, 0x28, 0xde, 0x47, 0x87, 0x86, 0x5e, 0xd6, 0xf8, 0x03, 0xc7, 0x61, 0x8d, - 0x6f, 0x7f, 0x8b, 0x31, 0x7f, 0xbd, 0xfc, 0x04, 0xe4, 0x82, 0x4b, 0xe6, 0x31, 0x61, 0x77, 0x59, - 0x59, 0xa2, 0x53, 0x39, 0xf2, 0xc1, 0x3f, 0xb2, 0x60, 0x54, 0x20, 0x9e, 0x40, 0xb7, 0x7f, 0xc6, - 0xec, 0xf6, 0x43, 0x5d, 0xba, 0x9d, 0xd3, 0xdf, 0xbf, 0x5d, 0x50, 0xfd, 0xad, 0x06, 0x61, 0xdc, - 0x57, 0xb2, 0x83, 0x11, 0x7a, 0x1b, 0x0c, 0xea, 0x81, 0x27, 0x0e, 0xf3, 0x87, 0x13, 0xc7, 0x56, - 0x5e, 0x7e, 0xa8, 0xfd, 0xc6, 0x0a, 0x9b, 0xf9, 0x5d, 0x06, 0x61, 0x2c, 0x0e, 0xd0, 0xc4, 0xef, - 0x32, 0x08, 0x63, 0xcc, 0x20, 0xa8, 0x01, 0x10, 0x3b, 0x61, 0x93, 0xc4, 0xb4, 0x4c, 0x78, 0x82, - 0xe7, 0xef, 0xc2, 0x76, 0xec, 0x7a, 0xf3, 0xae, 0x1f, 0x47, 0x71, 0x38, 0xbf, 0xe6, 0xc7, 0xd7, - 0x43, 0x7e, 0x37, 0xd0, 0x3c, 0x55, 0x15, 0x2d, 0xac, 0xd1, 0x95, 0xae, 0x52, 0xac, 0x8d, 0x41, - 0xf3, 0xa1, 0xf0, 0x9a, 0x28, 0xc7, 0x0a, 0xc3, 0x7e, 0x91, 0xf1, 0x64, 0x36, 0x40, 0x47, 0x73, - 0x22, 0xfd, 0xce, 0x88, 0x1a, 0x5a, 0xf6, 0x4a, 0x50, 0xd1, 0x5d, 0x55, 0xbb, 0xb3, 0x40, 0xda, - 0xb0, 0xee, 0x16, 0x90, 0xf8, 0xb3, 0xa2, 0x9f, 0xed, 0x78, 0x3f, 0x7e, 0xa6, 0x07, 0x2f, 0x3d, - 0xc2, 0x8b, 0x31, 0x8b, 0xbc, 0xc9, 0x22, 0x14, 0xae, 0x55, 0xd3, 0xe9, 0x28, 0x96, 0x25, 0x00, - 0x27, 0x38, 0x68, 0x41, 0xdc, 0x2c, 0xb9, 0x7e, 0xee, 0xa1, 0xd4, 0xcd, 0x52, 0x7e, 0xbe, 0x76, - 0xb5, 0x7c, 0x16, 0x46, 0x55, 0x8a, 0xaf, 0x2a, 0xcf, 0x94, 0x54, 0xe2, 0xb2, 0xd4, 0x4a, 0x52, - 0x8c, 0x75, 0x1c, 0xb4, 0x01, 0x93, 0x11, 0xcf, 0x3f, 0x26, 0xbd, 0x97, 0x84, 0xde, 0xe0, 0x49, - 0xf9, 0xee, 0x5c, 0x33, 0xc1, 0x87, 0xac, 0x88, 0x6f, 0x56, 0xe9, 0xef, 0x94, 0x26, 0x81, 0x5e, - 0x85, 0x09, 0x4f, 0xcf, 0xc3, 0x5c, 0x15, 0x6a, 0x05, 0x65, 0x96, 0x69, 0x64, 0x69, 0xae, 0xe2, - 0x14, 0x36, 0x15, 0x02, 0xf4, 0x12, 0x11, 0x0c, 0xcb, 0xf1, 0x9b, 0x24, 0x12, 0x09, 0x8a, 0x98, - 0x10, 0x70, 0x35, 0x07, 0x07, 0xe7, 0xd6, 0x46, 0x2f, 0xc1, 0x98, 0xfc, 0x7c, 0xcd, 0x9b, 0x2f, - 0x31, 0xfe, 0xd5, 0x60, 0xd8, 0xc0, 0x44, 0xb7, 0xe1, 0xb4, 0xfc, 0xbf, 0x11, 0x3a, 0x5b, 0x5b, - 0x6e, 0x5d, 0x38, 0x53, 0x8e, 0x32, 0x12, 0x8b, 0xd2, 0x13, 0x62, 0x25, 0x0b, 0xe9, 0xf0, 0x60, - 0xee, 0xbc, 0x18, 0xb5, 0x4c, 0x38, 0x9b, 0xc4, 0x6c, 0xfa, 0x68, 0x1d, 0x4e, 0x6d, 0x13, 0xc7, - 0x8b, 0xb7, 0x97, 0xb7, 0x49, 0x7d, 0x47, 0x6e, 0x22, 0xe6, 0x23, 0xa8, 0x99, 0xcc, 0x5e, 0xee, - 0x44, 0xc1, 0x59, 0xf5, 0xd0, 0x5b, 0x50, 0x6e, 0xb5, 0x37, 0x3d, 0x37, 0xda, 0xbe, 0x16, 0xc4, - 0xec, 0xa9, 0x5b, 0x65, 0xc8, 0x12, 0xce, 0x84, 0xca, 0x3f, 0xb2, 0x9a, 0x83, 0x87, 0x73, 0x29, - 0xa0, 0xf7, 0xe0, 0x74, 0x6a, 0x31, 0xf0, 0xa4, 0x6b, 0xc2, 0xe9, 0xf0, 0x89, 0xec, 0xed, 0x94, - 0x51, 0x81, 0xbb, 0xb8, 0x66, 0x82, 0x70, 0x76, 0x13, 0xef, 0xcf, 0x00, 0xe2, 0x5d, 0x5a, 0x59, - 0x93, 0x6e, 0xd0, 0x67, 0x60, 0x4c, 0x5f, 0x45, 0xe2, 0x80, 0x79, 0xac, 0x57, 0xce, 0x71, 0x21, - 0x1b, 0xa9, 0x15, 0xa5, 0xc3, 0xb0, 0x41, 0xd1, 0x26, 0x90, 0xfd, 0x7d, 0xe8, 0x2a, 0x8c, 0xd4, - 0x3d, 0x97, 0xf8, 0xf1, 0x5a, 0xb5, 0x9b, 0x13, 0xfc, 0xb2, 0xc0, 0x11, 0x03, 0x26, 0x62, 0xb1, - 0xf1, 0x32, 0xac, 0x28, 0xd8, 0xbf, 0x5b, 0x80, 0xb9, 0x1e, 0xe1, 0xf8, 0x52, 0x3a, 0x40, 0xab, - 0x2f, 0x1d, 0xe0, 0xa2, 0xcc, 0xf7, 0x75, 0x2d, 0x75, 0xff, 0x4c, 0xe5, 0xf2, 0x4a, 0x6e, 0xa1, - 0x69, 0xfc, 0xbe, 0xed, 0x26, 0x75, 0x35, 0xe2, 0x40, 0x4f, 0x8b, 0x5e, 0xe3, 0xf9, 0x60, 0xb0, - 0x7f, 0x89, 0x3e, 0x57, 0x15, 0x6c, 0x7f, 0xab, 0x00, 0xa7, 0xd5, 0x10, 0xfe, 0xf8, 0x0e, 0xdc, - 0x8d, 0xce, 0x81, 0x3b, 0x06, 0x45, 0xba, 0x7d, 0x1d, 0x86, 0x6a, 0xfb, 0x51, 0x3d, 0xf6, 0xfa, - 0x10, 0x80, 0x1e, 0x35, 0x36, 0x68, 0x72, 0x4c, 0xb3, 0x94, 0x9d, 0x62, 0xbf, 0xda, 0x7f, 0xc9, - 0x82, 0xc9, 0x8d, 0xe5, 0x6a, 0x2d, 0xa8, 0xef, 0x90, 0x78, 0x91, 0xab, 0x89, 0xb0, 0x90, 0x7f, - 0xac, 0x7b, 0x94, 0x6b, 0xb2, 0x24, 0xa6, 0xf3, 0x30, 0xb0, 0x1d, 0x44, 0x71, 0xfa, 0x95, 0xed, - 0x72, 0x10, 0xc5, 0x98, 0x41, 0xec, 0x3f, 0xb2, 0x60, 0x90, 0x65, 0xa9, 0xec, 0x95, 0xcd, 0xb4, - 0x9f, 0xef, 0x42, 0x2f, 0xc0, 0x10, 0xd9, 0xda, 0x22, 0xf5, 0x58, 0xcc, 0xaa, 0xf4, 0xae, 0x1b, - 0x5a, 0x61, 0xa5, 0xf4, 0xd0, 0x67, 0x8d, 0xf1, 0xbf, 0x58, 0x20, 0xa3, 0x5b, 0x50, 0x8a, 0xdd, - 0x5d, 0xb2, 0xd8, 0x68, 0x88, 0x77, 0x8a, 0x7b, 0x70, 0x66, 0xdc, 0x90, 0x04, 0x70, 0x42, 0xcb, - 0xfe, 0x52, 0x01, 0x20, 0xf1, 0xc0, 0xed, 0xf5, 0x89, 0x4b, 0x1d, 0x09, 0x5b, 0x1f, 0xcb, 0x48, - 0xd8, 0x8a, 0x12, 0x82, 0x19, 0xe9, 0x5a, 0xd5, 0x30, 0x15, 0xfb, 0x1a, 0xa6, 0x81, 0xa3, 0x0c, - 0xd3, 0x32, 0x4c, 0x27, 0x1e, 0xc4, 0x66, 0x38, 0x05, 0x16, 0x8a, 0x7b, 0x23, 0x0d, 0xc4, 0x9d, - 0xf8, 0xf6, 0x17, 0x2c, 0x10, 0xee, 0x06, 0x7d, 0x2c, 0xe6, 0x37, 0x65, 0x6e, 0x45, 0x23, 0x3e, - 0xe8, 0xf9, 0x7c, 0xff, 0x0b, 0x11, 0x15, 0x54, 0x1d, 0x1e, 0x46, 0x2c, 0x50, 0x83, 0x96, 0xfd, - 0xd7, 0x0b, 0x30, 0xca, 0xc1, 0x2c, 0xf6, 0x64, 0x1f, 0xbd, 0x39, 0x52, 0x20, 0x77, 0x96, 0x76, - 0x90, 0x12, 0x56, 0xf1, 0xbe, 0xf5, 0xb4, 0x83, 0x12, 0x80, 0x13, 0x1c, 0xf4, 0x04, 0x0c, 0x47, - 0xed, 0x4d, 0x86, 0x9e, 0x32, 0x6f, 0xaf, 0xf1, 0x62, 0x2c, 0xe1, 0xe8, 0xd3, 0x30, 0xc5, 0xeb, - 0x85, 0x41, 0xcb, 0x69, 0x72, 0xdd, 0xce, 0xa0, 0xf2, 0x37, 0x9b, 0x5a, 0x4f, 0xc1, 0x0e, 0x0f, - 0xe6, 0x66, 0xd2, 0x65, 0x4c, 0x2b, 0xd8, 0x41, 0x85, 0xae, 0xd8, 0xa9, 0xb4, 0x2b, 0x0b, 0xba, - 0x0c, 0x43, 0x9c, 0x19, 0x09, 0xe6, 0xd0, 0xe5, 0xad, 0x47, 0x73, 0x80, 0x61, 0x31, 0xae, 0x05, - 0x3f, 0x13, 0xf5, 0xd1, 0x5b, 0x30, 0xda, 0x08, 0x6e, 0xfb, 0xb7, 0x9d, 0xb0, 0xb1, 0x58, 0x5d, - 0x13, 0xf3, 0x99, 0x29, 0xd3, 0x54, 0x12, 0x34, 0xdd, 0xa9, 0x86, 0xe9, 0x35, 0x13, 0x10, 0xd6, - 0xc9, 0xa1, 0x0d, 0x16, 0x2e, 0x89, 0xe7, 0x05, 0xef, 0x66, 0x0f, 0xa6, 0x52, 0x89, 0x6b, 0x94, - 0xc7, 0x45, 0x4c, 0x25, 0x91, 0x55, 0x3c, 0x21, 0x64, 0x7f, 0xee, 0x14, 0x18, 0xeb, 0xc8, 0x08, - 0xe4, 0x6e, 0x1d, 0x53, 0x20, 0x77, 0x0c, 0x23, 0x64, 0xb7, 0x15, 0xef, 0x57, 0xdc, 0xb0, 0x5b, - 0x06, 0x8f, 0x15, 0x81, 0xd3, 0x49, 0x53, 0x42, 0xb0, 0xa2, 0x93, 0x1d, 0x6d, 0xbf, 0xf8, 0x01, - 0x46, 0xdb, 0x1f, 0x38, 0xc1, 0x68, 0xfb, 0xd7, 0x60, 0xb8, 0xe9, 0xc6, 0x98, 0xb4, 0x02, 0x71, - 0x10, 0x67, 0xae, 0x84, 0x4b, 0x1c, 0xa5, 0x33, 0xfe, 0xb3, 0x00, 0x60, 0x49, 0x04, 0xbd, 0xa6, - 0xf6, 0xc0, 0x50, 0xbe, 0x1c, 0xdb, 0xf9, 0x2c, 0x90, 0xb9, 0x0b, 0x44, 0x74, 0xfd, 0xe1, 0x7b, - 0x8d, 0xae, 0xaf, 0x62, 0xe2, 0x8f, 0xbc, 0xbf, 0x98, 0xf8, 0x46, 0xf6, 0x80, 0xd2, 0xf1, 0x65, - 0x0f, 0xf8, 0x82, 0x05, 0xa7, 0x5b, 0x59, 0x89, 0x34, 0x44, 0x74, 0xfb, 0x17, 0xfa, 0xce, 0x14, - 0x62, 0x34, 0xc8, 0x2e, 0x34, 0x99, 0x68, 0x38, 0xbb, 0x39, 0x3a, 0xd0, 0xe1, 0x66, 0x43, 0x84, - 0xc4, 0x7f, 0x34, 0x27, 0x0d, 0x41, 0x97, 0xe4, 0x03, 0xf7, 0x27, 0x0c, 0x7e, 0x92, 0x8a, 0x60, - 0xfc, 0x7d, 0xa7, 0x22, 0x78, 0x4d, 0xa5, 0x22, 0xe8, 0x12, 0x94, 0x86, 0x27, 0x1a, 0xe8, 0x99, - 0x80, 0x40, 0x4b, 0x22, 0x30, 0x79, 0x1c, 0x49, 0x04, 0xde, 0x36, 0x99, 0x3d, 0x8f, 0x68, 0xff, - 0x54, 0x0f, 0x66, 0x6f, 0xd0, 0xed, 0xce, 0xee, 0x79, 0xc2, 0x84, 0xe9, 0x7b, 0x4a, 0x98, 0x70, - 0x53, 0x4f, 0x45, 0x80, 0x7a, 0xc4, 0xda, 0xa7, 0x48, 0x7d, 0x26, 0x20, 0xb8, 0xa9, 0x1f, 0x41, - 0xa7, 0xf2, 0xe9, 0xaa, 0x93, 0xa6, 0x93, 0x6e, 0xd6, 0x21, 0xd4, 0x99, 0xd8, 0x60, 0xe6, 0x64, - 0x12, 0x1b, 0x9c, 0x3e, 0xf6, 0xc4, 0x06, 0x0f, 0x9c, 0x40, 0x62, 0x83, 0x07, 0x3f, 0xd0, 0xc4, - 0x06, 0xe5, 0xfb, 0x90, 0xd8, 0xe0, 0x5a, 0x92, 0xd8, 0xe0, 0x4c, 0xfe, 0x94, 0x64, 0xd8, 0x8b, - 0xe5, 0xa4, 0x33, 0xb8, 0x09, 0xa5, 0x96, 0xf4, 0x76, 0x2e, 0xcf, 0xe6, 0x4f, 0x49, 0xa6, 0x4b, - 0x34, 0x9f, 0x12, 0x05, 0xc2, 0x09, 0x29, 0x4a, 0x37, 0x49, 0x6f, 0xf0, 0x50, 0x17, 0x95, 0x55, - 0x96, 0x32, 0xa0, 0x4b, 0x52, 0x83, 0xbf, 0x5c, 0x80, 0x73, 0xdd, 0xd7, 0x75, 0xa2, 0x49, 0xa8, - 0x26, 0x9a, 0xef, 0x94, 0x26, 0x81, 0x09, 0x5d, 0x1a, 0x56, 0xdf, 0x21, 0x21, 0x2e, 0xc1, 0xb4, - 0x32, 0x14, 0xf3, 0xdc, 0xfa, 0xbe, 0x96, 0x0d, 0x4d, 0x39, 0xad, 0xd4, 0xd2, 0x08, 0xb8, 0xb3, - 0x0e, 0x5a, 0x84, 0x49, 0xa3, 0x70, 0xad, 0x22, 0x84, 0x7d, 0xa5, 0xba, 0xa8, 0x99, 0x60, 0x9c, - 0xc6, 0xb7, 0xbf, 0x66, 0xc1, 0x83, 0x39, 0x31, 0x8e, 0xfb, 0x8e, 0x78, 0xb0, 0x05, 0x93, 0x2d, - 0xb3, 0x6a, 0x8f, 0xc0, 0x28, 0x46, 0x24, 0x65, 0xd5, 0xd7, 0x14, 0x00, 0xa7, 0x89, 0x2e, 0x5d, - 0xf8, 0xf6, 0xf7, 0xcf, 0x7d, 0xe4, 0x0f, 0xbe, 0x7f, 0xee, 0x23, 0xdf, 0xfb, 0xfe, 0xb9, 0x8f, - 0xfc, 0xf9, 0xbb, 0xe7, 0xac, 0x6f, 0xdf, 0x3d, 0x67, 0xfd, 0xc1, 0xdd, 0x73, 0xd6, 0xf7, 0xee, - 0x9e, 0xb3, 0xfe, 0xf8, 0xee, 0x39, 0xeb, 0x4b, 0x3f, 0x38, 0xf7, 0x91, 0x37, 0x0b, 0x7b, 0xcf, - 0xfe, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xea, 0xa0, 0xb7, 0x43, 0x3c, 0xd5, 0x00, 0x00, + // 11954 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, 0xcb, 0x59, 0x90, 0xbb, 0x58, 0x36, + 0x25, 0x72, 0xf9, 0x02, 0xc4, 0x25, 0x29, 0xae, 0x45, 0x8a, 0x36, 0x80, 0x01, 0x76, 0x87, 0xbb, + 0xd8, 0x1d, 0xde, 0xc1, 0xee, 0x8a, 0x34, 0xcd, 0x4f, 0x8d, 0x99, 0x0b, 0xa0, 0x89, 0x46, 0xf7, + 0xb0, 0xbb, 0x07, 0xbb, 0x60, 0xd9, 0x55, 0x5f, 0x14, 0x5b, 0x79, 0xd8, 0x3f, 0x5c, 0x89, 0x2b, + 0x71, 0x6c, 0x97, 0x53, 0x95, 0x47, 0xd9, 0x8a, 0x93, 0x54, 0x1c, 0x3b, 0xb2, 0x23, 0x39, 0x15, + 0xc7, 0x79, 0xc9, 0x7f, 0x14, 0x3b, 0x7f, 0xa4, 0x2a, 0x57, 0x10, 0x6b, 0x95, 0x4a, 0x2a, 0x3f, + 0x92, 0x4a, 0xe2, 0x5f, 0x46, 0x9c, 0x28, 0x75, 0x9f, 0x7d, 0x6f, 0x4f, 0xf7, 0xcc, 0x60, 0x89, + 0x05, 0x29, 0x95, 0xfe, 0xcd, 0xdc, 0x73, 0xee, 0xb9, 0xb7, 0xef, 0xe3, 0xdc, 0x73, 0xcf, 0x3d, + 0x0f, 0x78, 0x75, 0xe7, 0x72, 0x34, 0xef, 0x06, 0x0b, 0x3b, 0xed, 0x0d, 0x12, 0xfa, 0x24, 0x26, + 0xd1, 0xc2, 0x1e, 0xf1, 0x9b, 0x41, 0xb8, 0x20, 0x00, 0x4e, 0xcb, 0x5d, 0x68, 0x04, 0x21, 0x59, + 0xd8, 0x7b, 0x61, 0x61, 0x8b, 0xf8, 0x24, 0x74, 0x62, 0xd2, 0x9c, 0x6f, 0x85, 0x41, 0x1c, 0x20, + 0xc4, 0x71, 0xe6, 0x9d, 0x96, 0x3b, 0x4f, 0x71, 0xe6, 0xf7, 0x5e, 0x98, 0x7d, 0x7e, 0xcb, 0x8d, + 0xb7, 0xdb, 0x1b, 0xf3, 0x8d, 0x60, 0x77, 0x61, 0x2b, 0xd8, 0x0a, 0x16, 0x18, 0xea, 0x46, 0x7b, + 0x93, 0xfd, 0x63, 0x7f, 0xd8, 0x2f, 0x4e, 0x62, 0x76, 0x2d, 0x69, 0x86, 0xdc, 0x8b, 0x89, 0x1f, + 0xb9, 0x81, 0x1f, 0x3d, 0xef, 0xb4, 0xdc, 0x88, 0x84, 0x7b, 0x24, 0x5c, 0x68, 0xed, 0x6c, 0x51, + 0x58, 0x64, 0x22, 0x2c, 0xec, 0xbd, 0xb0, 0x41, 0x62, 0xa7, 0xa3, 0x47, 0xb3, 0x2f, 0x25, 0xe4, + 0x76, 0x9d, 0xc6, 0xb6, 0xeb, 0x93, 0x70, 0x5f, 0xd2, 0x58, 0x08, 0x49, 0x14, 0xb4, 0xc3, 0x06, + 0x39, 0x52, 0xad, 0x68, 0x61, 0x97, 0xc4, 0x4e, 0xc6, 0xd7, 0xcf, 0x2e, 0xe4, 0xd5, 0x0a, 0xdb, + 0x7e, 0xec, 0xee, 0x76, 0x36, 0xf3, 0x99, 0x5e, 0x15, 0xa2, 0xc6, 0x36, 0xd9, 0x75, 0x3a, 0xea, + 0xbd, 0x98, 0x57, 0xaf, 0x1d, 0xbb, 0xde, 0x82, 0xeb, 0xc7, 0x51, 0x1c, 0xa6, 0x2b, 0xd9, 0xdf, + 0xb4, 0xe0, 0xc2, 0xe2, 0x9d, 0xfa, 0x8a, 0xe7, 0x44, 0xb1, 0xdb, 0x58, 0xf2, 0x82, 0xc6, 0x4e, + 0x3d, 0x0e, 0x42, 0x72, 0x3b, 0xf0, 0xda, 0xbb, 0xa4, 0xce, 0x06, 0x02, 0x3d, 0x07, 0x23, 0x7b, + 0xec, 0x7f, 0xb5, 0x52, 0xb6, 0x2e, 0x58, 0x17, 0x4b, 0x4b, 0x53, 0x5f, 0x3f, 0x98, 0xfb, 0xc4, + 0xfd, 0x83, 0xb9, 0x91, 0xdb, 0xa2, 0x1c, 0x2b, 0x0c, 0xf4, 0x24, 0x0c, 0x6d, 0x46, 0xeb, 0xfb, + 0x2d, 0x52, 0x2e, 0x30, 0xdc, 0x09, 0x81, 0x3b, 0xb4, 0x5a, 0xa7, 0xa5, 0x58, 0x40, 0xd1, 0x02, + 0x94, 0x5a, 0x4e, 0x18, 0xbb, 0xb1, 0x1b, 0xf8, 0xe5, 0xe2, 0x05, 0xeb, 0xe2, 0xe0, 0xd2, 0xb4, + 0x40, 0x2d, 0xd5, 0x24, 0x00, 0x27, 0x38, 0xb4, 0x1b, 0x21, 0x71, 0x9a, 0x37, 0x7d, 0x6f, 0xbf, + 0x3c, 0x70, 0xc1, 0xba, 0x38, 0x92, 0x74, 0x03, 0x8b, 0x72, 0xac, 0x30, 0xec, 0x5f, 0x28, 0xc0, + 0xc8, 0xe2, 0xe6, 0xa6, 0xeb, 0xbb, 0xf1, 0x3e, 0xba, 0x0d, 0x63, 0x7e, 0xd0, 0x24, 0xf2, 0x3f, + 0xfb, 0x8a, 0xd1, 0x4b, 0x17, 0xe6, 0x3b, 0x57, 0xe6, 0xfc, 0x0d, 0x0d, 0x6f, 0x69, 0xea, 0xfe, + 0xc1, 0xdc, 0x98, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x68, 0x2b, 0x68, 0x2a, 0xb2, 0x05, 0x46, + 0x76, 0x2e, 0x8b, 0x6c, 0x2d, 0x41, 0x5b, 0x9a, 0xbc, 0x7f, 0x30, 0x37, 0xaa, 0x15, 0x60, 0x9d, + 0x08, 0xda, 0x80, 0x49, 0xfa, 0xd7, 0x8f, 0x5d, 0x45, 0xb7, 0xc8, 0xe8, 0x3e, 0x91, 0x47, 0x57, + 0x43, 0x5d, 0x3a, 0x75, 0xff, 0x60, 0x6e, 0x32, 0x55, 0x88, 0xd3, 0x04, 0xed, 0x0f, 0x60, 0x62, + 0x31, 0x8e, 0x9d, 0xc6, 0x36, 0x69, 0xf2, 0x19, 0x44, 0x2f, 0xc1, 0x80, 0xef, 0xec, 0x12, 0x31, + 0xbf, 0x17, 0xc4, 0xc0, 0x0e, 0xdc, 0x70, 0x76, 0xc9, 0xe1, 0xc1, 0xdc, 0xd4, 0x2d, 0xdf, 0x7d, + 0xbf, 0x2d, 0x56, 0x05, 0x2d, 0xc3, 0x0c, 0x1b, 0x5d, 0x02, 0x68, 0x92, 0x3d, 0xb7, 0x41, 0x6a, + 0x4e, 0xbc, 0x2d, 0xe6, 0x1b, 0x89, 0xba, 0x50, 0x51, 0x10, 0xac, 0x61, 0xd9, 0xf7, 0xa0, 0xb4, + 0xb8, 0x17, 0xb8, 0xcd, 0x5a, 0xd0, 0x8c, 0xd0, 0x0e, 0x4c, 0xb6, 0x42, 0xb2, 0x49, 0x42, 0x55, + 0x54, 0xb6, 0x2e, 0x14, 0x2f, 0x8e, 0x5e, 0xba, 0x98, 0xf9, 0xb1, 0x26, 0xea, 0x8a, 0x1f, 0x87, + 0xfb, 0x4b, 0x8f, 0x88, 0xf6, 0x26, 0x53, 0x50, 0x9c, 0xa6, 0x6c, 0xff, 0xab, 0x02, 0x9c, 0x5e, + 0xfc, 0xa0, 0x1d, 0x92, 0x8a, 0x1b, 0xed, 0xa4, 0x57, 0x78, 0xd3, 0x8d, 0x76, 0x6e, 0x24, 0x23, + 0xa0, 0x96, 0x56, 0x45, 0x94, 0x63, 0x85, 0x81, 0x9e, 0x87, 0x61, 0xfa, 0xfb, 0x16, 0xae, 0x8a, + 0x4f, 0x3e, 0x25, 0x90, 0x47, 0x2b, 0x4e, 0xec, 0x54, 0x38, 0x08, 0x4b, 0x1c, 0xb4, 0x06, 0xa3, + 0x0d, 0xb6, 0x21, 0xb7, 0xd6, 0x82, 0x26, 0x61, 0x93, 0x59, 0x5a, 0x7a, 0x96, 0xa2, 0x2f, 0x27, + 0xc5, 0x87, 0x07, 0x73, 0x65, 0xde, 0x37, 0x41, 0x42, 0x83, 0x61, 0xbd, 0x3e, 0xb2, 0xd5, 0xfe, + 0x1a, 0x60, 0x94, 0x20, 0x63, 0x6f, 0x5d, 0xd4, 0xb6, 0xca, 0x20, 0xdb, 0x2a, 0x63, 0xd9, 0xdb, + 0x04, 0xbd, 0x00, 0x03, 0x3b, 0xae, 0xdf, 0x2c, 0x0f, 0x31, 0x5a, 0xe7, 0xe8, 0x9c, 0x5f, 0x73, + 0xfd, 0xe6, 0xe1, 0xc1, 0xdc, 0xb4, 0xd1, 0x1d, 0x5a, 0x88, 0x19, 0xaa, 0xfd, 0x27, 0x16, 0xcc, + 0x31, 0xd8, 0xaa, 0xeb, 0x91, 0x1a, 0x09, 0x23, 0x37, 0x8a, 0x89, 0x1f, 0x1b, 0x03, 0x7a, 0x09, + 0x20, 0x22, 0x8d, 0x90, 0xc4, 0xda, 0x90, 0xaa, 0x85, 0x51, 0x57, 0x10, 0xac, 0x61, 0x51, 0x86, + 0x10, 0x6d, 0x3b, 0x21, 0x5b, 0x5f, 0x62, 0x60, 0x15, 0x43, 0xa8, 0x4b, 0x00, 0x4e, 0x70, 0x0c, + 0x86, 0x50, 0xec, 0xc5, 0x10, 0xd0, 0xe7, 0x60, 0x32, 0x69, 0x2c, 0x6a, 0x39, 0x0d, 0x39, 0x80, + 0x6c, 0xcb, 0xd4, 0x4d, 0x10, 0x4e, 0xe3, 0xda, 0x7f, 0xcf, 0x12, 0x8b, 0x87, 0x7e, 0xf5, 0xc7, + 0xfc, 0x5b, 0xed, 0xdf, 0xb6, 0x60, 0x78, 0xc9, 0xf5, 0x9b, 0xae, 0xbf, 0x85, 0xbe, 0x00, 0x23, + 0xf4, 0x6c, 0x6a, 0x3a, 0xb1, 0x23, 0xf8, 0xde, 0xa7, 0xb5, 0xbd, 0xa5, 0x8e, 0x8a, 0xf9, 0xd6, + 0xce, 0x16, 0x2d, 0x88, 0xe6, 0x29, 0x36, 0xdd, 0x6d, 0x37, 0x37, 0xde, 0x23, 0x8d, 0x78, 0x8d, + 0xc4, 0x4e, 0xf2, 0x39, 0x49, 0x19, 0x56, 0x54, 0xd1, 0x35, 0x18, 0x8a, 0x9d, 0x70, 0x8b, 0xc4, + 0x82, 0x01, 0x66, 0x32, 0x2a, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xfc, 0x06, 0x49, 0x8e, 0x85, 0x75, + 0x56, 0x15, 0x0b, 0x12, 0xf6, 0xaf, 0x59, 0x70, 0x76, 0xb9, 0x5e, 0xcd, 0x59, 0x57, 0x4f, 0xc2, + 0x50, 0x33, 0x74, 0xf7, 0x48, 0x28, 0xc6, 0x59, 0x51, 0xa9, 0xb0, 0x52, 0x2c, 0xa0, 0xe8, 0x32, + 0x8c, 0xf1, 0x03, 0xe9, 0xaa, 0xe3, 0x37, 0x3d, 0x39, 0xc4, 0x33, 0x02, 0x7b, 0xec, 0xb6, 0x06, + 0xc3, 0x06, 0xe6, 0x11, 0x07, 0xba, 0x01, 0x63, 0xcb, 0x4e, 0xcb, 0xd9, 0x70, 0x3d, 0x37, 0x76, + 0x49, 0x84, 0x9e, 0x82, 0xa2, 0xd3, 0x6c, 0x32, 0x1e, 0x56, 0x5a, 0x3a, 0x7d, 0xff, 0x60, 0xae, + 0xb8, 0xd8, 0xa4, 0x9b, 0x09, 0x14, 0xd6, 0x3e, 0xa6, 0x18, 0xe8, 0x19, 0x18, 0x68, 0x86, 0x41, + 0xab, 0x5c, 0x60, 0x98, 0x67, 0xe8, 0xbe, 0xab, 0x84, 0x41, 0x2b, 0x85, 0xca, 0x70, 0xec, 0xdf, + 0x2d, 0xc0, 0x63, 0xcb, 0xa4, 0xb5, 0xbd, 0x5a, 0xcf, 0x19, 0x95, 0x8b, 0x30, 0xb2, 0x1b, 0xf8, + 0x6e, 0x1c, 0x84, 0x91, 0x68, 0x9a, 0x6d, 0xf7, 0x35, 0x51, 0x86, 0x15, 0x14, 0x5d, 0x80, 0x81, + 0x56, 0xc2, 0xaa, 0xc7, 0x24, 0x9b, 0x67, 0x4c, 0x9a, 0x41, 0x28, 0x46, 0x3b, 0x22, 0xa1, 0x60, + 0x53, 0x0a, 0xe3, 0x56, 0x44, 0x42, 0xcc, 0x20, 0xc9, 0x7a, 0xa7, 0x3b, 0x41, 0xec, 0xa1, 0xd4, + 0x7a, 0xa7, 0x10, 0xac, 0x61, 0xa1, 0x1a, 0x94, 0xf8, 0x3f, 0x4c, 0x36, 0x19, 0x47, 0xca, 0x59, + 0x25, 0x75, 0x89, 0x24, 0x56, 0xc9, 0x38, 0xdb, 0x10, 0xb2, 0x10, 0x27, 0x44, 0x8c, 0x79, 0x1a, + 0xea, 0x39, 0x4f, 0x5f, 0x2b, 0x00, 0xe2, 0x43, 0xf8, 0x3d, 0x36, 0x70, 0xb7, 0x3a, 0x07, 0x2e, + 0xf3, 0x68, 0xbc, 0x1e, 0x34, 0x1c, 0x2f, 0xbd, 0xc7, 0x8e, 0x6b, 0xf4, 0x7e, 0xde, 0x02, 0xb4, + 0xec, 0xfa, 0x4d, 0x12, 0x9e, 0x80, 0x5c, 0x78, 0xb4, 0x0d, 0x78, 0x1d, 0x26, 0x96, 0x3d, 0x97, + 0xf8, 0x71, 0xb5, 0xb6, 0x1c, 0xf8, 0x9b, 0xee, 0x16, 0xfa, 0x2c, 0x4c, 0x50, 0x31, 0x39, 0x68, + 0xc7, 0x75, 0xd2, 0x08, 0x7c, 0x26, 0x51, 0x50, 0xe1, 0x12, 0xdd, 0x3f, 0x98, 0x9b, 0x58, 0x37, + 0x20, 0x38, 0x85, 0x69, 0xff, 0x11, 0xfd, 0xd0, 0x60, 0xb7, 0x15, 0xf8, 0xc4, 0x8f, 0x97, 0x03, + 0xbf, 0xc9, 0x25, 0xcf, 0xcf, 0xc2, 0x40, 0x4c, 0x3b, 0xce, 0x3f, 0xf2, 0x49, 0x39, 0xb5, 0xb4, + 0xbb, 0x87, 0x07, 0x73, 0x67, 0x3a, 0x6b, 0xb0, 0x0f, 0x62, 0x75, 0xd0, 0x0f, 0xc1, 0x50, 0x14, + 0x3b, 0x71, 0x3b, 0x12, 0x9f, 0xfd, 0xb8, 0xfc, 0xec, 0x3a, 0x2b, 0x3d, 0x3c, 0x98, 0x9b, 0x54, + 0xd5, 0x78, 0x11, 0x16, 0x15, 0xd0, 0xd3, 0x30, 0xbc, 0x4b, 0xa2, 0xc8, 0xd9, 0x92, 0x42, 0xc3, + 0xa4, 0xa8, 0x3b, 0xbc, 0xc6, 0x8b, 0xb1, 0x84, 0xa3, 0x27, 0x60, 0x90, 0x84, 0x61, 0x10, 0x8a, + 0x55, 0x35, 0x2e, 0x10, 0x07, 0x57, 0x68, 0x21, 0xe6, 0x30, 0xfb, 0xdf, 0x59, 0x30, 0xa9, 0xfa, + 0xca, 0xdb, 0x3a, 0x81, 0xd3, 0xe1, 0x6d, 0x80, 0x86, 0xfc, 0xc0, 0x88, 0xf1, 0xbb, 0xd1, 0x4b, + 0x4f, 0x66, 0x2d, 0xe1, 0xce, 0x61, 0x4c, 0x28, 0xab, 0xa2, 0x08, 0x6b, 0xd4, 0xec, 0x7f, 0x66, + 0xc1, 0xa9, 0xd4, 0x17, 0x5d, 0x77, 0xa3, 0x18, 0xbd, 0xd3, 0xf1, 0x55, 0xf3, 0xfd, 0x7d, 0x15, + 0xad, 0xcd, 0xbe, 0x49, 0xad, 0x39, 0x59, 0xa2, 0x7d, 0xd1, 0x55, 0x18, 0x74, 0x63, 0xb2, 0x2b, + 0x3f, 0xe6, 0x89, 0xae, 0x1f, 0xc3, 0x7b, 0x95, 0xcc, 0x48, 0x95, 0xd6, 0xc4, 0x9c, 0x80, 0xfd, + 0x3f, 0x2d, 0x28, 0xf1, 0x65, 0xbb, 0xe6, 0xb4, 0x4e, 0x60, 0x2e, 0xaa, 0x30, 0xc0, 0xa8, 0xf3, + 0x8e, 0x3f, 0x95, 0xdd, 0x71, 0xd1, 0x9d, 0x79, 0x2a, 0xfa, 0x71, 0x11, 0x5b, 0x31, 0x33, 0x5a, + 0x84, 0x19, 0x89, 0xd9, 0x57, 0xa0, 0xa4, 0x10, 0xd0, 0x14, 0x14, 0x77, 0x08, 0xbf, 0x56, 0x95, + 0x30, 0xfd, 0x89, 0x66, 0x60, 0x70, 0xcf, 0xf1, 0xda, 0x62, 0xb3, 0x63, 0xfe, 0xe7, 0xb3, 0x85, + 0xcb, 0x96, 0xfd, 0x55, 0xb6, 0xc7, 0x44, 0x23, 0x2b, 0xfe, 0x9e, 0x60, 0x26, 0x1f, 0xc0, 0x8c, + 0x97, 0xc1, 0xc3, 0xc4, 0x40, 0xf4, 0xcf, 0xf3, 0x1e, 0x13, 0x7d, 0x9d, 0xc9, 0x82, 0xe2, 0xcc, + 0x36, 0xe8, 0x31, 0x10, 0xb4, 0xe8, 0x8a, 0x72, 0x3c, 0xd6, 0x5f, 0x21, 0x2e, 0xdf, 0x14, 0x65, + 0x58, 0x41, 0x29, 0x83, 0x98, 0x51, 0x9d, 0xbf, 0x46, 0xf6, 0xeb, 0xc4, 0x23, 0x8d, 0x38, 0x08, + 0x3f, 0xd2, 0xee, 0x9f, 0xe3, 0xa3, 0xcf, 0xf9, 0xcb, 0xa8, 0x20, 0x50, 0xbc, 0x46, 0xf6, 0xf9, + 0x54, 0xe8, 0x5f, 0x57, 0xec, 0xfa, 0x75, 0xbf, 0x6e, 0xc1, 0xb8, 0xfa, 0xba, 0x13, 0xd8, 0x48, + 0x4b, 0xe6, 0x46, 0x3a, 0xd7, 0x75, 0x3d, 0xe6, 0x6c, 0xa1, 0xef, 0x32, 0x16, 0x20, 0x70, 0x6a, + 0x61, 0x40, 0x87, 0x86, 0xf2, 0xec, 0x8f, 0x72, 0x42, 0xfa, 0xf9, 0xae, 0x6b, 0x64, 0x7f, 0x3d, + 0xa0, 0xe2, 0x43, 0xf6, 0x77, 0x19, 0xb3, 0x36, 0xd0, 0x75, 0xd6, 0x7e, 0xb3, 0x00, 0xa7, 0xd5, + 0x08, 0x18, 0x07, 0xf4, 0xf7, 0xfa, 0x18, 0xbc, 0x00, 0xa3, 0x4d, 0xb2, 0xe9, 0xb4, 0xbd, 0x58, + 0xdd, 0x9c, 0x07, 0xb9, 0xf6, 0xa4, 0x92, 0x14, 0x63, 0x1d, 0xe7, 0x08, 0xc3, 0xf6, 0xaf, 0x81, + 0xf1, 0xde, 0xd8, 0xa1, 0x2b, 0x98, 0x4a, 0x6f, 0x9a, 0xfe, 0x63, 0x4c, 0xd7, 0x7f, 0x08, 0x5d, + 0xc7, 0x13, 0x30, 0xe8, 0xee, 0xd2, 0xb3, 0xb8, 0x60, 0x1e, 0xb1, 0x55, 0x5a, 0x88, 0x39, 0x0c, + 0x7d, 0x0a, 0x86, 0x1b, 0xc1, 0xee, 0xae, 0xe3, 0x37, 0xcb, 0x45, 0x26, 0x4f, 0x8e, 0xd2, 0xe3, + 0x7a, 0x99, 0x17, 0x61, 0x09, 0x43, 0x8f, 0xc1, 0x80, 0x13, 0x6e, 0x45, 0xe5, 0x01, 0x86, 0x33, + 0x42, 0x5b, 0x5a, 0x0c, 0xb7, 0x22, 0xcc, 0x4a, 0xa9, 0x9c, 0x78, 0x37, 0x08, 0x77, 0x5c, 0x7f, + 0xab, 0xe2, 0x86, 0x4c, 0xe8, 0xd3, 0xe4, 0xc4, 0x3b, 0x0a, 0x82, 0x35, 0x2c, 0xb4, 0x0a, 0x83, + 0xad, 0x20, 0x8c, 0xa3, 0xf2, 0x10, 0x1b, 0xee, 0xc7, 0x73, 0xb6, 0x12, 0xff, 0xda, 0x5a, 0x10, + 0xc6, 0xc9, 0x07, 0xd0, 0x7f, 0x11, 0xe6, 0xd5, 0xd1, 0x0f, 0x41, 0x91, 0xf8, 0x7b, 0xe5, 0x61, + 0x46, 0x65, 0x36, 0x8b, 0xca, 0x8a, 0xbf, 0x77, 0xdb, 0x09, 0x13, 0x3e, 0xb3, 0xe2, 0xef, 0x61, + 0x5a, 0x07, 0xbd, 0x05, 0x25, 0xa9, 0x3b, 0x8d, 0xca, 0x23, 0xf9, 0x4b, 0x0c, 0x0b, 0x24, 0x4c, + 0xde, 0x6f, 0xbb, 0x21, 0xd9, 0x25, 0x7e, 0x1c, 0x25, 0xb7, 0x5f, 0x09, 0x8d, 0x70, 0x42, 0x0d, + 0xbd, 0x25, 0xaf, 0x73, 0x6b, 0x41, 0xdb, 0x8f, 0xa3, 0x72, 0x89, 0x75, 0x2f, 0x53, 0xd1, 0x76, + 0x3b, 0xc1, 0x4b, 0xdf, 0xf7, 0x78, 0x65, 0x6c, 0x90, 0x42, 0x18, 0xc6, 0x3d, 0x77, 0x8f, 0xf8, + 0x24, 0x8a, 0x6a, 0x61, 0xb0, 0x41, 0xca, 0xc0, 0x7a, 0x7e, 0x36, 0x5b, 0xff, 0x14, 0x6c, 0x90, + 0xa5, 0xe9, 0xfb, 0x07, 0x73, 0xe3, 0xd7, 0xf5, 0x3a, 0xd8, 0x24, 0x81, 0x6e, 0xc1, 0x04, 0x15, + 0x50, 0xdd, 0x84, 0xe8, 0x68, 0x2f, 0xa2, 0x4c, 0x3a, 0xc5, 0x46, 0x25, 0x9c, 0x22, 0x82, 0xde, + 0x80, 0x92, 0xe7, 0x6e, 0x92, 0xc6, 0x7e, 0xc3, 0x23, 0xe5, 0x31, 0x46, 0x31, 0x73, 0x5b, 0x5d, + 0x97, 0x48, 0xfc, 0x02, 0xa0, 0xfe, 0xe2, 0xa4, 0x3a, 0xba, 0x0d, 0x67, 0x62, 0x12, 0xee, 0xba, + 0xbe, 0x43, 0xb7, 0x83, 0x90, 0x27, 0x99, 0x16, 0x6f, 0x9c, 0xad, 0xb7, 0xf3, 0x62, 0xe8, 0xce, + 0xac, 0x67, 0x62, 0xe1, 0x9c, 0xda, 0xe8, 0x26, 0x4c, 0xb2, 0x9d, 0x50, 0x6b, 0x7b, 0x5e, 0x2d, + 0xf0, 0xdc, 0xc6, 0x7e, 0x79, 0x82, 0x11, 0xfc, 0x94, 0x54, 0xd3, 0x55, 0x4d, 0x30, 0xbd, 0xf1, + 0x26, 0xff, 0x70, 0xba, 0x36, 0xda, 0x60, 0x6a, 0x9b, 0x76, 0xe8, 0xc6, 0xfb, 0x74, 0xfd, 0x92, + 0x7b, 0x71, 0x79, 0xb2, 0xeb, 0xfd, 0x51, 0x47, 0x55, 0xba, 0x1d, 0xbd, 0x10, 0xa7, 0x09, 0xd2, + 0xad, 0x1d, 0xc5, 0x4d, 0xd7, 0x2f, 0x4f, 0x31, 0x8e, 0xa1, 0x76, 0x46, 0x9d, 0x16, 0x62, 0x0e, + 0x63, 0x2a, 0x1b, 0xfa, 0xe3, 0x26, 0xe5, 0xa0, 0xd3, 0x0c, 0x31, 0x51, 0xd9, 0x48, 0x00, 0x4e, + 0x70, 0xe8, 0xb1, 0x1c, 0xc7, 0xfb, 0x65, 0xc4, 0x50, 0xd5, 0x76, 0x59, 0x5f, 0x7f, 0x0b, 0xd3, + 0x72, 0x74, 0x1d, 0x86, 0x89, 0xbf, 0xb7, 0x1a, 0x06, 0xbb, 0xe5, 0x53, 0xf9, 0x7b, 0x76, 0x85, + 0xa3, 0x70, 0x86, 0x9e, 0x5c, 0x00, 0x44, 0x31, 0x96, 0x24, 0xd0, 0x3d, 0x28, 0x67, 0xcc, 0x08, + 0x9f, 0x80, 0x19, 0x36, 0x01, 0xaf, 0x89, 0xba, 0xe5, 0xf5, 0x1c, 0xbc, 0xc3, 0x2e, 0x30, 0x9c, + 0x4b, 0xdd, 0xde, 0x80, 0x09, 0xc5, 0x58, 0xd8, 0xdc, 0xa2, 0x39, 0x18, 0xa4, 0x1c, 0x53, 0x5e, + 0xa9, 0x4b, 0x74, 0x28, 0x99, 0x22, 0x0d, 0xf3, 0x72, 0x36, 0x94, 0xee, 0x07, 0x64, 0x69, 0x3f, + 0x26, 0xfc, 0x5a, 0x54, 0xd4, 0x86, 0x52, 0x02, 0x70, 0x82, 0x63, 0xff, 0x5f, 0x2e, 0x98, 0x24, + 0xdc, 0xab, 0x0f, 0x7e, 0xfd, 0x1c, 0x8c, 0x6c, 0x07, 0x51, 0x4c, 0xb1, 0x59, 0x1b, 0x83, 0x89, + 0x28, 0x72, 0x55, 0x94, 0x63, 0x85, 0x81, 0x5e, 0x85, 0xf1, 0x86, 0xde, 0x80, 0x38, 0x6c, 0x4e, + 0x8b, 0x2a, 0x66, 0xeb, 0xd8, 0xc4, 0x45, 0x97, 0x61, 0x84, 0x3d, 0xa7, 0x34, 0x02, 0x4f, 0x5c, + 0xc0, 0xe4, 0x89, 0x39, 0x52, 0x13, 0xe5, 0x87, 0xda, 0x6f, 0xac, 0xb0, 0xe9, 0xa5, 0x98, 0x76, + 0xa1, 0x5a, 0x13, 0x6c, 0x5e, 0x5d, 0x8a, 0xaf, 0xb2, 0x52, 0x2c, 0xa0, 0xf6, 0x5f, 0x29, 0x68, + 0xa3, 0x4c, 0xaf, 0x14, 0x04, 0xd5, 0x60, 0xf8, 0xae, 0xe3, 0xc6, 0xae, 0xbf, 0x25, 0xce, 0xf3, + 0xa7, 0xbb, 0xf2, 0x7c, 0x56, 0xe9, 0x0e, 0xaf, 0xc0, 0x4f, 0x25, 0xf1, 0x07, 0x4b, 0x32, 0x94, + 0x62, 0xd8, 0xf6, 0x7d, 0x4a, 0xb1, 0xd0, 0x2f, 0x45, 0xcc, 0x2b, 0x70, 0x8a, 0xe2, 0x0f, 0x96, + 0x64, 0xd0, 0x3b, 0x00, 0x72, 0xdd, 0x90, 0xa6, 0x78, 0xc6, 0x78, 0xae, 0x37, 0xd1, 0x75, 0x55, + 0x67, 0x69, 0x82, 0x9e, 0x79, 0xc9, 0x7f, 0xac, 0xd1, 0xb3, 0x63, 0x26, 0xf7, 0x74, 0x76, 0x06, + 0xfd, 0x28, 0xdd, 0xaa, 0x4e, 0x18, 0x93, 0xe6, 0x62, 0x2c, 0x06, 0xe7, 0x99, 0xfe, 0xc4, 0xd6, + 0x75, 0x77, 0x97, 0xe8, 0xdb, 0x5a, 0x10, 0xc1, 0x09, 0x3d, 0xfb, 0xb7, 0x8a, 0x50, 0xce, 0xeb, + 0x2e, 0x5d, 0x74, 0xe4, 0x9e, 0x1b, 0x2f, 0x53, 0x71, 0xc5, 0x32, 0x17, 0xdd, 0x8a, 0x28, 0xc7, + 0x0a, 0x83, 0xce, 0x7e, 0xe4, 0x6e, 0xc9, 0x5b, 0xc7, 0x60, 0x32, 0xfb, 0x75, 0x56, 0x8a, 0x05, + 0x94, 0xe2, 0x85, 0xc4, 0x89, 0xc4, 0x3b, 0x99, 0xb6, 0x4a, 0x30, 0x2b, 0xc5, 0x02, 0xaa, 0x2b, + 0x0c, 0x06, 0x7a, 0x28, 0x0c, 0x8c, 0x21, 0x1a, 0x3c, 0xde, 0x21, 0x42, 0xef, 0x02, 0x6c, 0xba, + 0xbe, 0x1b, 0x6d, 0x33, 0xea, 0x43, 0x47, 0xa6, 0xae, 0x84, 0x9d, 0x55, 0x45, 0x05, 0x6b, 0x14, + 0xd1, 0xcb, 0x30, 0xaa, 0x36, 0x60, 0xb5, 0x52, 0x1e, 0x36, 0x1f, 0x61, 0x12, 0x6e, 0x54, 0xc1, + 0x3a, 0x9e, 0xfd, 0x5e, 0x7a, 0xbd, 0x88, 0x1d, 0xa0, 0x8d, 0xaf, 0xd5, 0xef, 0xf8, 0x16, 0xba, + 0x8f, 0xaf, 0xfd, 0x7b, 0x45, 0x98, 0x34, 0x1a, 0x6b, 0x47, 0x7d, 0xf0, 0xac, 0x2b, 0xf4, 0x20, + 0x72, 0x62, 0x22, 0xf6, 0x9f, 0xdd, 0x7b, 0xab, 0xe8, 0x87, 0x15, 0xdd, 0x01, 0xbc, 0x3e, 0x7a, + 0x17, 0x4a, 0x9e, 0x13, 0x31, 0xe5, 0x03, 0x11, 0xfb, 0xae, 0x1f, 0x62, 0x89, 0xa0, 0xef, 0x44, + 0xb1, 0x76, 0x16, 0x70, 0xda, 0x09, 0x49, 0x7a, 0x62, 0x52, 0xe1, 0x44, 0x3e, 0xc4, 0xaa, 0x4e, + 0x50, 0x09, 0x66, 0x1f, 0x73, 0x18, 0xba, 0x0c, 0x63, 0x21, 0x61, 0xab, 0x62, 0x99, 0xca, 0x5a, + 0x6c, 0x99, 0x0d, 0x26, 0x42, 0x19, 0xd6, 0x60, 0xd8, 0xc0, 0x4c, 0x64, 0xed, 0xa1, 0x2e, 0xb2, + 0xf6, 0xd3, 0x30, 0xcc, 0x7e, 0xa8, 0x15, 0xa0, 0x66, 0xa3, 0xca, 0x8b, 0xb1, 0x84, 0xa7, 0x17, + 0xcc, 0x48, 0x9f, 0x0b, 0xe6, 0x19, 0x98, 0xa8, 0x38, 0x64, 0x37, 0xf0, 0x57, 0xfc, 0x66, 0x2b, + 0x70, 0xfd, 0x18, 0x95, 0x61, 0x80, 0x9d, 0x0e, 0x7c, 0x6f, 0x0f, 0x50, 0x0a, 0x78, 0x80, 0x4a, + 0xce, 0xf6, 0x1f, 0x16, 0x60, 0xbc, 0x42, 0x3c, 0x12, 0x13, 0x7e, 0xd7, 0x88, 0xd0, 0x2a, 0xa0, + 0xad, 0xd0, 0x69, 0x90, 0x1a, 0x09, 0xdd, 0xa0, 0xa9, 0x2b, 0x23, 0x8b, 0x4c, 0xe1, 0x8f, 0xae, + 0x74, 0x40, 0x71, 0x46, 0x0d, 0xf4, 0x36, 0x8c, 0xb7, 0x42, 0x62, 0xe8, 0xd0, 0xac, 0x3c, 0x71, + 0xa1, 0xa6, 0x23, 0x72, 0x49, 0xd5, 0x28, 0xc2, 0x26, 0x29, 0xf4, 0x23, 0x30, 0x15, 0x84, 0xad, + 0x6d, 0xc7, 0xaf, 0x90, 0x16, 0xf1, 0x9b, 0x54, 0x14, 0x17, 0x3a, 0x82, 0x99, 0xfb, 0x07, 0x73, + 0x53, 0x37, 0x53, 0x30, 0xdc, 0x81, 0x8d, 0xde, 0x86, 0xe9, 0x56, 0x18, 0xb4, 0x9c, 0x2d, 0xb6, + 0x50, 0x84, 0xc4, 0xc1, 0xb9, 0xcf, 0x73, 0xf7, 0x0f, 0xe6, 0xa6, 0x6b, 0x69, 0xe0, 0xe1, 0xc1, + 0xdc, 0x29, 0x36, 0x50, 0xb4, 0x24, 0x01, 0xe2, 0x4e, 0x32, 0xf6, 0x16, 0x9c, 0xae, 0x04, 0x77, + 0xfd, 0xbb, 0x4e, 0xd8, 0x5c, 0xac, 0x55, 0xb5, 0xcb, 0xfd, 0x0d, 0x79, 0xb9, 0xe4, 0x8f, 0xc5, + 0x99, 0xe7, 0x94, 0x56, 0x93, 0x8b, 0xff, 0xab, 0xae, 0x47, 0x72, 0x94, 0x08, 0x7f, 0xbd, 0x60, + 0xb4, 0x94, 0xe0, 0x2b, 0xbd, 0xbf, 0x95, 0xab, 0xf7, 0x7f, 0x13, 0x46, 0x36, 0x5d, 0xe2, 0x35, + 0x31, 0xd9, 0x14, 0x33, 0xf3, 0x54, 0xfe, 0xfb, 0xd7, 0x2a, 0xc5, 0x94, 0x4a, 0x23, 0x7e, 0x35, + 0x5d, 0x15, 0x95, 0xb1, 0x22, 0x83, 0x76, 0x60, 0x4a, 0xde, 0x7d, 0x24, 0x54, 0x6c, 0xe2, 0xa7, + 0xbb, 0x5d, 0xa8, 0x4c, 0xe2, 0x6c, 0x02, 0x71, 0x8a, 0x0c, 0xee, 0x20, 0x4c, 0xef, 0xa2, 0xbb, + 0xf4, 0xb8, 0x1a, 0x60, 0x4b, 0x9a, 0xdd, 0x45, 0xd9, 0xb5, 0x9a, 0x95, 0xda, 0xbf, 0x64, 0xc1, + 0x23, 0x1d, 0x23, 0x23, 0xd4, 0x0b, 0xc7, 0x3c, 0x0b, 0xe9, 0xeb, 0x7e, 0xa1, 0xf7, 0x75, 0xdf, + 0xfe, 0xfb, 0x16, 0xcc, 0xac, 0xec, 0xb6, 0xe2, 0xfd, 0x8a, 0x6b, 0xbe, 0x4d, 0xbc, 0x02, 0x43, + 0xbb, 0xa4, 0xe9, 0xb6, 0x77, 0xc5, 0xcc, 0xcd, 0x49, 0x96, 0xbe, 0xc6, 0x4a, 0x0f, 0x0f, 0xe6, + 0xc6, 0xeb, 0x71, 0x10, 0x3a, 0x5b, 0x84, 0x17, 0x60, 0x81, 0xce, 0x0e, 0x46, 0xf7, 0x03, 0x72, + 0xdd, 0xdd, 0x75, 0xe5, 0x7b, 0x66, 0x57, 0x95, 0xd7, 0xbc, 0x1c, 0xd0, 0xf9, 0x37, 0xdb, 0x8e, + 0x1f, 0xbb, 0xf1, 0xbe, 0x78, 0x76, 0x91, 0x44, 0x70, 0x42, 0xcf, 0xfe, 0xa6, 0x05, 0x93, 0x92, + 0x97, 0x2c, 0x36, 0x9b, 0x21, 0x89, 0x22, 0x34, 0x0b, 0x05, 0xb7, 0x25, 0x7a, 0x09, 0xa2, 0x97, + 0x85, 0x6a, 0x0d, 0x17, 0xdc, 0x16, 0xaa, 0x41, 0x89, 0x3f, 0x8b, 0x26, 0x8b, 0xab, 0xaf, 0xc7, + 0x55, 0xd6, 0x83, 0x75, 0x59, 0x13, 0x27, 0x44, 0xa4, 0x54, 0xcc, 0xce, 0xa1, 0xa2, 0xf9, 0x66, + 0x73, 0x55, 0x94, 0x63, 0x85, 0x81, 0x2e, 0xc2, 0x88, 0x1f, 0x34, 0xf9, 0x2b, 0x35, 0xdf, 0xd3, + 0x6c, 0xc9, 0xde, 0x10, 0x65, 0x58, 0x41, 0xed, 0x9f, 0xb1, 0x60, 0x4c, 0x7e, 0x59, 0x9f, 0x02, + 0x3a, 0xdd, 0x5a, 0x89, 0x70, 0x9e, 0x6c, 0x2d, 0x2a, 0x60, 0x33, 0x88, 0x21, 0x57, 0x17, 0x8f, + 0x22, 0x57, 0xdb, 0xbf, 0x58, 0x80, 0x09, 0xd9, 0x9d, 0x7a, 0x7b, 0x23, 0x22, 0x31, 0x5a, 0x87, + 0x92, 0xc3, 0x87, 0x9c, 0xc8, 0x15, 0xfb, 0x44, 0xf6, 0x8d, 0xcb, 0x98, 0x9f, 0x44, 0xd4, 0x59, + 0x94, 0xb5, 0x71, 0x42, 0x08, 0x79, 0x30, 0xed, 0x07, 0x31, 0x3b, 0xf6, 0x14, 0xbc, 0xdb, 0xbb, + 0x40, 0x9a, 0xfa, 0x59, 0x41, 0x7d, 0xfa, 0x46, 0x9a, 0x0a, 0xee, 0x24, 0x8c, 0x56, 0xa4, 0x96, + 0xa7, 0xc8, 0x5a, 0xb8, 0xd0, 0xad, 0x85, 0x7c, 0x25, 0x8f, 0xfd, 0x3b, 0x16, 0x94, 0x24, 0xda, + 0x49, 0x3c, 0x01, 0xad, 0xc1, 0x70, 0xc4, 0x26, 0x41, 0x0e, 0x8d, 0xdd, 0xad, 0xe3, 0x7c, 0xbe, + 0x92, 0xd3, 0x9c, 0xff, 0x8f, 0xb0, 0xa4, 0xc1, 0xd4, 0xd4, 0xaa, 0xfb, 0x1f, 0x13, 0x35, 0xb5, + 0xea, 0x4f, 0xce, 0x09, 0xf3, 0x5f, 0x58, 0x9f, 0xb5, 0xbb, 0x3c, 0x15, 0x3a, 0x5b, 0x21, 0xd9, + 0x74, 0xef, 0xa5, 0x85, 0xce, 0x1a, 0x2b, 0xc5, 0x02, 0x8a, 0xde, 0x81, 0xb1, 0x86, 0xd4, 0xee, + 0x26, 0x6c, 0xe0, 0xc9, 0xae, 0xba, 0x72, 0xf5, 0xac, 0xc2, 0x2d, 0xd8, 0x96, 0xb5, 0xfa, 0xd8, + 0xa0, 0x66, 0x3e, 0xcc, 0x17, 0x7b, 0x3d, 0xcc, 0x27, 0x74, 0x73, 0x9f, 0x96, 0xed, 0x5f, 0xb6, + 0x60, 0x88, 0xeb, 0x08, 0xfb, 0x53, 0xaa, 0x6a, 0xcf, 0x44, 0xc9, 0xd8, 0xdd, 0xa6, 0x85, 0xe2, + 0xd5, 0x08, 0xad, 0x41, 0x89, 0xfd, 0x60, 0xba, 0x92, 0x62, 0xbe, 0xe9, 0x1e, 0x6f, 0x55, 0xef, + 0xe0, 0x6d, 0x59, 0x0d, 0x27, 0x14, 0xec, 0x9f, 0x2b, 0x52, 0x56, 0x95, 0xa0, 0x1a, 0x27, 0xb8, + 0xf5, 0xf0, 0x4e, 0xf0, 0xc2, 0xc3, 0x3a, 0xc1, 0xb7, 0x60, 0xb2, 0xa1, 0xbd, 0x49, 0x25, 0x33, + 0x79, 0xb1, 0xeb, 0x22, 0xd1, 0x9e, 0xaf, 0xb8, 0x9e, 0x6c, 0xd9, 0x24, 0x82, 0xd3, 0x54, 0xd1, + 0x8f, 0xc2, 0x18, 0x9f, 0x67, 0xd1, 0xca, 0x00, 0x6b, 0xe5, 0x53, 0xf9, 0xeb, 0x45, 0x6f, 0x82, + 0xad, 0xc4, 0xba, 0x56, 0x1d, 0x1b, 0xc4, 0xec, 0x2f, 0x0d, 0xc2, 0xe0, 0xca, 0x1e, 0xf1, 0xe3, + 0x13, 0x60, 0x48, 0x0d, 0x98, 0x70, 0xfd, 0xbd, 0xc0, 0xdb, 0x23, 0x4d, 0x0e, 0x3f, 0xca, 0xe1, + 0x7a, 0x46, 0x90, 0x9e, 0xa8, 0x1a, 0x24, 0x70, 0x8a, 0xe4, 0xc3, 0xb8, 0xb5, 0x5f, 0x81, 0x21, + 0x3e, 0xf7, 0xe2, 0xca, 0x9e, 0xa9, 0x01, 0x67, 0x83, 0x28, 0x76, 0x41, 0xa2, 0x51, 0xe0, 0x2a, + 0x77, 0x51, 0x1d, 0xbd, 0x07, 0x13, 0x9b, 0x6e, 0x18, 0xc5, 0xf4, 0xba, 0x1d, 0xc5, 0xce, 0x6e, + 0xeb, 0x01, 0x6e, 0xe9, 0x6a, 0x1c, 0x56, 0x0d, 0x4a, 0x38, 0x45, 0x19, 0x6d, 0xc1, 0x38, 0xbd, + 0x38, 0x26, 0x4d, 0x0d, 0x1f, 0xb9, 0x29, 0xa5, 0x86, 0xbb, 0xae, 0x13, 0xc2, 0x26, 0x5d, 0xca, + 0x4c, 0x1a, 0xec, 0xa2, 0x39, 0xc2, 0x24, 0x0a, 0xc5, 0x4c, 0xf8, 0x0d, 0x93, 0xc3, 0x28, 0x4f, + 0x62, 0xb6, 0x1c, 0x25, 0x93, 0x27, 0x25, 0x16, 0x1b, 0xf6, 0x97, 0xe9, 0xe9, 0x48, 0xc7, 0xf0, + 0x04, 0x8e, 0x96, 0xd7, 0xcd, 0xa3, 0xe5, 0x6c, 0xee, 0x7c, 0xe6, 0x1c, 0x2b, 0x5f, 0x80, 0x51, + 0x6d, 0xba, 0xd1, 0x02, 0x94, 0x1a, 0xd2, 0xf0, 0x40, 0x70, 0x5d, 0x25, 0xbe, 0x28, 0x8b, 0x04, + 0x9c, 0xe0, 0xd0, 0xd1, 0xa0, 0xc2, 0x5e, 0xda, 0xac, 0x89, 0x8a, 0x82, 0x98, 0x41, 0xec, 0x17, + 0x01, 0x56, 0xee, 0x91, 0xc6, 0x22, 0xbf, 0x78, 0x69, 0xef, 0x5b, 0x56, 0xfe, 0xfb, 0x96, 0xfd, + 0xef, 0x2d, 0x98, 0x58, 0x5d, 0x36, 0x04, 0xf2, 0x79, 0x00, 0x2e, 0x85, 0xde, 0xb9, 0x73, 0x43, + 0x6a, 0x86, 0xb9, 0x72, 0x4f, 0x95, 0x62, 0x0d, 0x03, 0x9d, 0x85, 0xa2, 0xd7, 0xf6, 0x85, 0x70, + 0x38, 0x7c, 0xff, 0x60, 0xae, 0x78, 0xbd, 0xed, 0x63, 0x5a, 0xa6, 0x59, 0x12, 0x15, 0xfb, 0xb6, + 0x24, 0xea, 0x69, 0x30, 0x8e, 0xe6, 0x60, 0xf0, 0xee, 0x5d, 0xb7, 0x19, 0x95, 0x07, 0x13, 0xad, + 0xf5, 0x9d, 0x3b, 0xd5, 0x4a, 0x84, 0x79, 0xb9, 0xfd, 0xe7, 0x8a, 0x30, 0xb5, 0xea, 0x91, 0x7b, + 0x0f, 0x64, 0x90, 0xd8, 0xaf, 0xf5, 0xd3, 0xad, 0xce, 0xf3, 0xf8, 0xb8, 0xed, 0xbd, 0x7a, 0x0f, + 0xc5, 0x3b, 0x30, 0xcc, 0x9f, 0x49, 0xf9, 0x60, 0x8c, 0x5e, 0x7a, 0x21, 0xab, 0x0b, 0xe9, 0xb1, + 0x98, 0x17, 0x8a, 0x0f, 0x6e, 0x33, 0xa2, 0x98, 0x98, 0x28, 0xc5, 0x92, 0xe4, 0xec, 0x67, 0x61, + 0x4c, 0xc7, 0x3c, 0x92, 0xf1, 0xc8, 0x9f, 0xb7, 0xe0, 0xd4, 0xaa, 0x17, 0x34, 0x76, 0x52, 0xa6, + 0x68, 0x2f, 0xc3, 0x28, 0xdd, 0x4f, 0x91, 0x61, 0x84, 0x6b, 0x98, 0x65, 0x0b, 0x10, 0xd6, 0xf1, + 0xb4, 0x6a, 0xb7, 0x6e, 0x55, 0x2b, 0x59, 0xd6, 0xdc, 0x02, 0x84, 0x75, 0x3c, 0xfb, 0x1b, 0x16, + 0x9c, 0xbb, 0xb2, 0xbc, 0x92, 0x58, 0x63, 0x76, 0x18, 0x94, 0x53, 0xe1, 0xae, 0xa9, 0x75, 0x25, + 0x11, 0xee, 0x2a, 0xac, 0x17, 0x02, 0xfa, 0x71, 0x71, 0x96, 0xf8, 0x55, 0x0b, 0x4e, 0x5d, 0x71, + 0x63, 0x4c, 0x5a, 0x41, 0xda, 0xb4, 0x39, 0x24, 0xad, 0x20, 0x72, 0xe3, 0x20, 0xdc, 0x4f, 0x9b, + 0x36, 0x63, 0x05, 0xc1, 0x1a, 0x16, 0x6f, 0x79, 0xcf, 0x8d, 0x68, 0x4f, 0x0b, 0xe6, 0x0d, 0x13, + 0x8b, 0x72, 0xac, 0x30, 0xe8, 0x87, 0x35, 0xdd, 0x90, 0x49, 0x08, 0xfb, 0x62, 0x3b, 0xab, 0x0f, + 0xab, 0x48, 0x00, 0x4e, 0x70, 0xec, 0x5f, 0xb2, 0xe0, 0xf4, 0x15, 0xaf, 0x1d, 0xc5, 0x24, 0xdc, + 0x8c, 0x8c, 0xce, 0xbe, 0x08, 0x25, 0x22, 0xa5, 0x70, 0xd1, 0x57, 0x75, 0x6e, 0x28, 0xf1, 0x9c, + 0xdb, 0x55, 0x2b, 0xbc, 0x3e, 0xec, 0x3a, 0x8f, 0x66, 0x8f, 0xf8, 0x1b, 0x05, 0x18, 0xbf, 0xba, + 0xbe, 0x5e, 0xbb, 0x42, 0x62, 0xc1, 0x32, 0x7b, 0x6b, 0x90, 0xb0, 0x76, 0x11, 0xee, 0x26, 0xeb, + 0xb4, 0x63, 0xd7, 0x9b, 0xe7, 0x8e, 0x3c, 0xf3, 0x55, 0x3f, 0xbe, 0x19, 0xd6, 0xe3, 0xd0, 0xf5, + 0xb7, 0x32, 0xaf, 0xce, 0x92, 0xb1, 0x17, 0xf3, 0x18, 0x3b, 0x7a, 0x11, 0x86, 0x98, 0x27, 0x91, + 0x94, 0x3a, 0x1e, 0x55, 0xa2, 0x02, 0x2b, 0x3d, 0x3c, 0x98, 0x2b, 0xdd, 0xc2, 0x55, 0xfe, 0x07, + 0x0b, 0x54, 0x74, 0x0b, 0x46, 0xb7, 0xe3, 0xb8, 0x75, 0x95, 0x38, 0x4d, 0x12, 0x4a, 0xee, 0x70, + 0x3e, 0x8b, 0x3b, 0xd0, 0x41, 0xe0, 0x68, 0xc9, 0x86, 0x4a, 0xca, 0x22, 0xac, 0xd3, 0xb1, 0xeb, + 0x00, 0x09, 0xec, 0x98, 0xae, 0x0d, 0xf6, 0x77, 0x2c, 0x18, 0xe6, 0x46, 0xdd, 0x21, 0x7a, 0x0d, + 0x06, 0xc8, 0x3d, 0xd2, 0x10, 0x27, 0x78, 0x66, 0x87, 0x93, 0x53, 0x8e, 0x2b, 0xc1, 0xe8, 0x7f, + 0xcc, 0x6a, 0xa1, 0xab, 0x30, 0x4c, 0x7b, 0x7b, 0x45, 0x59, 0xb8, 0x3f, 0x9e, 0xf7, 0xc5, 0x6a, + 0xda, 0xf9, 0xc1, 0x28, 0x8a, 0xb0, 0xac, 0xce, 0x14, 0x3a, 0x8d, 0x56, 0x9d, 0x32, 0xb0, 0xb8, + 0xdb, 0x75, 0x6b, 0x7d, 0xb9, 0xc6, 0x91, 0x04, 0x35, 0xae, 0xd0, 0x91, 0x85, 0x38, 0x21, 0x62, + 0xaf, 0x43, 0x89, 0x4e, 0xea, 0xa2, 0xe7, 0x3a, 0xdd, 0x75, 0x49, 0xcf, 0x42, 0x49, 0xea, 0x75, + 0x22, 0x61, 0x76, 0xce, 0xa8, 0x4a, 0xb5, 0x4f, 0x84, 0x13, 0xb8, 0xbd, 0x09, 0x33, 0xec, 0x91, + 0xd4, 0x89, 0xb7, 0x8d, 0x3d, 0xd6, 0x7b, 0x31, 0x3f, 0x27, 0xe4, 0x2b, 0x3e, 0x33, 0x65, 0xcd, + 0x4e, 0x76, 0x4c, 0x52, 0xd4, 0x64, 0xad, 0xff, 0x34, 0x00, 0xd3, 0xd5, 0xfa, 0x72, 0xdd, 0x54, + 0x2c, 0x5e, 0x86, 0x31, 0x2e, 0x09, 0xd0, 0x05, 0xed, 0x78, 0xa2, 0x35, 0xf5, 0x70, 0xb0, 0xae, + 0xc1, 0xb0, 0x81, 0x89, 0xce, 0x41, 0xd1, 0x7d, 0xdf, 0x4f, 0x9b, 0xc2, 0x55, 0xdf, 0xbc, 0x81, + 0x69, 0x39, 0x05, 0x53, 0xa1, 0x82, 0x33, 0x50, 0x05, 0x56, 0x82, 0xc5, 0xeb, 0x30, 0xe1, 0x46, + 0x8d, 0xc8, 0xad, 0xfa, 0x94, 0xbb, 0x24, 0x1e, 0x22, 0x89, 0xc4, 0x4f, 0xbb, 0xaa, 0xa0, 0x38, + 0x85, 0xad, 0x71, 0xf3, 0xc1, 0xbe, 0x05, 0x93, 0x9e, 0xd6, 0xd7, 0x54, 0xe6, 0x6a, 0xb1, 0xaf, + 0x8b, 0x98, 0x59, 0x8e, 0x90, 0xb9, 0xf8, 0x07, 0x47, 0x58, 0xc2, 0xd0, 0x15, 0x98, 0x6e, 0x6c, + 0x3b, 0xad, 0xc5, 0x76, 0xbc, 0x5d, 0x71, 0xa3, 0x46, 0xb0, 0x47, 0xc2, 0x7d, 0x26, 0x09, 0x8f, + 0x24, 0x4a, 0x26, 0x05, 0x58, 0xbe, 0xba, 0x58, 0xa3, 0x98, 0xb8, 0xb3, 0x8e, 0x29, 0x82, 0xc0, + 0xb1, 0x89, 0x20, 0x8b, 0x30, 0x29, 0xdb, 0xaa, 0x93, 0x88, 0x1d, 0x0f, 0xa3, 0xac, 0x77, 0xca, + 0x81, 0x4b, 0x14, 0xab, 0xbe, 0xa5, 0xf1, 0xd1, 0x2b, 0x30, 0xee, 0xfa, 0x6e, 0xec, 0x3a, 0x71, + 0x10, 0xb2, 0xc3, 0x75, 0x8c, 0x1f, 0x18, 0x94, 0xc3, 0x57, 0x75, 0x00, 0x36, 0xf1, 0xec, 0xf7, + 0xa0, 0xa4, 0x6c, 0xcd, 0xa4, 0xb9, 0xa4, 0x95, 0x63, 0x2e, 0xd9, 0xfb, 0x44, 0x90, 0x1a, 0xf3, + 0x62, 0xa6, 0xc6, 0xfc, 0x6f, 0x58, 0x90, 0x98, 0xdc, 0xa0, 0xab, 0x50, 0x6a, 0x05, 0xec, 0xd5, + 0x2c, 0x94, 0x4f, 0xd1, 0x8f, 0x66, 0x32, 0x0f, 0xce, 0xa8, 0xf8, 0xf8, 0xd5, 0x64, 0x0d, 0x9c, + 0x54, 0x46, 0x4b, 0x30, 0xdc, 0x0a, 0x49, 0x3d, 0x66, 0x4e, 0x23, 0x3d, 0xe9, 0xf0, 0x35, 0xc2, + 0xf1, 0xb1, 0xac, 0x68, 0xff, 0xa6, 0x05, 0xc0, 0x95, 0xd2, 0x8e, 0xbf, 0x45, 0x4e, 0xe0, 0xa2, + 0x5d, 0x81, 0x81, 0xa8, 0x45, 0x1a, 0xdd, 0xde, 0x33, 0x93, 0xfe, 0xd4, 0x5b, 0xa4, 0x91, 0x0c, + 0x38, 0xfd, 0x87, 0x59, 0x6d, 0xfb, 0xa7, 0x00, 0x26, 0x12, 0x34, 0x7a, 0x01, 0x42, 0xcf, 0x1b, + 0x26, 0xf9, 0x67, 0x53, 0x26, 0xf9, 0x25, 0x86, 0xad, 0x59, 0xe1, 0xbf, 0x07, 0xc5, 0x5d, 0xe7, + 0x9e, 0xb8, 0x65, 0x3d, 0xdb, 0xbd, 0x1b, 0x94, 0xfe, 0xfc, 0x9a, 0x73, 0x8f, 0xcb, 0xb1, 0xcf, + 0xca, 0x05, 0xb2, 0xe6, 0xdc, 0x3b, 0xe4, 0xaf, 0x96, 0x8c, 0x49, 0xd1, 0xcb, 0xdc, 0x17, 0xff, + 0x63, 0xf2, 0x9f, 0x2d, 0x3b, 0xda, 0x08, 0x6b, 0xcb, 0xf5, 0x85, 0x8a, 0xb6, 0xaf, 0xb6, 0x5c, + 0x3f, 0xdd, 0x96, 0xeb, 0xf7, 0xd1, 0x96, 0xeb, 0xa3, 0x0f, 0x60, 0x58, 0x3c, 0x87, 0x30, 0x5b, + 0xc2, 0xd1, 0x4b, 0x0b, 0x7d, 0xb4, 0x27, 0x5e, 0x53, 0x78, 0x9b, 0x0b, 0x52, 0x4e, 0x17, 0xa5, + 0x3d, 0xdb, 0x95, 0x0d, 0xa2, 0xbf, 0x66, 0xc1, 0x84, 0xf8, 0x8d, 0xc9, 0xfb, 0x6d, 0x12, 0xc5, + 0x42, 0x1e, 0xf8, 0x4c, 0xff, 0x7d, 0x10, 0x15, 0x79, 0x57, 0x3e, 0x23, 0xd9, 0xac, 0x09, 0xec, + 0xd9, 0xa3, 0x54, 0x2f, 0xd0, 0x3f, 0xb4, 0x60, 0x66, 0xd7, 0xb9, 0xc7, 0x5b, 0xe4, 0x65, 0xd8, + 0x89, 0xdd, 0x40, 0xd8, 0x46, 0xbe, 0xd6, 0xdf, 0xf4, 0x77, 0x54, 0xe7, 0x9d, 0x94, 0x66, 0x54, + 0x33, 0x59, 0x28, 0x3d, 0xbb, 0x9a, 0xd9, 0xaf, 0xd9, 0x4d, 0x18, 0x91, 0xeb, 0x2d, 0xe3, 0x36, + 0x54, 0xd1, 0x85, 0x9d, 0x23, 0xbf, 0x46, 0x69, 0xb7, 0x27, 0xd6, 0x8e, 0x58, 0x6b, 0x0f, 0xb5, + 0x9d, 0xf7, 0x60, 0x4c, 0x5f, 0x63, 0x0f, 0xb5, 0xad, 0xf7, 0xe1, 0x54, 0xc6, 0x5a, 0x7a, 0xa8, + 0x4d, 0xde, 0x85, 0xb3, 0xb9, 0xeb, 0xe3, 0x61, 0x36, 0x6c, 0xff, 0x86, 0xa5, 0xf3, 0xc1, 0x13, + 0x50, 0x4f, 0x2d, 0x9b, 0xea, 0xa9, 0xf3, 0xdd, 0x77, 0x4e, 0x8e, 0x8e, 0xea, 0x1d, 0xbd, 0xd3, + 0x94, 0xab, 0xa3, 0x37, 0x60, 0xc8, 0xa3, 0x25, 0xf2, 0x1d, 0xce, 0xee, 0xbd, 0x23, 0x13, 0x59, + 0x8a, 0x95, 0x47, 0x58, 0x50, 0xb0, 0x7f, 0xdb, 0x82, 0x81, 0x13, 0x18, 0x09, 0x6c, 0x8e, 0xc4, + 0xf3, 0xb9, 0xa4, 0x45, 0x94, 0x86, 0x79, 0xec, 0xdc, 0x5d, 0x91, 0x91, 0x28, 0x72, 0x06, 0xe6, + 0xff, 0x14, 0x60, 0x94, 0x36, 0x25, 0x0d, 0x46, 0x5e, 0x85, 0x71, 0xcf, 0xd9, 0x20, 0x9e, 0x54, + 0x99, 0xa7, 0x2f, 0xb1, 0xd7, 0x75, 0x20, 0x36, 0x71, 0x69, 0xe5, 0x4d, 0xfd, 0xf5, 0x40, 0xc8, + 0x2f, 0xaa, 0xb2, 0xf1, 0xb4, 0x80, 0x4d, 0x5c, 0x7a, 0x9f, 0xba, 0xeb, 0xc4, 0x8d, 0x6d, 0x71, + 0xc1, 0x55, 0xdd, 0xbd, 0x43, 0x0b, 0x31, 0x87, 0x51, 0x01, 0x4e, 0xae, 0xce, 0xdb, 0x24, 0x64, + 0x02, 0x1c, 0x17, 0x8f, 0x95, 0x00, 0x87, 0x4d, 0x30, 0x4e, 0xe3, 0x67, 0xf8, 0xe6, 0x0d, 0x32, + 0x73, 0x98, 0x3e, 0x7c, 0xf3, 0x50, 0x0d, 0x66, 0x5c, 0xbf, 0xe1, 0xb5, 0x9b, 0xe4, 0x96, 0xcf, + 0xa5, 0x3b, 0xcf, 0xfd, 0x80, 0x34, 0x85, 0x00, 0xad, 0x2c, 0x97, 0xaa, 0x19, 0x38, 0x38, 0xb3, + 0xa6, 0xfd, 0xff, 0xc1, 0xa9, 0xeb, 0x81, 0xd3, 0x5c, 0x72, 0x3c, 0xc7, 0x6f, 0x90, 0xb0, 0xea, + 0x6f, 0xf5, 0x7c, 0x90, 0xd7, 0x9f, 0xcf, 0x0b, 0xbd, 0x9e, 0xcf, 0xed, 0x6d, 0x40, 0x7a, 0x03, + 0xc2, 0x0c, 0x0c, 0xc3, 0xb0, 0xcb, 0x9b, 0x12, 0xcb, 0xff, 0xa9, 0x6c, 0xe9, 0xba, 0xa3, 0x67, + 0x9a, 0x81, 0x13, 0x2f, 0xc0, 0x92, 0x90, 0x7d, 0x19, 0x32, 0x7d, 0x33, 0x7a, 0x5f, 0xa5, 0xed, + 0x97, 0x61, 0x9a, 0xd5, 0x3c, 0xda, 0x35, 0xcf, 0xfe, 0x4b, 0x16, 0x4c, 0xde, 0x48, 0x79, 0xd3, + 0x3e, 0x09, 0x43, 0x3c, 0x1e, 0x4b, 0x5a, 0xe9, 0x55, 0x67, 0xa5, 0x58, 0x40, 0x8f, 0x5d, 0xe7, + 0xf2, 0x5d, 0x0b, 0x4a, 0xca, 0x51, 0xff, 0x04, 0x84, 0xda, 0x65, 0x43, 0xa8, 0xcd, 0xd4, 0x05, + 0xa8, 0xee, 0xe4, 0xc9, 0xb4, 0xe8, 0x9a, 0xf2, 0x0b, 0xed, 0xa2, 0x06, 0x48, 0xc8, 0x70, 0x2f, + 0xc2, 0x09, 0xd3, 0x79, 0x54, 0x7a, 0x8a, 0xb2, 0x17, 0x71, 0x85, 0xfb, 0x31, 0x79, 0x11, 0x57, + 0xfd, 0xc9, 0xe1, 0x7e, 0x35, 0xad, 0xcb, 0xec, 0x54, 0xf8, 0x61, 0x66, 0x35, 0xca, 0xf6, 0xa6, + 0x72, 0xc7, 0x9e, 0x13, 0x56, 0xa0, 0xa2, 0xf4, 0x90, 0x31, 0x32, 0xf1, 0x8f, 0x07, 0x55, 0x48, + 0xaa, 0xd8, 0x57, 0x61, 0x32, 0x35, 0x60, 0xe8, 0x65, 0x18, 0x6c, 0x6d, 0x3b, 0x11, 0x49, 0x59, + 0x01, 0x0d, 0xd6, 0x68, 0xe1, 0xe1, 0xc1, 0xdc, 0x84, 0xaa, 0xc0, 0x4a, 0x30, 0xc7, 0xb6, 0xff, + 0x87, 0x05, 0x03, 0x37, 0x82, 0xe6, 0x49, 0x2c, 0xa6, 0xd7, 0x8d, 0xc5, 0xf4, 0x58, 0x5e, 0x48, + 0x9a, 0xdc, 0x75, 0xb4, 0x9a, 0x5a, 0x47, 0xe7, 0x73, 0x29, 0x74, 0x5f, 0x42, 0xbb, 0x30, 0xca, + 0x02, 0xdd, 0x08, 0xab, 0xa4, 0x17, 0x8d, 0xfb, 0xd5, 0x5c, 0xea, 0x7e, 0x35, 0xa9, 0xa1, 0x6a, + 0xb7, 0xac, 0xa7, 0x61, 0x58, 0x58, 0xc6, 0xa4, 0xed, 0x63, 0x05, 0x2e, 0x96, 0x70, 0xfb, 0x97, + 0x8b, 0x60, 0x04, 0xd6, 0x41, 0xbf, 0x63, 0xc1, 0x7c, 0xc8, 0x3d, 0x82, 0x9a, 0x95, 0x76, 0xe8, + 0xfa, 0x5b, 0xf5, 0xc6, 0x36, 0x69, 0xb6, 0x3d, 0xd7, 0xdf, 0xaa, 0x6e, 0xf9, 0x81, 0x2a, 0x5e, + 0xb9, 0x47, 0x1a, 0x6d, 0xa6, 0x07, 0xef, 0x11, 0xc5, 0x47, 0xbd, 0x3c, 0x5f, 0xba, 0x7f, 0x30, + 0x37, 0x8f, 0x8f, 0x44, 0x1b, 0x1f, 0xb1, 0x2f, 0xe8, 0x1b, 0x16, 0x2c, 0xf0, 0x78, 0x33, 0xfd, + 0xf7, 0xbf, 0xcb, 0x6d, 0xb4, 0x26, 0x49, 0x25, 0x44, 0xd6, 0x49, 0xb8, 0xbb, 0xf4, 0x8a, 0x18, + 0xd0, 0x85, 0xda, 0xd1, 0xda, 0xc2, 0x47, 0xed, 0x9c, 0xfd, 0x2f, 0x8a, 0x30, 0x4e, 0x47, 0x31, + 0xf1, 0x82, 0x7f, 0xd9, 0x58, 0x12, 0x8f, 0xa7, 0x96, 0xc4, 0xb4, 0x81, 0x7c, 0x3c, 0x0e, 0xf0, + 0x11, 0x4c, 0x7b, 0x4e, 0x14, 0x5f, 0x25, 0x4e, 0x18, 0x6f, 0x10, 0x87, 0x3d, 0xf5, 0x8a, 0x65, + 0x7e, 0x94, 0xd7, 0x63, 0xa5, 0xfe, 0xba, 0x9e, 0x26, 0x86, 0x3b, 0xe9, 0xa3, 0x3d, 0x40, 0xec, + 0x59, 0x39, 0x74, 0xfc, 0x88, 0x7f, 0x8b, 0x2b, 0x74, 0xe4, 0x47, 0x6b, 0x75, 0x56, 0xb4, 0x8a, + 0xae, 0x77, 0x50, 0xc3, 0x19, 0x2d, 0x68, 0xe6, 0x02, 0x83, 0xfd, 0x9a, 0x0b, 0x0c, 0xf5, 0x30, + 0x42, 0xdf, 0x85, 0x29, 0x31, 0x2b, 0x9b, 0xee, 0x96, 0x38, 0xa4, 0xdf, 0x4a, 0x99, 0x13, 0x59, + 0xfd, 0x1b, 0x3e, 0xf4, 0xb0, 0x25, 0xb2, 0x7f, 0x1c, 0x4e, 0xd1, 0xe6, 0x4c, 0x93, 0xe9, 0x08, + 0x11, 0x98, 0xdc, 0x69, 0x6f, 0x10, 0x8f, 0xc4, 0xb2, 0x4c, 0x34, 0x9a, 0x29, 0xf6, 0x9b, 0xb5, + 0x13, 0xd9, 0xf2, 0x9a, 0x49, 0x02, 0xa7, 0x69, 0xda, 0xbf, 0x62, 0x01, 0x33, 0x4c, 0x3c, 0x81, + 0xe3, 0xef, 0x73, 0xe6, 0xf1, 0x57, 0xce, 0xe3, 0x40, 0x39, 0x27, 0xdf, 0x4b, 0x7c, 0x5a, 0x6a, + 0x61, 0x70, 0x6f, 0x5f, 0xca, 0xfe, 0xbd, 0x25, 0xae, 0xff, 0x6d, 0xf1, 0x0d, 0xa9, 0x1c, 0x24, + 0xd1, 0x4f, 0xc0, 0x48, 0xc3, 0x69, 0x39, 0x0d, 0x1e, 0xd1, 0x2c, 0x57, 0xfb, 0x63, 0x54, 0x9a, + 0x5f, 0x16, 0x35, 0xb8, 0x36, 0xe3, 0xd3, 0xf2, 0x2b, 0x65, 0x71, 0x4f, 0x0d, 0x86, 0x6a, 0x72, + 0x76, 0x07, 0xc6, 0x0d, 0x62, 0x0f, 0xf5, 0xea, 0xfb, 0x13, 0xfc, 0xb8, 0x50, 0x37, 0x96, 0x5d, + 0x98, 0xf6, 0xb5, 0xff, 0x94, 0x39, 0x4a, 0x71, 0xfa, 0x93, 0xbd, 0x0e, 0x04, 0xc6, 0x49, 0x35, + 0xc3, 0xcb, 0x14, 0x19, 0xdc, 0x49, 0xd9, 0xfe, 0x5b, 0x16, 0x3c, 0xa2, 0x23, 0x6a, 0xbe, 0xab, + 0xbd, 0xf4, 0xc9, 0x15, 0x18, 0x09, 0x5a, 0x24, 0x74, 0x92, 0x3b, 0xd9, 0x45, 0x39, 0xe8, 0x37, + 0x45, 0xf9, 0xe1, 0xc1, 0xdc, 0x8c, 0x4e, 0x5d, 0x96, 0x63, 0x55, 0x13, 0xd9, 0x30, 0xc4, 0x06, + 0x23, 0x12, 0x7e, 0xc5, 0x2c, 0xea, 0x17, 0x7b, 0xee, 0x8a, 0xb0, 0x80, 0xd8, 0x3f, 0x65, 0xf1, + 0x85, 0xa5, 0x77, 0x1d, 0xbd, 0x0f, 0x53, 0xbb, 0xf4, 0xfa, 0xb6, 0x72, 0xaf, 0x15, 0x72, 0x35, + 0xba, 0x1c, 0xa7, 0x67, 0x7b, 0x8d, 0x93, 0xf6, 0x91, 0x4b, 0x65, 0xd1, 0xe7, 0xa9, 0xb5, 0x14, + 0x31, 0xdc, 0x41, 0xde, 0xfe, 0xd3, 0x02, 0xdf, 0x89, 0x4c, 0xaa, 0x7b, 0x1a, 0x86, 0x5b, 0x41, + 0x73, 0xb9, 0x5a, 0xc1, 0x62, 0x84, 0x14, 0xbb, 0xaa, 0xf1, 0x62, 0x2c, 0xe1, 0xe8, 0x12, 0x00, + 0xb9, 0x17, 0x93, 0xd0, 0x77, 0x3c, 0xf5, 0x18, 0xaf, 0x84, 0xa7, 0x15, 0x05, 0xc1, 0x1a, 0x16, + 0xad, 0xd3, 0x0a, 0x83, 0x3d, 0xb7, 0xc9, 0x1c, 0x3b, 0x8a, 0x66, 0x9d, 0x9a, 0x82, 0x60, 0x0d, + 0x8b, 0x5e, 0x95, 0xdb, 0x7e, 0xc4, 0x0f, 0x40, 0x67, 0x43, 0x84, 0xe2, 0x19, 0x49, 0xae, 0xca, + 0xb7, 0x74, 0x20, 0x36, 0x71, 0xd1, 0x22, 0x0c, 0xc5, 0x0e, 0x7b, 0x62, 0x1e, 0xcc, 0x37, 0xd9, + 0x59, 0xa7, 0x18, 0x7a, 0x88, 0x2b, 0x5a, 0x01, 0x8b, 0x8a, 0xe8, 0x6d, 0xc9, 0x82, 0x39, 0x4b, + 0x16, 0xa6, 0x57, 0xb9, 0xcb, 0x56, 0x67, 0xdf, 0x3a, 0x0f, 0x16, 0x26, 0x5d, 0x06, 0x2d, 0xfb, + 0x27, 0x4b, 0x00, 0x89, 0xb4, 0x87, 0x3e, 0xe8, 0x60, 0x11, 0xcf, 0x75, 0x97, 0x0f, 0x8f, 0x8f, + 0x3f, 0xa0, 0x2f, 0x59, 0x30, 0xea, 0x78, 0x5e, 0xd0, 0x70, 0x62, 0x36, 0xca, 0x85, 0xee, 0x2c, + 0x4a, 0xb4, 0xbf, 0x98, 0xd4, 0xe0, 0x5d, 0x78, 0x51, 0xbe, 0x1e, 0x6b, 0x90, 0x9e, 0xbd, 0xd0, + 0x1b, 0x46, 0x9f, 0x96, 0x97, 0x00, 0xbe, 0x3c, 0x66, 0xd3, 0x97, 0x80, 0x12, 0xe3, 0xc6, 0x9a, + 0xfc, 0x8f, 0x6e, 0x19, 0x31, 0x6b, 0x06, 0xf2, 0xdd, 0x73, 0x0d, 0xa1, 0xa7, 0x57, 0xb8, 0x1a, + 0x54, 0xd3, 0x4d, 0xd0, 0x07, 0xf3, 0x7d, 0xd8, 0x35, 0xe9, 0xba, 0x87, 0xf9, 0xf9, 0x7b, 0x30, + 0xd9, 0x34, 0x8f, 0x5b, 0xb1, 0x9a, 0x9e, 0xca, 0xa3, 0x9b, 0x3a, 0x9d, 0x93, 0x03, 0x36, 0x05, + 0xc0, 0x69, 0xc2, 0xa8, 0xc6, 0x9d, 0x01, 0xaa, 0xfe, 0x66, 0x20, 0x4c, 0xf8, 0xec, 0xdc, 0xb9, + 0xdc, 0x8f, 0x62, 0xb2, 0x4b, 0x31, 0x93, 0x73, 0xf4, 0x86, 0xa8, 0x8b, 0x15, 0x15, 0xf4, 0x06, + 0x0c, 0x31, 0x0f, 0xad, 0xa8, 0x3c, 0x92, 0xaf, 0x07, 0x34, 0x9d, 0x8b, 0x93, 0x4d, 0xc5, 0xfe, + 0x46, 0x58, 0x50, 0x40, 0x57, 0x65, 0x88, 0x80, 0xa8, 0xea, 0xdf, 0x8a, 0x08, 0x0b, 0x11, 0x50, + 0x5a, 0xfa, 0x64, 0xe2, 0xfd, 0xcf, 0xcb, 0x33, 0x83, 0x59, 0x1a, 0x35, 0xa9, 0xbc, 0x22, 0xfe, + 0xcb, 0x18, 0x99, 0x65, 0xc8, 0xef, 0x9e, 0x19, 0x47, 0x33, 0x19, 0xce, 0xdb, 0x26, 0x09, 0x9c, + 0xa6, 0x79, 0xa2, 0xc7, 0xe7, 0xac, 0x0f, 0x53, 0xe9, 0x8d, 0xf5, 0x50, 0x8f, 0xeb, 0xef, 0x0c, + 0xc0, 0x84, 0xb9, 0x10, 0xd0, 0x02, 0x94, 0x04, 0x11, 0x15, 0x2e, 0x4c, 0xad, 0xed, 0x35, 0x09, + 0xc0, 0x09, 0x0e, 0x0b, 0x97, 0xc6, 0xaa, 0x6b, 0xb6, 0x59, 0x49, 0xb8, 0x34, 0x05, 0xc1, 0x1a, + 0x16, 0x15, 0xa2, 0x37, 0x82, 0x20, 0x56, 0x47, 0x81, 0x5a, 0x2d, 0x4b, 0xac, 0x14, 0x0b, 0x28, + 0x3d, 0x02, 0x76, 0x48, 0xe8, 0x13, 0xcf, 0xd4, 0x64, 0xaa, 0x23, 0xe0, 0x9a, 0x0e, 0xc4, 0x26, + 0x2e, 0x3d, 0xd2, 0x82, 0x88, 0x2d, 0x3f, 0x21, 0xaa, 0x27, 0xb6, 0x6e, 0x75, 0xee, 0xa1, 0x28, + 0xe1, 0xe8, 0x2d, 0x78, 0x44, 0x39, 0x14, 0x62, 0xae, 0x19, 0x96, 0x2d, 0x0e, 0x19, 0x37, 0xeb, + 0x47, 0x96, 0xb3, 0xd1, 0x70, 0x5e, 0x7d, 0xf4, 0x3a, 0x4c, 0x08, 0x11, 0x58, 0x52, 0x1c, 0x36, + 0x8d, 0x15, 0xae, 0x19, 0x50, 0x9c, 0xc2, 0x46, 0x15, 0x98, 0xa2, 0x25, 0x4c, 0x0a, 0x95, 0x14, + 0xb8, 0x63, 0xa4, 0x3a, 0xeb, 0xaf, 0xa5, 0xe0, 0xb8, 0xa3, 0x06, 0x5a, 0x84, 0x49, 0x2e, 0xa3, + 0xd0, 0x3b, 0x25, 0x9b, 0x07, 0x61, 0x59, 0xab, 0x36, 0xc2, 0x4d, 0x13, 0x8c, 0xd3, 0xf8, 0xe8, + 0x32, 0x8c, 0x39, 0x61, 0x63, 0xdb, 0x8d, 0x49, 0x23, 0x6e, 0x87, 0x3c, 0x00, 0x87, 0x66, 0xed, + 0xb1, 0xa8, 0xc1, 0xb0, 0x81, 0x69, 0x7f, 0x00, 0xa7, 0x32, 0x8c, 0xf2, 0xe9, 0xc2, 0x71, 0x5a, + 0xae, 0xfc, 0xa6, 0x94, 0xd5, 0xda, 0x62, 0xad, 0x2a, 0xbf, 0x46, 0xc3, 0xa2, 0xab, 0x93, 0xa9, + 0xc4, 0xb5, 0x40, 0xb6, 0x6a, 0x75, 0xae, 0x4a, 0x00, 0x4e, 0x70, 0xec, 0xdf, 0x07, 0xd0, 0x14, + 0x3a, 0x7d, 0xd8, 0x2c, 0x5d, 0x86, 0x31, 0x19, 0x7d, 0x59, 0x8b, 0xfa, 0xa9, 0x3e, 0xf3, 0x8a, + 0x06, 0xc3, 0x06, 0x26, 0xed, 0x9b, 0xaf, 0x62, 0x96, 0xa6, 0x6c, 0xe4, 0x92, 0x88, 0xa5, 0x09, + 0x0e, 0x7a, 0x0e, 0x46, 0x22, 0xe2, 0x6d, 0x5e, 0x77, 0xfd, 0x1d, 0xb1, 0xb0, 0x15, 0x17, 0xae, + 0x8b, 0x72, 0xac, 0x30, 0xd0, 0x12, 0x14, 0xdb, 0x6e, 0x53, 0x2c, 0x65, 0x79, 0xe0, 0x17, 0x6f, + 0x55, 0x2b, 0x87, 0x07, 0x73, 0x8f, 0xe7, 0x05, 0x95, 0xa6, 0x57, 0xfb, 0x68, 0x9e, 0x6e, 0x3f, + 0x5a, 0x39, 0xeb, 0x6d, 0x60, 0xe8, 0x88, 0x6f, 0x03, 0x97, 0x00, 0xc4, 0x57, 0xcb, 0xb5, 0x5c, + 0x4c, 0x66, 0xed, 0x8a, 0x82, 0x60, 0x0d, 0x0b, 0x45, 0x30, 0xdd, 0x08, 0x89, 0x23, 0xef, 0xd0, + 0xdc, 0xbc, 0x7c, 0xe4, 0xc1, 0x15, 0x04, 0xcb, 0x69, 0x62, 0xb8, 0x93, 0x3e, 0x0a, 0x60, 0xba, + 0x29, 0xfc, 0x57, 0x93, 0x46, 0x4b, 0x47, 0xb7, 0x69, 0x67, 0x06, 0x39, 0x69, 0x42, 0xb8, 0x93, + 0x36, 0x7a, 0x17, 0x66, 0x65, 0x61, 0xa7, 0xcb, 0x30, 0xdb, 0x2e, 0xc5, 0xa5, 0xf3, 0xf7, 0x0f, + 0xe6, 0x66, 0x2b, 0xb9, 0x58, 0xb8, 0x0b, 0x05, 0x84, 0x61, 0x88, 0xbd, 0x25, 0x45, 0xe5, 0x51, + 0x76, 0xce, 0x3d, 0x93, 0xaf, 0x0c, 0xa0, 0x6b, 0x7d, 0x9e, 0xbd, 0x43, 0x09, 0x33, 0xdf, 0xe4, + 0x59, 0x8e, 0x15, 0x62, 0x41, 0x09, 0x6d, 0xc2, 0xa8, 0xe3, 0xfb, 0x41, 0xec, 0x70, 0x11, 0x6a, + 0x2c, 0x5f, 0xf6, 0xd3, 0x08, 0x2f, 0x26, 0x35, 0x38, 0x75, 0x65, 0x39, 0xa8, 0x41, 0xb0, 0x4e, + 0x18, 0xdd, 0x85, 0xc9, 0xe0, 0x2e, 0x65, 0x8e, 0x52, 0x4b, 0x11, 0x95, 0xc7, 0x59, 0x5b, 0x2f, + 0xf5, 0xa9, 0xa7, 0x35, 0x2a, 0x6b, 0x5c, 0xcb, 0x24, 0x8a, 0xd3, 0xad, 0xa0, 0x79, 0x43, 0x5b, + 0x3d, 0x91, 0xd8, 0xb3, 0x27, 0xda, 0x6a, 0x5d, 0x39, 0xcd, 0x5c, 0xd0, 0xb9, 0xd9, 0x2a, 0xdb, + 0xfd, 0x93, 0x29, 0x17, 0xf4, 0x04, 0x84, 0x75, 0x3c, 0xb4, 0x0d, 0x63, 0xc9, 0x93, 0x55, 0x18, + 0xb1, 0x08, 0x35, 0xa3, 0x97, 0x2e, 0xf5, 0xf7, 0x71, 0x55, 0xad, 0x26, 0xbf, 0x39, 0xe8, 0x25, + 0xd8, 0xa0, 0x3c, 0xfb, 0x43, 0x30, 0xaa, 0x4d, 0xec, 0x51, 0xac, 0xb2, 0x67, 0x5f, 0x87, 0xa9, + 0xf4, 0xd4, 0x1d, 0xc9, 0xaa, 0xfb, 0x7f, 0x15, 0x60, 0x32, 0xe3, 0xe5, 0x8a, 0x05, 0xa6, 0x4e, + 0x31, 0xd4, 0x24, 0x0e, 0xb5, 0xc9, 0x16, 0x0b, 0x7d, 0xb0, 0x45, 0xc9, 0xa3, 0x8b, 0xb9, 0x3c, + 0x5a, 0xb0, 0xc2, 0x81, 0x0f, 0xc3, 0x0a, 0xcd, 0xd3, 0x67, 0xb0, 0xaf, 0xd3, 0xe7, 0x18, 0xd8, + 0xa7, 0x71, 0x80, 0x0d, 0xf7, 0x71, 0x80, 0xfd, 0x5c, 0x01, 0xa6, 0xd2, 0xf1, 0x84, 0x4f, 0xe0, + 0xbd, 0xe3, 0x0d, 0xe3, 0xbd, 0x23, 0x3b, 0xcc, 0x7b, 0x3a, 0xca, 0x71, 0xde, 0xdb, 0x07, 0x4e, + 0xbd, 0x7d, 0x3c, 0xd3, 0x17, 0xb5, 0xee, 0xef, 0x20, 0x7f, 0xbb, 0x00, 0xa7, 0xd3, 0x55, 0x96, + 0x3d, 0xc7, 0xdd, 0x3d, 0x81, 0xb1, 0xb9, 0x69, 0x8c, 0xcd, 0xf3, 0xfd, 0x7c, 0x0d, 0xeb, 0x5a, + 0xee, 0x00, 0xdd, 0x49, 0x0d, 0xd0, 0x42, 0xff, 0x24, 0xbb, 0x8f, 0xd2, 0x37, 0x8b, 0x70, 0x3e, + 0xb3, 0x5e, 0xf2, 0x5c, 0xb0, 0x6a, 0x3c, 0x17, 0x5c, 0x4a, 0x3d, 0x17, 0xd8, 0xdd, 0x6b, 0x1f, + 0xcf, 0xfb, 0x81, 0xf0, 0x3c, 0x63, 0xd1, 0xd3, 0x1e, 0xf0, 0xed, 0xc0, 0xf0, 0x3c, 0x53, 0x84, + 0xb0, 0x49, 0xf7, 0xfb, 0xe9, 0xcd, 0xe0, 0xf7, 0x2d, 0x38, 0x9b, 0x39, 0x37, 0x27, 0xa0, 0x57, + 0xbf, 0x61, 0xea, 0xd5, 0x9f, 0xee, 0x7b, 0xb5, 0xe6, 0x28, 0xda, 0x7f, 0xa9, 0x98, 0xf3, 0x2d, + 0x4c, 0x33, 0x79, 0x13, 0x46, 0x9d, 0x46, 0x83, 0x44, 0xd1, 0x5a, 0xd0, 0x54, 0xc1, 0xca, 0x9e, + 0x67, 0xd2, 0x46, 0x52, 0x7c, 0x78, 0x30, 0x37, 0x9b, 0x26, 0x91, 0x80, 0xb1, 0x4e, 0xc1, 0x0c, + 0x80, 0x58, 0x38, 0xd6, 0x00, 0x88, 0x97, 0x00, 0xf6, 0x94, 0xbe, 0x22, 0xad, 0xe6, 0xd4, 0x34, + 0x19, 0x1a, 0x16, 0xfa, 0x31, 0x76, 0x0b, 0xe0, 0xc6, 0x40, 0x7c, 0x29, 0xbe, 0xd8, 0xe7, 0x5c, + 0xe9, 0x86, 0x45, 0xdc, 0xc5, 0x59, 0xa9, 0x84, 0x15, 0x49, 0xf4, 0x23, 0x30, 0x15, 0xf1, 0x08, + 0x1a, 0xcb, 0x9e, 0x13, 0x31, 0xc7, 0x1a, 0xb1, 0x0a, 0x99, 0xdf, 0x72, 0x3d, 0x05, 0xc3, 0x1d, + 0xd8, 0xf6, 0xcf, 0x0d, 0xc0, 0xa3, 0x5d, 0x98, 0x0f, 0x5a, 0x34, 0x1f, 0xef, 0x9f, 0x4d, 0xeb, + 0xed, 0x66, 0x33, 0x2b, 0x1b, 0x8a, 0xbc, 0xd4, 0x1c, 0x17, 0x3e, 0xf4, 0x1c, 0xff, 0xb4, 0xa5, + 0x69, 0x54, 0xb9, 0x89, 0xef, 0xe7, 0x8e, 0xc8, 0x54, 0x8f, 0x51, 0xc5, 0xba, 0x99, 0xa1, 0xa7, + 0xbc, 0xd4, 0x77, 0x77, 0xfa, 0x56, 0x5c, 0x9e, 0xec, 0x53, 0xcf, 0x17, 0x2d, 0x78, 0x3c, 0xb3, + 0xbf, 0x86, 0xb1, 0xd1, 0x02, 0x94, 0x1a, 0xb4, 0x50, 0x73, 0xb2, 0x4b, 0x5c, 0x5d, 0x25, 0x00, + 0x27, 0x38, 0x86, 0x4d, 0x51, 0xa1, 0xa7, 0x4d, 0xd1, 0x3f, 0xb7, 0x60, 0x26, 0xdd, 0x89, 0x13, + 0xe0, 0x80, 0x55, 0x93, 0x03, 0x7e, 0xb2, 0x9f, 0xb9, 0xcc, 0x61, 0x7e, 0xff, 0x76, 0x12, 0xce, + 0xe4, 0xe4, 0x8b, 0xd8, 0x83, 0xe9, 0xad, 0x06, 0x31, 0xdd, 0x17, 0xc5, 0xc7, 0x64, 0x7a, 0x7a, + 0x76, 0xf5, 0x75, 0xe4, 0x17, 0xd9, 0x0e, 0x14, 0xdc, 0xd9, 0x04, 0xfa, 0xa2, 0x05, 0x33, 0xce, + 0xdd, 0xa8, 0x23, 0xdb, 0x94, 0x58, 0x33, 0x2f, 0x65, 0xea, 0x57, 0x7b, 0x64, 0xa7, 0x62, 0x2e, + 0x46, 0x33, 0x59, 0x58, 0x38, 0xb3, 0x2d, 0x84, 0x45, 0x5c, 0x48, 0x2a, 0x27, 0x77, 0x71, 0xb0, + 0xcd, 0x72, 0x7f, 0xe2, 0xbc, 0x50, 0x42, 0xb0, 0xa2, 0x83, 0x6e, 0x43, 0x69, 0x4b, 0xfa, 0x24, + 0x0a, 0x5e, 0x9b, 0x79, 0x78, 0x65, 0x3a, 0x2e, 0x72, 0x9f, 0x0f, 0x05, 0xc2, 0x09, 0x29, 0xf4, + 0x3a, 0x14, 0xfd, 0xcd, 0xa8, 0x5b, 0xc2, 0x8c, 0x94, 0x0d, 0x1e, 0xf7, 0x94, 0xbe, 0xb1, 0x5a, + 0xc7, 0xb4, 0x22, 0xba, 0x0a, 0xc5, 0x70, 0xa3, 0x29, 0x9e, 0x04, 0x32, 0xe5, 0x49, 0xbc, 0x54, + 0xc9, 0x5e, 0x24, 0x9c, 0x12, 0x5e, 0xaa, 0x60, 0x4a, 0x02, 0xad, 0xc2, 0x20, 0x73, 0x76, 0x12, + 0x9a, 0xff, 0xcc, 0x98, 0x0f, 0x1d, 0x8e, 0x5c, 0xdc, 0x89, 0x9a, 0x15, 0x63, 0x5e, 0x1d, 0xbd, + 0x01, 0x43, 0x0d, 0x96, 0x49, 0x42, 0xa8, 0x69, 0xb2, 0xe3, 0x98, 0x74, 0xe4, 0x9a, 0xe0, 0xef, + 0x9d, 0xbc, 0x1c, 0x0b, 0x0a, 0x68, 0x1d, 0x86, 0x1a, 0xa4, 0xb5, 0xbd, 0x19, 0x09, 0xed, 0xcb, + 0xa7, 0x33, 0x69, 0x75, 0x49, 0x9c, 0x22, 0xa8, 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xcf, 0x42, 0x61, + 0xb3, 0x21, 0xfc, 0x9e, 0x32, 0x35, 0xfe, 0xa6, 0x63, 0xfb, 0xd2, 0xd0, 0xfd, 0x83, 0xb9, 0xc2, + 0xea, 0x32, 0x2e, 0x6c, 0x36, 0xd0, 0x0d, 0x18, 0xde, 0xe4, 0xde, 0xc9, 0x22, 0xe2, 0xef, 0x53, + 0xd9, 0x8e, 0xd3, 0x1d, 0x0e, 0xcc, 0xdc, 0x5f, 0x47, 0x00, 0xb0, 0x24, 0x82, 0xd6, 0x01, 0x36, + 0x95, 0x97, 0xb5, 0x08, 0xf9, 0xfb, 0xc9, 0x7e, 0x7c, 0xb1, 0x85, 0x2a, 0x42, 0x95, 0x62, 0x8d, + 0x0e, 0xfa, 0x02, 0x94, 0x1c, 0x99, 0xc9, 0x88, 0x85, 0xfb, 0x35, 0x25, 0x83, 0x64, 0xeb, 0x75, + 0x4f, 0xf2, 0xc4, 0xd7, 0xad, 0x42, 0xc2, 0x09, 0x51, 0xb4, 0x03, 0xe3, 0x7b, 0x51, 0x6b, 0x9b, + 0xc8, 0xad, 0xca, 0x62, 0x00, 0xe7, 0x1c, 0x4d, 0xb7, 0x05, 0xa2, 0x1b, 0xc6, 0x6d, 0xc7, 0xeb, + 0xe0, 0x2e, 0xcc, 0xb9, 0xeb, 0xb6, 0x4e, 0x0c, 0x9b, 0xb4, 0xe9, 0xa0, 0xbf, 0xdf, 0x0e, 0x36, + 0xf6, 0x63, 0x22, 0x22, 0x03, 0x67, 0x0e, 0xfa, 0x9b, 0x1c, 0xa5, 0x73, 0xd0, 0x05, 0x00, 0x4b, + 0x22, 0x74, 0x33, 0x3b, 0x32, 0x4b, 0x98, 0xd0, 0xb7, 0x3c, 0x9d, 0x3b, 0x3c, 0x1d, 0xfd, 0x4d, + 0x06, 0x85, 0x71, 0xc1, 0x84, 0x14, 0xe3, 0x7e, 0xad, 0xed, 0x20, 0x0e, 0xfc, 0x14, 0xe7, 0x9d, + 0xce, 0xe7, 0x7e, 0xb5, 0x0c, 0xfc, 0x4e, 0xee, 0x97, 0x85, 0x85, 0x33, 0xdb, 0x42, 0x4d, 0x98, + 0x68, 0x05, 0x61, 0x7c, 0x37, 0x08, 0xe5, 0xaa, 0x42, 0x5d, 0x2e, 0xe2, 0x06, 0xa6, 0x68, 0x91, + 0xd9, 0x6a, 0x9b, 0x10, 0x9c, 0xa2, 0x89, 0x3e, 0x0f, 0xc3, 0x51, 0xc3, 0xf1, 0x48, 0xf5, 0x66, + 0xf9, 0x54, 0xfe, 0xb1, 0x52, 0xe7, 0x28, 0x39, 0xab, 0x8b, 0x4d, 0x8e, 0x40, 0xc1, 0x92, 0x1c, + 0xe5, 0x43, 0x2c, 0xdc, 0x3c, 0x0b, 0x6a, 0x9c, 0xc3, 0x87, 0x3a, 0xec, 0x99, 0x39, 0x1f, 0x62, + 0xc5, 0x98, 0x57, 0xa7, 0x7b, 0x40, 0xc8, 0xa3, 0x41, 0x54, 0x3e, 0x9d, 0xbf, 0x07, 0x84, 0x18, + 0x7b, 0xb3, 0xde, 0x6d, 0x0f, 0x28, 0x24, 0x9c, 0x10, 0xa5, 0xbc, 0x97, 0xf2, 0xcb, 0x33, 0xf9, + 0xbc, 0x37, 0x37, 0xcd, 0x15, 0xe7, 0xbd, 0x94, 0x6b, 0x52, 0x12, 0xf6, 0x57, 0x87, 0x3a, 0x65, + 0x11, 0x76, 0x83, 0xf9, 0x49, 0xab, 0xe3, 0x79, 0xff, 0x33, 0xfd, 0x2a, 0x54, 0x8e, 0x51, 0x0a, + 0xfd, 0xa2, 0x05, 0x67, 0x5a, 0x99, 0x1f, 0x22, 0x0e, 0xf6, 0xfe, 0xf4, 0x32, 0xfc, 0xd3, 0x55, + 0xe0, 0xf1, 0x6c, 0x38, 0xce, 0x69, 0x29, 0x2d, 0xe9, 0x17, 0x3f, 0xb4, 0xa4, 0xbf, 0x06, 0x23, + 0x4c, 0x78, 0x4c, 0x02, 0x1d, 0xf5, 0x65, 0x24, 0xc7, 0x44, 0x84, 0x65, 0x51, 0x11, 0x2b, 0x12, + 0xe8, 0x67, 0x2c, 0x38, 0x97, 0xee, 0x3a, 0x26, 0x0c, 0x2c, 0x82, 0x66, 0xf2, 0xcb, 0xd3, 0xaa, + 0xf8, 0xfe, 0x73, 0xb5, 0x6e, 0xc8, 0x87, 0xbd, 0x10, 0x70, 0xf7, 0xc6, 0x50, 0x25, 0xe3, 0xf6, + 0x36, 0x64, 0xbe, 0xfe, 0xf5, 0xbe, 0xc1, 0xa1, 0x97, 0x60, 0x6c, 0x37, 0x68, 0xfb, 0xd2, 0x83, + 0x45, 0xf8, 0x27, 0x33, 0x4d, 0xf3, 0x9a, 0x56, 0x8e, 0x0d, 0xac, 0x93, 0xbd, 0x4d, 0x7c, 0xd9, + 0xca, 0x10, 0x83, 0xf9, 0xfd, 0xf2, 0x35, 0xf3, 0x7e, 0xf9, 0x64, 0xfa, 0x7e, 0xd9, 0xa1, 0x07, + 0x34, 0xae, 0x96, 0xfd, 0x07, 0x03, 0xee, 0x37, 0x12, 0x94, 0xed, 0xc1, 0x85, 0x5e, 0x0c, 0x9f, + 0x19, 0x0a, 0x36, 0xd5, 0x0b, 0x7a, 0x62, 0x28, 0xd8, 0xac, 0x56, 0x30, 0x83, 0xf4, 0x1b, 0x53, + 0xc4, 0xfe, 0x6f, 0x16, 0x14, 0x6b, 0x41, 0xf3, 0x04, 0xf4, 0x9a, 0x9f, 0x33, 0xf4, 0x9a, 0x8f, + 0xe6, 0xe4, 0x31, 0xcd, 0xd5, 0x62, 0xae, 0xa4, 0xb4, 0x98, 0xe7, 0xf2, 0x08, 0x74, 0xd7, 0x59, + 0xfe, 0x9d, 0x22, 0xe8, 0x59, 0x57, 0xd1, 0xbf, 0x7c, 0x10, 0x8b, 0xf3, 0x62, 0xb7, 0x44, 0xac, + 0x82, 0x32, 0xb3, 0x2f, 0x94, 0xce, 0xac, 0xdf, 0x63, 0x86, 0xe7, 0x77, 0x88, 0xbb, 0xb5, 0x1d, + 0x93, 0x66, 0xfa, 0x73, 0x4e, 0xce, 0xf0, 0xfc, 0x3f, 0x5b, 0x30, 0x99, 0x6a, 0x1d, 0x79, 0x59, + 0x9e, 0x71, 0x0f, 0xa8, 0xcf, 0x9a, 0xee, 0xe9, 0x4a, 0x37, 0x0f, 0xa0, 0x1e, 0x8d, 0xa4, 0xce, + 0x88, 0xc9, 0xd3, 0xea, 0x55, 0x29, 0xc2, 0x1a, 0x06, 0x7a, 0x19, 0x46, 0xe3, 0xa0, 0x15, 0x78, + 0xc1, 0xd6, 0xfe, 0x35, 0x22, 0xa3, 0xd8, 0xa8, 0xa7, 0xbd, 0xf5, 0x04, 0x84, 0x75, 0x3c, 0xfb, + 0x57, 0x8b, 0x90, 0xce, 0xd4, 0xfb, 0x83, 0x35, 0xf9, 0xf1, 0x5c, 0x93, 0xdf, 0xb4, 0x60, 0x8a, + 0xb6, 0xce, 0x6c, 0xb7, 0xa4, 0xc9, 0xb6, 0xca, 0x1a, 0x62, 0x75, 0xc9, 0x1a, 0xf2, 0x24, 0xe5, + 0x5d, 0xcd, 0xa0, 0x1d, 0x0b, 0x9d, 0x93, 0xc6, 0x9c, 0x68, 0x29, 0x16, 0x50, 0x81, 0x47, 0xc2, + 0x50, 0xf8, 0xbb, 0xe9, 0x78, 0x24, 0x0c, 0xb1, 0x80, 0xca, 0xa4, 0x22, 0x03, 0x39, 0x49, 0x45, + 0x58, 0x00, 0x38, 0x61, 0x2f, 0x24, 0x04, 0x0a, 0x2d, 0x00, 0x9c, 0x34, 0x24, 0x4a, 0x70, 0xec, + 0xdf, 0x28, 0xc2, 0x58, 0x2d, 0x68, 0x26, 0xcf, 0x36, 0x2f, 0x19, 0xcf, 0x36, 0x17, 0x52, 0xcf, + 0x36, 0x53, 0x3a, 0xee, 0x0f, 0x1e, 0x69, 0x3e, 0xaa, 0x47, 0x9a, 0x3f, 0xb3, 0x60, 0xa2, 0x16, + 0x34, 0xe9, 0x02, 0xfd, 0x7e, 0x5a, 0x8d, 0x7a, 0x78, 0xc1, 0xa1, 0x2e, 0xe1, 0x05, 0xff, 0xae, + 0x05, 0xc3, 0xb5, 0xa0, 0x79, 0x02, 0xfa, 0xd8, 0xd7, 0x4c, 0x7d, 0xec, 0x23, 0x39, 0x5c, 0x36, + 0x47, 0x05, 0xfb, 0x95, 0x22, 0x8c, 0xd3, 0x7e, 0x06, 0x5b, 0x72, 0x96, 0x8c, 0x11, 0xb1, 0xfa, + 0x18, 0x11, 0x2a, 0xcc, 0x05, 0x9e, 0x17, 0xdc, 0x4d, 0xcf, 0xd8, 0x2a, 0x2b, 0xc5, 0x02, 0x8a, + 0x9e, 0x83, 0x91, 0x56, 0x48, 0xf6, 0xdc, 0xa0, 0x1d, 0xa5, 0x3d, 0x66, 0x6b, 0xa2, 0x1c, 0x2b, + 0x0c, 0x2a, 0xb7, 0x47, 0xae, 0xdf, 0x20, 0xd2, 0x86, 0x68, 0x80, 0xd9, 0x10, 0xf1, 0x08, 0xad, + 0x5a, 0x39, 0x36, 0xb0, 0xd0, 0x1d, 0x28, 0xb1, 0xff, 0x6c, 0xdf, 0x1c, 0x3d, 0x67, 0x88, 0x08, + 0x8b, 0x2e, 0x08, 0xe0, 0x84, 0x16, 0xba, 0x04, 0x10, 0x4b, 0x6b, 0xa7, 0x48, 0x38, 0x74, 0x2b, + 0x89, 0x52, 0xd9, 0x41, 0x45, 0x58, 0xc3, 0x42, 0xcf, 0x42, 0x29, 0x76, 0x5c, 0xef, 0xba, 0xeb, + 0x93, 0x48, 0x58, 0x8b, 0x89, 0xa8, 0xe7, 0xa2, 0x10, 0x27, 0x70, 0x7a, 0xa2, 0xb3, 0x70, 0x01, + 0x3c, 0xe3, 0xd0, 0x08, 0xc3, 0x66, 0x27, 0xfa, 0x75, 0x55, 0x8a, 0x35, 0x0c, 0xfb, 0x32, 0x9c, + 0xae, 0x05, 0xcd, 0x5a, 0x10, 0xc6, 0xab, 0x41, 0x78, 0xd7, 0x09, 0x9b, 0x72, 0xfe, 0xe6, 0x64, + 0x00, 0x6e, 0x7a, 0xea, 0x0e, 0x72, 0xbd, 0x82, 0x11, 0x5a, 0xfb, 0x45, 0x76, 0xa6, 0x1f, 0xd1, + 0xb5, 0xe7, 0xdf, 0x14, 0x00, 0xd5, 0x98, 0x3d, 0x96, 0x91, 0x96, 0xea, 0x5d, 0x98, 0x88, 0xc8, + 0x75, 0xd7, 0x6f, 0xdf, 0x93, 0xf7, 0xab, 0x2e, 0x7e, 0x53, 0xf5, 0x15, 0x1d, 0x93, 0x6b, 0x69, + 0xcc, 0x32, 0x9c, 0xa2, 0x46, 0x87, 0x30, 0x6c, 0xfb, 0x8b, 0xd1, 0xad, 0x88, 0x84, 0x22, 0x0d, + 0x13, 0x1b, 0x42, 0x2c, 0x0b, 0x71, 0x02, 0xa7, 0x4b, 0x86, 0xfd, 0xb9, 0x11, 0xf8, 0x38, 0x08, + 0x62, 0xb9, 0xc8, 0x58, 0x22, 0x0f, 0xad, 0x1c, 0x1b, 0x58, 0x68, 0x15, 0x50, 0xd4, 0x6e, 0xb5, + 0x3c, 0xf6, 0xc8, 0xe9, 0x78, 0x57, 0xc2, 0xa0, 0xdd, 0xe2, 0x0f, 0x55, 0x22, 0x07, 0x46, 0xbd, + 0x03, 0x8a, 0x33, 0x6a, 0x50, 0xc6, 0xb0, 0x19, 0xb1, 0xdf, 0x22, 0x62, 0x00, 0xd7, 0x97, 0xd6, + 0x59, 0x11, 0x96, 0x30, 0xfb, 0x27, 0xd8, 0x61, 0xc6, 0xb2, 0xe7, 0xc4, 0xed, 0x90, 0xa0, 0x5d, + 0x18, 0x6f, 0xb1, 0x03, 0x2b, 0x0e, 0x03, 0xcf, 0x23, 0x52, 0x6e, 0x7c, 0x30, 0xdb, 0x30, 0x9e, + 0x4d, 0x43, 0x27, 0x87, 0x4d, 0xea, 0xf6, 0x4f, 0x4e, 0x32, 0xbe, 0x54, 0xe7, 0x97, 0x96, 0x61, + 0x61, 0xf1, 0x2d, 0x24, 0xb4, 0xd9, 0xfc, 0x6c, 0x75, 0x09, 0xa7, 0x17, 0x56, 0xe3, 0x58, 0xd6, + 0x45, 0x6f, 0xb2, 0x17, 0x3e, 0xce, 0x0c, 0x7a, 0xe5, 0xc9, 0xe4, 0x58, 0xc6, 0x63, 0x9e, 0xa8, + 0x88, 0x35, 0x22, 0xe8, 0x3a, 0x8c, 0x8b, 0x64, 0x2b, 0x42, 0xf1, 0x50, 0x34, 0xae, 0xbf, 0xe3, + 0x58, 0x07, 0x1e, 0xa6, 0x0b, 0xb0, 0x59, 0x19, 0x6d, 0xc1, 0x39, 0x2d, 0x35, 0x58, 0x86, 0x7d, + 0x22, 0xe7, 0x2d, 0x8f, 0xdf, 0x3f, 0x98, 0x3b, 0xb7, 0xde, 0x0d, 0x11, 0x77, 0xa7, 0x83, 0x6e, + 0xc2, 0x69, 0xa7, 0x11, 0xbb, 0x7b, 0xa4, 0x42, 0x9c, 0xa6, 0xe7, 0xfa, 0xc4, 0x0c, 0x21, 0x71, + 0xf6, 0xfe, 0xc1, 0xdc, 0xe9, 0xc5, 0x2c, 0x04, 0x9c, 0x5d, 0x0f, 0xbd, 0x06, 0xa5, 0xa6, 0x1f, + 0x89, 0x31, 0x18, 0x32, 0xb2, 0xde, 0x95, 0x2a, 0x37, 0xea, 0xea, 0xfb, 0x93, 0x3f, 0x38, 0xa9, + 0x80, 0xb6, 0x60, 0x4c, 0x77, 0x13, 0x13, 0x19, 0x13, 0x9f, 0xef, 0x72, 0xb7, 0x35, 0x7c, 0xab, + 0xb8, 0xd6, 0x4d, 0x59, 0xff, 0x1a, 0x6e, 0x57, 0x06, 0x61, 0xf4, 0x06, 0xa0, 0x88, 0x84, 0x7b, + 0x6e, 0x83, 0x2c, 0x36, 0x58, 0x08, 0x63, 0xa6, 0xab, 0x19, 0x31, 0x5c, 0x59, 0x50, 0xbd, 0x03, + 0x03, 0x67, 0xd4, 0x42, 0x57, 0x29, 0x47, 0xd1, 0x4b, 0x85, 0xb1, 0xb6, 0x14, 0xf3, 0xca, 0x15, + 0xd2, 0x0a, 0x49, 0xc3, 0x89, 0x49, 0xd3, 0xa4, 0x88, 0x53, 0xf5, 0xe8, 0x79, 0xa3, 0x32, 0x43, + 0x80, 0x69, 0x62, 0xdc, 0x99, 0x1d, 0x82, 0xde, 0x90, 0xb6, 0x83, 0x28, 0xbe, 0x41, 0xe2, 0xbb, + 0x41, 0xb8, 0x23, 0xe2, 0xbe, 0x25, 0x61, 0x21, 0x13, 0x10, 0xd6, 0xf1, 0xa8, 0x44, 0xc4, 0x9e, + 0xd8, 0xaa, 0x15, 0xf6, 0xf6, 0x31, 0x92, 0xec, 0x93, 0xab, 0xbc, 0x18, 0x4b, 0xb8, 0x44, 0xad, + 0xd6, 0x96, 0xd9, 0x8b, 0x46, 0x0a, 0xb5, 0x5a, 0x5b, 0xc6, 0x12, 0x8e, 0x48, 0x67, 0x46, 0xc1, + 0x89, 0xfc, 0xb7, 0xa8, 0x4e, 0xbe, 0xdc, 0x67, 0x52, 0x41, 0x1f, 0xa6, 0x54, 0x2e, 0x43, 0x1e, + 0x10, 0x2f, 0x2a, 0x4f, 0xb2, 0x45, 0xd2, 0x7f, 0x34, 0x3d, 0xa5, 0x8b, 0xab, 0xa6, 0x28, 0xe1, + 0x0e, 0xda, 0x46, 0x68, 0x92, 0xa9, 0x9e, 0x99, 0x3d, 0x16, 0xa0, 0x14, 0xb5, 0x37, 0x9a, 0xc1, + 0xae, 0xe3, 0xfa, 0xec, 0x01, 0x42, 0x13, 0x44, 0xea, 0x12, 0x80, 0x13, 0x1c, 0xb4, 0x0a, 0x23, + 0x8e, 0xb8, 0x7c, 0x89, 0x27, 0x83, 0xcc, 0x58, 0x05, 0xf2, 0x82, 0xc6, 0xf5, 0xa0, 0xf2, 0x1f, + 0x56, 0x75, 0xd1, 0xab, 0x30, 0x2e, 0xdc, 0xe9, 0x84, 0x25, 0xec, 0x29, 0xd3, 0xf3, 0xa2, 0xae, + 0x03, 0xb1, 0x89, 0x8b, 0x7e, 0x0c, 0x26, 0x28, 0x95, 0x84, 0xb1, 0x95, 0x67, 0xfa, 0xe1, 0x88, + 0x5a, 0xc4, 0x76, 0xbd, 0x32, 0x4e, 0x11, 0x43, 0x4d, 0x78, 0xcc, 0x69, 0xc7, 0x01, 0x53, 0x56, + 0x9a, 0xeb, 0x7f, 0x3d, 0xd8, 0x21, 0x3e, 0x7b, 0x27, 0x18, 0x59, 0xba, 0x70, 0xff, 0x60, 0xee, + 0xb1, 0xc5, 0x2e, 0x78, 0xb8, 0x2b, 0x15, 0x74, 0x0b, 0x46, 0xe3, 0xc0, 0x13, 0x26, 0xec, 0x51, + 0xf9, 0x4c, 0x7e, 0x68, 0xa5, 0x75, 0x85, 0xa6, 0xab, 0x13, 0x54, 0x55, 0xac, 0xd3, 0x41, 0xeb, + 0x7c, 0x8f, 0xb1, 0x40, 0xa0, 0x24, 0x2a, 0x3f, 0x92, 0x3f, 0x30, 0x2a, 0x5e, 0xa8, 0xb9, 0x05, + 0x45, 0x4d, 0xac, 0x93, 0x41, 0x57, 0x60, 0xba, 0x15, 0xba, 0x01, 0x5b, 0xd8, 0x4a, 0x51, 0x5c, + 0x36, 0x82, 0xee, 0x4d, 0xd7, 0xd2, 0x08, 0xb8, 0xb3, 0x0e, 0xba, 0x48, 0x05, 0x54, 0x5e, 0x58, + 0x3e, 0xcb, 0x33, 0xbe, 0x70, 0xe1, 0x94, 0x97, 0x61, 0x05, 0x9d, 0xfd, 0x61, 0x98, 0xee, 0xe0, + 0x94, 0x47, 0x32, 0x27, 0xfe, 0x47, 0x83, 0x50, 0x52, 0xea, 0x40, 0xb4, 0x60, 0x6a, 0x79, 0xcf, + 0xa6, 0xb5, 0xbc, 0x23, 0x54, 0x5e, 0xd3, 0x15, 0xbb, 0xeb, 0x19, 0x09, 0xeb, 0x2f, 0xe4, 0xb0, + 0x86, 0xfe, 0x7d, 0xff, 0x8e, 0x90, 0xcc, 0x3f, 0xb9, 0x30, 0x0e, 0x74, 0xbd, 0x30, 0xf6, 0x99, + 0x3c, 0x92, 0x5e, 0x0d, 0x5b, 0x41, 0xb3, 0x5a, 0x4b, 0x67, 0x53, 0xab, 0xd1, 0x42, 0xcc, 0x61, + 0x4c, 0xb8, 0xa7, 0xc7, 0x3a, 0x13, 0xee, 0x87, 0x1f, 0x50, 0xb8, 0x97, 0x04, 0x70, 0x42, 0x0b, + 0x79, 0x30, 0xdd, 0x30, 0x13, 0xe1, 0x29, 0x7f, 0xbf, 0x27, 0x7a, 0xa6, 0xa4, 0x6b, 0x6b, 0x19, + 0x72, 0x96, 0xd3, 0x54, 0x70, 0x27, 0x61, 0xf4, 0x2a, 0x8c, 0xbc, 0x1f, 0x44, 0x6c, 0xd9, 0x89, + 0xb3, 0x4d, 0x7a, 0x58, 0x8d, 0xbc, 0x79, 0xb3, 0xce, 0xca, 0x0f, 0x0f, 0xe6, 0x46, 0x6b, 0x41, + 0x53, 0xfe, 0xc5, 0xaa, 0x02, 0xba, 0x07, 0xa7, 0x0d, 0x8e, 0xa0, 0xba, 0x0b, 0xfd, 0x77, 0xf7, + 0x9c, 0x68, 0xee, 0x74, 0x35, 0x8b, 0x12, 0xce, 0x6e, 0xc0, 0xfe, 0x2a, 0x57, 0x7a, 0x0a, 0xd5, + 0x08, 0x89, 0xda, 0xde, 0x49, 0xa4, 0xc1, 0x58, 0x31, 0xb4, 0x36, 0x0f, 0xac, 0x58, 0xff, 0x3d, + 0x8b, 0x29, 0xd6, 0xd7, 0xc9, 0x6e, 0xcb, 0x73, 0xe2, 0x93, 0x30, 0x22, 0x7f, 0x13, 0x46, 0x62, + 0xd1, 0x5a, 0xb7, 0xcc, 0x1d, 0x5a, 0xa7, 0xd8, 0xe3, 0x82, 0x3a, 0x10, 0x65, 0x29, 0x56, 0x64, + 0xec, 0x7f, 0xc2, 0x67, 0x40, 0x42, 0x4e, 0x40, 0xb7, 0x50, 0x31, 0x75, 0x0b, 0x73, 0x3d, 0xbe, + 0x20, 0x47, 0xc7, 0xf0, 0x8f, 0xcd, 0x7e, 0xb3, 0xbb, 0xc7, 0xc7, 0xfd, 0x45, 0xc7, 0xfe, 0x05, + 0x0b, 0x66, 0xb2, 0x8c, 0x0b, 0xa8, 0x10, 0xc3, 0x6f, 0x3e, 0xea, 0x85, 0x4b, 0x8d, 0xe0, 0x6d, + 0x51, 0x8e, 0x15, 0x46, 0xdf, 0xd1, 0xf3, 0x8f, 0x16, 0x4e, 0xec, 0x26, 0x98, 0x39, 0x13, 0xd1, + 0xeb, 0xdc, 0x2b, 0xc4, 0x52, 0x49, 0x0d, 0x8f, 0xe6, 0x11, 0x62, 0xff, 0x5a, 0x01, 0x66, 0xb8, + 0x8a, 0x7a, 0x71, 0x2f, 0x70, 0x9b, 0xb5, 0xa0, 0x29, 0x7c, 0x64, 0xde, 0x86, 0xb1, 0x96, 0x76, + 0x5d, 0xed, 0x16, 0xd0, 0x48, 0xbf, 0xd6, 0x26, 0xd7, 0x06, 0xbd, 0x14, 0x1b, 0xb4, 0x50, 0x13, + 0xc6, 0xc8, 0x9e, 0xdb, 0x50, 0x7a, 0xce, 0xc2, 0x91, 0x59, 0xba, 0x6a, 0x65, 0x45, 0xa3, 0x83, + 0x0d, 0xaa, 0x0f, 0x21, 0xc7, 0x8d, 0xfd, 0x8b, 0x16, 0x3c, 0x92, 0x13, 0xfe, 0x88, 0x36, 0x77, + 0x97, 0x3d, 0x06, 0x88, 0x04, 0x9c, 0xaa, 0x39, 0xfe, 0x44, 0x80, 0x05, 0x14, 0x7d, 0x1e, 0x80, + 0xab, 0xf8, 0xa9, 0x14, 0x2d, 0x3e, 0xbd, 0xbf, 0xb0, 0x20, 0x5a, 0xec, 0x08, 0x59, 0x1f, 0x6b, + 0xb4, 0xec, 0x5f, 0x29, 0xc2, 0x20, 0xcf, 0xc6, 0xbe, 0x0a, 0xc3, 0xdb, 0x3c, 0xd8, 0x72, 0x3f, + 0x71, 0x9d, 0x93, 0xeb, 0x08, 0x2f, 0xc0, 0xb2, 0x32, 0x5a, 0x83, 0x53, 0xc2, 0x0f, 0xab, 0x42, + 0x3c, 0x67, 0x5f, 0xde, 0x6a, 0x79, 0xe2, 0x13, 0x19, 0x94, 0xff, 0x54, 0xb5, 0x13, 0x05, 0x67, + 0xd5, 0x43, 0xaf, 0x77, 0x84, 0x58, 0xe4, 0x61, 0xaa, 0x95, 0x0c, 0xdc, 0x23, 0xcc, 0xe2, 0xab, + 0x30, 0xde, 0xea, 0xb8, 0xbf, 0x6b, 0x89, 0xb0, 0xcd, 0x3b, 0xbb, 0x89, 0xcb, 0xac, 0x0a, 0xda, + 0xcc, 0x86, 0x62, 0x7d, 0x3b, 0x24, 0xd1, 0x76, 0xe0, 0x35, 0x45, 0xd6, 0xd7, 0xc4, 0xaa, 0x20, + 0x05, 0xc7, 0x1d, 0x35, 0x28, 0x95, 0x4d, 0xc7, 0xf5, 0xda, 0x21, 0x49, 0xa8, 0x0c, 0x99, 0x54, + 0x56, 0x53, 0x70, 0xdc, 0x51, 0x83, 0xae, 0xa3, 0xd3, 0x22, 0x65, 0xa8, 0xf4, 0xce, 0x57, 0xa6, + 0x22, 0xc3, 0xd2, 0x4a, 0xbf, 0x4b, 0xc4, 0x18, 0xf1, 0xe4, 0xaf, 0x92, 0x8e, 0x6a, 0x09, 0xe9, + 0x84, 0x7d, 0xbe, 0xa4, 0xf2, 0x20, 0x89, 0x2b, 0xff, 0xd8, 0x82, 0x53, 0x19, 0x26, 0x69, 0x9c, + 0x55, 0x6d, 0xb9, 0x51, 0xac, 0xf2, 0x6d, 0x68, 0xac, 0x8a, 0x97, 0x63, 0x85, 0x41, 0xf7, 0x03, + 0x67, 0x86, 0x69, 0x06, 0x28, 0x4c, 0x3e, 0x04, 0xf4, 0x68, 0x0c, 0x10, 0x5d, 0x80, 0x81, 0x76, + 0x44, 0x42, 0x99, 0xf1, 0x51, 0xf2, 0x6f, 0xa6, 0x11, 0x64, 0x10, 0x2a, 0x51, 0x6e, 0x29, 0x65, + 0x9c, 0x26, 0x51, 0x72, 0x75, 0x1c, 0x87, 0xd9, 0x3f, 0x5b, 0x84, 0xb3, 0xb9, 0xe6, 0xa5, 0xb4, + 0x4b, 0xbb, 0x81, 0xef, 0xc6, 0x81, 0x8a, 0xf5, 0xc7, 0x43, 0x9b, 0x90, 0xd6, 0xf6, 0x9a, 0x28, + 0xc7, 0x0a, 0x03, 0x3d, 0x29, 0x13, 0x02, 0xa7, 0x33, 0x8a, 0x2c, 0x55, 0x8c, 0x9c, 0xc0, 0xfd, + 0xa6, 0x06, 0x7a, 0x02, 0x06, 0x5a, 0x81, 0xca, 0xd6, 0xae, 0x66, 0x96, 0x76, 0x37, 0x08, 0x3c, + 0xcc, 0x80, 0xe8, 0x53, 0x62, 0x1c, 0x52, 0x2f, 0x17, 0xd8, 0x69, 0x06, 0x91, 0x36, 0x18, 0x4f, + 0xc3, 0xf0, 0x0e, 0xd9, 0x0f, 0x5d, 0x7f, 0x2b, 0xfd, 0x6e, 0x73, 0x8d, 0x17, 0x63, 0x09, 0x37, + 0xb3, 0xed, 0x0d, 0xf7, 0xca, 0xb6, 0x77, 0xd4, 0xc4, 0x3e, 0x23, 0x3d, 0x8f, 0xb6, 0x9f, 0x2e, + 0xc2, 0x24, 0x5e, 0xaa, 0xfc, 0x60, 0x22, 0x6e, 0x75, 0x4e, 0xc4, 0x71, 0xa7, 0x59, 0xea, 0x3d, + 0x1b, 0x5f, 0xb1, 0x60, 0x92, 0x05, 0x38, 0x16, 0xa1, 0x39, 0xdc, 0xc0, 0x3f, 0x01, 0xd1, 0xed, + 0x09, 0x18, 0x0c, 0x69, 0xa3, 0xe9, 0xdc, 0x29, 0xac, 0x27, 0x98, 0xc3, 0xd0, 0x63, 0x30, 0xc0, + 0xba, 0x40, 0x27, 0x6f, 0x8c, 0xa7, 0x38, 0xa8, 0x38, 0xb1, 0x83, 0x59, 0x29, 0xf3, 0x91, 0xc4, + 0xa4, 0xe5, 0xb9, 0xbc, 0xd3, 0x89, 0x06, 0xfc, 0xe3, 0xe1, 0x23, 0x99, 0xd9, 0xb5, 0x0f, 0xe7, + 0x23, 0x99, 0x4d, 0xb2, 0xfb, 0xb5, 0xe8, 0xbf, 0x17, 0xe0, 0x7c, 0x66, 0xbd, 0xbe, 0x7d, 0x24, + 0xbb, 0xd7, 0x3e, 0x9e, 0xe7, 0xf7, 0xec, 0x57, 0xf1, 0xe2, 0x09, 0xbe, 0x8a, 0x0f, 0xf4, 0x2b, + 0x39, 0x0e, 0xf6, 0xe1, 0xba, 0x98, 0x39, 0x64, 0x1f, 0x13, 0xd7, 0xc5, 0xcc, 0xbe, 0xe5, 0x5c, + 0xeb, 0xbe, 0x5b, 0xc8, 0xf9, 0x16, 0x76, 0xc1, 0xbb, 0x48, 0xf9, 0x0c, 0x03, 0x46, 0x42, 0x12, + 0x1e, 0xe3, 0x3c, 0x86, 0x97, 0x61, 0x05, 0x45, 0xae, 0xe6, 0x04, 0xc8, 0xbb, 0xf6, 0xea, 0x91, + 0xb6, 0xcc, 0xbc, 0xf9, 0x60, 0xa1, 0xc7, 0x11, 0x49, 0x3b, 0x04, 0xae, 0x69, 0x97, 0xf2, 0x62, + 0xff, 0x97, 0xf2, 0xb1, 0xec, 0x0b, 0x39, 0x5a, 0x84, 0xc9, 0x5d, 0xd7, 0x67, 0x09, 0x90, 0x4d, + 0x51, 0x54, 0xf9, 0xc4, 0xaf, 0x99, 0x60, 0x9c, 0xc6, 0x9f, 0x7d, 0x15, 0xc6, 0x1f, 0x5c, 0x8b, + 0xf8, 0xcd, 0x22, 0x3c, 0xda, 0x65, 0xdb, 0x73, 0x5e, 0x6f, 0xcc, 0x81, 0xc6, 0xeb, 0x3b, 0xe6, + 0xa1, 0x06, 0x33, 0x9b, 0x6d, 0xcf, 0xdb, 0x67, 0x86, 0x67, 0xa4, 0x29, 0x31, 0x84, 0xac, 0xa8, + 0xa2, 0x97, 0xaf, 0x66, 0xe0, 0xe0, 0xcc, 0x9a, 0xe8, 0x0d, 0x40, 0xc1, 0x06, 0x8b, 0xa8, 0xdd, + 0x4c, 0xa2, 0xa3, 0xb0, 0x81, 0x2f, 0x26, 0x9b, 0xf1, 0x66, 0x07, 0x06, 0xce, 0xa8, 0x45, 0x85, + 0x7e, 0x7a, 0x2a, 0xed, 0xab, 0x6e, 0xa5, 0x84, 0x7e, 0xac, 0x03, 0xb1, 0x89, 0x8b, 0xae, 0xc0, + 0xb4, 0xb3, 0xe7, 0xb8, 0x3c, 0x5a, 0x9e, 0x24, 0xc0, 0xa5, 0x7e, 0xa5, 0xbb, 0x5b, 0x4c, 0x23, + 0xe0, 0xce, 0x3a, 0x29, 0x6f, 0xc6, 0xa1, 0x7c, 0x6f, 0xc6, 0xee, 0x7c, 0xb1, 0x97, 0x2a, 0xd6, + 0xfe, 0x0f, 0x16, 0x3d, 0xbe, 0x32, 0x32, 0xee, 0xd2, 0x71, 0x50, 0x2a, 0x45, 0xcd, 0xb1, 0x50, + 0x8d, 0xc3, 0xb2, 0x0e, 0xc4, 0x26, 0x2e, 0x5f, 0x10, 0x51, 0x62, 0xf7, 0x6e, 0x88, 0xee, 0xc2, + 0xe3, 0x57, 0x61, 0xa0, 0xb7, 0x60, 0xb8, 0xe9, 0xee, 0xb9, 0x51, 0x10, 0x8a, 0xcd, 0x72, 0xd4, + 0x2c, 0xf3, 0x8a, 0x0f, 0x56, 0x38, 0x19, 0x2c, 0xe9, 0xd9, 0x3f, 0x5d, 0x80, 0x71, 0xd9, 0xe2, + 0x9b, 0xed, 0x20, 0x76, 0x4e, 0xe0, 0x58, 0xbe, 0x62, 0x1c, 0xcb, 0x9f, 0xea, 0xe6, 0xf6, 0xcc, + 0xba, 0x94, 0x7b, 0x1c, 0xdf, 0x4c, 0x1d, 0xc7, 0x4f, 0xf5, 0x26, 0xd5, 0xfd, 0x18, 0xfe, 0xa7, + 0x16, 0x4c, 0x1b, 0xf8, 0x27, 0x70, 0x1a, 0xac, 0x9a, 0xa7, 0xc1, 0xe3, 0x3d, 0xbf, 0x21, 0xe7, + 0x14, 0xf8, 0x72, 0x21, 0xd5, 0x77, 0xc6, 0xfd, 0xdf, 0x87, 0x81, 0x6d, 0x27, 0x6c, 0x76, 0x8b, + 0xf9, 0xda, 0x51, 0x69, 0xfe, 0xaa, 0x13, 0x36, 0x39, 0x0f, 0x7f, 0x4e, 0x25, 0x03, 0x74, 0xc2, + 0x66, 0x4f, 0x37, 0x0f, 0xd6, 0x14, 0xba, 0x0c, 0x43, 0x51, 0x23, 0x68, 0x29, 0x73, 0xd8, 0x0b, + 0x3c, 0x51, 0x20, 0x2d, 0x39, 0x3c, 0x98, 0x43, 0x66, 0x73, 0xb4, 0x18, 0x0b, 0xfc, 0xd9, 0x2d, + 0x28, 0xa9, 0xa6, 0x1f, 0xaa, 0xa1, 0xff, 0x1f, 0x16, 0xe1, 0x54, 0xc6, 0xba, 0x40, 0x91, 0x31, + 0x5a, 0x2f, 0xf4, 0xb9, 0x9c, 0x3e, 0xe4, 0x78, 0x45, 0xec, 0xc6, 0xd2, 0x14, 0xf3, 0xdf, 0x77, + 0xa3, 0xb7, 0x22, 0x92, 0x6e, 0x94, 0x16, 0xf5, 0x6e, 0x94, 0x36, 0x76, 0x62, 0x43, 0x4d, 0x1b, + 0x52, 0x3d, 0x7d, 0xa8, 0x73, 0xfa, 0x27, 0x45, 0x98, 0xc9, 0x8a, 0x96, 0x80, 0x7e, 0x3c, 0x95, + 0x41, 0xe6, 0xa5, 0x7e, 0xe3, 0x2c, 0xf0, 0xb4, 0x32, 0x22, 0xbc, 0xd4, 0xbc, 0x99, 0x53, 0xa6, + 0xe7, 0x30, 0x8b, 0x36, 0x99, 0xdf, 0x55, 0xc8, 0x33, 0xff, 0xc8, 0x2d, 0xfe, 0x99, 0xbe, 0x3b, + 0x20, 0x52, 0x06, 0x45, 0x29, 0xbf, 0x2b, 0x59, 0xdc, 0xdb, 0xef, 0x4a, 0xb6, 0x3c, 0xeb, 0xc2, + 0xa8, 0xf6, 0x35, 0x0f, 0x75, 0xc6, 0x77, 0xe8, 0x89, 0xa2, 0xf5, 0xfb, 0xa1, 0xce, 0xfa, 0x2f, + 0x5a, 0x90, 0x32, 0x5d, 0x53, 0x2a, 0x29, 0x2b, 0x57, 0x25, 0x75, 0x01, 0x06, 0xc2, 0xc0, 0x23, + 0xe9, 0xa4, 0x22, 0x38, 0xf0, 0x08, 0x66, 0x10, 0x95, 0xf9, 0xbb, 0x98, 0x97, 0xf9, 0x9b, 0x5e, + 0x8d, 0x3d, 0xb2, 0x47, 0xa4, 0x36, 0x42, 0xf1, 0xe4, 0xeb, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0x95, + 0x01, 0x38, 0xd7, 0xd5, 0x73, 0x91, 0x5e, 0x59, 0xb6, 0x9c, 0x98, 0xdc, 0x75, 0xf6, 0xd3, 0x21, + 0x8f, 0xaf, 0xf0, 0x62, 0x2c, 0xe1, 0xcc, 0xd0, 0x96, 0x47, 0x4d, 0x4c, 0x29, 0xf0, 0x44, 0xb0, + 0x44, 0x01, 0x35, 0x15, 0x47, 0xc5, 0xe3, 0x50, 0x1c, 0x5d, 0x02, 0x88, 0x22, 0x6f, 0xc5, 0xa7, + 0x12, 0x58, 0x53, 0x58, 0xf0, 0x26, 0xd1, 0x35, 0xeb, 0xd7, 0x05, 0x04, 0x6b, 0x58, 0xa8, 0x02, + 0x53, 0xad, 0x30, 0x88, 0xb9, 0x3e, 0xb4, 0xc2, 0x6d, 0x47, 0x06, 0x4d, 0xa7, 0xb1, 0x5a, 0x0a, + 0x8e, 0x3b, 0x6a, 0xa0, 0x97, 0x61, 0x54, 0x38, 0x92, 0xd5, 0x82, 0xc0, 0x13, 0xaa, 0x1a, 0x65, + 0x89, 0x50, 0x4f, 0x40, 0x58, 0xc7, 0xd3, 0xaa, 0x31, 0x25, 0xeb, 0x70, 0x66, 0x35, 0xae, 0x68, + 0xd5, 0xf0, 0x52, 0x91, 0x53, 0x46, 0xfa, 0x8a, 0x9c, 0x92, 0x28, 0xaf, 0x4a, 0x7d, 0xbf, 0x2b, + 0x41, 0x4f, 0x75, 0xcf, 0xaf, 0x0f, 0xc0, 0x29, 0xb1, 0x70, 0x1e, 0xf6, 0x72, 0x79, 0x48, 0x59, + 0xc4, 0x7f, 0xb0, 0x66, 0x4e, 0x7a, 0xcd, 0x7c, 0xb5, 0x08, 0x43, 0x7c, 0x2a, 0x4e, 0x40, 0x86, + 0x5f, 0x15, 0x4a, 0xbf, 0x2e, 0xb1, 0x47, 0x78, 0x5f, 0xe6, 0x2b, 0x4e, 0xec, 0xf0, 0xf3, 0x4b, + 0xb1, 0xd1, 0x44, 0x3d, 0x88, 0xe6, 0x0d, 0x46, 0x3b, 0x9b, 0xd2, 0x6a, 0x01, 0xa7, 0xa1, 0xb1, + 0xdd, 0x77, 0x01, 0x22, 0x96, 0xc9, 0x9a, 0xd2, 0x10, 0x51, 0x6c, 0x9e, 0xe9, 0xd2, 0x7a, 0x5d, + 0x21, 0xf3, 0x3e, 0x24, 0x4b, 0x50, 0x01, 0xb0, 0x46, 0x71, 0xf6, 0x15, 0x28, 0x29, 0xe4, 0x5e, + 0x2a, 0x80, 0x31, 0xfd, 0xd4, 0xfb, 0x1c, 0x4c, 0xa6, 0xda, 0x3a, 0x92, 0x06, 0xe1, 0xb7, 0x2c, + 0x98, 0xe4, 0x5d, 0x5e, 0xf1, 0xf7, 0xc4, 0x66, 0xff, 0x00, 0x66, 0xbc, 0x8c, 0x4d, 0x27, 0x66, + 0xb4, 0xff, 0x4d, 0xaa, 0x34, 0x06, 0x59, 0x50, 0x9c, 0xd9, 0x06, 0xba, 0x08, 0x23, 0x3c, 0x07, + 0xbf, 0xe3, 0x09, 0x6f, 0x82, 0x31, 0x9e, 0x85, 0x80, 0x97, 0x61, 0x05, 0xb5, 0xbf, 0x65, 0xc1, + 0x34, 0xef, 0xf9, 0x35, 0xb2, 0xaf, 0x6e, 0xc7, 0x1f, 0x65, 0xdf, 0x45, 0x92, 0x85, 0x42, 0x4e, + 0x92, 0x05, 0xfd, 0xd3, 0x8a, 0x5d, 0x3f, 0xed, 0xd7, 0x2c, 0x10, 0x2b, 0xf0, 0x04, 0xee, 0x81, + 0x3f, 0x6c, 0xde, 0x03, 0x67, 0xf3, 0x17, 0x75, 0xce, 0x05, 0xf0, 0xcf, 0x2c, 0x98, 0xe2, 0x08, + 0xc9, 0x43, 0xe4, 0x47, 0x3a, 0x0f, 0xfd, 0x64, 0xfe, 0x52, 0xa9, 0x96, 0xb3, 0x3f, 0xca, 0x98, + 0xac, 0x81, 0xae, 0x93, 0xd5, 0x94, 0x1b, 0xe8, 0x08, 0x19, 0xed, 0x8e, 0x1c, 0x17, 0xd4, 0xfe, + 0xaf, 0x16, 0x20, 0xde, 0x8c, 0x71, 0x2e, 0xd3, 0xd3, 0x8e, 0x95, 0x6a, 0x9a, 0xa0, 0x84, 0xd5, + 0x28, 0x08, 0xd6, 0xb0, 0x8e, 0x65, 0x78, 0x52, 0xaf, 0xc9, 0xc5, 0xde, 0xaf, 0xc9, 0x47, 0x18, + 0xd1, 0xbf, 0x3c, 0x00, 0x69, 0xd3, 0x65, 0x74, 0x1b, 0xc6, 0x1a, 0x4e, 0xcb, 0xd9, 0x70, 0x3d, + 0x37, 0x76, 0x49, 0xd4, 0xcd, 0x0c, 0x65, 0x59, 0xc3, 0x13, 0xef, 0x84, 0x5a, 0x09, 0x36, 0xe8, + 0xa0, 0x79, 0x80, 0x56, 0xe8, 0xee, 0xb9, 0x1e, 0xd9, 0x62, 0x57, 0x61, 0xe6, 0xbf, 0xc4, 0x6d, + 0x2b, 0x64, 0x29, 0xd6, 0x30, 0x32, 0xfc, 0x5d, 0x8a, 0x0f, 0xcf, 0xdf, 0x65, 0xe0, 0x88, 0xfe, + 0x2e, 0x83, 0x7d, 0xf9, 0xbb, 0x60, 0x38, 0x23, 0xcf, 0x6e, 0xfa, 0x7f, 0xd5, 0xf5, 0x88, 0x10, + 0xd8, 0xb8, 0x57, 0xd3, 0xec, 0xfd, 0x83, 0xb9, 0x33, 0x38, 0x13, 0x03, 0xe7, 0xd4, 0x44, 0x9f, + 0x87, 0xb2, 0xe3, 0x79, 0xc1, 0x5d, 0x35, 0x6a, 0x2b, 0x51, 0xc3, 0xf1, 0x92, 0x30, 0xd9, 0x23, + 0x4b, 0x8f, 0xdd, 0x3f, 0x98, 0x2b, 0x2f, 0xe6, 0xe0, 0xe0, 0xdc, 0xda, 0xf6, 0x0e, 0x9c, 0xaa, + 0x93, 0x50, 0x26, 0xc9, 0x54, 0x5b, 0x6c, 0x1d, 0x4a, 0x61, 0x8a, 0xa9, 0xf4, 0x15, 0xfa, 0x42, + 0x0b, 0x61, 0x28, 0x99, 0x48, 0x42, 0xc8, 0xfe, 0x53, 0x0b, 0x86, 0x85, 0x39, 0xf4, 0x09, 0xc8, + 0x32, 0x8b, 0x86, 0x3e, 0x72, 0x2e, 0x9b, 0xf1, 0xb2, 0xce, 0xe4, 0x6a, 0x22, 0xab, 0x29, 0x4d, + 0xe4, 0xe3, 0xdd, 0x88, 0x74, 0xd7, 0x41, 0xfe, 0x7c, 0x11, 0x26, 0x4c, 0x53, 0xf0, 0x13, 0x18, + 0x82, 0x1b, 0x30, 0x1c, 0x09, 0xbf, 0x83, 0x42, 0xbe, 0xfd, 0x6a, 0x7a, 0x12, 0x13, 0x2b, 0x17, + 0xe1, 0x69, 0x20, 0x89, 0x64, 0x3a, 0x34, 0x14, 0x1f, 0xa2, 0x43, 0x43, 0x2f, 0x6b, 0xfc, 0x81, + 0xe3, 0xb0, 0xc6, 0xb7, 0xbf, 0xc6, 0x98, 0xbf, 0x5e, 0x7e, 0x02, 0x72, 0xc1, 0x15, 0xf3, 0x98, + 0xb0, 0xbb, 0xac, 0x2c, 0xd1, 0xa9, 0x1c, 0xf9, 0xe0, 0x1f, 0x58, 0x30, 0x2a, 0x10, 0x4f, 0xa0, + 0xdb, 0x3f, 0x62, 0x76, 0xfb, 0xd1, 0x2e, 0xdd, 0xce, 0xe9, 0xef, 0xdf, 0x2c, 0xa8, 0xfe, 0xd6, + 0x82, 0x30, 0xee, 0x2b, 0x6d, 0xc2, 0x08, 0xbd, 0x0d, 0x06, 0x8d, 0xc0, 0x13, 0x87, 0xf9, 0x63, + 0x89, 0x63, 0x2b, 0x2f, 0x3f, 0xd4, 0x7e, 0x63, 0x85, 0xcd, 0xfc, 0x2e, 0x83, 0x30, 0x16, 0x07, + 0x68, 0xe2, 0x77, 0x19, 0x84, 0x31, 0x66, 0x10, 0xd4, 0x04, 0x88, 0x9d, 0x70, 0x8b, 0xc4, 0xb4, + 0x4c, 0x78, 0x82, 0xe7, 0xef, 0xc2, 0x76, 0xec, 0x7a, 0xf3, 0xae, 0x1f, 0x47, 0x71, 0x38, 0x5f, + 0xf5, 0xe3, 0x9b, 0x21, 0xbf, 0x1b, 0x68, 0x9e, 0xaa, 0x8a, 0x16, 0xd6, 0xe8, 0x4a, 0x57, 0x29, + 0xd6, 0xc6, 0xa0, 0xf9, 0x50, 0x78, 0x43, 0x94, 0x63, 0x85, 0x61, 0xbf, 0xc2, 0x78, 0x32, 0x1b, + 0xa0, 0xa3, 0x39, 0x91, 0x7e, 0x63, 0x44, 0x0d, 0x2d, 0x7b, 0x25, 0xa8, 0xe8, 0xae, 0xaa, 0xdd, + 0x59, 0x20, 0x6d, 0x58, 0x77, 0x0b, 0x48, 0xfc, 0x59, 0xd1, 0x8f, 0x76, 0xbc, 0x1f, 0x3f, 0xdf, + 0x83, 0x97, 0x1e, 0xe1, 0xc5, 0x98, 0xc5, 0xf0, 0x64, 0xb1, 0x0e, 0xab, 0xb5, 0x74, 0x62, 0x8b, + 0x65, 0x09, 0xc0, 0x09, 0x0e, 0x5a, 0x10, 0x37, 0x4b, 0xae, 0x9f, 0x7b, 0x34, 0x75, 0xb3, 0x94, + 0x9f, 0xaf, 0x5d, 0x2d, 0x5f, 0x80, 0x51, 0x95, 0x2c, 0xac, 0xc6, 0x73, 0x2e, 0x95, 0xb8, 0x2c, + 0xb5, 0x92, 0x14, 0x63, 0x1d, 0x07, 0xad, 0xc3, 0x64, 0xc4, 0x33, 0x99, 0x49, 0xef, 0x25, 0xa1, + 0x37, 0x78, 0x46, 0xbe, 0x3b, 0xd7, 0x4d, 0xf0, 0x21, 0x2b, 0xe2, 0x9b, 0x55, 0xfa, 0x3b, 0xa5, + 0x49, 0xa0, 0xd7, 0x61, 0xc2, 0xd3, 0x33, 0x3a, 0xd7, 0x84, 0x5a, 0x41, 0x99, 0x65, 0x1a, 0xf9, + 0x9e, 0x6b, 0x38, 0x85, 0x4d, 0x85, 0x00, 0xbd, 0x44, 0x04, 0xc3, 0x72, 0xfc, 0x2d, 0x12, 0x89, + 0x54, 0x47, 0x4c, 0x08, 0xb8, 0x9e, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0xcb, 0x30, 0x26, 0x3f, 0x5f, + 0xf3, 0xe6, 0x4b, 0x8c, 0x7f, 0x35, 0x18, 0x36, 0x30, 0xd1, 0x5d, 0x38, 0x2d, 0xff, 0xaf, 0x87, + 0xce, 0xe6, 0xa6, 0xdb, 0x10, 0xce, 0x94, 0xa3, 0x8c, 0xc4, 0xa2, 0xf4, 0x84, 0x58, 0xc9, 0x42, + 0x3a, 0x3c, 0x98, 0xbb, 0x20, 0x46, 0x2d, 0x13, 0xce, 0x26, 0x31, 0x9b, 0x3e, 0x5a, 0x83, 0x53, + 0xdb, 0xc4, 0xf1, 0xe2, 0xed, 0xe5, 0x6d, 0xd2, 0xd8, 0x91, 0x9b, 0x88, 0xf9, 0x08, 0x6a, 0x26, + 0xb3, 0x57, 0x3b, 0x51, 0x70, 0x56, 0x3d, 0xf4, 0x0e, 0x94, 0x5b, 0xed, 0x0d, 0xcf, 0x8d, 0xb6, + 0x6f, 0x04, 0x31, 0x7b, 0xea, 0x56, 0xb9, 0xb6, 0x84, 0x33, 0xa1, 0xf2, 0x8f, 0xac, 0xe5, 0xe0, + 0xe1, 0x5c, 0x0a, 0xe8, 0x03, 0x38, 0x9d, 0x5a, 0x0c, 0x3c, 0x7d, 0x9b, 0x70, 0x3a, 0x7c, 0x3a, + 0x7b, 0x3b, 0x65, 0x54, 0xe0, 0x2e, 0xae, 0x99, 0x20, 0x9c, 0xdd, 0xc4, 0x87, 0x33, 0x80, 0x78, + 0x9f, 0x56, 0xd6, 0xa4, 0x1b, 0xf4, 0x05, 0x18, 0xd3, 0x57, 0x91, 0x38, 0x60, 0x9e, 0xec, 0x95, + 0xbd, 0x5c, 0xc8, 0x46, 0x6a, 0x45, 0xe9, 0x30, 0x6c, 0x50, 0xb4, 0x09, 0x64, 0x7f, 0x1f, 0xba, + 0x0e, 0x23, 0x0d, 0xcf, 0x25, 0x7e, 0x5c, 0xad, 0x75, 0x73, 0x82, 0x5f, 0x16, 0x38, 0x62, 0xc0, + 0x44, 0x2c, 0x36, 0x5e, 0x86, 0x15, 0x05, 0xfb, 0x77, 0x0b, 0x30, 0xd7, 0x23, 0xb0, 0x5f, 0x4a, + 0x07, 0x68, 0xf5, 0xa5, 0x03, 0x5c, 0x94, 0x99, 0xc3, 0x6e, 0xa4, 0xee, 0x9f, 0xa9, 0xac, 0x60, + 0xc9, 0x2d, 0x34, 0x8d, 0xdf, 0xb7, 0xdd, 0xa4, 0xae, 0x46, 0x1c, 0xe8, 0x69, 0xd1, 0x6b, 0x3c, + 0x1f, 0x0c, 0xf6, 0x2f, 0xd1, 0xe7, 0xaa, 0x82, 0xed, 0xaf, 0x15, 0xe0, 0xb4, 0x1a, 0xc2, 0xef, + 0xdf, 0x81, 0xbb, 0xd5, 0x39, 0x70, 0xc7, 0xa0, 0x48, 0xb7, 0x6f, 0xc2, 0x50, 0x7d, 0x3f, 0x6a, + 0xc4, 0x5e, 0x1f, 0x02, 0xd0, 0x13, 0xc6, 0x06, 0x4d, 0x8e, 0x69, 0x96, 0xfc, 0x53, 0xec, 0x57, + 0xfb, 0x2f, 0x58, 0x30, 0xb9, 0xbe, 0x5c, 0xab, 0x07, 0x8d, 0x1d, 0x12, 0x2f, 0x72, 0x35, 0x11, + 0x16, 0xf2, 0x8f, 0xf5, 0x80, 0x72, 0x4d, 0x96, 0xc4, 0x74, 0x01, 0x06, 0xb6, 0x83, 0x28, 0x4e, + 0xbf, 0xb2, 0x5d, 0x0d, 0xa2, 0x18, 0x33, 0x88, 0xfd, 0x47, 0x16, 0x0c, 0xb2, 0x7c, 0x97, 0xbd, + 0xf2, 0xa2, 0xf6, 0xf3, 0x5d, 0xe8, 0x65, 0x18, 0x22, 0x9b, 0x9b, 0xa4, 0x11, 0x8b, 0x59, 0x95, + 0xde, 0x75, 0x43, 0x2b, 0xac, 0x94, 0x1e, 0xfa, 0xac, 0x31, 0xfe, 0x17, 0x0b, 0x64, 0x74, 0x07, + 0x4a, 0xb1, 0xbb, 0x4b, 0x16, 0x9b, 0x4d, 0xf1, 0x4e, 0xf1, 0x00, 0xce, 0x8c, 0xeb, 0x92, 0x00, + 0x4e, 0x68, 0xd9, 0x3f, 0x5b, 0x00, 0x48, 0x3c, 0x70, 0x7b, 0x7d, 0xe2, 0x52, 0x47, 0xea, 0xd7, + 0x27, 0x33, 0x52, 0xbf, 0xa2, 0x84, 0x60, 0x46, 0xe2, 0x57, 0x35, 0x4c, 0xc5, 0xbe, 0x86, 0x69, + 0xe0, 0x28, 0xc3, 0xb4, 0x0c, 0xd3, 0x89, 0x07, 0xb1, 0x19, 0x4e, 0x81, 0x05, 0xf5, 0x5e, 0x4f, + 0x03, 0x71, 0x27, 0xbe, 0xfd, 0x25, 0x0b, 0x84, 0xbb, 0x41, 0x1f, 0x8b, 0xf9, 0x6d, 0x99, 0xa5, + 0xd1, 0x88, 0x0f, 0x7a, 0x21, 0xdf, 0xff, 0x42, 0x44, 0x05, 0x55, 0x87, 0x87, 0x11, 0x0b, 0xd4, + 0xa0, 0x65, 0xff, 0xd5, 0x02, 0x8c, 0x72, 0x30, 0x8b, 0x3d, 0xd9, 0x47, 0x6f, 0x8e, 0x14, 0x12, + 0x9e, 0x25, 0x30, 0xa4, 0x84, 0x55, 0xe4, 0x70, 0x3d, 0x81, 0xa1, 0x04, 0xe0, 0x04, 0x07, 0x3d, + 0x0d, 0xc3, 0x51, 0x7b, 0x83, 0xa1, 0xa7, 0xcc, 0xdb, 0xeb, 0xbc, 0x18, 0x4b, 0x38, 0xfa, 0x3c, + 0x4c, 0xf1, 0x7a, 0x61, 0xd0, 0x72, 0xb6, 0xb8, 0x6e, 0x67, 0x50, 0xf9, 0x9b, 0x4d, 0xad, 0xa5, + 0x60, 0x87, 0x07, 0x73, 0x33, 0xe9, 0x32, 0xa6, 0x15, 0xec, 0xa0, 0x42, 0x57, 0xec, 0x54, 0xda, + 0x95, 0x05, 0x5d, 0x85, 0x21, 0xce, 0x8c, 0x04, 0x73, 0xe8, 0xf2, 0xd6, 0xa3, 0x39, 0xc0, 0xb0, + 0x68, 0xd9, 0x82, 0x9f, 0x89, 0xfa, 0xe8, 0x1d, 0x18, 0x6d, 0x06, 0x77, 0xfd, 0xbb, 0x4e, 0xd8, + 0x5c, 0xac, 0x55, 0xc5, 0x7c, 0x66, 0xca, 0x34, 0x95, 0x04, 0x4d, 0x77, 0xaa, 0x61, 0x7a, 0xcd, + 0x04, 0x84, 0x75, 0x72, 0x68, 0x9d, 0x85, 0x4b, 0xe2, 0x19, 0xc6, 0xbb, 0xd9, 0x83, 0xa9, 0xa4, + 0xe4, 0x1a, 0xe5, 0x71, 0x11, 0x53, 0x49, 0xe4, 0x27, 0x4f, 0x08, 0xd9, 0x5f, 0x3c, 0x05, 0xc6, + 0x3a, 0x32, 0x42, 0xc2, 0x5b, 0xc7, 0x14, 0x12, 0x1e, 0xc3, 0x08, 0xd9, 0x6d, 0xc5, 0xfb, 0x15, + 0x37, 0xec, 0x96, 0x0b, 0x64, 0x45, 0xe0, 0x74, 0xd2, 0x94, 0x10, 0xac, 0xe8, 0x64, 0xc7, 0xed, + 0x2f, 0x7e, 0x84, 0x71, 0xfb, 0x07, 0x4e, 0x30, 0x6e, 0xff, 0x0d, 0x18, 0xde, 0x72, 0x63, 0x4c, + 0x5a, 0x81, 0x38, 0x88, 0x33, 0x57, 0xc2, 0x15, 0x8e, 0xd2, 0x19, 0x49, 0x5a, 0x00, 0xb0, 0x24, + 0x82, 0xde, 0x50, 0x7b, 0x60, 0x28, 0x5f, 0x8e, 0xed, 0x7c, 0x16, 0xc8, 0xdc, 0x05, 0x22, 0x4e, + 0xff, 0xf0, 0x83, 0xc6, 0xe9, 0x57, 0xd1, 0xf5, 0x47, 0x3e, 0x5c, 0x74, 0x7d, 0x23, 0x0f, 0x41, + 0xe9, 0xf8, 0xf2, 0x10, 0x7c, 0xc9, 0x82, 0xd3, 0xad, 0xac, 0x94, 0x1c, 0x22, 0x4e, 0xfe, 0xcb, + 0x7d, 0xe7, 0x1c, 0x31, 0x1a, 0x64, 0x17, 0x9a, 0x4c, 0x34, 0x9c, 0xdd, 0x1c, 0x1d, 0xe8, 0x70, + 0xa3, 0x29, 0x82, 0xeb, 0x3f, 0x91, 0x93, 0xd0, 0xa0, 0x4b, 0x1a, 0x83, 0x87, 0x13, 0x50, 0x3f, + 0x49, 0x6a, 0x30, 0xfe, 0xa1, 0x93, 0x1a, 0xbc, 0xa1, 0x92, 0x1a, 0x74, 0x09, 0x4a, 0xc3, 0x53, + 0x16, 0xf4, 0x4c, 0x65, 0xa0, 0xa5, 0x23, 0x98, 0x3c, 0x8e, 0x74, 0x04, 0xef, 0x9a, 0xcc, 0x9e, + 0xc7, 0xc6, 0x7f, 0xb6, 0x07, 0xb3, 0x37, 0xe8, 0x76, 0x67, 0xf7, 0x3c, 0xf5, 0xc2, 0xf4, 0x03, + 0xa5, 0x5e, 0xb8, 0xad, 0x27, 0x35, 0x40, 0x3d, 0xa2, 0xf6, 0x53, 0xa4, 0x3e, 0x53, 0x19, 0xdc, + 0xd6, 0x8f, 0xa0, 0x53, 0xf9, 0x74, 0xd5, 0x49, 0xd3, 0x49, 0x37, 0xeb, 0x10, 0xea, 0x4c, 0x91, + 0x30, 0x73, 0x32, 0x29, 0x12, 0x4e, 0x1f, 0x7b, 0x8a, 0x84, 0x33, 0x27, 0x90, 0x22, 0xe1, 0x91, + 0x8f, 0x34, 0x45, 0x42, 0xf9, 0x21, 0xa4, 0x48, 0xb8, 0x91, 0xa4, 0x48, 0x38, 0x9b, 0x3f, 0x25, + 0x19, 0xf6, 0x62, 0x39, 0x89, 0x11, 0x6e, 0x43, 0xa9, 0x25, 0xbd, 0x9d, 0xcb, 0xb3, 0xf9, 0x53, + 0x92, 0xe9, 0x12, 0xcd, 0xa7, 0x44, 0x81, 0x70, 0x42, 0x8a, 0xd2, 0x4d, 0x12, 0x25, 0x3c, 0xda, + 0x45, 0x65, 0x95, 0xa5, 0x0c, 0xc8, 0x4f, 0x8f, 0x60, 0xff, 0xc5, 0x02, 0x9c, 0xef, 0xbe, 0xae, + 0x13, 0x4d, 0x42, 0x2d, 0xd1, 0x7c, 0xa7, 0x34, 0x09, 0x4c, 0xe8, 0xd2, 0xb0, 0xfa, 0x0e, 0x09, + 0x71, 0x05, 0xa6, 0x95, 0xa1, 0x98, 0xe7, 0x36, 0xf6, 0xb5, 0xbc, 0x6a, 0xca, 0x69, 0xa5, 0x9e, + 0x46, 0xc0, 0x9d, 0x75, 0xd0, 0x22, 0x4c, 0x1a, 0x85, 0xd5, 0x8a, 0x10, 0xf6, 0x95, 0xea, 0xa2, + 0x6e, 0x82, 0x71, 0x1a, 0xdf, 0xfe, 0xb2, 0x05, 0x8f, 0xe4, 0xc4, 0x38, 0xee, 0x3b, 0xe2, 0xc1, + 0x26, 0x4c, 0xb6, 0xcc, 0xaa, 0x3d, 0x02, 0xa3, 0x18, 0x91, 0x94, 0x55, 0x5f, 0x53, 0x00, 0x9c, + 0x26, 0xba, 0x74, 0xf1, 0xeb, 0xdf, 0x3e, 0xff, 0x89, 0x3f, 0xf8, 0xf6, 0xf9, 0x4f, 0x7c, 0xeb, + 0xdb, 0xe7, 0x3f, 0xf1, 0xff, 0xdf, 0x3f, 0x6f, 0x7d, 0xfd, 0xfe, 0x79, 0xeb, 0x0f, 0xee, 0x9f, + 0xb7, 0xbe, 0x75, 0xff, 0xbc, 0xf5, 0xc7, 0xf7, 0xcf, 0x5b, 0x3f, 0xfb, 0x9d, 0xf3, 0x9f, 0x78, + 0xbb, 0xb0, 0xf7, 0xc2, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xed, 0x49, 0x5a, 0x86, 0x34, 0xd6, + 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 e9c513a8ce5d1..0d43a79ffecc2 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -170,6 +170,22 @@ message Binding { optional ObjectReference target = 2; } +// Represents storage that is managed by an external CSI volume driver +message CSIPersistentVolumeSource { + // Driver is the name of the driver to use for this volume. + // Required. + optional string driver = 1; + + // VolumeHandle is the unique volume name returned by the CSI volume + // plugin’s CreateVolume to refer to the volume on all subsequent calls. + optional string volumeHandle = 2; + + // Optional: The value to pass to ControllerPublishVolumeRequest. + // Defaults to false (read/write). + // +optional + optional bool readOnly = 3; +} + // Adds and removes POSIX capabilities from running containers. message Capabilities { // Added capabilities @@ -2356,6 +2372,10 @@ message PersistentVolumeSource { // More info: https://releases.k8s.io/HEAD/examples/volumes/storageos/README.md // +optional optional StorageOSPersistentVolumeSource storageos = 21; + + // CSI represents storage that handled by an external CSI driver + // +optional + optional CSIPersistentVolumeSource csi = 22; } // PersistentVolumeSpec is the specification of a persistent volume. diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 0f552589f48b6..567b21535f8c4 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -1634,24 +1634,10 @@ type CSIPersistentVolumeSource struct { // plugin’s CreateVolume to refer to the volume on all subsequent calls. VolumeHandle string `json:"volumeHandle" protobuf:"bytes,2,opt,name=volumeHandle"` - // Optional: MountSecretRef is a reference to the secret object containing - // sensitive information to pass to the CSI driver during NodePublish. - // This may be empty if no secret is required. If the secret object contains - // more than one secret, all secrets are passed. - // +optional - MountSecretRef *SecretReference `json:"mountSecretRef,omitempty" protobuf:"bytes,3,opt,name=mountSecretRef"` - - // Optional: AttachSecretRef is a reference to the secret object containing - // sensitive information to pass to the CSI driver during ControllerPublish. - // This may be empty if no secret is required. If the secret object contains - // more than one secret, all secrets are passed. - // +optional - AttachSecretRef *SecretReference `json:"attachSecretRef,omitempty" protobuf:"bytes,4,opt,name=attachSecretRef"` - // Optional: The value to pass to ControllerPublishVolumeRequest. // Defaults to false (read/write). // +optional - ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,5,opt,name=readOnly"` + ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,3,opt,name=readOnly"` } // ContainerPort represents a network port in a single container. 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 ef037c922cbbc..f75c838327cdb 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 @@ -116,6 +116,17 @@ func (Binding) SwaggerDoc() map[string]string { return map_Binding } +var map_CSIPersistentVolumeSource = map[string]string{ + "": "Represents storage that is managed by an external CSI volume driver", + "driver": "Driver is the name of the driver to use for this volume. Required.", + "volumeHandle": "VolumeHandle is the unique volume name returned by the CSI volume plugin’s CreateVolume to refer to the volume on all subsequent calls.", + "readOnly": "Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write).", +} + +func (CSIPersistentVolumeSource) SwaggerDoc() map[string]string { + return map_CSIPersistentVolumeSource +} + var map_Capabilities = map[string]string{ "": "Adds and removes POSIX capabilities from running containers.", "add": "Added capabilities", @@ -1212,6 +1223,7 @@ var map_PersistentVolumeSource = map[string]string{ "scaleIO": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", "local": "Local represents directly-attached storage with node affinity", "storageos": "StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod More info: https://releases.k8s.io/HEAD/examples/volumes/storageos/README.md", + "csi": "CSI represents storage that handled by an external CSI driver", } func (PersistentVolumeSource) 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 9c8e002f9442f..cc7f4d858653e 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 @@ -246,6 +246,22 @@ func (in *Binding) DeepCopyObject() runtime.Object { } } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CSIPersistentVolumeSource) DeepCopyInto(out *CSIPersistentVolumeSource) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSIPersistentVolumeSource. +func (in *CSIPersistentVolumeSource) DeepCopy() *CSIPersistentVolumeSource { + if in == nil { + return nil + } + out := new(CSIPersistentVolumeSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Capabilities) DeepCopyInto(out *Capabilities) { *out = *in @@ -3145,6 +3161,15 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { (*in).DeepCopyInto(*out) } } + if in.CSI != nil { + in, out := &in.CSI, &out.CSI + if *in == nil { + *out = nil + } else { + *out = new(CSIPersistentVolumeSource) + **out = **in + } + } return }