Merge pull request #32835 from yujuhong/docker_annotations

Automatic merge from submit-queue

dockershim: support annotations and filtering by sandbox ID
This commit is contained in:
Kubernetes Submit Queue 2016-09-16 14:17:03 -07:00 committed by GitHub
commit af3050dd15
10 changed files with 372 additions and 265 deletions

View File

@ -983,6 +983,9 @@ type PodSandbox struct {
CreatedAt *int64 `protobuf:"varint,4,opt,name=created_at,json=createdAt" json:"created_at,omitempty"` CreatedAt *int64 `protobuf:"varint,4,opt,name=created_at,json=createdAt" json:"created_at,omitempty"`
// The labels of the PodSandbox // The labels of the PodSandbox
Labels map[string]string `protobuf:"bytes,5,rep,name=labels" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` Labels map[string]string `protobuf:"bytes,5,rep,name=labels" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
// Annotations is an unstructured key value map that may be set by external
// tools to store and retrieve arbitrary metadata.
Annotations map[string]string `protobuf:"bytes,6,rep,name=annotations" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
} }
@ -1026,6 +1029,13 @@ func (m *PodSandbox) GetLabels() map[string]string {
return nil return nil
} }
func (m *PodSandbox) GetAnnotations() map[string]string {
if m != nil {
return m.Annotations
}
return nil
}
type ListPodSandboxResponse struct { type ListPodSandboxResponse struct {
// List of PodSandbox // List of PodSandbox
Items []*PodSandbox `protobuf:"bytes,1,rep,name=items" json:"items,omitempty"` Items []*PodSandbox `protobuf:"bytes,1,rep,name=items" json:"items,omitempty"`
@ -3117,183 +3127,184 @@ var _ImageService_serviceDesc = grpc.ServiceDesc{
} }
var fileDescriptorApi = []byte{ var fileDescriptorApi = []byte{
// 2842 bytes of a gzipped FileDescriptorProto // 2853 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x72, 0x1b, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x72, 0x1b, 0xc7,
0x11, 0x16, 0x00, 0x82, 0x04, 0x1a, 0x04, 0x08, 0x8e, 0x28, 0x12, 0x82, 0x64, 0x89, 0x5a, 0xdb, 0xf1, 0x17, 0x08, 0x82, 0x04, 0x1a, 0x04, 0x08, 0x8e, 0x28, 0x12, 0x82, 0x64, 0x89, 0x5a, 0x5b,
0x89, 0x44, 0x5b, 0x2c, 0x85, 0x49, 0x49, 0x91, 0x6c, 0xcb, 0xa6, 0x49, 0x46, 0x45, 0x4b, 0xa2, 0xff, 0xbf, 0x44, 0x5b, 0x2c, 0x85, 0x49, 0x49, 0x91, 0x6c, 0xcb, 0xa6, 0x49, 0x5a, 0x45, 0x4b,
0x98, 0x85, 0xa4, 0x58, 0x27, 0xd4, 0x0a, 0x3b, 0x24, 0x57, 0x02, 0x76, 0xd7, 0xbb, 0x0b, 0x46, 0xa2, 0x98, 0x85, 0xa4, 0x58, 0x27, 0xd4, 0x0a, 0x3b, 0x24, 0x57, 0x02, 0x76, 0xd7, 0xbb, 0x0b,
0xcc, 0x35, 0x97, 0x1c, 0x72, 0xc9, 0x2d, 0x0f, 0xe0, 0xaa, 0x9c, 0x72, 0x49, 0x55, 0x2e, 0xb9, 0x46, 0xc8, 0x35, 0x97, 0x1c, 0x72, 0xc9, 0x1b, 0xe4, 0xe0, 0xaa, 0x9c, 0x72, 0x49, 0x55, 0x2e,
0xe5, 0x9c, 0xca, 0x83, 0xe4, 0x09, 0x92, 0x63, 0x7a, 0x7e, 0x76, 0x76, 0xf6, 0x07, 0x34, 0x28, 0xb9, 0xe5, 0x9c, 0xca, 0x83, 0xe4, 0x09, 0x92, 0x63, 0x7a, 0x3e, 0x76, 0x76, 0xf6, 0x03, 0x34,
0x57, 0xd9, 0xba, 0xed, 0x74, 0xf7, 0xcc, 0xf4, 0x74, 0xf7, 0xf4, 0xf4, 0x37, 0xb3, 0x50, 0xb7, 0xa8, 0x54, 0xc5, 0xba, 0xed, 0x74, 0xf7, 0xcc, 0xf4, 0x74, 0xf7, 0xf4, 0xf4, 0x6f, 0x66, 0xa1,
0x7c, 0x67, 0xdd, 0x0f, 0xbc, 0xc8, 0x23, 0x73, 0xc1, 0xd8, 0x8d, 0x9c, 0x11, 0x35, 0xd6, 0xa0, 0x66, 0xf9, 0xce, 0x86, 0x1f, 0x78, 0x91, 0x47, 0xe6, 0x83, 0x91, 0x1b, 0x39, 0x43, 0x6a, 0xac,
0xf5, 0x9c, 0x06, 0xa1, 0xe3, 0xb9, 0x26, 0xfd, 0x66, 0x4c, 0xc3, 0x88, 0x74, 0x60, 0xee, 0x58, 0x43, 0xf3, 0x05, 0x0d, 0x42, 0xc7, 0x73, 0x4d, 0xfa, 0xdd, 0x88, 0x86, 0x11, 0x69, 0xc3, 0xfc,
0x50, 0x3a, 0xa5, 0xd5, 0xd2, 0xf5, 0xba, 0x19, 0x37, 0x8d, 0xbf, 0x94, 0x60, 0x41, 0x09, 0x87, 0x89, 0xa0, 0xb4, 0x4b, 0x6b, 0xa5, 0x1b, 0x35, 0x33, 0x6e, 0x1a, 0x7f, 0x2c, 0xc1, 0xa2, 0x12,
0xbe, 0xe7, 0x86, 0x74, 0xb2, 0x34, 0xb9, 0x06, 0xf3, 0x72, 0x92, 0xbe, 0x6b, 0x8d, 0x68, 0xa7, 0x0e, 0x7d, 0xcf, 0x0d, 0xe9, 0x64, 0x69, 0x72, 0x0d, 0x16, 0xe4, 0x24, 0x3d, 0xd7, 0x1a, 0xd2,
0xcc, 0xd9, 0x0d, 0x49, 0xdb, 0x43, 0x12, 0xf9, 0x29, 0x2c, 0xc4, 0x22, 0xf1, 0x20, 0x15, 0x2e, 0xf6, 0x0c, 0x67, 0xd7, 0x25, 0x6d, 0x1f, 0x49, 0xe4, 0xff, 0x61, 0x31, 0x16, 0x89, 0x07, 0x29,
0xd5, 0x92, 0x64, 0x39, 0x1b, 0x59, 0x87, 0xf3, 0xb1, 0x20, 0xae, 0x41, 0x09, 0xcf, 0x70, 0xe1, 0x73, 0xa9, 0xa6, 0x24, 0xcb, 0xd9, 0xc8, 0x06, 0x9c, 0x8f, 0x05, 0x71, 0x0d, 0x4a, 0x78, 0x96,
0x45, 0xc9, 0xda, 0xf4, 0x1d, 0x29, 0x6f, 0x6c, 0x42, 0x7d, 0x7b, 0xaf, 0xf7, 0xc4, 0x8f, 0x58, 0x0b, 0x2f, 0x49, 0xd6, 0x96, 0xef, 0x48, 0x79, 0x63, 0x0b, 0x6a, 0x3b, 0xfb, 0xdd, 0xa7, 0x7e,
0x67, 0x54, 0x31, 0xa4, 0x01, 0xeb, 0x83, 0x2a, 0x56, 0x98, 0x8a, 0xb2, 0x49, 0xba, 0x50, 0x0b, 0xc4, 0x3a, 0xa3, 0x8a, 0x21, 0x0d, 0x58, 0x1f, 0x54, 0xb1, 0xcc, 0x54, 0x94, 0x4d, 0xd2, 0x81,
0xa9, 0x15, 0x0c, 0x8e, 0x68, 0x88, 0xea, 0x31, 0x96, 0x6a, 0x1b, 0x7f, 0x2d, 0x41, 0x63, 0xdf, 0x6a, 0x48, 0xad, 0xa0, 0x7f, 0x4c, 0x43, 0x54, 0x8f, 0xb1, 0x54, 0xdb, 0xf8, 0x53, 0x09, 0xea,
0x0b, 0xa2, 0xc7, 0x96, 0xef, 0x3b, 0xee, 0x21, 0x21, 0x30, 0xc3, 0x97, 0x21, 0x56, 0xc9, 0xbf, 0x07, 0x5e, 0x10, 0x3d, 0xb1, 0x7c, 0xdf, 0x71, 0x8f, 0x08, 0x81, 0x59, 0xbe, 0x0c, 0xb1, 0x4a,
0xc9, 0x4d, 0xa8, 0x71, 0x73, 0x0e, 0xbc, 0x21, 0x5f, 0x5e, 0x6b, 0x63, 0x71, 0x5d, 0x2a, 0xb3, 0xfe, 0x4d, 0x6e, 0x41, 0x95, 0x9b, 0xb3, 0xef, 0x0d, 0xf8, 0xf2, 0x9a, 0x9b, 0x4b, 0x1b, 0x52,
0xbe, 0x2f, 0x19, 0xa6, 0x12, 0x21, 0x1f, 0x42, 0x6b, 0xe0, 0xb9, 0x91, 0xe5, 0xb8, 0x34, 0xe8, 0x99, 0x8d, 0x03, 0xc9, 0x30, 0x95, 0x08, 0xb9, 0x0e, 0xcd, 0xbe, 0xe7, 0x46, 0x96, 0xe3, 0xd2,
0xfb, 0x38, 0x36, 0x5f, 0x6d, 0xd5, 0x6c, 0x2a, 0x2a, 0x9b, 0x90, 0x5c, 0x82, 0xfa, 0x91, 0x17, 0xa0, 0xe7, 0xe3, 0xd8, 0x7c, 0xb5, 0x15, 0xb3, 0xa1, 0xa8, 0x6c, 0x42, 0x72, 0x09, 0x6a, 0xc7,
0x46, 0x42, 0x62, 0x86, 0x4b, 0xd4, 0x18, 0x81, 0x33, 0x57, 0x60, 0x8e, 0x33, 0x1d, 0xbf, 0x53, 0x5e, 0x18, 0x09, 0x89, 0x59, 0x2e, 0x51, 0x65, 0x04, 0xce, 0x5c, 0x85, 0x79, 0xce, 0x74, 0xfc,
0xe5, 0x9a, 0xcc, 0xb2, 0xe6, 0xae, 0x6f, 0x7c, 0x5b, 0x82, 0xea, 0x63, 0x0f, 0x27, 0x2f, 0xd4, 0x76, 0x85, 0x6b, 0x32, 0xc7, 0x9a, 0x7b, 0xbe, 0xf1, 0x7d, 0x09, 0x2a, 0x4f, 0x3c, 0x9c, 0xbc,
0x34, 0x3d, 0xb5, 0x15, 0x1d, 0x49, 0x77, 0x68, 0x53, 0x23, 0x31, 0x99, 0x9a, 0x49, 0x08, 0x57, 0x50, 0xd3, 0xf4, 0xd4, 0x56, 0x74, 0x2c, 0xdd, 0xa1, 0x4d, 0x8d, 0xc4, 0x64, 0x6a, 0x26, 0x21,
0x88, 0xa9, 0x19, 0x13, 0xad, 0x15, 0x50, 0xcb, 0xf6, 0xdc, 0xe1, 0x09, 0x57, 0xab, 0x66, 0xaa, 0x5c, 0x21, 0xa6, 0x66, 0x4c, 0xb4, 0x56, 0x40, 0x2d, 0xdb, 0x73, 0x07, 0x63, 0xae, 0x56, 0xd5,
0x36, 0xf3, 0x64, 0x48, 0x87, 0x8e, 0x3b, 0x7e, 0xd3, 0x0f, 0xe8, 0xd0, 0x7a, 0x49, 0x87, 0x5c, 0x54, 0x6d, 0xe6, 0xc9, 0x90, 0x0e, 0x1c, 0x77, 0xf4, 0xb6, 0x17, 0xd0, 0x81, 0xf5, 0x8a, 0x0e,
0xbd, 0x9a, 0xd9, 0x92, 0x64, 0x53, 0x50, 0x8d, 0x57, 0xb0, 0xc0, 0x5c, 0x1f, 0xfa, 0xd6, 0x80, 0xb8, 0x7a, 0x55, 0xb3, 0x29, 0xc9, 0xa6, 0xa0, 0x1a, 0xaf, 0x61, 0x91, 0xb9, 0x3e, 0xf4, 0xad,
0x4a, 0xff, 0x60, 0xa0, 0xf0, 0x49, 0x5d, 0x1a, 0xfd, 0xd6, 0x0b, 0x5e, 0x73, 0xbd, 0x6b, 0x66, 0x3e, 0x95, 0xfe, 0xc1, 0x40, 0xe1, 0x93, 0xba, 0x34, 0xfa, 0x95, 0x17, 0xbc, 0xe1, 0x7a, 0x57,
0x83, 0xd1, 0xf6, 0x04, 0x89, 0x5c, 0x84, 0x9a, 0xd0, 0xcb, 0xb1, 0xb9, 0xe2, 0x35, 0x93, 0x5b, 0xcd, 0x3a, 0xa3, 0xed, 0x0b, 0x12, 0xb9, 0x08, 0x55, 0xa1, 0x97, 0x63, 0x73, 0xc5, 0xab, 0x26,
0x61, 0xdf, 0xb1, 0x15, 0xcb, 0xf1, 0x07, 0x5c, 0x63, 0xc9, 0xda, 0xf5, 0x07, 0xc6, 0xef, 0x4b, 0xb7, 0xc2, 0x81, 0x63, 0x2b, 0x96, 0xe3, 0xf7, 0xb9, 0xc6, 0x92, 0xb5, 0xe7, 0xf7, 0x8d, 0xdf,
0x70, 0xe1, 0x11, 0x9b, 0x7c, 0xdf, 0xb3, 0x7b, 0x96, 0x6b, 0xbf, 0xf4, 0xde, 0x6c, 0x79, 0xee, 0x94, 0xe0, 0xc2, 0x63, 0x36, 0xf9, 0x81, 0x67, 0x77, 0x2d, 0xd7, 0x7e, 0xe5, 0xbd, 0xdd, 0xf6,
0x81, 0x73, 0x48, 0xde, 0x87, 0xe6, 0xe0, 0x30, 0xf0, 0xc6, 0x3e, 0xae, 0x34, 0xa0, 0x6e, 0x24, 0xdc, 0x43, 0xe7, 0x88, 0x7c, 0x08, 0x8d, 0xfe, 0x51, 0xe0, 0x8d, 0x7c, 0x5c, 0x69, 0x40, 0xdd,
0x6d, 0x35, 0x2f, 0x88, 0xfb, 0x9c, 0x46, 0x76, 0x60, 0xd1, 0x8d, 0x55, 0xed, 0x7b, 0x5c, 0xd7, 0x48, 0xda, 0x6a, 0x41, 0x10, 0x0f, 0x38, 0x8d, 0xec, 0xc2, 0x92, 0x1b, 0xab, 0xda, 0xf3, 0xb8,
0x90, 0xcf, 0xde, 0xd8, 0xe8, 0x28, 0x37, 0x67, 0x16, 0x63, 0xb6, 0xdd, 0x34, 0x21, 0x34, 0x02, 0xae, 0x21, 0x9f, 0xbd, 0xbe, 0xd9, 0x56, 0x6e, 0xce, 0x2c, 0xc6, 0x6c, 0xb9, 0x69, 0x42, 0x68,
0x20, 0xc9, 0xfc, 0x8f, 0x69, 0x64, 0xd9, 0x56, 0x64, 0x15, 0x3a, 0xa9, 0x0d, 0x95, 0xb1, 0x5c, 0x04, 0x40, 0x92, 0xf9, 0x9f, 0xd0, 0xc8, 0xb2, 0xad, 0xc8, 0x2a, 0x74, 0x52, 0x0b, 0xca, 0x23,
0x60, 0xdd, 0x64, 0x9f, 0xe4, 0x32, 0xd4, 0xd5, 0x78, 0xd2, 0x1f, 0x09, 0x81, 0x05, 0xb6, 0x15, 0xb9, 0xc0, 0x9a, 0xc9, 0x3e, 0xc9, 0x65, 0xa8, 0xa9, 0xf1, 0xa4, 0x3f, 0x12, 0x02, 0x0b, 0x6c,
0x45, 0x74, 0xe4, 0x8b, 0x30, 0x69, 0x9a, 0x71, 0xd3, 0xf8, 0xc7, 0x0c, 0xb4, 0x73, 0x8b, 0xbe, 0x2b, 0x8a, 0xe8, 0xd0, 0x17, 0x61, 0xd2, 0x30, 0xe3, 0xa6, 0xf1, 0xd7, 0x59, 0x68, 0xe5, 0x16,
0x03, 0xb5, 0x91, 0x9c, 0x9e, 0x4f, 0xdb, 0xd8, 0xb8, 0x94, 0x44, 0x6b, 0x4e, 0x43, 0x53, 0x09, 0x7d, 0x17, 0xaa, 0x43, 0x39, 0x3d, 0x9f, 0xb6, 0xbe, 0x79, 0x29, 0x89, 0xd6, 0x9c, 0x86, 0xa6,
0x33, 0xc7, 0x33, 0x93, 0x6a, 0xbb, 0x58, 0xb5, 0x99, 0x25, 0x87, 0xde, 0x61, 0xdf, 0x76, 0x02, 0x12, 0x66, 0x8e, 0x67, 0x26, 0xd5, 0x76, 0xb1, 0x6a, 0x33, 0x4b, 0x0e, 0xbc, 0xa3, 0x9e, 0xed,
0x3a, 0x88, 0xbc, 0xe0, 0x44, 0x6a, 0x39, 0x8f, 0xc4, 0xed, 0x98, 0x46, 0x7e, 0x0e, 0x0d, 0xdb, 0x04, 0xb4, 0x1f, 0x79, 0xc1, 0x58, 0x6a, 0xb9, 0x80, 0xc4, 0x9d, 0x98, 0x46, 0x7e, 0x0a, 0x75,
0x0d, 0x95, 0x0d, 0x67, 0xf8, 0xe4, 0x44, 0x4d, 0xae, 0xb6, 0xaa, 0x09, 0x28, 0x26, 0xed, 0x46, 0xdb, 0x0d, 0x95, 0x0d, 0x67, 0xf9, 0xe4, 0x44, 0x4d, 0xae, 0xb6, 0xaa, 0x09, 0x28, 0x26, 0xed,
0xee, 0x42, 0x93, 0xed, 0x80, 0xfe, 0x48, 0x6c, 0xc0, 0x10, 0x03, 0xaa, 0x82, 0xdd, 0x96, 0x34, 0x46, 0xee, 0x41, 0x83, 0xed, 0x80, 0xde, 0x50, 0x6c, 0xc0, 0x10, 0x03, 0xaa, 0x8c, 0xdd, 0x96,
0x9d, 0xd5, 0xee, 0x34, 0xe7, 0xfd, 0xa4, 0x11, 0x92, 0xcf, 0x60, 0x96, 0x47, 0x5b, 0xd8, 0x99, 0x35, 0x9d, 0xd5, 0xee, 0x34, 0x17, 0xfc, 0xa4, 0x11, 0x92, 0xcf, 0x61, 0x8e, 0x47, 0x5b, 0xd8,
0xe5, 0x7d, 0x3e, 0x2c, 0x58, 0xa7, 0x30, 0xca, 0xfa, 0x23, 0x2e, 0xb7, 0xe3, 0x46, 0xc1, 0x89, 0x9e, 0xe3, 0x7d, 0xae, 0x17, 0xac, 0x53, 0x18, 0x65, 0xe3, 0x31, 0x97, 0xdb, 0x75, 0xa3, 0x60,
0x29, 0x3b, 0x91, 0x47, 0xd0, 0xb0, 0x5c, 0xd7, 0x8b, 0x2c, 0xa1, 0xee, 0x1c, 0x1f, 0x63, 0x6d, 0x6c, 0xca, 0x4e, 0xe4, 0x31, 0xd4, 0x2d, 0xd7, 0xf5, 0x22, 0x4b, 0xa8, 0x3b, 0xcf, 0xc7, 0x58,
0xf2, 0x18, 0x9b, 0x89, 0xb0, 0x18, 0x48, 0xef, 0x4e, 0x7e, 0x01, 0x55, 0xbe, 0x03, 0x3a, 0x35, 0x9f, 0x3c, 0xc6, 0x56, 0x22, 0x2c, 0x06, 0xd2, 0xbb, 0x93, 0x9f, 0x41, 0x85, 0xef, 0x80, 0x76,
0xbe, 0xec, 0x2b, 0x6a, 0x9c, 0xc2, 0xd0, 0x34, 0x85, 0x70, 0xf7, 0x2e, 0x34, 0x34, 0xd5, 0x58, 0x95, 0x2f, 0xfb, 0x8a, 0x1a, 0xa7, 0x30, 0x34, 0x4d, 0x21, 0xdc, 0xb9, 0x07, 0x75, 0x4d, 0x35,
0x68, 0xbc, 0xa6, 0x27, 0x32, 0x5a, 0xd8, 0x27, 0x59, 0x82, 0xea, 0xb1, 0x35, 0x1c, 0xc7, 0x1e, 0x16, 0x1a, 0x6f, 0xe8, 0x58, 0x46, 0x0b, 0xfb, 0x24, 0xcb, 0x50, 0x39, 0xb1, 0x06, 0xa3, 0xd8,
0x11, 0x8d, 0x7b, 0xe5, 0x5f, 0x96, 0xba, 0xf7, 0xa1, 0x9d, 0xd5, 0xe8, 0x2c, 0xfd, 0x8d, 0x5d, 0x23, 0xa2, 0x71, 0x7f, 0xe6, 0xe7, 0xa5, 0xce, 0x03, 0x68, 0x65, 0x35, 0x3a, 0x4b, 0x7f, 0x63,
0x58, 0x32, 0xc7, 0x6e, 0xa2, 0x58, 0x7c, 0x30, 0xfc, 0x0c, 0x66, 0x07, 0x5c, 0x47, 0x19, 0x3d, 0x0f, 0x96, 0xcd, 0x91, 0x9b, 0x28, 0x16, 0x1f, 0x0c, 0x3f, 0x81, 0xb9, 0x3e, 0xd7, 0x51, 0x46,
0x17, 0x27, 0x5a, 0xc4, 0x94, 0x82, 0xc6, 0x67, 0x70, 0x21, 0x33, 0x94, 0x3c, 0x36, 0x3e, 0x80, 0xcf, 0xc5, 0x89, 0x16, 0x31, 0xa5, 0xa0, 0xf1, 0x39, 0x5c, 0xc8, 0x0c, 0x25, 0x8f, 0x8d, 0x8f,
0x96, 0xef, 0xd9, 0xfd, 0x50, 0x90, 0xfb, 0x18, 0xf5, 0x72, 0x07, 0xfa, 0x4a, 0x76, 0xd7, 0x66, 0xa0, 0xe9, 0x7b, 0x76, 0x2f, 0x14, 0xe4, 0x1e, 0x46, 0xbd, 0xdc, 0x81, 0xbe, 0x92, 0xdd, 0xb3,
0xdd, 0x7b, 0x91, 0xe7, 0xe7, 0x55, 0x99, 0xae, 0x7b, 0x07, 0x96, 0xb3, 0xdd, 0xc5, 0xf4, 0xc6, 0x59, 0xf7, 0x6e, 0xe4, 0xf9, 0x79, 0x55, 0xa6, 0xeb, 0xde, 0x86, 0x95, 0x6c, 0x77, 0x31, 0xbd,
0xe7, 0xb0, 0x62, 0xd2, 0x91, 0x77, 0x4c, 0xdf, 0x76, 0xe8, 0x2e, 0x74, 0xf2, 0x03, 0x24, 0x83, 0xf1, 0x05, 0xac, 0x9a, 0x74, 0xe8, 0x9d, 0xd0, 0x77, 0x1d, 0xba, 0x03, 0xed, 0xfc, 0x00, 0xc9,
0x27, 0xd4, 0x1e, 0xba, 0x61, 0x1c, 0x9e, 0x6d, 0xf0, 0x1b, 0xfa, 0x00, 0x32, 0x05, 0x8a, 0x71, 0xe0, 0x09, 0xb5, 0x8b, 0x6e, 0x18, 0x85, 0x67, 0x1b, 0xfc, 0xa6, 0x3e, 0x80, 0x4c, 0x81, 0x62,
0x48, 0x0b, 0xca, 0x98, 0xf9, 0x45, 0x27, 0xfc, 0x32, 0x5e, 0x40, 0x7d, 0x4f, 0xcf, 0x07, 0x7a, 0x1c, 0xd2, 0x84, 0x19, 0xcc, 0xfc, 0xa2, 0x13, 0x7e, 0x19, 0x2f, 0xa1, 0xb6, 0xaf, 0xe7, 0x03,
0x0e, 0xc5, 0x83, 0x4e, 0x36, 0xc9, 0x06, 0xcc, 0x4d, 0x9b, 0xc0, 0x62, 0x41, 0xe3, 0x61, 0x2e, 0x3d, 0x87, 0xe2, 0x41, 0x27, 0x9b, 0x64, 0x13, 0xe6, 0xa7, 0x4d, 0x60, 0xb1, 0xa0, 0xf1, 0x28,
0x79, 0x4a, 0x1d, 0x36, 0x00, 0x54, 0x0e, 0x0a, 0x65, 0x2c, 0x90, 0xfc, 0x78, 0xa6, 0x26, 0x65, 0x97, 0x3c, 0xa5, 0x0e, 0x9b, 0x00, 0x2a, 0x07, 0x85, 0x32, 0x16, 0x48, 0x7e, 0x3c, 0x53, 0x93,
0x7c, 0x9b, 0x4a, 0x48, 0xda, 0x62, 0x6c, 0xb5, 0x18, 0x3b, 0x95, 0xa0, 0xca, 0x67, 0x49, 0x50, 0x32, 0xbe, 0x4f, 0x25, 0x24, 0x6d, 0x31, 0xb6, 0x5a, 0x8c, 0x9d, 0x4a, 0x50, 0x33, 0x67, 0x49,
0xeb, 0x50, 0x0d, 0x71, 0x48, 0x91, 0x22, 0x5b, 0xda, 0xe2, 0x64, 0xaf, 0x2f, 0xc5, 0x94, 0xd4, 0x50, 0x1b, 0x50, 0x09, 0x71, 0x48, 0x91, 0x22, 0x9b, 0xda, 0xe2, 0x64, 0xaf, 0xaf, 0xc4, 0x94,
0x14, 0x62, 0xe4, 0x3d, 0x80, 0x01, 0x1e, 0x5d, 0x11, 0xb5, 0xfb, 0x96, 0xc8, 0x9d, 0x15, 0xb3, 0xd4, 0x14, 0x62, 0xe4, 0x03, 0x80, 0x3e, 0x1e, 0x5d, 0x11, 0xb5, 0x7b, 0x96, 0xc8, 0x9d, 0x65,
0x2e, 0x29, 0x9b, 0x11, 0xb9, 0x97, 0xd8, 0xb1, 0xca, 0xd5, 0x58, 0x2d, 0x50, 0x23, 0xe5, 0x97, 0xb3, 0x26, 0x29, 0x5b, 0x11, 0xb9, 0x9f, 0xd8, 0xb1, 0xc2, 0xd5, 0x58, 0x2b, 0x50, 0x23, 0xe5,
0xc4, 0xd2, 0x6a, 0xb7, 0xcf, 0x9e, 0xbe, 0xdb, 0x65, 0x3f, 0x21, 0xac, 0x25, 0xac, 0xb9, 0x89, 0x97, 0xc4, 0xd2, 0x6a, 0xb7, 0xcf, 0x9d, 0xbe, 0xdb, 0x65, 0x3f, 0x21, 0xac, 0x25, 0xac, 0xf9,
0x09, 0x4b, 0xf4, 0x98, 0x26, 0x61, 0xd5, 0x26, 0x26, 0x2c, 0x39, 0xc6, 0xa9, 0x09, 0xeb, 0xc7, 0x89, 0x09, 0x4b, 0xf4, 0x98, 0x26, 0x61, 0x55, 0x27, 0x26, 0x2c, 0x39, 0xc6, 0xa9, 0x09, 0xeb,
0x4c, 0x3d, 0x8f, 0xa1, 0x93, 0xdf, 0x3a, 0x32, 0x65, 0x60, 0xfa, 0x09, 0x39, 0xe5, 0x94, 0xf4, 0xc7, 0x4c, 0x3d, 0x4f, 0xa0, 0x9d, 0xdf, 0x3a, 0x32, 0x65, 0x60, 0xfa, 0x09, 0x39, 0xe5, 0x94,
0x23, 0xbb, 0x48, 0x41, 0xe3, 0x3f, 0x25, 0x3d, 0xea, 0x7e, 0xe5, 0x0c, 0x23, 0x1a, 0xe4, 0xa2, 0xf4, 0x23, 0xbb, 0x48, 0x41, 0xe3, 0x9f, 0x25, 0x3d, 0xea, 0xbe, 0x76, 0x06, 0x11, 0x0d, 0x72,
0x4e, 0x05, 0x4f, 0x79, 0xba, 0xe0, 0xe9, 0x41, 0x8b, 0x9b, 0xbd, 0x8f, 0x95, 0x0d, 0x3f, 0xdf, 0x51, 0xa7, 0x82, 0x67, 0x66, 0xba, 0xe0, 0xe9, 0x42, 0x93, 0x9b, 0xbd, 0x87, 0x95, 0x0d, 0x3f,
0x30, 0xea, 0x98, 0xbd, 0x3f, 0x2e, 0xd0, 0x47, 0x4c, 0x29, 0x7c, 0xd6, 0x93, 0xe2, 0xc2, 0xe2, 0xdf, 0x30, 0xea, 0x98, 0xbd, 0x3f, 0x29, 0xd0, 0x47, 0x4c, 0x29, 0x7c, 0xd6, 0x95, 0xe2, 0xc2,
0xcd, 0xa1, 0x4e, 0xeb, 0x7e, 0x01, 0x24, 0x2f, 0x74, 0x26, 0xd3, 0x7d, 0xc5, 0xb6, 0x2b, 0x2b, 0xe2, 0x8d, 0x81, 0x4e, 0xeb, 0x7c, 0x09, 0x24, 0x2f, 0x74, 0x26, 0xd3, 0x7d, 0xc3, 0xb6, 0x2b,
0x12, 0x0b, 0xd2, 0xf6, 0x01, 0x57, 0xe3, 0x14, 0xbb, 0x09, 0x3d, 0x4d, 0x29, 0x68, 0xfc, 0xb9, 0x2b, 0x12, 0x0b, 0xd2, 0xf6, 0x21, 0x57, 0xe3, 0x14, 0xbb, 0x09, 0x3d, 0x4d, 0x29, 0x68, 0xfc,
0x0c, 0x90, 0x30, 0xdf, 0xd9, 0x7d, 0x7a, 0x47, 0xed, 0x1a, 0x51, 0x1a, 0x5c, 0x2d, 0xd0, 0xa2, 0xa1, 0x0c, 0x90, 0x30, 0xdf, 0xdb, 0x7d, 0x7a, 0x57, 0xed, 0x1a, 0x51, 0x1a, 0x5c, 0x2d, 0xd0,
0x68, 0xbf, 0x7c, 0x8f, 0x08, 0x37, 0xb6, 0x60, 0x39, 0x6b, 0x66, 0x19, 0x9f, 0x37, 0xa0, 0xea, 0xa2, 0x70, 0xbf, 0x7c, 0x9d, 0xde, 0x2f, 0xa2, 0x48, 0xf8, 0xa8, 0xa8, 0xf7, 0x7b, 0xbb, 0x53,
0x60, 0xf5, 0x25, 0x40, 0x46, 0x63, 0xe3, 0x7c, 0x81, 0x32, 0xa6, 0x90, 0x30, 0xae, 0x41, 0x7d, 0xb6, 0x61, 0x25, 0xeb, 0x6e, 0xb9, 0x4f, 0x6e, 0x42, 0xc5, 0xc1, 0x2a, 0x50, 0x80, 0x9d, 0xfa,
0x77, 0x64, 0x1d, 0xd2, 0x9e, 0x4f, 0x07, 0x6c, 0x2e, 0x87, 0x35, 0xe4, 0xfc, 0xa2, 0x61, 0x6c, 0xe6, 0xf9, 0x82, 0x65, 0x99, 0x42, 0xc2, 0xb8, 0x06, 0xb5, 0xbd, 0xa1, 0x75, 0x44, 0xbb, 0x3e,
0x40, 0xed, 0x21, 0x3d, 0x79, 0xce, 0xe6, 0x9d, 0x56, 0x3f, 0xe3, 0x5f, 0x25, 0x58, 0xe1, 0x69, 0xed, 0xb3, 0xb9, 0x1c, 0xd6, 0x90, 0xf3, 0x8b, 0x86, 0xb1, 0x09, 0xd5, 0x47, 0x74, 0xfc, 0x82,
0x66, 0x2b, 0x2e, 0xea, 0x51, 0x39, 0x6f, 0x1c, 0x60, 0x02, 0xe6, 0xa6, 0xf4, 0xc7, 0x7d, 0x9f, 0xcd, 0x3b, 0xad, 0x7e, 0xc6, 0xdf, 0x4b, 0xb0, 0xca, 0xd3, 0xdd, 0x76, 0x0c, 0x2e, 0x50, 0x39,
0x06, 0x8e, 0x27, 0x7c, 0xc9, 0x4c, 0xe9, 0x8f, 0xf7, 0x39, 0x81, 0x15, 0xfe, 0x8c, 0xfd, 0xcd, 0x6f, 0x14, 0xe0, 0x41, 0xc0, 0x5d, 0xea, 0x8f, 0x7a, 0x3e, 0x0d, 0x1c, 0x4f, 0xc4, 0x14, 0x73,
0xd8, 0x93, 0x3e, 0xad, 0x98, 0x35, 0x24, 0xfc, 0x9a, 0xb5, 0xe3, 0xbe, 0xe1, 0x11, 0xd6, 0xc5, 0xa9, 0x3f, 0x3a, 0xe0, 0x04, 0x06, 0x40, 0x18, 0xfb, 0xbb, 0x91, 0x27, 0x63, 0xab, 0x6c, 0x56,
0x21, 0xf7, 0x9d, 0xe8, 0xdb, 0xe3, 0x04, 0x0c, 0xb0, 0x0b, 0x23, 0x3c, 0x0b, 0x83, 0x93, 0xfe, 0x91, 0xf0, 0x0b, 0xd6, 0x8e, 0xfb, 0x86, 0xc7, 0x58, 0x9f, 0x87, 0x3c, 0x86, 0x44, 0xdf, 0x2e,
0xd0, 0x19, 0x39, 0x58, 0x89, 0xbb, 0xfd, 0x97, 0x27, 0x11, 0x0d, 0xa5, 0xc3, 0x88, 0x60, 0x3e, 0x27, 0x60, 0xa0, 0x5f, 0x18, 0xe2, 0x99, 0x1c, 0x8c, 0x7b, 0x03, 0x67, 0xe8, 0x20, 0x22, 0x70,
0x62, 0xbc, 0x5d, 0xf7, 0x4b, 0xc6, 0x21, 0x06, 0x34, 0x3d, 0x6f, 0xd4, 0x0f, 0x07, 0x5e, 0x80, 0x7b, 0xaf, 0xc6, 0x11, 0x0d, 0x65, 0xe0, 0x10, 0xc1, 0x7c, 0xcc, 0x78, 0x7b, 0xee, 0x57, 0x8c,
0x88, 0xce, 0x7e, 0xc5, 0xf3, 0x6c, 0xc5, 0x6c, 0x20, 0xb1, 0xc7, 0x68, 0x9b, 0xf6, 0x2b, 0xc3, 0x43, 0x0c, 0x68, 0x78, 0xde, 0xb0, 0x17, 0xf6, 0xbd, 0x00, 0x91, 0xa5, 0xfd, 0x9a, 0xe7, 0xfb,
0x82, 0x66, 0x6f, 0x87, 0x2f, 0x47, 0xe2, 0x04, 0x2c, 0x99, 0xc7, 0xa1, 0x0c, 0x63, 0x2c, 0x99, 0xb2, 0x59, 0x47, 0x62, 0x97, 0xd1, 0xb6, 0xec, 0xd7, 0x86, 0x05, 0x8d, 0xee, 0x2e, 0x5f, 0x8e,
0xd9, 0x37, 0xa3, 0x05, 0xde, 0x30, 0xb6, 0x03, 0xff, 0x66, 0xb4, 0xe8, 0xc4, 0x8f, 0xeb, 0x65, 0xc4, 0x2b, 0x58, 0xba, 0x8f, 0x42, 0xb9, 0x9d, 0xb0, 0x74, 0x67, 0xdf, 0x8c, 0x16, 0x78, 0x83,
0xfe, 0xcd, 0x0c, 0x36, 0xa4, 0xc7, 0x88, 0x4a, 0x04, 0x64, 0x14, 0x0d, 0xc3, 0x06, 0xd8, 0xb2, 0xd8, 0x0e, 0xfc, 0x9b, 0xd1, 0xa2, 0xb1, 0x1f, 0xd7, 0xed, 0xfc, 0x9b, 0x19, 0x6c, 0x40, 0x4f,
0x7c, 0xeb, 0xa5, 0x33, 0x74, 0xa2, 0x13, 0x74, 0x60, 0xdb, 0xb2, 0xed, 0xfe, 0x20, 0xa6, 0x38, 0x10, 0x1d, 0x09, 0xe8, 0x2a, 0x1a, 0x86, 0x0d, 0xb0, 0x6d, 0xf9, 0xd6, 0x2b, 0x67, 0xe0, 0x44,
0x34, 0x06, 0x8c, 0x0b, 0x48, 0xdf, 0xd2, 0xc8, 0xe4, 0x23, 0x58, 0xb4, 0x03, 0xcf, 0x4f, 0xcb, 0x63, 0x74, 0x60, 0xcb, 0xb2, 0xed, 0x5e, 0x3f, 0xa6, 0x38, 0x34, 0x06, 0xae, 0x8b, 0x48, 0xdf,
0x0a, 0x04, 0xd9, 0x66, 0x0c, 0x5d, 0xd8, 0xf8, 0x5f, 0x09, 0x96, 0xd2, 0x6e, 0x91, 0x05, 0xf9, 0xd6, 0xc8, 0xe4, 0x63, 0x58, 0xb2, 0x03, 0xcf, 0x4f, 0xcb, 0x0a, 0x24, 0xdb, 0x62, 0x0c, 0x5d,
0x7d, 0xa8, 0x07, 0xb1, 0x83, 0xe4, 0xe6, 0x5c, 0x4d, 0x9f, 0x17, 0x79, 0x47, 0x9a, 0x49, 0x17, 0xd8, 0xf8, 0x77, 0x09, 0x96, 0xd3, 0x6e, 0x91, 0xc0, 0xe0, 0x01, 0xd4, 0x82, 0xd8, 0x41, 0x32,
0x8c, 0xff, 0xf9, 0x8c, 0x02, 0xa5, 0x54, 0xe0, 0x25, 0x6b, 0x33, 0x53, 0x82, 0xe4, 0xf3, 0x04, 0x49, 0xac, 0xa5, 0xcf, 0xad, 0xbc, 0x23, 0xcd, 0xa4, 0x0b, 0xee, 0xc3, 0x85, 0x8c, 0x02, 0xa5,
0xad, 0xc5, 0x65, 0x41, 0x85, 0xf7, 0x5d, 0x56, 0x7d, 0x53, 0xa6, 0x57, 0x28, 0x2e, 0xae, 0xcd, 0x54, 0xe0, 0x25, 0x6b, 0x33, 0x53, 0x82, 0xe4, 0x8b, 0x04, 0x35, 0xc6, 0xe5, 0x49, 0x99, 0xf7,
0x7f, 0x22, 0x5d, 0x91, 0xad, 0xe4, 0x79, 0x9f, 0x67, 0xc8, 0x11, 0xee, 0x31, 0xbe, 0x86, 0xba, 0x5d, 0x51, 0x7d, 0x53, 0xa6, 0x57, 0x68, 0x32, 0xc6, 0x08, 0xff, 0x27, 0x5d, 0x91, 0x45, 0x14,
0x22, 0xc5, 0xf0, 0x46, 0xc4, 0x1e, 0x87, 0x37, 0x48, 0x39, 0x94, 0x80, 0x07, 0x29, 0xf8, 0xc9, 0xbc, 0xcf, 0x73, 0xe4, 0x08, 0xf7, 0x18, 0xdf, 0x42, 0x4d, 0x91, 0x62, 0x98, 0x25, 0x62, 0x8f,
0x70, 0x24, 0xda, 0xda, 0x61, 0xb3, 0x58, 0xc3, 0x3e, 0x52, 0x42, 0x9e, 0x5d, 0x2b, 0x66, 0x2b, 0xc3, 0x2c, 0xa4, 0x1c, 0x49, 0xe0, 0x85, 0x14, 0xfc, 0x64, 0x78, 0x16, 0x6d, 0xed, 0xb0, 0x59,
0x21, 0x3f, 0x40, 0x2a, 0x22, 0xfc, 0x45, 0x65, 0x9c, 0x53, 0x41, 0x95, 0x06, 0x92, 0xca, 0x69, 0xac, 0x41, 0x0f, 0x29, 0x21, 0xcf, 0xf2, 0x65, 0xb3, 0x99, 0x90, 0x1f, 0x22, 0xd5, 0xd8, 0x82,
0x90, 0xf4, 0xdf, 0x2a, 0x2c, 0x64, 0x5d, 0x72, 0x3b, 0x87, 0x91, 0xba, 0x89, 0x39, 0xb3, 0xf3, 0x25, 0x65, 0x9c, 0x53, 0xc1, 0x9d, 0x06, 0xd6, 0x66, 0xd2, 0x60, 0xed, 0x5f, 0x15, 0x58, 0xcc,
0x69, 0x99, 0xed, 0x7a, 0xbc, 0x89, 0xcb, 0x19, 0x8b, 0xa8, 0x7d, 0x2e, 0x37, 0x36, 0xd3, 0x67, 0xba, 0xe4, 0x4e, 0x0e, 0xab, 0x75, 0x12, 0x73, 0x66, 0xe7, 0xd3, 0x32, 0xec, 0x8d, 0x78, 0x13,
0xe0, 0x8d, 0x46, 0x98, 0x10, 0xf8, 0xca, 0xb0, 0x48, 0x93, 0x4d, 0xa6, 0xbd, 0x15, 0x1c, 0xb2, 0xcf, 0x64, 0x2c, 0xa2, 0xf6, 0xb9, 0xdc, 0xd8, 0x4c, 0x9f, 0xbe, 0x37, 0x1c, 0x62, 0x42, 0xe0,
0x6d, 0xc3, 0xc8, 0xfc, 0x9b, 0x5c, 0x85, 0x06, 0x2b, 0x2b, 0x10, 0xd5, 0x30, 0x88, 0x25, 0x21, 0x2b, 0xc3, 0x62, 0x51, 0x36, 0x99, 0xf6, 0x56, 0x70, 0xc4, 0xb6, 0x0d, 0x23, 0xf3, 0x6f, 0x72,
0x3f, 0x48, 0x12, 0x02, 0x2c, 0x04, 0xf6, 0x33, 0xd4, 0x3d, 0x8e, 0x81, 0x4e, 0x72, 0xfd, 0x10, 0x15, 0xea, 0xac, 0xbc, 0x41, 0x74, 0xc5, 0xa0, 0x9e, 0xbc, 0x7a, 0x00, 0x49, 0x42, 0xa0, 0x47,
0x27, 0x0f, 0x93, 0xb3, 0xd1, 0x61, 0xb3, 0x23, 0x76, 0x39, 0x10, 0x17, 0x18, 0x2d, 0x25, 0xc8, 0xae, 0xc3, 0x2c, 0x75, 0x4f, 0xe2, 0x5c, 0x9a, 0x5c, 0x83, 0xc4, 0xc9, 0xc3, 0xe4, 0x6c, 0x74,
0xef, 0x0c, 0x4c, 0xc9, 0x25, 0x9f, 0xaa, 0x94, 0x2a, 0x8a, 0x88, 0x0f, 0xf2, 0xab, 0x3f, 0x05, 0xd8, 0xdc, 0x90, 0x5d, 0x52, 0xc4, 0x85, 0x4e, 0x53, 0x09, 0xf2, 0xbb, 0x0b, 0x53, 0x72, 0xc9,
0x38, 0x3d, 0x4c, 0xd7, 0x21, 0x75, 0x3e, 0xc4, 0x8d, 0x89, 0x43, 0x9c, 0x8e, 0x9b, 0xae, 0x00, 0x67, 0x2a, 0xb5, 0x57, 0x33, 0xc9, 0x39, 0x63, 0xa9, 0xc2, 0xfc, 0xfe, 0x28, 0x9d, 0xdf, 0x6b,
0xf8, 0x81, 0x73, 0xec, 0x0c, 0xe9, 0x21, 0xb5, 0x3b, 0xc0, 0xa1, 0xbd, 0x46, 0xe1, 0x97, 0x47, 0x7c, 0x88, 0x9b, 0x13, 0x87, 0x38, 0x1d, 0xbf, 0x5d, 0x01, 0xf0, 0x03, 0xe7, 0xc4, 0x19, 0xd0,
0xf2, 0xfa, 0xa1, 0x1f, 0x78, 0x5e, 0x74, 0x10, 0x76, 0x1a, 0xe2, 0xca, 0x21, 0x26, 0x9b, 0x9c, 0x23, 0x6a, 0xb7, 0x81, 0x5f, 0x31, 0x68, 0x14, 0x7e, 0x89, 0x25, 0xaf, 0x41, 0x7a, 0x81, 0xe7,
0xca, 0x6e, 0x08, 0x18, 0x44, 0xe5, 0x77, 0x1a, 0xf3, 0xa2, 0x2e, 0xc6, 0x36, 0xbf, 0xd2, 0x58, 0x45, 0x87, 0x61, 0xbb, 0x2e, 0xae, 0x3e, 0x62, 0xb2, 0xc9, 0xa9, 0xec, 0xa6, 0x82, 0x41, 0x65,
0x62, 0x07, 0x92, 0xed, 0xb8, 0x9d, 0x26, 0xef, 0x29, 0x1a, 0x2c, 0xdf, 0xf1, 0x8f, 0xbe, 0xe7, 0x7e, 0xb7, 0xb2, 0x20, 0xea, 0x73, 0x6c, 0xf3, 0xab, 0x95, 0x65, 0x76, 0x30, 0xda, 0x8e, 0xdb,
0x22, 0xec, 0x6e, 0x71, 0x56, 0x9d, 0x53, 0x9e, 0x20, 0x81, 0x45, 0x6d, 0x14, 0x9d, 0x74, 0x16, 0x6e, 0xf0, 0x9e, 0xa2, 0xc1, 0xf2, 0x1d, 0xff, 0xe8, 0x79, 0x2e, 0xc2, 0xff, 0x26, 0x67, 0xd5,
0x38, 0x9d, 0x7d, 0x22, 0xbe, 0x95, 0x45, 0x5f, 0x9b, 0x7b, 0xff, 0xbd, 0x09, 0x9b, 0xf8, 0x9d, 0x38, 0xe5, 0x29, 0x12, 0x58, 0xd4, 0x46, 0xd1, 0xb8, 0xbd, 0xc8, 0xe9, 0xec, 0x13, 0x71, 0xb6,
0x41, 0x78, 0x7f, 0x2b, 0xc1, 0xf2, 0x16, 0x3f, 0x46, 0xb5, 0x04, 0x73, 0x06, 0x84, 0x42, 0x6e, 0x2c, 0x3e, 0x5b, 0xdc, 0xfb, 0x1f, 0x4c, 0xd8, 0xc4, 0xef, 0x0d, 0xd2, 0xfc, 0x73, 0x09, 0x56,
0x29, 0x28, 0x98, 0x85, 0x13, 0xd9, 0xc5, 0x4a, 0x39, 0xf2, 0x05, 0xb4, 0xe2, 0x31, 0x65, 0xcf, 0xb6, 0xf9, 0x71, 0xae, 0x25, 0x98, 0x33, 0x20, 0x25, 0x72, 0x5b, 0x41, 0xd2, 0x2c, 0xac, 0xc9,
0xca, 0x77, 0x81, 0xc8, 0x66, 0xa8, 0x37, 0x8d, 0x4f, 0x61, 0x25, 0xa7, 0xb3, 0x3c, 0x7a, 0xaf, 0x2e, 0x56, 0xca, 0x91, 0x2f, 0xa1, 0x19, 0x8f, 0x29, 0x7b, 0x96, 0x7f, 0x08, 0xcc, 0x36, 0x42,
0x61, 0x22, 0x54, 0xb7, 0x5b, 0x4a, 0xe5, 0x86, 0xa2, 0x21, 0xa6, 0xba, 0xc7, 0xa0, 0xa4, 0x15, 0xbd, 0x69, 0x7c, 0x06, 0xab, 0x39, 0x9d, 0xe5, 0xd1, 0x7b, 0x0d, 0x13, 0xa1, 0xba, 0x65, 0x53,
0x44, 0xb9, 0x05, 0x4f, 0xd1, 0x97, 0xe3, 0xc8, 0x74, 0x5f, 0x09, 0xf5, 0x7a, 0xb0, 0xc4, 0x10, 0x2a, 0xd7, 0x15, 0x0d, 0xb1, 0xdd, 0x7d, 0x06, 0x69, 0xad, 0x20, 0xca, 0x2d, 0x78, 0x8a, 0xbe,
0xe6, 0x5b, 0x0c, 0xca, 0xf2, 0x00, 0x5b, 0xb6, 0x37, 0x8e, 0x64, 0xfe, 0x8b, 0x9b, 0xc6, 0x8a, 0x1c, 0xcf, 0xa6, 0xfb, 0x4a, 0xc8, 0xd9, 0x85, 0x65, 0x86, 0x74, 0xdf, 0x61, 0x50, 0x96, 0x07,
0x40, 0xbd, 0xf9, 0xd9, 0x3e, 0x81, 0x65, 0x01, 0x3a, 0xdf, 0x66, 0x11, 0x17, 0x63, 0xc8, 0x9b, 0xd8, 0xb2, 0xbd, 0x51, 0x24, 0xf3, 0x5f, 0xdc, 0x34, 0x56, 0x05, 0xfa, 0xce, 0xcf, 0xf6, 0x29,
0x1f, 0xf7, 0x8f, 0x65, 0x2d, 0x11, 0x4e, 0xa8, 0x92, 0x6f, 0xa6, 0xab, 0xe4, 0x95, 0xbc, 0xc3, 0xac, 0x08, 0xf0, 0xfb, 0x2e, 0x8b, 0xb8, 0x18, 0x43, 0xef, 0xfc, 0xb8, 0xbf, 0x9b, 0xd1, 0x12,
0x53, 0x95, 0x5b, 0x3e, 0x8c, 0x2a, 0x05, 0x61, 0x64, 0xe6, 0x4a, 0xe9, 0x19, 0x9e, 0x32, 0x3e, 0xe1, 0x84, 0x6a, 0xfd, 0x56, 0xba, 0x5a, 0x5f, 0xcd, 0x3b, 0x3c, 0x55, 0x41, 0xe6, 0xc3, 0xa8,
0xca, 0x8f, 0xfe, 0x03, 0x56, 0xd2, 0xbb, 0xa2, 0x92, 0x56, 0x53, 0x2b, 0xf4, 0x7e, 0x2b, 0x53, 0x5c, 0x10, 0x46, 0x66, 0xae, 0xa4, 0x9f, 0xe5, 0x29, 0xe3, 0xe3, 0xfc, 0xe8, 0xff, 0xc3, 0x8a,
0x49, 0x77, 0x26, 0xa9, 0xa9, 0x0a, 0xe9, 0x3f, 0xcc, 0x40, 0x5d, 0xf1, 0x72, 0x36, 0xcd, 0x1b, 0x7e, 0x4f, 0x54, 0xf4, 0x6a, 0x6a, 0x75, 0x8b, 0x70, 0x3b, 0x53, 0xd1, 0xb7, 0x27, 0xa9, 0xa9,
0xa9, 0x5c, 0x60, 0x24, 0xfd, 0x48, 0xaa, 0xbc, 0xcd, 0x91, 0x34, 0xf3, 0x5d, 0x47, 0x12, 0x16, 0x0a, 0xfa, 0xdf, 0xce, 0x42, 0x4d, 0xf1, 0x72, 0x36, 0xcd, 0x1b, 0x69, 0xa6, 0xc0, 0x48, 0xfa,
0x7f, 0xfc, 0xa3, 0x1f, 0xd0, 0x03, 0x79, 0xc4, 0xd4, 0x38, 0xc1, 0xa4, 0x07, 0x89, 0xe3, 0x67, 0x91, 0x54, 0x7e, 0x97, 0x23, 0x69, 0xf6, 0x87, 0x8e, 0x24, 0x2c, 0xfe, 0xf8, 0x47, 0x2f, 0xa0,
0xa7, 0x72, 0x7c, 0xba, 0x64, 0x9f, 0xcb, 0x96, 0xec, 0xb7, 0x33, 0xe7, 0xcb, 0x95, 0xfc, 0x70, 0x87, 0xf2, 0x88, 0xa9, 0x72, 0x82, 0x49, 0x0f, 0x13, 0xc7, 0xcf, 0x4d, 0xe5, 0xf8, 0x34, 0x74,
0x85, 0x27, 0xcb, 0x4e, 0xd1, 0xc9, 0xf2, 0x7e, 0x41, 0xe7, 0x77, 0x16, 0xda, 0x3e, 0x12, 0xc0, 0x98, 0xcf, 0x42, 0x87, 0x3b, 0x99, 0xf3, 0xe5, 0x4a, 0x7e, 0xb8, 0xc2, 0x93, 0x65, 0xb7, 0xe8,
0x41, 0x8f, 0x2a, 0x99, 0xbd, 0x36, 0xd0, 0x64, 0x8a, 0x2a, 0xd1, 0x03, 0xc9, 0x2f, 0xcd, 0xd4, 0x64, 0xf9, 0xb0, 0xa0, 0xf3, 0x7b, 0x0b, 0x1c, 0x1e, 0x0b, 0xe0, 0xa0, 0x47, 0x95, 0xcc, 0x5e,
0xa4, 0x58, 0x2a, 0x48, 0xd9, 0x3f, 0xb9, 0x62, 0x9a, 0x22, 0x15, 0xfc, 0x49, 0x2f, 0x7c, 0x26, 0x9b, 0x68, 0x32, 0x45, 0x95, 0xe8, 0x81, 0xe4, 0x97, 0x66, 0x6a, 0x52, 0x2c, 0x15, 0xa4, 0xec,
0xdc, 0xc5, 0xdc, 0xce, 0x61, 0xbc, 0xe9, 0xa2, 0xee, 0x66, 0x1a, 0xe2, 0x9d, 0x2d, 0x5c, 0x72, 0x9f, 0x5c, 0x75, 0x4d, 0x91, 0x0a, 0x7e, 0xaf, 0x17, 0x3e, 0x13, 0xee, 0x84, 0xee, 0xe4, 0xb0,
0x08, 0x8f, 0x9f, 0xc4, 0x98, 0x79, 0x05, 0x5b, 0x80, 0x84, 0xba, 0xa4, 0x20, 0x1b, 0xab, 0xa3, 0xe6, 0x74, 0x51, 0x77, 0x2b, 0x0d, 0x35, 0xcf, 0x16, 0x2e, 0x39, 0xa4, 0xc9, 0x4f, 0x62, 0xcc,
0x03, 0xc7, 0x75, 0xc2, 0x23, 0xc1, 0x9f, 0xe5, 0x7c, 0x88, 0x49, 0x9b, 0xfc, 0x29, 0x85, 0xbe, 0xbc, 0x82, 0x2d, 0x40, 0x42, 0x4d, 0x52, 0x90, 0x8d, 0xd5, 0xd1, 0xa1, 0xe3, 0x3a, 0xe1, 0xb1,
0x41, 0x48, 0x32, 0xf0, 0x6c, 0xca, 0x83, 0xb1, 0x6a, 0xd6, 0x18, 0x61, 0x0b, 0xdb, 0xc9, 0x06, 0xe0, 0xcf, 0x71, 0x3e, 0xc4, 0xa4, 0x2d, 0xfe, 0xa4, 0x43, 0xdf, 0x22, 0x24, 0xe9, 0x7b, 0x36,
0xa9, 0x9d, 0x69, 0x83, 0xd4, 0x33, 0x1b, 0x64, 0x19, 0x66, 0x51, 0xdf, 0xd0, 0x73, 0x79, 0x8d, 0xe5, 0xc1, 0x58, 0x31, 0xab, 0x8c, 0xb0, 0x8d, 0xed, 0x64, 0x83, 0x54, 0xcf, 0xb4, 0x41, 0x6a,
0x52, 0x37, 0x65, 0x4b, 0x2b, 0xa5, 0x1a, 0x93, 0x4a, 0xa9, 0x53, 0xae, 0x74, 0x32, 0xa5, 0xd4, 0x99, 0x0d, 0xb2, 0x02, 0x73, 0xa8, 0x6f, 0xe8, 0xb9, 0xbc, 0x46, 0xa9, 0x99, 0xb2, 0xa5, 0x95,
0xfc, 0xa4, 0x52, 0x6a, 0x9a, 0x1b, 0x1d, 0xad, 0xfa, 0x6b, 0x9e, 0x56, 0xfd, 0xfd, 0x98, 0xdb, 0x52, 0xf5, 0x49, 0xa5, 0xd4, 0x29, 0x57, 0x4b, 0x99, 0x52, 0x6a, 0x61, 0x52, 0x29, 0x35, 0xcd,
0xe3, 0x21, 0x9e, 0xee, 0xd9, 0x80, 0x96, 0xfb, 0xe3, 0x56, 0xe6, 0xe2, 0xa7, 0x33, 0xc9, 0x0a, 0xcd, 0x92, 0x56, 0xfd, 0x35, 0x4e, 0xab, 0xfe, 0x7e, 0xcc, 0xed, 0xf1, 0x08, 0x4f, 0xf7, 0x6c,
0xea, 0xde, 0xe7, 0x15, 0x34, 0x76, 0xde, 0xa0, 0xfb, 0xa6, 0x3f, 0x8d, 0x51, 0xd5, 0xc1, 0xc8, 0x40, 0xcb, 0xfd, 0x71, 0x3b, 0x73, 0x01, 0xd5, 0x9e, 0x64, 0x05, 0x75, 0xff, 0xf4, 0x1a, 0xea,
0x96, 0x10, 0x8e, 0x7d, 0xc6, 0x55, 0x5e, 0x25, 0xa9, 0xf2, 0x54, 0xb1, 0xc8, 0xc2, 0x74, 0x5e, 0xbb, 0x6f, 0xd1, 0x7d, 0xd3, 0x9f, 0xc6, 0xa8, 0x6a, 0x7f, 0x68, 0x4b, 0x08, 0xc7, 0x3e, 0xe3,
0x16, 0x8b, 0xc6, 0x7d, 0x98, 0x17, 0x73, 0x49, 0x6d, 0x97, 0x99, 0xb6, 0x36, 0x3b, 0xd6, 0x4b, 0x2a, 0xaf, 0x9c, 0x54, 0x79, 0xaa, 0x58, 0x64, 0x61, 0xba, 0x20, 0x8b, 0x45, 0xe3, 0x01, 0x2c,
0x5c, 0x4c, 0xb6, 0x24, 0x9d, 0x06, 0x01, 0x5f, 0xbb, 0xa0, 0x63, 0xcb, 0xb8, 0x03, 0x0d, 0x1e, 0x88, 0xb9, 0xa4, 0xb6, 0x2b, 0x4c, 0x5b, 0x9b, 0x1d, 0xeb, 0x25, 0x2e, 0x26, 0x5b, 0x92, 0x4e,
0x6f, 0xf2, 0xdc, 0xbd, 0xae, 0xdf, 0x06, 0x9c, 0x16, 0x94, 0x0c, 0x01, 0xb1, 0x84, 0xc2, 0xe9, 0x83, 0x80, 0xaf, 0x5d, 0xd0, 0xb1, 0x65, 0xdc, 0x85, 0x3a, 0x8f, 0x37, 0x79, 0xee, 0xde, 0xd0,
0x6a, 0xf7, 0x7f, 0x9c, 0x39, 0xa2, 0x96, 0xd2, 0xfd, 0x33, 0xc7, 0xd3, 0x6b, 0xa8, 0x72, 0x72, 0x6f, 0x03, 0x4e, 0x0b, 0x4a, 0x86, 0x80, 0x58, 0x42, 0xe1, 0x74, 0xb5, 0xfb, 0x3f, 0xc9, 0x1c,
0x6e, 0xf7, 0x5f, 0x62, 0xc8, 0xd4, 0xf7, 0xfa, 0x91, 0x75, 0xa8, 0x5e, 0x46, 0x19, 0xe1, 0x29, 0x51, 0xcb, 0xe9, 0xfe, 0x99, 0xe3, 0xe9, 0x0d, 0x54, 0x38, 0x39, 0xb7, 0xfb, 0x2f, 0x31, 0x64,
0xb6, 0xf9, 0xc3, 0x2e, 0x63, 0xda, 0x0e, 0x4e, 0x1c, 0x85, 0x12, 0xc6, 0x34, 0x18, 0x6d, 0x5b, 0xea, 0x7b, 0xbd, 0xc8, 0x3a, 0x52, 0x2f, 0xb4, 0x8c, 0xf0, 0x0c, 0xdb, 0xfc, 0x81, 0x99, 0x31,
0x90, 0x18, 0x94, 0x09, 0x9d, 0xdf, 0x89, 0xa3, 0x67, 0xc6, 0xe4, 0xdf, 0x58, 0xbf, 0x11, 0x5d, 0x6d, 0x07, 0x27, 0x8e, 0x42, 0x09, 0x63, 0xea, 0x8c, 0xb6, 0x23, 0x48, 0x0c, 0xca, 0x84, 0xce,
0x5f, 0x69, 0x2e, 0x0c, 0x4d, 0xbe, 0x9c, 0x38, 0xf1, 0xb5, 0xd2, 0x0a, 0x9b, 0x92, 0x8b, 0x66, 0xaf, 0xc5, 0xd1, 0x33, 0x6b, 0xf2, 0x6f, 0xac, 0xdf, 0x88, 0xae, 0xaf, 0x34, 0x17, 0x86, 0x26,
0x26, 0xc2, 0x02, 0xa9, 0x64, 0x37, 0xbd, 0xb5, 0x3e, 0x81, 0xf3, 0xa9, 0xfe, 0xea, 0x1d, 0x22, 0x5f, 0x4e, 0x9c, 0xf8, 0x9a, 0x69, 0x85, 0x4d, 0xc9, 0x45, 0x33, 0x13, 0x61, 0x81, 0x54, 0xb2,
0x35, 0x40, 0x76, 0x76, 0xd9, 0xf9, 0xdf, 0x25, 0x80, 0xcd, 0x71, 0x74, 0x24, 0x41, 0x62, 0x17, 0x9b, 0xde, 0x5a, 0x9f, 0xc2, 0xf9, 0x54, 0x7f, 0xf5, 0x1e, 0x92, 0x1a, 0x20, 0x3b, 0xbb, 0xec,
0x6a, 0x0c, 0xdd, 0x6a, 0x50, 0x53, 0xb5, 0x19, 0xcf, 0xb7, 0xc2, 0x10, 0x11, 0x5a, 0x7c, 0x9a, 0xfc, 0x8f, 0x12, 0xc0, 0xd6, 0x28, 0x3a, 0x96, 0x20, 0xb1, 0x03, 0x55, 0x86, 0x6e, 0x35, 0xa8,
0xab, 0x36, 0x07, 0x78, 0x63, 0xf5, 0xb0, 0xca, 0xbf, 0xd9, 0xc3, 0xac, 0x78, 0x8d, 0xee, 0x23, 0xa9, 0xda, 0x8c, 0xe7, 0x5b, 0x61, 0x88, 0x08, 0x2d, 0x3e, 0xcd, 0x55, 0x9b, 0x03, 0xbc, 0x91,
0xc0, 0x45, 0x68, 0x1f, 0xca, 0x1b, 0x8a, 0xa6, 0xa0, 0x6e, 0x0a, 0x22, 0x13, 0x73, 0x6c, 0x8a, 0x7a, 0xe0, 0xe5, 0xdf, 0xec, 0x81, 0x58, 0xbc, 0x8a, 0xf7, 0x10, 0xe0, 0x22, 0xb4, 0x0f, 0xe5,
0xaa, 0x45, 0x27, 0xfd, 0xc8, 0x7b, 0x4d, 0x5d, 0x79, 0x4e, 0x37, 0x63, 0xea, 0x53, 0x46, 0x64, 0x0d, 0x45, 0x43, 0x50, 0xb7, 0x04, 0x91, 0x89, 0x39, 0x36, 0x45, 0xd5, 0xa2, 0x71, 0x2f, 0xf2,
0x62, 0x01, 0x3d, 0x44, 0x2b, 0x07, 0xb1, 0xd8, 0xac, 0x10, 0x8b, 0xa9, 0x5c, 0x8c, 0x3d, 0xe4, 0xde, 0x50, 0x57, 0x9e, 0xd3, 0x8d, 0x98, 0xfa, 0x8c, 0x11, 0x99, 0x58, 0x40, 0x8f, 0xd0, 0xca,
0xb7, 0xf7, 0xc7, 0xc3, 0xa1, 0x58, 0xe4, 0x59, 0x6d, 0x89, 0xc8, 0x4b, 0xac, 0x23, 0x7b, 0xdf, 0x41, 0x2c, 0x36, 0x27, 0xc4, 0x62, 0x2a, 0x17, 0x63, 0x3f, 0x14, 0xb4, 0x0e, 0x46, 0x83, 0x81,
0x90, 0x98, 0x48, 0x2e, 0xee, 0xfb, 0x17, 0xfd, 0xe7, 0x61, 0x51, 0x53, 0x54, 0xd6, 0xab, 0x18, 0x58, 0xe4, 0x59, 0x6d, 0x89, 0xc8, 0x4b, 0xac, 0x23, 0x7b, 0xdf, 0x90, 0x98, 0x48, 0x2e, 0xee,
0x0b, 0xa2, 0x94, 0x7d, 0x3b, 0xfd, 0x8d, 0x0b, 0x70, 0x3e, 0xd5, 0x5f, 0x0c, 0xbb, 0x76, 0x19, 0xbf, 0x2f, 0xfa, 0xcf, 0xc3, 0x92, 0xa6, 0xa8, 0xac, 0x57, 0x31, 0x16, 0x44, 0x29, 0xfb, 0x6e,
0x6a, 0xf1, 0xa3, 0x3d, 0x99, 0x83, 0xca, 0xd3, 0xad, 0xfd, 0xf6, 0x39, 0xf6, 0xf1, 0x6c, 0x7b, 0xfa, 0x1b, 0x17, 0xe0, 0x7c, 0xaa, 0xbf, 0x18, 0x76, 0xfd, 0x32, 0x54, 0xe3, 0x9f, 0x07, 0xc8,
0xbf, 0x5d, 0x5a, 0x5b, 0x83, 0x85, 0xcc, 0x2d, 0x25, 0xa9, 0x43, 0xd5, 0xdc, 0xd9, 0xdc, 0x7e, 0x3c, 0x94, 0x9f, 0x6d, 0x1f, 0xb4, 0xce, 0xb1, 0x8f, 0xe7, 0x3b, 0x07, 0xad, 0xd2, 0xfa, 0x3a,
0x81, 0x62, 0xf3, 0x50, 0xdb, 0x7b, 0xf2, 0x54, 0xb4, 0x4a, 0x6b, 0x5b, 0xd0, 0x4a, 0x1f, 0x77, 0x2c, 0x66, 0x6e, 0x4b, 0x49, 0x0d, 0x2a, 0xe6, 0xee, 0xd6, 0xce, 0x4b, 0x14, 0x5b, 0x80, 0xea,
0xa4, 0x01, 0x73, 0x5b, 0xc8, 0x7d, 0xba, 0xb3, 0x8d, 0xc2, 0xd8, 0x30, 0x9f, 0xed, 0xed, 0xed, 0xfe, 0xd3, 0x67, 0xa2, 0x55, 0x5a, 0xdf, 0x86, 0x66, 0xfa, 0xb8, 0x23, 0x75, 0x98, 0xdf, 0x46,
0xee, 0x3d, 0x68, 0x97, 0x08, 0xc0, 0xec, 0xce, 0xd7, 0xbb, 0x8c, 0x51, 0x66, 0x8c, 0x67, 0x7b, 0xee, 0xb3, 0xdd, 0x1d, 0x14, 0xc6, 0x86, 0xf9, 0x7c, 0x7f, 0x7f, 0x6f, 0xff, 0x61, 0xab, 0x44,
0x0f, 0xf7, 0x9e, 0xfc, 0x66, 0xaf, 0x5d, 0xd9, 0xf8, 0x67, 0x0d, 0x5a, 0xa6, 0x58, 0x42, 0x0f, 0x00, 0xe6, 0x76, 0xbf, 0xdd, 0x63, 0x8c, 0x19, 0xc6, 0x78, 0xbe, 0xff, 0x68, 0xff, 0xe9, 0x2f,
0x63, 0xc1, 0x41, 0xe4, 0x79, 0x1f, 0xe6, 0xe2, 0x3f, 0x22, 0x92, 0x83, 0x35, 0xfd, 0xfb, 0x46, 0xf7, 0x5b, 0xe5, 0xcd, 0xbf, 0x55, 0xa1, 0x69, 0x8a, 0x25, 0x74, 0x31, 0x16, 0x1c, 0x44, 0x9e,
0xb7, 0x93, 0x67, 0x48, 0xb3, 0x9d, 0x23, 0xfb, 0xd0, 0x4c, 0x3d, 0xc7, 0x91, 0x04, 0xa9, 0x16, 0x0f, 0x60, 0x3e, 0xfe, 0x33, 0x23, 0x39, 0x58, 0xd3, 0xbf, 0x91, 0x74, 0xda, 0x79, 0x86, 0x34,
0xbd, 0xf8, 0x75, 0xaf, 0x4c, 0x62, 0xab, 0x11, 0x7b, 0xd0, 0x4a, 0x3f, 0xb1, 0x91, 0xa4, 0x4f, 0xdb, 0x39, 0x72, 0x00, 0x8d, 0xd4, 0xb3, 0x20, 0x49, 0x90, 0x6a, 0xd1, 0xcb, 0x63, 0xe7, 0xca,
0xe1, 0xd3, 0x5d, 0xf7, 0xea, 0x44, 0xbe, 0x1a, 0xf4, 0x05, 0xb4, 0xb3, 0x8f, 0x6b, 0x24, 0xb9, 0x24, 0xb6, 0x1a, 0xb1, 0x0b, 0xcd, 0xf4, 0x53, 0x1f, 0x49, 0xfa, 0x14, 0x3e, 0x21, 0x76, 0xae,
0x18, 0x9b, 0xf0, 0x70, 0xd7, 0xbd, 0x76, 0x8a, 0x84, 0x3e, 0x74, 0xee, 0x19, 0x6a, 0x75, 0xf2, 0x4e, 0xe4, 0xab, 0x41, 0x5f, 0x42, 0x2b, 0xfb, 0xc8, 0x47, 0x92, 0x8b, 0xb1, 0x09, 0x0f, 0x88,
0x43, 0x42, 0x6e, 0xe8, 0x49, 0xaf, 0x13, 0xc2, 0x14, 0xe9, 0x9b, 0x61, 0xa2, 0x3f, 0xfe, 0x14, 0x9d, 0x6b, 0xa7, 0x48, 0xe8, 0x43, 0xe7, 0x9e, 0xc3, 0xd6, 0x26, 0x3f, 0x68, 0xe4, 0x86, 0x9e,
0xdc, 0xcc, 0x6b, 0xa6, 0x28, 0xbe, 0x52, 0xc6, 0x41, 0x9f, 0x63, 0xa5, 0x96, 0x06, 0xbd, 0x24, 0xf4, 0x4a, 0x22, 0x4c, 0x91, 0xbe, 0x19, 0x26, 0xfa, 0x23, 0x54, 0xc1, 0x0b, 0x81, 0x66, 0x8a,
0xe9, 0x55, 0x0c, 0xe1, 0xbb, 0xab, 0x93, 0x05, 0xd2, 0x7e, 0xd3, 0x21, 0x6d, 0xca, 0x6f, 0x05, 0xe2, 0x2b, 0x65, 0x1c, 0xf4, 0x05, 0x56, 0x6a, 0x69, 0xd0, 0x4b, 0x92, 0x5e, 0xc5, 0x10, 0xbe,
0x38, 0x39, 0xe5, 0xb7, 0x42, 0x2c, 0xcc, 0xc3, 0x2b, 0x05, 0x5c, 0xb5, 0xf0, 0x2a, 0x42, 0xc9, 0xb3, 0x36, 0x59, 0x20, 0xed, 0x37, 0x1d, 0xd2, 0xa6, 0xfc, 0x56, 0x80, 0x93, 0x53, 0x7e, 0x2b,
0xdd, 0x2b, 0x93, 0xd8, 0xfa, 0xf2, 0x33, 0xa0, 0x55, 0x5b, 0x7e, 0x31, 0x16, 0xee, 0xae, 0x4e, 0xc4, 0xc2, 0x3c, 0xbc, 0x52, 0xc0, 0x55, 0x0b, 0xaf, 0x22, 0x94, 0xdc, 0xb9, 0x32, 0x89, 0xad,
0x16, 0xc8, 0xfa, 0x2a, 0x29, 0xc6, 0x33, 0xbe, 0xca, 0x61, 0xbf, 0x8c, 0xaf, 0xf2, 0x55, 0xbc, 0x2f, 0x3f, 0x03, 0x5a, 0xb5, 0xe5, 0x17, 0x63, 0xe1, 0xce, 0xda, 0x64, 0x81, 0xac, 0xaf, 0x92,
0xf4, 0x55, 0xa6, 0xaa, 0xbe, 0x3a, 0xb1, 0x54, 0xc9, 0xfb, 0xaa, 0xb8, 0xfa, 0xc1, 0x71, 0xef, 0x62, 0x3c, 0xe3, 0xab, 0x1c, 0xf6, 0xcb, 0xf8, 0x2a, 0x5f, 0xc5, 0x4b, 0x5f, 0x65, 0xaa, 0xea,
0xc2, 0x0c, 0xab, 0x30, 0x48, 0x72, 0x96, 0x6b, 0xc5, 0x4d, 0xf7, 0x42, 0x86, 0x1a, 0x77, 0xbb, 0xab, 0x13, 0x4b, 0x95, 0xbc, 0xaf, 0x8a, 0xab, 0x1f, 0x1c, 0xf7, 0x1e, 0xcc, 0xb2, 0x0a, 0x83,
0x5e, 0xba, 0x55, 0xda, 0xf8, 0x7b, 0x19, 0xe6, 0x45, 0xfa, 0x93, 0x19, 0xe4, 0x01, 0x40, 0x72, 0x24, 0x67, 0xb9, 0x56, 0xdc, 0x74, 0x2e, 0x64, 0xa8, 0x71, 0xb7, 0x1b, 0xa5, 0xdb, 0xa5, 0xcd,
0x08, 0x93, 0x6e, 0x6a, 0x51, 0xa9, 0x4a, 0xa2, 0x7b, 0xa9, 0x90, 0xa7, 0x94, 0xfa, 0x4a, 0x96, 0xbf, 0xcc, 0xc0, 0x82, 0x48, 0x7f, 0x32, 0x83, 0x3c, 0x04, 0x48, 0x0e, 0x61, 0xd2, 0x49, 0x2d,
0x2d, 0x72, 0xa1, 0x97, 0x32, 0xd9, 0x36, 0xb5, 0xc8, 0xcb, 0xc5, 0x4c, 0x35, 0xd6, 0x36, 0xd4, 0x2a, 0x55, 0x49, 0x74, 0x2e, 0x15, 0xf2, 0x94, 0x52, 0xdf, 0xc8, 0xb2, 0x45, 0x2e, 0xf4, 0x52,
0x55, 0x92, 0x27, 0xda, 0xd9, 0x90, 0x39, 0xa1, 0xba, 0xdd, 0x22, 0x96, 0xae, 0x91, 0x96, 0xd5, 0x26, 0xdb, 0xa6, 0x16, 0x79, 0xb9, 0x98, 0xa9, 0xc6, 0xda, 0x81, 0x9a, 0x4a, 0xf2, 0x44, 0x3b,
0x35, 0x8d, 0xf2, 0x67, 0x85, 0xa6, 0x51, 0xc1, 0x41, 0x60, 0x9c, 0xfb, 0x7f, 0x00, 0x00, 0x00, 0x1b, 0x32, 0x27, 0x54, 0xa7, 0x53, 0xc4, 0xd2, 0x35, 0xd2, 0xb2, 0xba, 0xa6, 0x51, 0xfe, 0xac,
0xff, 0xff, 0x22, 0x65, 0x58, 0x85, 0x2a, 0x27, 0x00, 0x00, 0xd0, 0x34, 0x2a, 0x38, 0x08, 0x8c, 0x73, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xca, 0x77, 0xdb,
0x74, 0xb2, 0x27, 0x00, 0x00,
} }

View File

@ -301,6 +301,9 @@ message PodSandbox {
optional int64 created_at = 4; optional int64 created_at = 4;
// The labels of the PodSandbox // The labels of the PodSandbox
map<string, string> labels = 5; map<string, string> labels = 5;
// Annotations is an unstructured key value map that may be set by external
// tools to store and retrieve arbitrary metadata.
map<string, string> annotations = 6;
} }
message ListPodSandboxResponse { message ListPodSandboxResponse {

View File

@ -55,14 +55,15 @@ func toRuntimeAPIContainer(c *dockertypes.Container) (*runtimeApi.Container, err
if err != nil { if err != nil {
return nil, err return nil, err
} }
labels, annotations := extractLabels(c.Labels)
return &runtimeApi.Container{ return &runtimeApi.Container{
Id: &c.ID, Id: &c.ID,
Metadata: metadata, Metadata: metadata,
Image: &runtimeApi.ImageSpec{Image: &c.Image}, Image: &runtimeApi.ImageSpec{Image: &c.Image},
ImageRef: &c.ImageID, ImageRef: &c.ImageID,
State: &state, State: &state,
// TODO: Extract annotations from labels. Labels: labels,
Labels: c.Labels, Annotations: annotations,
}, nil }, nil
} }
@ -113,11 +114,13 @@ func toRuntimeAPISandbox(c *dockertypes.Container) (*runtimeApi.PodSandbox, erro
if err != nil { if err != nil {
return nil, err return nil, err
} }
labels, annotations := extractLabels(c.Labels)
return &runtimeApi.PodSandbox{ return &runtimeApi.PodSandbox{
Id: &c.ID, Id: &c.ID,
Metadata: metadata, Metadata: metadata,
State: &state, State: &state,
CreatedAt: &c.Created, CreatedAt: &c.Created,
Labels: c.Labels, // TODO: Need to disthinguish annotaions and labels. Labels: labels,
Annotations: annotations,
}, nil }, nil
} }

View File

@ -37,6 +37,8 @@ func (ds *dockerService) ListContainers(filter *runtimeApi.ContainerFilter) ([]*
opts.Filter = dockerfilters.NewArgs() opts.Filter = dockerfilters.NewArgs()
f := newDockerFilter(&opts.Filter) f := newDockerFilter(&opts.Filter)
// Add filter to get *only* (non-sandbox) containers.
f.AddLabel(containerTypeLabelKey, containerTypeLabelContainer)
if filter != nil { if filter != nil {
if filter.Id != nil { if filter.Id != nil {
@ -46,7 +48,7 @@ func (ds *dockerService) ListContainers(filter *runtimeApi.ContainerFilter) ([]*
f.Add("status", toDockerContainerStatus(filter.GetState())) f.Add("status", toDockerContainerStatus(filter.GetState()))
} }
if filter.PodSandboxId != nil { if filter.PodSandboxId != nil {
// TODO: implement this after sandbox functions are implemented. f.AddLabel(sandboxIDLabelKey, *filter.PodSandboxId)
} }
if filter.LabelSelector != nil { if filter.LabelSelector != nil {
@ -54,8 +56,6 @@ func (ds *dockerService) ListContainers(filter *runtimeApi.ContainerFilter) ([]*
f.AddLabel(k, v) f.AddLabel(k, v)
} }
} }
// Filter out sandbox containers.
f.AddLabel(containerTypeLabelKey, containerTypeLabelContainer)
} }
containers, err := ds.client.ListContainers(opts) containers, err := ds.client.ListContainers(opts)
if err != nil { if err != nil {
@ -88,12 +88,11 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeApi
return "", fmt.Errorf("sandbox config is nil for container %q", config.Metadata.GetName()) return "", fmt.Errorf("sandbox config is nil for container %q", config.Metadata.GetName())
} }
// Merge annotations and labels because docker supports only labels.
// TODO: add a prefix to annotations so that we can distinguish labels and
// annotations when reading back them from the docker container.
labels := makeLabels(config.GetLabels(), config.GetAnnotations()) labels := makeLabels(config.GetLabels(), config.GetAnnotations())
// Apply a the container type label. // Apply a the container type label.
labels[containerTypeLabelKey] = containerTypeLabelContainer labels[containerTypeLabelKey] = containerTypeLabelContainer
// Write the sandbox ID in the labels.
labels[sandboxIDLabelKey] = podSandboxID
image := "" image := ""
if iSpec := config.GetImage(); iSpec != nil { if iSpec := config.GetImage(); iSpec != nil {
@ -284,6 +283,7 @@ func (ds *dockerService) ContainerStatus(containerID string) (*runtimeApi.Contai
return nil, err return nil, err
} }
labels, annotations := extractLabels(r.Config.Labels)
return &runtimeApi.ContainerStatus{ return &runtimeApi.ContainerStatus{
Id: &r.ID, Id: &r.ID,
Metadata: metadata, Metadata: metadata,
@ -296,9 +296,8 @@ func (ds *dockerService) ContainerStatus(containerID string) (*runtimeApi.Contai
StartedAt: &st, StartedAt: &st,
FinishedAt: &ft, FinishedAt: &ft,
Reason: &reason, Reason: &reason,
// TODO: We write annotations as labels on the docker containers. All Labels: labels,
// these annotations will be read back as labels. Need to fix this. Annotations: annotations,
Labels: r.Config.Labels,
}, nil }, nil
} }

View File

@ -27,13 +27,15 @@ import (
) )
// A helper to create a basic config. // A helper to create a basic config.
func makeContainerConfig(sConfig *runtimeApi.PodSandboxConfig, name, image string, attempt uint32) *runtimeApi.ContainerConfig { func makeContainerConfig(sConfig *runtimeApi.PodSandboxConfig, name, image string, attempt uint32, labels, annotations map[string]string) *runtimeApi.ContainerConfig {
return &runtimeApi.ContainerConfig{ return &runtimeApi.ContainerConfig{
Metadata: &runtimeApi.ContainerMetadata{ Metadata: &runtimeApi.ContainerMetadata{
Name: &name, Name: &name,
Attempt: &attempt, Attempt: &attempt,
}, },
Image: &runtimeApi.ImageSpec{Image: &image}, Image: &runtimeApi.ImageSpec{Image: &image},
Labels: labels,
Annotations: annotations,
} }
} }
@ -49,8 +51,10 @@ func TestListContainers(t *testing.T) {
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
s := makeSandboxConfig(fmt.Sprintf("%s%d", podName, i), s := makeSandboxConfig(fmt.Sprintf("%s%d", podName, i),
fmt.Sprintf("%s%d", namespace, i), fmt.Sprintf("%d", i), 0) fmt.Sprintf("%s%d", namespace, i), fmt.Sprintf("%d", i), 0)
labels := map[string]string{"abc.xyz": fmt.Sprintf("label%d", i)}
annotations := map[string]string{"foo.bar.baz": fmt.Sprintf("annotaion%d", i)}
c := makeContainerConfig(s, fmt.Sprintf("%s%d", containerName, i), c := makeContainerConfig(s, fmt.Sprintf("%s%d", containerName, i),
fmt.Sprintf("%s:v%d", image, i), uint32(i)) fmt.Sprintf("%s:v%d", image, i), uint32(i), labels, annotations)
sConfigs = append(sConfigs, s) sConfigs = append(sConfigs, s)
configs = append(configs, c) configs = append(configs, c)
} }
@ -74,7 +78,8 @@ func TestListContainers(t *testing.T) {
State: &state, State: &state,
Image: configs[i].Image, Image: configs[i].Image,
ImageRef: &imageRef, ImageRef: &imageRef,
Labels: map[string]string{containerTypeLabelKey: containerTypeLabelContainer}, Labels: configs[i].Labels,
Annotations: configs[i].Annotations,
}}, expected...) }}, expected...)
} }
containers, err := ds.ListContainers(nil) containers, err := ds.ListContainers(nil)
@ -88,7 +93,9 @@ func TestListContainers(t *testing.T) {
func TestContainerStatus(t *testing.T) { func TestContainerStatus(t *testing.T) {
ds, _, fClock := newTestDockerSevice() ds, _, fClock := newTestDockerSevice()
sConfig := makeSandboxConfig("foo", "bar", "1", 0) sConfig := makeSandboxConfig("foo", "bar", "1", 0)
config := makeContainerConfig(sConfig, "pause", "iamimage", 0) labels := map[string]string{"abc.xyz": "foo"}
annotations := map[string]string{"foo.bar.baz": "abc"}
config := makeContainerConfig(sConfig, "pause", "iamimage", 0, labels, annotations)
var defaultTime time.Time var defaultTime time.Time
dt := defaultTime.Unix() dt := defaultTime.Unix()
@ -110,7 +117,8 @@ func TestContainerStatus(t *testing.T) {
ExitCode: &exitCode, ExitCode: &exitCode,
Reason: &reason, Reason: &reason,
Mounts: []*runtimeApi.Mount{}, Mounts: []*runtimeApi.Mount{},
Labels: map[string]string{containerTypeLabelKey: containerTypeLabelContainer}, Labels: config.Labels,
Annotations: config.Annotations,
} }
// Create the container. // Create the container.

View File

@ -123,15 +123,14 @@ func (ds *dockerService) PodSandboxStatus(podSandboxID string) (*runtimeApi.PodS
return nil, err return nil, err
} }
labels, annotations := extractLabels(r.Config.Labels)
return &runtimeApi.PodSandboxStatus{ return &runtimeApi.PodSandboxStatus{
Id: &r.ID, Id: &r.ID,
State: &state, State: &state,
CreatedAt: &ct, CreatedAt: &ct,
Metadata: metadata, Metadata: metadata,
// TODO: We write annotations as labels on the docker containers. All Labels: labels,
// these annotations will be read back as labels. Need to fix this. Annotations: annotations,
// Also filter out labels only relevant to this shim.
Labels: r.Config.Labels,
Network: network, Network: network,
Linux: &runtimeApi.LinuxPodSandboxStatus{Namespaces: &runtimeApi.Namespace{Network: &netNS}}, Linux: &runtimeApi.LinuxPodSandboxStatus{Namespaces: &runtimeApi.Namespace{Network: &netNS}},
}, nil }, nil
@ -145,6 +144,9 @@ func (ds *dockerService) ListPodSandbox(filter *runtimeApi.PodSandboxFilter) ([]
opts.Filter = dockerfilters.NewArgs() opts.Filter = dockerfilters.NewArgs()
f := newDockerFilter(&opts.Filter) f := newDockerFilter(&opts.Filter)
// Add filter to select only sandbox containers.
f.AddLabel(containerTypeLabelKey, containerTypeLabelSandbox)
if filter != nil { if filter != nil {
if filter.Id != nil { if filter.Id != nil {
f.Add("id", filter.GetId()) f.Add("id", filter.GetId())
@ -168,8 +170,6 @@ func (ds *dockerService) ListPodSandbox(filter *runtimeApi.PodSandboxFilter) ([]
f.AddLabel(k, v) f.AddLabel(k, v)
} }
} }
// Filter out sandbox containers.
f.AddLabel(containerTypeLabelKey, containerTypeLabelSandbox)
} }
containers, err := ds.client.ListContainers(opts) containers, err := ds.client.ListContainers(opts)
if err != nil { if err != nil {

View File

@ -29,6 +29,10 @@ import (
// A helper to create a basic config. // A helper to create a basic config.
func makeSandboxConfig(name, namespace, uid string, attempt uint32) *runtimeApi.PodSandboxConfig { func makeSandboxConfig(name, namespace, uid string, attempt uint32) *runtimeApi.PodSandboxConfig {
return makeSandboxConfigWithLabelsAndAnnotations(name, namespace, uid, attempt, map[string]string{}, map[string]string{})
}
func makeSandboxConfigWithLabelsAndAnnotations(name, namespace, uid string, attempt uint32, labels, annotations map[string]string) *runtimeApi.PodSandboxConfig {
return &runtimeApi.PodSandboxConfig{ return &runtimeApi.PodSandboxConfig{
Metadata: &runtimeApi.PodSandboxMetadata{ Metadata: &runtimeApi.PodSandboxMetadata{
Name: &name, Name: &name,
@ -36,6 +40,8 @@ func makeSandboxConfig(name, namespace, uid string, attempt uint32) *runtimeApi.
Uid: &uid, Uid: &uid,
Attempt: &attempt, Attempt: &attempt,
}, },
Labels: labels,
Annotations: annotations,
} }
} }
@ -46,8 +52,11 @@ func TestListSandboxes(t *testing.T) {
name, namespace := "foo", "bar" name, namespace := "foo", "bar"
configs := []*runtimeApi.PodSandboxConfig{} configs := []*runtimeApi.PodSandboxConfig{}
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
c := makeSandboxConfig(fmt.Sprintf("%s%d", name, i), c := makeSandboxConfigWithLabelsAndAnnotations(fmt.Sprintf("%s%d", name, i),
fmt.Sprintf("%s%d", namespace, i), fmt.Sprintf("%d", i), 0) fmt.Sprintf("%s%d", namespace, i), fmt.Sprintf("%d", i), 0,
map[string]string{"label": fmt.Sprintf("foo%d", i)},
map[string]string{"annotation": fmt.Sprintf("bar%d", i)},
)
configs = append(configs, c) configs = append(configs, c)
} }
@ -63,8 +72,9 @@ func TestListSandboxes(t *testing.T) {
Metadata: configs[i].Metadata, Metadata: configs[i].Metadata,
Id: &id, Id: &id,
State: &state, State: &state,
Labels: map[string]string{containerTypeLabelKey: containerTypeLabelSandbox},
CreatedAt: &createdAt, CreatedAt: &createdAt,
Labels: configs[i].Labels,
Annotations: configs[i].Annotations,
}}, expected...) }}, expected...)
} }
sandboxes, err := ds.ListPodSandbox(nil) sandboxes, err := ds.ListPodSandbox(nil)
@ -77,7 +87,9 @@ func TestListSandboxes(t *testing.T) {
// the status returned reflects the operations performed. // the status returned reflects the operations performed.
func TestSandboxStatus(t *testing.T) { func TestSandboxStatus(t *testing.T) {
ds, _, fClock := newTestDockerSevice() ds, _, fClock := newTestDockerSevice()
config := makeSandboxConfig("foo", "bar", "1", 0) labels := map[string]string{"label": "foobar1"}
annotations := map[string]string{"annotation": "abc"}
config := makeSandboxConfigWithLabelsAndAnnotations("foo", "bar", "1", 0, labels, annotations)
// TODO: The following variables depend on the internal // TODO: The following variables depend on the internal
// implementation of FakeDockerClient, and should be fixed. // implementation of FakeDockerClient, and should be fixed.
@ -90,9 +102,10 @@ func TestSandboxStatus(t *testing.T) {
State: &state, State: &state,
CreatedAt: &ct, CreatedAt: &ct,
Metadata: config.Metadata, Metadata: config.Metadata,
Labels: map[string]string{containerTypeLabelKey: containerTypeLabelSandbox},
Network: &runtimeApi.PodSandboxNetworkStatus{Ip: &fakeIP}, Network: &runtimeApi.PodSandboxNetworkStatus{Ip: &fakeIP},
Linux: &runtimeApi.LinuxPodSandboxStatus{Namespaces: &runtimeApi.Namespace{Network: &fakeNS}}, Linux: &runtimeApi.LinuxPodSandboxStatus{Namespaces: &runtimeApi.Namespace{Network: &fakeNS}},
Labels: labels,
Annotations: annotations,
} }
// Create the sandbox. // Create the sandbox.

View File

@ -47,8 +47,11 @@ const (
containerTypeLabelKey = "io.kubernetes.docker.type" containerTypeLabelKey = "io.kubernetes.docker.type"
containerTypeLabelSandbox = "podsandbox" containerTypeLabelSandbox = "podsandbox"
containerTypeLabelContainer = "container" containerTypeLabelContainer = "container"
sandboxIDLabelKey = "io.kubernetes.sandbox.id"
) )
var internalLabelKeys []string = []string{containerTypeLabelKey, sandboxIDLabelKey}
func NewDockerService(client dockertools.DockerInterface) DockerLegacyService { func NewDockerService(client dockertools.DockerInterface) DockerLegacyService {
return &dockerService{ return &dockerService{
client: dockertools.NewInstrumentedDockerInterface(client), client: dockertools.NewInstrumentedDockerInterface(client),

View File

@ -30,6 +30,10 @@ import (
runtimeApi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime" runtimeApi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
) )
const (
annotationPrefix = "annotation."
)
// apiVersion implements kubecontainer.Version interface by implementing // apiVersion implements kubecontainer.Version interface by implementing
// Compare() and String(). It uses the compare function of engine-api to // Compare() and String(). It uses the compare function of engine-api to
// compare docker apiversions. // compare docker apiversions.
@ -57,23 +61,52 @@ func generateEnvList(envs []*runtimeApi.KeyValue) (result []string) {
return return
} }
// Merge annotations and labels because docker supports only labels. // makeLabels converts annotations to labels and merge them with the given
// TODO: Need to be able to distinguish annotations from labels; otherwise, we // labels. This is necessary because docker does not support annotations;
// couldn't restore the information when reading the labels back from docker. // we *fake* annotations using labels. Note that docker labels are not
// updatable.
func makeLabels(labels, annotations map[string]string) map[string]string { func makeLabels(labels, annotations map[string]string) map[string]string {
merged := make(map[string]string) merged := make(map[string]string)
for k, v := range labels { for k, v := range labels {
merged[k] = v merged[k] = v
} }
for k, v := range annotations { for k, v := range annotations {
if _, ok := merged[k]; !ok { // Assume there won't be conflict.
// Don't overwrite the key if it already exists. merged[fmt.Sprintf("%s%s", annotationPrefix, k)] = v
merged[k] = v
}
} }
return merged return merged
} }
// extractLabels converts raw docker labels to the CRI labels and annotations.
// It also filters out internal labels used by this shim.
func extractLabels(input map[string]string) (map[string]string, map[string]string) {
labels := make(map[string]string)
annotations := make(map[string]string)
for k, v := range input {
// Check if the key is used internally by the shim.
internal := false
for _, internalKey := range internalLabelKeys {
// TODO: containerTypeLabelKey is the only internal label the shim uses
// right now. Expand this to a list later.
if k == internalKey {
internal = true
break
}
}
if internal {
continue
}
// Check if the label should be treated as an annotation.
if strings.HasPrefix(k, annotationPrefix) {
annotations[strings.TrimPrefix(k, annotationPrefix)] = v
continue
}
labels[k] = v
}
return labels, annotations
}
// generateMountBindings converts the mount list to a list of strings that // generateMountBindings converts the mount list to a list of strings that
// can be understood by docker. // can be understood by docker.
// Each element in the string is in the form of: // Each element in the string is in the form of:

View File

@ -0,0 +1,34 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package dockershim
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestLabelsAndAnnotationsRoundTrip(t *testing.T) {
expectedLabels := map[string]string{"foo.123.abc": "baz", "bar.456.xyz": "qwe"}
expectedAnnotations := map[string]string{"uio.ert": "dfs", "jkl": "asd"}
// Merge labels and annotations into docker labels.
dockerLabels := makeLabels(expectedLabels, expectedAnnotations)
// Extract labels and annotations from docker labels.
actualLabels, actualAnnotations := extractLabels(dockerLabels)
assert.Equal(t, expectedLabels, actualLabels)
assert.Equal(t, expectedAnnotations, actualAnnotations)
}