github.com/coreos/mantle@v0.13.0/update/metadata/update_metadata.pb.go (about) 1 // Code generated by protoc-gen-go. 2 // source: update_metadata.proto 3 // DO NOT EDIT! 4 5 /* 6 Package metadata is a generated protocol buffer package. 7 8 It is generated from these files: 9 update_metadata.proto 10 11 It has these top-level messages: 12 InstallOperation 13 Extent 14 Signatures 15 InstallInfo 16 InstallProcedure 17 DeltaArchiveManifest 18 */ 19 package metadata 20 21 import proto "github.com/golang/protobuf/proto" 22 import fmt "fmt" 23 import math "math" 24 25 // Reference imports to suppress errors if they are not otherwise used. 26 var _ = proto.Marshal 27 var _ = fmt.Errorf 28 var _ = math.Inf 29 30 // This is a compile-time assertion to ensure that this generated file 31 // is compatible with the proto package it is being compiled against. 32 const _ = proto.ProtoPackageIsVersion1 33 34 type InstallOperation_Type int32 35 36 const ( 37 InstallOperation_REPLACE InstallOperation_Type = 0 38 InstallOperation_REPLACE_BZ InstallOperation_Type = 1 39 InstallOperation_MOVE InstallOperation_Type = 2 40 InstallOperation_BSDIFF InstallOperation_Type = 3 41 ) 42 43 var InstallOperation_Type_name = map[int32]string{ 44 0: "REPLACE", 45 1: "REPLACE_BZ", 46 2: "MOVE", 47 3: "BSDIFF", 48 } 49 var InstallOperation_Type_value = map[string]int32{ 50 "REPLACE": 0, 51 "REPLACE_BZ": 1, 52 "MOVE": 2, 53 "BSDIFF": 3, 54 } 55 56 func (x InstallOperation_Type) Enum() *InstallOperation_Type { 57 p := new(InstallOperation_Type) 58 *p = x 59 return p 60 } 61 func (x InstallOperation_Type) String() string { 62 return proto.EnumName(InstallOperation_Type_name, int32(x)) 63 } 64 func (x *InstallOperation_Type) UnmarshalJSON(data []byte) error { 65 value, err := proto.UnmarshalJSONEnum(InstallOperation_Type_value, data, "InstallOperation_Type") 66 if err != nil { 67 return err 68 } 69 *x = InstallOperation_Type(value) 70 return nil 71 } 72 func (InstallOperation_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} } 73 74 type InstallProcedure_Type int32 75 76 const ( 77 InstallProcedure_KERNEL InstallProcedure_Type = 0 78 ) 79 80 var InstallProcedure_Type_name = map[int32]string{ 81 0: "KERNEL", 82 } 83 var InstallProcedure_Type_value = map[string]int32{ 84 "KERNEL": 0, 85 } 86 87 func (x InstallProcedure_Type) Enum() *InstallProcedure_Type { 88 p := new(InstallProcedure_Type) 89 *p = x 90 return p 91 } 92 func (x InstallProcedure_Type) String() string { 93 return proto.EnumName(InstallProcedure_Type_name, int32(x)) 94 } 95 func (x *InstallProcedure_Type) UnmarshalJSON(data []byte) error { 96 value, err := proto.UnmarshalJSONEnum(InstallProcedure_Type_value, data, "InstallProcedure_Type") 97 if err != nil { 98 return err 99 } 100 *x = InstallProcedure_Type(value) 101 return nil 102 } 103 func (InstallProcedure_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4, 0} } 104 105 // The client will perform each InstallOperation in order, beginning even 106 // before the entire delta file is downloaded (but after at least the 107 // protobuf is downloaded). The types of operations are explained: 108 // - REPLACE: Replace the dst_extents on the drive with the attached data, 109 // zero padding out to block size. 110 // - REPLACE_BZ: bzip2-uncompress the attached data and write it into 111 // dst_extents on the drive, zero padding to block size. 112 // - MOVE: Copy the data in src_extents to dst_extents. Extents may overlap, 113 // so it may be desirable to read all src_extents data into memory before 114 // writing it out. 115 // - BSDIFF: Read src_length bytes from src_extents into memory, perform 116 // bspatch with attached data, write new data to dst_extents, zero padding 117 // to block size. 118 type InstallOperation struct { 119 Type *InstallOperation_Type `protobuf:"varint,1,req,name=type,enum=chromeos_update_engine.InstallOperation_Type" json:"type,omitempty"` 120 // The offset into the delta file (after the protobuf) 121 // where the data (if any) is stored 122 DataOffset *uint32 `protobuf:"varint,2,opt,name=data_offset" json:"data_offset,omitempty"` 123 // The length of the data in the delta file 124 DataLength *uint32 `protobuf:"varint,3,opt,name=data_length" json:"data_length,omitempty"` 125 // Ordered list of extents that are read from (if any) and written to. 126 SrcExtents []*Extent `protobuf:"bytes,4,rep,name=src_extents" json:"src_extents,omitempty"` 127 // Byte length of src, not necessarily block aligned. It's only used for 128 // BSDIFF, because we need to pass that external program the number 129 // of bytes to read from the blocks we pass it. 130 SrcLength *uint64 `protobuf:"varint,5,opt,name=src_length" json:"src_length,omitempty"` 131 DstExtents []*Extent `protobuf:"bytes,6,rep,name=dst_extents" json:"dst_extents,omitempty"` 132 // byte length of dst, not necessarily block aligned. It's only used for 133 // BSDIFF, because we need to fill in the rest of the last block 134 // that bsdiff writes with '\0' bytes. 135 DstLength *uint64 `protobuf:"varint,7,opt,name=dst_length" json:"dst_length,omitempty"` 136 // Optional SHA 256 hash of the blob associated with this operation. 137 // This is used as a primary validation for http-based downloads and 138 // as a defense-in-depth validation for https-based downloads. If 139 // the operation doesn't refer to any blob, this field will have 140 // zero bytes. 141 DataSha256Hash []byte `protobuf:"bytes,8,opt,name=data_sha256_hash" json:"data_sha256_hash,omitempty"` 142 XXX_unrecognized []byte `json:"-"` 143 } 144 145 func (m *InstallOperation) Reset() { *m = InstallOperation{} } 146 func (m *InstallOperation) String() string { return proto.CompactTextString(m) } 147 func (*InstallOperation) ProtoMessage() {} 148 func (*InstallOperation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } 149 150 func (m *InstallOperation) GetType() InstallOperation_Type { 151 if m != nil && m.Type != nil { 152 return *m.Type 153 } 154 return InstallOperation_REPLACE 155 } 156 157 func (m *InstallOperation) GetDataOffset() uint32 { 158 if m != nil && m.DataOffset != nil { 159 return *m.DataOffset 160 } 161 return 0 162 } 163 164 func (m *InstallOperation) GetDataLength() uint32 { 165 if m != nil && m.DataLength != nil { 166 return *m.DataLength 167 } 168 return 0 169 } 170 171 func (m *InstallOperation) GetSrcExtents() []*Extent { 172 if m != nil { 173 return m.SrcExtents 174 } 175 return nil 176 } 177 178 func (m *InstallOperation) GetSrcLength() uint64 { 179 if m != nil && m.SrcLength != nil { 180 return *m.SrcLength 181 } 182 return 0 183 } 184 185 func (m *InstallOperation) GetDstExtents() []*Extent { 186 if m != nil { 187 return m.DstExtents 188 } 189 return nil 190 } 191 192 func (m *InstallOperation) GetDstLength() uint64 { 193 if m != nil && m.DstLength != nil { 194 return *m.DstLength 195 } 196 return 0 197 } 198 199 func (m *InstallOperation) GetDataSha256Hash() []byte { 200 if m != nil { 201 return m.DataSha256Hash 202 } 203 return nil 204 } 205 206 // Data is packed into blocks on disk, always starting from the beginning 207 // of the block. If a file's data is too large for one block, it overflows 208 // into another block, which may or may not be the following block on the 209 // physical partition. An ordered list of extents is another 210 // representation of an ordered list of blocks. For example, a file stored 211 // in blocks 9, 10, 11, 2, 18, 12 (in that order) would be stored in 212 // extents { {9, 3}, {2, 1}, {18, 1}, {12, 1} } (in that order). 213 // In general, files are stored sequentially on disk, so it's more efficient 214 // to use extents to encode the block lists (this is effectively 215 // run-length encoding). 216 // A sentinel value (UINT64_MAX) as the start block denotes a sparse-hole 217 // in a file whose block-length is specified by num_blocks. 218 type Extent struct { 219 StartBlock *uint64 `protobuf:"varint,1,opt,name=start_block" json:"start_block,omitempty"` 220 NumBlocks *uint64 `protobuf:"varint,2,opt,name=num_blocks" json:"num_blocks,omitempty"` 221 XXX_unrecognized []byte `json:"-"` 222 } 223 224 func (m *Extent) Reset() { *m = Extent{} } 225 func (m *Extent) String() string { return proto.CompactTextString(m) } 226 func (*Extent) ProtoMessage() {} 227 func (*Extent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } 228 229 func (m *Extent) GetStartBlock() uint64 { 230 if m != nil && m.StartBlock != nil { 231 return *m.StartBlock 232 } 233 return 0 234 } 235 236 func (m *Extent) GetNumBlocks() uint64 { 237 if m != nil && m.NumBlocks != nil { 238 return *m.NumBlocks 239 } 240 return 0 241 } 242 243 // Signatures: Updates may be signed by the OS vendor. The client verifies 244 // an update's signature by hashing the entire download. The section of the 245 // download that contains the signature is at the end of the file, so when 246 // signing a file, only the part up to the signature part is signed. 247 // Then, the client looks inside the download's Signatures message for a 248 // Signature message that it knows how to handle. Generally, a client will 249 // only know how to handle one type of signature, but an update may contain 250 // many signatures to support many different types of client. Then client 251 // selects a Signature message and uses that, along with a known public key, 252 // to verify the download. The public key is expected to be part of the 253 // client. 254 type Signatures struct { 255 Signatures []*Signatures_Signature `protobuf:"bytes,1,rep,name=signatures" json:"signatures,omitempty"` 256 XXX_unrecognized []byte `json:"-"` 257 } 258 259 func (m *Signatures) Reset() { *m = Signatures{} } 260 func (m *Signatures) String() string { return proto.CompactTextString(m) } 261 func (*Signatures) ProtoMessage() {} 262 func (*Signatures) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } 263 264 func (m *Signatures) GetSignatures() []*Signatures_Signature { 265 if m != nil { 266 return m.Signatures 267 } 268 return nil 269 } 270 271 type Signatures_Signature struct { 272 Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"` 273 Data []byte `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` 274 XXX_unrecognized []byte `json:"-"` 275 } 276 277 func (m *Signatures_Signature) Reset() { *m = Signatures_Signature{} } 278 func (m *Signatures_Signature) String() string { return proto.CompactTextString(m) } 279 func (*Signatures_Signature) ProtoMessage() {} 280 func (*Signatures_Signature) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } 281 282 func (m *Signatures_Signature) GetVersion() uint32 { 283 if m != nil && m.Version != nil { 284 return *m.Version 285 } 286 return 0 287 } 288 289 func (m *Signatures_Signature) GetData() []byte { 290 if m != nil { 291 return m.Data 292 } 293 return nil 294 } 295 296 type InstallInfo struct { 297 Size *uint64 `protobuf:"varint,1,opt,name=size" json:"size,omitempty"` 298 Hash []byte `protobuf:"bytes,2,opt,name=hash" json:"hash,omitempty"` 299 XXX_unrecognized []byte `json:"-"` 300 } 301 302 func (m *InstallInfo) Reset() { *m = InstallInfo{} } 303 func (m *InstallInfo) String() string { return proto.CompactTextString(m) } 304 func (*InstallInfo) ProtoMessage() {} 305 func (*InstallInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } 306 307 func (m *InstallInfo) GetSize() uint64 { 308 if m != nil && m.Size != nil { 309 return *m.Size 310 } 311 return 0 312 } 313 314 func (m *InstallInfo) GetHash() []byte { 315 if m != nil { 316 return m.Hash 317 } 318 return nil 319 } 320 321 // InstallProcedure defines the update procedure for a single file or block 322 // device (except for /usr which is in DeltaArchiveManifest). 323 type InstallProcedure struct { 324 Type *InstallProcedure_Type `protobuf:"varint,1,req,name=type,enum=chromeos_update_engine.InstallProcedure_Type" json:"type,omitempty"` 325 Operations []*InstallOperation `protobuf:"bytes,2,rep,name=operations" json:"operations,omitempty"` 326 OldInfo *InstallInfo `protobuf:"bytes,3,opt,name=old_info" json:"old_info,omitempty"` 327 NewInfo *InstallInfo `protobuf:"bytes,4,opt,name=new_info" json:"new_info,omitempty"` 328 XXX_unrecognized []byte `json:"-"` 329 } 330 331 func (m *InstallProcedure) Reset() { *m = InstallProcedure{} } 332 func (m *InstallProcedure) String() string { return proto.CompactTextString(m) } 333 func (*InstallProcedure) ProtoMessage() {} 334 func (*InstallProcedure) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } 335 336 func (m *InstallProcedure) GetType() InstallProcedure_Type { 337 if m != nil && m.Type != nil { 338 return *m.Type 339 } 340 return InstallProcedure_KERNEL 341 } 342 343 func (m *InstallProcedure) GetOperations() []*InstallOperation { 344 if m != nil { 345 return m.Operations 346 } 347 return nil 348 } 349 350 func (m *InstallProcedure) GetOldInfo() *InstallInfo { 351 if m != nil { 352 return m.OldInfo 353 } 354 return nil 355 } 356 357 func (m *InstallProcedure) GetNewInfo() *InstallInfo { 358 if m != nil { 359 return m.NewInfo 360 } 361 return nil 362 } 363 364 type DeltaArchiveManifest struct { 365 // The update procedure for the main partition (USR-A or USR-B). Once 366 // complete it should match the hash specified in new_partition_info. 367 PartitionOperations []*InstallOperation `protobuf:"bytes,1,rep,name=partition_operations" json:"partition_operations,omitempty"` 368 // This field is maintained for compatibility with older update_engine 369 // clients. In the ChromeOS days it covered the kernel partition but in 370 // CoreOS it has only been used to insert a dummy operation to account for 371 // the signatures tacked onto the end of the payload. The code was not smart 372 // enough to stop passing data to the filesystem writer code after the 373 // signatures_offset had been reached, instead using the magic punch-hole 374 // value to skip over the extra data. Since CoreOS versions of update_engine 375 // only partially removed support kernel partitions passing anything other 376 // than dummy operations will trigger broken code paths but omitting the 377 // dummy operations will fail when the filesystem writer receives unexpected 378 // data. Therefore to work with old versions it strictly *must* look like: 379 // 380 // noop_operations: { 381 // type: REPLACE 382 // data_offset: signatures_offset 383 // data_length: signatures_size 384 // dst_extents: { 385 // start_block: UINT64_MAX 386 // num_blocks: (signature_size + block_size - 1) / block_size 387 // } 388 // } 389 // 390 NoopOperations []*InstallOperation `protobuf:"bytes,2,rep,name=noop_operations" json:"noop_operations,omitempty"` 391 // (At time of writing) usually 4096 392 BlockSize *uint32 `protobuf:"varint,3,opt,name=block_size,def=4096" json:"block_size,omitempty"` 393 // If signatures are present, the offset into the blobs, generally 394 // tacked onto the end of the file, and the length. We use an offset 395 // rather than a bool to allow for more flexibility in future file formats. 396 // If either is absent, it means signatures aren't supported in this 397 // file. 398 SignaturesOffset *uint64 `protobuf:"varint,4,opt,name=signatures_offset" json:"signatures_offset,omitempty"` 399 SignaturesSize *uint64 `protobuf:"varint,5,opt,name=signatures_size" json:"signatures_size,omitempty"` 400 // Partition data that can be used to validate the update. 401 OldPartitionInfo *InstallInfo `protobuf:"bytes,8,opt,name=old_partition_info" json:"old_partition_info,omitempty"` 402 NewPartitionInfo *InstallInfo `protobuf:"bytes,9,opt,name=new_partition_info" json:"new_partition_info,omitempty"` 403 // In addition to the partition update, process updates for additional 404 // files, such as kernels. Versions of update_engine that can interpret 405 // this list *MUST* ignore noop_operations and properly account for the 406 // signature data at the end of the payload. 407 Procedures []*InstallProcedure `protobuf:"bytes,10,rep,name=procedures" json:"procedures,omitempty"` 408 XXX_unrecognized []byte `json:"-"` 409 } 410 411 func (m *DeltaArchiveManifest) Reset() { *m = DeltaArchiveManifest{} } 412 func (m *DeltaArchiveManifest) String() string { return proto.CompactTextString(m) } 413 func (*DeltaArchiveManifest) ProtoMessage() {} 414 func (*DeltaArchiveManifest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } 415 416 const Default_DeltaArchiveManifest_BlockSize uint32 = 4096 417 418 func (m *DeltaArchiveManifest) GetPartitionOperations() []*InstallOperation { 419 if m != nil { 420 return m.PartitionOperations 421 } 422 return nil 423 } 424 425 func (m *DeltaArchiveManifest) GetNoopOperations() []*InstallOperation { 426 if m != nil { 427 return m.NoopOperations 428 } 429 return nil 430 } 431 432 func (m *DeltaArchiveManifest) GetBlockSize() uint32 { 433 if m != nil && m.BlockSize != nil { 434 return *m.BlockSize 435 } 436 return Default_DeltaArchiveManifest_BlockSize 437 } 438 439 func (m *DeltaArchiveManifest) GetSignaturesOffset() uint64 { 440 if m != nil && m.SignaturesOffset != nil { 441 return *m.SignaturesOffset 442 } 443 return 0 444 } 445 446 func (m *DeltaArchiveManifest) GetSignaturesSize() uint64 { 447 if m != nil && m.SignaturesSize != nil { 448 return *m.SignaturesSize 449 } 450 return 0 451 } 452 453 func (m *DeltaArchiveManifest) GetOldPartitionInfo() *InstallInfo { 454 if m != nil { 455 return m.OldPartitionInfo 456 } 457 return nil 458 } 459 460 func (m *DeltaArchiveManifest) GetNewPartitionInfo() *InstallInfo { 461 if m != nil { 462 return m.NewPartitionInfo 463 } 464 return nil 465 } 466 467 func (m *DeltaArchiveManifest) GetProcedures() []*InstallProcedure { 468 if m != nil { 469 return m.Procedures 470 } 471 return nil 472 } 473 474 func init() { 475 proto.RegisterType((*InstallOperation)(nil), "chromeos_update_engine.InstallOperation") 476 proto.RegisterType((*Extent)(nil), "chromeos_update_engine.Extent") 477 proto.RegisterType((*Signatures)(nil), "chromeos_update_engine.Signatures") 478 proto.RegisterType((*Signatures_Signature)(nil), "chromeos_update_engine.Signatures.Signature") 479 proto.RegisterType((*InstallInfo)(nil), "chromeos_update_engine.InstallInfo") 480 proto.RegisterType((*InstallProcedure)(nil), "chromeos_update_engine.InstallProcedure") 481 proto.RegisterType((*DeltaArchiveManifest)(nil), "chromeos_update_engine.DeltaArchiveManifest") 482 proto.RegisterEnum("chromeos_update_engine.InstallOperation_Type", InstallOperation_Type_name, InstallOperation_Type_value) 483 proto.RegisterEnum("chromeos_update_engine.InstallProcedure_Type", InstallProcedure_Type_name, InstallProcedure_Type_value) 484 } 485 486 var fileDescriptor0 = []byte{ 487 // 560 bytes of a gzipped FileDescriptorProto 488 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x53, 0x5d, 0x6f, 0xd3, 0x30, 489 0x14, 0x5d, 0xdb, 0xd0, 0x76, 0x37, 0xdd, 0x1a, 0xcc, 0x80, 0xc0, 0x03, 0xaa, 0xc2, 0x4b, 0x41, 490 0x50, 0x41, 0x61, 0x93, 0x06, 0x48, 0xd0, 0xb1, 0x54, 0xaa, 0xd8, 0xd8, 0xb4, 0x21, 0x1e, 0x78, 491 0xb1, 0x42, 0xeb, 0x2e, 0x11, 0xa9, 0x1d, 0xc5, 0xee, 0x80, 0xfd, 0x09, 0x7e, 0x0a, 0x7f, 0x89, 492 0x9f, 0xc2, 0xb5, 0x9b, 0x26, 0xd3, 0xc4, 0x44, 0xa6, 0xbd, 0xf9, 0xeb, 0x9c, 0x7b, 0xcf, 0xb9, 493 0xc7, 0x70, 0x7b, 0x9e, 0x4c, 0x02, 0xc5, 0xe8, 0x8c, 0xa9, 0x00, 0x17, 0x41, 0x2f, 0x49, 0x85, 494 0x12, 0xe4, 0xce, 0x38, 0x4c, 0xc5, 0x8c, 0x09, 0x49, 0xb3, 0x7b, 0xc6, 0x4f, 0x22, 0xce, 0xbc, 495 0x3f, 0x55, 0x70, 0x46, 0x5c, 0xaa, 0x20, 0x8e, 0x0f, 0x12, 0x96, 0x06, 0x2a, 0x12, 0x9c, 0xbc, 496 0x06, 0x4b, 0xfd, 0x4c, 0x98, 0x5b, 0xe9, 0x54, 0xbb, 0xeb, 0xfd, 0xa7, 0xbd, 0x7f, 0x63, 0x7b, 497 0x17, 0x71, 0xbd, 0x4f, 0x08, 0x22, 0xb7, 0xc0, 0xd6, 0x75, 0xa9, 0x98, 0x4e, 0x25, 0x53, 0x6e, 498 0xb5, 0x53, 0xe9, 0xae, 0xe5, 0x87, 0x31, 0x42, 0x55, 0xe8, 0xd6, 0xcc, 0xe1, 0x0b, 0xb0, 0x65, 499 0x3a, 0xa6, 0xec, 0x87, 0x62, 0x5c, 0x49, 0xd7, 0xea, 0xd4, 0xba, 0x76, 0xff, 0xc1, 0x65, 0xd5, 500 0x7c, 0xf3, 0x8c, 0x10, 0x00, 0x0d, 0xca, 0x88, 0x6e, 0x20, 0x91, 0xa5, 0x89, 0x26, 0x52, 0xe5, 501 0x44, 0xf5, 0xb2, 0x44, 0x1a, 0x94, 0x11, 0x35, 0x0c, 0x91, 0x0b, 0x8e, 0x69, 0x53, 0x86, 0x41, 502 0x7f, 0x73, 0x8b, 0x86, 0x81, 0x0c, 0xdd, 0x26, 0xde, 0xb4, 0xbc, 0x6d, 0xb0, 0x8c, 0x3a, 0x1b, 503 0x1a, 0x47, 0xfe, 0xe1, 0xde, 0xe0, 0xbd, 0xef, 0xac, 0x90, 0x75, 0x80, 0x6c, 0x43, 0x77, 0xbe, 504 0x38, 0x15, 0xd2, 0x04, 0x6b, 0xff, 0xe0, 0xb3, 0xef, 0x54, 0x91, 0xbb, 0xbe, 0x73, 0xbc, 0x3b, 505 0x1a, 0x0e, 0x9d, 0x9a, 0xf7, 0x1c, 0xea, 0x59, 0x49, 0x74, 0x01, 0x1d, 0x4b, 0x15, 0xfd, 0x1a, 506 0x8b, 0xf1, 0x37, 0xb4, 0x57, 0xd7, 0xc4, 0xb7, 0x7c, 0x3e, 0x5b, 0x1c, 0x49, 0x63, 0x97, 0xe5, 507 0x9d, 0x01, 0x1c, 0x47, 0x27, 0x3c, 0x50, 0xf3, 0x94, 0x49, 0xf2, 0x0e, 0x25, 0xe7, 0x3b, 0x44, 508 0x69, 0x75, 0x4f, 0x2e, 0x53, 0x57, 0xe0, 0x8a, 0xe5, 0xfd, 0xc7, 0xb0, 0x9a, 0x6f, 0x48, 0x1b, 509 0x1a, 0xa7, 0x2c, 0x95, 0x38, 0x30, 0xd3, 0xc1, 0x1a, 0x69, 0x81, 0xa5, 0x55, 0x9b, 0xda, 0x2d, 510 0xef, 0x11, 0xd8, 0xd9, 0x60, 0x47, 0x7c, 0x2a, 0xf4, 0xa5, 0x8c, 0xce, 0x58, 0xd6, 0x2c, 0xee, 511 0x8c, 0x29, 0x8b, 0xa7, 0xbf, 0x8a, 0xf0, 0x1c, 0xa6, 0x62, 0xcc, 0x26, 0x9a, 0xfe, 0x6a, 0xe1, 512 0xc9, 0x71, 0x8b, 0xf0, 0xbc, 0x01, 0x10, 0xcb, 0x38, 0x69, 0x33, 0xb4, 0xd4, 0x6e, 0xd9, 0xfc, 513 0x91, 0x4d, 0x68, 0x8a, 0x78, 0x42, 0x23, 0xec, 0xdb, 0x44, 0xcc, 0xee, 0x3f, 0xfc, 0x0f, 0xd6, 514 0x48, 0x44, 0x18, 0x67, 0xdf, 0x17, 0x30, 0xab, 0x34, 0xcc, 0x23, 0x59, 0x24, 0x70, 0xd6, 0x1f, 515 0xfc, 0xa3, 0x8f, 0xfe, 0x9e, 0xb3, 0xe2, 0xfd, 0xae, 0xc1, 0xc6, 0x2e, 0x8b, 0x55, 0x30, 0x48, 516 0xc7, 0x61, 0x74, 0xca, 0xf6, 0x03, 0x1e, 0x4d, 0x99, 0x54, 0x64, 0x08, 0x1b, 0x09, 0x4e, 0x3e, 517 0xd2, 0x7d, 0xd2, 0x73, 0x12, 0x2b, 0x57, 0x94, 0x38, 0x80, 0x36, 0x17, 0x22, 0xa1, 0xd7, 0x70, 518 0xc9, 0x05, 0x30, 0x61, 0xa3, 0x66, 0xae, 0xe6, 0x2b, 0xbe, 0xb2, 0x5e, 0x3e, 0xdb, 0xde, 0x22, 519 0xf7, 0xe0, 0x66, 0x11, 0xb4, 0xe5, 0x07, 0xb6, 0xcc, 0xe0, 0xef, 0x42, 0xfb, 0xdc, 0x95, 0x41, 520 0x2e, 0xfe, 0xde, 0x5b, 0x20, 0xda, 0xf3, 0x42, 0x9c, 0xb1, 0xb1, 0x59, 0xde, 0x7d, 0x24, 0xd0, 521 0xee, 0x5f, 0x20, 0x58, 0x2d, 0x4f, 0x80, 0x99, 0x49, 0x96, 0x29, 0x92, 0x2e, 0x94, 0x72, 0x23, 522 0x8f, 0xdd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0xd4, 0x06, 0x13, 0x30, 0x05, 0x00, 0x00, 523 }