From 25caf91b1cb0600c7dfb7859df192f0e7f6ddbf9 Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Mon, 23 Apr 2018 18:20:34 +0800 Subject: [PATCH 1/6] add fstype for local volume source --- pkg/apis/core/types.go | 10 +++++++--- staging/src/k8s.io/api/core/v1/types.go | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index 11e1664eedd..1574a83340f 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -1513,10 +1513,14 @@ type KeyToPath struct { type LocalVolumeSource struct { // The full path to the volume on the node. // It can be either a directory or block device (disk, partition, ...). - // Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. - // Block devices can be represented only by VolumeMode=Block, which also requires the - // BlockVolume alpha feature gate to be enabled. Path string + + // Filesystem type to mount. + // It applies only when the Path is a block device. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". The default value is to auto-select a fileystem if unspecified. + // +optional + FSType *string } // Represents storage that is managed by an external CSI volume driver (Beta feature) diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 893e0fdc727..a316657dc8e 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -1601,10 +1601,14 @@ type KeyToPath struct { type LocalVolumeSource struct { // The full path to the volume on the node. // It can be either a directory or block device (disk, partition, ...). - // Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. - // Block devices can be represented only by VolumeMode=Block, which also requires the - // BlockVolume alpha feature gate to be enabled. Path string `json:"path" protobuf:"bytes,1,opt,name=path"` + + // Filesystem type to mount. + // It applies only when the Path is a block device. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". The default value is to auto-select a fileystem if unspecified. + // +optional + FSType *string `json:"fsType,omitempty" protobuf:"bytes,2,opt,name=fsType"` } // Represents storage that is managed by an external CSI volume driver (Beta feature) From 159a4358e80b43e571e4676b86c97e0d94739a85 Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Mon, 3 Sep 2018 13:34:26 +0800 Subject: [PATCH 2/6] auto generated files --- api/openapi-spec/swagger.json | 6 +- api/swagger-spec/v1.json | 6 +- docs/api-reference/v1/definitions.html | 9 +- pkg/apis/core/v1/zz_generated.conversion.go | 2 + pkg/apis/core/zz_generated.deepcopy.go | 7 +- .../src/k8s.io/api/core/v1/generated.pb.go | 997 +++++++++--------- .../src/k8s.io/api/core/v1/generated.proto | 10 +- .../core/v1/types_swagger_doc_generated.go | 5 +- .../api/core/v1/zz_generated.deepcopy.go | 7 +- 9 files changed, 561 insertions(+), 488 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 6639e6807cb..5142b1ff06e 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -81795,8 +81795,12 @@ "path" ], "properties": { + "fsType": { + "description": "Filesystem type to mount. It applies only when the Path is a block device. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". The default value is to auto-select a fileystem if unspecified.", + "type": "string" + }, "path": { - "description": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...). Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. Block devices can be represented only by VolumeMode=Block, which also requires the BlockVolume alpha feature gate to be enabled.", + "description": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...).", "type": "string" } } diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 72671504175..4dfbda98d76 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -20242,7 +20242,11 @@ "properties": { "path": { "type": "string", - "description": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...). Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. Block devices can be represented only by VolumeMode=Block, which also requires the BlockVolume alpha feature gate to be enabled." + "description": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...)." + }, + "fsType": { + "type": "string", + "description": "Filesystem type to mount. It applies only when the Path is a block device. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". The default value is to auto-select a fileystem if unspecified." } } }, diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 9430f49582f..6a7097818d0 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -6641,11 +6641,18 @@ Examples:

path

-

The full path to the volume on the node. It can be either a directory or block device (disk, partition, …). Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. Block devices can be represented only by VolumeMode=Block, which also requires the BlockVolume alpha feature gate to be enabled.

+

The full path to the volume on the node. It can be either a directory or block device (disk, partition, …).

true

string

+ +

fsType

+

Filesystem type to mount. It applies only when the Path is a block device. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default value is to auto-select a fileystem if unspecified.

+

false

+

string

+ + diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index 88b711d0d45..07a8b4b55d7 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -4074,6 +4074,7 @@ func Convert_core_LocalObjectReference_To_v1_LocalObjectReference(in *core.Local func autoConvert_v1_LocalVolumeSource_To_core_LocalVolumeSource(in *v1.LocalVolumeSource, out *core.LocalVolumeSource, s conversion.Scope) error { out.Path = in.Path + out.FSType = (*string)(unsafe.Pointer(in.FSType)) return nil } @@ -4084,6 +4085,7 @@ func Convert_v1_LocalVolumeSource_To_core_LocalVolumeSource(in *v1.LocalVolumeSo func autoConvert_core_LocalVolumeSource_To_v1_LocalVolumeSource(in *core.LocalVolumeSource, out *v1.LocalVolumeSource, s conversion.Scope) error { out.Path = in.Path + out.FSType = (*string)(unsafe.Pointer(in.FSType)) return nil } diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index f60de66b153..08d2045fe55 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -1959,6 +1959,11 @@ func (in *LocalObjectReference) DeepCopy() *LocalObjectReference { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LocalVolumeSource) DeepCopyInto(out *LocalVolumeSource) { *out = *in + if in.FSType != nil { + in, out := &in.FSType, &out.FSType + *out = new(string) + **out = **in + } return } @@ -2884,7 +2889,7 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { if in.Local != nil { in, out := &in.Local, &out.Local *out = new(LocalVolumeSource) - **out = **in + (*in).DeepCopyInto(*out) } if in.StorageOS != nil { in, out := &in.StorageOS, &out.StorageOS 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 cce5b3fb160..54803b48c3d 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -4839,6 +4839,12 @@ func (m *LocalVolumeSource) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) i += copy(dAtA[i:], m.Path) + if m.FSType != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FSType))) + i += copy(dAtA[i:], *m.FSType) + } return i, nil } @@ -12259,6 +12265,10 @@ func (m *LocalVolumeSource) Size() (n int) { _ = l l = len(m.Path) n += 1 + l + sovGenerated(uint64(l)) + if m.FSType != nil { + l = len(*m.FSType) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -15560,6 +15570,7 @@ func (this *LocalVolumeSource) String() string { } s := strings.Join([]string{`&LocalVolumeSource{`, `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `FSType:` + valueToStringGenerated(this.FSType) + `,`, `}`, }, "") return s @@ -29819,6 +29830,36 @@ func (m *LocalVolumeSource) Unmarshal(dAtA []byte) error { } m.Path = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FSType", 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 + } + s := string(dAtA[iNdEx:postIndex]) + m.FSType = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -51300,7 +51341,7 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 12771 bytes of a gzipped FileDescriptorProto + // 12778 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x90, 0x24, 0x57, 0x56, 0x18, 0xbc, 0x59, 0x55, 0xfd, 0xa8, 0xd3, 0xef, 0x3b, 0x0f, 0xf5, 0xb4, 0x34, 0x53, 0xa3, 0xd4, 0xee, 0x68, 0xb4, 0x92, 0x7a, 0x56, 0x23, 0x69, 0x57, 0xac, 0xb4, 0x82, 0xee, 0xae, 0xee, @@ -51623,481 +51664,481 @@ var fileDescriptorGenerated = []byte{ 0x9c, 0xb9, 0x1d, 0x38, 0xad, 0x45, 0xc7, 0x73, 0xfc, 0x26, 0x09, 0x6b, 0xfe, 0x56, 0x5f, 0x2b, 0x25, 0xdd, 0xa6, 0xa8, 0xd0, 0xcf, 0xa6, 0xc8, 0xde, 0x06, 0xa4, 0x37, 0x20, 0xec, 0x38, 0x31, 0x8c, 0xb8, 0xbc, 0x29, 0x31, 0xfc, 0x4f, 0x67, 0x73, 0x77, 0x5d, 0x3d, 0xd3, 0x2c, 0x14, 0x79, - 0x01, 0x96, 0x84, 0xec, 0x57, 0x20, 0xd3, 0x77, 0xab, 0xbf, 0xda, 0xc0, 0x7e, 0x19, 0x66, 0x58, - 0xcd, 0xe3, 0x89, 0xb4, 0xf6, 0xf7, 0x59, 0x30, 0xb5, 0x96, 0x8a, 0x4d, 0x71, 0x85, 0xbd, 0xf5, - 0x65, 0xe8, 0x7d, 0x1b, 0xac, 0x14, 0x0b, 0xe8, 0x89, 0xeb, 0x97, 0xfe, 0xc4, 0x82, 0xc4, 0x55, - 0xf2, 0x14, 0x98, 0xaa, 0x25, 0x83, 0xa9, 0xca, 0xd4, 0x7b, 0xa8, 0xee, 0xe4, 0xf1, 0x54, 0xe8, - 0x96, 0x8a, 0x0b, 0xd0, 0x43, 0xe5, 0x91, 0x90, 0xe1, 0x5e, 0xe4, 0x93, 0x66, 0xf0, 0x00, 0x19, - 0x29, 0x80, 0x99, 0x09, 0x29, 0xdc, 0x8f, 0x88, 0x99, 0x90, 0xea, 0x4f, 0xce, 0xee, 0xab, 0x6b, - 0x5d, 0x66, 0xa7, 0xd2, 0xb7, 0x32, 0xb3, 0x6f, 0xc7, 0x73, 0xdf, 0x27, 0x2a, 0xb8, 0x49, 0x45, - 0x98, 0x71, 0x8b, 0xd2, 0xa3, 0x83, 0xca, 0x84, 0xfa, 0xc7, 0x23, 0x60, 0x25, 0x55, 0xec, 0x9b, - 0x30, 0x95, 0x1a, 0x30, 0xf4, 0x32, 0x0c, 0xb5, 0xb7, 0x9d, 0x88, 0xa4, 0x4c, 0x23, 0x87, 0xea, - 0xb4, 0xf0, 0xe8, 0xa0, 0x32, 0xa9, 0x2a, 0xb0, 0x12, 0xcc, 0xb1, 0xed, 0xff, 0x61, 0x41, 0x69, - 0x2d, 0x68, 0x9d, 0xc6, 0x62, 0x7a, 0xdd, 0x58, 0x4c, 0x4f, 0xe4, 0xc5, 0x0f, 0xcc, 0x5d, 0x47, - 0x2b, 0xa9, 0x75, 0x74, 0x29, 0x97, 0x42, 0xef, 0x25, 0xb4, 0x0b, 0x63, 0x2c, 0x2a, 0xa1, 0x30, - 0xd5, 0x7c, 0xd1, 0xe0, 0xef, 0x2b, 0x29, 0xfe, 0x7e, 0x4a, 0x43, 0xd5, 0xb8, 0xfc, 0x67, 0x60, - 0x44, 0x98, 0x0b, 0xa6, 0x0d, 0xdc, 0x05, 0x2e, 0x96, 0x70, 0xfb, 0xc7, 0x8a, 0x60, 0x44, 0x41, - 0x44, 0xbf, 0x62, 0xc1, 0x7c, 0xc8, 0x3d, 0x06, 0x5b, 0xd5, 0x4e, 0xe8, 0xfa, 0x5b, 0x8d, 0xe6, - 0x36, 0x69, 0x75, 0x3c, 0xd7, 0xdf, 0xaa, 0x6d, 0xf9, 0x81, 0x2a, 0x5e, 0x7e, 0x40, 0x9a, 0x1d, - 0xa6, 0xf3, 0xef, 0x13, 0x72, 0x51, 0x99, 0xe3, 0x5c, 0x3f, 0x3c, 0xa8, 0xcc, 0xe3, 0x63, 0xd1, - 0xc6, 0xc7, 0xec, 0x0b, 0xfa, 0xba, 0x05, 0xd7, 0x78, 0x70, 0xc0, 0xc1, 0xfb, 0xdf, 0x43, 0x1a, - 0xaa, 0x4b, 0x52, 0x09, 0x91, 0x75, 0x12, 0xee, 0x2e, 0x7e, 0x46, 0x0c, 0xe8, 0xb5, 0xfa, 0xf1, - 0xda, 0xc2, 0xc7, 0xed, 0x9c, 0xfd, 0xcf, 0x8b, 0x30, 0x21, 0x9c, 0xd5, 0x45, 0x14, 0x94, 0x97, - 0x8d, 0x25, 0xf1, 0x64, 0x6a, 0x49, 0xcc, 0x18, 0xc8, 0x27, 0x13, 0x00, 0x25, 0x82, 0x19, 0xcf, - 0x89, 0xe2, 0x9b, 0xc4, 0x09, 0xe3, 0x0d, 0xe2, 0x70, 0x33, 0x95, 0xe2, 0xb1, 0x4d, 0x6a, 0x94, - 0xfa, 0xe5, 0x76, 0x9a, 0x18, 0xee, 0xa6, 0x8f, 0xf6, 0x00, 0x31, 0x5b, 0x9b, 0xd0, 0xf1, 0x23, - 0xfe, 0x2d, 0xae, 0x78, 0x0f, 0x38, 0x5e, 0xab, 0x73, 0xa2, 0x55, 0x74, 0xbb, 0x8b, 0x1a, 0xce, - 0x68, 0x41, 0xb3, 0xa1, 0x1a, 0x1a, 0xd4, 0x86, 0x6a, 0xb8, 0x8f, 0x17, 0x89, 0x0f, 0xd3, 0x5d, - 0xf1, 0x06, 0xde, 0x86, 0xb2, 0xb2, 0x75, 0x13, 0x87, 0x4e, 0xef, 0xb0, 0x1d, 0x69, 0x0a, 0x5c, - 0x45, 0x92, 0xd8, 0x59, 0x26, 0xe4, 0xec, 0x7f, 0x58, 0x30, 0x1a, 0xe4, 0x93, 0xb8, 0x06, 0xa3, - 0x4e, 0x14, 0xb9, 0x5b, 0x3e, 0x69, 0x89, 0x1d, 0xfb, 0xf1, 0xbc, 0x1d, 0x6b, 0x34, 0xc3, 0xec, - 0x0d, 0x17, 0x44, 0x4d, 0xac, 0x68, 0xa0, 0x9b, 0xdc, 0x18, 0x68, 0x4f, 0xf2, 0xf3, 0x83, 0x51, - 0x03, 0x69, 0x2e, 0xb4, 0x47, 0xb0, 0xa8, 0x8f, 0xbe, 0xc8, 0xad, 0xb5, 0x6e, 0xf9, 0xc1, 0x7d, - 0xff, 0x46, 0x10, 0x48, 0x0f, 0xb3, 0xc1, 0x08, 0xce, 0x48, 0x1b, 0x2d, 0x55, 0x1d, 0x9b, 0xd4, - 0x06, 0x8b, 0xc9, 0xf3, 0x9d, 0x70, 0x86, 0x92, 0x36, 0xfd, 0x44, 0x22, 0x44, 0x60, 0x4a, 0x44, - 0x42, 0x90, 0x65, 0x62, 0xec, 0x32, 0x59, 0x75, 0xb3, 0x76, 0xa2, 0xd0, 0xbb, 0x65, 0x92, 0xc0, - 0x69, 0x9a, 0xf6, 0x4f, 0x5a, 0xc0, 0x2c, 0xdc, 0x4f, 0x81, 0x65, 0xf8, 0x9c, 0xc9, 0x32, 0xcc, - 0xe6, 0x0d, 0x72, 0x0e, 0xb7, 0xf0, 0x12, 0x5f, 0x59, 0xf5, 0x30, 0x78, 0xb0, 0x2f, 0x5e, 0xca, - 0x07, 0xe0, 0x52, 0xff, 0x8f, 0xc5, 0x0f, 0x31, 0xe5, 0x74, 0x8e, 0xbe, 0x0b, 0x46, 0x9b, 0x4e, - 0xdb, 0x69, 0xf2, 0x90, 0xbd, 0xb9, 0x1a, 0x1b, 0xa3, 0xd2, 0xfc, 0x92, 0xa8, 0xc1, 0x35, 0x10, - 0x32, 0xa2, 0xc6, 0xa8, 0x2c, 0xee, 0xab, 0x75, 0x50, 0x4d, 0xce, 0xed, 0xc0, 0x84, 0x41, 0xec, - 0x91, 0x8a, 0xab, 0xdf, 0xc5, 0xaf, 0x58, 0x15, 0x01, 0x66, 0x17, 0x66, 0x7c, 0xed, 0x3f, 0xbd, - 0x50, 0xa4, 0x08, 0xf2, 0xf1, 0x7e, 0x97, 0x28, 0xbb, 0x7d, 0x34, 0x0b, 0xfe, 0x14, 0x19, 0xdc, - 0x4d, 0xd9, 0xfe, 0x71, 0x0b, 0x1e, 0xd3, 0x11, 0xb5, 0x78, 0x00, 0xfd, 0x74, 0xc0, 0x55, 0x18, - 0x0d, 0xda, 0x24, 0x74, 0xe2, 0x20, 0x14, 0xb7, 0xc6, 0x55, 0x39, 0xe8, 0x77, 0x44, 0xf9, 0x91, - 0x88, 0x9d, 0x28, 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0x22, 0x1b, 0x86, 0xd9, 0x60, 0x44, 0x22, 0x56, - 0x03, 0x3b, 0x03, 0xd8, 0x73, 0x68, 0x84, 0x05, 0xc4, 0xfe, 0x03, 0x8b, 0x2f, 0x2c, 0xbd, 0xeb, - 0xe8, 0x3d, 0x98, 0xde, 0x75, 0xe2, 0xe6, 0xf6, 0xf2, 0x83, 0x76, 0xc8, 0x55, 0xdf, 0x72, 0x9c, - 0x9e, 0xed, 0x37, 0x4e, 0xda, 0x47, 0x26, 0x06, 0x68, 0xab, 0x29, 0x62, 0xb8, 0x8b, 0x3c, 0xda, - 0x80, 0x31, 0x56, 0xc6, 0x2c, 0x9d, 0xa3, 0x5e, 0xac, 0x41, 0x5e, 0x6b, 0xea, 0x45, 0x79, 0x35, - 0xa1, 0x83, 0x75, 0xa2, 0xf6, 0x57, 0x8a, 0x7c, 0xb7, 0x33, 0x6e, 0xfb, 0x19, 0x18, 0x69, 0x07, - 0xad, 0xa5, 0x5a, 0x15, 0x8b, 0x59, 0x50, 0xd7, 0x48, 0x9d, 0x17, 0x63, 0x09, 0x47, 0xaf, 0x02, - 0x90, 0x07, 0x31, 0x09, 0x7d, 0xc7, 0x53, 0x06, 0x21, 0xca, 0x04, 0xb2, 0x1a, 0xac, 0x05, 0xf1, - 0xdd, 0x88, 0x7c, 0xc7, 0xb2, 0x42, 0xc1, 0x1a, 0x3a, 0xba, 0x0e, 0xd0, 0x0e, 0x83, 0x3d, 0xb7, - 0xc5, 0x5c, 0xe7, 0x8a, 0xa6, 0xb9, 0x44, 0x5d, 0x41, 0xb0, 0x86, 0x85, 0x5e, 0x85, 0x89, 0x8e, - 0x1f, 0x71, 0x0e, 0xc5, 0xd9, 0x10, 0x91, 0x07, 0x47, 0x13, 0xcb, 0x85, 0xbb, 0x3a, 0x10, 0x9b, - 0xb8, 0x68, 0x01, 0x86, 0x63, 0x87, 0xd9, 0x3b, 0x0c, 0xe5, 0xdb, 0x2d, 0xae, 0x53, 0x0c, 0x3d, - 0x60, 0x2c, 0xad, 0x80, 0x45, 0x45, 0xf4, 0xb6, 0xf4, 0x43, 0xe0, 0x67, 0xbd, 0x30, 0x18, 0x1e, - 0xec, 0x5e, 0xd0, 0xbc, 0x10, 0x84, 0x21, 0xb2, 0x41, 0xcb, 0xfe, 0x7a, 0x19, 0x20, 0x61, 0xc7, - 0xd1, 0xfb, 0x5d, 0xe7, 0xd1, 0x73, 0xbd, 0x19, 0xf8, 0x93, 0x3b, 0x8c, 0xd0, 0xf7, 0x5a, 0x30, - 0xe6, 0x78, 0x5e, 0xd0, 0x74, 0x62, 0x36, 0xca, 0x85, 0xde, 0xe7, 0xa1, 0x68, 0x7f, 0x21, 0xa9, - 0xc1, 0xbb, 0xf0, 0xa2, 0x5c, 0x78, 0x1a, 0xa4, 0x6f, 0x2f, 0xf4, 0x86, 0xd1, 0xa7, 0xa4, 0x94, - 0xc6, 0x97, 0xc7, 0x5c, 0x5a, 0x4a, 0x2b, 0xb3, 0xa3, 0x5f, 0x13, 0xd0, 0xd0, 0x5d, 0x23, 0xa8, - 0x5c, 0x29, 0x3f, 0xbe, 0x82, 0xc1, 0x95, 0xf6, 0x8b, 0x27, 0x87, 0xea, 0xba, 0xe3, 0xd4, 0x50, - 0x7e, 0x10, 0x12, 0x4d, 0xfc, 0xe9, 0xe3, 0x34, 0xf5, 0x2e, 0x4c, 0xb5, 0xcc, 0xbb, 0x5d, 0xac, - 0xa6, 0xa7, 0xf3, 0xe8, 0xa6, 0x58, 0x81, 0xe4, 0x36, 0x4f, 0x01, 0x70, 0x9a, 0x30, 0xaa, 0x73, - 0x17, 0xb6, 0x9a, 0xbf, 0x19, 0x08, 0xc3, 0x73, 0x3b, 0x77, 0x2e, 0xf7, 0xa3, 0x98, 0xec, 0x52, - 0xcc, 0xe4, 0xd2, 0x5e, 0x13, 0x75, 0xb1, 0xa2, 0x82, 0xde, 0x80, 0x61, 0xe6, 0x03, 0x1b, 0xcd, - 0x8e, 0xe6, 0x2b, 0x0a, 0xcd, 0xf0, 0x0d, 0xc9, 0xa6, 0x62, 0x7f, 0x23, 0x2c, 0x28, 0xa0, 0x9b, - 0x32, 0xc6, 0x4b, 0x54, 0xf3, 0xef, 0x46, 0x84, 0xc5, 0x78, 0x29, 0x2f, 0x7e, 0x3c, 0x09, 0xdf, - 0xc2, 0xcb, 0x33, 0x43, 0xc3, 0x1b, 0x35, 0x29, 0x73, 0x24, 0xfe, 0xcb, 0x88, 0xf3, 0xb3, 0x90, - 0xdf, 0x3d, 0x33, 0x2a, 0x7d, 0x32, 0x9c, 0xf7, 0x4c, 0x12, 0x38, 0x4d, 0x93, 0x32, 0x9a, 0x7c, - 0xe7, 0x0a, 0xd3, 0xf5, 0x7e, 0xfb, 0x9f, 0xcb, 0xd7, 0xec, 0x92, 0xe1, 0x25, 0x58, 0xd4, 0x3f, - 0xd5, 0x5b, 0x7f, 0xce, 0x87, 0xe9, 0xf4, 0x16, 0x7d, 0xa4, 0x5c, 0xc6, 0xef, 0x97, 0x60, 0xd2, - 0x5c, 0x52, 0xe8, 0x1a, 0x94, 0x05, 0x11, 0x15, 0x70, 0x54, 0xed, 0x92, 0x55, 0x09, 0xc0, 0x09, - 0x0e, 0x8b, 0x33, 0xcb, 0xaa, 0x6b, 0x26, 0x87, 0x49, 0x9c, 0x59, 0x05, 0xc1, 0x1a, 0x16, 0x95, - 0x97, 0x36, 0x82, 0x20, 0x56, 0x97, 0x8a, 0x5a, 0x77, 0x8b, 0xac, 0x14, 0x0b, 0x28, 0xbd, 0x4c, - 0x76, 0x48, 0xe8, 0x13, 0xcf, 0x8c, 0x63, 0xa6, 0x2e, 0x93, 0x5b, 0x3a, 0x10, 0x9b, 0xb8, 0xf4, - 0x96, 0x0c, 0x22, 0xb6, 0x90, 0x85, 0x54, 0x96, 0x98, 0x70, 0x36, 0xb8, 0x37, 0xb9, 0x84, 0xa3, - 0x2f, 0xc0, 0x63, 0xca, 0xf9, 0x1b, 0x73, 0x25, 0xb4, 0x6c, 0x71, 0xd8, 0x50, 0xa2, 0x3c, 0xb6, - 0x94, 0x8d, 0x86, 0xf3, 0xea, 0xa3, 0xd7, 0x61, 0x52, 0x70, 0xee, 0x92, 0xe2, 0x88, 0x69, 0x17, - 0x71, 0xcb, 0x80, 0xe2, 0x14, 0xb6, 0x8c, 0xc4, 0xc6, 0x98, 0x67, 0x49, 0x61, 0xb4, 0x3b, 0x12, - 0x9b, 0x0e, 0xc7, 0x5d, 0x35, 0xd0, 0x02, 0x4c, 0x71, 0xd6, 0xca, 0xf5, 0xb7, 0xf8, 0x9c, 0x08, - 0xcf, 0x12, 0xb5, 0xa5, 0xee, 0x98, 0x60, 0x9c, 0xc6, 0x47, 0xaf, 0xc0, 0xb8, 0x13, 0x36, 0xb7, - 0xdd, 0x98, 0x34, 0xe3, 0x4e, 0xc8, 0x5d, 0x4e, 0x34, 0xc3, 0x92, 0x05, 0x0d, 0x86, 0x0d, 0x4c, - 0xfb, 0x7d, 0x38, 0x93, 0xe1, 0x94, 0x46, 0x17, 0x8e, 0xd3, 0x76, 0xe5, 0x37, 0xa5, 0x8c, 0x31, - 0x17, 0xea, 0x35, 0xf9, 0x35, 0x1a, 0x16, 0x5d, 0x9d, 0xcc, 0x79, 0x4d, 0x4b, 0x30, 0xa1, 0x56, - 0xe7, 0x8a, 0x04, 0xe0, 0x04, 0xc7, 0xfe, 0x9f, 0x05, 0x98, 0xca, 0x50, 0xac, 0xb3, 0x24, 0x07, - 0x29, 0xd9, 0x23, 0xc9, 0x69, 0x60, 0x06, 0xf6, 0x2b, 0x1c, 0x23, 0xb0, 0x5f, 0xb1, 0x5f, 0x60, - 0xbf, 0xd2, 0x07, 0x09, 0xec, 0x67, 0x8e, 0xd8, 0xd0, 0x40, 0x23, 0x96, 0x11, 0x0c, 0x70, 0xf8, - 0x98, 0xc1, 0x00, 0x8d, 0x41, 0x1f, 0x19, 0x60, 0xd0, 0x7f, 0xa8, 0x00, 0xd3, 0x69, 0x03, 0xb8, - 0x53, 0x50, 0xc7, 0xbe, 0x61, 0xa8, 0x63, 0xb3, 0x53, 0x86, 0xa4, 0xcd, 0xf2, 0xf2, 0x54, 0xb3, - 0x38, 0xa5, 0x9a, 0xfd, 0xe4, 0x40, 0xd4, 0x7a, 0xab, 0x69, 0xff, 0x76, 0x01, 0xce, 0xa5, 0xab, - 0x2c, 0x79, 0x8e, 0xbb, 0x7b, 0x0a, 0x63, 0x73, 0xc7, 0x18, 0x9b, 0xe7, 0x07, 0xf9, 0x1a, 0xd6, - 0xb5, 0xdc, 0x01, 0x7a, 0x2b, 0x35, 0x40, 0xd7, 0x06, 0x27, 0xd9, 0x7b, 0x94, 0xbe, 0x51, 0x84, - 0x4b, 0x99, 0xf5, 0x12, 0x6d, 0xe6, 0x8a, 0xa1, 0xcd, 0xbc, 0x9e, 0xd2, 0x66, 0xda, 0xbd, 0x6b, - 0x9f, 0x8c, 0x7a, 0x53, 0x78, 0x0b, 0xb2, 0xe0, 0x6f, 0x0f, 0xa9, 0xda, 0x34, 0xbc, 0x05, 0x15, - 0x21, 0x6c, 0xd2, 0xfd, 0xb3, 0xa4, 0xd2, 0xfc, 0x97, 0x16, 0x5c, 0xc8, 0x9c, 0x9b, 0x53, 0x50, - 0x61, 0xad, 0x99, 0x2a, 0xac, 0x67, 0x06, 0x5e, 0xad, 0x39, 0x3a, 0xad, 0xdf, 0x28, 0xe5, 0x7c, - 0x0b, 0x13, 0xd0, 0xef, 0xc0, 0x98, 0xd3, 0x6c, 0x92, 0x28, 0x5a, 0x0d, 0x5a, 0x2a, 0x18, 0xda, - 0xf3, 0x4c, 0xce, 0x4a, 0x8a, 0x8f, 0x0e, 0x2a, 0x73, 0x69, 0x12, 0x09, 0x18, 0xeb, 0x14, 0xcc, - 0xf8, 0x8d, 0x85, 0x13, 0x8d, 0xdf, 0x78, 0x1d, 0x60, 0x4f, 0x71, 0xeb, 0x69, 0x21, 0x5f, 0xe3, - 0xe3, 0x35, 0x2c, 0xf4, 0x45, 0x18, 0x8d, 0xc4, 0x35, 0x2e, 0x96, 0xe2, 0x8b, 0x03, 0xce, 0x95, - 0xb3, 0x41, 0x3c, 0xd3, 0x2d, 0x5d, 0xe9, 0x43, 0x14, 0x49, 0xf4, 0x6d, 0x30, 0x1d, 0xf1, 0xa8, - 0x27, 0x4b, 0x9e, 0x13, 0x31, 0x1f, 0x07, 0xb1, 0x0a, 0x99, 0xaf, 0x79, 0x23, 0x05, 0xc3, 0x5d, - 0xd8, 0x68, 0x45, 0x7e, 0x14, 0x0b, 0xd1, 0xc2, 0x17, 0xe6, 0x95, 0xe4, 0x83, 0x44, 0x8a, 0xa5, - 0xb3, 0xe9, 0xe1, 0x67, 0x03, 0xaf, 0xd5, 0x44, 0x5f, 0x04, 0xa0, 0xcb, 0x47, 0xe8, 0x12, 0x46, - 0xf2, 0x0f, 0x4f, 0x7a, 0xaa, 0xb4, 0x32, 0xad, 0x3a, 0x99, 0x9f, 0x5e, 0x55, 0x11, 0xc1, 0x1a, - 0x41, 0xfb, 0x87, 0x4a, 0xf0, 0x78, 0x8f, 0x33, 0x12, 0x2d, 0x98, 0x4f, 0xa0, 0xcf, 0xa6, 0x85, - 0xeb, 0xb9, 0xcc, 0xca, 0x86, 0xb4, 0x9d, 0x5a, 0x8a, 0x85, 0x0f, 0xbc, 0x14, 0xbf, 0xdf, 0xd2, - 0xd4, 0x1e, 0xdc, 0x50, 0xef, 0x73, 0xc7, 0x3c, 0xfb, 0x4f, 0x50, 0x0f, 0xb2, 0x99, 0xa1, 0x4c, - 0xb8, 0x3e, 0x70, 0x77, 0x06, 0xd6, 0x2e, 0x9c, 0xae, 0xf2, 0xf7, 0x2b, 0x16, 0x3c, 0x99, 0xd9, - 0x5f, 0xc3, 0x64, 0xe3, 0x1a, 0x94, 0x9b, 0xb4, 0x50, 0x73, 0xcb, 0x4a, 0xfc, 0x55, 0x25, 0x00, - 0x27, 0x38, 0x86, 0x65, 0x46, 0xa1, 0xaf, 0x65, 0xc6, 0x3f, 0xb3, 0xa0, 0x6b, 0x7f, 0x9c, 0xc2, - 0x41, 0x5d, 0x33, 0x0f, 0xea, 0x8f, 0x0f, 0x32, 0x97, 0x39, 0x67, 0xf4, 0x7f, 0x9a, 0x82, 0xf3, - 0x39, 0x7e, 0x18, 0x7b, 0x30, 0xb3, 0xd5, 0x24, 0xa6, 0xc3, 0x9b, 0xf8, 0x98, 0x4c, 0xdf, 0xc0, - 0x9e, 0xde, 0x71, 0x2c, 0xf5, 0xce, 0x4c, 0x17, 0x0a, 0xee, 0x6e, 0x02, 0x7d, 0xc5, 0x82, 0xb3, - 0xce, 0xfd, 0xa8, 0x2b, 0xc1, 0xa2, 0x58, 0x33, 0x2f, 0x65, 0x2a, 0x41, 0xfa, 0x24, 0x64, 0xe4, - 0xb9, 0x88, 0xb2, 0xb0, 0x70, 0x66, 0x5b, 0x08, 0x8b, 0xf0, 0x98, 0x94, 0x9d, 0xef, 0xe1, 0x92, - 0x99, 0xe5, 0x30, 0xc3, 0x8f, 0x6c, 0x09, 0xc1, 0x8a, 0x0e, 0xba, 0x07, 0xe5, 0x2d, 0xe9, 0xc5, - 0x26, 0xae, 0x84, 0xcc, 0x3b, 0x36, 0xd3, 0xd5, 0x8d, 0x3f, 0x4b, 0x2a, 0x10, 0x4e, 0x48, 0xa1, - 0xd7, 0xa1, 0xe8, 0x6f, 0x46, 0xbd, 0x92, 0xf8, 0xa4, 0x2c, 0x99, 0xb8, 0xbb, 0xf3, 0xda, 0x4a, - 0x03, 0xd3, 0x8a, 0xe8, 0x26, 0x14, 0xc3, 0x8d, 0x96, 0xd0, 0xdb, 0x65, 0x9e, 0xdc, 0x78, 0xb1, - 0x9a, 0xbd, 0x48, 0x38, 0x25, 0xbc, 0x58, 0xc5, 0x94, 0x04, 0xaa, 0xc3, 0x10, 0x73, 0x59, 0x10, - 0xb7, 0x40, 0x26, 0xbf, 0xdb, 0xc3, 0xf5, 0x87, 0xfb, 0x44, 0x33, 0x04, 0xcc, 0x09, 0xa1, 0x75, - 0x18, 0x6e, 0xb2, 0x84, 0x2f, 0x22, 0x22, 0xf3, 0xa7, 0x32, 0x35, 0x74, 0x3d, 0x32, 0xe1, 0x08, - 0x85, 0x15, 0xc3, 0xc0, 0x82, 0x16, 0xa3, 0x4a, 0xda, 0xdb, 0x9b, 0x11, 0x93, 0xf0, 0xf3, 0xa8, - 0xf6, 0x48, 0xf0, 0x24, 0xa8, 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xcf, 0x42, 0x61, 0xb3, 0x29, 0x3c, - 0x1a, 0x32, 0x55, 0x75, 0xa6, 0xc7, 0xfa, 0xe2, 0xf0, 0xe1, 0x41, 0xa5, 0xb0, 0xb2, 0x84, 0x0b, - 0x9b, 0x4d, 0xb4, 0x06, 0x23, 0x9b, 0xdc, 0xc7, 0x55, 0x68, 0xe3, 0x9e, 0xce, 0x76, 0xbf, 0xed, - 0x72, 0x83, 0xe5, 0x96, 0xf8, 0x02, 0x80, 0x25, 0x11, 0x16, 0x63, 0x52, 0xf9, 0xea, 0x8a, 0x60, - 0xcb, 0xf3, 0xc7, 0xf3, 0xaf, 0xe6, 0xb7, 0x72, 0xe2, 0xf1, 0x8b, 0x35, 0x8a, 0xe8, 0xcb, 0x50, - 0x76, 0x64, 0x6a, 0x3f, 0x11, 0x8c, 0xe2, 0xc5, 0xcc, 0x8d, 0xd9, 0x3b, 0xeb, 0x21, 0x5f, 0xd5, - 0x0a, 0x09, 0x27, 0x44, 0xd1, 0x0e, 0x4c, 0xec, 0x45, 0xed, 0x6d, 0x22, 0x37, 0x32, 0x8b, 0x4d, - 0x91, 0x73, 0x71, 0xdd, 0x13, 0x88, 0x6e, 0x18, 0x77, 0x1c, 0xaf, 0xeb, 0xec, 0x61, 0x6f, 0xd9, - 0xf7, 0x74, 0x62, 0xd8, 0xa4, 0x4d, 0x87, 0xff, 0xbd, 0x4e, 0xb0, 0xb1, 0x1f, 0x13, 0x11, 0x9d, - 0x39, 0x73, 0xf8, 0xdf, 0xe4, 0x28, 0xdd, 0xc3, 0x2f, 0x00, 0x58, 0x12, 0xa1, 0x5b, 0xdd, 0x91, - 0x69, 0x33, 0x59, 0x54, 0xe6, 0x9c, 0xad, 0x9e, 0x99, 0x5b, 0x53, 0x1b, 0x14, 0x76, 0x46, 0x26, - 0xa4, 0xd8, 0xd9, 0xd8, 0xde, 0x0e, 0xe2, 0xc0, 0x4f, 0x9d, 0xcb, 0x33, 0xf9, 0x67, 0x63, 0x3d, - 0x03, 0xbf, 0xfb, 0x6c, 0xcc, 0xc2, 0xc2, 0x99, 0x6d, 0xa1, 0x16, 0x4c, 0xb6, 0x83, 0x30, 0xbe, - 0x1f, 0x84, 0x72, 0x7d, 0xa1, 0x1e, 0xda, 0x04, 0x03, 0x53, 0xb4, 0xc8, 0xa2, 0x85, 0x9b, 0x10, - 0x9c, 0xa2, 0x89, 0x3e, 0x0f, 0x23, 0x51, 0xd3, 0xf1, 0x48, 0xed, 0xce, 0xec, 0x99, 0xfc, 0x4b, - 0xa7, 0xc1, 0x51, 0x72, 0x56, 0x17, 0x9b, 0x1c, 0x81, 0x82, 0x25, 0x39, 0xb4, 0x02, 0x43, 0x2c, - 0xe4, 0x3f, 0x0b, 0x2c, 0x9d, 0x13, 0xf4, 0xa8, 0xcb, 0x66, 0x94, 0x9f, 0x4d, 0xac, 0x18, 0xf3, - 0xea, 0x74, 0x0f, 0x08, 0xa6, 0x3a, 0x88, 0x66, 0xcf, 0xe5, 0xef, 0x01, 0xc1, 0x8b, 0xdf, 0x69, - 0xf4, 0xda, 0x03, 0x0a, 0x09, 0x27, 0x44, 0xe9, 0xc9, 0x4c, 0x4f, 0xd3, 0xf3, 0x3d, 0xcc, 0x58, - 0x72, 0xcf, 0x52, 0x76, 0x32, 0xd3, 0x93, 0x94, 0x92, 0xb0, 0x7f, 0x77, 0xa4, 0x9b, 0x53, 0x61, - 0x62, 0xd8, 0x9f, 0xb7, 0xba, 0x5e, 0xe8, 0x3e, 0x3d, 0xa8, 0x56, 0xe8, 0x04, 0x79, 0xd4, 0xaf, - 0x58, 0x70, 0xbe, 0x9d, 0xf9, 0x21, 0xe2, 0xda, 0x1f, 0x4c, 0xb9, 0xc4, 0x3f, 0x5d, 0x05, 0x7f, - 0xcf, 0x86, 0xe3, 0x9c, 0x96, 0xd2, 0x72, 0x40, 0xf1, 0x03, 0xcb, 0x01, 0xab, 0x30, 0xca, 0x58, - 0xcb, 0x3e, 0x09, 0xd0, 0xd2, 0xe2, 0x10, 0x63, 0x20, 0x96, 0x44, 0x45, 0xac, 0x48, 0xa0, 0x1f, - 0xb0, 0xe0, 0x62, 0xba, 0xeb, 0x98, 0x30, 0xb0, 0x08, 0x95, 0xce, 0x25, 0xc0, 0x15, 0xf1, 0xfd, - 0x17, 0xeb, 0xbd, 0x90, 0x8f, 0xfa, 0x21, 0xe0, 0xde, 0x8d, 0xa1, 0x6a, 0x86, 0x08, 0x3a, 0x6c, - 0xaa, 0xdd, 0x07, 0x10, 0x43, 0x5f, 0x82, 0xf1, 0xdd, 0xa0, 0xe3, 0xc7, 0xc2, 0xea, 0x45, 0xf8, - 0x20, 0xb2, 0x67, 0xe6, 0x55, 0xad, 0x1c, 0x1b, 0x58, 0x29, 0xe1, 0x75, 0xf4, 0xa1, 0x85, 0xd7, - 0x77, 0x52, 0x69, 0xae, 0xcb, 0xf9, 0x21, 0xf9, 0x84, 0x9c, 0x7f, 0x8c, 0x64, 0xd7, 0xa7, 0x2b, - 0x11, 0xfd, 0xb4, 0x95, 0xc1, 0xca, 0x73, 0x19, 0xf9, 0x35, 0x53, 0x46, 0xbe, 0x92, 0x96, 0x91, - 0xbb, 0x54, 0xae, 0x86, 0x78, 0x3c, 0x78, 0x5c, 0xe7, 0x41, 0x03, 0xa5, 0xd9, 0x1e, 0x5c, 0xee, - 0x77, 0x2d, 0x31, 0xf3, 0xa7, 0x96, 0x7a, 0x60, 0x4b, 0xcc, 0x9f, 0x5a, 0xb5, 0x2a, 0x66, 0x90, - 0x41, 0x23, 0x69, 0xd8, 0xff, 0xd5, 0x82, 0x62, 0x3d, 0x68, 0x9d, 0x82, 0x0a, 0xf9, 0x73, 0x86, - 0x0a, 0xf9, 0xf1, 0x9c, 0xf4, 0xe3, 0xb9, 0x0a, 0xe3, 0xe5, 0x94, 0xc2, 0xf8, 0x62, 0x1e, 0x81, - 0xde, 0xea, 0xe1, 0x9f, 0x28, 0x82, 0x9e, 0x2c, 0x1d, 0xfd, 0xc6, 0xc3, 0xd8, 0x1e, 0x17, 0x7b, - 0xe5, 0x4f, 0x17, 0x94, 0x99, 0xd5, 0x94, 0x74, 0xab, 0xfb, 0x53, 0x66, 0x82, 0xfc, 0x16, 0x71, - 0xb7, 0xb6, 0x63, 0xd2, 0x4a, 0x7f, 0xce, 0xe9, 0x99, 0x20, 0xff, 0x67, 0x0b, 0xa6, 0x52, 0xad, - 0x23, 0x0f, 0x26, 0x3c, 0x5d, 0xff, 0x27, 0xd6, 0xe9, 0x43, 0xa9, 0x0e, 0x85, 0x09, 0xa7, 0x56, - 0x84, 0x4d, 0xe2, 0x68, 0x1e, 0x40, 0xbd, 0xcf, 0x49, 0xbd, 0x17, 0xe3, 0xfa, 0xd5, 0x03, 0x5e, - 0x84, 0x35, 0x0c, 0xf4, 0x32, 0x8c, 0xc5, 0x41, 0x3b, 0xf0, 0x82, 0xad, 0xfd, 0x5b, 0x44, 0xc6, - 0x6e, 0x51, 0x86, 0x59, 0xeb, 0x09, 0x08, 0xeb, 0x78, 0xf6, 0x4f, 0x15, 0x21, 0x9d, 0x60, 0xff, - 0x9b, 0x6b, 0xf2, 0xa3, 0xb9, 0x26, 0xbf, 0x61, 0xc1, 0x34, 0x6d, 0x9d, 0x19, 0x89, 0xc8, 0xcb, - 0x56, 0xe5, 0x97, 0xb1, 0x7a, 0xe4, 0x97, 0xb9, 0x42, 0xcf, 0xae, 0x56, 0xd0, 0x89, 0x85, 0xde, - 0x4c, 0x3b, 0x9c, 0x68, 0x29, 0x16, 0x50, 0x81, 0x47, 0xc2, 0x50, 0x78, 0x3e, 0xe9, 0x78, 0x24, - 0x0c, 0xb1, 0x80, 0xca, 0xf4, 0x33, 0xa5, 0x9c, 0xf4, 0x33, 0x2c, 0x12, 0x9d, 0x30, 0x27, 0x10, - 0x6c, 0x8f, 0x16, 0x89, 0x4e, 0xda, 0x19, 0x24, 0x38, 0xf6, 0xcf, 0x15, 0x61, 0xbc, 0x1e, 0xb4, - 0x92, 0x17, 0xb2, 0x97, 0x8c, 0x17, 0xb2, 0xcb, 0xa9, 0x17, 0xb2, 0x69, 0x1d, 0xf7, 0x9b, 0xef, - 0x61, 0x1f, 0xd6, 0x7b, 0xd8, 0x3f, 0xb5, 0xd8, 0xac, 0x55, 0xd7, 0x1a, 0x22, 0xfd, 0xed, 0x0b, - 0x30, 0xc6, 0x0e, 0x24, 0xe6, 0x6a, 0x27, 0x9f, 0x8d, 0x58, 0x64, 0xf9, 0xb5, 0xa4, 0x18, 0xeb, - 0x38, 0xe8, 0x2a, 0x8c, 0x46, 0xc4, 0x09, 0x9b, 0xdb, 0xea, 0x8c, 0x13, 0x8f, 0x2a, 0xbc, 0x0c, - 0x2b, 0x28, 0x7a, 0x33, 0x09, 0x82, 0x56, 0xcc, 0x4f, 0xe4, 0xaa, 0xf7, 0x87, 0x6f, 0x91, 0xfc, - 0xc8, 0x67, 0xf6, 0x5b, 0x80, 0xba, 0xf1, 0x07, 0x08, 0x77, 0x54, 0x31, 0xc3, 0x1d, 0x95, 0xbb, - 0x42, 0x1d, 0xfd, 0xb1, 0x05, 0x93, 0xf5, 0xa0, 0x45, 0xb7, 0xee, 0x9f, 0xa5, 0x7d, 0xaa, 0x47, - 0x80, 0x1c, 0xee, 0x11, 0x01, 0xf2, 0xef, 0x58, 0x30, 0x52, 0x0f, 0x5a, 0xa7, 0xa0, 0x6d, 0x7f, - 0xcd, 0xd4, 0xb6, 0x3f, 0x96, 0xb3, 0x24, 0x72, 0x14, 0xec, 0xbf, 0x50, 0x84, 0x09, 0xda, 0xcf, - 0x60, 0x4b, 0xce, 0x92, 0x31, 0x22, 0xd6, 0x00, 0x23, 0x42, 0xd9, 0xdc, 0xc0, 0xf3, 0x82, 0xfb, - 0xe9, 0x19, 0x5b, 0x61, 0xa5, 0x58, 0x40, 0xd1, 0x73, 0x30, 0xda, 0x0e, 0xc9, 0x9e, 0x1b, 0x08, - 0xfe, 0x51, 0x7b, 0xbb, 0xa8, 0x8b, 0x72, 0xac, 0x30, 0xa8, 0xdc, 0x15, 0xb9, 0x7e, 0x93, 0xc8, - 0x2c, 0xd2, 0x25, 0x96, 0x68, 0x8a, 0x87, 0x76, 0xd6, 0xca, 0xb1, 0x81, 0x85, 0xde, 0x82, 0x32, - 0xfb, 0xcf, 0x4e, 0x94, 0xe3, 0x27, 0xc6, 0x11, 0xf9, 0x14, 0x04, 0x01, 0x9c, 0xd0, 0x42, 0xd7, - 0x01, 0x62, 0x19, 0xfe, 0x37, 0x12, 0x51, 0x6b, 0x14, 0xaf, 0xad, 0x02, 0x03, 0x47, 0x58, 0xc3, - 0x42, 0xcf, 0x42, 0x39, 0x76, 0x5c, 0xef, 0xb6, 0xeb, 0x93, 0x88, 0xa9, 0x9c, 0x8b, 0x32, 0x5d, - 0x82, 0x28, 0xc4, 0x09, 0x9c, 0xf2, 0x3a, 0xcc, 0xa5, 0x9b, 0xa7, 0xd5, 0x1a, 0x65, 0xd8, 0x8c, - 0xd7, 0xb9, 0xad, 0x4a, 0xb1, 0x86, 0x61, 0xbf, 0x02, 0xe7, 0xea, 0x41, 0xab, 0x1e, 0x84, 0xf1, - 0x4a, 0x10, 0xde, 0x77, 0xc2, 0x96, 0x9c, 0xbf, 0x8a, 0x8c, 0xdc, 0x4f, 0xcf, 0x9e, 0x21, 0xbe, - 0x33, 0x8d, 0x98, 0xfc, 0x2f, 0x32, 0x6e, 0xe7, 0x98, 0xae, 0x1c, 0x4d, 0x76, 0xef, 0xaa, 0x0c, - 0x7a, 0x37, 0x9c, 0x98, 0xa0, 0x3b, 0x2c, 0xeb, 0x56, 0x72, 0x05, 0x89, 0xea, 0xcf, 0x68, 0x59, - 0xb7, 0x12, 0x60, 0xe6, 0x9d, 0x65, 0xd6, 0xb7, 0x7f, 0xb5, 0xc8, 0x4e, 0xa3, 0x54, 0x42, 0x39, - 0xf4, 0x25, 0x98, 0x8c, 0xc8, 0x6d, 0xd7, 0xef, 0x3c, 0x90, 0x42, 0x78, 0x0f, 0x67, 0x9c, 0xc6, - 0xb2, 0x8e, 0xc9, 0x55, 0x79, 0x66, 0x19, 0x4e, 0x51, 0xa3, 0xf3, 0x14, 0x76, 0xfc, 0x85, 0xe8, - 0x6e, 0x44, 0x42, 0x91, 0xd0, 0x8c, 0xcd, 0x13, 0x96, 0x85, 0x38, 0x81, 0xd3, 0x75, 0xc9, 0xfe, - 0xac, 0x05, 0x3e, 0x0e, 0x82, 0x58, 0xae, 0x64, 0x96, 0x12, 0x47, 0x2b, 0xc7, 0x06, 0x16, 0x5a, - 0x01, 0x14, 0x75, 0xda, 0x6d, 0x8f, 0x3d, 0xe7, 0x3b, 0xde, 0x8d, 0x30, 0xe8, 0xb4, 0xf9, 0x5b, - 0x67, 0x71, 0xf1, 0x3c, 0xbd, 0xc2, 0x1a, 0x5d, 0x50, 0x9c, 0x51, 0x83, 0x9e, 0x3e, 0x9b, 0x11, - 0xfb, 0xcd, 0x56, 0x77, 0x51, 0xa8, 0xd7, 0x1b, 0xac, 0x08, 0x4b, 0x18, 0x5d, 0x4c, 0xac, 0x79, - 0x8e, 0x39, 0x9c, 0x2c, 0x26, 0xac, 0x4a, 0xb1, 0x86, 0x81, 0x96, 0x61, 0x24, 0xda, 0x8f, 0x9a, - 0xb1, 0x88, 0xb1, 0x94, 0x93, 0x9a, 0xb2, 0xc1, 0x50, 0xb4, 0x74, 0x09, 0xbc, 0x0a, 0x96, 0x75, - 0xed, 0xef, 0x62, 0x97, 0x21, 0x4b, 0x7f, 0x15, 0x77, 0x42, 0x82, 0x76, 0x61, 0xa2, 0xcd, 0xa6, - 0x5c, 0x04, 0x67, 0x16, 0xf3, 0xf6, 0xd2, 0x80, 0x52, 0xed, 0x7d, 0x7a, 0xd0, 0x28, 0xad, 0x13, - 0x13, 0x17, 0xea, 0x3a, 0x39, 0x6c, 0x52, 0xb7, 0xff, 0xd5, 0x0c, 0x3b, 0x73, 0x1b, 0x5c, 0x54, - 0x1d, 0x11, 0x06, 0xc5, 0x82, 0x2f, 0x9f, 0xcb, 0xd7, 0x99, 0x24, 0x5f, 0x24, 0x8c, 0x92, 0xb1, - 0xac, 0x8b, 0xde, 0x64, 0x6f, 0xd3, 0xfc, 0xa0, 0xeb, 0x97, 0x85, 0x98, 0x63, 0x19, 0xcf, 0xd0, - 0xa2, 0x22, 0xd6, 0x88, 0xa0, 0xdb, 0x30, 0x21, 0xb2, 0x25, 0x09, 0xa5, 0x58, 0xd1, 0x50, 0x7a, - 0x4c, 0x60, 0x1d, 0x78, 0x94, 0x2e, 0xc0, 0x66, 0x65, 0xb4, 0x05, 0x17, 0xb5, 0xd4, 0x81, 0x37, - 0x42, 0x87, 0xbd, 0x57, 0xba, 0x6c, 0x13, 0x69, 0xe7, 0xe6, 0x93, 0x87, 0x07, 0x95, 0x8b, 0xeb, - 0xbd, 0x10, 0x71, 0x6f, 0x3a, 0xe8, 0x0e, 0x9c, 0xe3, 0x7e, 0x7b, 0x55, 0xe2, 0xb4, 0x3c, 0xd7, - 0x57, 0x07, 0x33, 0x5f, 0x87, 0x17, 0x0e, 0x0f, 0x2a, 0xe7, 0x16, 0xb2, 0x10, 0x70, 0x76, 0x3d, - 0xf4, 0x1a, 0x94, 0x5b, 0x7e, 0x24, 0xc6, 0x60, 0xd8, 0xc8, 0x8a, 0x59, 0xae, 0xae, 0x35, 0xd4, - 0xf7, 0x27, 0x7f, 0x70, 0x52, 0x01, 0x6d, 0x71, 0xc5, 0x98, 0x92, 0x43, 0x47, 0xf2, 0x33, 0xa0, - 0x8b, 0x25, 0x61, 0x78, 0xee, 0x70, 0x8d, 0xb0, 0xb2, 0x7c, 0x35, 0x9c, 0x7a, 0x0c, 0xc2, 0xe8, - 0x0d, 0x40, 0x94, 0x51, 0x73, 0x9b, 0x64, 0xa1, 0xc9, 0x62, 0x64, 0x33, 0x3d, 0xe2, 0xa8, 0xe1, - 0x29, 0x81, 0x1a, 0x5d, 0x18, 0x38, 0xa3, 0x16, 0xba, 0x49, 0x0f, 0x32, 0xbd, 0x54, 0x58, 0xf0, - 0x4a, 0xe6, 0x7e, 0xb6, 0x4a, 0xda, 0x21, 0x69, 0x3a, 0x31, 0x69, 0x99, 0x14, 0x71, 0xaa, 0x1e, - 0xbd, 0x4b, 0x55, 0xba, 0x1c, 0x30, 0x03, 0x61, 0x74, 0xa7, 0xcc, 0xa1, 0x72, 0xf1, 0x76, 0x10, - 0xc5, 0x6b, 0x24, 0xbe, 0x1f, 0x84, 0x3b, 0x22, 0xee, 0x58, 0x12, 0x02, 0x33, 0x01, 0x61, 0x1d, - 0x8f, 0xf2, 0xc1, 0xec, 0x71, 0xb8, 0x56, 0x65, 0x2f, 0x74, 0xa3, 0xc9, 0x3e, 0xb9, 0xc9, 0x8b, - 0xb1, 0x84, 0x4b, 0xd4, 0x5a, 0x7d, 0x89, 0xbd, 0xb6, 0xa5, 0x50, 0x6b, 0xf5, 0x25, 0x2c, 0xe1, - 0x88, 0x74, 0x67, 0x1c, 0x9d, 0xcc, 0xd7, 0x6a, 0x76, 0x5f, 0x07, 0x03, 0x26, 0x1d, 0xf5, 0x61, - 0x5a, 0xe5, 0x3a, 0xe5, 0x01, 0xd9, 0xa2, 0xd9, 0x29, 0xb6, 0x48, 0x06, 0x8f, 0xe6, 0xa6, 0xf4, - 0xc4, 0xb5, 0x14, 0x25, 0xdc, 0x45, 0xdb, 0x08, 0x4d, 0x32, 0xdd, 0x37, 0xdd, 0xd1, 0x35, 0x28, - 0x47, 0x9d, 0x8d, 0x56, 0xb0, 0xeb, 0xb8, 0x3e, 0x7b, 0x1c, 0xd3, 0x98, 0xac, 0x86, 0x04, 0xe0, - 0x04, 0x07, 0xad, 0xc0, 0xa8, 0x23, 0x95, 0xc0, 0x28, 0x3f, 0x56, 0x81, 0x52, 0xfd, 0x72, 0xf7, - 0x5d, 0xa9, 0xf6, 0x55, 0x75, 0xd1, 0xab, 0x30, 0x21, 0xbc, 0xb5, 0x78, 0x04, 0x07, 0xf6, 0x78, - 0xa5, 0x99, 0xe3, 0x37, 0x74, 0x20, 0x36, 0x71, 0xd1, 0x17, 0x61, 0x92, 0x52, 0x49, 0x0e, 0xb6, - 0xd9, 0xb3, 0x83, 0x9c, 0x88, 0x5a, 0x1a, 0x0b, 0xbd, 0x32, 0x4e, 0x11, 0x43, 0x2d, 0x78, 0xc2, - 0xe9, 0xc4, 0x01, 0x53, 0xa4, 0x9b, 0xeb, 0x7f, 0x3d, 0xd8, 0x21, 0x3e, 0x7b, 0xc3, 0x1a, 0x5d, - 0xbc, 0x7c, 0x78, 0x50, 0x79, 0x62, 0xa1, 0x07, 0x1e, 0xee, 0x49, 0x05, 0xdd, 0x85, 0xb1, 0x38, - 0xf0, 0x98, 0x61, 0x3c, 0x65, 0x25, 0xce, 0xe7, 0x87, 0xf6, 0x59, 0x57, 0x68, 0xba, 0x12, 0x49, - 0x55, 0xc5, 0x3a, 0x1d, 0xb4, 0xce, 0xf7, 0x18, 0x0b, 0x7a, 0x4a, 0xa2, 0xd9, 0xc7, 0xf2, 0x07, - 0x46, 0xc5, 0x46, 0x35, 0xb7, 0xa0, 0xa8, 0x89, 0x75, 0x32, 0xe8, 0x06, 0xcc, 0xb4, 0x43, 0x37, - 0x60, 0x0b, 0x5b, 0x3d, 0x62, 0xcc, 0x9a, 0x99, 0x0b, 0xea, 0x69, 0x04, 0xdc, 0x5d, 0x87, 0x0a, - 0x99, 0xb2, 0x70, 0xf6, 0x02, 0x4f, 0x83, 0xc5, 0x19, 0x6f, 0x5e, 0x86, 0x15, 0x14, 0xad, 0xb2, - 0x73, 0x99, 0x8b, 0x83, 0xb3, 0x73, 0xf9, 0x31, 0x1e, 0x74, 0xb1, 0x91, 0xf3, 0x4b, 0xea, 0x2f, - 0x4e, 0x28, 0xd0, 0x7b, 0x23, 0xda, 0x76, 0x42, 0x52, 0x0f, 0x83, 0x26, 0xe1, 0x9d, 0xe1, 0x36, - 0xf9, 0x8f, 0xf3, 0xd8, 0x8c, 0xf4, 0xde, 0x68, 0x64, 0x21, 0xe0, 0xec, 0x7a, 0xa8, 0xa5, 0x65, - 0x7f, 0xa6, 0x6c, 0x68, 0x34, 0xfb, 0x44, 0x0f, 0x33, 0xa3, 0x14, 0xcf, 0x9a, 0xac, 0x45, 0xa3, - 0x38, 0xc2, 0x29, 0x9a, 0xe8, 0xdb, 0x60, 0x5a, 0x84, 0x32, 0x4a, 0xc6, 0xfd, 0x62, 0x62, 0xbf, - 0x88, 0x53, 0x30, 0xdc, 0x85, 0x3d, 0xf7, 0xad, 0x30, 0xd3, 0x75, 0xe3, 0x1c, 0x2b, 0xb0, 0xf8, - 0x1f, 0x0d, 0x41, 0x59, 0x29, 0xd3, 0xd1, 0x35, 0xf3, 0x8d, 0xe4, 0x42, 0xfa, 0x8d, 0x64, 0x94, - 0xf2, 0xf4, 0xfa, 0xb3, 0xc8, 0xba, 0x61, 0x56, 0x57, 0xc8, 0x4f, 0xe3, 0xa5, 0x73, 0xe5, 0x7d, - 0x5d, 0xf4, 0x34, 0xdd, 0x48, 0x71, 0xe0, 0xc7, 0x96, 0x52, 0x4f, 0x75, 0xcb, 0x80, 0x59, 0x74, - 0xd1, 0x53, 0x54, 0xb0, 0x69, 0xd5, 0xea, 0xe9, 0xb4, 0x92, 0x75, 0x5a, 0x88, 0x39, 0x8c, 0x09, - 0x80, 0x94, 0x3d, 0x62, 0x02, 0xe0, 0xc8, 0x43, 0x0a, 0x80, 0x92, 0x00, 0x4e, 0x68, 0x21, 0x0f, - 0x66, 0x9a, 0x66, 0x46, 0x50, 0xe5, 0x96, 0xf7, 0x54, 0xdf, 0xdc, 0x9c, 0x1d, 0x2d, 0xfd, 0xda, - 0x52, 0x9a, 0x0a, 0xee, 0x26, 0x8c, 0x5e, 0x85, 0xd1, 0xf7, 0x82, 0x88, 0x2d, 0x26, 0xc1, 0x23, - 0x48, 0xf7, 0xa5, 0xd1, 0x37, 0xef, 0x34, 0x58, 0xf9, 0xd1, 0x41, 0x65, 0xac, 0x1e, 0xb4, 0xe4, - 0x5f, 0xac, 0x2a, 0xa0, 0x07, 0x70, 0xce, 0x38, 0x59, 0x55, 0x77, 0x61, 0xf0, 0xee, 0x5e, 0x14, - 0xcd, 0x9d, 0xab, 0x65, 0x51, 0xc2, 0xd9, 0x0d, 0xd0, 0xe3, 0xca, 0x0f, 0x44, 0x36, 0x5d, 0xc9, - 0x87, 0x30, 0x76, 0xa3, 0xac, 0x3b, 0xaf, 0xa7, 0x10, 0x70, 0x77, 0x1d, 0xfb, 0x97, 0xf9, 0xdb, - 0x83, 0xd0, 0x50, 0x92, 0xa8, 0xe3, 0x9d, 0x46, 0xb2, 0xa6, 0x65, 0x43, 0x79, 0xfa, 0xd0, 0xef, - 0x5b, 0xbf, 0x6e, 0xb1, 0xf7, 0xad, 0x75, 0xb2, 0xdb, 0xf6, 0xa8, 0x9c, 0xfc, 0xe8, 0x3b, 0xfe, - 0x26, 0x8c, 0xc6, 0xa2, 0xb5, 0x5e, 0xf9, 0xa5, 0xb4, 0x4e, 0xb1, 0x37, 0x3e, 0xc5, 0xa1, 0xc8, - 0x52, 0xac, 0xc8, 0xd8, 0xff, 0x98, 0xcf, 0x80, 0x84, 0x9c, 0x82, 0x22, 0xab, 0x6a, 0x2a, 0xb2, - 0x2a, 0x7d, 0xbe, 0x20, 0x47, 0xa1, 0xf5, 0x8f, 0xcc, 0x7e, 0x33, 0x61, 0xf0, 0xa3, 0xfe, 0xb0, - 0x6a, 0xff, 0xb0, 0x05, 0x67, 0xb3, 0x2c, 0x91, 0x28, 0x57, 0xc9, 0x45, 0x51, 0xf5, 0xd0, 0xac, - 0x46, 0xf0, 0x9e, 0x28, 0xc7, 0x0a, 0x63, 0xe0, 0xd4, 0x0d, 0xc7, 0x8b, 0xef, 0x76, 0x07, 0x26, - 0xea, 0x21, 0xd1, 0xee, 0x80, 0xd7, 0xb9, 0x1f, 0x1c, 0xef, 0xcf, 0x73, 0xc7, 0xf6, 0x81, 0xb3, - 0x7f, 0xa6, 0x00, 0x67, 0xf9, 0x4b, 0xd1, 0xc2, 0x5e, 0xe0, 0xb6, 0xea, 0x41, 0x4b, 0xa4, 0xdd, - 0x78, 0x1b, 0xc6, 0xdb, 0x9a, 0xfe, 0xa0, 0x57, 0x84, 0x29, 0x5d, 0xcf, 0x90, 0xc8, 0x71, 0x7a, - 0x29, 0x36, 0x68, 0xa1, 0x16, 0x8c, 0x93, 0x3d, 0xb7, 0xa9, 0x9e, 0x1b, 0x0a, 0xc7, 0xbe, 0x1b, - 0x54, 0x2b, 0xcb, 0x1a, 0x1d, 0x6c, 0x50, 0x7d, 0x04, 0x99, 0xd8, 0xec, 0x1f, 0xb1, 0xe0, 0xb1, - 0x9c, 0x78, 0x54, 0xb4, 0xb9, 0xfb, 0xec, 0x4d, 0x4e, 0x24, 0x75, 0x52, 0xcd, 0xf1, 0x97, 0x3a, - 0x2c, 0xa0, 0xe8, 0xf3, 0x00, 0xfc, 0xa5, 0x8d, 0x8a, 0x35, 0xfd, 0x02, 0xf7, 0x18, 0x31, 0x47, - 0xb4, 0x58, 0x11, 0xb2, 0x3e, 0xd6, 0x68, 0xd9, 0x3f, 0x59, 0x84, 0x21, 0xf6, 0xb2, 0x83, 0x56, - 0x60, 0x64, 0x9b, 0x47, 0x5f, 0x1e, 0x24, 0xd0, 0x73, 0x22, 0x1f, 0xf2, 0x02, 0x2c, 0x2b, 0xa3, - 0x55, 0x38, 0xc3, 0xa3, 0x57, 0x7b, 0x55, 0xe2, 0x39, 0xfb, 0x52, 0xcd, 0xc0, 0x13, 0x21, 0xa9, - 0xb8, 0x17, 0xb5, 0x6e, 0x14, 0x9c, 0x55, 0x0f, 0xbd, 0x0e, 0x93, 0x94, 0x2f, 0x0b, 0x3a, 0xb1, - 0xa4, 0xc4, 0xe3, 0x56, 0x2b, 0x46, 0x70, 0xdd, 0x80, 0xe2, 0x14, 0x36, 0x15, 0x98, 0xda, 0x5d, - 0x0a, 0x95, 0xa1, 0x44, 0x60, 0x32, 0x95, 0x28, 0x26, 0x2e, 0x33, 0x41, 0xea, 0x30, 0x83, 0xab, - 0xf5, 0xed, 0x90, 0x44, 0xdb, 0x81, 0xd7, 0x12, 0x79, 0xb4, 0x13, 0x13, 0xa4, 0x14, 0x1c, 0x77, - 0xd5, 0xa0, 0x54, 0x36, 0x1d, 0xd7, 0xeb, 0x84, 0x24, 0xa1, 0x32, 0x6c, 0x52, 0x59, 0x49, 0xc1, - 0x71, 0x57, 0x0d, 0xba, 0x8e, 0xce, 0x89, 0xc4, 0xd6, 0xd2, 0x1b, 0x5f, 0xd9, 0x95, 0x8d, 0x48, - 0xbf, 0xa4, 0x1e, 0xe1, 0x68, 0x84, 0xe5, 0x8d, 0x4a, 0x8d, 0xad, 0xe9, 0x01, 0x85, 0x47, 0x92, - 0xa4, 0xf2, 0x30, 0xe9, 0x95, 0x7f, 0xd7, 0x82, 0x33, 0x19, 0xf6, 0xab, 0xfc, 0xa8, 0xda, 0x72, - 0xa3, 0x58, 0x25, 0x7b, 0xd1, 0x8e, 0x2a, 0x5e, 0x8e, 0x15, 0x06, 0xdd, 0x0f, 0xfc, 0x30, 0x4c, - 0x1f, 0x80, 0xc2, 0x3e, 0x4c, 0x40, 0x8f, 0x77, 0x00, 0xa2, 0xcb, 0x50, 0xea, 0x44, 0x44, 0x06, - 0x92, 0x52, 0xe7, 0x37, 0xd3, 0x0c, 0x33, 0x08, 0x65, 0x4d, 0xb7, 0x94, 0x52, 0x56, 0x63, 0x4d, - 0xb9, 0xa6, 0x95, 0xc3, 0xec, 0xaf, 0x16, 0xe1, 0x42, 0xae, 0xa5, 0x3a, 0xed, 0xd2, 0x6e, 0xe0, - 0xbb, 0x71, 0xa0, 0x5e, 0x0d, 0x79, 0x28, 0x13, 0xd2, 0xde, 0x5e, 0x15, 0xe5, 0x58, 0x61, 0xa0, - 0x2b, 0x32, 0xc5, 0x7a, 0x3a, 0x9d, 0xcd, 0x62, 0xd5, 0xc8, 0xb2, 0x3e, 0x68, 0xaa, 0xb0, 0xa7, - 0xa0, 0xd4, 0x0e, 0x02, 0x2f, 0x7d, 0x18, 0xd1, 0xee, 0x06, 0x81, 0x87, 0x19, 0x10, 0x7d, 0x42, - 0x8c, 0x43, 0xea, 0x99, 0x0c, 0x3b, 0xad, 0x20, 0xd2, 0x06, 0xe3, 0x19, 0x18, 0xd9, 0x21, 0xfb, - 0xa1, 0xeb, 0x6f, 0xa5, 0x9f, 0x4f, 0x6f, 0xf1, 0x62, 0x2c, 0xe1, 0x66, 0x36, 0x87, 0x91, 0x93, - 0xce, 0xf1, 0x35, 0xda, 0xf7, 0x6a, 0xfb, 0xfe, 0x22, 0x4c, 0xe1, 0xc5, 0xea, 0x37, 0x27, 0xe2, - 0x6e, 0xf7, 0x44, 0x9c, 0x74, 0x8e, 0xaf, 0xfe, 0xb3, 0xf1, 0x0b, 0x16, 0x4c, 0xb1, 0x88, 0xc7, - 0x22, 0x80, 0x86, 0x1b, 0xf8, 0xa7, 0xc0, 0xba, 0x3d, 0x05, 0x43, 0x21, 0x6d, 0x34, 0x9d, 0xb8, - 0x87, 0xf5, 0x04, 0x73, 0x18, 0x7a, 0x02, 0x4a, 0xac, 0x0b, 0x74, 0xf2, 0xc6, 0x79, 0xce, 0x83, - 0xaa, 0x13, 0x3b, 0x98, 0x95, 0x32, 0xaf, 0x70, 0x4c, 0xda, 0x9e, 0xcb, 0x3b, 0x9d, 0x3c, 0x49, - 0x7c, 0x34, 0xbc, 0xc2, 0x33, 0xbb, 0xf6, 0xc1, 0xbc, 0xc2, 0xb3, 0x49, 0xf6, 0x16, 0x8b, 0xfe, - 0x5b, 0x01, 0x2e, 0x65, 0xd6, 0x1b, 0xd8, 0x2b, 0xbc, 0x77, 0xed, 0x93, 0xb1, 0x82, 0xc9, 0x36, - 0x4e, 0x29, 0x9e, 0xa2, 0x71, 0x4a, 0x69, 0x50, 0xce, 0x71, 0x68, 0x00, 0x67, 0xed, 0xcc, 0x21, - 0xfb, 0x88, 0x38, 0x6b, 0x67, 0xf6, 0x2d, 0x47, 0xac, 0xfb, 0x93, 0x42, 0xce, 0xb7, 0x30, 0x01, - 0xef, 0x2a, 0x3d, 0x67, 0x18, 0x30, 0x12, 0x9c, 0xf0, 0x38, 0x3f, 0x63, 0x78, 0x19, 0x56, 0x50, - 0xe4, 0x6a, 0x6e, 0xcf, 0x85, 0xfc, 0xb4, 0x8e, 0xb9, 0x4d, 0xcd, 0x9b, 0x2f, 0x48, 0x6a, 0x08, - 0x32, 0x5c, 0xa0, 0x57, 0x35, 0xa1, 0xbc, 0x38, 0xb8, 0x50, 0x3e, 0x9e, 0x2d, 0x90, 0xa3, 0x05, - 0x98, 0xda, 0x75, 0x7d, 0x96, 0xa6, 0xdf, 0x64, 0x45, 0x55, 0x14, 0x90, 0x55, 0x13, 0x8c, 0xd3, - 0xf8, 0x73, 0xaf, 0xc2, 0xc4, 0xc3, 0xab, 0x23, 0xbf, 0x51, 0x84, 0xc7, 0x7b, 0x6c, 0x7b, 0x7e, - 0xd6, 0x1b, 0x73, 0xa0, 0x9d, 0xf5, 0x5d, 0xf3, 0x50, 0x87, 0xb3, 0x9b, 0x1d, 0xcf, 0xdb, 0x67, - 0xf6, 0x9f, 0xa4, 0x25, 0x31, 0x04, 0xaf, 0xf8, 0x84, 0xcc, 0x32, 0xb1, 0x92, 0x81, 0x83, 0x33, - 0x6b, 0xa2, 0x37, 0x00, 0x05, 0x22, 0xa7, 0xec, 0x0d, 0xe2, 0x0b, 0xbd, 0x3c, 0x1b, 0xf8, 0x62, - 0xb2, 0x19, 0xef, 0x74, 0x61, 0xe0, 0x8c, 0x5a, 0x94, 0xe9, 0xa7, 0xb7, 0xd2, 0xbe, 0xea, 0x56, - 0x8a, 0xe9, 0xc7, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x06, 0xcc, 0x38, 0x7b, 0x8e, 0xcb, 0xa3, 0xe3, - 0x49, 0x02, 0x9c, 0xeb, 0x57, 0x4a, 0xb0, 0x85, 0x34, 0x02, 0xee, 0xae, 0x93, 0x72, 0x8c, 0x1e, - 0xce, 0x77, 0x8c, 0xee, 0x7d, 0x2e, 0xf6, 0xd3, 0xe9, 0xda, 0xff, 0xde, 0xa2, 0xd7, 0x57, 0x46, - 0x5e, 0x78, 0x3a, 0x0e, 0x4a, 0x37, 0xa9, 0xf9, 0x28, 0x9f, 0xd3, 0x2c, 0x3c, 0x12, 0x20, 0x36, - 0x71, 0xf9, 0x82, 0x88, 0x12, 0x27, 0x19, 0x83, 0x75, 0x17, 0x31, 0x0e, 0x14, 0x06, 0xfa, 0x02, - 0x8c, 0xb4, 0xdc, 0x3d, 0x37, 0x0a, 0x42, 0xb1, 0x59, 0x8e, 0xe9, 0x6a, 0x90, 0x9c, 0x83, 0x55, - 0x4e, 0x06, 0x4b, 0x7a, 0xf6, 0xf7, 0x17, 0x60, 0x42, 0xb6, 0xf8, 0x66, 0x27, 0x88, 0x9d, 0x53, - 0xb8, 0x96, 0x6f, 0x18, 0xd7, 0xf2, 0x27, 0x7a, 0x05, 0x7a, 0x60, 0x5d, 0xca, 0xbd, 0x8e, 0xef, - 0xa4, 0xae, 0xe3, 0xa7, 0xfb, 0x93, 0xea, 0x7d, 0x0d, 0xff, 0x13, 0x0b, 0x66, 0x0c, 0xfc, 0x53, - 0xb8, 0x0d, 0x56, 0xcc, 0xdb, 0xe0, 0xc9, 0xbe, 0xdf, 0x90, 0x73, 0x0b, 0x7c, 0x4f, 0x31, 0xd5, - 0x77, 0x76, 0xfa, 0xbf, 0x07, 0xa5, 0x6d, 0x27, 0x6c, 0xf5, 0x0a, 0x28, 0xdb, 0x55, 0x69, 0xfe, - 0xa6, 0x13, 0xb6, 0xf8, 0x19, 0xfe, 0x9c, 0xca, 0x44, 0xe9, 0x84, 0xad, 0xbe, 0x3e, 0x61, 0xac, - 0x29, 0xf4, 0x0a, 0x0c, 0x47, 0xcd, 0xa0, 0xad, 0x2c, 0x36, 0x2f, 0xf3, 0x2c, 0x95, 0xb4, 0xe4, - 0xe8, 0xa0, 0x82, 0xcc, 0xe6, 0x68, 0x31, 0x16, 0xf8, 0xe8, 0x6d, 0x98, 0x60, 0xbf, 0x94, 0xe5, - 0x42, 0x31, 0x3f, 0x8d, 0x41, 0x43, 0x47, 0xe4, 0x06, 0x30, 0x46, 0x11, 0x36, 0x49, 0xcd, 0x6d, - 0x41, 0x59, 0x7d, 0xd6, 0x23, 0xf5, 0xe5, 0xf9, 0x37, 0x45, 0x38, 0x93, 0xb1, 0xe6, 0x50, 0x64, - 0xcc, 0xc4, 0x0b, 0x03, 0x2e, 0xd5, 0x0f, 0x38, 0x17, 0x11, 0x93, 0x86, 0x5a, 0x62, 0x6d, 0x0d, - 0xdc, 0xe8, 0xdd, 0x88, 0xa4, 0x1b, 0xa5, 0x45, 0xfd, 0x1b, 0xa5, 0x8d, 0x9d, 0xda, 0x50, 0xd3, - 0x86, 0x54, 0x4f, 0x1f, 0xe9, 0x9c, 0xfe, 0x61, 0x11, 0xce, 0x66, 0xc5, 0x9e, 0x41, 0xdf, 0x99, - 0x4a, 0x57, 0xf3, 0xd2, 0xa0, 0x51, 0x6b, 0x78, 0x0e, 0x1b, 0x91, 0x7c, 0x79, 0xde, 0x4c, 0x60, - 0xd3, 0x77, 0x98, 0x45, 0x9b, 0xcc, 0x01, 0x34, 0xe4, 0x69, 0x86, 0xe4, 0xf1, 0xf1, 0xe9, 0x81, - 0x3b, 0x20, 0xf2, 0x13, 0x45, 0x29, 0x07, 0x50, 0x59, 0xdc, 0xdf, 0x01, 0x54, 0xb6, 0x3c, 0xe7, - 0xc2, 0x98, 0xf6, 0x35, 0x8f, 0x74, 0xc6, 0x77, 0xe8, 0x6d, 0xa5, 0xf5, 0xfb, 0x91, 0xce, 0xfa, - 0x8f, 0x58, 0x90, 0x32, 0x8f, 0x54, 0xea, 0x2e, 0x2b, 0x57, 0xdd, 0x75, 0x19, 0x4a, 0x61, 0xe0, - 0x91, 0x74, 0x06, 0x19, 0x1c, 0x78, 0x04, 0x33, 0x08, 0xc5, 0x88, 0x13, 0x65, 0xc7, 0xb8, 0x2e, - 0xc8, 0x09, 0x11, 0xed, 0x29, 0x18, 0xf2, 0xc8, 0x1e, 0xf1, 0xd2, 0xe1, 0xd9, 0x6f, 0xd3, 0x42, - 0xcc, 0x61, 0xf6, 0x2f, 0x94, 0xe0, 0x62, 0x4f, 0x17, 0x6a, 0x2a, 0x0e, 0x6d, 0x39, 0x31, 0xb9, - 0xef, 0xec, 0xa7, 0xe3, 0x28, 0xdf, 0xe0, 0xc5, 0x58, 0xc2, 0x99, 0xc5, 0x38, 0x8f, 0x9b, 0x98, - 0x52, 0x0e, 0x8a, 0x70, 0x89, 0x02, 0xfa, 0x08, 0x12, 0xcf, 0x5f, 0x07, 0x88, 0x22, 0x6f, 0xd9, - 0xa7, 0xdc, 0x5d, 0x4b, 0x98, 0xa2, 0x27, 0xf1, 0x35, 0x1b, 0xb7, 0x05, 0x04, 0x6b, 0x58, 0xa8, - 0x0a, 0xd3, 0xed, 0x30, 0x88, 0xb9, 0xae, 0xb5, 0xca, 0x0d, 0x85, 0x86, 0x4c, 0xef, 0xd5, 0x7a, - 0x0a, 0x8e, 0xbb, 0x6a, 0xa0, 0x97, 0x61, 0x4c, 0x78, 0xb4, 0xd6, 0x83, 0xc0, 0x13, 0x6a, 0x20, - 0x65, 0x76, 0xd2, 0x48, 0x40, 0x58, 0xc7, 0xd3, 0xaa, 0x31, 0x05, 0xee, 0x48, 0x66, 0x35, 0xae, - 0xc4, 0xd5, 0xf0, 0x52, 0x71, 0xa8, 0x46, 0x07, 0x8a, 0x43, 0x95, 0x28, 0xc6, 0xca, 0x03, 0xbf, - 0x59, 0x41, 0x5f, 0x55, 0xd2, 0xcf, 0x96, 0xe0, 0x8c, 0x58, 0x38, 0x8f, 0x7a, 0xb9, 0x3c, 0xa2, - 0xf4, 0xf8, 0xdf, 0x5c, 0x33, 0xa7, 0xbd, 0x66, 0x7e, 0xc0, 0x02, 0x93, 0xbd, 0x42, 0xff, 0x5f, - 0x6e, 0x20, 0xfa, 0x97, 0x73, 0xd9, 0xb5, 0x96, 0xbc, 0x40, 0x3e, 0x60, 0x48, 0x7a, 0xfb, 0xdf, - 0x59, 0xf0, 0x64, 0x5f, 0x8a, 0x68, 0x19, 0xca, 0x8c, 0x07, 0xd4, 0xa4, 0xb3, 0xa7, 0x95, 0x21, - 0xa1, 0x04, 0xe4, 0xb0, 0xa4, 0x49, 0x4d, 0xb4, 0xdc, 0x15, 0xf1, 0xff, 0x99, 0x8c, 0x88, 0xff, - 0xe7, 0x8c, 0xe1, 0x79, 0xc8, 0x90, 0xff, 0xbf, 0x5c, 0x84, 0x61, 0xbe, 0xe2, 0x4f, 0x41, 0x0c, - 0x5b, 0x11, 0x7a, 0xdb, 0x1e, 0x91, 0xa8, 0x78, 0x5f, 0xe6, 0xab, 0x4e, 0xec, 0x70, 0x36, 0x41, - 0xdd, 0x56, 0x89, 0x86, 0x17, 0xcd, 0x1b, 0xf7, 0xd9, 0x5c, 0x4a, 0x31, 0x09, 0x9c, 0x86, 0x76, - 0xbb, 0x7d, 0x09, 0x20, 0x62, 0x99, 0xf0, 0x29, 0x0d, 0x11, 0xd3, 0xec, 0x93, 0x3d, 0x5a, 0x6f, - 0x28, 0x64, 0xde, 0x87, 0x64, 0xa7, 0x2b, 0x00, 0xd6, 0x28, 0xce, 0x7d, 0x06, 0xca, 0x0a, 0xb9, - 0x9f, 0x16, 0x67, 0x5c, 0x67, 0x2e, 0x3e, 0x07, 0x53, 0xa9, 0xb6, 0x8e, 0xa5, 0x04, 0xfa, 0x45, - 0x0b, 0xa6, 0x78, 0x97, 0x97, 0xfd, 0x3d, 0x71, 0xa6, 0xbe, 0x0f, 0x67, 0xbd, 0x8c, 0xb3, 0x4d, - 0xcc, 0xe8, 0xe0, 0x67, 0xa1, 0x52, 0xfa, 0x64, 0x41, 0x71, 0x66, 0x1b, 0xe8, 0x2a, 0x5d, 0xb7, - 0xf4, 0xec, 0x72, 0x3c, 0xe1, 0x7d, 0x34, 0xce, 0xd7, 0x2c, 0x2f, 0xc3, 0x0a, 0x6a, 0xff, 0xb6, - 0x05, 0x33, 0xbc, 0xe7, 0xb7, 0xc8, 0xbe, 0xda, 0xe1, 0x1f, 0x66, 0xdf, 0x45, 0x12, 0x8e, 0x42, - 0x4e, 0x12, 0x0e, 0xfd, 0xd3, 0x8a, 0x3d, 0x3f, 0xed, 0x67, 0x2c, 0x10, 0x2b, 0xf0, 0x14, 0x44, - 0xf9, 0x6f, 0x35, 0x45, 0xf9, 0xb9, 0xfc, 0x45, 0x9d, 0x23, 0xc3, 0xff, 0xb1, 0x05, 0xd3, 0x1c, - 0x21, 0x79, 0x4b, 0xfe, 0x50, 0xe7, 0x61, 0x90, 0x6c, 0x7a, 0x2a, 0x7d, 0x76, 0xf6, 0x47, 0x19, - 0x93, 0x55, 0xea, 0x39, 0x59, 0x2d, 0xb9, 0x81, 0x8e, 0x91, 0x25, 0xf2, 0xd8, 0xc1, 0xac, 0xed, - 0x3f, 0xb0, 0x00, 0xf1, 0x66, 0x0c, 0xf6, 0x87, 0x32, 0x15, 0xac, 0x54, 0xbb, 0x2e, 0x92, 0xa3, - 0x46, 0x41, 0xb0, 0x86, 0x75, 0x22, 0xc3, 0x93, 0x32, 0x08, 0x28, 0xf6, 0x37, 0x08, 0x38, 0xc6, - 0x88, 0xfe, 0xef, 0x12, 0xa4, 0xdd, 0x01, 0xd0, 0x3d, 0x18, 0x6f, 0x3a, 0x6d, 0x67, 0xc3, 0xf5, - 0xdc, 0xd8, 0x25, 0x51, 0x2f, 0x4b, 0xa2, 0x25, 0x0d, 0x4f, 0x3c, 0xf5, 0x6a, 0x25, 0xd8, 0xa0, - 0x83, 0xe6, 0x01, 0xda, 0xa1, 0xbb, 0xe7, 0x7a, 0x64, 0x8b, 0x69, 0x1c, 0x98, 0xbf, 0x23, 0x37, - 0x8f, 0x91, 0xa5, 0x58, 0xc3, 0xc8, 0x70, 0x5d, 0x2b, 0x3e, 0x3a, 0xd7, 0xb5, 0xd2, 0x31, 0x5d, - 0xd7, 0x86, 0x06, 0x72, 0x5d, 0xc3, 0x70, 0x5e, 0xb2, 0x48, 0xf4, 0xff, 0x8a, 0xeb, 0x11, 0xc1, - 0x17, 0x73, 0x2f, 0xc8, 0xb9, 0xc3, 0x83, 0xca, 0x79, 0x9c, 0x89, 0x81, 0x73, 0x6a, 0xa2, 0xcf, - 0xc3, 0xac, 0xe3, 0x79, 0xc1, 0x7d, 0x35, 0x6a, 0xcb, 0x51, 0xd3, 0xf1, 0xb8, 0xc6, 0x7e, 0x84, - 0x51, 0x7d, 0xe2, 0xf0, 0xa0, 0x32, 0xbb, 0x90, 0x83, 0x83, 0x73, 0x6b, 0xa7, 0x3c, 0xdf, 0x46, - 0xfb, 0x7a, 0xbe, 0xbd, 0x06, 0xe5, 0x76, 0x18, 0x34, 0x57, 0x35, 0x6f, 0x9c, 0x4b, 0x2c, 0x07, - 0xbd, 0x2c, 0x3c, 0x3a, 0xa8, 0x4c, 0xa8, 0x3f, 0xec, 0x86, 0x4f, 0x2a, 0xd8, 0x3b, 0x70, 0xa6, - 0x41, 0x42, 0x97, 0x65, 0xc0, 0x6c, 0x25, 0x1b, 0x7a, 0x1d, 0xca, 0x61, 0xea, 0x08, 0x1b, 0x28, - 0xb0, 0x92, 0x16, 0xe5, 0x57, 0x1e, 0x59, 0x09, 0x21, 0xfb, 0x8f, 0x2c, 0x18, 0x11, 0x0e, 0x0d, - 0xa7, 0xc0, 0x39, 0x2d, 0x18, 0x0a, 0xec, 0x4a, 0xf6, 0x31, 0xcf, 0x3a, 0x93, 0xab, 0xba, 0xae, - 0xa5, 0x54, 0xd7, 0x4f, 0xf6, 0x22, 0xd2, 0x5b, 0x69, 0xfd, 0x37, 0x8a, 0x30, 0x69, 0x3a, 0x73, - 0x9c, 0xc2, 0x10, 0xac, 0xc1, 0x48, 0x24, 0x3c, 0x87, 0x0a, 0xf9, 0x96, 0xd3, 0xe9, 0x49, 0x4c, - 0xcc, 0xa2, 0x84, 0xaf, 0x90, 0x24, 0x92, 0xe9, 0x92, 0x54, 0x7c, 0x84, 0x2e, 0x49, 0xfd, 0xfc, - 0x69, 0x4a, 0x27, 0xe1, 0x4f, 0x63, 0x7f, 0x8d, 0x5d, 0x35, 0x7a, 0xf9, 0x29, 0x70, 0x21, 0x37, - 0xcc, 0x4b, 0xc9, 0xee, 0xb1, 0xb2, 0x44, 0xa7, 0x72, 0xb8, 0x91, 0x9f, 0xb7, 0xe0, 0x62, 0xc6, - 0x57, 0x69, 0xac, 0xc9, 0x73, 0x30, 0xea, 0x74, 0x5a, 0xae, 0xda, 0xcb, 0xda, 0x33, 0xd6, 0x82, - 0x28, 0xc7, 0x0a, 0x03, 0x2d, 0xc1, 0x0c, 0x79, 0xd0, 0x76, 0xf9, 0x3b, 0xa2, 0x6e, 0xbb, 0x58, - 0xe4, 0x21, 0x66, 0x97, 0xd3, 0x40, 0xdc, 0x8d, 0xaf, 0xdc, 0xb1, 0x8b, 0xb9, 0xee, 0xd8, 0x7f, - 0xdf, 0x82, 0x31, 0xd1, 0xed, 0x53, 0x18, 0xed, 0x6f, 0x33, 0x47, 0xfb, 0xf1, 0x1e, 0xa3, 0x9d, - 0x33, 0xcc, 0x7f, 0xab, 0xa0, 0xfa, 0x5b, 0x0f, 0xc2, 0x78, 0x00, 0x96, 0xe7, 0x15, 0x18, 0x6d, - 0x87, 0x41, 0x1c, 0x34, 0x03, 0x4f, 0x70, 0x3c, 0x4f, 0x24, 0xd1, 0x02, 0x78, 0xf9, 0x91, 0xf6, - 0x1b, 0x2b, 0x6c, 0x36, 0x7a, 0x41, 0x18, 0x0b, 0x2e, 0x23, 0x19, 0xbd, 0x20, 0x8c, 0x31, 0x83, - 0xa0, 0x16, 0x40, 0xec, 0x84, 0x5b, 0x24, 0xa6, 0x65, 0x22, 0xf0, 0x48, 0xfe, 0xe1, 0xd1, 0x89, - 0x5d, 0x6f, 0xde, 0xf5, 0xe3, 0x28, 0x0e, 0xe7, 0x6b, 0x7e, 0x7c, 0x27, 0xe4, 0x02, 0x94, 0xe6, - 0xfe, 0xaf, 0x68, 0x61, 0x8d, 0xae, 0xf4, 0xd1, 0x64, 0x6d, 0x0c, 0x99, 0x0f, 0xe2, 0x6b, 0xa2, - 0x1c, 0x2b, 0x0c, 0xfb, 0x33, 0xec, 0x2a, 0x61, 0x03, 0x74, 0x3c, 0xcf, 0xfc, 0xaf, 0x8f, 0xaa, - 0xa1, 0x65, 0xaf, 0x61, 0x55, 0xdd, 0xff, 0xbf, 0xf7, 0xc9, 0x4d, 0x1b, 0xd6, 0xfd, 0x68, 0x92, - 0x20, 0x01, 0xe8, 0xdb, 0xbb, 0xec, 0x24, 0x9e, 0xef, 0x73, 0x05, 0x1c, 0xc3, 0x32, 0x82, 0x85, - 0xbd, 0x66, 0xe1, 0x81, 0x6b, 0x75, 0xb1, 0xc8, 0xb5, 0xb0, 0xd7, 0x02, 0x80, 0x13, 0x1c, 0x74, - 0x4d, 0x88, 0xdf, 0x25, 0x23, 0xf9, 0x9d, 0x14, 0xbf, 0xe5, 0xe7, 0x6b, 0xf2, 0xf7, 0x0b, 0x30, - 0xa6, 0x92, 0xe0, 0xd5, 0x79, 0x2e, 0x31, 0x11, 0x86, 0x65, 0x39, 0x29, 0xc6, 0x3a, 0x0e, 0x5a, - 0x87, 0xa9, 0x88, 0xeb, 0x5e, 0x54, 0xb4, 0x3d, 0xae, 0xc3, 0xfa, 0xa4, 0xb4, 0xaf, 0x68, 0x98, - 0xe0, 0x23, 0x56, 0xc4, 0x8f, 0x0e, 0xe9, 0x68, 0x99, 0x26, 0x81, 0x5e, 0x87, 0x49, 0x4f, 0x4f, - 0x25, 0x5f, 0x17, 0x2a, 0x2e, 0x65, 0x7e, 0x6c, 0x24, 0x9a, 0xaf, 0xe3, 0x14, 0x36, 0xe5, 0x94, - 0xf4, 0x12, 0x11, 0x21, 0xd2, 0xf1, 0xb7, 0x48, 0x24, 0x52, 0x78, 0x31, 0x4e, 0xe9, 0x76, 0x0e, - 0x0e, 0xce, 0xad, 0x8d, 0x5e, 0x81, 0x71, 0xf9, 0xf9, 0x9a, 0x1b, 0x71, 0x62, 0xe4, 0xae, 0xc1, - 0xb0, 0x81, 0x89, 0xee, 0xc3, 0x39, 0xf9, 0x7f, 0x3d, 0x74, 0x36, 0x37, 0xdd, 0xa6, 0xf0, 0xe2, - 0xe6, 0x9e, 0x3e, 0x0b, 0xd2, 0x75, 0x68, 0x39, 0x0b, 0xe9, 0xe8, 0xa0, 0x72, 0x59, 0x8c, 0x5a, - 0x26, 0x9c, 0x4d, 0x62, 0x36, 0x7d, 0xb4, 0x0a, 0x67, 0xb6, 0x89, 0xe3, 0xc5, 0xdb, 0x4b, 0xdb, - 0xa4, 0xb9, 0x23, 0x37, 0x11, 0x73, 0x4e, 0xd6, 0x4c, 0xc3, 0x6f, 0x76, 0xa3, 0xe0, 0xac, 0x7a, - 0xe8, 0x1d, 0x98, 0x6d, 0x77, 0x36, 0x3c, 0x37, 0xda, 0x5e, 0x0b, 0x62, 0x66, 0xd2, 0xa1, 0x72, - 0xc8, 0x09, 0x2f, 0x66, 0xe5, 0x98, 0x5d, 0xcf, 0xc1, 0xc3, 0xb9, 0x14, 0xd0, 0xfb, 0x70, 0x2e, - 0xb5, 0x18, 0x84, 0x4f, 0xe5, 0x64, 0x7e, 0xbc, 0xdd, 0x46, 0x56, 0x05, 0xe1, 0x23, 0x99, 0x05, - 0xc2, 0xd9, 0x4d, 0x7c, 0x30, 0x43, 0x9f, 0xf7, 0x68, 0x65, 0x8d, 0x29, 0x43, 0x5f, 0x86, 0x71, - 0x7d, 0x15, 0x89, 0x0b, 0xe6, 0x4a, 0x36, 0xcf, 0xa2, 0xad, 0x36, 0xce, 0xd2, 0xa9, 0x15, 0xa5, - 0xc3, 0xb0, 0x41, 0xd1, 0x26, 0x90, 0xfd, 0x7d, 0xe8, 0x36, 0x8c, 0x36, 0x3d, 0x97, 0xf8, 0x71, - 0xad, 0xde, 0x2b, 0xe8, 0xc7, 0x92, 0xc0, 0x11, 0x03, 0x26, 0x02, 0x94, 0xf2, 0x32, 0xac, 0x28, - 0xd8, 0xbf, 0x56, 0x80, 0x4a, 0x9f, 0x68, 0xb7, 0x29, 0x7d, 0xb4, 0x35, 0x90, 0x3e, 0x7a, 0x41, - 0x66, 0xc4, 0x5b, 0x4b, 0x09, 0xe9, 0xa9, 0x6c, 0x77, 0x89, 0xa8, 0x9e, 0xc6, 0x1f, 0xd8, 0x3e, - 0x58, 0x57, 0x69, 0x97, 0xfa, 0x5a, 0xae, 0x1b, 0x4f, 0x59, 0x43, 0x83, 0x0b, 0x22, 0xb9, 0xcf, - 0x12, 0xf6, 0xd7, 0x0a, 0x70, 0x4e, 0x0d, 0xe1, 0x9f, 0xdd, 0x81, 0xbb, 0xdb, 0x3d, 0x70, 0x27, - 0xf0, 0xa8, 0x63, 0xdf, 0x81, 0x61, 0x1e, 0x34, 0x65, 0x00, 0x06, 0xe8, 0x29, 0x33, 0xc2, 0x96, - 0xba, 0xa6, 0x8d, 0x28, 0x5b, 0x7f, 0xc1, 0x82, 0xa9, 0xf5, 0xa5, 0x7a, 0x23, 0x68, 0xee, 0x90, - 0x78, 0x81, 0x33, 0xac, 0x58, 0xf0, 0x3f, 0xd6, 0x43, 0xf2, 0x35, 0x59, 0x1c, 0xd3, 0x65, 0x28, - 0x6d, 0x07, 0x51, 0x9c, 0x7e, 0xf1, 0xbd, 0x19, 0x44, 0x31, 0x66, 0x10, 0xfb, 0x77, 0x2c, 0x18, - 0x62, 0x79, 0x5c, 0xfb, 0x25, 0x17, 0x1e, 0xe4, 0xbb, 0xd0, 0xcb, 0x30, 0x4c, 0x36, 0x37, 0x49, - 0x33, 0x16, 0xb3, 0x2a, 0xdd, 0x51, 0x87, 0x97, 0x59, 0x29, 0xbd, 0xf4, 0x59, 0x63, 0xfc, 0x2f, - 0x16, 0xc8, 0xe8, 0x2d, 0x28, 0xc7, 0xee, 0x2e, 0x59, 0x68, 0xb5, 0xc4, 0x9b, 0xd9, 0x43, 0x78, - 0xff, 0xae, 0x4b, 0x02, 0x38, 0xa1, 0x65, 0x7f, 0xb5, 0x00, 0x90, 0xb8, 0xfe, 0xf7, 0xfb, 0xc4, - 0xc5, 0xae, 0xd7, 0x94, 0x2b, 0x19, 0xaf, 0x29, 0x28, 0x21, 0x98, 0xf1, 0x94, 0xa2, 0x86, 0xa9, - 0x38, 0xd0, 0x30, 0x95, 0x8e, 0x33, 0x4c, 0x4b, 0x30, 0x93, 0x84, 0x2e, 0x30, 0xe3, 0xb8, 0x30, - 0x21, 0x65, 0x3d, 0x0d, 0xc4, 0xdd, 0xf8, 0x36, 0x81, 0xcb, 0x32, 0xa2, 0xa6, 0xbc, 0x6b, 0x98, - 0x49, 0xe6, 0x31, 0xf2, 0x4c, 0x27, 0xcf, 0x45, 0x85, 0xdc, 0xe7, 0xa2, 0x1f, 0xb7, 0xe0, 0x6c, - 0xba, 0x1d, 0xe6, 0xfb, 0xf6, 0x7d, 0x16, 0x9c, 0x63, 0x8f, 0x66, 0xac, 0xd5, 0xee, 0x27, 0xba, - 0x97, 0xb2, 0x43, 0x3a, 0xf4, 0xee, 0x71, 0xe2, 0xf7, 0xbc, 0x9a, 0x45, 0x1a, 0x67, 0xb7, 0x68, - 0xff, 0x65, 0x0b, 0x2e, 0xe4, 0xa6, 0x0f, 0x62, 0x12, 0x64, 0xdb, 0xe5, 0x1a, 0xa9, 0xb4, 0x04, - 0x59, 0xaf, 0x71, 0x9d, 0x94, 0xc2, 0x50, 0xa9, 0x0d, 0x0b, 0xb9, 0xa9, 0x0d, 0xfb, 0x66, 0x2a, - 0xb4, 0xbf, 0xd7, 0x02, 0xe1, 0xf2, 0x34, 0xc0, 0x41, 0xf3, 0xb6, 0xcc, 0x0c, 0x6b, 0x04, 0x34, - 0xbf, 0x9c, 0xef, 0x03, 0x26, 0xc2, 0x98, 0xab, 0x8b, 0xdd, 0x08, 0x5e, 0x6e, 0xd0, 0xb2, 0x5b, - 0x20, 0xa0, 0x55, 0xc2, 0xf4, 0x56, 0xfd, 0x7b, 0x73, 0x1d, 0xa0, 0xc5, 0x70, 0xb5, 0xfc, 0x90, - 0xea, 0x1a, 0xa9, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x1f, 0x2c, 0xc0, 0x98, 0x0c, 0xa0, 0xdd, 0xf1, - 0x07, 0x91, 0x2e, 0x8f, 0x95, 0x47, 0x87, 0x25, 0x54, 0xa5, 0x84, 0xeb, 0x89, 0x50, 0x9e, 0x24, - 0x54, 0x95, 0x00, 0x9c, 0xe0, 0xa0, 0x67, 0x60, 0x24, 0xea, 0x6c, 0x30, 0xf4, 0x94, 0x23, 0x4f, - 0x83, 0x17, 0x63, 0x09, 0x47, 0x9f, 0x87, 0x69, 0x5e, 0x2f, 0x0c, 0xda, 0xce, 0x16, 0x57, 0x81, - 0x0e, 0x29, 0xcf, 0xda, 0xe9, 0xd5, 0x14, 0xec, 0xe8, 0xa0, 0x72, 0x36, 0x5d, 0xc6, 0x94, 0xe7, - 0x5d, 0x54, 0xec, 0x2f, 0x03, 0xea, 0x8e, 0x09, 0x8e, 0xde, 0xe0, 0xe6, 0x54, 0x6e, 0x48, 0x5a, - 0xbd, 0xb4, 0xe2, 0xba, 0x23, 0xa8, 0x34, 0xa6, 0xe7, 0xb5, 0xb0, 0xaa, 0x6f, 0xff, 0x95, 0x22, - 0x4c, 0xa7, 0xdd, 0x02, 0xd1, 0x4d, 0x18, 0xe6, 0x17, 0x9e, 0x20, 0xdf, 0xe3, 0xd1, 0x55, 0x73, - 0x26, 0x64, 0x5b, 0x5f, 0xdc, 0x99, 0xa2, 0x3e, 0x7a, 0x07, 0xc6, 0x5a, 0xc1, 0x7d, 0xff, 0xbe, - 0x13, 0xb6, 0x16, 0xea, 0x35, 0xb1, 0x2e, 0x33, 0xf9, 0xe6, 0x6a, 0x82, 0xa6, 0x3b, 0x28, 0xb2, - 0x07, 0x86, 0x04, 0x84, 0x75, 0x72, 0x68, 0x9d, 0xc5, 0x39, 0xdc, 0x74, 0xb7, 0x56, 0x9d, 0x76, - 0x2f, 0xdb, 0xda, 0x25, 0x89, 0xa4, 0x51, 0x9e, 0x10, 0xc1, 0x10, 0x39, 0x00, 0x27, 0x84, 0xd0, - 0x77, 0xc2, 0x99, 0x28, 0x47, 0xd5, 0x96, 0x97, 0x22, 0xa2, 0x97, 0xf6, 0x69, 0xf1, 0x31, 0x2a, - 0xd1, 0x64, 0x29, 0xe5, 0xb2, 0x9a, 0xb1, 0xbf, 0x72, 0x06, 0x8c, 0xdd, 0x68, 0xe4, 0x09, 0xb2, - 0x4e, 0x28, 0x4f, 0x10, 0x86, 0x51, 0xb2, 0xdb, 0x8e, 0xf7, 0xab, 0x6e, 0xd8, 0x2b, 0x8f, 0xdd, - 0xb2, 0xc0, 0xe9, 0xa6, 0x29, 0x21, 0x58, 0xd1, 0xc9, 0x4e, 0xe6, 0x54, 0xfc, 0x10, 0x93, 0x39, - 0x95, 0x4e, 0x31, 0x99, 0xd3, 0x1a, 0x8c, 0x6c, 0xb9, 0x31, 0x26, 0xed, 0x40, 0xb0, 0x9a, 0x99, - 0xeb, 0xf0, 0x06, 0x47, 0xe9, 0x4e, 0x20, 0x22, 0x00, 0x58, 0x12, 0x41, 0x6f, 0xa8, 0x1d, 0x38, - 0x9c, 0x2f, 0xa9, 0x75, 0xbf, 0x0e, 0x66, 0xee, 0x41, 0x91, 0xbc, 0x69, 0xe4, 0x61, 0x93, 0x37, - 0xad, 0xc8, 0x94, 0x4b, 0xa3, 0xf9, 0x86, 0xf0, 0x2c, 0xa3, 0x52, 0x9f, 0x44, 0x4b, 0x46, 0x72, - 0xaa, 0xf2, 0xc9, 0x25, 0xa7, 0xfa, 0x5e, 0x0b, 0xce, 0xb5, 0xb3, 0xf2, 0xb4, 0x89, 0x44, 0x49, - 0x2f, 0x0f, 0x9c, 0x88, 0xce, 0x68, 0x90, 0x89, 0xec, 0x99, 0x68, 0x38, 0xbb, 0x39, 0x3a, 0xd0, - 0xe1, 0x46, 0x4b, 0x64, 0x57, 0x7a, 0x2a, 0x27, 0xcb, 0x55, 0x8f, 0xdc, 0x56, 0xeb, 0x19, 0x19, - 0x95, 0x3e, 0x9e, 0x97, 0x51, 0x69, 0xe0, 0x3c, 0x4a, 0x6f, 0xa8, 0xfc, 0x56, 0x13, 0xf9, 0x4b, - 0x89, 0x67, 0xaf, 0xea, 0x9b, 0xd5, 0xea, 0x0d, 0x95, 0xd5, 0xaa, 0x47, 0xbc, 0x37, 0x9e, 0xb3, - 0xaa, 0x6f, 0x2e, 0x2b, 0x2d, 0x1f, 0xd5, 0xd4, 0xc9, 0xe4, 0xa3, 0x32, 0xae, 0x1a, 0x9e, 0x12, - 0xe9, 0xd9, 0x3e, 0x57, 0x8d, 0x41, 0xb7, 0xf7, 0x65, 0xc3, 0x73, 0x6f, 0xcd, 0x3c, 0x54, 0xee, - 0xad, 0x7b, 0x7a, 0x2e, 0x2b, 0xd4, 0x27, 0x59, 0x13, 0x45, 0x1a, 0x30, 0x83, 0xd5, 0x3d, 0xfd, - 0x02, 0x3c, 0x93, 0x4f, 0x57, 0xdd, 0x73, 0xdd, 0x74, 0x33, 0xaf, 0xc0, 0xae, 0xcc, 0x58, 0x67, - 0x4f, 0x27, 0x33, 0xd6, 0xb9, 0x13, 0xcf, 0x8c, 0x75, 0xfe, 0x14, 0x32, 0x63, 0x3d, 0xf6, 0xa1, - 0x66, 0xc6, 0x9a, 0x7d, 0x04, 0x99, 0xb1, 0xd6, 0x92, 0xcc, 0x58, 0x17, 0xf2, 0xa7, 0x24, 0xc3, - 0x3a, 0x37, 0x27, 0x1f, 0xd6, 0x3d, 0xf6, 0x44, 0xcf, 0xe3, 0x56, 0x88, 0x80, 0x74, 0xd9, 0xb9, - 0x7f, 0xb3, 0x82, 0x5b, 0xf0, 0x29, 0x51, 0x20, 0x9c, 0x90, 0xa2, 0x74, 0x93, 0xfc, 0x58, 0x8f, - 0xf7, 0x50, 0xca, 0x66, 0xa9, 0xbb, 0xf2, 0xb3, 0x62, 0xd9, 0x7f, 0xb1, 0x00, 0x97, 0x7a, 0xaf, - 0xeb, 0x44, 0x57, 0x56, 0x4f, 0xde, 0x76, 0x52, 0xba, 0x32, 0x2e, 0xe4, 0x24, 0x58, 0x03, 0x07, - 0xf7, 0xb9, 0x01, 0x33, 0xca, 0x2c, 0xd7, 0x73, 0x9b, 0xfb, 0x5a, 0x4e, 0x60, 0xe5, 0x7e, 0xd8, - 0x48, 0x23, 0xe0, 0xee, 0x3a, 0x68, 0x01, 0xa6, 0x8c, 0xc2, 0x5a, 0x55, 0x08, 0x33, 0x4a, 0x39, - 0xd7, 0x30, 0xc1, 0x38, 0x8d, 0x6f, 0xff, 0xb4, 0x05, 0x8f, 0xe5, 0x24, 0x8d, 0x18, 0x38, 0x76, - 0xcd, 0x26, 0x4c, 0xb5, 0xcd, 0xaa, 0x7d, 0x42, 0x5c, 0x19, 0xa9, 0x29, 0x54, 0x5f, 0x53, 0x00, - 0x9c, 0x26, 0xba, 0x78, 0xf5, 0x37, 0x7f, 0xef, 0xd2, 0xc7, 0x7e, 0xeb, 0xf7, 0x2e, 0x7d, 0xec, - 0xb7, 0x7f, 0xef, 0xd2, 0xc7, 0xfe, 0xff, 0xc3, 0x4b, 0xd6, 0x6f, 0x1e, 0x5e, 0xb2, 0x7e, 0xeb, - 0xf0, 0x92, 0xf5, 0xdb, 0x87, 0x97, 0xac, 0xdf, 0x3d, 0xbc, 0x64, 0x7d, 0xf5, 0xf7, 0x2f, 0x7d, - 0xec, 0xed, 0xc2, 0xde, 0x0b, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xab, 0xe8, 0x86, 0xb1, 0xed, - 0xe6, 0x00, 0x00, + 0x01, 0x96, 0x84, 0xec, 0x57, 0x20, 0xd3, 0x77, 0xab, 0xbf, 0xda, 0xc0, 0xfe, 0x02, 0xcc, 0xb0, + 0x9a, 0xc7, 0x14, 0x69, 0xed, 0x94, 0x92, 0x2e, 0x23, 0x64, 0x94, 0xfd, 0x7d, 0x16, 0x4c, 0xad, + 0xa5, 0xe2, 0x57, 0x5c, 0x61, 0xef, 0x81, 0x19, 0xba, 0xe1, 0x06, 0x2b, 0xc5, 0x02, 0x7a, 0xe2, + 0x3a, 0xa8, 0x3f, 0xb1, 0x20, 0x71, 0xa7, 0x3c, 0x05, 0xc6, 0x6b, 0xc9, 0x60, 0xbc, 0x32, 0x75, + 0x23, 0xaa, 0x3b, 0x79, 0x7c, 0x17, 0xba, 0xa5, 0x62, 0x07, 0xf4, 0x50, 0x8b, 0x24, 0x64, 0xb8, + 0xa7, 0xf9, 0xa4, 0x19, 0x60, 0x40, 0x46, 0x13, 0x60, 0xa6, 0x44, 0x0a, 0xf7, 0x23, 0x62, 0x4a, + 0xa4, 0xfa, 0x93, 0xb3, 0x43, 0xeb, 0x5a, 0x97, 0xd9, 0xc9, 0xf5, 0xad, 0xcc, 0x34, 0xdc, 0xf1, + 0xdc, 0xf7, 0x89, 0x0a, 0x80, 0x52, 0x11, 0xa6, 0xde, 0xa2, 0xf4, 0xe8, 0xa0, 0x32, 0xa1, 0xfe, + 0xf1, 0x28, 0x59, 0x49, 0x15, 0xfb, 0x26, 0x4c, 0xa5, 0x06, 0x0c, 0xbd, 0x0c, 0x43, 0xed, 0x6d, + 0x27, 0x22, 0x29, 0xf3, 0xc9, 0xa1, 0x3a, 0x2d, 0x3c, 0x3a, 0xa8, 0x4c, 0xaa, 0x0a, 0xac, 0x04, + 0x73, 0x6c, 0xfb, 0x7f, 0x58, 0x50, 0x5a, 0x0b, 0x5a, 0xa7, 0xb1, 0x98, 0x5e, 0x37, 0x16, 0xd3, + 0x13, 0x79, 0x31, 0x06, 0x73, 0xd7, 0xd1, 0x4a, 0x6a, 0x1d, 0x5d, 0xca, 0xa5, 0xd0, 0x7b, 0x09, + 0xed, 0xc2, 0x18, 0x8b, 0x5c, 0x28, 0xcc, 0x39, 0x5f, 0x34, 0x64, 0x80, 0x4a, 0x4a, 0x06, 0x98, + 0xd2, 0x50, 0x35, 0x49, 0xe0, 0x19, 0x18, 0x11, 0x26, 0x85, 0x69, 0x23, 0x78, 0x81, 0x8b, 0x25, + 0xdc, 0xfe, 0xb1, 0x22, 0x18, 0x91, 0x12, 0xd1, 0xaf, 0x58, 0x30, 0x1f, 0x72, 0xaf, 0xc2, 0x56, + 0xb5, 0x13, 0xba, 0xfe, 0x56, 0xa3, 0xb9, 0x4d, 0x5a, 0x1d, 0xcf, 0xf5, 0xb7, 0x6a, 0x5b, 0x7e, + 0xa0, 0x8a, 0x97, 0x1f, 0x90, 0x66, 0x87, 0xbd, 0x0b, 0xf4, 0x09, 0xcb, 0xa8, 0x4c, 0x76, 0xae, + 0x1f, 0x1e, 0x54, 0xe6, 0xf1, 0xb1, 0x68, 0xe3, 0x63, 0xf6, 0x05, 0x7d, 0xdd, 0x82, 0x6b, 0x3c, + 0x80, 0xe0, 0xe0, 0xfd, 0xef, 0x21, 0x31, 0xd5, 0x25, 0xa9, 0x84, 0xc8, 0x3a, 0x09, 0x77, 0x17, + 0x3f, 0x23, 0x06, 0xf4, 0x5a, 0xfd, 0x78, 0x6d, 0xe1, 0xe3, 0x76, 0xce, 0xfe, 0xe7, 0x45, 0x98, + 0x10, 0x0e, 0xed, 0x22, 0x52, 0xca, 0xcb, 0xc6, 0x92, 0x78, 0x32, 0xb5, 0x24, 0x66, 0x0c, 0xe4, + 0x93, 0x09, 0x92, 0x12, 0xc1, 0x8c, 0xe7, 0x44, 0xf1, 0x4d, 0xe2, 0x84, 0xf1, 0x06, 0x71, 0xb8, + 0x29, 0x4b, 0xf1, 0xd8, 0x66, 0x37, 0x4a, 0x45, 0x73, 0x3b, 0x4d, 0x0c, 0x77, 0xd3, 0x47, 0x7b, + 0x80, 0x98, 0x3d, 0x4e, 0xe8, 0xf8, 0x11, 0xff, 0x16, 0x57, 0xbc, 0x19, 0x1c, 0xaf, 0xd5, 0x39, + 0xd1, 0x2a, 0xba, 0xdd, 0x45, 0x0d, 0x67, 0xb4, 0xa0, 0xd9, 0x59, 0x0d, 0x0d, 0x6a, 0x67, 0x35, + 0xdc, 0xc7, 0xd3, 0xc4, 0x87, 0xe9, 0xae, 0x98, 0x04, 0x6f, 0x43, 0x59, 0xd9, 0xc3, 0x89, 0x43, + 0xa7, 0x77, 0x68, 0x8f, 0x34, 0x05, 0xae, 0x46, 0x49, 0x6c, 0x31, 0x13, 0x72, 0xf6, 0x3f, 0x2c, + 0x18, 0x0d, 0xf2, 0x49, 0x5c, 0x83, 0x51, 0x27, 0x8a, 0xdc, 0x2d, 0x9f, 0xb4, 0xc4, 0x8e, 0xfd, + 0x78, 0xde, 0x8e, 0x35, 0x9a, 0x61, 0x36, 0x89, 0x0b, 0xa2, 0x26, 0x56, 0x34, 0xd0, 0x4d, 0x6e, + 0x30, 0xb4, 0x27, 0x79, 0xfe, 0xc1, 0xa8, 0x81, 0x34, 0x29, 0xda, 0x23, 0x58, 0xd4, 0x47, 0x5f, + 0xe4, 0x16, 0x5d, 0xb7, 0xfc, 0xe0, 0xbe, 0x7f, 0x23, 0x08, 0xa4, 0x17, 0xda, 0x60, 0x04, 0x67, + 0xa4, 0x1d, 0x97, 0xaa, 0x8e, 0x4d, 0x6a, 0x83, 0xc5, 0xed, 0xf9, 0x4e, 0x38, 0x43, 0x49, 0x9b, + 0xbe, 0x24, 0x11, 0x22, 0x30, 0x25, 0xa2, 0x25, 0xc8, 0x32, 0x31, 0x76, 0x99, 0xec, 0xbc, 0x59, + 0x3b, 0x51, 0xfa, 0xdd, 0x32, 0x49, 0xe0, 0x34, 0x4d, 0xfb, 0x27, 0x2d, 0x60, 0x56, 0xf0, 0xa7, + 0xc0, 0x32, 0x7c, 0xce, 0x64, 0x19, 0x66, 0xf3, 0x06, 0x39, 0x87, 0x5b, 0x78, 0x89, 0xaf, 0xac, + 0x7a, 0x18, 0x3c, 0xd8, 0x17, 0xaf, 0xe9, 0xfd, 0x39, 0x59, 0xfb, 0xff, 0x58, 0xfc, 0x10, 0x53, + 0x8e, 0xe9, 0xe8, 0xbb, 0x60, 0xb4, 0xe9, 0xb4, 0x9d, 0x26, 0x0f, 0xeb, 0x9b, 0xab, 0xd5, 0x31, + 0x2a, 0xcd, 0x2f, 0x89, 0x1a, 0x5c, 0x4b, 0x21, 0xa3, 0x6e, 0x8c, 0xca, 0xe2, 0xbe, 0x9a, 0x09, + 0xd5, 0xe4, 0xdc, 0x0e, 0x4c, 0x18, 0xc4, 0x1e, 0xa9, 0x48, 0xfb, 0x5d, 0xfc, 0x8a, 0x55, 0x51, + 0x62, 0x76, 0x61, 0xc6, 0xd7, 0xfe, 0xd3, 0x0b, 0x45, 0x8a, 0x29, 0x1f, 0xef, 0x77, 0x89, 0xb2, + 0xdb, 0x47, 0xb3, 0xf2, 0x4f, 0x91, 0xc1, 0xdd, 0x94, 0xed, 0x1f, 0xb7, 0xe0, 0x31, 0x1d, 0x51, + 0x8b, 0x19, 0xd0, 0x4f, 0x4f, 0x5c, 0x85, 0xd1, 0xa0, 0x4d, 0x42, 0x27, 0x0e, 0x42, 0x71, 0x6b, + 0x5c, 0x95, 0x83, 0x7e, 0x47, 0x94, 0x1f, 0x89, 0xf8, 0x8a, 0x92, 0xba, 0x2c, 0xc7, 0xaa, 0x26, + 0x95, 0x63, 0xd8, 0x60, 0x44, 0x22, 0x9e, 0x03, 0x3b, 0x03, 0xd8, 0x93, 0x69, 0x84, 0x05, 0xc4, + 0xfe, 0x03, 0x8b, 0x2f, 0x2c, 0xbd, 0xeb, 0xe8, 0x3d, 0x98, 0xde, 0x75, 0xe2, 0xe6, 0xf6, 0xf2, + 0x83, 0x76, 0xc8, 0xd5, 0xe3, 0x72, 0x9c, 0x9e, 0xed, 0x37, 0x4e, 0xda, 0x47, 0x26, 0x46, 0x6a, + 0xab, 0x29, 0x62, 0xb8, 0x8b, 0x3c, 0xda, 0x80, 0x31, 0x56, 0xc6, 0xac, 0xa1, 0xa3, 0x5e, 0xac, + 0x41, 0x5e, 0x6b, 0xea, 0xd5, 0x79, 0x35, 0xa1, 0x83, 0x75, 0xa2, 0xf6, 0x57, 0x8a, 0x7c, 0xb7, + 0x33, 0x6e, 0xfb, 0x19, 0x18, 0x69, 0x07, 0xad, 0xa5, 0x5a, 0x15, 0x8b, 0x59, 0x50, 0xd7, 0x48, + 0x9d, 0x17, 0x63, 0x09, 0x47, 0xaf, 0x02, 0x90, 0x07, 0x31, 0x09, 0x7d, 0xc7, 0x53, 0x46, 0x23, + 0xca, 0x4c, 0xb2, 0x1a, 0xac, 0x05, 0xf1, 0xdd, 0x88, 0x7c, 0xc7, 0xb2, 0x42, 0xc1, 0x1a, 0x3a, + 0xba, 0x0e, 0xd0, 0x0e, 0x83, 0x3d, 0xb7, 0xc5, 0xdc, 0xeb, 0x8a, 0xa6, 0x49, 0x45, 0x5d, 0x41, + 0xb0, 0x86, 0x85, 0x5e, 0x85, 0x89, 0x8e, 0x1f, 0x71, 0x0e, 0xc5, 0xd9, 0x10, 0xd1, 0x09, 0x47, + 0x13, 0xeb, 0x86, 0xbb, 0x3a, 0x10, 0x9b, 0xb8, 0x68, 0x01, 0x86, 0x63, 0x87, 0xd9, 0x44, 0x0c, + 0xe5, 0xdb, 0x36, 0xae, 0x53, 0x0c, 0x3d, 0xa8, 0x2c, 0xad, 0x80, 0x45, 0x45, 0xf4, 0xb6, 0xf4, + 0x55, 0xe0, 0x67, 0xbd, 0x30, 0x2a, 0x1e, 0xec, 0x5e, 0xd0, 0x3c, 0x15, 0x84, 0xb1, 0xb2, 0x41, + 0xcb, 0xfe, 0x7a, 0x19, 0x20, 0x61, 0xc7, 0xd1, 0xfb, 0x5d, 0xe7, 0xd1, 0x73, 0xbd, 0x19, 0xf8, + 0x93, 0x3b, 0x8c, 0xd0, 0xf7, 0x5a, 0x30, 0xe6, 0x78, 0x5e, 0xd0, 0x74, 0x62, 0x36, 0xca, 0x85, + 0xde, 0xe7, 0xa1, 0x68, 0x7f, 0x21, 0xa9, 0xc1, 0xbb, 0xf0, 0xa2, 0x5c, 0x78, 0x1a, 0xa4, 0x6f, + 0x2f, 0xf4, 0x86, 0xd1, 0xa7, 0xa4, 0x94, 0xc6, 0x97, 0xc7, 0x5c, 0x5a, 0x4a, 0x2b, 0xb3, 0xa3, + 0x5f, 0x13, 0xd0, 0xd0, 0x5d, 0x23, 0xf0, 0x5c, 0x29, 0x3f, 0x06, 0x83, 0xc1, 0x95, 0xf6, 0x8b, + 0x39, 0x87, 0xea, 0xba, 0x73, 0xd5, 0x50, 0x7e, 0xa0, 0x12, 0x4d, 0xfc, 0xe9, 0xe3, 0x58, 0xf5, + 0x2e, 0x4c, 0xb5, 0xcc, 0xbb, 0x5d, 0xac, 0xa6, 0xa7, 0xf3, 0xe8, 0xa6, 0x58, 0x81, 0xe4, 0x36, + 0x4f, 0x01, 0x70, 0x9a, 0x30, 0xaa, 0x73, 0x37, 0xb7, 0x9a, 0xbf, 0x19, 0x08, 0xe3, 0x74, 0x3b, + 0x77, 0x2e, 0xf7, 0xa3, 0x98, 0xec, 0x52, 0xcc, 0xe4, 0xd2, 0x5e, 0x13, 0x75, 0xb1, 0xa2, 0x82, + 0xde, 0x80, 0x61, 0xe6, 0x27, 0x1b, 0xcd, 0x8e, 0xe6, 0x2b, 0x13, 0xcd, 0x10, 0x0f, 0xc9, 0xa6, + 0x62, 0x7f, 0x23, 0x2c, 0x28, 0xa0, 0x9b, 0x32, 0x0e, 0x4c, 0x54, 0xf3, 0xef, 0x46, 0x84, 0xc5, + 0x81, 0x29, 0x2f, 0x7e, 0x3c, 0x09, 0xf1, 0xc2, 0xcb, 0x33, 0xc3, 0xc7, 0x1b, 0x35, 0x29, 0x73, + 0x24, 0xfe, 0xcb, 0xa8, 0xf4, 0xb3, 0x90, 0xdf, 0x3d, 0x33, 0x72, 0x7d, 0x32, 0x9c, 0xf7, 0x4c, + 0x12, 0x38, 0x4d, 0x93, 0x32, 0x9a, 0x7c, 0xe7, 0x0a, 0xf3, 0xf6, 0x7e, 0xfb, 0x9f, 0xcb, 0xd7, + 0xec, 0x92, 0xe1, 0x25, 0x58, 0xd4, 0x3f, 0xd5, 0x5b, 0x7f, 0xce, 0x87, 0xe9, 0xf4, 0x16, 0x7d, + 0xa4, 0x5c, 0xc6, 0xef, 0x97, 0x60, 0xd2, 0x5c, 0x52, 0xe8, 0x1a, 0x94, 0x05, 0x11, 0x15, 0x94, + 0x54, 0xed, 0x92, 0x55, 0x09, 0xc0, 0x09, 0x0e, 0x8b, 0x45, 0xcb, 0xaa, 0x6b, 0x66, 0x89, 0x49, + 0x2c, 0x5a, 0x05, 0xc1, 0x1a, 0x16, 0x95, 0x97, 0x36, 0x82, 0x20, 0x56, 0x97, 0x8a, 0x5a, 0x77, + 0x8b, 0xac, 0x14, 0x0b, 0x28, 0xbd, 0x4c, 0x76, 0x48, 0xe8, 0x13, 0xcf, 0x8c, 0x75, 0xa6, 0x2e, + 0x93, 0x5b, 0x3a, 0x10, 0x9b, 0xb8, 0xf4, 0x96, 0x0c, 0x22, 0xb6, 0x90, 0x85, 0x54, 0x96, 0x98, + 0x79, 0x36, 0xb8, 0xc7, 0xb9, 0x84, 0xa3, 0x2f, 0xc0, 0x63, 0xca, 0x41, 0x1c, 0x73, 0x45, 0xb5, + 0x6c, 0x71, 0xd8, 0x50, 0xa2, 0x3c, 0xb6, 0x94, 0x8d, 0x86, 0xf3, 0xea, 0xa3, 0xd7, 0x61, 0x52, + 0x70, 0xee, 0x92, 0xe2, 0x88, 0x69, 0x3b, 0x71, 0xcb, 0x80, 0xe2, 0x14, 0xb6, 0x8c, 0xd6, 0xc6, + 0x98, 0x67, 0x49, 0x61, 0xb4, 0x3b, 0x5a, 0x9b, 0x0e, 0xc7, 0x5d, 0x35, 0xd0, 0x02, 0x4c, 0x71, + 0xd6, 0xca, 0xf5, 0xb7, 0xf8, 0x9c, 0x08, 0xef, 0x13, 0xb5, 0xa5, 0xee, 0x98, 0x60, 0x9c, 0xc6, + 0x47, 0xaf, 0xc0, 0xb8, 0x13, 0x36, 0xb7, 0xdd, 0x98, 0x34, 0xe3, 0x4e, 0xc8, 0xdd, 0x52, 0x34, + 0xe3, 0x93, 0x05, 0x0d, 0x86, 0x0d, 0x4c, 0xfb, 0x7d, 0x38, 0x93, 0xe1, 0xb8, 0x46, 0x17, 0x8e, + 0xd3, 0x76, 0xe5, 0x37, 0xa5, 0x0c, 0x36, 0x17, 0xea, 0x35, 0xf9, 0x35, 0x1a, 0x16, 0x5d, 0x9d, + 0xcc, 0xc1, 0x4d, 0x4b, 0x42, 0xa1, 0x56, 0xe7, 0x8a, 0x04, 0xe0, 0x04, 0xc7, 0xfe, 0x9f, 0x05, + 0x98, 0xca, 0x50, 0xbe, 0xb3, 0x44, 0x08, 0x29, 0xd9, 0x23, 0xc9, 0x7b, 0x60, 0x06, 0xff, 0x2b, + 0x1c, 0x23, 0xf8, 0x5f, 0xb1, 0x5f, 0xf0, 0xbf, 0xd2, 0x07, 0x09, 0xfe, 0x67, 0x8e, 0xd8, 0xd0, + 0x40, 0x23, 0x96, 0x11, 0x30, 0x70, 0xf8, 0x98, 0x01, 0x03, 0x8d, 0x41, 0x1f, 0x19, 0x60, 0xd0, + 0x7f, 0xa8, 0x00, 0xd3, 0x69, 0x23, 0xb9, 0x53, 0x50, 0xc7, 0xbe, 0x61, 0xa8, 0x63, 0xb3, 0xd3, + 0x8a, 0xa4, 0x4d, 0xf7, 0xf2, 0x54, 0xb3, 0x38, 0xa5, 0x9a, 0xfd, 0xe4, 0x40, 0xd4, 0x7a, 0xab, + 0x69, 0xff, 0x76, 0x01, 0xce, 0xa5, 0xab, 0x2c, 0x79, 0x8e, 0xbb, 0x7b, 0x0a, 0x63, 0x73, 0xc7, + 0x18, 0x9b, 0xe7, 0x07, 0xf9, 0x1a, 0xd6, 0xb5, 0xdc, 0x01, 0x7a, 0x2b, 0x35, 0x40, 0xd7, 0x06, + 0x27, 0xd9, 0x7b, 0x94, 0xbe, 0x51, 0x84, 0x4b, 0x99, 0xf5, 0x12, 0x6d, 0xe6, 0x8a, 0xa1, 0xcd, + 0xbc, 0x9e, 0xd2, 0x66, 0xda, 0xbd, 0x6b, 0x9f, 0x8c, 0x7a, 0x53, 0x78, 0x14, 0xb2, 0x00, 0x71, + 0x0f, 0xa9, 0xda, 0x34, 0x3c, 0x0a, 0x15, 0x21, 0x6c, 0xd2, 0xfd, 0xb3, 0xa4, 0xd2, 0xfc, 0x97, + 0x16, 0x5c, 0xc8, 0x9c, 0x9b, 0x53, 0x50, 0x61, 0xad, 0x99, 0x2a, 0xac, 0x67, 0x06, 0x5e, 0xad, + 0x39, 0x3a, 0xad, 0xdf, 0x28, 0xe5, 0x7c, 0x0b, 0x13, 0xd0, 0xef, 0xc0, 0x98, 0xd3, 0x6c, 0x92, + 0x28, 0x5a, 0x0d, 0x5a, 0x2a, 0x60, 0xda, 0xf3, 0x4c, 0xce, 0x4a, 0x8a, 0x8f, 0x0e, 0x2a, 0x73, + 0x69, 0x12, 0x09, 0x18, 0xeb, 0x14, 0xcc, 0x18, 0x8f, 0x85, 0x13, 0x8d, 0xf1, 0x78, 0x1d, 0x60, + 0x4f, 0x71, 0xeb, 0x69, 0x21, 0x5f, 0xe3, 0xe3, 0x35, 0x2c, 0xf4, 0x45, 0x18, 0x8d, 0xc4, 0x35, + 0x2e, 0x96, 0xe2, 0x8b, 0x03, 0xce, 0x95, 0xb3, 0x41, 0x3c, 0xd3, 0x75, 0x5d, 0xe9, 0x43, 0x14, + 0x49, 0xf4, 0x6d, 0x30, 0x1d, 0xf1, 0xc8, 0x28, 0x4b, 0x9e, 0x13, 0x31, 0x3f, 0x08, 0xb1, 0x0a, + 0x99, 0x3f, 0x7a, 0x23, 0x05, 0xc3, 0x5d, 0xd8, 0x68, 0x45, 0x7e, 0x14, 0x0b, 0xe3, 0xc2, 0x17, + 0xe6, 0x95, 0xe4, 0x83, 0x44, 0x1a, 0xa6, 0xb3, 0xe9, 0xe1, 0x67, 0x03, 0xaf, 0xd5, 0x44, 0x5f, + 0x04, 0xa0, 0xcb, 0x47, 0xe8, 0x12, 0x46, 0xf2, 0x0f, 0x4f, 0x7a, 0xaa, 0xb4, 0x32, 0x2d, 0x3f, + 0x99, 0x2f, 0x5f, 0x55, 0x11, 0xc1, 0x1a, 0x41, 0xfb, 0x87, 0x4a, 0xf0, 0x78, 0x8f, 0x33, 0x12, + 0x2d, 0x98, 0x4f, 0xa0, 0xcf, 0xa6, 0x85, 0xeb, 0xb9, 0xcc, 0xca, 0x86, 0xb4, 0x9d, 0x5a, 0x8a, + 0x85, 0x0f, 0xbc, 0x14, 0xbf, 0xdf, 0xd2, 0xd4, 0x1e, 0xdc, 0x98, 0xef, 0x73, 0xc7, 0x3c, 0xfb, + 0x4f, 0x50, 0x0f, 0xb2, 0x99, 0xa1, 0x4c, 0xb8, 0x3e, 0x70, 0x77, 0x06, 0xd6, 0x2e, 0x9c, 0xae, + 0xf2, 0xf7, 0x2b, 0x16, 0x3c, 0x99, 0xd9, 0x5f, 0xc3, 0x64, 0xe3, 0x1a, 0x94, 0x9b, 0xb4, 0x50, + 0x73, 0xdd, 0x4a, 0x7c, 0x5a, 0x25, 0x00, 0x27, 0x38, 0x86, 0x65, 0x46, 0xa1, 0xaf, 0x65, 0xc6, + 0x3f, 0xb3, 0xa0, 0x6b, 0x7f, 0x9c, 0xc2, 0x41, 0x5d, 0x33, 0x0f, 0xea, 0x8f, 0x0f, 0x32, 0x97, + 0x39, 0x67, 0xf4, 0x7f, 0x9a, 0x82, 0xf3, 0x39, 0xbe, 0x1a, 0x7b, 0x30, 0xb3, 0xd5, 0x24, 0xa6, + 0x53, 0x9c, 0xf8, 0x98, 0x4c, 0xff, 0xc1, 0x9e, 0x1e, 0x74, 0x2c, 0x3d, 0xcf, 0x4c, 0x17, 0x0a, + 0xee, 0x6e, 0x02, 0x7d, 0xc5, 0x82, 0xb3, 0xce, 0xfd, 0xa8, 0x2b, 0x09, 0xa3, 0x58, 0x33, 0x2f, + 0x65, 0x2a, 0x41, 0xfa, 0x24, 0x6d, 0xe4, 0xf9, 0x8a, 0xb2, 0xb0, 0x70, 0x66, 0x5b, 0x08, 0x8b, + 0x10, 0x9a, 0x94, 0x9d, 0xef, 0xe1, 0xb6, 0x99, 0xe5, 0x54, 0xc3, 0x8f, 0x6c, 0x09, 0xc1, 0x8a, + 0x0e, 0xba, 0x07, 0xe5, 0x2d, 0xe9, 0xe9, 0x26, 0xae, 0x84, 0xcc, 0x3b, 0x36, 0xd3, 0x1d, 0x8e, + 0x3f, 0x4b, 0x2a, 0x10, 0x4e, 0x48, 0xa1, 0xd7, 0xa1, 0xe8, 0x6f, 0x46, 0xbd, 0x12, 0xfd, 0xa4, + 0x2c, 0x99, 0xb8, 0x4b, 0xf4, 0xda, 0x4a, 0x03, 0xd3, 0x8a, 0xe8, 0x26, 0x14, 0xc3, 0x8d, 0x96, + 0xd0, 0xdb, 0x65, 0x9e, 0xdc, 0x78, 0xb1, 0x9a, 0xbd, 0x48, 0x38, 0x25, 0xbc, 0x58, 0xc5, 0x94, + 0x04, 0xaa, 0xc3, 0x10, 0x73, 0x6b, 0x10, 0xb7, 0x40, 0x26, 0xbf, 0xdb, 0xc3, 0x3d, 0x88, 0xfb, + 0x4d, 0x33, 0x04, 0xcc, 0x09, 0xa1, 0x75, 0x18, 0x6e, 0xb2, 0xa4, 0x30, 0x22, 0x6a, 0xf3, 0xa7, + 0x32, 0x35, 0x74, 0x3d, 0xb2, 0xe5, 0x08, 0x85, 0x15, 0xc3, 0xc0, 0x82, 0x16, 0xa3, 0x4a, 0xda, + 0xdb, 0x9b, 0x11, 0x93, 0xf0, 0xf3, 0xa8, 0xf6, 0x48, 0x02, 0x25, 0xa8, 0x32, 0x0c, 0x2c, 0x68, + 0xa1, 0xcf, 0x42, 0x61, 0xb3, 0x29, 0xbc, 0x1e, 0x32, 0x55, 0x75, 0xa6, 0x57, 0xfb, 0xe2, 0xf0, + 0xe1, 0x41, 0xa5, 0xb0, 0xb2, 0x84, 0x0b, 0x9b, 0x4d, 0xb4, 0x06, 0x23, 0x9b, 0xdc, 0x0f, 0x56, + 0x68, 0xe3, 0x9e, 0xce, 0x76, 0xd1, 0xed, 0x72, 0x95, 0xe5, 0xd6, 0xfa, 0x02, 0x80, 0x25, 0x11, + 0x16, 0x87, 0x52, 0xf9, 0xf3, 0x8a, 0x80, 0xcc, 0xf3, 0xc7, 0xf3, 0xc1, 0xe6, 0xb7, 0x72, 0xe2, + 0x15, 0x8c, 0x35, 0x8a, 0xe8, 0xcb, 0x50, 0x76, 0x64, 0xfa, 0x3f, 0x11, 0xb0, 0xe2, 0xc5, 0xcc, + 0x8d, 0xd9, 0x3b, 0x33, 0x22, 0x5f, 0xd5, 0x0a, 0x09, 0x27, 0x44, 0xd1, 0x0e, 0x4c, 0xec, 0x45, + 0xed, 0x6d, 0x22, 0x37, 0x32, 0x8b, 0x5f, 0x91, 0x73, 0x71, 0xdd, 0x13, 0x88, 0x6e, 0x18, 0x77, + 0x1c, 0xaf, 0xeb, 0xec, 0x61, 0x6f, 0xd9, 0xf7, 0x74, 0x62, 0xd8, 0xa4, 0x4d, 0x87, 0xff, 0xbd, + 0x4e, 0xb0, 0xb1, 0x1f, 0x13, 0x11, 0xc1, 0x39, 0x73, 0xf8, 0xdf, 0xe4, 0x28, 0xdd, 0xc3, 0x2f, + 0x00, 0x58, 0x12, 0xa1, 0x5b, 0xdd, 0x91, 0xa9, 0x35, 0x59, 0xe4, 0xe6, 0x9c, 0xad, 0x9e, 0x99, + 0x7f, 0x53, 0x1b, 0x14, 0x76, 0x46, 0x26, 0xa4, 0xd8, 0xd9, 0xd8, 0xde, 0x0e, 0xe2, 0xc0, 0x4f, + 0x9d, 0xcb, 0x33, 0xf9, 0x67, 0x63, 0x3d, 0x03, 0xbf, 0xfb, 0x6c, 0xcc, 0xc2, 0xc2, 0x99, 0x6d, + 0xa1, 0x16, 0x4c, 0xb6, 0x83, 0x30, 0xbe, 0x1f, 0x84, 0x72, 0x7d, 0xa1, 0x1e, 0xda, 0x04, 0x03, + 0x53, 0xb4, 0xc8, 0x22, 0x8a, 0x9b, 0x10, 0x9c, 0xa2, 0x89, 0x3e, 0x0f, 0x23, 0x51, 0xd3, 0xf1, + 0x48, 0xed, 0xce, 0xec, 0x99, 0xfc, 0x4b, 0xa7, 0xc1, 0x51, 0x72, 0x56, 0x17, 0x9b, 0x1c, 0x81, + 0x82, 0x25, 0x39, 0xb4, 0x02, 0x43, 0x2c, 0x2d, 0x00, 0x0b, 0x3e, 0x9d, 0x13, 0x18, 0xa9, 0xcb, + 0xae, 0x94, 0x9f, 0x4d, 0xac, 0x18, 0xf3, 0xea, 0x74, 0x0f, 0x08, 0xa6, 0x3a, 0x88, 0x66, 0xcf, + 0xe5, 0xef, 0x01, 0xc1, 0x8b, 0xdf, 0x69, 0xf4, 0xda, 0x03, 0x0a, 0x09, 0x27, 0x44, 0xe9, 0xc9, + 0x4c, 0x4f, 0xd3, 0xf3, 0x3d, 0xcc, 0x58, 0x72, 0xcf, 0x52, 0x76, 0x32, 0xd3, 0x93, 0x94, 0x92, + 0xb0, 0x7f, 0x77, 0xa4, 0x9b, 0x53, 0x61, 0x62, 0xd8, 0x9f, 0xb7, 0xba, 0x5e, 0xe8, 0x3e, 0x3d, + 0xa8, 0x56, 0xe8, 0x04, 0x79, 0xd4, 0xaf, 0x58, 0x70, 0xbe, 0x9d, 0xf9, 0x21, 0xe2, 0xda, 0x1f, + 0x4c, 0xb9, 0xc4, 0x3f, 0x5d, 0x05, 0x88, 0xcf, 0x86, 0xe3, 0x9c, 0x96, 0xd2, 0x72, 0x40, 0xf1, + 0x03, 0xcb, 0x01, 0xab, 0x30, 0xca, 0x58, 0xcb, 0x3e, 0x49, 0xd2, 0xd2, 0xe2, 0x10, 0x63, 0x20, + 0x96, 0x44, 0x45, 0xac, 0x48, 0xa0, 0x1f, 0xb0, 0xe0, 0x62, 0xba, 0xeb, 0x98, 0x30, 0xb0, 0x08, + 0xa7, 0xce, 0x25, 0xc0, 0x15, 0xf1, 0xfd, 0x17, 0xeb, 0xbd, 0x90, 0x8f, 0xfa, 0x21, 0xe0, 0xde, + 0x8d, 0xa1, 0x6a, 0x86, 0x08, 0x3a, 0x6c, 0xaa, 0xdd, 0x07, 0x10, 0x43, 0x5f, 0x82, 0xf1, 0xdd, + 0xa0, 0xe3, 0xc7, 0xc2, 0xea, 0x45, 0xf8, 0x29, 0xb2, 0x67, 0xe6, 0x55, 0xad, 0x1c, 0x1b, 0x58, + 0x29, 0xe1, 0x75, 0xf4, 0xa1, 0x85, 0xd7, 0x77, 0x52, 0xa9, 0xb0, 0xcb, 0xf9, 0x61, 0xfb, 0x84, + 0x9c, 0x7f, 0x8c, 0x84, 0xd8, 0xa7, 0x2b, 0x11, 0xfd, 0xb4, 0x95, 0xc1, 0xca, 0x73, 0x19, 0xf9, + 0x35, 0x53, 0x46, 0xbe, 0x92, 0x96, 0x91, 0xbb, 0x54, 0xae, 0x86, 0x78, 0x3c, 0x78, 0xec, 0xe7, + 0x41, 0x83, 0xa9, 0xd9, 0x1e, 0x5c, 0xee, 0x77, 0x2d, 0x31, 0xf3, 0xa7, 0x96, 0x7a, 0x60, 0x4b, + 0xcc, 0x9f, 0x5a, 0xb5, 0x2a, 0x66, 0x90, 0x41, 0xa3, 0x6d, 0xd8, 0xff, 0xd5, 0x82, 0x62, 0x3d, + 0x68, 0x9d, 0x82, 0x0a, 0xf9, 0x73, 0x86, 0x0a, 0xf9, 0xf1, 0x9c, 0x14, 0xe5, 0xb9, 0x0a, 0xe3, + 0xe5, 0x94, 0xc2, 0xf8, 0x62, 0x1e, 0x81, 0xde, 0xea, 0xe1, 0x9f, 0x28, 0x82, 0x9e, 0x50, 0x1d, + 0xfd, 0xc6, 0xc3, 0xd8, 0x1e, 0x17, 0x7b, 0xe5, 0x58, 0x17, 0x94, 0x99, 0xd5, 0x94, 0x74, 0xbd, + 0xfb, 0x53, 0x66, 0x82, 0xfc, 0x16, 0x71, 0xb7, 0xb6, 0x63, 0xd2, 0x4a, 0x7f, 0xce, 0xe9, 0x99, + 0x20, 0xff, 0x67, 0x0b, 0xa6, 0x52, 0xad, 0x23, 0x0f, 0x26, 0x3c, 0x5d, 0xff, 0x27, 0xd6, 0xe9, + 0x43, 0xa9, 0x0e, 0x85, 0x09, 0xa7, 0x56, 0x84, 0x4d, 0xe2, 0x68, 0x1e, 0x40, 0xbd, 0xcf, 0x49, + 0xbd, 0x17, 0xe3, 0xfa, 0xd5, 0x03, 0x5e, 0x84, 0x35, 0x0c, 0xf4, 0x32, 0x8c, 0xc5, 0x41, 0x3b, + 0xf0, 0x82, 0xad, 0xfd, 0x5b, 0x44, 0xc6, 0x77, 0x51, 0x86, 0x59, 0xeb, 0x09, 0x08, 0xeb, 0x78, + 0xf6, 0x4f, 0x15, 0x21, 0x9d, 0x84, 0xff, 0x9b, 0x6b, 0xf2, 0xa3, 0xb9, 0x26, 0xbf, 0x61, 0xc1, + 0x34, 0x6d, 0x9d, 0x19, 0x89, 0xc8, 0xcb, 0x56, 0xe5, 0xa0, 0xb1, 0x7a, 0xe4, 0xa0, 0xb9, 0x42, + 0xcf, 0xae, 0x56, 0xd0, 0x89, 0x85, 0xde, 0x4c, 0x3b, 0x9c, 0x68, 0x29, 0x16, 0x50, 0x81, 0x47, + 0xc2, 0x50, 0x78, 0x3e, 0xe9, 0x78, 0x24, 0x0c, 0xb1, 0x80, 0xca, 0x14, 0x35, 0xa5, 0x9c, 0x14, + 0x35, 0x2c, 0x5a, 0x9d, 0x30, 0x27, 0x10, 0x6c, 0x8f, 0x16, 0xad, 0x4e, 0xda, 0x19, 0x24, 0x38, + 0xf6, 0xcf, 0x15, 0x61, 0xbc, 0x1e, 0xb4, 0x92, 0x17, 0xb2, 0x97, 0x8c, 0x17, 0xb2, 0xcb, 0xa9, + 0x17, 0xb2, 0x69, 0x1d, 0xf7, 0x9b, 0xef, 0x61, 0x1f, 0xd6, 0x7b, 0xd8, 0x3f, 0xb5, 0xd8, 0xac, + 0x55, 0xd7, 0x1a, 0x22, 0x45, 0xee, 0x0b, 0x30, 0xc6, 0x0e, 0x24, 0xe6, 0x6a, 0x27, 0x9f, 0x8d, + 0x58, 0xf4, 0xf9, 0xb5, 0xa4, 0x18, 0xeb, 0x38, 0xe8, 0x2a, 0x8c, 0x46, 0xc4, 0x09, 0x9b, 0xdb, + 0xea, 0x8c, 0x13, 0x8f, 0x2a, 0xbc, 0x0c, 0x2b, 0x28, 0x7a, 0x33, 0x09, 0x94, 0x56, 0xcc, 0x4f, + 0xf6, 0xaa, 0xf7, 0x87, 0x6f, 0x91, 0xfc, 0xe8, 0x68, 0xf6, 0x5b, 0x80, 0xba, 0xf1, 0x07, 0x08, + 0x89, 0x54, 0x31, 0x43, 0x22, 0x95, 0xbb, 0xc2, 0x21, 0xfd, 0xb1, 0x05, 0x93, 0xf5, 0xa0, 0x45, + 0xb7, 0xee, 0x9f, 0xa5, 0x7d, 0xaa, 0x47, 0x89, 0x1c, 0xee, 0x11, 0x25, 0xf2, 0xef, 0x58, 0x30, + 0x52, 0x0f, 0x5a, 0xa7, 0xa0, 0x6d, 0x7f, 0xcd, 0xd4, 0xb6, 0x3f, 0x96, 0xb3, 0x24, 0x72, 0x14, + 0xec, 0xbf, 0x50, 0x84, 0x09, 0xda, 0xcf, 0x60, 0x4b, 0xce, 0x92, 0x31, 0x22, 0xd6, 0x00, 0x23, + 0x42, 0xd9, 0xdc, 0xc0, 0xf3, 0x82, 0xfb, 0xe9, 0x19, 0x5b, 0x61, 0xa5, 0x58, 0x40, 0xd1, 0x73, + 0x30, 0xda, 0x0e, 0xc9, 0x9e, 0x1b, 0x08, 0xfe, 0x51, 0x7b, 0xbb, 0xa8, 0x8b, 0x72, 0xac, 0x30, + 0xa8, 0xdc, 0x15, 0xb9, 0x7e, 0x93, 0xc8, 0x4c, 0xd3, 0x25, 0x96, 0x8c, 0x8a, 0x87, 0x7f, 0xd6, + 0xca, 0xb1, 0x81, 0x85, 0xde, 0x82, 0x32, 0xfb, 0xcf, 0x4e, 0x94, 0xe3, 0x27, 0xcf, 0x11, 0x39, + 0x17, 0x04, 0x01, 0x9c, 0xd0, 0x42, 0xd7, 0x01, 0x62, 0x19, 0x22, 0x38, 0x12, 0x91, 0x6d, 0x14, + 0xaf, 0xad, 0x82, 0x07, 0x47, 0x58, 0xc3, 0x42, 0xcf, 0x42, 0x39, 0x76, 0x5c, 0xef, 0xb6, 0xeb, + 0x93, 0x88, 0xa9, 0x9c, 0x8b, 0x32, 0xa5, 0x82, 0x28, 0xc4, 0x09, 0x9c, 0xf2, 0x3a, 0xcc, 0xed, + 0x9b, 0xa7, 0xde, 0x1a, 0x65, 0xd8, 0x8c, 0xd7, 0xb9, 0xad, 0x4a, 0xb1, 0x86, 0x61, 0xbf, 0x02, + 0xe7, 0xea, 0x41, 0xab, 0x1e, 0x84, 0xf1, 0x4a, 0x10, 0xde, 0x77, 0xc2, 0x96, 0x9c, 0xbf, 0x8a, + 0x8c, 0xee, 0x4f, 0xcf, 0x9e, 0x21, 0xbe, 0x33, 0x8d, 0xb8, 0xfd, 0x2f, 0x32, 0x6e, 0xe7, 0x98, + 0xae, 0x1c, 0x4d, 0x76, 0xef, 0xaa, 0x2c, 0x7b, 0x37, 0x9c, 0x98, 0xa0, 0x3b, 0x2c, 0x33, 0x57, + 0x72, 0x05, 0x89, 0xea, 0xcf, 0x68, 0x99, 0xb9, 0x12, 0x60, 0xe6, 0x9d, 0x65, 0xd6, 0xb7, 0x7f, + 0xb5, 0xc8, 0x4e, 0xa3, 0x54, 0xd2, 0x39, 0xf4, 0x25, 0x98, 0x8c, 0xc8, 0x6d, 0xd7, 0xef, 0x3c, + 0x90, 0x42, 0x78, 0x0f, 0x67, 0x9c, 0xc6, 0xb2, 0x8e, 0xc9, 0x55, 0x79, 0x66, 0x19, 0x4e, 0x51, + 0xa3, 0xf3, 0x14, 0x76, 0xfc, 0x85, 0xe8, 0x6e, 0x44, 0x42, 0x91, 0xf4, 0x8c, 0xcd, 0x13, 0x96, + 0x85, 0x38, 0x81, 0xd3, 0x75, 0xc9, 0xfe, 0xac, 0x05, 0x3e, 0x0e, 0x82, 0x58, 0xae, 0x64, 0x96, + 0x36, 0x47, 0x2b, 0xc7, 0x06, 0x16, 0x5a, 0x01, 0x14, 0x75, 0xda, 0x6d, 0x8f, 0x3d, 0xe7, 0x3b, + 0xde, 0x8d, 0x30, 0xe8, 0xb4, 0xf9, 0x5b, 0x67, 0x71, 0xf1, 0x3c, 0xbd, 0xc2, 0x1a, 0x5d, 0x50, + 0x9c, 0x51, 0x83, 0x9e, 0x3e, 0x9b, 0x11, 0xfb, 0xcd, 0x56, 0x77, 0x51, 0xa8, 0xd7, 0x1b, 0xac, + 0x08, 0x4b, 0x18, 0x5d, 0x4c, 0xac, 0x79, 0x8e, 0x39, 0x9c, 0x2c, 0x26, 0xac, 0x4a, 0xb1, 0x86, + 0x81, 0x96, 0x61, 0x24, 0xda, 0x8f, 0x9a, 0xb1, 0x88, 0xc3, 0x94, 0x93, 0xbe, 0xb2, 0xc1, 0x50, + 0xb4, 0x94, 0x0a, 0xbc, 0x0a, 0x96, 0x75, 0xed, 0xef, 0x62, 0x97, 0x21, 0x4b, 0x91, 0x15, 0x77, + 0x42, 0x82, 0x76, 0x61, 0xa2, 0xcd, 0xa6, 0x5c, 0x04, 0x70, 0x16, 0xf3, 0xf6, 0xd2, 0x80, 0x52, + 0xed, 0x7d, 0x7a, 0xd0, 0x28, 0xad, 0x13, 0x13, 0x17, 0xea, 0x3a, 0x39, 0x6c, 0x52, 0xb7, 0xff, + 0xd5, 0x0c, 0x3b, 0x73, 0x1b, 0x5c, 0x54, 0x1d, 0x11, 0x06, 0xc5, 0x82, 0x2f, 0x9f, 0xcb, 0xd7, + 0x99, 0x24, 0x5f, 0x24, 0x8c, 0x92, 0xb1, 0xac, 0x8b, 0xde, 0x64, 0x6f, 0xd3, 0xfc, 0xa0, 0xeb, + 0x97, 0xa9, 0x98, 0x63, 0x19, 0xcf, 0xd0, 0xa2, 0x22, 0xd6, 0x88, 0xa0, 0xdb, 0x30, 0x21, 0x32, + 0x2a, 0x09, 0xa5, 0x58, 0xd1, 0x50, 0x7a, 0x4c, 0x60, 0x1d, 0x78, 0x94, 0x2e, 0xc0, 0x66, 0x65, + 0xb4, 0x05, 0x17, 0xb5, 0xf4, 0x82, 0x37, 0x42, 0x87, 0xbd, 0x57, 0xba, 0x6c, 0x13, 0x69, 0xe7, + 0xe6, 0x93, 0x87, 0x07, 0x95, 0x8b, 0xeb, 0xbd, 0x10, 0x71, 0x6f, 0x3a, 0xe8, 0x0e, 0x9c, 0xe3, + 0x7e, 0x7b, 0x55, 0xe2, 0xb4, 0x3c, 0xd7, 0x57, 0x07, 0x33, 0x5f, 0x87, 0x17, 0x0e, 0x0f, 0x2a, + 0xe7, 0x16, 0xb2, 0x10, 0x70, 0x76, 0x3d, 0xf4, 0x1a, 0x94, 0x5b, 0x7e, 0x24, 0xc6, 0x60, 0xd8, + 0xc8, 0x9c, 0x59, 0xae, 0xae, 0x35, 0xd4, 0xf7, 0x27, 0x7f, 0x70, 0x52, 0x01, 0x6d, 0x71, 0xc5, + 0x98, 0x92, 0x43, 0x47, 0xf2, 0xb3, 0xa4, 0x8b, 0x25, 0x61, 0x78, 0xee, 0x70, 0x8d, 0xb0, 0xb2, + 0x7c, 0x35, 0x9c, 0x7a, 0x0c, 0xc2, 0xe8, 0x0d, 0x40, 0x94, 0x51, 0x73, 0x9b, 0x64, 0xa1, 0xc9, + 0xe2, 0x68, 0x33, 0x3d, 0xe2, 0xa8, 0xe1, 0x29, 0x81, 0x1a, 0x5d, 0x18, 0x38, 0xa3, 0x16, 0xba, + 0x49, 0x0f, 0x32, 0xbd, 0x54, 0x58, 0xf0, 0x4a, 0xe6, 0x7e, 0xb6, 0x4a, 0xda, 0x21, 0x69, 0x3a, + 0x31, 0x69, 0x99, 0x14, 0x71, 0xaa, 0x1e, 0xbd, 0x4b, 0x55, 0x4a, 0x1d, 0x30, 0x83, 0x65, 0x74, + 0xa7, 0xd5, 0xa1, 0x72, 0xf1, 0x76, 0x10, 0xc5, 0x6b, 0x24, 0xbe, 0x1f, 0x84, 0x3b, 0x22, 0x36, + 0x59, 0x12, 0x26, 0x33, 0x01, 0x61, 0x1d, 0x8f, 0xf2, 0xc1, 0xec, 0x71, 0xb8, 0x56, 0x65, 0x2f, + 0x74, 0xa3, 0xc9, 0x3e, 0xb9, 0xc9, 0x8b, 0xb1, 0x84, 0x4b, 0xd4, 0x5a, 0x7d, 0x89, 0xbd, 0xb6, + 0xa5, 0x50, 0x6b, 0xf5, 0x25, 0x2c, 0xe1, 0x88, 0x74, 0x67, 0x25, 0x9d, 0xcc, 0xd7, 0x6a, 0x76, + 0x5f, 0x07, 0x03, 0x26, 0x26, 0xf5, 0x61, 0x5a, 0xe5, 0x43, 0xe5, 0x41, 0xdb, 0xa2, 0xd9, 0x29, + 0xb6, 0x48, 0x06, 0x8f, 0xf8, 0xa6, 0xf4, 0xc4, 0xb5, 0x14, 0x25, 0xdc, 0x45, 0xdb, 0x08, 0x5f, + 0x32, 0xdd, 0x37, 0x25, 0xd2, 0x35, 0x28, 0x47, 0x9d, 0x8d, 0x56, 0xb0, 0xeb, 0xb8, 0x3e, 0x7b, + 0x1c, 0xd3, 0x98, 0xac, 0x86, 0x04, 0xe0, 0x04, 0x07, 0xad, 0xc0, 0xa8, 0x23, 0x95, 0xc0, 0x28, + 0x3f, 0x56, 0x81, 0x52, 0xfd, 0x72, 0xf7, 0x5d, 0xa9, 0xf6, 0x55, 0x75, 0xd1, 0xab, 0x30, 0x21, + 0xbc, 0xb5, 0x78, 0x04, 0x07, 0xf6, 0x78, 0xa5, 0x99, 0xe3, 0x37, 0x74, 0x20, 0x36, 0x71, 0xd1, + 0x17, 0x61, 0x92, 0x52, 0x49, 0x0e, 0xb6, 0xd9, 0xb3, 0x83, 0x9c, 0x88, 0x5a, 0xaa, 0x0b, 0xbd, + 0x32, 0x4e, 0x11, 0x43, 0x2d, 0x78, 0xc2, 0xe9, 0xc4, 0x01, 0x53, 0xa4, 0x9b, 0xeb, 0x7f, 0x3d, + 0xd8, 0x21, 0x3e, 0x7b, 0xc3, 0x1a, 0x5d, 0xbc, 0x7c, 0x78, 0x50, 0x79, 0x62, 0xa1, 0x07, 0x1e, + 0xee, 0x49, 0x05, 0xdd, 0x85, 0xb1, 0x38, 0xf0, 0x98, 0x61, 0x3c, 0x65, 0x25, 0xce, 0xe7, 0x87, + 0xff, 0x59, 0x57, 0x68, 0xba, 0x12, 0x49, 0x55, 0xc5, 0x3a, 0x1d, 0xb4, 0xce, 0xf7, 0x18, 0x0b, + 0x8c, 0x4a, 0xa2, 0xd9, 0xc7, 0xf2, 0x07, 0x46, 0xc5, 0x4f, 0x35, 0xb7, 0xa0, 0xa8, 0x89, 0x75, + 0x32, 0xe8, 0x06, 0xcc, 0xb4, 0x43, 0x37, 0x60, 0x0b, 0x5b, 0x3d, 0x62, 0xcc, 0x9a, 0xd9, 0x0d, + 0xea, 0x69, 0x04, 0xdc, 0x5d, 0x87, 0x0a, 0x99, 0xb2, 0x70, 0xf6, 0x02, 0x4f, 0x95, 0xc5, 0x19, + 0x6f, 0x5e, 0x86, 0x15, 0x14, 0xad, 0xb2, 0x73, 0x99, 0x8b, 0x83, 0xb3, 0x73, 0xf9, 0x31, 0x1e, + 0x74, 0xb1, 0x91, 0xf3, 0x4b, 0xea, 0x2f, 0x4e, 0x28, 0xd0, 0x7b, 0x23, 0xda, 0x76, 0x42, 0x52, + 0x0f, 0x83, 0x26, 0xe1, 0x9d, 0xe1, 0x36, 0xf9, 0x8f, 0xf3, 0xf8, 0x8d, 0xf4, 0xde, 0x68, 0x64, + 0x21, 0xe0, 0xec, 0x7a, 0xa8, 0xa5, 0x65, 0x88, 0xa6, 0x6c, 0x68, 0x34, 0xfb, 0x44, 0x0f, 0x33, + 0xa3, 0x14, 0xcf, 0x9a, 0xac, 0x45, 0xa3, 0x38, 0xc2, 0x29, 0x9a, 0xe8, 0xdb, 0x60, 0x5a, 0x84, + 0x3b, 0x4a, 0xc6, 0xfd, 0x62, 0x62, 0xbf, 0x88, 0x53, 0x30, 0xdc, 0x85, 0x3d, 0xf7, 0xad, 0x30, + 0xd3, 0x75, 0xe3, 0x1c, 0x2b, 0xf8, 0xf8, 0x1f, 0x0d, 0x41, 0x59, 0x29, 0xd3, 0xd1, 0x35, 0xf3, + 0x8d, 0xe4, 0x42, 0xfa, 0x8d, 0x64, 0x94, 0xf2, 0xf4, 0xfa, 0xb3, 0xc8, 0xba, 0x61, 0x56, 0x57, + 0xc8, 0x4f, 0xf5, 0xa5, 0x73, 0xe5, 0x7d, 0x5d, 0xf4, 0x34, 0xdd, 0x48, 0x71, 0xe0, 0xc7, 0x96, + 0x52, 0x4f, 0x75, 0xcb, 0x80, 0x99, 0x76, 0xd1, 0x53, 0x54, 0xb0, 0x69, 0xd5, 0xea, 0xe9, 0xd4, + 0x93, 0x75, 0x5a, 0x88, 0x39, 0x8c, 0x09, 0x80, 0x94, 0x3d, 0x62, 0x02, 0xe0, 0xc8, 0x43, 0x0a, + 0x80, 0x92, 0x00, 0x4e, 0x68, 0x21, 0x0f, 0x66, 0x9a, 0x66, 0xd6, 0x50, 0xe5, 0x96, 0xf7, 0x54, + 0xdf, 0xfc, 0x9d, 0x1d, 0x2d, 0x45, 0xdb, 0x52, 0x9a, 0x0a, 0xee, 0x26, 0x8c, 0x5e, 0x85, 0xd1, + 0xf7, 0x82, 0x88, 0x2d, 0x26, 0xc1, 0x23, 0x48, 0xf7, 0xa5, 0xd1, 0x37, 0xef, 0x34, 0x58, 0xf9, + 0xd1, 0x41, 0x65, 0xac, 0x1e, 0xb4, 0xe4, 0x5f, 0xac, 0x2a, 0xa0, 0x07, 0x70, 0xce, 0x38, 0x59, + 0x55, 0x77, 0x61, 0xf0, 0xee, 0x5e, 0x14, 0xcd, 0x9d, 0xab, 0x65, 0x51, 0xc2, 0xd9, 0x0d, 0xd0, + 0xe3, 0xca, 0x0f, 0x44, 0xc6, 0x5d, 0xc9, 0x87, 0x30, 0x76, 0xa3, 0xac, 0x3b, 0xaf, 0xa7, 0x10, + 0x70, 0x77, 0x1d, 0xfb, 0x97, 0xf9, 0xdb, 0x83, 0xd0, 0x50, 0x92, 0xa8, 0xe3, 0x9d, 0x46, 0x42, + 0xa7, 0x65, 0x43, 0x79, 0xfa, 0xd0, 0xef, 0x5b, 0xbf, 0x6e, 0xb1, 0xf7, 0xad, 0x75, 0xb2, 0xdb, + 0xf6, 0xa8, 0x9c, 0xfc, 0xe8, 0x3b, 0xfe, 0x26, 0x8c, 0xc6, 0xa2, 0xb5, 0x5e, 0x39, 0xa8, 0xb4, + 0x4e, 0xb1, 0x37, 0x3e, 0xc5, 0xa1, 0xc8, 0x52, 0xac, 0xc8, 0xd8, 0xff, 0x98, 0xcf, 0x80, 0x84, + 0x9c, 0x82, 0x22, 0xab, 0x6a, 0x2a, 0xb2, 0x2a, 0x7d, 0xbe, 0x20, 0x47, 0xa1, 0xf5, 0x8f, 0xcc, + 0x7e, 0x33, 0x61, 0xf0, 0xa3, 0xfe, 0xb0, 0x6a, 0xff, 0xb0, 0x05, 0x67, 0xb3, 0x2c, 0x91, 0x28, + 0x57, 0xc9, 0x45, 0x51, 0xf5, 0xd0, 0xac, 0x46, 0xf0, 0x9e, 0x28, 0xc7, 0x0a, 0x63, 0xe0, 0xf4, + 0x0e, 0xc7, 0x8b, 0xef, 0x76, 0x07, 0x26, 0xea, 0x21, 0xd1, 0xee, 0x80, 0xd7, 0xb9, 0x1f, 0x1c, + 0xef, 0xcf, 0x73, 0xc7, 0xf6, 0x81, 0xb3, 0x7f, 0xa6, 0x00, 0x67, 0xf9, 0x4b, 0xd1, 0xc2, 0x5e, + 0xe0, 0xb6, 0xea, 0x41, 0x4b, 0xa4, 0xe6, 0x78, 0x1b, 0xc6, 0xdb, 0x9a, 0xfe, 0xa0, 0x57, 0x84, + 0x29, 0x5d, 0xcf, 0x90, 0xc8, 0x71, 0x7a, 0x29, 0x36, 0x68, 0xa1, 0x16, 0x8c, 0x93, 0x3d, 0xb7, + 0xa9, 0x9e, 0x1b, 0x0a, 0xc7, 0xbe, 0x1b, 0x54, 0x2b, 0xcb, 0x1a, 0x1d, 0x6c, 0x50, 0x7d, 0x04, + 0xd9, 0xda, 0xec, 0x1f, 0xb1, 0xe0, 0xb1, 0x9c, 0x78, 0x54, 0xb4, 0xb9, 0xfb, 0xec, 0x4d, 0x4e, + 0x24, 0x7e, 0x52, 0xcd, 0xf1, 0x97, 0x3a, 0x2c, 0xa0, 0xe8, 0xf3, 0x00, 0xfc, 0xa5, 0x8d, 0x8a, + 0x35, 0xfd, 0x02, 0xf7, 0x18, 0x31, 0x47, 0xb4, 0x58, 0x11, 0xb2, 0x3e, 0xd6, 0x68, 0xd9, 0x3f, + 0x59, 0x84, 0x21, 0xf6, 0xb2, 0x83, 0x56, 0x60, 0x64, 0x9b, 0x47, 0x68, 0x1e, 0x24, 0x18, 0x74, + 0x22, 0x1f, 0xf2, 0x02, 0x2c, 0x2b, 0xa3, 0x55, 0x38, 0xc3, 0x23, 0x5c, 0x7b, 0x55, 0xe2, 0x39, + 0xfb, 0x52, 0xcd, 0xc0, 0x93, 0x25, 0xa9, 0xb8, 0x17, 0xb5, 0x6e, 0x14, 0x9c, 0x55, 0x0f, 0xbd, + 0x0e, 0x93, 0x94, 0x2f, 0x0b, 0x3a, 0xb1, 0xa4, 0xc4, 0x63, 0x5b, 0x2b, 0x46, 0x70, 0xdd, 0x80, + 0xe2, 0x14, 0x36, 0x15, 0x98, 0xda, 0x5d, 0x0a, 0x95, 0xa1, 0x44, 0x60, 0x32, 0x95, 0x28, 0x26, + 0x2e, 0x33, 0x41, 0xea, 0x30, 0x83, 0xab, 0xf5, 0xed, 0x90, 0x44, 0xdb, 0x81, 0xd7, 0x12, 0xb9, + 0xb6, 0x13, 0x13, 0xa4, 0x14, 0x1c, 0x77, 0xd5, 0xa0, 0x54, 0x36, 0x1d, 0xd7, 0xeb, 0x84, 0x24, + 0xa1, 0x32, 0x6c, 0x52, 0x59, 0x49, 0xc1, 0x71, 0x57, 0x0d, 0xba, 0x8e, 0xce, 0x89, 0xe4, 0xd7, + 0xd2, 0x1b, 0x5f, 0xd9, 0x95, 0x8d, 0x48, 0xbf, 0xa4, 0x1e, 0xe1, 0x68, 0x84, 0xe5, 0x8d, 0x4a, + 0x9f, 0xad, 0xe9, 0x01, 0x85, 0x47, 0x92, 0xa4, 0xf2, 0x30, 0x29, 0x98, 0x7f, 0xd7, 0x82, 0x33, + 0x19, 0xf6, 0xab, 0xfc, 0xa8, 0xda, 0x72, 0xa3, 0x58, 0x25, 0x84, 0xd1, 0x8e, 0x2a, 0x5e, 0x8e, + 0x15, 0x06, 0xdd, 0x0f, 0xfc, 0x30, 0x4c, 0x1f, 0x80, 0xc2, 0x3e, 0x4c, 0x40, 0x8f, 0x77, 0x00, + 0xa2, 0xcb, 0x50, 0xea, 0x44, 0x44, 0x06, 0x92, 0x52, 0xe7, 0x37, 0xd3, 0x0c, 0x33, 0x08, 0x65, + 0x4d, 0xb7, 0x94, 0x52, 0x56, 0x63, 0x4d, 0xb9, 0xa6, 0x95, 0xc3, 0xec, 0xaf, 0x16, 0xe1, 0x42, + 0xae, 0xa5, 0x3a, 0xed, 0xd2, 0x6e, 0xe0, 0xbb, 0x71, 0xa0, 0x5e, 0x0d, 0x79, 0x28, 0x13, 0xd2, + 0xde, 0x5e, 0x15, 0xe5, 0x58, 0x61, 0xa0, 0x2b, 0x32, 0x0d, 0x7b, 0x3a, 0xe5, 0xcd, 0x62, 0xd5, + 0xc8, 0xc4, 0x3e, 0x68, 0x3a, 0xb1, 0xa7, 0xa0, 0xd4, 0x0e, 0x02, 0x2f, 0x7d, 0x18, 0xd1, 0xee, + 0x06, 0x81, 0x87, 0x19, 0x10, 0x7d, 0x42, 0x8c, 0x43, 0xea, 0x99, 0x0c, 0x3b, 0xad, 0x20, 0xd2, + 0x06, 0xe3, 0x19, 0x18, 0xd9, 0x21, 0xfb, 0xa1, 0xeb, 0x6f, 0xa5, 0x9f, 0x4f, 0x6f, 0xf1, 0x62, + 0x2c, 0xe1, 0x66, 0xc6, 0x87, 0x91, 0x93, 0xce, 0x03, 0x36, 0xda, 0xf7, 0x6a, 0xfb, 0xfe, 0x22, + 0x4c, 0xe1, 0xc5, 0xea, 0x37, 0x27, 0xe2, 0x6e, 0xf7, 0x44, 0x9c, 0x74, 0x1e, 0xb0, 0xfe, 0xb3, + 0xf1, 0x0b, 0x16, 0x4c, 0xb1, 0xa8, 0xc8, 0x22, 0x80, 0x86, 0x1b, 0xf8, 0xa7, 0xc0, 0xba, 0x3d, + 0x05, 0x43, 0x21, 0x6d, 0x34, 0x9d, 0xdc, 0x87, 0xf5, 0x04, 0x73, 0x18, 0x7a, 0x02, 0x4a, 0xac, + 0x0b, 0x74, 0xf2, 0xc6, 0x79, 0x5e, 0x84, 0xaa, 0x13, 0x3b, 0x98, 0x95, 0x32, 0xaf, 0x70, 0x4c, + 0xda, 0x9e, 0xcb, 0x3b, 0x9d, 0x3c, 0x49, 0x7c, 0x34, 0xbc, 0xc2, 0x33, 0xbb, 0xf6, 0xc1, 0xbc, + 0xc2, 0xb3, 0x49, 0xf6, 0x16, 0x8b, 0xfe, 0x5b, 0x01, 0x2e, 0x65, 0xd6, 0x1b, 0xd8, 0x2b, 0xbc, + 0x77, 0xed, 0x93, 0xb1, 0x82, 0xc9, 0x36, 0x4e, 0x29, 0x9e, 0xa2, 0x71, 0x4a, 0x69, 0x50, 0xce, + 0x71, 0x68, 0x00, 0x67, 0xed, 0xcc, 0x21, 0xfb, 0x88, 0x38, 0x6b, 0x67, 0xf6, 0x2d, 0x47, 0xac, + 0xfb, 0x93, 0x42, 0xce, 0xb7, 0x30, 0x01, 0xef, 0x2a, 0x3d, 0x67, 0x18, 0x30, 0x12, 0x9c, 0xf0, + 0x38, 0x3f, 0x63, 0x78, 0x19, 0x56, 0x50, 0xe4, 0x6a, 0x6e, 0xcf, 0x85, 0xfc, 0xd4, 0x8f, 0xb9, + 0x4d, 0xcd, 0x9b, 0x2f, 0x48, 0x6a, 0x08, 0x32, 0x5c, 0xa0, 0x57, 0x35, 0xa1, 0xbc, 0x38, 0xb8, + 0x50, 0x3e, 0x9e, 0x2d, 0x90, 0xa3, 0x05, 0x98, 0xda, 0x75, 0x7d, 0x96, 0xca, 0xdf, 0x64, 0x45, + 0x55, 0x14, 0x90, 0x55, 0x13, 0x8c, 0xd3, 0xf8, 0x73, 0xaf, 0xc2, 0xc4, 0xc3, 0xab, 0x23, 0xbf, + 0x51, 0x84, 0xc7, 0x7b, 0x6c, 0x7b, 0x7e, 0xd6, 0x1b, 0x73, 0xa0, 0x9d, 0xf5, 0x5d, 0xf3, 0x50, + 0x87, 0xb3, 0x9b, 0x1d, 0xcf, 0xdb, 0x67, 0xf6, 0x9f, 0xa4, 0x25, 0x31, 0x04, 0xaf, 0xf8, 0x84, + 0xcc, 0x44, 0xb1, 0x92, 0x81, 0x83, 0x33, 0x6b, 0xa2, 0x37, 0x00, 0x05, 0x22, 0xef, 0xec, 0x0d, + 0xe2, 0x0b, 0xbd, 0x3c, 0x1b, 0xf8, 0x62, 0xb2, 0x19, 0xef, 0x74, 0x61, 0xe0, 0x8c, 0x5a, 0x94, + 0xe9, 0xa7, 0xb7, 0xd2, 0xbe, 0xea, 0x56, 0x8a, 0xe9, 0xc7, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x06, + 0xcc, 0x38, 0x7b, 0x8e, 0xcb, 0xa3, 0xe3, 0x49, 0x02, 0x9c, 0xeb, 0x57, 0x4a, 0xb0, 0x85, 0x34, + 0x02, 0xee, 0xae, 0x93, 0x72, 0x8c, 0x1e, 0xce, 0x77, 0x8c, 0xee, 0x7d, 0x2e, 0xf6, 0xd3, 0xe9, + 0xda, 0xff, 0xde, 0xa2, 0xd7, 0x57, 0x46, 0xee, 0x78, 0x3a, 0x0e, 0x4a, 0x37, 0xa9, 0xf9, 0x28, + 0x9f, 0xd3, 0x2c, 0x3c, 0x12, 0x20, 0x36, 0x71, 0xf9, 0x82, 0x88, 0x12, 0x27, 0x19, 0x83, 0x75, + 0x17, 0x31, 0x0e, 0x14, 0x06, 0xfa, 0x02, 0x8c, 0xb4, 0xdc, 0x3d, 0x37, 0x0a, 0x42, 0xb1, 0x59, + 0x8e, 0xe9, 0x6a, 0x90, 0x9c, 0x83, 0x55, 0x4e, 0x06, 0x4b, 0x7a, 0xf6, 0xf7, 0x17, 0x60, 0x42, + 0xb6, 0xf8, 0x66, 0x27, 0x88, 0x9d, 0x53, 0xb8, 0x96, 0x6f, 0x18, 0xd7, 0xf2, 0x27, 0x7a, 0x05, + 0x7a, 0x60, 0x5d, 0xca, 0xbd, 0x8e, 0xef, 0xa4, 0xae, 0xe3, 0xa7, 0xfb, 0x93, 0xea, 0x7d, 0x0d, + 0xff, 0x13, 0x0b, 0x66, 0x0c, 0xfc, 0x53, 0xb8, 0x0d, 0x56, 0xcc, 0xdb, 0xe0, 0xc9, 0xbe, 0xdf, + 0x90, 0x73, 0x0b, 0x7c, 0x4f, 0x31, 0xd5, 0x77, 0x76, 0xfa, 0xbf, 0x07, 0xa5, 0x6d, 0x27, 0x6c, + 0xf5, 0x0a, 0x28, 0xdb, 0x55, 0x69, 0xfe, 0xa6, 0x13, 0xb6, 0xf8, 0x19, 0xfe, 0x9c, 0xca, 0x56, + 0xe9, 0x84, 0xad, 0xbe, 0x3e, 0x61, 0xac, 0x29, 0xf4, 0x0a, 0x0c, 0x47, 0xcd, 0xa0, 0xad, 0x2c, + 0x36, 0x2f, 0xf3, 0x4c, 0x96, 0xb4, 0xe4, 0xe8, 0xa0, 0x82, 0xcc, 0xe6, 0x68, 0x31, 0x16, 0xf8, + 0xe8, 0x6d, 0x98, 0x60, 0xbf, 0x94, 0xe5, 0x42, 0x31, 0x3f, 0x8d, 0x41, 0x43, 0x47, 0xe4, 0x06, + 0x30, 0x46, 0x11, 0x36, 0x49, 0xcd, 0x6d, 0x41, 0x59, 0x7d, 0xd6, 0x23, 0xf5, 0xe5, 0xf9, 0x37, + 0x45, 0x38, 0x93, 0xb1, 0xe6, 0x50, 0x64, 0xcc, 0xc4, 0x0b, 0x03, 0x2e, 0xd5, 0x0f, 0x38, 0x17, + 0x11, 0x93, 0x86, 0x5a, 0x62, 0x6d, 0x0d, 0xdc, 0xe8, 0xdd, 0x88, 0xa4, 0x1b, 0xa5, 0x45, 0xfd, + 0x1b, 0xa5, 0x8d, 0x9d, 0xda, 0x50, 0xd3, 0x86, 0x54, 0x4f, 0x1f, 0xe9, 0x9c, 0xfe, 0x61, 0x11, + 0xce, 0x66, 0xc5, 0x9e, 0x41, 0xdf, 0x99, 0x4a, 0x69, 0xf3, 0xd2, 0xa0, 0x51, 0x6b, 0x78, 0x9e, + 0x1b, 0x91, 0xa0, 0x79, 0xde, 0x4c, 0x72, 0xd3, 0x77, 0x98, 0x45, 0x9b, 0xcc, 0x01, 0x34, 0xe4, + 0xa9, 0x88, 0xe4, 0xf1, 0xf1, 0xe9, 0x81, 0x3b, 0x20, 0x72, 0x18, 0x45, 0x29, 0x07, 0x50, 0x59, + 0xdc, 0xdf, 0x01, 0x54, 0xb6, 0x3c, 0xe7, 0xc2, 0x98, 0xf6, 0x35, 0x8f, 0x74, 0xc6, 0x77, 0xe8, + 0x6d, 0xa5, 0xf5, 0xfb, 0x91, 0xce, 0xfa, 0x8f, 0x58, 0x90, 0x32, 0x8f, 0x54, 0xea, 0x2e, 0x2b, + 0x57, 0xdd, 0x75, 0x19, 0x4a, 0x61, 0xe0, 0x91, 0x74, 0x06, 0x19, 0x1c, 0x78, 0x04, 0x33, 0x08, + 0xc5, 0x88, 0x13, 0x65, 0xc7, 0xb8, 0x2e, 0xc8, 0x09, 0x11, 0xed, 0x29, 0x18, 0xf2, 0xc8, 0x1e, + 0xf1, 0xd2, 0xe1, 0xd9, 0x6f, 0xd3, 0x42, 0xcc, 0x61, 0xf6, 0x2f, 0x94, 0xe0, 0x62, 0x4f, 0x17, + 0x6a, 0x2a, 0x0e, 0x6d, 0x39, 0x31, 0xb9, 0xef, 0xec, 0xa7, 0xe3, 0x28, 0xdf, 0xe0, 0xc5, 0x58, + 0xc2, 0x99, 0xc5, 0x38, 0x8f, 0x9b, 0x98, 0x52, 0x0e, 0x8a, 0x70, 0x89, 0x02, 0xfa, 0x08, 0x92, + 0xd3, 0x5f, 0x07, 0x88, 0x22, 0x6f, 0xd9, 0xa7, 0xdc, 0x5d, 0x4b, 0x98, 0xa2, 0x27, 0xf1, 0x35, + 0x1b, 0xb7, 0x05, 0x04, 0x6b, 0x58, 0xa8, 0x0a, 0xd3, 0xed, 0x30, 0x88, 0xb9, 0xae, 0xb5, 0xca, + 0x0d, 0x85, 0x86, 0x4c, 0xef, 0xd5, 0x7a, 0x0a, 0x8e, 0xbb, 0x6a, 0xa0, 0x97, 0x61, 0x4c, 0x78, + 0xb4, 0xd6, 0x83, 0xc0, 0x13, 0x6a, 0x20, 0x65, 0x76, 0xd2, 0x48, 0x40, 0x58, 0xc7, 0xd3, 0xaa, + 0x31, 0x05, 0xee, 0x48, 0x66, 0x35, 0xae, 0xc4, 0xd5, 0xf0, 0x52, 0x71, 0xa8, 0x46, 0x07, 0x8a, + 0x43, 0x95, 0x28, 0xc6, 0xca, 0x03, 0xbf, 0x59, 0x41, 0x5f, 0x55, 0xd2, 0xcf, 0x96, 0xe0, 0x8c, + 0x58, 0x38, 0x8f, 0x7a, 0xb9, 0x3c, 0xa2, 0x14, 0xfa, 0xdf, 0x5c, 0x33, 0xa7, 0xbd, 0x66, 0x7e, + 0xc0, 0x02, 0x93, 0xbd, 0x42, 0xff, 0x5f, 0x6e, 0x20, 0xfa, 0x97, 0x73, 0xd9, 0xb5, 0x96, 0xbc, + 0x40, 0x3e, 0x60, 0x48, 0x7a, 0xfb, 0xdf, 0x59, 0xf0, 0x64, 0x5f, 0x8a, 0x68, 0x19, 0xca, 0x8c, + 0x07, 0xd4, 0xa4, 0xb3, 0xa7, 0x95, 0x21, 0xa1, 0x04, 0xe4, 0xb0, 0xa4, 0x49, 0x4d, 0xb4, 0xdc, + 0x15, 0xf1, 0xff, 0x99, 0x8c, 0x88, 0xff, 0xe7, 0x8c, 0xe1, 0x79, 0xc8, 0x90, 0xff, 0xbf, 0x5c, + 0x84, 0x61, 0xbe, 0xe2, 0x4f, 0x41, 0x0c, 0x5b, 0x11, 0x7a, 0xdb, 0x1e, 0x91, 0xa8, 0x78, 0x5f, + 0xe6, 0xab, 0x4e, 0xec, 0x70, 0x36, 0x41, 0xdd, 0x56, 0x89, 0x86, 0x17, 0xcd, 0x1b, 0xf7, 0xd9, + 0x5c, 0x4a, 0x31, 0x09, 0x9c, 0x86, 0x76, 0xbb, 0x7d, 0x09, 0x20, 0x62, 0xd9, 0xf2, 0x29, 0x0d, + 0x11, 0xd3, 0xec, 0x93, 0x3d, 0x5a, 0x6f, 0x28, 0x64, 0xde, 0x87, 0x64, 0xa7, 0x2b, 0x00, 0xd6, + 0x28, 0xce, 0x7d, 0x06, 0xca, 0x0a, 0xb9, 0x9f, 0x16, 0x67, 0x5c, 0x67, 0x2e, 0x3e, 0x07, 0x53, + 0xa9, 0xb6, 0x8e, 0xa5, 0x04, 0xfa, 0x45, 0x0b, 0xa6, 0x78, 0x97, 0x97, 0xfd, 0x3d, 0x71, 0xa6, + 0xbe, 0x0f, 0x67, 0xbd, 0x8c, 0xb3, 0x4d, 0xcc, 0xe8, 0xe0, 0x67, 0xa1, 0x52, 0xfa, 0x64, 0x41, + 0x71, 0x66, 0x1b, 0xe8, 0x2a, 0x5d, 0xb7, 0xf4, 0xec, 0x72, 0x3c, 0xe1, 0x7d, 0x34, 0xce, 0xd7, + 0x2c, 0x2f, 0xc3, 0x0a, 0x6a, 0xff, 0xb6, 0x05, 0x33, 0xbc, 0xe7, 0xb7, 0xc8, 0xbe, 0xda, 0xe1, + 0x1f, 0x66, 0xdf, 0x45, 0x12, 0x8e, 0x42, 0x4e, 0x12, 0x0e, 0xfd, 0xd3, 0x8a, 0x3d, 0x3f, 0xed, + 0x67, 0x2c, 0x10, 0x2b, 0xf0, 0x14, 0x44, 0xf9, 0x6f, 0x35, 0x45, 0xf9, 0xb9, 0xfc, 0x45, 0x9d, + 0x23, 0xc3, 0xff, 0xb1, 0x05, 0xd3, 0x1c, 0x21, 0x79, 0x4b, 0xfe, 0x50, 0xe7, 0x61, 0x90, 0x6c, + 0x7a, 0x2a, 0xc5, 0x76, 0xf6, 0x47, 0x19, 0x93, 0x55, 0xea, 0x39, 0x59, 0x2d, 0xb9, 0x81, 0x8e, + 0x91, 0x49, 0xf2, 0xd8, 0xc1, 0xac, 0xed, 0x3f, 0xb0, 0x00, 0xf1, 0x66, 0x0c, 0xf6, 0x87, 0x32, + 0x15, 0xac, 0x54, 0xbb, 0x2e, 0x92, 0xa3, 0x46, 0x41, 0xb0, 0x86, 0x75, 0x22, 0xc3, 0x93, 0x32, + 0x08, 0x28, 0xf6, 0x37, 0x08, 0x38, 0xc6, 0x88, 0xfe, 0xef, 0x12, 0xa4, 0xdd, 0x01, 0xd0, 0x3d, + 0x18, 0x6f, 0x3a, 0x6d, 0x67, 0xc3, 0xf5, 0xdc, 0xd8, 0x25, 0x51, 0x2f, 0x4b, 0xa2, 0x25, 0x0d, + 0x4f, 0x3c, 0xf5, 0x6a, 0x25, 0xd8, 0xa0, 0x83, 0xe6, 0x01, 0xda, 0xa1, 0xbb, 0xe7, 0x7a, 0x64, + 0x8b, 0x69, 0x1c, 0x98, 0xbf, 0x23, 0x37, 0x8f, 0x91, 0xa5, 0x58, 0xc3, 0xc8, 0x70, 0x5d, 0x2b, + 0x3e, 0x3a, 0xd7, 0xb5, 0xd2, 0x31, 0x5d, 0xd7, 0x86, 0x06, 0x72, 0x5d, 0xc3, 0x70, 0x5e, 0xb2, + 0x48, 0xf4, 0xff, 0x8a, 0xeb, 0x11, 0xc1, 0x17, 0x73, 0x2f, 0xc8, 0xb9, 0xc3, 0x83, 0xca, 0x79, + 0x9c, 0x89, 0x81, 0x73, 0x6a, 0xa2, 0xcf, 0xc3, 0xac, 0xe3, 0x79, 0xc1, 0x7d, 0x35, 0x6a, 0xcb, + 0x51, 0xd3, 0xf1, 0xb8, 0xc6, 0x7e, 0x84, 0x51, 0x7d, 0xe2, 0xf0, 0xa0, 0x32, 0xbb, 0x90, 0x83, + 0x83, 0x73, 0x6b, 0xa7, 0x3c, 0xdf, 0x46, 0xfb, 0x7a, 0xbe, 0xbd, 0x06, 0xe5, 0x76, 0x18, 0x34, + 0x57, 0x35, 0x6f, 0x9c, 0x4b, 0x2c, 0x4f, 0xbd, 0x2c, 0x3c, 0x3a, 0xa8, 0x4c, 0xa8, 0x3f, 0xec, + 0x86, 0x4f, 0x2a, 0xd8, 0x3b, 0x70, 0xa6, 0x41, 0x42, 0x97, 0x65, 0xc0, 0x6c, 0x25, 0x1b, 0x7a, + 0x1d, 0xca, 0x61, 0xea, 0x08, 0x1b, 0x28, 0xb0, 0x92, 0x16, 0xe5, 0x57, 0x1e, 0x59, 0x09, 0x21, + 0xfb, 0x8f, 0x2c, 0x18, 0x11, 0x0e, 0x0d, 0xa7, 0xc0, 0x39, 0x2d, 0x18, 0x0a, 0xec, 0x4a, 0xf6, + 0x31, 0xcf, 0x3a, 0x93, 0xab, 0xba, 0xae, 0xa5, 0x54, 0xd7, 0x4f, 0xf6, 0x22, 0xd2, 0x5b, 0x69, + 0xfd, 0x37, 0x8a, 0x30, 0x69, 0x3a, 0x73, 0x9c, 0xc2, 0x10, 0xac, 0xc1, 0x48, 0x24, 0x3c, 0x87, + 0x0a, 0xf9, 0x96, 0xd3, 0xe9, 0x49, 0x4c, 0xcc, 0xa2, 0x84, 0xaf, 0x90, 0x24, 0x92, 0xe9, 0x92, + 0x54, 0x7c, 0x84, 0x2e, 0x49, 0xfd, 0xfc, 0x69, 0x4a, 0x27, 0xe1, 0x4f, 0x63, 0x7f, 0x8d, 0x5d, + 0x35, 0x7a, 0xf9, 0x29, 0x70, 0x21, 0x37, 0xcc, 0x4b, 0xc9, 0xee, 0xb1, 0xb2, 0x44, 0xa7, 0x72, + 0xb8, 0x91, 0x9f, 0xb7, 0xe0, 0x62, 0xc6, 0x57, 0x69, 0xac, 0xc9, 0x73, 0x30, 0xea, 0x74, 0x5a, + 0xae, 0xda, 0xcb, 0xda, 0x33, 0xd6, 0x82, 0x28, 0xc7, 0x0a, 0x03, 0x2d, 0xc1, 0x0c, 0x79, 0xd0, + 0x76, 0xf9, 0x3b, 0xa2, 0x6e, 0xbb, 0x58, 0xe4, 0x21, 0x66, 0x97, 0xd3, 0x40, 0xdc, 0x8d, 0xaf, + 0xdc, 0xb1, 0x8b, 0xb9, 0xee, 0xd8, 0x7f, 0xdf, 0x82, 0x31, 0xd1, 0xed, 0x53, 0x18, 0xed, 0x6f, + 0x33, 0x47, 0xfb, 0xf1, 0x1e, 0xa3, 0x9d, 0x33, 0xcc, 0x7f, 0xab, 0xa0, 0xfa, 0x5b, 0x0f, 0xc2, + 0x78, 0x00, 0x96, 0xe7, 0x15, 0x18, 0x6d, 0x87, 0x41, 0x1c, 0x34, 0x03, 0x4f, 0x70, 0x3c, 0x4f, + 0x24, 0xd1, 0x02, 0x78, 0xf9, 0x91, 0xf6, 0x1b, 0x2b, 0x6c, 0x36, 0x7a, 0x41, 0x18, 0x0b, 0x2e, + 0x23, 0x19, 0xbd, 0x20, 0x8c, 0x31, 0x83, 0xa0, 0x16, 0x40, 0xec, 0x84, 0x5b, 0x24, 0xa6, 0x65, + 0x22, 0xf0, 0x48, 0xfe, 0xe1, 0xd1, 0x89, 0x5d, 0x6f, 0xde, 0xf5, 0xe3, 0x28, 0x0e, 0xe7, 0x6b, + 0x7e, 0x7c, 0x27, 0xe4, 0x02, 0x94, 0xe6, 0xfe, 0xaf, 0x68, 0x61, 0x8d, 0xae, 0xf4, 0xd1, 0x64, + 0x6d, 0x0c, 0x99, 0x0f, 0xe2, 0x6b, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x33, 0xec, 0x2a, 0x61, 0x03, + 0x74, 0x3c, 0xcf, 0xfc, 0xaf, 0x8f, 0xaa, 0xa1, 0x65, 0xaf, 0x61, 0x55, 0xdd, 0xff, 0xbf, 0xf7, + 0xc9, 0x4d, 0x1b, 0xd6, 0xfd, 0x68, 0x92, 0x20, 0x01, 0xe8, 0xdb, 0xbb, 0xec, 0x24, 0x9e, 0xef, + 0x73, 0x05, 0x1c, 0xc3, 0x32, 0x82, 0x85, 0xbd, 0x66, 0xe1, 0x81, 0x6b, 0x75, 0xb1, 0xc8, 0xb5, + 0xb0, 0xd7, 0x02, 0x80, 0x13, 0x1c, 0x74, 0x4d, 0x88, 0xdf, 0x25, 0x23, 0xf9, 0x9d, 0x14, 0xbf, + 0xe5, 0xe7, 0x6b, 0xf2, 0xf7, 0x0b, 0x30, 0xa6, 0x92, 0xe0, 0xd5, 0x79, 0x2e, 0x31, 0x11, 0x86, + 0x65, 0x39, 0x29, 0xc6, 0x3a, 0x0e, 0x5a, 0x87, 0xa9, 0x88, 0xeb, 0x5e, 0x54, 0xb4, 0x3d, 0xae, + 0xc3, 0xfa, 0xa4, 0xb4, 0xaf, 0x68, 0x98, 0xe0, 0x23, 0x56, 0xc4, 0x8f, 0x0e, 0xe9, 0x68, 0x99, + 0x26, 0x81, 0x5e, 0x87, 0x49, 0x4f, 0x4f, 0x37, 0x5f, 0x17, 0x2a, 0x2e, 0x65, 0x7e, 0x6c, 0x24, + 0xa3, 0xaf, 0xe3, 0x14, 0x36, 0xe5, 0x94, 0xf4, 0x12, 0x11, 0x21, 0xd2, 0xf1, 0xb7, 0x48, 0x24, + 0x52, 0x78, 0x31, 0x4e, 0xe9, 0x76, 0x0e, 0x0e, 0xce, 0xad, 0x8d, 0x5e, 0x81, 0x71, 0xf9, 0xf9, + 0x9a, 0x1b, 0x71, 0x62, 0xe4, 0xae, 0xc1, 0xb0, 0x81, 0x89, 0xee, 0xc3, 0x39, 0xf9, 0x7f, 0x3d, + 0x74, 0x36, 0x37, 0xdd, 0xa6, 0xf0, 0xe2, 0xe6, 0x9e, 0x3e, 0x0b, 0xd2, 0x75, 0x68, 0x39, 0x0b, + 0xe9, 0xe8, 0xa0, 0x72, 0x59, 0x8c, 0x5a, 0x26, 0x9c, 0x4d, 0x62, 0x36, 0x7d, 0xb4, 0x0a, 0x67, + 0xb6, 0x89, 0xe3, 0xc5, 0xdb, 0x4b, 0xdb, 0xa4, 0xb9, 0x23, 0x37, 0x11, 0x73, 0x4e, 0xd6, 0x4c, + 0xc3, 0x6f, 0x76, 0xa3, 0xe0, 0xac, 0x7a, 0xe8, 0x1d, 0x98, 0x6d, 0x77, 0x36, 0x3c, 0x37, 0xda, + 0x5e, 0x0b, 0x62, 0x66, 0xd2, 0xa1, 0x72, 0xc8, 0x09, 0x2f, 0x66, 0xe5, 0x98, 0x5d, 0xcf, 0xc1, + 0xc3, 0xb9, 0x14, 0xd0, 0xfb, 0x70, 0x2e, 0xb5, 0x18, 0x84, 0x4f, 0xe5, 0x64, 0x7e, 0xbc, 0xdd, + 0x46, 0x56, 0x05, 0xe1, 0x23, 0x99, 0x05, 0xc2, 0xd9, 0x4d, 0x7c, 0x30, 0x43, 0x9f, 0xf7, 0x68, + 0x65, 0x8d, 0x29, 0x43, 0x5f, 0x86, 0x71, 0x7d, 0x15, 0x89, 0x0b, 0xe6, 0x4a, 0x36, 0xcf, 0xa2, + 0xad, 0x36, 0xce, 0xd2, 0xa9, 0x15, 0xa5, 0xc3, 0xb0, 0x41, 0xd1, 0x26, 0x90, 0xfd, 0x7d, 0xe8, + 0x36, 0x8c, 0x36, 0x3d, 0x97, 0xf8, 0x71, 0xad, 0xde, 0x2b, 0xe8, 0xc7, 0x92, 0xc0, 0x11, 0x03, + 0x26, 0x02, 0x94, 0xf2, 0x32, 0xac, 0x28, 0xd8, 0xbf, 0x56, 0x80, 0x4a, 0x9f, 0x68, 0xb7, 0x29, + 0x7d, 0xb4, 0x35, 0x90, 0x3e, 0x7a, 0x41, 0x66, 0xc4, 0x5b, 0x4b, 0x09, 0xe9, 0xa9, 0x6c, 0x77, + 0x89, 0xa8, 0x9e, 0xc6, 0x1f, 0xd8, 0x3e, 0x58, 0x57, 0x69, 0x97, 0xfa, 0x5a, 0xae, 0x1b, 0x4f, + 0x59, 0x43, 0x83, 0x0b, 0x22, 0xb9, 0xcf, 0x12, 0xf6, 0xd7, 0x0a, 0x70, 0x4e, 0x0d, 0xe1, 0x9f, + 0xdd, 0x81, 0xbb, 0xdb, 0x3d, 0x70, 0x27, 0xf0, 0xa8, 0x63, 0xdf, 0x81, 0x61, 0x1e, 0x34, 0x65, + 0x00, 0x06, 0xe8, 0x29, 0x33, 0xc2, 0x96, 0xba, 0xa6, 0x8d, 0x28, 0x5b, 0x7f, 0xc1, 0x82, 0xa9, + 0xf5, 0xa5, 0x7a, 0x23, 0x68, 0xee, 0x90, 0x78, 0x81, 0x33, 0xac, 0x58, 0xf0, 0x3f, 0xd6, 0x43, + 0xf2, 0x35, 0x59, 0x1c, 0xd3, 0x65, 0x28, 0x6d, 0x07, 0x51, 0x9c, 0x7e, 0xf1, 0xbd, 0x19, 0x44, + 0x31, 0x66, 0x10, 0xfb, 0x77, 0x2c, 0x18, 0x62, 0x79, 0x5c, 0xfb, 0x25, 0x17, 0x1e, 0xe4, 0xbb, + 0xd0, 0xcb, 0x30, 0x4c, 0x36, 0x37, 0x49, 0x33, 0x16, 0xb3, 0x2a, 0xdd, 0x51, 0x87, 0x97, 0x59, + 0x29, 0xbd, 0xf4, 0x59, 0x63, 0xfc, 0x2f, 0x16, 0xc8, 0xe8, 0x2d, 0x28, 0xc7, 0xee, 0x2e, 0x59, + 0x68, 0xb5, 0xc4, 0x9b, 0xd9, 0x43, 0x78, 0xff, 0xae, 0x4b, 0x02, 0x38, 0xa1, 0x65, 0x7f, 0xb5, + 0x00, 0x90, 0xb8, 0xfe, 0xf7, 0xfb, 0xc4, 0xc5, 0xae, 0xd7, 0x94, 0x2b, 0x19, 0xaf, 0x29, 0x28, + 0x21, 0x98, 0xf1, 0x94, 0xa2, 0x86, 0xa9, 0x38, 0xd0, 0x30, 0x95, 0x8e, 0x33, 0x4c, 0x4b, 0x30, + 0x93, 0x84, 0x2e, 0x30, 0xe3, 0xb8, 0x30, 0x21, 0x65, 0x3d, 0x0d, 0xc4, 0xdd, 0xf8, 0x36, 0x81, + 0xcb, 0x32, 0xa2, 0xa6, 0xbc, 0x6b, 0x98, 0x49, 0xe6, 0x31, 0xf2, 0x4c, 0x27, 0xcf, 0x45, 0x85, + 0xdc, 0xe7, 0xa2, 0x1f, 0xb7, 0xe0, 0x6c, 0xba, 0x1d, 0xe6, 0xfb, 0xf6, 0x7d, 0x16, 0x9c, 0x63, + 0x8f, 0x66, 0xac, 0xd5, 0xee, 0x27, 0xba, 0x97, 0xb2, 0x43, 0x3a, 0xf4, 0xee, 0x71, 0xe2, 0xf7, + 0xbc, 0x9a, 0x45, 0x1a, 0x67, 0xb7, 0x68, 0xff, 0x65, 0x0b, 0x2e, 0xe4, 0xa6, 0x0f, 0x62, 0x12, + 0x64, 0xdb, 0xe5, 0x1a, 0xa9, 0xb4, 0x04, 0x59, 0xaf, 0x71, 0x9d, 0x94, 0xc2, 0x50, 0xa9, 0x0d, + 0x0b, 0xb9, 0xa9, 0x0d, 0xfb, 0x66, 0x2a, 0xb4, 0xbf, 0xd7, 0x02, 0xe1, 0xf2, 0x34, 0xc0, 0x41, + 0xf3, 0xb6, 0xcc, 0x0c, 0x6b, 0x04, 0x34, 0xbf, 0x9c, 0xef, 0x03, 0x26, 0xc2, 0x98, 0xab, 0x8b, + 0xdd, 0x08, 0x5e, 0x6e, 0xd0, 0xb2, 0x5b, 0x20, 0xa0, 0x55, 0xc2, 0xf4, 0x56, 0xfd, 0x7b, 0x73, + 0x1d, 0xa0, 0xc5, 0x70, 0xb5, 0xfc, 0x90, 0xea, 0x1a, 0xa9, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x1f, + 0x2c, 0xc0, 0x98, 0x0c, 0xa0, 0xdd, 0xf1, 0x07, 0x91, 0x2e, 0x8f, 0x95, 0x47, 0x87, 0x25, 0x54, + 0xa5, 0x84, 0xeb, 0x89, 0x50, 0x9e, 0x24, 0x54, 0x95, 0x00, 0x9c, 0xe0, 0xa0, 0x67, 0x60, 0x24, + 0xea, 0x6c, 0x30, 0xf4, 0x94, 0x23, 0x4f, 0x83, 0x17, 0x63, 0x09, 0x47, 0x9f, 0x87, 0x69, 0x5e, + 0x2f, 0x0c, 0xda, 0xce, 0x16, 0x57, 0x81, 0x0e, 0x29, 0xcf, 0xda, 0xe9, 0xd5, 0x14, 0xec, 0xe8, + 0xa0, 0x72, 0x36, 0x5d, 0xc6, 0x94, 0xe7, 0x5d, 0x54, 0xec, 0x2f, 0x03, 0xea, 0x8e, 0x09, 0x8e, + 0xde, 0xe0, 0xe6, 0x54, 0x6e, 0x48, 0x5a, 0xbd, 0xb4, 0xe2, 0xba, 0x23, 0xa8, 0x34, 0xa6, 0xe7, + 0xb5, 0xb0, 0xaa, 0x6f, 0xff, 0x95, 0x22, 0x4c, 0xa7, 0xdd, 0x02, 0xd1, 0x4d, 0x18, 0xe6, 0x17, + 0x9e, 0x20, 0xdf, 0xe3, 0xd1, 0x55, 0x73, 0x26, 0x64, 0x5b, 0x5f, 0xdc, 0x99, 0xa2, 0x3e, 0x7a, + 0x07, 0xc6, 0x5a, 0xc1, 0x7d, 0xff, 0xbe, 0x13, 0xb6, 0x16, 0xea, 0x35, 0xb1, 0x2e, 0x33, 0xf9, + 0xe6, 0x6a, 0x82, 0xa6, 0x3b, 0x28, 0xb2, 0x07, 0x86, 0x04, 0x84, 0x75, 0x72, 0x68, 0x9d, 0xc5, + 0x39, 0xdc, 0x74, 0xb7, 0x56, 0x9d, 0x76, 0x2f, 0xdb, 0xda, 0x25, 0x89, 0xa4, 0x51, 0x9e, 0x10, + 0xc1, 0x10, 0x39, 0x00, 0x27, 0x84, 0xd0, 0x77, 0xc2, 0x99, 0x28, 0x47, 0xd5, 0x96, 0x97, 0x22, + 0xa2, 0x97, 0xf6, 0x69, 0xf1, 0x31, 0x2a, 0xd1, 0x64, 0x29, 0xe5, 0xb2, 0x9a, 0xb1, 0xbf, 0x72, + 0x06, 0x8c, 0xdd, 0x68, 0xe4, 0x09, 0xb2, 0x4e, 0x28, 0x4f, 0x10, 0x86, 0x51, 0xb2, 0xdb, 0x8e, + 0xf7, 0xab, 0x6e, 0xd8, 0x2b, 0x8f, 0xdd, 0xb2, 0xc0, 0xe9, 0xa6, 0x29, 0x21, 0x58, 0xd1, 0xc9, + 0x4e, 0xe6, 0x54, 0xfc, 0x10, 0x93, 0x39, 0x95, 0x4e, 0x31, 0x99, 0xd3, 0x1a, 0x8c, 0x6c, 0xb9, + 0x31, 0x26, 0xed, 0x40, 0xb0, 0x9a, 0x99, 0xeb, 0xf0, 0x06, 0x47, 0xe9, 0x4e, 0x20, 0x22, 0x00, + 0x58, 0x12, 0x41, 0x6f, 0xa8, 0x1d, 0x38, 0x9c, 0x2f, 0xa9, 0x75, 0xbf, 0x0e, 0x66, 0xee, 0x41, + 0x91, 0xbc, 0x69, 0xe4, 0x61, 0x93, 0x37, 0xad, 0xc8, 0x94, 0x4b, 0xa3, 0xf9, 0x86, 0xf0, 0x2c, + 0xa3, 0x52, 0x9f, 0x44, 0x4b, 0x46, 0x72, 0xaa, 0xf2, 0xc9, 0x25, 0xa7, 0xfa, 0x5e, 0x0b, 0xce, + 0xb5, 0xb3, 0xf2, 0xb4, 0x89, 0x44, 0x49, 0x2f, 0x0f, 0x9c, 0x88, 0xce, 0x68, 0x90, 0x89, 0xec, + 0x99, 0x68, 0x38, 0xbb, 0x39, 0x3a, 0xd0, 0xe1, 0x46, 0x4b, 0x64, 0x57, 0x7a, 0x2a, 0x27, 0xcb, + 0x55, 0x8f, 0xdc, 0x56, 0xeb, 0x19, 0x19, 0x95, 0x3e, 0x9e, 0x97, 0x51, 0x69, 0xe0, 0x3c, 0x4a, + 0x6f, 0xa8, 0xfc, 0x56, 0x13, 0xf9, 0x4b, 0x89, 0x67, 0xaf, 0xea, 0x9b, 0xd5, 0xea, 0x0d, 0x95, + 0xd5, 0xaa, 0x47, 0xbc, 0x37, 0x9e, 0xb3, 0xaa, 0x6f, 0x2e, 0x2b, 0x2d, 0x1f, 0xd5, 0xd4, 0xc9, + 0xe4, 0xa3, 0x32, 0xae, 0x1a, 0x9e, 0x12, 0xe9, 0xd9, 0x3e, 0x57, 0x8d, 0x41, 0xb7, 0xf7, 0x65, + 0xc3, 0x73, 0x6f, 0xcd, 0x3c, 0x54, 0xee, 0xad, 0x7b, 0x7a, 0x2e, 0x2b, 0xd4, 0x27, 0x59, 0x13, + 0x45, 0x1a, 0x30, 0x83, 0xd5, 0x3d, 0xfd, 0x02, 0x3c, 0x93, 0x4f, 0x57, 0xdd, 0x73, 0xdd, 0x74, + 0x33, 0xaf, 0xc0, 0xae, 0xcc, 0x58, 0x67, 0x4f, 0x27, 0x33, 0xd6, 0xb9, 0x13, 0xcf, 0x8c, 0x75, + 0xfe, 0x14, 0x32, 0x63, 0x3d, 0xf6, 0xa1, 0x66, 0xc6, 0x9a, 0x7d, 0x04, 0x99, 0xb1, 0xd6, 0x92, + 0xcc, 0x58, 0x17, 0xf2, 0xa7, 0x24, 0xc3, 0x3a, 0x37, 0x27, 0x1f, 0xd6, 0x3d, 0xf6, 0x44, 0xcf, + 0xe3, 0x56, 0x88, 0x80, 0x74, 0xd9, 0xb9, 0x7f, 0xb3, 0x82, 0x5b, 0xf0, 0x29, 0x51, 0x20, 0x9c, + 0x90, 0xa2, 0x74, 0x93, 0xfc, 0x58, 0x8f, 0xf7, 0x50, 0xca, 0x66, 0xa9, 0xbb, 0xf2, 0xb3, 0x62, + 0xd9, 0x7f, 0xb1, 0x00, 0x97, 0x7a, 0xaf, 0xeb, 0x44, 0x57, 0x56, 0x4f, 0xde, 0x76, 0x52, 0xba, + 0x32, 0x2e, 0xe4, 0x24, 0x58, 0x03, 0x07, 0xf7, 0xb9, 0x01, 0x33, 0xca, 0x2c, 0xd7, 0x73, 0x9b, + 0xfb, 0x5a, 0x4e, 0x60, 0xe5, 0x7e, 0xd8, 0x48, 0x23, 0xe0, 0xee, 0x3a, 0x68, 0x01, 0xa6, 0x8c, + 0xc2, 0x5a, 0x55, 0x08, 0x33, 0x4a, 0x39, 0xd7, 0x30, 0xc1, 0x38, 0x8d, 0x6f, 0xff, 0xb4, 0x05, + 0x8f, 0xe5, 0x24, 0x8d, 0x18, 0x38, 0x76, 0xcd, 0x26, 0x4c, 0xb5, 0xcd, 0xaa, 0x7d, 0x42, 0x5c, + 0x19, 0xa9, 0x29, 0x54, 0x5f, 0x53, 0x00, 0x9c, 0x26, 0xba, 0x78, 0xf5, 0x37, 0x7f, 0xef, 0xd2, + 0xc7, 0x7e, 0xeb, 0xf7, 0x2e, 0x7d, 0xec, 0xb7, 0x7f, 0xef, 0xd2, 0xc7, 0xfe, 0xff, 0xc3, 0x4b, + 0xd6, 0x6f, 0x1e, 0x5e, 0xb2, 0x7e, 0xeb, 0xf0, 0x92, 0xf5, 0xdb, 0x87, 0x97, 0xac, 0xdf, 0x3d, + 0xbc, 0x64, 0x7d, 0xf5, 0xf7, 0x2f, 0x7d, 0xec, 0xed, 0xc2, 0xde, 0x0b, 0xff, 0x2f, 0x00, 0x00, + 0xff, 0xff, 0xae, 0x44, 0xd1, 0x00, 0x11, 0xe7, 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 e9570967370..792c19a2d74 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -1724,10 +1724,14 @@ message LocalObjectReference { message LocalVolumeSource { // The full path to the volume on the node. // It can be either a directory or block device (disk, partition, ...). - // Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. - // Block devices can be represented only by VolumeMode=Block, which also requires the - // BlockVolume alpha feature gate to be enabled. optional string path = 1; + + // Filesystem type to mount. + // It applies only when the Path is a block device. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". The default value is to auto-select a fileystem if unspecified. + // +optional + optional string fsType = 2; } // Represents an NFS mount that lasts the lifetime of a pod. 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 68c8441d867..821f3d3cafa 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 @@ -891,8 +891,9 @@ func (LocalObjectReference) SwaggerDoc() map[string]string { } var map_LocalVolumeSource = map[string]string{ - "": "Local represents directly-attached storage with node affinity (Beta feature)", - "path": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...). Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. Block devices can be represented only by VolumeMode=Block, which also requires the BlockVolume alpha feature gate to be enabled.", + "": "Local represents directly-attached storage with node affinity (Beta feature)", + "path": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...).", + "fsType": "Filesystem type to mount. It applies only when the Path is a block device. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". The default value is to auto-select a fileystem if unspecified.", } func (LocalVolumeSource) 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 c01ad756209..0c5db354742 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 @@ -1957,6 +1957,11 @@ func (in *LocalObjectReference) DeepCopy() *LocalObjectReference { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LocalVolumeSource) DeepCopyInto(out *LocalVolumeSource) { *out = *in + if in.FSType != nil { + in, out := &in.FSType, &out.FSType + *out = new(string) + **out = **in + } return } @@ -2882,7 +2887,7 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { if in.Local != nil { in, out := &in.Local, &out.Local *out = new(LocalVolumeSource) - **out = **in + (*in).DeepCopyInto(*out) } if in.StorageOS != nil { in, out := &in.StorageOS, &out.StorageOS From 7157d4582b46bc3f6eaf2b5adcdd748c55bc8877 Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Fri, 17 Aug 2018 11:23:00 +0800 Subject: [PATCH 3/6] make pathWithinBase public --- pkg/util/mount/mount.go | 4 ++-- pkg/util/mount/mount_linux.go | 14 +++++++------- pkg/util/mount/mount_linux_test.go | 2 +- pkg/util/mount/mount_windows.go | 6 +++--- pkg/util/mount/mount_windows_test.go | 4 ++-- pkg/util/mount/nsenter_mount.go | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pkg/util/mount/mount.go b/pkg/util/mount/mount.go index ea9cbe1c690..b48caaffbb6 100644 --- a/pkg/util/mount/mount.go +++ b/pkg/util/mount/mount.go @@ -331,8 +331,8 @@ func HasMountRefs(mountPath string, mountRefs []string) bool { return count > 0 } -// pathWithinBase checks if give path is within given base directory. -func pathWithinBase(fullPath, basePath string) bool { +// PathWithinBase checks if give path is within given base directory. +func PathWithinBase(fullPath, basePath string) bool { rel, err := filepath.Rel(basePath, fullPath) if err != nil { return false diff --git a/pkg/util/mount/mount_linux.go b/pkg/util/mount/mount_linux.go index 33a3cb8e735..6b1c0010442 100644 --- a/pkg/util/mount/mount_linux.go +++ b/pkg/util/mount/mount_linux.go @@ -665,7 +665,7 @@ func findMountInfo(path, mountInfoPath string) (mountInfo, error) { // point that is prefix of 'path' - that's the mount where path resides var info *mountInfo for i := len(infos) - 1; i >= 0; i-- { - if pathWithinBase(path, infos[i].mountPoint) { + if PathWithinBase(path, infos[i].mountPoint) { info = &infos[i] break } @@ -736,7 +736,7 @@ func (mounter *Mounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, // This implementation is shared between Linux and NsEnterMounter func safeOpenSubPath(mounter Interface, subpath Subpath) (int, error) { - if !pathWithinBase(subpath.Path, subpath.VolumePath) { + if !PathWithinBase(subpath.Path, subpath.VolumePath) { return -1, fmt.Errorf("subpath %q not within volume path %q", subpath.Path, subpath.VolumePath) } fd, err := doSafeOpen(subpath.Path, subpath.VolumePath) @@ -964,7 +964,7 @@ func cleanSubPath(mounter Interface, subpath Subpath) error { // removeEmptyDirs works backwards from endDir to baseDir and removes each directory // if it is empty. It stops once it encounters a directory that has content func removeEmptyDirs(baseDir, endDir string) error { - if !pathWithinBase(endDir, baseDir) { + if !PathWithinBase(endDir, baseDir) { return fmt.Errorf("endDir %q is not within baseDir %q", endDir, baseDir) } @@ -1052,7 +1052,7 @@ func getMode(pathname string) (os.FileMode, error) { func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { glog.V(4).Infof("Creating directory %q within base %q", pathname, base) - if !pathWithinBase(pathname, base) { + if !PathWithinBase(pathname, base) { return fmt.Errorf("path %s is outside of allowed base %s", pathname, base) } @@ -1079,7 +1079,7 @@ func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { if err != nil { return fmt.Errorf("error opening directory %s: %s", existingPath, err) } - if !pathWithinBase(fullExistingPath, base) { + if !PathWithinBase(fullExistingPath, base) { return fmt.Errorf("path %s is outside of allowed base %s", fullExistingPath, err) } @@ -1241,7 +1241,7 @@ func doSafeOpen(pathname string, base string) (int, error) { // sure the user cannot change already existing directories into symlinks. for _, seg := range segments { currentPath = filepath.Join(currentPath, seg) - if !pathWithinBase(currentPath, base) { + if !PathWithinBase(currentPath, base) { return -1, fmt.Errorf("path %s is outside of allowed base %s", currentPath, base) } @@ -1298,7 +1298,7 @@ func searchMountPoints(hostSource, mountInfoPath string) ([]string, error) { // We need search in backward order because it's possible for later mounts // to overlap earlier mounts. for i := len(mis) - 1; i >= 0; i-- { - if hostSource == mis[i].mountPoint || pathWithinBase(hostSource, mis[i].mountPoint) { + if hostSource == mis[i].mountPoint || PathWithinBase(hostSource, mis[i].mountPoint) { // If it's a mount point or path under a mount point. mountID = mis[i].id rootPath = filepath.Join(mis[i].root, strings.TrimPrefix(hostSource, mis[i].mountPoint)) diff --git a/pkg/util/mount/mount_linux_test.go b/pkg/util/mount/mount_linux_test.go index fdcd719e1de..530899d5ab0 100644 --- a/pkg/util/mount/mount_linux_test.go +++ b/pkg/util/mount/mount_linux_test.go @@ -413,7 +413,7 @@ func TestPathWithinBase(t *testing.T) { }, } for _, test := range tests { - if pathWithinBase(test.fullPath, test.basePath) != test.expected { + if PathWithinBase(test.fullPath, test.basePath) != test.expected { t.Errorf("test %q failed: expected %v", test.name, test.expected) } diff --git a/pkg/util/mount/mount_windows.go b/pkg/util/mount/mount_windows.go index a690167a998..b3206d18c1c 100644 --- a/pkg/util/mount/mount_windows.go +++ b/pkg/util/mount/mount_windows.go @@ -309,7 +309,7 @@ func lockAndCheckSubPathWithoutSymlink(volumePath, subPath string) ([]uintptr, e break } - if !pathWithinBase(currentFullPath, volumePath) { + if !PathWithinBase(currentFullPath, volumePath) { errorResult = fmt.Errorf("SubPath %q not within volume path %q", currentFullPath, volumePath) break } @@ -499,7 +499,7 @@ func (mounter *Mounter) SafeMakeDir(subdir string, base string, perm os.FileMode func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { glog.V(4).Infof("Creating directory %q within base %q", pathname, base) - if !pathWithinBase(pathname, base) { + if !PathWithinBase(pathname, base) { return fmt.Errorf("path %s is outside of allowed base %s", pathname, base) } @@ -534,7 +534,7 @@ func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { if err != nil { return fmt.Errorf("cannot read link %s: %s", base, err) } - if !pathWithinBase(fullExistingPath, fullBasePath) { + if !PathWithinBase(fullExistingPath, fullBasePath) { return fmt.Errorf("path %s is outside of allowed base %s", fullExistingPath, err) } diff --git a/pkg/util/mount/mount_windows_test.go b/pkg/util/mount/mount_windows_test.go index c292e9f86bd..f495c889cfc 100644 --- a/pkg/util/mount/mount_windows_test.go +++ b/pkg/util/mount/mount_windows_test.go @@ -576,8 +576,8 @@ func TestPathWithinBase(t *testing.T) { } for _, test := range tests { - result := pathWithinBase(test.fullPath, test.basePath) - assert.Equal(t, result, test.expectedResult, "Expect result not equal with pathWithinBase(%s, %s) return: %q, expected: %q", + result := PathWithinBase(test.fullPath, test.basePath) + assert.Equal(t, result, test.expectedResult, "Expect result not equal with PathWithinBase(%s, %s) return: %q, expected: %q", test.fullPath, test.basePath, result, test.expectedResult) } } diff --git a/pkg/util/mount/nsenter_mount.go b/pkg/util/mount/nsenter_mount.go index bf2dbf630b1..a798defe9bf 100644 --- a/pkg/util/mount/nsenter_mount.go +++ b/pkg/util/mount/nsenter_mount.go @@ -320,7 +320,7 @@ func (mounter *NsenterMounter) SafeMakeDir(subdir string, base string, perm os.F evaluatedBase = filepath.Clean(evaluatedBase) rootDir := filepath.Clean(mounter.rootDir) - if pathWithinBase(evaluatedBase, rootDir) { + if PathWithinBase(evaluatedBase, rootDir) { // Base is in /var/lib/kubelet. This directory is shared between the // container with kubelet and the host. We don't need to add '/rootfs'. // This is useful when /rootfs is mounted as read-only - we can still From 8173ef1e8ddab5a80b2cdb513a0704707b865ec9 Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Mon, 23 Apr 2018 22:10:58 +0800 Subject: [PATCH 4/6] local volume plugin changes --- pkg/volume/local/local.go | 168 +++++++++++++++++++++++++++++++++++++- 1 file changed, 167 insertions(+), 1 deletion(-) diff --git a/pkg/volume/local/local.go b/pkg/volume/local/local.go index c8ec8ed14d1..ca4b5375916 100644 --- a/pkg/volume/local/local.go +++ b/pkg/volume/local/local.go @@ -38,6 +38,10 @@ import ( "k8s.io/kubernetes/pkg/volume/validation" ) +const ( + defaultFSType = "ext4" +) + // This is the primary entrypoint for volume plugins. func ProbeVolumePlugins() []volume.VolumePlugin { return []volume.VolumePlugin{&localVolumePlugin{}} @@ -111,6 +115,11 @@ func (plugin *localVolumePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ vo return nil, err } + globalLocalPath, err := plugin.getGlobalLocalPath(spec) + if err != nil { + return nil, err + } + return &localVolumeMounter{ localVolume: &localVolume{ pod: pod, @@ -118,7 +127,7 @@ func (plugin *localVolumePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ vo volName: spec.Name(), mounter: plugin.host.GetMounter(plugin.GetPluginName()), plugin: plugin, - globalPath: volumeSource.Path, + globalPath: globalLocalPath, MetricsProvider: volume.NewMetricsStatFS(volumeSource.Path), }, readOnly: readOnly, @@ -207,6 +216,163 @@ func (plugin *localVolumePlugin) ConstructBlockVolumeSpec(podUID types.UID, volu return volume.NewSpecFromPersistentVolume(localVolume, false), nil } +func (plugin *localVolumePlugin) generateBlockDeviceBaseGlobalPath() string { + return filepath.Join(plugin.host.GetPluginDir(localVolumePluginName), mount.MountsInGlobalPDPath) +} + +func (plugin *localVolumePlugin) getGlobalLocalPath(spec *volume.Spec) (string, error) { + if spec.PersistentVolume.Spec.Local == nil || len(spec.PersistentVolume.Spec.Local.Path) == 0 { + return "", fmt.Errorf("local volume source is nil or local path is not set") + } + + fileType, err := plugin.host.GetMounter(plugin.GetPluginName()).GetFileType(spec.PersistentVolume.Spec.Local.Path) + if err != nil { + return "", err + } + switch fileType { + case mount.FileTypeDirectory: + return spec.PersistentVolume.Spec.Local.Path, nil + case mount.FileTypeBlockDev: + return filepath.Join(plugin.generateBlockDeviceBaseGlobalPath(), spec.Name()), nil + default: + return "", fmt.Errorf("only directory and block device are supported") + } +} + +var _ volume.DeviceMountableVolumePlugin = &localVolumePlugin{} + +type deviceMounter struct { + plugin *localVolumePlugin + mounter *mount.SafeFormatAndMount +} + +var _ volume.DeviceMounter = &deviceMounter{} + +func (plugin *localVolumePlugin) NewDeviceMounter() (volume.DeviceMounter, error) { + return &deviceMounter{ + plugin: plugin, + mounter: util.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host), + }, nil +} + +func (dm *deviceMounter) mountLocalBlockDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { + glog.V(4).Infof("local: mounting device %s to %s", devicePath, deviceMountPath) + notMnt, err := dm.mounter.IsLikelyNotMountPoint(deviceMountPath) + if err != nil { + if os.IsNotExist(err) { + if err := os.MkdirAll(deviceMountPath, 0750); err != nil { + return err + } + notMnt = true + } else { + return err + } + } + if !notMnt { + return nil + } + fstype, err := getVolumeSourceFSType(spec) + if err != nil { + return err + } + + ro, err := getVolumeSourceReadOnly(spec) + if err != nil { + return err + } + options := []string{} + if ro { + options = append(options, "ro") + } + mountOptions := util.MountOptionFromSpec(spec, options...) + err = dm.mounter.FormatAndMount(devicePath, deviceMountPath, fstype, mountOptions) + if err != nil { + os.Remove(deviceMountPath) + return fmt.Errorf("local: failed to mount device %s at %s (fstype: %s), error %v", devicePath, deviceMountPath, fstype, err) + } + glog.V(3).Infof("local: successfully mount device %s at %s (fstype: %s)", devicePath, deviceMountPath, fstype) + return nil +} + +func (dm *deviceMounter) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { + if spec.PersistentVolume.Spec.Local == nil || len(spec.PersistentVolume.Spec.Local.Path) == 0 { + return fmt.Errorf("local volume source is nil or local path is not set") + } + fileType, err := dm.mounter.GetFileType(spec.PersistentVolume.Spec.Local.Path) + if err != nil { + return err + } + + switch fileType { + case mount.FileTypeBlockDev: + // local volume plugin does not implement AttachableVolumePlugin interface, so set devicePath to Path in PV spec directly + devicePath = spec.PersistentVolume.Spec.Local.Path + return dm.mountLocalBlockDevice(spec, devicePath, deviceMountPath) + case mount.FileTypeDirectory: + // if the given local volume path is of already filesystem directory, return directly + return nil + default: + return fmt.Errorf("only directory and block device are supported") + } +} + +func getVolumeSourceFSType(spec *volume.Spec) (string, error) { + if spec.PersistentVolume != nil && + spec.PersistentVolume.Spec.Local != nil { + if spec.PersistentVolume.Spec.Local.FSType != nil { + return *spec.PersistentVolume.Spec.Local.FSType, nil + } else { + // if the FSType is not set in local PV spec, setting it to default ("ext4") + return defaultFSType, nil + } + } + + return "", fmt.Errorf("spec does not reference a Local volume type") +} + +func getVolumeSourceReadOnly(spec *volume.Spec) (bool, error) { + if spec.PersistentVolume != nil && + spec.PersistentVolume.Spec.Local != nil { + // local volumes used as a PersistentVolume gets the ReadOnly flag indirectly through + // the persistent-claim volume used to mount the PV + return spec.ReadOnly, nil + } + + return false, fmt.Errorf("spec does not reference a Local volume type") +} + +func (dm *deviceMounter) GetDeviceMountPath(spec *volume.Spec) (string, error) { + return dm.plugin.getGlobalLocalPath(spec) +} + +func (plugin *localVolumePlugin) NewDeviceUnmounter() (volume.DeviceUnmounter, error) { + return &deviceMounter{ + plugin: plugin, + mounter: util.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host), + }, nil +} + +func (plugin *localVolumePlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { + mounter := plugin.host.GetMounter(plugin.GetPluginName()) + return mounter.GetMountRefs(deviceMountPath) +} + +var _ volume.DeviceUnmounter = &deviceMounter{} + +func (dm *deviceMounter) UnmountDevice(deviceMountPath string) error { + // If the local PV is a block device, + // The deviceMountPath is generated to the format like :/var/lib/kubelet/plugins/kubernetes.io/local-volume/mounts/localpv.spec.Name; + // If it is a filesystem directory, then the deviceMountPath is set directly to pvSpec.Local.Path + // We only need to unmount block device here, so we need to check if the deviceMountPath passed here + // has base mount path: /var/lib/kubelet/plugins/kubernetes.io/local-volume/mounts + basemountPath := dm.plugin.generateBlockDeviceBaseGlobalPath() + if mount.PathWithinBase(deviceMountPath, basemountPath) { + return util.UnmountPath(deviceMountPath, dm.mounter) + } + + return nil +} + // Local volumes represent a local directory on a node. // The directory at the globalPath will be bind-mounted to the pod's directory type localVolume struct { From 8d3fdc5a32f2229f74aade986111add485004802 Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Wed, 2 May 2018 21:28:45 +0800 Subject: [PATCH 5/6] fix UT errors and add new UTs --- pkg/util/mount/fake.go | 2 +- pkg/volume/local/BUILD | 3 + pkg/volume/local/local_test.go | 120 +++++++++++++++++++++++++++++++-- pkg/volume/testing/testing.go | 19 ++++-- 4 files changed, 132 insertions(+), 12 deletions(-) diff --git a/pkg/util/mount/fake.go b/pkg/util/mount/fake.go index a354ca99fd8..e834e297b3e 100644 --- a/pkg/util/mount/fake.go +++ b/pkg/util/mount/fake.go @@ -194,7 +194,7 @@ func (f *FakeMounter) GetFileType(pathname string) (FileType, error) { if t, ok := f.Filesystem[pathname]; ok { return t, nil } - return FileType("fake"), nil + return FileType("Directory"), nil } func (f *FakeMounter) MakeDir(pathname string) error { diff --git a/pkg/volume/local/BUILD b/pkg/volume/local/BUILD index b3d622ed36e..8fe054c70bb 100644 --- a/pkg/volume/local/BUILD +++ b/pkg/volume/local/BUILD @@ -33,6 +33,7 @@ go_test( embed = [":go_default_library"], deps = select({ "@io_bazel_rules_go//go/platform:darwin": [ + "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/testing:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", @@ -41,6 +42,7 @@ go_test( "//staging/src/k8s.io/client-go/util/testing:go_default_library", ], "@io_bazel_rules_go//go/platform:linux": [ + "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/testing:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", @@ -49,6 +51,7 @@ go_test( "//staging/src/k8s.io/client-go/util/testing:go_default_library", ], "@io_bazel_rules_go//go/platform:windows": [ + "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/testing:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/volume/local/local_test.go b/pkg/volume/local/local_test.go index 0d9cdd6007e..37fd16a0803 100644 --- a/pkg/volume/local/local_test.go +++ b/pkg/volume/local/local_test.go @@ -31,16 +31,18 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" utiltesting "k8s.io/client-go/util/testing" + "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumetest "k8s.io/kubernetes/pkg/volume/testing" ) const ( - testPVName = "pvA" - testMountPath = "pods/poduid/volumes/kubernetes.io~local-volume/pvA" - testGlobalPath = "plugins/kubernetes.io~local-volume/volumeDevices/pvA" - testPodPath = "pods/poduid/volumeDevices/kubernetes.io~local-volume" - testNodeName = "fakeNodeName" + testPVName = "pvA" + testMountPath = "pods/poduid/volumes/kubernetes.io~local-volume/pvA" + testGlobalPath = "plugins/kubernetes.io~local-volume/volumeDevices/pvA" + testPodPath = "pods/poduid/volumeDevices/kubernetes.io~local-volume" + testNodeName = "fakeNodeName" + testBlockFormattingToFSGlobalPath = "plugins/kubernetes.io/local-volume/mounts/pvA" ) func getPlugin(t *testing.T) (string, volume.VolumePlugin) { @@ -102,6 +104,33 @@ func getPersistentPlugin(t *testing.T) (string, volume.PersistentVolumePlugin) { return tmpDir, plug } +func getDeviceMountablePluginWithBlockPath(t *testing.T, isBlockDevice bool) (string, volume.DeviceMountableVolumePlugin) { + tmpDir, err := utiltesting.MkTmpdir("localVolumeTest") + if err != nil { + t.Fatalf("can't make a temp dir: %v", err) + } + + plugMgr := volume.VolumePluginMgr{} + var pathToFSType map[string]mount.FileType + if isBlockDevice { + pathToFSType = map[string]mount.FileType{ + tmpDir: mount.FileTypeBlockDev, + } + } + + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHostWithMounterFSType(tmpDir, nil, nil, pathToFSType)) + + plug, err := plugMgr.FindDeviceMountablePluginByName(localVolumePluginName) + if err != nil { + os.RemoveAll(tmpDir) + t.Fatalf("Can't find the plugin by name") + } + if plug.GetPluginName() != localVolumePluginName { + t.Errorf("Wrong name: %s", plug.GetPluginName()) + } + return tmpDir, plug +} + func getTestVolume(readOnly bool, path string, isBlock bool) *volume.Spec { pv := &v1.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ @@ -179,6 +208,87 @@ func TestInvalidLocalPath(t *testing.T) { } } +func TestBlockDeviceGlobalPathAndMountDevice(t *testing.T) { + // Block device global mount path testing + tmpBlockDir, plug := getDeviceMountablePluginWithBlockPath(t, true) + defer os.RemoveAll(tmpBlockDir) + + dm, err := plug.NewDeviceMounter() + if err != nil { + t.Errorf("Failed to make a new device mounter: %v", err) + } + + pvSpec := getTestVolume(false, tmpBlockDir, false) + + expectedGlobalPath := filepath.Join(tmpBlockDir, testBlockFormattingToFSGlobalPath) + actualPath, err := dm.GetDeviceMountPath(pvSpec) + if err != nil { + t.Errorf("Failed to get device mount path: %v", err) + } + if expectedGlobalPath != actualPath { + t.Fatalf("Expected device mount global path:%s, got: %s", expectedGlobalPath, actualPath) + } + + fmt.Println("expected global path is:", expectedGlobalPath) + + err = dm.MountDevice(pvSpec, tmpBlockDir, expectedGlobalPath) + if err != nil { + t.Fatal(err) + } + if _, err := os.Stat(actualPath); err != nil { + if os.IsNotExist(err) { + t.Errorf("DeviceMounter.MountDevice() failed, device mount path not created: %s", actualPath) + } else { + t.Errorf("DeviceMounter.MountDevice() failed: %v", err) + } + } + + du, err := plug.NewDeviceUnmounter() + if err != nil { + t.Fatalf("Create device unmounter error: %v", err) + } + + err = du.UnmountDevice(actualPath) + if err != nil { + t.Fatalf("Unmount device error: %v", err) + } +} + +func TestFSGlobalPathAndMountDevice(t *testing.T) { + // FS global path testing + tmpFSDir, plug := getDeviceMountablePluginWithBlockPath(t, false) + defer os.RemoveAll(tmpFSDir) + + dm, err := plug.NewDeviceMounter() + if err != nil { + t.Errorf("Failed to make a new device mounter: %v", err) + } + + pvSpec := getTestVolume(false, tmpFSDir, false) + + expectedGlobalPath := tmpFSDir + actualPath, err := dm.GetDeviceMountPath(pvSpec) + if err != nil { + t.Errorf("Failed to get device mount path: %v", err) + } + if expectedGlobalPath != actualPath { + t.Fatalf("Expected device mount global path:%s, got: %s", expectedGlobalPath, actualPath) + } + + // Actually, we will do nothing if the local path is FS type + err = dm.MountDevice(pvSpec, tmpFSDir, expectedGlobalPath) + if err != nil { + t.Fatal(err) + } + if _, err := os.Stat(expectedGlobalPath); err != nil { + if os.IsNotExist(err) { + t.Errorf("DeviceMounter.MountDevice() failed, device mount path not created: %s", expectedGlobalPath) + } else { + t.Errorf("DeviceMounter.MountDevice() failed: %v", err) + } + } +} + func TestMountUnmount(t *testing.T) { tmpDir, plug := getPlugin(t) defer os.RemoveAll(tmpDir) diff --git a/pkg/volume/testing/testing.go b/pkg/volume/testing/testing.go index 94565eaaf73..8cfa7657841 100644 --- a/pkg/volume/testing/testing.go +++ b/pkg/volume/testing/testing.go @@ -60,33 +60,40 @@ type fakeVolumeHost struct { } func NewFakeVolumeHost(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin) *fakeVolumeHost { - return newFakeVolumeHost(rootDir, kubeClient, plugins, nil) + return newFakeVolumeHost(rootDir, kubeClient, plugins, nil, nil) } func NewFakeVolumeHostWithCloudProvider(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin, cloud cloudprovider.Interface) *fakeVolumeHost { - return newFakeVolumeHost(rootDir, kubeClient, plugins, cloud) + return newFakeVolumeHost(rootDir, kubeClient, plugins, cloud, nil) } func NewFakeVolumeHostWithNodeLabels(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin, labels map[string]string) *fakeVolumeHost { - volHost := newFakeVolumeHost(rootDir, kubeClient, plugins, nil) + volHost := newFakeVolumeHost(rootDir, kubeClient, plugins, nil, nil) volHost.nodeLabels = labels return volHost } func NewFakeVolumeHostWithNodeName(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin, nodeName string) *fakeVolumeHost { - volHost := newFakeVolumeHost(rootDir, kubeClient, plugins, nil) + volHost := newFakeVolumeHost(rootDir, kubeClient, plugins, nil, nil) volHost.nodeName = nodeName return volHost } -func newFakeVolumeHost(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin, cloud cloudprovider.Interface) *fakeVolumeHost { +func newFakeVolumeHost(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin, cloud cloudprovider.Interface, pathToTypeMap map[string]mount.FileType) *fakeVolumeHost { host := &fakeVolumeHost{rootDir: rootDir, kubeClient: kubeClient, cloud: cloud} - host.mounter = &mount.FakeMounter{} + host.mounter = &mount.FakeMounter{ + Filesystem: pathToTypeMap, + } host.exec = mount.NewFakeExec(nil) host.pluginMgr.InitPlugins(plugins, nil /* prober */, host) return host } +func NewFakeVolumeHostWithMounterFSType(rootDir string, kubeClient clientset.Interface, plugins []VolumePlugin, pathToTypeMap map[string]mount.FileType) *fakeVolumeHost { + volHost := newFakeVolumeHost(rootDir, kubeClient, plugins, nil, pathToTypeMap) + return volHost +} + func (f *fakeVolumeHost) GetPluginDir(podUID string) string { return path.Join(f.rootDir, "plugins", podUID) } From 5bc823f141efde1e086f6696c26a197b78f9cf52 Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Fri, 11 May 2018 19:00:10 +0800 Subject: [PATCH 6/6] fix and update local volume e2es --- test/e2e/storage/persistent_volumes-local.go | 142 +++++++++++-------- 1 file changed, 82 insertions(+), 60 deletions(-) diff --git a/test/e2e/storage/persistent_volumes-local.go b/test/e2e/storage/persistent_volumes-local.go index 8cc3b1317cc..7340f9ab527 100644 --- a/test/e2e/storage/persistent_volumes-local.go +++ b/test/e2e/storage/persistent_volumes-local.go @@ -78,8 +78,12 @@ const ( GCELocalSSDVolumeType localVolumeType = "gce-localssd-scsi-fs" // Creates a local file, formats it, and maps it as a block device. BlockLocalVolumeType localVolumeType = "block" - // Creates a local file, formats it, and mounts it to use as local volume. - BlockFsLocalVolumeType localVolumeType = "blockfs" + // Creates a local file serving as the backing for block device., formats it, + // and mounts it to use as FS mode local volume. + BlockFsWithFormatLocalVolumeType localVolumeType = "blockfswithformat" + // Creates a local file serving as the backing for block device. do not format it manually, + // and mounts it to use as FS mode local volume. + BlockFsWithoutFormatLocalVolumeType localVolumeType = "blockfswithoutformat" ) var setupLocalVolumeMap = map[localVolumeType]func(*localTestConfig, *v1.Node) *localTestVolume{ @@ -90,7 +94,8 @@ var setupLocalVolumeMap = map[localVolumeType]func(*localTestConfig, *v1.Node) * DirectoryBindMountedLocalVolumeType: setupLocalVolumeDirectoryBindMounted, DirectoryLinkBindMountedLocalVolumeType: setupLocalVolumeDirectoryLinkBindMounted, BlockLocalVolumeType: setupLocalVolumeBlock, - BlockFsLocalVolumeType: setupLocalVolumeBlockFs, + BlockFsWithFormatLocalVolumeType: setupLocalVolumeBlockFsWithFormat, + BlockFsWithoutFormatLocalVolumeType: setupLocalVolumeBlockFsWithoutFormat, } var cleanupLocalVolumeMap = map[localVolumeType]func(*localTestConfig, *localTestVolume){ @@ -101,7 +106,8 @@ var cleanupLocalVolumeMap = map[localVolumeType]func(*localTestConfig, *localTes DirectoryBindMountedLocalVolumeType: cleanupLocalVolumeDirectoryBindMounted, DirectoryLinkBindMountedLocalVolumeType: cleanupLocalVolumeDirectoryLinkBindMounted, BlockLocalVolumeType: cleanupLocalVolumeBlock, - BlockFsLocalVolumeType: cleanupLocalVolumeBlockFs, + BlockFsWithFormatLocalVolumeType: cleanupLocalVolumeBlockFsWithFormat, + BlockFsWithoutFormatLocalVolumeType: cleanupLocalVolumeBlockFsWithoutFormat, } type localTestVolume struct { @@ -247,6 +253,11 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { pod1, pod1Err = createLocalPod(config, testVol, nil) Expect(pod1Err).NotTo(HaveOccurred()) verifyLocalPod(config, testVol, pod1, config.node0.Name) + + writeCmd := createWriteCmd(volumeDir, testFile, testFileContent, testVol.localVolumeType) + + By("Writing in pod1") + podRWCmdExec(pod1, writeCmd) }) AfterEach(func() { @@ -256,16 +267,16 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { It("should be able to mount volume and read from pod1", func() { By("Reading in pod1") - // testFileContent was written during setupLocalVolume + // testFileContent was written in BeforeEach testReadFileContent(volumeDir, testFile, testFileContent, pod1, testVolType) }) It("should be able to mount volume and write from pod1", func() { - // testFileContent was written during setupLocalVolume + // testFileContent was written in BeforeEach testReadFileContent(volumeDir, testFile, testFileContent, pod1, testVolType) By("Writing in pod1") - writeCmd, _ := createWriteAndReadCmds(volumeDir, testFile, testVol.hostDir /*writeTestFileContent*/, testVolType) + writeCmd := createWriteCmd(volumeDir, testFile, testVol.hostDir /*writeTestFileContent*/, testVolType) podRWCmdExec(pod1, writeCmd) }) }) @@ -346,12 +357,12 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { Context("Local volume that cannot be mounted [Slow]", func() { // TODO: - // - check for these errors in unit tests intead + // - check for these errors in unit tests instead It("should fail due to non-existent path", func() { ep := &eventPatterns{ reason: "FailedMount", pattern: make([]string, 2)} - ep.pattern = append(ep.pattern, "MountVolume.SetUp failed") + ep.pattern = append(ep.pattern, "MountVolume.NewMounter initialization failed") testVol := &localTestVolume{ node: config.node0, @@ -461,7 +472,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { // Delete the persistent volume claim: file will be cleaned up and volume be re-created. By("Deleting the persistent volume claim to clean up persistent volume and re-create one") - writeCmd, _ := createWriteAndReadCmds(volumePath, testFile, testFileContent, DirectoryLocalVolumeType) + writeCmd := createWriteCmd(volumePath, testFile, testFileContent, DirectoryLocalVolumeType) err = issueNodeCommand(config, writeCmd, config.node0) Expect(err).NotTo(HaveOccurred()) err = config.client.CoreV1().PersistentVolumeClaims(claim.Namespace).Delete(claim.Name, &metav1.DeleteOptions{}) @@ -731,8 +742,6 @@ func testPodWithNodeConflict(config *localTestConfig, testVolType localVolumeTyp err = framework.WaitForPodNameUnschedulableInNamespace(config.client, pod.Name, pod.Namespace) Expect(err).NotTo(HaveOccurred()) - - cleanupLocalVolumes(config, []*localTestVolume{testVol}) } type eventPatterns struct { @@ -766,7 +775,12 @@ func twoPodsReadWriteTest(config *localTestConfig, testVol *localTestVolume) { Expect(pod1Err).NotTo(HaveOccurred()) verifyLocalPod(config, testVol, pod1, config.node0.Name) - // testFileContent was written during setupLocalVolume + writeCmd := createWriteCmd(volumeDir, testFile, testFileContent, testVol.localVolumeType) + + By("Writing in pod1") + podRWCmdExec(pod1, writeCmd) + + // testFileContent was written after creating pod1 testReadFileContent(volumeDir, testFile, testFileContent, pod1, testVol.localVolumeType) By("Creating pod2 to read from the PV") @@ -774,16 +788,16 @@ func twoPodsReadWriteTest(config *localTestConfig, testVol *localTestVolume) { Expect(pod2Err).NotTo(HaveOccurred()) verifyLocalPod(config, testVol, pod2, config.node0.Name) - // testFileContent was written during setupLocalVolume + // testFileContent was written after creating pod1 testReadFileContent(volumeDir, testFile, testFileContent, pod2, testVol.localVolumeType) - writeCmd := createWriteCmd(volumeDir, testFile, testVol.hostDir /*writeTestFileContent*/, testVol.localVolumeType) + writeCmd = createWriteCmd(volumeDir, testFile, testVol.hostDir /*writeTestFileContent*/, testVol.localVolumeType) - By("Writing in pod1") - podRWCmdExec(pod1, writeCmd) + By("Writing in pod2") + podRWCmdExec(pod2, writeCmd) - By("Reading in pod2") - testReadFileContent(volumeDir, testFile, testVol.hostDir, pod2, testVol.localVolumeType) + By("Reading in pod1") + testReadFileContent(volumeDir, testFile, testVol.hostDir, pod1, testVol.localVolumeType) By("Deleting pod1") framework.DeletePodOrFail(config.client, config.ns, pod1.Name) @@ -798,14 +812,14 @@ func twoPodsReadWriteSerialTest(config *localTestConfig, testVol *localTestVolum Expect(pod1Err).NotTo(HaveOccurred()) verifyLocalPod(config, testVol, pod1, config.node0.Name) - // testFileContent was written during setupLocalVolume - testReadFileContent(volumeDir, testFile, testFileContent, pod1, testVol.localVolumeType) - - writeCmd := createWriteCmd(volumeDir, testFile, testVol.hostDir /*writeTestFileContent*/, testVol.localVolumeType) + writeCmd := createWriteCmd(volumeDir, testFile, testFileContent, testVol.localVolumeType) By("Writing in pod1") podRWCmdExec(pod1, writeCmd) + // testFileContent was written after creating pod1 + testReadFileContent(volumeDir, testFile, testFileContent, pod1, testVol.localVolumeType) + By("Deleting pod1") framework.DeletePodOrFail(config.client, config.ns, pod1.Name) @@ -815,7 +829,7 @@ func twoPodsReadWriteSerialTest(config *localTestConfig, testVol *localTestVolum verifyLocalPod(config, testVol, pod2, config.node0.Name) By("Reading in pod2") - testReadFileContent(volumeDir, testFile, testVol.hostDir, pod2, testVol.localVolumeType) + testReadFileContent(volumeDir, testFile, testFileContent, pod2, testVol.localVolumeType) By("Deleting pod2") framework.DeletePodOrFail(config.client, config.ns, pod2.Name) @@ -885,11 +899,13 @@ func cleanupLocalVolumes(config *localTestConfig, volumes []*localTestVolume) { } } -func setupWriteTestFile(hostDir string, config *localTestConfig, localVolumeType localVolumeType, node *v1.Node) *localTestVolume { - writeCmd, _ := createWriteAndReadCmds(hostDir, testFile, testFileContent, localVolumeType) - By(fmt.Sprintf("Creating test file on node %q in path %q", node.Name, hostDir)) - err := issueNodeCommand(config, writeCmd, node) - Expect(err).NotTo(HaveOccurred()) +func generateLocalTestVolume(hostDir string, config *localTestConfig, localVolumeType localVolumeType, node *v1.Node) *localTestVolume { + if localVolumeType != BlockLocalVolumeType && localVolumeType != BlockFsWithoutFormatLocalVolumeType { + mkdirCmd := fmt.Sprintf("mkdir -p %s", hostDir) + err := issueNodeCommand(config, mkdirCmd, node) + Expect(err).NotTo(HaveOccurred()) + } + return &localTestVolume{ node: node, hostDir: hostDir, @@ -901,8 +917,7 @@ func setupLocalVolumeTmpfs(config *localTestConfig, node *v1.Node) *localTestVol testDirName := "local-volume-test-" + string(uuid.NewUUID()) hostDir := filepath.Join(hostBase, testDirName) createAndMountTmpfsLocalVolume(config, hostDir, node) - // populate volume with testFile containing testFileContent - return setupWriteTestFile(hostDir, config, TmpfsLocalVolumeType, node) + return generateLocalTestVolume(hostDir, config, TmpfsLocalVolumeType, node) } func setupLocalVolumeGCELocalSSD(config *localTestConfig, node *v1.Node) *localTestVolume { @@ -910,15 +925,13 @@ func setupLocalVolumeGCELocalSSD(config *localTestConfig, node *v1.Node) *localT Expect(err).NotTo(HaveOccurred()) dirName := strings.Fields(res)[0] hostDir := "/mnt/disks/by-uuid/google-local-ssds-scsi-fs/" + dirName - // Populate volume with testFile containing testFileContent. - return setupWriteTestFile(hostDir, config, GCELocalSSDVolumeType, node) + return generateLocalTestVolume(hostDir, config, GCELocalSSDVolumeType, node) } func setupLocalVolumeDirectory(config *localTestConfig, node *v1.Node) *localTestVolume { testDirName := "local-volume-test-" + string(uuid.NewUUID()) hostDir := filepath.Join(hostBase, testDirName) - // Populate volume with testFile containing testFileContent. - return setupWriteTestFile(hostDir, config, DirectoryLocalVolumeType, node) + return generateLocalTestVolume(hostDir, config, DirectoryLocalVolumeType, node) } // launchNodeExecPodForLocalPV launches a hostexec pod for local PV and waits @@ -992,11 +1005,10 @@ func setupLocalVolumeDirectoryLink(config *localTestConfig, node *v1.Node) *loca testDirName := "local-volume-test-" + string(uuid.NewUUID()) hostDir := filepath.Join(hostBase, testDirName) hostDirBackend := hostDir + "-backend" - cmd := fmt.Sprintf("mkdir %s && ln -s %s %s", hostDirBackend, hostDirBackend, hostDir) + cmd := fmt.Sprintf("mkdir %s && sudo ln -s %s %s", hostDirBackend, hostDirBackend, hostDir) _, err := issueNodeCommandWithResult(config, cmd, node) Expect(err).NotTo(HaveOccurred()) - // Populate volume with testFile containing testFileContent. - return setupWriteTestFile(hostDir, config, DirectoryLinkLocalVolumeType, node) + return generateLocalTestVolume(hostDir, config, DirectoryLinkLocalVolumeType, node) } func setupLocalVolumeDirectoryBindMounted(config *localTestConfig, node *v1.Node) *localTestVolume { @@ -1005,20 +1017,18 @@ func setupLocalVolumeDirectoryBindMounted(config *localTestConfig, node *v1.Node cmd := fmt.Sprintf("mkdir %s && sudo mount --bind %s %s", hostDir, hostDir, hostDir) _, err := issueNodeCommandWithResult(config, cmd, node) Expect(err).NotTo(HaveOccurred()) - // Populate volume with testFile containing testFileContent. - return setupWriteTestFile(hostDir, config, DirectoryBindMountedLocalVolumeType, node) + return generateLocalTestVolume(hostDir, config, DirectoryBindMountedLocalVolumeType, node) } func setupLocalVolumeDirectoryLinkBindMounted(config *localTestConfig, node *v1.Node) *localTestVolume { testDirName := "local-volume-test-" + string(uuid.NewUUID()) hostDir := filepath.Join(hostBase, testDirName) hostDirBackend := hostDir + "-backend" - cmd := fmt.Sprintf("mkdir %s && sudo mount --bind %s %s && ln -s %s %s", + cmd := fmt.Sprintf("mkdir %s && sudo mount --bind %s %s && sudo ln -s %s %s", hostDirBackend, hostDirBackend, hostDirBackend, hostDirBackend, hostDir) _, err := issueNodeCommandWithResult(config, cmd, node) Expect(err).NotTo(HaveOccurred()) - // Populate volume with testFile containing testFileContent. - return setupWriteTestFile(hostDir, config, DirectoryLinkBindMountedLocalVolumeType, node) + return generateLocalTestVolume(hostDir, config, DirectoryLinkBindMountedLocalVolumeType, node) } func setupLocalVolumeBlock(config *localTestConfig, node *v1.Node) *localTestVolume { @@ -1026,14 +1036,13 @@ func setupLocalVolumeBlock(config *localTestConfig, node *v1.Node) *localTestVol hostDir := filepath.Join(hostBase, testDirName) createAndMapBlockLocalVolume(config, hostDir, node) loopDev := getBlockLoopDev(config, hostDir, node) - // Populate block volume with testFile containing testFileContent. - volume := setupWriteTestFile(loopDev, config, BlockLocalVolumeType, node) + volume := generateLocalTestVolume(loopDev, config, BlockLocalVolumeType, node) volume.hostDir = loopDev volume.loopDevDir = hostDir return volume } -func setupLocalVolumeBlockFs(config *localTestConfig, node *v1.Node) *localTestVolume { +func setupLocalVolumeBlockFsWithFormat(config *localTestConfig, node *v1.Node) *localTestVolume { testDirName := "local-volume-test-" + string(uuid.NewUUID()) hostDir := filepath.Join(hostBase, testDirName) createAndMapBlockLocalVolume(config, hostDir, node) @@ -1043,13 +1052,25 @@ func setupLocalVolumeBlockFs(config *localTestConfig, node *v1.Node) *localTestV cmd := fmt.Sprintf("sudo mkfs -t ext4 %s && sudo mount -t ext4 %s %s && sudo chmod o+rwx %s", loopDev, loopDev, hostDir, hostDir) _, err := issueNodeCommandWithResult(config, cmd, node) Expect(err).NotTo(HaveOccurred()) - // Populate block volume with testFile containing testFileContent. - volume := setupWriteTestFile(hostDir, config, BlockFsLocalVolumeType, node) + volume := generateLocalTestVolume(hostDir, config, BlockFsWithFormatLocalVolumeType, node) volume.hostDir = hostDir volume.loopDevDir = loopDev return volume } +func setupLocalVolumeBlockFsWithoutFormat(config *localTestConfig, node *v1.Node) *localTestVolume { + testDirName := "local-volume-test-" + string(uuid.NewUUID()) + hostDir := filepath.Join(hostBase, testDirName) + createAndMapBlockLocalVolume(config, hostDir, node) + loopDev := getBlockLoopDev(config, hostDir, node) + volume := generateLocalTestVolume(loopDev, config, BlockFsWithoutFormatLocalVolumeType, node) + // we do this in order to set block device path to local PV spec path directly + // and test local volume plugin FileSystem mode on block device + volume.hostDir = loopDev + volume.loopDevDir = hostDir + return volume +} + // Determine the /dev/loopXXX device associated with this test, via its hostDir. func getBlockLoopDev(config *localTestConfig, hostDir string, node *v1.Node) string { loopDevCmd := fmt.Sprintf("E2E_LOOP_DEV=$(sudo losetup | grep %s/file | awk '{ print $1 }') 2>&1 > /dev/null && echo ${E2E_LOOP_DEV}", hostDir) @@ -1100,7 +1121,7 @@ func cleanupLocalVolumeDirectoryLink(config *localTestConfig, volume *localTestV By("Removing the test directory") hostDir := volume.hostDir hostDirBackend := hostDir + "-backend" - removeCmd := fmt.Sprintf("rm -r %s && rm -r %s", hostDir, hostDirBackend) + removeCmd := fmt.Sprintf("sudo rm -r %s && rm -r %s", hostDir, hostDirBackend) err := issueNodeCommand(config, removeCmd, volume.node) Expect(err).NotTo(HaveOccurred()) } @@ -1119,7 +1140,7 @@ func cleanupLocalVolumeDirectoryLinkBindMounted(config *localTestConfig, volume By("Removing the test directory") hostDir := volume.hostDir hostDirBackend := hostDir + "-backend" - removeCmd := fmt.Sprintf("rm %s && sudo umount %s && rm -r %s", hostDir, hostDirBackend, hostDirBackend) + removeCmd := fmt.Sprintf("sudo rm %s && sudo umount %s && rm -r %s", hostDir, hostDirBackend, hostDirBackend) err := issueNodeCommand(config, removeCmd, volume.node) Expect(err).NotTo(HaveOccurred()) } @@ -1135,7 +1156,7 @@ func cleanupLocalVolumeBlock(config *localTestConfig, volume *localTestVolume) { } // Deletes the PVC/PV and removes the test directory holding the block file. -func cleanupLocalVolumeBlockFs(config *localTestConfig, volume *localTestVolume) { +func cleanupLocalVolumeBlockFsWithFormat(config *localTestConfig, volume *localTestVolume) { // umount first By("Umount blockfs mountpoint") umountCmd := fmt.Sprintf("sudo umount %s", volume.hostDir) @@ -1147,6 +1168,15 @@ func cleanupLocalVolumeBlockFs(config *localTestConfig, volume *localTestVolume) Expect(err).NotTo(HaveOccurred()) } +func cleanupLocalVolumeBlockFsWithoutFormat(config *localTestConfig, volume *localTestVolume) { + volume.hostDir = volume.loopDevDir + unmapBlockLocalVolume(config, volume.hostDir, volume.node) + By("Removing the test directory") + removeCmd := fmt.Sprintf("rm -r %s", volume.hostDir) + err := issueNodeCommand(config, removeCmd, volume.node) + Expect(err).NotTo(HaveOccurred()) +} + func makeLocalPVCConfig(config *localTestConfig, volumeType localVolumeType) framework.PersistentVolumeClaimConfig { pvcConfig := framework.PersistentVolumeClaimConfig{ AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, @@ -1337,14 +1367,6 @@ func unmapBlockLocalVolume(config *localTestConfig, dir string, node *v1.Node) { Expect(err).NotTo(HaveOccurred()) } -// Create corresponding write and read commands -// to be executed via hostexec Pod on the node with the local PV -func createWriteAndReadCmds(testFileDir string, testFile string, writeTestFileContent string, volumeType localVolumeType) (writeCmd string, readCmd string) { - writeCmd = createWriteCmd(testFileDir, testFile, writeTestFileContent, volumeType) - readCmd = createReadCmd(testFileDir, testFile, volumeType) - return writeCmd, readCmd -} - func createWriteCmd(testDir string, testFile string, writeTestFileContent string, volumeType localVolumeType) string { if volumeType == BlockLocalVolumeType { // testDir is the block device. @@ -1378,7 +1400,7 @@ func createReadCmd(testFileDir string, testFile string, volumeType localVolumeTy // Read testFile and evaluate whether it contains the testFileContent func testReadFileContent(testFileDir string, testFile string, testFileContent string, pod *v1.Pod, volumeType localVolumeType) { - readCmd := createReadCmd(volumeDir, testFile, volumeType) + readCmd := createReadCmd(testFileDir, testFile, volumeType) readOut := podRWCmdExec(pod, readCmd) Expect(readOut).To(ContainSubstring(testFileContent)) }