├── .gitignore ├── LICENSE ├── README.md ├── doc ├── .gitignore └── adts_data.go ├── fdkaac ├── .gitignore ├── dec.go ├── dec_test.go ├── enc.go ├── enc_test.go └── example_test.go └── main.go /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | fdk-aac-lib 3 | doc/adts_data.pcm_s16le.wav 4 | 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 winlin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # go-fdkaac 2 | 3 | Golang binding for lib-fdkaac(https://github.com/winlinvip/fdk-aac) 4 | 5 | ## Usage 6 | 7 | First, get the source code: 8 | 9 | ``` 10 | go get -d github.com/winlinvip/go-fdkaac 11 | ``` 12 | 13 | Then, compile the fdk-aac: 14 | 15 | ``` 16 | cd $GOPATH/src/github.com/winlinvip/go-fdkaac && 17 | git clone https://github.com/winlinvip/fdk-aac.git fdk-aac-lib && 18 | cd fdk-aac-lib/ && bash autogen.sh && ./configure --prefix=`pwd`/objs && make && make install && 19 | cd .. 20 | ``` 21 | 22 | Done, import and use the package: 23 | 24 | * [ExampleAacDecoder_RAW](fdkaac/example_test.go#L29), decode the aac frame to PCM samples. 25 | * [ExampleAacEncoder_LC](fdkaac/example_test.go#L316), encode the PCM samples to aac frame. 26 | * [audio resample](https://github.com/winlinvip/go-aresample). 27 | 28 | There are an example of AAC audio packets in ADTS: 29 | 30 | * [avatar aac over ADTS](doc/adts_data.go), user can use this file to decode to PCM then encode. 31 | 32 | To run all examples: 33 | 34 | ``` 35 | cd $GOPATH/src/github.com/winlinvip/go-fdkaac && go test ./... 36 | ``` 37 | 38 | Winlin 2016 39 | -------------------------------------------------------------------------------- /doc/.gitignore: -------------------------------------------------------------------------------- 1 | adts_data.aac 2 | -------------------------------------------------------------------------------- /fdkaac/.gitignore: -------------------------------------------------------------------------------- 1 | aac 2 | -------------------------------------------------------------------------------- /fdkaac/dec.go: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2016 winlin 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | // this software and associated documentation files (the "Software"), to deal in 7 | // the Software without restriction, including without limitation the rights to 8 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | // the Software, and to permit persons to whom the Software is furnished to do so, 10 | // subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in all 13 | // copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | // The aac decoder, to decode the encoded aac frame to PCM samples. 23 | package fdkaac 24 | 25 | /* 26 | #cgo CFLAGS: -I${SRCDIR}/../fdk-aac-lib/objs/include/fdk-aac 27 | #cgo LDFLAGS: ${SRCDIR}/../fdk-aac-lib/objs/lib/libfdk-aac.a 28 | #include "aacdecoder_lib.h" 29 | 30 | typedef struct { 31 | HANDLE_AACDECODER dec; 32 | // Whether use ADTS mode. 33 | int is_adts; 34 | // Init util the first frame decoded. 35 | CStreamInfo* info; 36 | // The bits of sample, always 16 for fdkaac. 37 | int sample_bits; 38 | // Total filled bytes. 39 | UINT filled_bytes; 40 | } aacdec_t; 41 | 42 | static void _aacdec_init(aacdec_t* h) { 43 | // For lib-fdkaac, always use 16bits sample. 44 | // avctx->sample_fmt = AV_SAMPLE_FMT_S16; 45 | h->sample_bits = 16; 46 | h->is_adts = 0; 47 | h->filled_bytes = 0; 48 | 49 | h->dec = NULL; 50 | h->info = NULL; 51 | } 52 | 53 | static int aacdec_init_adts(aacdec_t* h) { 54 | _aacdec_init(h); 55 | 56 | h->is_adts = 1; 57 | 58 | h->dec = aacDecoder_Open(TT_MP4_ADTS, 1); 59 | if (!h->dec) { 60 | return -1; 61 | } 62 | 63 | return 0; 64 | } 65 | 66 | static int aacdec_init_raw(aacdec_t* h, char* asc, int nb_asc) { 67 | _aacdec_init(h); 68 | 69 | h->dec = aacDecoder_Open(TT_MP4_RAW, 1); 70 | if (!h->dec) { 71 | return -1; 72 | } 73 | 74 | UCHAR* uasc = (UCHAR*)asc; 75 | UINT unb_asc = (UINT)nb_asc; 76 | AAC_DECODER_ERROR err = aacDecoder_ConfigRaw(h->dec, &uasc, &unb_asc); 77 | if (err != AAC_DEC_OK) { 78 | return err; 79 | } 80 | 81 | return 0; 82 | } 83 | 84 | static void aacdec_close(aacdec_t* h) { 85 | if (h->dec) { 86 | aacDecoder_Close(h->dec); 87 | } 88 | h->dec = NULL; 89 | } 90 | 91 | static int aacdec_fill(aacdec_t* h, char* data, int nb_data, int* pnb_left) { 92 | h->filled_bytes += nb_data; 93 | 94 | UCHAR* udata = (UCHAR*)data; 95 | UINT unb_data = (UINT)nb_data; 96 | UINT unb_left = unb_data; 97 | AAC_DECODER_ERROR err = aacDecoder_Fill(h->dec, &udata, &unb_data, &unb_left); 98 | if (err != AAC_DEC_OK) { 99 | return err; 100 | } 101 | 102 | if (pnb_left) { 103 | *pnb_left = (int)unb_left; 104 | } 105 | 106 | return 0; 107 | } 108 | 109 | static int aacdec_sample_bits(aacdec_t* h) { 110 | return h->sample_bits; 111 | } 112 | 113 | static int aacdec_pcm_size(aacdec_t* h) { 114 | if (!h->info) { 115 | return 0; 116 | } 117 | return (int)(h->info->numChannels * h->info->frameSize * h->sample_bits / 8); 118 | } 119 | 120 | static int aacdec_decode_frame(aacdec_t* h, char* pcm, int nb_pcm, int* pnb_valid) { 121 | // when buffer left bytes not enough, directly return not-enough-bits. 122 | // we requires atleast 7bytes header for adts. 123 | if (h->is_adts && h->info && h->filled_bytes - h->info->numTotalBytes <= 7) { 124 | return AAC_DEC_NOT_ENOUGH_BITS; 125 | } 126 | 127 | INT_PCM* upcm = (INT_PCM*)pcm; 128 | INT unb_pcm = (INT)nb_pcm; 129 | AAC_DECODER_ERROR err = aacDecoder_DecodeFrame(h->dec, upcm, unb_pcm, 0); 130 | 131 | // user should fill more bytes then decode. 132 | if (err == AAC_DEC_NOT_ENOUGH_BITS) { 133 | return err; 134 | } 135 | if (err != AAC_DEC_OK) { 136 | return err; 137 | } 138 | 139 | // when decode ok, retrieve the info. 140 | if (!h->info) { 141 | h->info = aacDecoder_GetStreamInfo(h->dec); 142 | } 143 | 144 | // the actual size of pcm. 145 | if (pnb_valid) { 146 | *pnb_valid = aacdec_pcm_size(h); 147 | } 148 | 149 | return 0; 150 | } 151 | 152 | static int aacdec_sample_rate(aacdec_t* h) { 153 | if (!h->info) { 154 | return 0; 155 | } 156 | return h->info->sampleRate; 157 | } 158 | 159 | static int aacdec_frame_size(aacdec_t* h) { 160 | if (!h->info) { 161 | return 0; 162 | } 163 | return h->info->frameSize; 164 | } 165 | 166 | static int aacdec_num_channels(aacdec_t* h) { 167 | if (!h->info) { 168 | return 0; 169 | } 170 | return h->info->numChannels; 171 | } 172 | 173 | static int aacdec_aac_sample_rate(aacdec_t* h) { 174 | if (!h->info) { 175 | return 0; 176 | } 177 | return h->info->aacSampleRate; 178 | } 179 | 180 | static int aacdec_profile(aacdec_t* h) { 181 | if (!h->info) { 182 | return 0; 183 | } 184 | return h->info->profile; 185 | } 186 | 187 | static int aacdec_audio_object_type(aacdec_t* h) { 188 | if (!h->info) { 189 | return 0; 190 | } 191 | return h->info->aot; 192 | } 193 | 194 | static int aacdec_channel_config(aacdec_t* h) { 195 | if (!h->info) { 196 | return 0; 197 | } 198 | return h->info->channelConfig; 199 | } 200 | 201 | static int aacdec_bitrate(aacdec_t* h) { 202 | if (!h->info) { 203 | return 0; 204 | } 205 | return h->info->bitRate; 206 | } 207 | 208 | static int aacdec_aac_samples_per_frame(aacdec_t* h) { 209 | if (!h->info) { 210 | return 0; 211 | } 212 | return h->info->aacSamplesPerFrame; 213 | } 214 | 215 | static int aacdec_aac_num_channels(aacdec_t* h) { 216 | if (!h->info) { 217 | return 0; 218 | } 219 | return h->info->aacNumChannels; 220 | } 221 | 222 | static int aacdec_extension_audio_object_type(aacdec_t* h) { 223 | if (!h->info) { 224 | return 0; 225 | } 226 | return h->info->extAot; 227 | } 228 | 229 | static int aacdec_extension_sampling_rate(aacdec_t* h) { 230 | if (!h->info) { 231 | return 0; 232 | } 233 | return h->info->extSamplingRate; 234 | } 235 | 236 | static int aacdec_num_lost_access_units(aacdec_t* h) { 237 | if (!h->info) { 238 | return 0; 239 | } 240 | return h->info->numLostAccessUnits; 241 | } 242 | 243 | static int aacdec_num_total_bytes(aacdec_t* h) { 244 | if (!h->info) { 245 | return 0; 246 | } 247 | return h->info->numTotalBytes; 248 | } 249 | 250 | static int aacdec_num_bad_bytes(aacdec_t* h) { 251 | if (!h->info) { 252 | return 0; 253 | } 254 | return h->info->numBadBytes; 255 | } 256 | 257 | static int aacdec_num_total_access_units(aacdec_t* h) { 258 | if (!h->info) { 259 | return 0; 260 | } 261 | return h->info->numTotalAccessUnits; 262 | } 263 | 264 | static int aacdec_num_bad_access_units(aacdec_t* h) { 265 | if (!h->info) { 266 | return 0; 267 | } 268 | return h->info->numBadAccessUnits; 269 | } 270 | */ 271 | import "C" 272 | 273 | import ( 274 | "fmt" 275 | "unsafe" 276 | ) 277 | 278 | const ( 279 | aacDecNotEnoughBits = 0x1002 280 | ) 281 | 282 | type AacDecoder struct { 283 | m C.aacdec_t 284 | } 285 | 286 | func NewAacDecoder() *AacDecoder { 287 | return &AacDecoder{} 288 | } 289 | 290 | // Open the decoder in RAW mode with ASC. 291 | // For example, the FLV audio payload is a SequenceHeader(ASC) or RAW AAC data, 292 | // user can init the decoder with ASC and decode the raw data. 293 | // @remark user should never get the info util decode one frame. 294 | func (v *AacDecoder) InitRaw(asc []byte) (err error) { 295 | p := (*C.char)(unsafe.Pointer(&asc[0])) 296 | pSize := C.int(len(asc)) 297 | 298 | r := C.aacdec_init_raw(&v.m, p, pSize) 299 | 300 | if int(r) != 0 { 301 | return fmt.Errorf("init RAW decoder failed, code is %d", int(r)) 302 | } 303 | 304 | return nil 305 | } 306 | 307 | // Open the decoder in ADTS mode without ASC, 308 | // we never know the stream info util got the first frame, 309 | // because the codec info is insert at begin of each frame. 310 | // @remark The frame to Decode() is muxed in ADTS format. 311 | func (v *AacDecoder) InitAdts() (err error) { 312 | r := C.aacdec_init_adts(&v.m) 313 | 314 | if int(r) != 0 { 315 | return fmt.Errorf("init ADTS decoder failed, code is %d", int(r)) 316 | } 317 | 318 | return nil 319 | } 320 | 321 | // De-allocate all resources of an AAC decoder instance. 322 | func (v *AacDecoder) Close() error { 323 | C.aacdec_close(&v.m) 324 | return nil 325 | } 326 | 327 | // Fill the buffer of decoder then decode. 328 | // @remark we always expect all input are consumed by decoder. 329 | func (v *AacDecoder) fill(input []byte) (err error) { 330 | p := (*C.char)(unsafe.Pointer(&input[0])) 331 | pSize := C.int(len(input)) 332 | leftSize := C.int(0) 333 | 334 | r := C.aacdec_fill(&v.m, p, pSize, &leftSize) 335 | 336 | if int(r) != 0 { 337 | return fmt.Errorf("fill aac decoder failed, code is %d", int(r)) 338 | } 339 | 340 | if int(leftSize) > 0 { 341 | return fmt.Errorf("decoder left %v bytes", int(leftSize)) 342 | } 343 | 344 | return 345 | } 346 | 347 | // Decode one audio frame. 348 | // @param the frame contains encoded aac frame, optional can be nil. 349 | // @eturn when pcm is nil, should fill more bytes and decode again. 350 | func (v *AacDecoder) Decode(frame []byte) (pcm []byte, err error) { 351 | if len(frame) > 0 { 352 | if err = v.fill(frame); err != nil { 353 | return 354 | } 355 | } 356 | 357 | nbPcm := int(C.aacdec_pcm_size(&v.m)) 358 | if nbPcm == 0 { 359 | nbPcm = 50 * 1024 360 | } 361 | pcm = make([]byte, nbPcm) 362 | 363 | p := (*C.char)(unsafe.Pointer(&pcm[0])) 364 | pSize := C.int(nbPcm) 365 | validSize := C.int(0) 366 | 367 | r := C.aacdec_decode_frame(&v.m, p, pSize, &validSize) 368 | 369 | if int(r) == aacDecNotEnoughBits { 370 | return nil, nil 371 | } 372 | 373 | if int(r) != 0 { 374 | return nil, fmt.Errorf("decode frame failed, code is %d", int(r)) 375 | } 376 | 377 | return pcm[0:int(validSize)], nil 378 | } 379 | 380 | // The bits of a sample, the fdk aac always use 16bits sample. 381 | func (v *AacDecoder) SampleBits() int { 382 | return int(C.aacdec_sample_bits(&v.m)) 383 | } 384 | 385 | // The samplerate in Hz of the fully decoded PCM audio signal (after SBR processing). 386 | // @remark The only really relevant ones for the user. 387 | func (v *AacDecoder) SampleRate() int { 388 | return int(C.aacdec_sample_rate(&v.m)) 389 | } 390 | 391 | // The frame size of the decoded PCM audio signal. 392 | // 1024 or 960 for AAC-LC 393 | // 2048 or 1920 for HE-AAC (v2) 394 | // 512 or 480 for AAC-LD and AAC-ELD 395 | // @remark The only really relevant ones for the user. 396 | func (v *AacDecoder) FrameSize() int { 397 | return int(C.aacdec_frame_size(&v.m)) 398 | } 399 | 400 | // The number of output audio channels in the decoded and interleaved PCM audio signal. 401 | // @remark The only really relevant ones for the user. 402 | func (v *AacDecoder) NumChannels() int { 403 | return int(C.aacdec_num_channels(&v.m)) 404 | } 405 | 406 | // sampling rate in Hz without SBR (from configuration info). 407 | // @remark Decoder internal members. 408 | func (v *AacDecoder) AacSampleRate() int { 409 | return int(C.aacdec_aac_sample_rate(&v.m)) 410 | } 411 | 412 | // MPEG-2 profile (from file header) (-1: not applicable (e. g. MPEG-4)). 413 | // @remark Decoder internal members. 414 | func (v *AacDecoder) Profile() int { 415 | return int(C.aacdec_profile(&v.m)) 416 | } 417 | 418 | // Audio Object Type (from ASC): is set to the appropriate value for MPEG-2 bitstreams (e. g. 2 for AAC-LC). 419 | // @remark Decoder internal members. 420 | func (v *AacDecoder) AudioObjectType() int { 421 | return int(C.aacdec_audio_object_type(&v.m)) 422 | } 423 | 424 | // Channel configuration (0: PCE defined, 1: mono, 2: stereo, ... 425 | // @remark Decoder internal members. 426 | func (v *AacDecoder) ChannelConfig() int { 427 | return int(C.aacdec_channel_config(&v.m)) 428 | } 429 | 430 | // Instantaneous bit rate. 431 | // @remark Decoder internal members. 432 | func (v *AacDecoder) Bitrate() int { 433 | return int(C.aacdec_bitrate(&v.m)) 434 | } 435 | 436 | // Samples per frame for the AAC core (from ASC). 437 | // 1024 or 960 for AAC-LC 438 | // 512 or 480 for AAC-LD and AAC-ELD 439 | // @remark Decoder internal members. 440 | func (v *AacDecoder) AacSamplesPerFrame() int { 441 | return int(C.aacdec_aac_samples_per_frame(&v.m)) 442 | } 443 | 444 | // The number of audio channels after AAC core processing (before PS or MPS processing). 445 | // CAUTION: This are not the final number of output channels! 446 | // @remark Decoder internal members. 447 | func (v *AacDecoder) AacNumChannels() int { 448 | return int(C.aacdec_aac_num_channels(&v.m)) 449 | } 450 | 451 | // Extension Audio Object Type (from ASC) 452 | // @remark Decoder internal members. 453 | func (v *AacDecoder) ExtensionAudioObjectType() int { 454 | return int(C.aacdec_extension_audio_object_type(&v.m)) 455 | } 456 | 457 | // Extension sampling rate in Hz (from ASC) 458 | // @remark Decoder internal members. 459 | func (v *AacDecoder) ExtensionSamplingRate() int { 460 | return int(C.aacdec_extension_sampling_rate(&v.m)) 461 | } 462 | 463 | // This integer will reflect the estimated amount of lost access units in case aacDecoder_DecodeFrame() 464 | // returns AAC_DEC_TRANSPORT_SYNC_ERROR. It will be < 0 if the estimation failed. 465 | // @remark Statistics. 466 | func (v *AacDecoder) NumLostAccessUnits() int { 467 | return int(C.aacdec_num_lost_access_units(&v.m)) 468 | } 469 | 470 | // This is the number of total bytes that have passed through the decoder. 471 | // @remark Statistics. 472 | func (v *AacDecoder) NumTotalBytes() int { 473 | return int(C.aacdec_num_total_bytes(&v.m)) 474 | } 475 | 476 | // This is the number of total bytes that were considered with errors from numTotalBytes. 477 | // @remark Statistics. 478 | func (v *AacDecoder) NumBadBytes() int { 479 | return int(C.aacdec_num_bad_bytes(&v.m)) 480 | } 481 | 482 | // This is the number of total access units that have passed through the decoder. 483 | // @remark Statistics. 484 | func (v *AacDecoder) NumTotalAccessUnits() int { 485 | return int(C.aacdec_num_total_access_units(&v.m)) 486 | } 487 | 488 | // This is the number of total access units that were considered with errors from numTotalBytes. 489 | // @remark Statistics. 490 | func (v *AacDecoder) NumBadAccessUnits() int { 491 | return int(C.aacdec_num_bad_access_units(&v.m)) 492 | } 493 | -------------------------------------------------------------------------------- /fdkaac/dec_test.go: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2016 winlin 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | // this software and associated documentation files (the "Software"), to deal in 7 | // the Software without restriction, including without limitation the rights to 8 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | // the Software, and to permit persons to whom the Software is furnished to do so, 10 | // subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in all 13 | // copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | // @remark we must use another packet for utest, because the cgo will dup symbols. 23 | package fdkaac_test 24 | 25 | import ( 26 | "github.com/winlinvip/go-fdkaac/fdkaac" 27 | "testing" 28 | ) 29 | 30 | func TestRawInit(t *testing.T) { 31 | d := fdkaac.NewAacDecoder() 32 | 33 | asc := []byte{0x12, 0x10} 34 | if err := d.InitRaw(asc); err != nil { 35 | t.Error("init failed, err is", err) 36 | return 37 | } 38 | defer d.Close() 39 | 40 | if d.AacSampleRate() != 0 { 41 | t.Error("AacSampleRate", d.AacSampleRate(), "is not 0") 42 | } 43 | if d.Profile() != 0 { 44 | t.Error("Profile", d.Profile(), "is not 0") 45 | } 46 | if d.AudioObjectType() != 0 { 47 | t.Error("AudioObjectType", d.AudioObjectType(), "is not 0") 48 | } 49 | if d.ChannelConfig() != 0 { 50 | t.Error("ChannelConfig", d.ChannelConfig(), "is not 0") 51 | } 52 | if d.AacSamplesPerFrame() != 0 { 53 | t.Error("AacSamplesPerFrame", d.AacSamplesPerFrame(), "is not 0") 54 | } 55 | } 56 | 57 | func TestAdtsInit(t *testing.T) { 58 | d := fdkaac.NewAacDecoder() 59 | 60 | if err := d.InitAdts(); err != nil { 61 | t.Error("init failed, err is", err) 62 | return 63 | } 64 | defer d.Close() 65 | 66 | if d.AacSampleRate() != 0 { 67 | t.Error("AacSampleRate", d.AacSampleRate(), "is not 0") 68 | } 69 | if d.Profile() != 0 { 70 | t.Error("Profile", d.Profile(), "is not 0") 71 | } 72 | if d.AudioObjectType() != 0 { 73 | t.Error("AudioObjectType", d.AudioObjectType(), "is not 0") 74 | } 75 | if d.ChannelConfig() != 0 { 76 | t.Error("ChannelConfig", d.ChannelConfig(), "is not 0") 77 | } 78 | if d.AacSamplesPerFrame() != 0 { 79 | t.Error("AacSamplesPerFrame", d.AacSamplesPerFrame(), "is not 0") 80 | } 81 | } 82 | 83 | func TestRawDecode(t *testing.T) { 84 | d := fdkaac.NewAacDecoder() 85 | 86 | asc := []byte{0x12, 0x10} 87 | if err := d.InitRaw(asc); err != nil { 88 | t.Error("init failed, err is", err) 89 | return 90 | } 91 | defer d.Close() 92 | 93 | if b, err := d.Decode([]byte{ 94 | 0x21, 0x17, 0x55, 0x35, 0xa1, 0x0c, 0x2f, 0x00, 0x00, 0x50, 0x23, 0xa6, 0x81, 0xbf, 0x9c, 0xbf, 95 | 0x13, 0x73, 0xa9, 0xb0, 0x41, 0xed, 0x60, 0x23, 0x48, 0xf7, 0x34, 0x07, 0x12, 0x53, 0xd8, 0xeb, 96 | 0x49, 0xf4, 0x1e, 0x73, 0xc9, 0x01, 0xfd, 0x16, 0x9f, 0x8e, 0xb5, 0xd5, 0x9b, 0xb6, 0x49, 0xdb, 97 | 0x35, 0x61, 0x3b, 0x54, 0xad, 0x5f, 0x9d, 0x34, 0x94, 0x88, 0x58, 0x89, 0x33, 0x54, 0x89, 0xc4, 98 | 0x09, 0x80, 0xa2, 0xa1, 0x28, 0x81, 0x42, 0x10, 0x48, 0x94, 0x05, 0xfb, 0x03, 0xc7, 0x64, 0xe1, 99 | 0x54, 0x17, 0xf6, 0x65, 0x15, 0x00, 0x48, 0xa9, 0x80, 0x00, 0x38}); err != nil { 100 | t.Error("decode failed, err is", err) 101 | return 102 | } else if len(b) != 4096 { 103 | t.Error("pcm size invalid, expect 4096, actual is", len(b)) 104 | return 105 | } 106 | } 107 | 108 | func TestRawDecode_MultipleFrames(t *testing.T) { 109 | d := fdkaac.NewAacDecoder() 110 | 111 | asc := []byte{0x12, 0x10} 112 | if err := d.InitRaw(asc); err != nil { 113 | t.Error("init failed, err is", err) 114 | return 115 | } 116 | defer d.Close() 117 | 118 | if b, err := d.Decode([]byte{ 119 | 0x21, 0x17, 0x55, 0x55, 0x19, 0x1a, 0x2a, 0x2d, 0x54, 0xce, 0x00, 0x58, 0x1a, 0x1e, 0x42, 0x0e, 120 | 0x1f, 0xd2, 0xd4, 0x9c, 0x15, 0x77, 0xf4, 0x07, 0x38, 0x3d, 0xc5, 0x04, 0x19, 0x64, 0x39, 0x98, 121 | 0x01, 0xae, 0x2e, 0xb1, 0xd0, 0x87, 0xca, 0x33, 0x17, 0xfb, 0x05, 0x00, 0x7a, 0x60, 0x47, 0x79, 122 | 0x6b, 0x9b, 0xdf, 0x2d, 0xfd, 0x32, 0xc6, 0x9f, 0x1f, 0x21, 0x4b, 0x04, 0x9b, 0xe2, 0x4d, 0x62, 123 | 0xc8, 0x01, 0xe0, 0x98, 0x0a, 0x37, 0x48, 0x44, 0x42, 0x02, 0x00, 0xd0, 0x7d, 0xae, 0xb4, 0x32, 124 | 0xf1, 0xcc, 0x76, 0x5f, 0x18, 0xac, 0xae, 0x0e}); err != nil { 125 | t.Error("fill failed, err is", err) 126 | return 127 | } else if len(b) != 4096 { 128 | t.Error("pcm size invalid, expect 4096, actual is", len(b)) 129 | return 130 | } 131 | 132 | if b, err := d.Decode([]byte{ 133 | 0x21, 0x17, 0x55, 0x5c, 0x21, 0x12, 0xc2, 0x15, 0x04, 0x17, 0x94, 0x50, 0xb0, 0xaf, 0x3a, 0x34, 134 | 0x12, 0x7f, 0xee, 0x54, 0xac, 0xe2, 0x57, 0x57, 0xf7, 0x19, 0x18, 0xc5, 0x08, 0xc9, 0xaa, 0x21, 135 | 0x75, 0x2c, 0xc9, 0x4f, 0x6f, 0xc7, 0xe2, 0xfb, 0x44, 0x72, 0x47, 0x71, 0x4a, 0x88, 0x9b, 0xfe, 136 | 0x0c, 0x83, 0x02, 0x1a, 0xc9, 0x59, 0x7a, 0x48, 0x98, 0xac, 0x02, 0xab, 0x64, 0x22, 0x32, 0xcd, 137 | 0x50, 0x3d, 0x80, 0x16, 0x22, 0x70, 0xb0, 0x7b, 0x00, 0x53, 0xef, 0x7c, 0xbc}); err != nil { 138 | t.Error("fill failed, err is", err) 139 | return 140 | } else if len(b) != 4096 { 141 | t.Error("pcm size invalid, expect 4096, actual is", len(b)) 142 | return 143 | } 144 | 145 | if b, err := d.Decode([]byte{ 146 | 0x21, 0x17, 0x55, 0x4d, 0x1d, 0x4d, 0x01, 0x42, 0x8a, 0x80, 0x19, 0x01, 0x8b, 0x0b, 0xe0, 0x02, 147 | 0x24, 0x7d, 0x8e, 0x08, 0xf2, 0x65, 0x64, 0xef, 0x02, 0x80, 0xf2, 0x72, 0xe4, 0xea, 0x19, 0x9c, 148 | 0xd6, 0x90, 0xb8, 0x6f, 0xd4, 0x28, 0x74, 0xb9, 0xdd, 0x80, 0x6a, 0xfe, 0x09, 0x0e, 0xa4, 0xb7, 149 | 0x83, 0x7f, 0xf8, 0x80, 0xa4, 0xa1, 0xd6, 0xb3, 0x6d, 0xbd, 0xe5, 0xe3, 0xc7, 0x00, 0xa0, 0x50, 150 | 0x17, 0x49, 0x96, 0x8b, 0x9a, 0x17, 0x40, 0x02, 0xa8, 0x50, 0x15, 0x03, 0x7a, 0x1c, 0x01, 0x5c, 151 | 0x9c}); err != nil { 152 | t.Error("fill failed, err is", err) 153 | return 154 | } else if len(b) != 4096 { 155 | t.Error("pcm size invalid, expect 4096, actual is", len(b)) 156 | return 157 | } 158 | } 159 | 160 | func TestAdtsDecode_Partial(t *testing.T) { 161 | d := fdkaac.NewAacDecoder() 162 | 163 | if err := d.InitAdts(); err != nil { 164 | t.Error("init failed, err is", err) 165 | return 166 | } 167 | defer d.Close() 168 | 169 | if b, err := d.Decode([]byte{0xff, 0xf1, 0x50, 0x80, 0x0c, 0x40, 0xfc, 170 | 0x21, 0x17, 0x55, 0x35, 0xa1, 0x0c, 0x2f, 0x00, 0x00, 0x50, 0x23, 0xa6, 0x81, 0xbf, 0x9c, 0xbf, 171 | 0x13, 0x73, 0xa9, 0xb0, 0x41, 0xed, 0x60, 0x23, 0x48, 0xf7, 0x34, 0x07, 0x12, 0x53, 0xd8, 0xeb, 172 | 0x49, 0xf4, 0x1e, 0x73, 0xc9, 0x01, 0xfd, 0x16, 0x9f, 0x8e, 0xb5, 0xd5, 0x9b, 0xb6, 0x49, 0xdb, 173 | 0x35, 0x61, 0x3b, 0x54, 0xad, 0x5f, 0x9d, 0x34, 0x94, 0x88, 0x58, 0x89, 0x33, 0x54, 0x89, 0xc4, 174 | 0x09, 0x80, 0xa2, 0xa1, 0x28, 0x81, 0x42, 0x10, 0x48, 0x94, 0x05, 0xfb, 0x03, 0xc7, 0x64, 0xe1, 175 | 0x54}); err != nil { 176 | t.Error("fill failed, err is", err) 177 | return 178 | } else if len(b) != 0 { 179 | t.Error("pcm size invalid, expect 0, actual is", len(b)) 180 | return 181 | } 182 | 183 | if b, err := d.Decode([]byte{0x17, 0xf6, 0x65, 0x15, 0x00, 0x48, 0xa9, 0x80, 0x00, 0x38, 184 | 0xff, 0xf1, 0x50, 0x80, 0x0c, 0x40, 0xfc, 185 | 0x21, 0x17, 0x55, 0x35, 0xa1, 0x0c, 0x2f, 0x00, 0x00, 0x50, 0x23, 0xa6, 0x81, 0xbf, 0x9c, 0xbf}); err != nil { 186 | t.Error("fill failed, err is", err) 187 | return 188 | } else if len(b) != 4096 { 189 | t.Error("pcm size invalid, expect 4096, actual is", len(b)) 190 | return 191 | } 192 | 193 | if b, err := d.Decode([]byte{ 194 | 0x13, 0x73, 0xa9, 0xb0, 0x41, 0xed, 0x60, 0x23, 0x48, 0xf7, 0x34, 0x07, 0x12, 0x53, 0xd8, 0xeb, 195 | 0x49, 0xf4, 0x1e, 0x73, 0xc9, 0x01, 0xfd, 0x16, 0x9f, 0x8e, 0xb5, 0xd5, 0x9b, 0xb6, 0x49, 0xdb, 196 | 0x35, 0x61, 0x3b, 0x54, 0xad, 0x5f, 0x9d, 0x34, 0x94, 0x88, 0x58, 0x89, 0x33, 0x54, 0x89, 0xc4, 197 | 0x09, 0x80, 0xa2, 0xa1, 0x28, 0x81, 0x42, 0x10, 0x48, 0x94, 0x05, 0xfb, 0x03, 0xc7, 0x64, 0xe1}); err != nil { 198 | t.Error("fill failed, err is", err) 199 | return 200 | } else if len(b) != 0 { 201 | t.Error("pcm size invalid, expect 0, actual is", len(b)) 202 | return 203 | } 204 | 205 | if b, err := d.Decode([]byte{0x54, 0x17, 0xf6, 0x65, 0x15, 0x00, 0x48, 0xa9, 0x80, 0x00, 0x38}); err != nil { 206 | t.Error("fill failed, err is", err) 207 | return 208 | } else if len(b) != 4096 { 209 | t.Error("pcm size invalid, expect 4096, actual is", len(b)) 210 | return 211 | } 212 | } 213 | 214 | func TestAdtsDecode_Partial2(t *testing.T) { 215 | d := fdkaac.NewAacDecoder() 216 | 217 | if err := d.InitAdts(); err != nil { 218 | t.Error("init failed, err is", err) 219 | return 220 | } 221 | defer d.Close() 222 | 223 | if b, err := d.Decode([]byte{ 224 | // frame#0 225 | 0xff, 0xf1, 0x50, 0x80, 0x0e, 0x60, 0xfc, 226 | 0x21, 0x17, 0x55, 0x45, 0x0d, 0x88, 0x90, 0x13, 0x04, 0x2c, 0xa4, 0x01, 0x01, 0xd0, 0x20, 0x3e, 227 | 0x27, 0x6d, 0x38, 0x35, 0x4a, 0x0b, 0x59, 0xb5, 0xde, 0x8d, 0xad, 0x72, 0x7b, 0xa6, 0xe4, 0xd7, 228 | 0xbe, 0x0c, 0xfa, 0xe8, 0x0e, 0x1d, 0xaa, 0xc7, 0x0a, 0x44, 0xd2, 0x33, 0x81, 0xd8, 0x24, 0x81, 229 | 0xd4, 0xc1, 0x76, 0x9b, 0x5b, 0x88, 0x58, 0x9c, 0x23, 0x82, 0xf5, 0x2c, 0x26, 0x04, 0x94, 0x80, 230 | 0xab, 0x7b, 0x28, 0x0a, 0x66, 0x30, 0x90, 0x0a, 0x6a, 0x02, 0x16, 0xb0, 0x50, 0x06, 0x83, 0x6e, 231 | 0xfa, 0xea, 0xe1, 0xd7, 0x30, 0xf0, 0x9b, 0x18, 0x25, 0xfc, 0x6b, 0x42, 0x5a, 0x3c, 0x5e, 0x3c, 232 | 0x18, 0xe7, 0xad, 0xda, 0xc2, 0xcc, 0x09, 0x04, 0xa6, 0x90, 0x91, 0xc0, 233 | // frame#1 234 | 0xff, 0xf1, 0x50, 0x80, 235 | }); err != nil { 236 | t.Error("fill failed, err is", err) 237 | return 238 | } else if len(b) != 4096 { 239 | t.Error("pcm size invalid, expect 4096, actual is", len(b)) 240 | return 241 | } 242 | 243 | // this will drop frame#1 and cause sync error. 244 | // but we fix it, so it will return an empty pcm 245 | // and the frame#1 is keep in internal buffer. 246 | if _, err := d.Decode(nil); err != nil { 247 | t.Error("fill failed, err is", err) 248 | return 249 | } 250 | 251 | if b, err := d.Decode([]byte{ 252 | // frame#1 continue 253 | 0x0d, 0x40, 0xfc, 0x21, 0x17, 0x55, 0x45, 0x95, 0x18, 0x2c, 0x05, 0x44, 0x10, 0x00, 0xd6, 0x97, 254 | 0x40, 0x7b, 0xe4, 0xb1, 0xcb, 0xcb, 0xd1, 0xa8, 0xc6, 0x40, 0x7d, 0x7c, 0xb3, 0x64, 0xd1, 0x4a, 255 | 0xdc, 0x48, 0x53, 0xfc, 0x32, 0xaa, 0x0a, 0xe9, 0x25, 0xca, 0x7b, 0x4e, 0x5a, 0xa7, 0x4b, 0x52, 256 | 0x96, 0xce, 0xee, 0x5a, 0xe8, 0xde, 0xe6, 0x0c, 0x7f, 0xc0, 0x70, 0x10, 0x6d, 0x54, 0x10, 0x12, 257 | 0x0c, 0xc0, 0x52, 0x4b, 0x04, 0xe0, 0x31, 0x18, 0x08, 0x44, 0x00, 0x00, 0x3a, 0x5e, 0x82, 0xff, 258 | 0xc8, 0xe9, 0x6b, 0x77, 0x18, 0xdd, 0x64, 0xe6, 0x00, 0x15, 0x88, 0x02, 0x62, 0x74, 0x3d, 0xd3, 259 | 0x90, 0x02, 0x65, 0x98, 0x80, 0x1c, 260 | // frame#2, decoded 261 | 0xff, 0xf1, 0x50, 0x80, 0x0e, 0x60, 0xfc, 262 | 0x21, 0x17, 0x55, 0x45, 0x0d, 0x88, 0x90, 0x13, 0x04, 0x2c, 0xa4, 0x01, 0x01, 0xd0, 0x20, 0x3e, 263 | 0x27, 0x6d, 0x38, 0x35, 0x4a, 0x0b, 0x59, 0xb5, 0xde, 0x8d, 0xad, 0x72, 0x7b, 0xa6, 0xe4, 0xd7, 264 | 0xbe, 0x0c, 0xfa, 0xe8, 0x0e, 0x1d, 0xaa, 0xc7, 0x0a, 0x44, 0xd2, 0x33, 0x81, 0xd8, 0x24, 0x81, 265 | 0xd4, 0xc1, 0x76, 0x9b, 0x5b, 0x88, 0x58, 0x9c, 0x23, 0x82, 0xf5, 0x2c, 0x26, 0x04, 0x94, 0x80, 266 | 0xab, 0x7b, 0x28, 0x0a, 0x66, 0x30, 0x90, 0x0a, 0x6a, 0x02, 0x16, 0xb0, 0x50, 0x06, 0x83, 0x6e, 267 | 0xfa, 0xea, 0xe1, 0xd7, 0x30, 0xf0, 0x9b, 0x18, 0x25, 0xfc, 0x6b, 0x42, 0x5a, 0x3c, 0x5e, 0x3c, 268 | 0x18, 0xe7, 0xad, 0xda, 0xc2, 0xcc, 0x09, 0x04, 0xa6, 0x90, 0x91, 0xc0, 269 | }); err != nil { 270 | t.Error("fill failed, err is", err) 271 | return 272 | } else if len(b) != 4096 { 273 | t.Error("pcm size invalid, expect 4096, actual is", len(b)) 274 | return 275 | } 276 | 277 | // for we fix the bug, we can got the frame#2. 278 | if b, err := d.Decode(nil); err != nil { 279 | t.Error("fill failed, err is", err) 280 | return 281 | } else if len(b) != 4096 { 282 | t.Error("pcm size invalid, expect 4096, actual is", len(b)) 283 | return 284 | } 285 | } 286 | 287 | func TestRawDecode_Partial(t *testing.T) { 288 | d := fdkaac.NewAacDecoder() 289 | 290 | asc := []byte{0x12, 0x10} 291 | if err := d.InitRaw(asc); err != nil { 292 | t.Error("init failed, err is", err) 293 | return 294 | } 295 | defer d.Close() 296 | 297 | if _, err := d.Decode([]byte{0xff, 0xf1, 0x50, 0x80, 0x0c, 0x40, 0xfc, 298 | 0x21, 0x17, 0x55, 0x35, 0xa1, 0x0c, 0x2f, 0x00, 0x00, 0x50, 0x23, 0xa6, 0x81, 0xbf, 0x9c, 0xbf, 299 | 0x13, 0x73, 0xa9, 0xb0, 0x41, 0xed, 0x60, 0x23, 0x48, 0xf7, 0x34, 0x07, 0x12, 0x53, 0xd8, 0xeb, 300 | 0x49, 0xf4, 0x1e, 0x73, 0xc9, 0x01, 0xfd, 0x16, 0x9f, 0x8e, 0xb5, 0xd5, 0x9b, 0xb6, 0x49, 0xdb, 301 | 0x35, 0x61, 0x3b, 0x54, 0xad, 0x5f, 0x9d, 0x34, 0x94, 0x88, 0x58, 0x89, 0x33, 0x54, 0x89, 0xc4, 302 | 0x09, 0x80, 0xa2, 0xa1, 0x28, 0x81, 0x42, 0x10, 0x48, 0x94, 0x05, 0xfb, 0x03, 0xc7, 0x64, 0xe1, 303 | 0x54}); err == nil { 304 | t.Error("fill failed, err is", err) 305 | return 306 | } 307 | 308 | if _, err := d.Decode([]byte{0x17, 0xf6, 0x65, 0x15, 0x00, 0x48, 0xa9, 0x80, 0x00, 0x38}); err == nil { 309 | t.Error("fill failed, err is", err) 310 | return 311 | } 312 | } 313 | -------------------------------------------------------------------------------- /fdkaac/enc.go: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2016 winlin 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | // this software and associated documentation files (the "Software"), to deal in 7 | // the Software without restriction, including without limitation the rights to 8 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | // the Software, and to permit persons to whom the Software is furnished to do so, 10 | // subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in all 13 | // copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | // The aac encoder, to encode the PCM samples to aac frame. 23 | package fdkaac 24 | 25 | /* 26 | #cgo CFLAGS: -I${SRCDIR}/../fdk-aac-lib/objs/include/fdk-aac 27 | #cgo LDFLAGS: ${SRCDIR}/../fdk-aac-lib/objs/lib/libfdk-aac.a 28 | #include "aacenc_lib.h" 29 | 30 | typedef struct { 31 | // the encoder handler. 32 | HANDLE_AACENCODER enc; 33 | 34 | // encoder info. 35 | int frame_size; 36 | 37 | // user specified params. 38 | int aot; 39 | int channels; 40 | int sample_rate; 41 | int bitrate; 42 | } aacenc_t; 43 | 44 | int aacenc_init(aacenc_t* h, int aot, int channels, int sample_rate, int bitrate) { 45 | AACENC_ERROR err = AACENC_OK; 46 | 47 | h->aot = aot; 48 | h->channels = channels; 49 | h->sample_rate = sample_rate; 50 | h->bitrate = bitrate; 51 | 52 | // AACENC_TRANSMUX 53 | // Transport type to be used. See ::TRANSPORT_TYPE in FDK_audio.h. 54 | // Following types can be configured in encoder library: 55 | // - 0: raw access units 56 | // - 1: ADIF bitstream format 57 | // - 2: ADTS bitstream format 58 | // - 6: Audio Mux Elements (LATM) with muxConfigPresent = 1 59 | // - 7: Audio Mux Elements (LATM) with muxConfigPresent = 0, out of band StreamMuxConfig 60 | // - 10: Audio Sync Stream (LOAS) 61 | int trans_mux = 2; // adts 62 | 63 | int signaling = 0; // Implicit backward compatible signaling (default for ADIF and ADTS) 64 | int afterburner = 1; // 1 or 0(default) 65 | 66 | // ------------------------------------------------------------------------------- 67 | // ChannelMode | ChCfg | front_El | side_El | back_El | lfe_El 68 | // -----------------------+--------+---------------+----------+----------+-------- 69 | // MODE_1 | 1 | SCE | | | 70 | // MODE_2 | 2 | CPE | | | 71 | // MODE_1_2 | 3 | SCE, CPE | | | 72 | // MODE_1_2_1 | 4 | SCE, CPE | | SCE | 73 | // MODE_1_2_2 | 5 | SCE, CPE | | CPE | 74 | // MODE_1_2_2_1 | 6 | SCE, CPE | | CPE | LFE 75 | // MODE_1_2_2_2_1 | 7 | SCE, CPE, CPE | | CPE | LFE 76 | // -----------------------+--------+---------------+----------+----------+-------- 77 | // MODE_7_1_REAR_SURROUND | 0 | SCE, CPE | | CPE, CPE | LFE 78 | // MODE_7_1_FRONT_CENTER | 0 | SCE, CPE, CPE | | CPE | LFE 79 | // ------------------------------------------------------------------------------- 80 | // - SCE: Single Channel Element. 81 | // - CPE: Channel Pair. 82 | // - LFE: Low Frequency Element. 83 | CHANNEL_MODE mode = MODE_INVALID; 84 | int sce = 0, cpe = 0; 85 | switch (channels) { 86 | case 1: mode = MODE_1; sce = 1; cpe = 0; break; 87 | case 2: mode = MODE_2; sce = 0; cpe = 1; break; 88 | case 3: mode = MODE_1_2; sce = 1; cpe = 1; break; 89 | case 4: mode = MODE_1_2_1; sce = 2; cpe = 1; break; 90 | case 5: mode = MODE_1_2_2; sce = 1; cpe = 2; break; 91 | case 6: mode = MODE_1_2_2_1; sce = 2; cpe = 2; break; 92 | default: 93 | return -1; 94 | } 95 | 96 | if ((err = aacEncOpen(&h->enc, 0, channels)) != AACENC_OK) { 97 | return err; 98 | } 99 | 100 | if ((err = aacEncoder_SetParam(h->enc, AACENC_AOT, aot)) != AACENC_OK) { 101 | return err; 102 | } 103 | 104 | if ((err = aacEncoder_SetParam(h->enc, AACENC_SAMPLERATE, sample_rate)) != AACENC_OK) { 105 | return err; 106 | } 107 | 108 | if ((err = aacEncoder_SetParam(h->enc, AACENC_CHANNELMODE, mode)) != AACENC_OK) { 109 | return err; 110 | } 111 | 112 | // Input audio data channel ordering scheme: 113 | // - 0: MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE). (default) 114 | // - 1: WAVE file format channel ordering (e. g. 5.1: L, R, C, LFE, SL, SR). 115 | if ((err = aacEncoder_SetParam(h->enc, AACENC_CHANNELORDER, 1)) != AACENC_OK) { 116 | return err; 117 | } 118 | 119 | if ((err = aacEncoder_SetParam(h->enc, AACENC_BITRATE, bitrate)) != AACENC_OK) { 120 | return err; 121 | } 122 | 123 | if ((err = aacEncoder_SetParam(h->enc, AACENC_TRANSMUX, trans_mux)) != AACENC_OK) { 124 | return err; 125 | } 126 | 127 | if ((err = aacEncoder_SetParam(h->enc, AACENC_SIGNALING_MODE, signaling)) != AACENC_OK) { 128 | return err; 129 | } 130 | 131 | if ((err = aacEncoder_SetParam(h->enc, AACENC_AFTERBURNER, afterburner)) != AACENC_OK) { 132 | return err; 133 | } 134 | 135 | if ((err = aacEncEncode(h->enc, NULL, NULL, NULL, NULL)) != AACENC_OK) { 136 | return err; 137 | } 138 | 139 | AACENC_InfoStruct info; 140 | if ((err = aacEncInfo(h->enc, &info)) != AACENC_OK) { 141 | return err; 142 | } 143 | 144 | h->frame_size = info.frameLength; 145 | 146 | return err; 147 | } 148 | 149 | void aacenc_close(aacenc_t* h) { 150 | aacEncClose(&h->enc); 151 | } 152 | 153 | int aacenc_encode(aacenc_t*h, char* pcm, int nb_pcm, int nb_samples, char* aac, int* pnb_aac) { 154 | AACENC_ERROR err = AACENC_OK; 155 | 156 | INT iidentify = IN_AUDIO_DATA; 157 | INT oidentify = OUT_BITSTREAM_DATA; 158 | 159 | INT ibuffer_element_size = 2; // 16bits. 160 | INT ibuffer_size = 2 * h->channels * nb_samples; 161 | 162 | // The intput pcm must be resampled to fit the encoder, 163 | // for example, the intput is 2channels but encoder is 1channels, 164 | // then we should resample the intput pcm to 1channels 165 | // to make the intput pcm size equals to the encoder calculated size(ibuffer_size). 166 | if (ibuffer_size != nb_pcm) { 167 | return -1; 168 | } 169 | 170 | AACENC_BufDesc ibuf = {0}; 171 | if (pcm) { 172 | ibuf.numBufs = 1; 173 | ibuf.bufs = (void**)&pcm; 174 | ibuf.bufferIdentifiers = &iidentify; 175 | ibuf.bufSizes = &ibuffer_size; 176 | ibuf.bufElSizes = &ibuffer_element_size; 177 | } 178 | 179 | AACENC_InArgs iargs = {0}; 180 | if (pcm) { 181 | iargs.numInSamples = h->channels * nb_samples; 182 | } else { 183 | iargs.numInSamples = -1; 184 | } 185 | 186 | INT obuffer_element_size = 1; 187 | INT obuffer_size = *pnb_aac; 188 | 189 | AACENC_BufDesc obuf = {0}; 190 | obuf.numBufs = 1; 191 | obuf.bufs = (void**)&aac; 192 | obuf.bufferIdentifiers = &oidentify; 193 | obuf.bufSizes = &obuffer_size; 194 | obuf.bufElSizes = &obuffer_element_size; 195 | 196 | AACENC_OutArgs oargs = {0}; 197 | 198 | if ((err = aacEncEncode(h->enc, &ibuf, &obuf, &iargs, &oargs)) != AACENC_OK) { 199 | // Flush ok, no bytes to output anymore. 200 | if (!pcm && err == AACENC_ENCODE_EOF) { 201 | *pnb_aac = 0; 202 | return AACENC_OK; 203 | } 204 | return err; 205 | } 206 | 207 | *pnb_aac = oargs.numOutBytes; 208 | 209 | return err; 210 | } 211 | 212 | int aacenc_frame_size(aacenc_t* h) { 213 | return h->frame_size; 214 | } 215 | 216 | int aacenc_max_output_buffer_size(aacenc_t* h) { 217 | // The maximum packet size is 8KB aka 768 bytes per channel. 218 | INT obuffer_size = 8192; 219 | if (h->channels * 768 > obuffer_size) { 220 | obuffer_size = h->channels * 768; 221 | } 222 | return obuffer_size; 223 | } 224 | */ 225 | import "C" 226 | import ( 227 | "fmt" 228 | "unsafe" 229 | ) 230 | 231 | // The AAC encoder, input is PCM samples, output AAC frame in ADTS. 232 | type AacEncoder struct { 233 | m C.aacenc_t 234 | channels int 235 | } 236 | 237 | func NewAacEncoder() *AacEncoder { 238 | return &AacEncoder{} 239 | } 240 | 241 | // Initialize the encoder in LC profile. 242 | // @remark the encoder use sampleRate and channels, user should resample the PCM to fit it, 243 | // that is, the channels and sampleRate of PCM should always equals to encoder's. 244 | // @remark for the fdkaac always use 16bits sample, so the bits of pcm always 16, 245 | // which must be: [SHORT PCM] [SHORT PCM] ... ... 246 | func (v *AacEncoder) InitLc(channels, sampleRate, bitrateBps int) (err error) { 247 | v.channels = channels 248 | 249 | aot := int(2) // AOT_AAC_LC 250 | r := C.aacenc_init(&v.m, C.int(aot), C.int(channels), C.int(sampleRate), C.int(bitrateBps)) 251 | if int(r) != 0 { 252 | return fmt.Errorf("Initialize encoder failed, code=%v", int(r)) 253 | } 254 | return 255 | } 256 | 257 | func (v *AacEncoder) Close() error { 258 | C.aacenc_close(&v.m) 259 | return nil 260 | } 261 | 262 | // Encode the pcm to aac, pcm must contains bytes for one aac frame, 263 | // that is the bytes must be NbBytesPerFrame(). 264 | // @remark fdkaac always use 16bits pcm, so the bits of pcm always 16. 265 | // @remark user should resample the pcm to fit the encoder, so the channels of pcm equals to encoder's. 266 | // @remark user should resample the pcm to fit the encoder, so the sampleRate of pcm equals to encoder's. 267 | // @return when aac is nil, encoded completed(the Flush() return nil also), 268 | // because we will flush the encoder automatically to got the last frames. 269 | func (v *AacEncoder) Encode(pcm []byte) (aac []byte, err error) { 270 | if frameBytes := 2 * v.channels * v.FrameSize(); frameBytes != len(pcm) { 271 | return nil, fmt.Errorf("PCM must be one frame 2*%v*%v=%v, actual=%v", 272 | v.channels, v.FrameSize(), frameBytes, len(pcm)) 273 | } 274 | 275 | // The maximum packet size is 8KB aka 768 bytes per channel. 276 | nbAac := int(C.aacenc_max_output_buffer_size(&v.m)) 277 | aac = make([]byte, nbAac) 278 | 279 | pAac := (*C.char)(unsafe.Pointer(&aac[0])) 280 | pAacSize := C.int(nbAac) 281 | 282 | pPcm := (*C.char)(unsafe.Pointer(&pcm[0])) 283 | pPcmSize := C.int(len(pcm)) 284 | pNbSamples := C.int(v.FrameSize()) 285 | 286 | r := C.aacenc_encode(&v.m, pPcm, pPcmSize, pNbSamples, pAac, &pAacSize) 287 | if int(r) != 0 { 288 | return nil, fmt.Errorf("Encode failed, code=%v", int(r)) 289 | } 290 | 291 | valid := int(pAacSize) 292 | 293 | // when got nil packet, flush encoder. 294 | if valid == 0 { 295 | return v.Flush() 296 | } 297 | 298 | return aac[0:valid], nil 299 | } 300 | 301 | // Flush the encoder to get the cached aac frames. 302 | // @return when aac is nil, flush ok, should never flush anymore. 303 | func (v *AacEncoder) Flush() (aac []byte, err error) { 304 | // The maximum packet size is 8KB aka 768 bytes per channel. 305 | nbAac := int(C.aacenc_max_output_buffer_size(&v.m)) 306 | aac = make([]byte, nbAac) 307 | 308 | pAac := (*C.char)(unsafe.Pointer(&aac[0])) 309 | pAacSize := C.int(nbAac) 310 | 311 | r := C.aacenc_encode(&v.m, nil, 0, 0, pAac, &pAacSize) 312 | if int(r) != 0 { 313 | return nil, fmt.Errorf("Flush failed, code=%v", int(r)) 314 | } 315 | 316 | valid := int(pAacSize) 317 | if valid == 0 { 318 | return nil, nil 319 | } 320 | 321 | return aac[0:valid], nil 322 | } 323 | 324 | // Get the channels of encoder. 325 | func (v *AacEncoder) Channels() int { 326 | return v.channels 327 | } 328 | 329 | // Get the frame size of encoder. 330 | func (v *AacEncoder) FrameSize() int { 331 | return int(C.aacenc_frame_size(&v.m)) 332 | } 333 | 334 | // Get the number of bytes per a aac frame. 335 | func (v *AacEncoder) NbBytesPerFrame() int { 336 | return 2 * v.channels * v.FrameSize() 337 | } 338 | -------------------------------------------------------------------------------- /fdkaac/enc_test.go: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2016 winlin 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | // this software and associated documentation files (the "Software"), to deal in 7 | // the Software without restriction, including without limitation the rights to 8 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | // the Software, and to permit persons to whom the Software is furnished to do so, 10 | // subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in all 13 | // copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | // @remark we must use another packet for utest, because the cgo will dup symbols. 23 | package fdkaac_test 24 | 25 | import ( 26 | "github.com/winlinvip/go-fdkaac/fdkaac" 27 | "testing" 28 | ) 29 | 30 | func TestLcInit(t *testing.T) { 31 | var err error 32 | 33 | e := fdkaac.NewAacEncoder() 34 | if err = e.InitLc(2, 44100, 48000); err != nil { 35 | t.Error("Init encoder failed, err is", err) 36 | return 37 | } 38 | defer e.Close() 39 | 40 | if 1024 != e.FrameSize() { 41 | t.Error("FrameSize not 1024, actual is", e.FrameSize()) 42 | return 43 | } 44 | } 45 | 46 | func TestLcEncode(t *testing.T) { 47 | var err error 48 | 49 | e := fdkaac.NewAacEncoder() 50 | if err = e.InitLc(2, 44100, 48000); err != nil { 51 | t.Error("Init encoder failed, err is", err) 52 | return 53 | } 54 | defer e.Close() 55 | 56 | if 1024 != e.FrameSize() { 57 | t.Error("FrameSize not 1024, actual is", e.FrameSize()) 58 | return 59 | } 60 | 61 | var frame []byte 62 | if frame, err = e.Encode([]byte{ 63 | 0x32, 0x04, 0xf4, 0xfd, 0x0d, 0x05, 0xaa, 0xfe, 0xfc, 0x05, 0x8b, 0xff, 0x0e, 0x07, 0x9f, 0x00, 0x44, 0x08, 0xdc, 0x01, 0x88, 0x09, 0x21, 0x03, 0xaa, 0x0a, 0x3f, 0x04, 0x75, 0x0b, 0x04, 0x05, 0xc5, 0x0b, 0x54, 0x05, 0xa0, 0x0b, 0x39, 0x05, 0x3e, 0x0b, 0xe6, 0x04, 0xf1, 0x0a, 0xa6, 0x04, 0x06, 0x0b, 0xbf, 0x04, 0x9f, 0x0b, 0x57, 0x05, 0xa7, 0x0c, 0x5f, 0x06, 0xd6, 0x0d, 0xa0, 0x07, 0xdc, 0x0e, 0xcc, 0x08, 0x7f, 0x0f, 0x9f, 0x09, 0xb5, 0x0f, 0xfc, 0x09, 0xa1, 0x0f, 0xed, 0x09, 0x7b, 0x0f, 0x9f, 0x09, 0x72, 0x0f, 0x4c, 0x09, 0x9c, 0x0f, 0x29, 0x09, 0xf5, 0x0f, 0x53, 0x09, 0x70, 0x10, 0xd0, 0x09, 0x05, 0x11, 0x91, 0x0a, 0xb7, 0x11, 0x78, 0x0b, 0x8c, 0x12, 0x63, 0x0c, 0x7b, 0x13, 0x2e, 0x0d, 0x6c, 0x14, 0xc4, 0x0d, 0x32, 0x15, 0x1d, 0x0e, 0xa9, 0x15, 0x43, 0x0e, 64 | 0xc4, 0x15, 0x4e, 0x0e, 0x98, 0x15, 0x56, 0x0e, 0x54, 0x15, 0x6e, 0x0e, 0x2c, 0x15, 0x99, 0x0e, 0x3d, 0x15, 0xcc, 0x0e, 0x81, 0x15, 0xf7, 0x0e, 0xd5, 0x15, 0x0e, 0x0f, 0x0b, 0x16, 0x0f, 0x0f, 0x04, 0x16, 0x00, 0x0f, 0xbe, 0x15, 0xe9, 0x0e, 0x53, 0x15, 0xce, 0x0e, 0xe6, 0x14, 0xab, 0x0e, 0x93, 0x14, 0x7a, 0x0e, 0x5e, 0x14, 0x36, 0x0e, 0x36, 0x14, 0xde, 0x0d, 0x02, 0x14, 0x7d, 0x0d, 0xb3, 0x13, 0x1d, 0x0d, 0x4d, 0x13, 0xc5, 0x0c, 0xec, 0x12, 0x7a, 0x0c, 0xad, 0x12, 0x3b, 0x0c, 0xa2, 0x12, 0x0a, 0x0c, 0xc0, 0x12, 0xe2, 0x0b, 0xe7, 0x12, 0xc2, 0x0b, 0xed, 0x12, 0xa0, 0x0b, 0xb2, 0x12, 0x6f, 0x0b, 0x38, 0x12, 0x25, 0x0b, 0xa0, 0x11, 0xbc, 0x0a, 0x19, 0x11, 0x3e, 0x0a, 0xca, 0x10, 0xc3, 0x09, 0xbc, 0x10, 0x65, 0x09, 0xd4, 0x10, 0x38, 0x09, 0xe6, 0x10, 0x3a, 0x09, 65 | 0xca, 0x10, 0x5a, 0x09, 0x77, 0x10, 0x7b, 0x09, 0x07, 0x10, 0x86, 0x09, 0xa5, 0x0f, 0x70, 0x09, 0x72, 0x0f, 0x3d, 0x09, 0x6b, 0x0f, 0xf6, 0x08, 0x67, 0x0f, 0x9f, 0x08, 0x2b, 0x0f, 0x34, 0x08, 0x8c, 0x0e, 0xaa, 0x07, 0x87, 0x0d, 0xf9, 0x06, 0x47, 0x0c, 0x21, 0x06, 0x0e, 0x0b, 0x31, 0x05, 0x16, 0x0a, 0x40, 0x04, 0x75, 0x09, 0x60, 0x03, 0x17, 0x09, 0x9f, 0x02, 0xd3, 0x08, 0x03, 0x02, 0x8c, 0x08, 0x8f, 0x01, 0x3e, 0x08, 0x4b, 0x01, 0x02, 0x08, 0x39, 0x01, 0xf6, 0x07, 0x56, 0x01, 0x20, 0x08, 0x8e, 0x01, 0x63, 0x08, 0xbe, 0x01, 0x8a, 0x08, 0xc3, 0x01, 0x67, 0x08, 0x86, 0x01, 0xef, 0x07, 0x0f, 0x01, 0x49, 0x07, 0x85, 0x00, 0xb7, 0x06, 0x1d, 0x00, 0x77, 0x06, 0x04, 0x00, 0x9e, 0x06, 0x48, 0x00, 0x0c, 0x07, 0xcc, 0x00, 0x78, 0x07, 0x57, 0x01, 0x98, 0x07, 0xa7, 0x01, 66 | 0x3f, 0x07, 0x90, 0x01, 0x74, 0x06, 0x0a, 0x01, 0x6c, 0x05, 0x35, 0x00, 0x6d, 0x04, 0x48, 0xff, 0xaf, 0x03, 0x7d, 0xfe, 0x4a, 0x03, 0xfd, 0xfd, 0x30, 0x03, 0xd2, 0xfd, 0x3e, 0x03, 0xeb, 0xfd, 0x4b, 0x03, 0x21, 0xfe, 0x3d, 0x03, 0x4a, 0xfe, 0x0a, 0x03, 0x42, 0xfe, 0xb7, 0x02, 0xf9, 0xfd, 0x51, 0x02, 0x75, 0xfd, 0xe5, 0x01, 0xd0, 0xfc, 0x7a, 0x01, 0x2b, 0xfc, 0x14, 0x01, 0xa6, 0xfb, 0xb5, 0x00, 0x50, 0xfb, 0x5e, 0x00, 0x2a, 0xfb, 0x11, 0x00, 0x25, 0xfb, 0xd0, 0xff, 0x2d, 0xfb, 0x9c, 0xff, 0x32, 0xfb, 0x76, 0xff, 0x29, 0xfb, 0x5a, 0xff, 0x15, 0xfb, 0x44, 0xff, 0x02, 0xfb, 0x32, 0xff, 0xfd, 0xfa, 0x27, 0xff, 0x1a, 0xfb, 0x2b, 0xff, 0x63, 0xfb, 0x47, 0xff, 0xdd, 0xfb, 0x7f, 0xff, 0x7b, 0xfc, 0xc8, 0xff, 0x1f, 0xfd, 0x0d, 0x00, 0xa2, 0xfd, 0x31, 0x00, 0xe1, 0xfd, 67 | 0x1d, 0x00, 0xca, 0xfd, 0xce, 0xff, 0x69, 0xfd, 0x54, 0xff, 0xe3, 0xfc, 0xd2, 0xfe, 0x69, 0xfc, 0x6a, 0xfe, 0x24, 0xfc, 0x32, 0xfe, 0x1f, 0xfc, 0x2a, 0xfe, 0x4d, 0xfc, 0x46, 0xfe, 0x8c, 0xfc, 0x6f, 0xfe, 0xbd, 0xfc, 0x94, 0xfe, 0xd2, 0xfc, 0xae, 0xfe, 0xd0, 0xfc, 0xb7, 0xfe, 0xc6, 0xfc, 0xa9, 0xfe, 0xbc, 0xfc, 0x7d, 0xfe, 0xb1, 0xfc, 0x2e, 0xfe, 0x9d, 0xfc, 0xc9, 0xfd, 0x80, 0xfc, 0x6d, 0xfd, 0x6e, 0xfc, 0x49, 0xfd, 0x8f, 0xfc, 0x8b, 0xfd, 0x0d, 0xfd, 0x45, 0xfe, 0xfc, 0xfd, 0x5f, 0xff, 0x47, 0xff, 0xa0, 0x00, 0xb8, 0x00, 0xbc, 0x01, 0x06, 0x02, 0x78, 0x02, 0xf8, 0x02, 0xbd, 0x02, 0x79, 0x03, 0x9c, 0x02, 0x9e, 0x03, 0x40, 0x02, 0x8e, 0x03, 0xda, 0x01, 0x73, 0x03, 0x8b, 0x01, 0x61, 0x03, 0x5f, 0x01, 0x59, 0x03, 0x52, 0x01, 0x52, 0x03, 0x5c, 0x01, 0x4a, 0x03, 68 | 0x78, 0x01, 0x4a, 0x03, 0xa0, 0x01, 0x63, 0x03, 0xcc, 0x01, 0x98, 0x03, 0xea, 0x01, 0xdd, 0x03, 0xe4, 0x01, 0x10, 0x04, 0xaa, 0x01, 0x0f, 0x04, 0x3d, 0x01, 0xc8, 0x03, 0xb5, 0x00, 0x4b, 0x03, 0x34, 0x00, 0xbf, 0x02, 0xe0, 0xff, 0x5a, 0x02, 0xcb, 0xff, 0x43, 0x02, 0xf1, 0xff, 0x89, 0x02, 0x3b, 0x00, 0x18, 0x03, 0x8a, 0x00, 0xcb, 0x03, 0xc7, 0x00, 0x78, 0x04, 0xe6, 0x00, 0x00, 0x05, 0xeb, 0x00, 0x54, 0x05, 0xe0, 0x00, 0x77, 0x05, 0xcd, 0x00, 0x77, 0x05, 0xb5, 0x00, 0x65, 0x05, 0x97, 0x00, 0x54, 0x05, 0x6d, 0x00, 0x4f, 0x05, 0x35, 0x00, 0x58, 0x05, 0xec, 0xff, 0x65, 0x05, 0x96, 0xff, 0x64, 0x05, 0x34, 0xff, 0x3e, 0x05, 0xc9, 0xfe, 0xe1, 0x04, 0x56, 0xfe, 0x4f, 0x04, 0xdc, 0xfd, 0x99, 0x03, 0x5f, 0xfd, 0xe1, 0x02, 0xea, 0xfc, 0x4d, 0x02, 0x89, 0xfc, 0xfc, 0x01, 69 | 0x4b, 0xfc, 0xf4, 0x01, 0x38, 0xfc, 0x24, 0x02, 0x44, 0xfc, 0x64, 0x02, 0x51, 0xfc, 0x83, 0x02, 0x30, 0xfc, 0x53, 0x02, 0xb8, 0xfb, 0xc0, 0x01, 0xd8, 0xfa, 0xd5, 0x00, 0xa9, 0xf9, 0xc1, 0xff, 0x6f, 0xf8, 0xc7, 0xfe, 0x7a, 0xf7, 0x29, 0xfe, 0x0a, 0xf7, 0x0c, 0xfe, 0x29, 0xf7, 0x69, 0xfe, 0xa3, 0xf7, 0x0c, 0xff, 0x1f, 0xf8, 0xa9, 0xff, 0x47, 0xf8, 0xfa, 0xff, 0xf4, 0xf7, 0xdd, 0xff, 0x3e, 0xf7, 0x5f, 0xff, 0x6f, 0xf6, 0xb8, 0xfe, 0xd7, 0xf5, 0x27, 0xfe, 0xa4, 0xf5, 0xdc, 0xfd, 0xcb, 0xf5, 0xe0, 0xfd, 0x14, 0xf6, 0x19, 0xfe, 0x3f, 0xf6, 0x5c, 0xfe, 0x29, 0xf6, 0x7e, 0xfe, 0xd8, 0xf5, 0x67, 0xfe, 0x6f, 0xf5, 0x11, 0xfe, 0x0e, 0xf5, 0x81, 0xfd, 0xb1, 0xf4, 0xbd, 0xfc, 0x33, 0xf4, 0xc9, 0xfb, 0x5f, 0xf3, 0xae, 0xfa, 0x1e, 0xf2, 0x7a, 0xf9, 0x89, 0xf0, 0x47, 0xf8, 70 | 0xe8, 0xee, 0x30, 0xf7, 0x8f, 0xed, 0x48, 0xf6, 0xb6, 0xec, 0x91, 0xf5, 0x5a, 0xec, 0x00, 0xf5, 0x45, 0xec, 0x88, 0xf4, 0x2c, 0xec, 0x23, 0xf4, 0xda, 0xeb, 0xd8, 0xf3, 0x4b, 0xeb, 0xb2, 0xf3, 0xaa, 0xea, 0xb6, 0xf3, 0x2d, 0xea, 0xd7, 0xf3, 0xf6, 0xe9, 0xf7, 0xf3, 0xfc, 0xe9, 0xf0, 0xf3, 0x0a, 0xea, 0xab, 0xf3, 0xe5, 0xe9, 0x26, 0xf3, 0x6a, 0xe9, 0x78, 0xf2, 0xa5, 0xe8, 0xc7, 0xf1, 0xc8, 0xe7, 0x2f, 0xf1, 0x12, 0xe7, 0xc0, 0xf0, 0xaf, 0xe6, 0x73, 0xf0, 0xa1, 0xe6, 0x38, 0xf0, 0xc1, 0xe6, 0xff, 0xef, 0xd6, 0xe6, 0xbd, 0xef, 0xb1, 0xe6, 0x6c, 0xef, 0x47, 0xe6, 0x0a, 0xef, 0xad, 0xe5, 0x96, 0xee, 0x0d, 0xe5, 0x0f, 0xee, 0x89, 0xe4, 0x7c, 0xed, 0x2b, 0xe4, 0xe6, 0xec, 0xdc, 0xe3, 0x5e, 0xec, 0x7c, 0xe3, 0xef, 0xeb, 0xf1, 0xe2, 0x9a, 0xeb, 0x41, 0xe2, 0x59, 0xeb, 71 | 0x93, 0xe1, 0x22, 0xeb, 0x18, 0xe1, 0xf1, 0xea, 0xf4, 0xe0, 0xca, 0xea, 0x26, 0xe1, 0xba, 0xea, 0x83, 0xe1, 0xc9, 0xea, 0xca, 0xe1, 0xf4, 0xea, 0xc9, 0xe1, 0x2a, 0xeb, 0x76, 0xe1, 0x56, 0xeb, 0xfb, 0xe0, 0x67, 0xeb, 0xa2, 0xe0, 0x63, 0xeb, 0xae, 0xe0, 0x61, 0xeb, 0x41, 0xe1, 0x87, 0xeb, 0x48, 0xe2, 0xf8, 0xeb, 0x8e, 0xe3, 0xc1, 0xec, 0xd5, 0xe4, 0xdb, 0xed, 0xf6, 0xe5, 0x23, 0xef, 0xe6, 0xe6, 0x6a, 0xf0, 0xad, 0xe7, 0x7b, 0xf1, 0x4f, 0xe8, 0x28, 0xf2, 0xc0, 0xe8, 0x5b, 0xf2, 0xeb, 0xe8, 0x1a, 0xf2, 0xca, 0xe8, 0x93, 0xf1, 0x7d, 0xe8, 0x11, 0xf1, 0x4b, 0xe8, 0xed, 0xf0, 0x88, 0xe8, 0x6d, 0xf1, 0x6c, 0xe9, 0xa2, 0xf2, 0xe7, 0xea, 0x5f, 0xf4, 0xa5, 0xec, 0x40, 0xf6, 0x29, 0xee, 0xce, 0xf7, 0x06, 0xef, 0xb0, 0xf8, 0x18, 0xef, 0xd0, 0xf8, 0x92, 0xee, 0x66, 0xf8, 72 | 0xea, 0xed, 0xdf, 0xf7, 0xa1, 0xed, 0xae, 0xf7, 0x0e, 0xee, 0x24, 0xf8, 0x3d, 0xef, 0x53, 0xf9, 0xf8, 0xf0, 0x10, 0xfb, 0xeb, 0xf2, 0x0e, 0xfd, 0xcc, 0xf4, 0x02, 0xff, 0x76, 0xf6, 0xb9, 0x00, 0xed, 0xf7, 0x21, 0x02, 0x44, 0xf9, 0x47, 0x03, 0x8c, 0xfa, 0x3f, 0x04, 0xc7, 0xfb, 0x22, 0x05, 0xea, 0xfc, 0xfe, 0x05, 0xec, 0xfd, 0xe0, 0x06, 0xd0, 0xfe, 0xcc, 0x07, 0xab, 0xff, 0xc8, 0x08, 0x9a, 0x00, 0xd6, 0x09, 0xb4, 0x01, 0xf9, 0x0a, 0x02, 0x03, 0x2e, 0x0c, 0x75, 0x04, 0x72, 0x0d, 0xf0, 0x05, 0xbc, 0x0e, 0x4e, 0x07, 0xff, 0x0f, 0x73, 0x08, 0x2d, 0x11, 0x4b, 0x09, 0x36, 0x12, 0xd9, 0x09, 0x0d, 0x13, 0x2a, 0x0a, 0xae, 0x13, 0x5b, 0x0a, 0x1c, 0x14, 0x82, 0x0a, 0x61, 0x14, 0xae, 0x0a, 0x86, 0x14, 0xdb, 0x0a, 0x8d, 0x14, 0xfb, 0x0a, 0x77, 0x14, 0xf8, 0x0a, 0x44, 0x14, 73 | 0xc8, 0x0a, 0xfa, 0x13, 0x75, 0x0a, 0xa8, 0x13, 0x18, 0x0a, 0x61, 0x13, 0xd0, 0x09, 0x2e, 0x13, 0xb1, 0x09, 0x0e, 0x13, 0xbb, 0x09, 0xed, 0x12, 0xdc, 0x09, 0xb6, 0x12, 0xf7, 0x09, 0x5b, 0x12, 0xf5, 0x09, 0xe6, 0x11, 0xd4, 0x09, 0x70, 0x11, 0xa5, 0x09, 0x1c, 0x11, 0x82, 0x09, 0x05, 0x11, 0x8b, 0x09, 0x31, 0x11, 0xcf, 0x09, 0x94, 0x11, 0x55, 0x0a, 0x1d, 0x12, 0x13, 0x0b, 0xb9, 0x12, 0xf5, 0x0b, 0x61, 0x13, 0xdb, 0x0c, 0x0d, 0x14, 0x9f, 0x0d, 0xae, 0x14, 0x14, 0x0e, 0x24, 0x15, 0x15, 0x0e, 0x48, 0x15, 0x8e, 0x0d, 0xf3, 0x14, 0x84, 0x0c, 0x16, 0x14, 0x16, 0x0b, 0xbe, 0x12, 0x74, 0x09, 0x16, 0x11, 0xd4, 0x07, 0x54, 0x0f, 0x60, 0x06, 0xab, 0x0d, 0x35, 0x05, 0x41, 0x0c, 0x64, 0x04, 0x31, 0x0b, 0xf7, 0x03, 0x89, 0x0a, 0xf5, 0x03, 0x50, 0x0a, 0x54, 0x04, 0x81, 0x0a, 74 | 0x01, 0x05, 0x03, 0x0b, 0xd5, 0x05, 0xac, 0x0b, 0xa0, 0x06, 0x45, 0x0c, 0x3b, 0x07, 0x9f, 0x0c, 0x96, 0x07, 0xa7, 0x0c, 0xb6, 0x07, 0x66, 0x0c, 0xae, 0x07, 0xfb, 0x0b, 0x8b, 0x07, 0x82, 0x0b, 0x43, 0x07, 0x02, 0x0b, 0xba, 0x06, 0x63, 0x0a, 0xd0, 0x05, 0x83, 0x09, 0x7d, 0x04, 0x49, 0x08, 0xe1, 0x02, 0xc0, 0x06, 0x3e, 0x01, 0x1a, 0x05, 0xe7, 0xff, 0xa4, 0x03, 0x1c, 0xff, 0xa2, 0x02, 0xf4, 0xfe, 0x3a, 0x02, 0x56, 0xff, 0x66, 0x02, 0x08, 0x00, 0xff, 0x02, 0xc7, 0x00, 0xc7, 0x03, 0x61, 0x01, 0x80, 0x04, 0xb6, 0x01, 0xf5, 0x04, 0xb9, 0x01, 0xfc, 0x04, 0x67, 0x01, 0x7e, 0x04, 0xc3, 0x00, 0x76, 0x03, 0xd7, 0xff, 0xfe, 0x01, 0xc0, 0xfe, 0x52, 0x00, 0xad, 0xfd, 0xc7, 0xfe, 0xdc, 0xfc, 0xb4, 0xfd, 0x88, 0xfc, 0x52, 0xfd, 0xd2, 0xfc, 0xaa, 0xfd, 0xb7, 0xfd, 0x8f, 0xfe, 75 | 0x0a, 0xff, 0xb3, 0xff, 0x89, 0x00, 0xc6, 0x00, 0xee, 0x01, 0x98, 0x01, 0x09, 0x03, 0x23, 0x02, 0xce, 0x03, 0x8a, 0x02, 0x51, 0x04, 0xf9, 0x02, 0xb9, 0x04, 0x90, 0x03, 0x2b, 0x05, 0x4d, 0x04, 0xb5, 0x05, 0x0e, 0x05, 0x41, 0x06, 0x9d, 0x05, 0xa3, 0x06, 0xcb, 0x05, 0xaa, 0x06, 0x83, 0x05, 0x3b, 0x06, 0xd2, 0x04, 0x68, 0x05, 0xe9, 0x03, 0x73, 0x04, 0x07, 0x03, 0xaf, 0x03, 0x68, 0x02, 0x63, 0x03, 0x30, 0x02, 0xa9, 0x03, 0x5f, 0x02, 0x60, 0x04, 0xd8, 0x02, 0x40, 0x05, 0x6a, 0x03, 0x01, 0x06, 0xeb, 0x03, 0x7e, 0x06, 0x45, 0x04, 0xc8, 0x06, 0x7b, 0x04, 0x13, 0x07, 0xa4, 0x04, 0x92, 0x07, 0xd9, 0x04, 0x57, 0x08, 0x2b, 0x05, 0x47, 0x09, 0x9b, 0x05, 0x2c, 0x0a, 0x20, 0x06, 0xd8, 0x0a, 0xb1, 0x06, 0x4a, 0x0b, 0x4d, 0x07, 0xab, 0x0b, 0xf8, 0x07, 0x33, 0x0c, 0xae, 0x08, 76 | 0xfd, 0x0c, 0x5e, 0x09, 0xef, 0x0d, 0xe7, 0x09, 0xb7, 0x0e, 0x27, 0x0a, 0xfa, 0x0e, 0x0c, 0x0a, 0x87, 0x0e, 0x9e, 0x09, 0x76, 0x0d, 0x01, 0x09, 0x27, 0x0c, 0x64, 0x08, 0x13, 0x0b, 0xee, 0x07, 0x95, 0x0a, 0xae, 0x07, 0xbe, 0x0a, 0x9c, 0x07, 0x55, 0x0b, 0xa2, 0x07, 0xfa, 0x0b, 0xb3, 0x07, 0x5e, 0x0c, 0xd0, 0x07, 0x66, 0x0c, 0x00, 0x08, 0x36, 0x0c, 0x49, 0x08, 0x0d, 0x0c, 0xa1, 0x08, 0x1e, 0x0c, 0xed, 0x08, 0x6e, 0x0c, 0x0a, 0x09, 0xd3, 0x0c, 0xe0, 0x08, 0x08, 0x0d, 0x6e, 0x08, 0xdb, 0x0c, 0xca, 0x07, 0x48, 0x0c, 0x19, 0x07, 0x7d, 0x0b, 0x7d, 0x06, 0xc5, 0x0a, 0x0f, 0x06, 0x68, 0x0a, 0xde, 0x05, 0x84, 0x0a, 0xeb, 0x05, 0x0c, 0x0b, 0x38, 0x06, 0xcf, 0x0b, 0xbf, 0x06, 0x96, 0x0c, 0x7a, 0x07, 0x48, 0x0d, 0x5d, 0x08, 0xf6, 0x0d, 0x63, 0x09, 0xd1, 0x0e, 0x90, 0x0a, 77 | 0x10, 0x10, 0xf5, 0x0b, 0xca, 0x11, 0xa3, 0x0d, 0xdf, 0x13, 0x9a, 0x0f, 0xfc, 0x15, 0xb6, 0x11, 0xb5, 0x17, 0xad, 0x13, 0xba, 0x18, 0x25, 0x15, 0xf3, 0x18, 0xdb, 0x15, 0x96, 0x18, 0xc8, 0x15, 0x0f, 0x18, 0x33, 0x15, 0xd3, 0x17, 0x96, 0x14, 0x2f, 0x18, 0x72, 0x14, 0x29, 0x19, 0x12, 0x15, 0x89, 0x1a, 0x6c, 0x16, 0xf8, 0x1b, 0x29, 0x18, 0x28, 0x1d, 0xcb, 0x19, 0xf8, 0x1d, 0xeb, 0x1a, 0x79, 0x1e, 0x64, 0x1b, 0xd4, 0x1e, 0x5c, 0x1b, 0x34, 0x1f, 0x27, 0x1b, 0xac, 0x1f, 0x1d, 0x1b, 0x2f, 0x20, 0x6e, 0x1b, 0xa2, 0x20, 0x13, 0x1c, 0xed, 0x20, 0xd5, 0x1c, 0x02, 0x21, 0x6f, 0x1d, 0xe3, 0x20, 0xac, 0x1d, 0x9b, 0x20, 0x7a, 0x1d, 0x33, 0x20, 0xf1, 0x1c, 0xb6, 0x1f, 0x42, 0x1c, 0x31, 0x1f, 0xa5, 0x1b, 0xb6, 0x1e, 0x45, 0x1b, 0x5b, 0x1e, 0x31, 0x1b, 0x2e, 0x1e, 0x60, 0x1b, 78 | 0x2a, 0x1e, 0xae, 0x1b, 0x36, 0x1e, 0xef, 0x1b, 0x2b, 0x1e, 0xf7, 0x1b, 0xe6, 0x1d, 0xae, 0x1b, 0x55, 0x1d, 0x0c, 0x1b, 0x81, 0x1c, 0x1f, 0x1a, 0x83, 0x1b, 0x02, 0x19, 0x79, 0x1a, 0xd2, 0x17, 0x7c, 0x19, 0xad, 0x16, 0x9a, 0x18, 0xa8, 0x15, 0xd4, 0x17, 0xcf, 0x14, 0x28, 0x17, 0x22, 0x14, 0x8e, 0x16, 0x92, 0x13, 0xf3, 0x15, 0xfd, 0x12, 0x3d, 0x15, 0x39, 0x12, 0x50, 0x14, 0x23, 0x11, 0x17, 0x13, 0xb0, 0x0f, 0x9b, 0x11, 0xff, 0x0d, 0x05, 0x10, 0x51, 0x0c, 0x97, 0x0e, 0xf5, 0x0a, 0x94, 0x0d, 0x2d, 0x0a, 0x21, 0x0d, 0x0b, 0x0a, 0x39, 0x0d, 0x71, 0x0a, 0xa9, 0x0d, 0x18, 0x0b, 0x2c, 0x0e, 0xb0, 0x0b, 0x80, 0x0e, 0xfa, 0x0b, 0x7b, 0x0e, 0xde, 0x0b, 0x0c, 0x0e, 0x5d, 0x0b, 0x37, 0x0d, 0x87, 0x0a, 0x05, 0x0c, 0x69, 0x09, 0x80, 0x0a, 0x09, 0x08, 0xbc, 0x08, 0x6f, 0x06, 79 | 0xde, 0x06, 0xb2, 0x04, 0x1e, 0x05, 0xf8, 0x02, 0xb8, 0x03, 0x75, 0x01, 0xd2, 0x02, 0x4f, 0x00, 0x6a, 0x02, 0x8e, 0xff, 0x4f, 0x02, 0x16, 0xff, 0x32, 0x02, 0xb0, 0xfe, 0xc2, 0x01, 0x1f, 0xfe, 0xcf, 0x00, 0x38, 0xfd, 0x5b, 0xff, 0xef, 0xfb, 0x95, 0xfd, 0x56, 0xfa, 0xc5, 0xfb, 0x9a, 0xf8, 0x32, 0xfa, 0xf1, 0xf6, 0x0d, 0xf9, 0x90, 0xf5, 0x6a, 0xf8, 0xa7, 0xf4, 0x43, 0xf8, 0x51, 0xf4, 0x7b, 0xf8, 0x90, 0xf4, 0xed, 0xf8, 0x45, 0xf5, 0x6e, 0xf9, 0x32, 0xf6, 0xd8, 0xf9, 0x0e, 0xf7, 0x12, 0xfa, 0x9c, 0xf7, 0x16, 0xfa, 0xbd, 0xf7, 0xf0, 0xf9, 0x82, 0xf7, 0xbe, 0xf9, 0x1e, 0xf7, 0x9c, 0xf9, 0xce, 0xf6, 0x9f, 0xf9, 0xc2, 0xf6, 0xcd, 0xf9, 0x09, 0xf7, 0x1f, 0xfa, 0x8e, 0xf7, 0x86, 0xfa, 0x2b, 0xf8, 0xf2, 0xfa, 0xb7, 0xf8, 0x57, 0xfb, 0x16, 0xf9, 0xaf, 0xfb, 0x43, 0xf9, 80 | 0xf3, 0xfb, 0x45, 0xf9, 0x24, 0xfc, 0x31, 0xf9, 0x4b, 0xfc, 0x24, 0xf9, 0x7b, 0xfc, 0x3a, 0xf9, 0xce, 0xfc, 0x8d, 0xf9, 0x55, 0xfd, 0x28, 0xfa, 0x11, 0xfe, 0x04, 0xfb, 0xea, 0xfe, 0xfe, 0xfb, 0xb6, 0xff, 0xe8, 0xfc, 0x48, 0x00, 0x94, 0xfd, 0x88, 0x00, 0xe9, 0xfd, 0x7d, 0x00, 0xf1, 0xfd, 0x47, 0x00, 0xd1, 0xfd, 0x1a, 0x00, 0xbe, 0xfd, 0x1e, 0x00, 0xe8, 0xfd, 0x69, 0x00, 0x68, 0xfe, 0xf8, 0x00, 0x3f, 0xff, 0xbb, 0x01, 0x58, 0x00, 0xa0, 0x02, 0x95, 0x01, 0x98, 0x03, 0xd6, 0x02, 0x99, 0x04, 0x02, 0x04, 0x98, 0x05, 0x04, 0x05, 0x84, 0x06, 0xcf, 0x05, 0x45, 0x07, 0x5f, 0x06, 0xc5, 0x07, 0xbb, 0x06, 0xf3, 0x07, 0xea, 0x06, 0xca, 0x07, 0xf1, 0x06, 0x4f, 0x07, 0xc6, 0x06, 0x8e, 0x06, 0x54, 0x06, 0x9b, 0x05, 0x88, 0x05, 0x91, 0x04, 0x67, 0x04, 0x95, 0x03, 0x1c, 0x03, 81 | 0xd0, 0x02, 0xf5, 0x01, 0x65, 0x02, 0x46, 0x01, 0x61, 0x02, 0x4b, 0x01, 0xb8, 0x02, 0x01, 0x02, 0x44, 0x03, 0x28, 0x03, 0xd7, 0x03, 0x59, 0x04, 0x4a, 0x04, 0x34, 0x05, 0x8b, 0x04, 0x8d, 0x05, 0x9b, 0x04, 0x72, 0x05, 0x84, 0x04, 0x20, 0x05, 0x4c, 0x04, 0xd8, 0x04, 0xee, 0x03, 0xba, 0x04, 0x63, 0x03, 0xb9, 0x04, 0xa9, 0x02, 0xa7, 0x04, 0xd2, 0x01, 0x5a, 0x04, 0xf9, 0x00, 0xc0, 0x03, 0x3b, 0x00, 0xf1, 0x02, 0xa0, 0xff, 0x18, 0x02, 0x21, 0xff, 0x5f, 0x01, 0xa7, 0xfe, 0xda, 0x00, 0x2a, 0xfe, 0x84, 0x00, 0xbc, 0xfd, 0x57, 0x00, 0x8f, 0xfd, 0x58, 0x00, 0xda, 0xfd, 0xa5, 0x00, 0xc2, 0xfe, 0x64, 0x01, 0x3c, 0x00, 0xaa, 0x02, 0x0b, 0x02, 0x60, 0x04, 0xcc, 0x03, 0x39, 0x06, 0x1d, 0x05, 0xc4, 0x07, 0xb3, 0x05, 0x92, 0x08, 0x6f, 0x05, 0x5f, 0x08, 0x5c, 0x04, 0x2a, 0x07, 82 | 0xa5, 0x02, 0x3a, 0x05, 0x86, 0x00, 0xfd, 0x02, 0x46, 0xfe, 0xe7, 0x00, 0x28, 0xfc, 0x45, 0xff, 0x68, 0xfa, 0x2b, 0xfe, 0x2d, 0xf9, 0x7c, 0xfd, 0x7a, 0xf8, 0xfd, 0xfc, 0x2a, 0xf8, 0x79, 0xfc, 0x01, 0xf8, 0xda, 0xfb, 0xbd, 0xf7, 0x2d, 0xfb, 0x37, 0xf7, 0x91, 0xfa, 0x70, 0xf6, 0x22, 0xfa, 0x90, 0xf5, 0xe4, 0xf9, 0xcf, 0xf4, 0xbd, 0xf9, 0x60, 0xf4, 0x8b, 0xf9, 0x57, 0xf4, 0x3b, 0xf9, 0xac, 0xf4, 0xe1, 0xf8, 0x43, 0xf5, 0xae, 0xf8, 0xf7, 0xf5, 0xd9, 0xf8, 0xa8, 0xf6, 0x74, 0xf9, 0x36, 0xf7, 0x54, 0xfa, 0x7a, 0xf7, 0x0f, 0xfb, 0x47, 0xf7, 0x28, 0xfb, 0x71, 0xf6, 0x40, 0xfa, 0xe5, 0xf4, 0x46, 0xf8, 0xbb, 0xf2, 0x89, 0xf5, 0x3a, 0xf0, 0x97, 0xf2, 0xcc, 0xed, 0x0a, 0xf0, 0xe2, 0xeb, 0x53, 0xee, 0xc3, 0xea, 0x8f, 0xed, 0x7b, 0xea, 0x91, 0xed, 0xc8, 0xea, 0xf2, 0xed, 83 | 0x31, 0xeb, 0x3a, 0xee, 0x2e, 0xeb, 0x03, 0xee, 0x52, 0xea, 0x08, 0xed, 0x75, 0xe8, 0x34, 0xeb, 0xc2, 0xe5, 0xa5, 0xe8, 0xb0, 0xe2, 0xad, 0xe5, 0xd7, 0xdf, 0xc2, 0xe2, 0xc4, 0xdd, 0x67, 0xe0, 0xc6, 0xdc, 0x05, 0xdf, 0xd6, 0xdc, 0xc0, 0xde, 0xa9, 0xdd, 0x6e, 0xdf, 0xc9, 0xde, 0x9c, 0xe0, 0xca, 0xdf, 0xbc, 0xe1, 0x66, 0xe0, 0x55, 0xe2, 0x90, 0xe0, 0x33, 0xe2, 0x59, 0xe0, 0x67, 0xe1, 0xd7, 0xdf, 0x33, 0xe0, 0x14, 0xdf, 0xdd, 0xde, 0x08, 0xde, 0x8f, 0xdd, 0xb1, 0xdc, 0x50, 0xdc, 0x2c, 0xdb, 0x18, 0xdb, 0xb9, 0xd9, 0xeb, 0xd9, 0xad, 0xd8, 0xe8, 0xd8, 0x50, 0xd8, 0x42, 0xd8, 0xb4, 0xd8, 0x24, 0xd8, 0xab, 0xd9, 0x98, 0xd8, 0xda, 0xda, 0x79, 0xd9, 0xe2, 0xdb, 0x82, 0xda, 0x88, 0xdc, 0x6e, 0xdb, 0xd0, 0xdc, 0x13, 0xdc, 0xed, 0xdc, 0x72, 0xdc, 0x1d, 0xdd, 0xa8, 0xdc, 84 | 0x8d, 0xdd, 0xdd, 0xdc, 0x3e, 0xde, 0x2c, 0xdd, 0x14, 0xdf, 0x9a, 0xdd, 0xea, 0xdf, 0x20, 0xde, 0xb2, 0xe0, 0xba, 0xde, 0x7c, 0xe1, 0x70, 0xdf, 0x66, 0xe2, 0x51, 0xe0, 0x87, 0xe3, 0x63, 0xe1, 0xdb, 0xe4, 0x96, 0xe2, 0x39, 0xe6, 0xc1, 0xe3, 0x69, 0xe7, 0xac, 0xe4, 0x3c, 0xe8, 0x2e, 0xe5, 0xa4, 0xe8, 0x3e, 0xe5, 0xc0, 0xe8, 0x06, 0xe5, 0xce, 0xe8, 0xcf, 0xe4, 0x12, 0xe9, 0xea, 0xe4, 0xbc, 0xe9, 0x8c, 0xe5, 0xcf, 0xea, 0xb5, 0xe6, 0x23, 0xec, 0x2d, 0xe8, 0x73, 0xed, 0x99, 0xe9, 0x79, 0xee, 0xa1, 0xea, 0x0a, 0xef, 0x17, 0xeb, 0x29, 0xef, 0x07, 0xeb, 0x02, 0xef, 0xb3, 0xea, 0xd5, 0xee, 0x6f, 0xea, 0xd3, 0xee, 0x7a, 0xea, 0x0f, 0xef, 0xe0, 0xea, 0x70, 0xef, 0x77, 0xeb, 0xc9, 0xef, 0xfa, 0xeb, 0xfa, 0xef, 0x38, 0xec, 0x01, 0xf0, 0x29, 0xec, 0x04, 0xf0, 0xf8, 0xeb, 85 | 0x34, 0xf0, 0xe5, 0xeb, 0xac, 0xf0, 0x1c, 0xec, 0x54, 0xf1, 0x91, 0xec, 0xe6, 0xf1, 0x02, 0xed, 0x0e, 0xf2, 0x1c, 0xed, 0x95, 0xf1, 0xa5, 0xec, 0x8e, 0xf0, 0xa5, 0xeb, 0x4c, 0xef, 0x66, 0xea, 0x47, 0xee, 0x55, 0xe9, 0xe1, 0xed, 0xcf, 0xe8, 0x3f, 0xee, 0xf8, 0xe8, 0x37, 0xef, 0xb4, 0xe9, 0x74, 0xf0, 0xc2, 0xea, 0x9e, 0xf1, 0xdf, 0xeb, 0x85, 0xf2, 0xe8, 0xec, 0x28, 0xf3, 0xd7, 0xed, 0xa5, 0xf3, 0xb4, 0xee, 0x14, 0xf4, 0x75, 0xef, 0x73, 0xf4, 0xfc, 0xef, 0xa4, 0xf4, 0x21, 0xf0, 0x86, 0xf4, 0xcf, 0xef, 0x12, 0xf4, 0x21, 0xef, 0x6a, 0xf3, 0x5c, 0xee, 0xce, 0xf2, 0xd7, 0xed, 0x80, 0xf2, 0xd2, 0xed, 0xa5, 0xf2, 0x55, 0xee, 0x38, 0xf3, 0x34, 0xef, 0x14, 0xf4, 0x26, 0xf0, 0x0a, 0xf5, 0xf0, 0xf0, 0xfb, 0xf5, 0x82, 0xf1, 0xe3, 0xf6, 0xff, 0xf1, 0xd1, 0xf7, 0x9b, 0xf2, 86 | 0xd1, 0xf8, 0x80, 0xf3, 0xdd, 0xf9, 0xa6, 0xf4, 0xd6, 0xfa, 0xd8, 0xf5, 0x89, 0xfb, 0xc0, 0xf6, 0xc9, 0xfb, 0x14, 0xf7, 0x7e, 0xfb, 0xb1, 0xf6, 0xb9, 0xfa, 0xb2, 0xf5, 0xa9, 0xf9, 0x63, 0xf4, 0x97, 0xf8, 0x29, 0xf3, 0xc6, 0xf7, 0x58, 0xf2, 0x66, 0xf7, 0x1e, 0xf2, 0x7a, 0xf7, 0x70, 0xf2, 0xe1, 0xf7, 0x14, 0xf3, 0x5f, 0xf8, 0xbf, 0xf3, 0xb7, 0xf8, 0x2d, 0xf4, 0xc8, 0xf8, 0x43, 0xf4, 0x99, 0xf8, 0x15, 0xf4, 0x5b, 0xf8, 0xd7, 0xf3, 0x4d, 0xf8, 0xca, 0xf3, 0xa2, 0xf8, 0x1b, 0xf4, 0x6b, 0xf9, 0xd6, 0xf4, 0x8c, 0xfa, 0xe0, 0xf5, 0xd2, 0xfb, 0x0f, 0xf7, 0x03, 0xfd, 0x34, 0xf8, 0xfa, 0xfd, 0x31, 0xf9, 0xae, 0xfe, 0xf3, 0xf9, 0x29, 0xff, 0x70, 0xfa, 0x7b, 0xff, 0xa2, 0xfa, 0xa9, 0xff, 0x85, 0xfa, 0xaf, 0xff, 0x1e, 0xfa, 0x85, 0xff, 0x89, 0xf9, 0x2e, 0xff, 0xed, 0xf8, 87 | 0xbb, 0xfe, 0x78, 0xf8, 0x48, 0xfe, 0x41, 0xf8, 0xee, 0xfd, 0x40, 0xf8, 0xb8, 0xfd, 0x4b, 0xf8, 0x98, 0xfd, 0x28, 0xf8, 0x6d, 0xfd, 0xae, 0xf7, 0x14, 0xfd, 0xd8, 0xf6, 0x75, 0xfc, 0xc7, 0xf5, 0x92, 0xfb, 0xba, 0xf4, 0x90, 0xfa, 0xeb, 0xf3, 0xae, 0xf9, 0x84, 0xf3, 0x39, 0xf9, 0x94, 0xf3, 0x6f, 0xf9, 0x15, 0xf4, 0x66, 0xfa, 0xf5, 0xf4, 0xf8, 0xfb, 0x13, 0xf6, 0xc2, 0xfd, 0x42, 0xf7, 0x3d, 0xff, 0x3e, 0xf8, 0xe4, 0xff, 0xb5, 0xf8, 0x6c, 0xff, 0x5f, 0xf8, 0xda, 0xfd, 0x19, 0xf7, 0x88, 0xfb, 0xfe, 0xf4, 0xfa, 0xf8, 0x63, 0xf2, 0xab, 0xf6, 0xb8, 0xef, 0xe1, 0xf4, 0x63, 0xed, 0x9e, 0xf3, 0x9d, 0xeb, 0xb7, 0xf2, 0x68, 0xea, 0x00, 0xf2, 0xa2, 0xe9, 0x71, 0xf1, 0x29, 0xe9, 0x24, 0xf1, 0xef, 0xe8, 0x41, 0xf1, 0xf9, 0xe8, 0xd1, 0xf1, 0x51, 0xe9, 0xa6, 0xf2, 0xe2, 0xe9, 88 | 0x60, 0xf3, 0x76, 0xea, 0x9d, 0xf3, 0xbe, 0xea, 0x2b, 0xf3, 0x7e, 0xea, 0x29, 0xf2, 0xac, 0xe9, 0xf9, 0xf0, 0x81, 0xe8, 0x0c, 0xf0, 0x5f, 0xe7, 0xae, 0xef, 0xa4, 0xe6, 0xd5, 0xef, 0x7b, 0xe6, 0x32, 0xf0, 0xc6, 0xe6, 0x59, 0xf0, 0x27, 0xe7, 0xff, 0xef, 0x37, 0xe7, 0x24, 0xef, 0xb5, 0xe6, 0x17, 0xee, 0xb0, 0xe5, 0x4e, 0xed, 0x86, 0xe4, 0x2e, 0xed, 0xbc, 0xe3, 0xe4, 0xed, 0xc4, 0xe3, 0x56, 0xef, 0xd3, 0xe4, 0x36, 0xf1, 0xc1, 0xe6, 0x2d, 0xf3, 0x22, 0xe9, 0xf9, 0xf4, 0x6e, 0xeb, 0x83, 0xf6, 0x3a, 0xed, 0xd2, 0xf7, 0x5f, 0xee, 0xfe, 0xf8, 0xfe, 0xee, 0x19, 0xfa, 0x6a, 0xef, 0x28, 0xfb, 0xfb, 0xef, 0x28, 0xfc, 0xe7, 0xf0, 0x19, 0xfd, 0x31, 0xf2, 0x08, 0xfe, 0xb4, 0xf3, 0x0e, 0xff, 0x3f, 0xf5, 0x44, 0x00, 0xaf, 0xf6, 0xad, 0x01, 0xfc, 0xf7, 0x2f, 0x03, 0x2e, 0xf9, 89 | 0x8e, 0x04, 0x44, 0xfa, 0x81, 0x05, 0x26, 0xfb, 0xd1, 0x05, 0xa8, 0xfb, 0x75, 0x05, 0xa8, 0xfb, 0xa0, 0x04, 0x2b, 0xfb, 0xb4, 0x03, 0x6f, 0xfa, 0x22, 0x03, 0xdc, 0xf9, 0x3c, 0x03, 0xdb, 0xf9, 0x1a, 0x04, 0xa3, 0xfa, 0x92, 0x05, 0x21, 0xfc, 0x57, 0x07, 0x04, 0xfe, 0x18, 0x09, 0xe3, 0xff, 0xa4, 0x0a, 0x74, 0x01, 0xf1, 0x0b, 0xa1, 0x02, 0x07, 0x0d, 0x87, 0x03, 0xeb, 0x0d, 0x4a, 0x04, 0x89, 0x0e, 0xf5, 0x04, 0xbc, 0x0e, 0x6a, 0x05, 0x6e, 0x0e, 0x79, 0x05, 0xb5, 0x0d, 0x10, 0x05, 0xe2, 0x0c, 0x5a, 0x04, 0x6e, 0x0c, 0xc7, 0x03, 0xc9, 0x0c, 0xe4, 0x03, 0x2e, 0x0e, 0x19, 0x05, 0x80, 0x10, 0x78, 0x07, 0x5a, 0x13, 0xab, 0x0a, 0x37, 0x16, 0x18, 0x0e, 0xa3, 0x18, 0x1a, 0x11, 0x64, 0x1a, 0x41, 0x13, 0x7c, 0x1b, 0x76, 0x14, 0x1a, 0x1c, 0xee, 0x14, 0x77, 0x1c, 0x09, 0x15, 90 | 0xc2, 0x1c, 0x25, 0x15, 0x16, 0x1d, 0x83, 0x15, 0x86, 0x1d, 0x38, 0x16, 0x1e, 0x1e, 0x38, 0x17, 0xe7, 0x1e, 0x65, 0x18, 0xda, 0x1f, 0x95, 0x19, 0xd7, 0x20, 0x97, 0x1a, 0xa7, 0x21, 0x3e, 0x1b, 0x0d, 0x22, 0x66, 0x1b, 0xdf, 0x21, 0x02, 0x1b, 0x22, 0x21, 0x2e, 0x1a, 0x10, 0x20, 0x2b, 0x19, 0x07, 0x1f, 0x51, 0x18, 0x69, 0x1e, 0xf4, 0x17, 0x7a, 0x1e, 0x44, 0x18, 0x47, 0x1f, 0x43, 0x19, 0xa4, 0x20, 0xbc, 0x1a, 0x3f, 0x22, 0x5c, 0x1c, 0xb9, 0x23, 0xca, 0x1d, 0xbf, 0x24, 0xc4, 0x1e, 0x22, 0x25, 0x29, 0x1f, 0xd9, 0x24, 0xff, 0x1e, 0x00, 0x24, 0x64, 0x1e, 0xc4, 0x22, 0x81, 0x1d, 0x5f, 0x21, 0x78, 0x1c, 0x03, 0x20, 0x66, 0x1b, 0xd7, 0x1e, 0x61, 0x1a, 0xf5, 0x1d, 0x80, 0x19, 0x6b, 0x1d, 0xdd, 0x18, 0x3c, 0x1d, 0x90, 0x18, 0x58, 0x1d, 0xa2, 0x18, 0x9e, 0x1d, 0xfc, 0x18, 91 | 0xdb, 0x1d, 0x67, 0x19, 0xcf, 0x1d, 0x94, 0x19, 0x48, 0x1d, 0x3d, 0x19, 0x35, 0x1c, 0x45, 0x18, 0xbb, 0x1a, 0xca, 0x16, 0x27, 0x19, 0x25, 0x15, 0xe1, 0x17, 0xc5, 0x13, 0x39, 0x17, 0x0b, 0x13, 0x4d, 0x17, 0x1a, 0x13, 0xf5, 0x17, 0xcd, 0x13, 0xd3, 0x18, 0xc5, 0x14, 0x74, 0x19, 0x90, 0x15, 0x80, 0x19, 0xd0, 0x15, 0xcf, 0x18, 0x5b, 0x15, 0x78, 0x17, 0x3a, 0x14, 0xb7, 0x15, 0xa0, 0x12, 0xde, 0x13, 0xd5, 0x10, 0x37, 0x12, 0x23, 0x0f, 0xfc, 0x10, 0xd0, 0x0d, 0x4b, 0x10, 0x10, 0x0d, 0x25, 0x10, 0xfb, 0x0c, 0x6f, 0x10, 0x7e, 0x0d, 0xec, 0x10, 0x53, 0x0e, 0x4c, 0x11, 0x0e, 0x0f, 0x3e, 0x11, 0x37, 0x0f, 0x8c, 0x10, 0x81, 0x0e, 0x34, 0x0f, 0xe5, 0x0c, 0x69, 0x0d, 0xb3, 0x0a, 0x85, 0x0b, 0x71, 0x08, 0xe6, 0x09, 0xa8, 0x06, 0xcf, 0x08, 0xa9, 0x05, 0x4e, 0x08, 0x76, 0x05, 92 | 0x46, 0x08, 0xc5, 0x05, 0x81, 0x08, 0x2f, 0x06, 0xc8, 0x08, 0x5b, 0x06, 0xf2, 0x08, 0x26, 0x06, 0xe8, 0x08, 0x9b, 0x05, 0x97, 0x08, 0xdf, 0x04, 0xef, 0x07, 0x0a, 0x04, 0xdc, 0x06, 0x19, 0x03, 0x59, 0x05, 0xec, 0x01, 0x77, 0x03, 0x66, 0x00, 0x64, 0x01, 0x86, 0xfe, 0x63, 0xff, 0x74, 0xfc, 0xb5, 0xfd, 0x7c, 0xfa, 0x85, 0xfc, 0xef, 0xf8, 0xdc, 0xfb, 0x00, 0xf8, 0xa0, 0xfb, 0xb1, 0xf7, 0xa3, 0xfb, 0xd3, 0xf7, 0xb6, 0xfb, 0x1b, 0xf8, 0xb6, 0xfb, 0x42, 0xf8, 0x95, 0xfb, 0x21, 0xf8, 0x5a, 0xfb, 0xbd, 0xf7, 0x14, 0xfb, 0x39, 0xf7, 0xd7, 0xfa, 0xc7, 0xf6, 0xb3, 0xfa, 0x87, 0xf6, 0xaa, 0xfa, 0x7a, 0xf6, 0xb2, 0xfa, 0x81, 0xf6, 0xb3, 0xfa, 0x6f, 0xf6, 0x93, 0xfa, 0x20, 0xf6, 0x37, 0xfa, 0x8a, 0xf5, 0x94, 0xf9, 0xbc, 0xf4, 0xb2, 0xf8, 0xd6, 0xf3, 0xa8, 0xf7, 0xf7, 0xf2, 93 | 0x9b, 0xf6, 0x2b, 0xf2, 0xb3, 0xf5, 0x73, 0xf1, 0x11, 0xf5, 0xcf, 0xf0, 0xce, 0xf4, 0x53, 0xf0, 0xf8, 0xf4, 0x28, 0xf0, 0x8c, 0xf5, 0x80, 0xf0, 0x7a, 0xf6, 0x79, 0xf1, 0xa0, 0xf7, 0x01, 0xf3, 0xcf, 0xf8, 0xcb, 0xf4, 0xd4, 0xf9, 0x66, 0xf6, 0x80, 0xfa, 0x63, 0xf7, 0xb3, 0xfa, 0x87, 0xf7, 0x68, 0xfa, 0xdd, 0xf6, 0xb1, 0xf9, 0xb9, 0xf5, 0xb5, 0xf8, 0x89, 0xf4, 0xa9, 0xf7, 0xb1, 0xf3, 0xc9, 0xf6, 0x63, 0xf3, 0x4a, 0xf6, 0x9d, 0xf3, 0x53, 0xf6, 0x38, 0xf4, 0xef, 0xf6, 0x06, 0xf5, 0x03, 0xf8, 0xe6, 0xf5, 0x56, 0xf9, 0xca, 0xf6, 0x99, 0xfa, 0xb0, 0xf7, 0x87, 0xfb, 0x90, 0xf8, 0xfa, 0xfb, 0x5a, 0xf9, 0xfe, 0xfb, 0xf9, 0xf9, 0xc2, 0xfb, 0x5d, 0xfa, 0x88, 0xfb, 0x8d, 0xfa, 0x7e, 0xfb, 0x9f, 0xfa, 0xb3, 0xfb, 0xb4, 0xfa, 0x10, 0xfc, 0xe9, 0xfa, 0x74, 0xfc, 0x50, 0xfb, 94 | 0xcb, 0xfc, 0xe9, 0xfb, 0x19, 0xfd, 0xaa, 0xfc, 0x74, 0xfd, 0x80, 0xfd, 0xef, 0xfd, 0x56, 0xfe, 0x80, 0xfe, 0x16, 0xff, 0x05, 0xff, 0xac, 0xff, 0x50, 0xff, 0x0d, 0x00, 0x4d, 0xff, 0x3f, 0x00, 0x17, 0xff, 0x60, 0x00, 0xf8, 0xfe, 0xa2, 0x00, 0x47, 0xff, 0x37, 0x01, 0x3f, 0x00, 0x43, 0x02, 0xdb, 0x01, 0xc8, 0x03, 0xcf, 0x03, 0x9d, 0x05, 0xa7, 0x05, 0x7a, 0x07, 0xfb, 0x06, 0x0f, 0x09, 0x93, 0x07, 0x1b, 0x0a, 0x7e, 0x07, 0x81, 0x0a, 0xfd, 0x06, 0x4e, 0x0a, 0x61, 0x06, 0xb4, 0x09, 0xe3, 0x05, 0xf4, 0x08, 0x94, 0x05, 0x4d, 0x08, 0x61, 0x05, 0xe8, 0x07, 0x30, 0x05, 0xd7, 0x07, 0xf7, 0x04, 0x0f, 0x08, 0xc5, 0x04, 0x78, 0x08, 0xbf, 0x04, 0xf6, 0x08, 0x04, 0x05, 0x78, 0x09, 0x99, 0x05, 0xf3, 0x09, 0x59, 0x06, 0x63, 0x0a, 0x04, 0x07, 0xc1, 0x0a, 0x57, 0x07, 0xfc, 0x0a, 95 | }); err != nil { 96 | t.Error("Encode failed, err is", err) 97 | return 98 | } 99 | if len(frame) != 139 { 100 | t.Error("AAC encode failed, size is", len(frame)) 101 | return 102 | } 103 | 104 | // flush got the last packets. 105 | // @remark user should flush util frame is nil. 106 | if frame, err = e.Flush(); err != nil { 107 | t.Error("Flush failed, err is", err) 108 | return 109 | } 110 | if len(frame) != 225 { 111 | t.Error("Flush failed, size is", len(frame)) 112 | return 113 | } 114 | 115 | if frame, err = e.Flush(); err != nil { 116 | t.Error("Flush failed, err is", err) 117 | return 118 | } 119 | if len(frame) != 198 { 120 | t.Error("Flush failed, size is", len(frame)) 121 | return 122 | } 123 | 124 | if frame, err = e.Flush(); err != nil { 125 | t.Error("Flush failed, err is", err) 126 | return 127 | } 128 | if len(frame) != 0 { 129 | t.Error("Flush failed, size is", len(frame)) 130 | return 131 | } 132 | } 133 | 134 | func TestLcFlush(t *testing.T) { 135 | var err error 136 | 137 | e := fdkaac.NewAacEncoder() 138 | if err = e.InitLc(2, 44100, 48000); err != nil { 139 | t.Error("Init encoder failed, err is", err) 140 | return 141 | } 142 | defer e.Close() 143 | 144 | if 1024 != e.FrameSize() { 145 | t.Error("FrameSize not 1024, actual is", e.FrameSize()) 146 | return 147 | } 148 | 149 | var frame []byte 150 | if frame, err = e.Encode([]byte{ 151 | 0x32, 0x04, 0xf4, 0xfd, 0x0d, 0x05, 0xaa, 0xfe, 0xfc, 0x05, 0x8b, 0xff, 0x0e, 0x07, 0x9f, 0x00, 0x44, 0x08, 0xdc, 0x01, 0x88, 0x09, 0x21, 0x03, 0xaa, 0x0a, 0x3f, 0x04, 0x75, 0x0b, 0x04, 0x05, 0xc5, 0x0b, 0x54, 0x05, 0xa0, 0x0b, 0x39, 0x05, 0x3e, 0x0b, 0xe6, 0x04, 0xf1, 0x0a, 0xa6, 0x04, 0x06, 0x0b, 0xbf, 0x04, 0x9f, 0x0b, 0x57, 0x05, 0xa7, 0x0c, 0x5f, 0x06, 0xd6, 0x0d, 0xa0, 0x07, 0xdc, 0x0e, 0xcc, 0x08, 0x7f, 0x0f, 0x9f, 0x09, 0xb5, 0x0f, 0xfc, 0x09, 0xa1, 0x0f, 0xed, 0x09, 0x7b, 0x0f, 0x9f, 0x09, 0x72, 0x0f, 0x4c, 0x09, 0x9c, 0x0f, 0x29, 0x09, 0xf5, 0x0f, 0x53, 0x09, 0x70, 0x10, 0xd0, 0x09, 0x05, 0x11, 0x91, 0x0a, 0xb7, 0x11, 0x78, 0x0b, 0x8c, 0x12, 0x63, 0x0c, 0x7b, 0x13, 0x2e, 0x0d, 0x6c, 0x14, 0xc4, 0x0d, 0x32, 0x15, 0x1d, 0x0e, 0xa9, 0x15, 0x43, 0x0e, 152 | 0xc4, 0x15, 0x4e, 0x0e, 0x98, 0x15, 0x56, 0x0e, 0x54, 0x15, 0x6e, 0x0e, 0x2c, 0x15, 0x99, 0x0e, 0x3d, 0x15, 0xcc, 0x0e, 0x81, 0x15, 0xf7, 0x0e, 0xd5, 0x15, 0x0e, 0x0f, 0x0b, 0x16, 0x0f, 0x0f, 0x04, 0x16, 0x00, 0x0f, 0xbe, 0x15, 0xe9, 0x0e, 0x53, 0x15, 0xce, 0x0e, 0xe6, 0x14, 0xab, 0x0e, 0x93, 0x14, 0x7a, 0x0e, 0x5e, 0x14, 0x36, 0x0e, 0x36, 0x14, 0xde, 0x0d, 0x02, 0x14, 0x7d, 0x0d, 0xb3, 0x13, 0x1d, 0x0d, 0x4d, 0x13, 0xc5, 0x0c, 0xec, 0x12, 0x7a, 0x0c, 0xad, 0x12, 0x3b, 0x0c, 0xa2, 0x12, 0x0a, 0x0c, 0xc0, 0x12, 0xe2, 0x0b, 0xe7, 0x12, 0xc2, 0x0b, 0xed, 0x12, 0xa0, 0x0b, 0xb2, 0x12, 0x6f, 0x0b, 0x38, 0x12, 0x25, 0x0b, 0xa0, 0x11, 0xbc, 0x0a, 0x19, 0x11, 0x3e, 0x0a, 0xca, 0x10, 0xc3, 0x09, 0xbc, 0x10, 0x65, 0x09, 0xd4, 0x10, 0x38, 0x09, 0xe6, 0x10, 0x3a, 0x09, 153 | 0xca, 0x10, 0x5a, 0x09, 0x77, 0x10, 0x7b, 0x09, 0x07, 0x10, 0x86, 0x09, 0xa5, 0x0f, 0x70, 0x09, 0x72, 0x0f, 0x3d, 0x09, 0x6b, 0x0f, 0xf6, 0x08, 0x67, 0x0f, 0x9f, 0x08, 0x2b, 0x0f, 0x34, 0x08, 0x8c, 0x0e, 0xaa, 0x07, 0x87, 0x0d, 0xf9, 0x06, 0x47, 0x0c, 0x21, 0x06, 0x0e, 0x0b, 0x31, 0x05, 0x16, 0x0a, 0x40, 0x04, 0x75, 0x09, 0x60, 0x03, 0x17, 0x09, 0x9f, 0x02, 0xd3, 0x08, 0x03, 0x02, 0x8c, 0x08, 0x8f, 0x01, 0x3e, 0x08, 0x4b, 0x01, 0x02, 0x08, 0x39, 0x01, 0xf6, 0x07, 0x56, 0x01, 0x20, 0x08, 0x8e, 0x01, 0x63, 0x08, 0xbe, 0x01, 0x8a, 0x08, 0xc3, 0x01, 0x67, 0x08, 0x86, 0x01, 0xef, 0x07, 0x0f, 0x01, 0x49, 0x07, 0x85, 0x00, 0xb7, 0x06, 0x1d, 0x00, 0x77, 0x06, 0x04, 0x00, 0x9e, 0x06, 0x48, 0x00, 0x0c, 0x07, 0xcc, 0x00, 0x78, 0x07, 0x57, 0x01, 0x98, 0x07, 0xa7, 0x01, 154 | 0x3f, 0x07, 0x90, 0x01, 0x74, 0x06, 0x0a, 0x01, 0x6c, 0x05, 0x35, 0x00, 0x6d, 0x04, 0x48, 0xff, 0xaf, 0x03, 0x7d, 0xfe, 0x4a, 0x03, 0xfd, 0xfd, 0x30, 0x03, 0xd2, 0xfd, 0x3e, 0x03, 0xeb, 0xfd, 0x4b, 0x03, 0x21, 0xfe, 0x3d, 0x03, 0x4a, 0xfe, 0x0a, 0x03, 0x42, 0xfe, 0xb7, 0x02, 0xf9, 0xfd, 0x51, 0x02, 0x75, 0xfd, 0xe5, 0x01, 0xd0, 0xfc, 0x7a, 0x01, 0x2b, 0xfc, 0x14, 0x01, 0xa6, 0xfb, 0xb5, 0x00, 0x50, 0xfb, 0x5e, 0x00, 0x2a, 0xfb, 0x11, 0x00, 0x25, 0xfb, 0xd0, 0xff, 0x2d, 0xfb, 0x9c, 0xff, 0x32, 0xfb, 0x76, 0xff, 0x29, 0xfb, 0x5a, 0xff, 0x15, 0xfb, 0x44, 0xff, 0x02, 0xfb, 0x32, 0xff, 0xfd, 0xfa, 0x27, 0xff, 0x1a, 0xfb, 0x2b, 0xff, 0x63, 0xfb, 0x47, 0xff, 0xdd, 0xfb, 0x7f, 0xff, 0x7b, 0xfc, 0xc8, 0xff, 0x1f, 0xfd, 0x0d, 0x00, 0xa2, 0xfd, 0x31, 0x00, 0xe1, 0xfd, 155 | 0x1d, 0x00, 0xca, 0xfd, 0xce, 0xff, 0x69, 0xfd, 0x54, 0xff, 0xe3, 0xfc, 0xd2, 0xfe, 0x69, 0xfc, 0x6a, 0xfe, 0x24, 0xfc, 0x32, 0xfe, 0x1f, 0xfc, 0x2a, 0xfe, 0x4d, 0xfc, 0x46, 0xfe, 0x8c, 0xfc, 0x6f, 0xfe, 0xbd, 0xfc, 0x94, 0xfe, 0xd2, 0xfc, 0xae, 0xfe, 0xd0, 0xfc, 0xb7, 0xfe, 0xc6, 0xfc, 0xa9, 0xfe, 0xbc, 0xfc, 0x7d, 0xfe, 0xb1, 0xfc, 0x2e, 0xfe, 0x9d, 0xfc, 0xc9, 0xfd, 0x80, 0xfc, 0x6d, 0xfd, 0x6e, 0xfc, 0x49, 0xfd, 0x8f, 0xfc, 0x8b, 0xfd, 0x0d, 0xfd, 0x45, 0xfe, 0xfc, 0xfd, 0x5f, 0xff, 0x47, 0xff, 0xa0, 0x00, 0xb8, 0x00, 0xbc, 0x01, 0x06, 0x02, 0x78, 0x02, 0xf8, 0x02, 0xbd, 0x02, 0x79, 0x03, 0x9c, 0x02, 0x9e, 0x03, 0x40, 0x02, 0x8e, 0x03, 0xda, 0x01, 0x73, 0x03, 0x8b, 0x01, 0x61, 0x03, 0x5f, 0x01, 0x59, 0x03, 0x52, 0x01, 0x52, 0x03, 0x5c, 0x01, 0x4a, 0x03, 156 | 0x78, 0x01, 0x4a, 0x03, 0xa0, 0x01, 0x63, 0x03, 0xcc, 0x01, 0x98, 0x03, 0xea, 0x01, 0xdd, 0x03, 0xe4, 0x01, 0x10, 0x04, 0xaa, 0x01, 0x0f, 0x04, 0x3d, 0x01, 0xc8, 0x03, 0xb5, 0x00, 0x4b, 0x03, 0x34, 0x00, 0xbf, 0x02, 0xe0, 0xff, 0x5a, 0x02, 0xcb, 0xff, 0x43, 0x02, 0xf1, 0xff, 0x89, 0x02, 0x3b, 0x00, 0x18, 0x03, 0x8a, 0x00, 0xcb, 0x03, 0xc7, 0x00, 0x78, 0x04, 0xe6, 0x00, 0x00, 0x05, 0xeb, 0x00, 0x54, 0x05, 0xe0, 0x00, 0x77, 0x05, 0xcd, 0x00, 0x77, 0x05, 0xb5, 0x00, 0x65, 0x05, 0x97, 0x00, 0x54, 0x05, 0x6d, 0x00, 0x4f, 0x05, 0x35, 0x00, 0x58, 0x05, 0xec, 0xff, 0x65, 0x05, 0x96, 0xff, 0x64, 0x05, 0x34, 0xff, 0x3e, 0x05, 0xc9, 0xfe, 0xe1, 0x04, 0x56, 0xfe, 0x4f, 0x04, 0xdc, 0xfd, 0x99, 0x03, 0x5f, 0xfd, 0xe1, 0x02, 0xea, 0xfc, 0x4d, 0x02, 0x89, 0xfc, 0xfc, 0x01, 157 | 0x4b, 0xfc, 0xf4, 0x01, 0x38, 0xfc, 0x24, 0x02, 0x44, 0xfc, 0x64, 0x02, 0x51, 0xfc, 0x83, 0x02, 0x30, 0xfc, 0x53, 0x02, 0xb8, 0xfb, 0xc0, 0x01, 0xd8, 0xfa, 0xd5, 0x00, 0xa9, 0xf9, 0xc1, 0xff, 0x6f, 0xf8, 0xc7, 0xfe, 0x7a, 0xf7, 0x29, 0xfe, 0x0a, 0xf7, 0x0c, 0xfe, 0x29, 0xf7, 0x69, 0xfe, 0xa3, 0xf7, 0x0c, 0xff, 0x1f, 0xf8, 0xa9, 0xff, 0x47, 0xf8, 0xfa, 0xff, 0xf4, 0xf7, 0xdd, 0xff, 0x3e, 0xf7, 0x5f, 0xff, 0x6f, 0xf6, 0xb8, 0xfe, 0xd7, 0xf5, 0x27, 0xfe, 0xa4, 0xf5, 0xdc, 0xfd, 0xcb, 0xf5, 0xe0, 0xfd, 0x14, 0xf6, 0x19, 0xfe, 0x3f, 0xf6, 0x5c, 0xfe, 0x29, 0xf6, 0x7e, 0xfe, 0xd8, 0xf5, 0x67, 0xfe, 0x6f, 0xf5, 0x11, 0xfe, 0x0e, 0xf5, 0x81, 0xfd, 0xb1, 0xf4, 0xbd, 0xfc, 0x33, 0xf4, 0xc9, 0xfb, 0x5f, 0xf3, 0xae, 0xfa, 0x1e, 0xf2, 0x7a, 0xf9, 0x89, 0xf0, 0x47, 0xf8, 158 | 0xe8, 0xee, 0x30, 0xf7, 0x8f, 0xed, 0x48, 0xf6, 0xb6, 0xec, 0x91, 0xf5, 0x5a, 0xec, 0x00, 0xf5, 0x45, 0xec, 0x88, 0xf4, 0x2c, 0xec, 0x23, 0xf4, 0xda, 0xeb, 0xd8, 0xf3, 0x4b, 0xeb, 0xb2, 0xf3, 0xaa, 0xea, 0xb6, 0xf3, 0x2d, 0xea, 0xd7, 0xf3, 0xf6, 0xe9, 0xf7, 0xf3, 0xfc, 0xe9, 0xf0, 0xf3, 0x0a, 0xea, 0xab, 0xf3, 0xe5, 0xe9, 0x26, 0xf3, 0x6a, 0xe9, 0x78, 0xf2, 0xa5, 0xe8, 0xc7, 0xf1, 0xc8, 0xe7, 0x2f, 0xf1, 0x12, 0xe7, 0xc0, 0xf0, 0xaf, 0xe6, 0x73, 0xf0, 0xa1, 0xe6, 0x38, 0xf0, 0xc1, 0xe6, 0xff, 0xef, 0xd6, 0xe6, 0xbd, 0xef, 0xb1, 0xe6, 0x6c, 0xef, 0x47, 0xe6, 0x0a, 0xef, 0xad, 0xe5, 0x96, 0xee, 0x0d, 0xe5, 0x0f, 0xee, 0x89, 0xe4, 0x7c, 0xed, 0x2b, 0xe4, 0xe6, 0xec, 0xdc, 0xe3, 0x5e, 0xec, 0x7c, 0xe3, 0xef, 0xeb, 0xf1, 0xe2, 0x9a, 0xeb, 0x41, 0xe2, 0x59, 0xeb, 159 | 0x93, 0xe1, 0x22, 0xeb, 0x18, 0xe1, 0xf1, 0xea, 0xf4, 0xe0, 0xca, 0xea, 0x26, 0xe1, 0xba, 0xea, 0x83, 0xe1, 0xc9, 0xea, 0xca, 0xe1, 0xf4, 0xea, 0xc9, 0xe1, 0x2a, 0xeb, 0x76, 0xe1, 0x56, 0xeb, 0xfb, 0xe0, 0x67, 0xeb, 0xa2, 0xe0, 0x63, 0xeb, 0xae, 0xe0, 0x61, 0xeb, 0x41, 0xe1, 0x87, 0xeb, 0x48, 0xe2, 0xf8, 0xeb, 0x8e, 0xe3, 0xc1, 0xec, 0xd5, 0xe4, 0xdb, 0xed, 0xf6, 0xe5, 0x23, 0xef, 0xe6, 0xe6, 0x6a, 0xf0, 0xad, 0xe7, 0x7b, 0xf1, 0x4f, 0xe8, 0x28, 0xf2, 0xc0, 0xe8, 0x5b, 0xf2, 0xeb, 0xe8, 0x1a, 0xf2, 0xca, 0xe8, 0x93, 0xf1, 0x7d, 0xe8, 0x11, 0xf1, 0x4b, 0xe8, 0xed, 0xf0, 0x88, 0xe8, 0x6d, 0xf1, 0x6c, 0xe9, 0xa2, 0xf2, 0xe7, 0xea, 0x5f, 0xf4, 0xa5, 0xec, 0x40, 0xf6, 0x29, 0xee, 0xce, 0xf7, 0x06, 0xef, 0xb0, 0xf8, 0x18, 0xef, 0xd0, 0xf8, 0x92, 0xee, 0x66, 0xf8, 160 | 0xea, 0xed, 0xdf, 0xf7, 0xa1, 0xed, 0xae, 0xf7, 0x0e, 0xee, 0x24, 0xf8, 0x3d, 0xef, 0x53, 0xf9, 0xf8, 0xf0, 0x10, 0xfb, 0xeb, 0xf2, 0x0e, 0xfd, 0xcc, 0xf4, 0x02, 0xff, 0x76, 0xf6, 0xb9, 0x00, 0xed, 0xf7, 0x21, 0x02, 0x44, 0xf9, 0x47, 0x03, 0x8c, 0xfa, 0x3f, 0x04, 0xc7, 0xfb, 0x22, 0x05, 0xea, 0xfc, 0xfe, 0x05, 0xec, 0xfd, 0xe0, 0x06, 0xd0, 0xfe, 0xcc, 0x07, 0xab, 0xff, 0xc8, 0x08, 0x9a, 0x00, 0xd6, 0x09, 0xb4, 0x01, 0xf9, 0x0a, 0x02, 0x03, 0x2e, 0x0c, 0x75, 0x04, 0x72, 0x0d, 0xf0, 0x05, 0xbc, 0x0e, 0x4e, 0x07, 0xff, 0x0f, 0x73, 0x08, 0x2d, 0x11, 0x4b, 0x09, 0x36, 0x12, 0xd9, 0x09, 0x0d, 0x13, 0x2a, 0x0a, 0xae, 0x13, 0x5b, 0x0a, 0x1c, 0x14, 0x82, 0x0a, 0x61, 0x14, 0xae, 0x0a, 0x86, 0x14, 0xdb, 0x0a, 0x8d, 0x14, 0xfb, 0x0a, 0x77, 0x14, 0xf8, 0x0a, 0x44, 0x14, 161 | 0xc8, 0x0a, 0xfa, 0x13, 0x75, 0x0a, 0xa8, 0x13, 0x18, 0x0a, 0x61, 0x13, 0xd0, 0x09, 0x2e, 0x13, 0xb1, 0x09, 0x0e, 0x13, 0xbb, 0x09, 0xed, 0x12, 0xdc, 0x09, 0xb6, 0x12, 0xf7, 0x09, 0x5b, 0x12, 0xf5, 0x09, 0xe6, 0x11, 0xd4, 0x09, 0x70, 0x11, 0xa5, 0x09, 0x1c, 0x11, 0x82, 0x09, 0x05, 0x11, 0x8b, 0x09, 0x31, 0x11, 0xcf, 0x09, 0x94, 0x11, 0x55, 0x0a, 0x1d, 0x12, 0x13, 0x0b, 0xb9, 0x12, 0xf5, 0x0b, 0x61, 0x13, 0xdb, 0x0c, 0x0d, 0x14, 0x9f, 0x0d, 0xae, 0x14, 0x14, 0x0e, 0x24, 0x15, 0x15, 0x0e, 0x48, 0x15, 0x8e, 0x0d, 0xf3, 0x14, 0x84, 0x0c, 0x16, 0x14, 0x16, 0x0b, 0xbe, 0x12, 0x74, 0x09, 0x16, 0x11, 0xd4, 0x07, 0x54, 0x0f, 0x60, 0x06, 0xab, 0x0d, 0x35, 0x05, 0x41, 0x0c, 0x64, 0x04, 0x31, 0x0b, 0xf7, 0x03, 0x89, 0x0a, 0xf5, 0x03, 0x50, 0x0a, 0x54, 0x04, 0x81, 0x0a, 162 | 0x01, 0x05, 0x03, 0x0b, 0xd5, 0x05, 0xac, 0x0b, 0xa0, 0x06, 0x45, 0x0c, 0x3b, 0x07, 0x9f, 0x0c, 0x96, 0x07, 0xa7, 0x0c, 0xb6, 0x07, 0x66, 0x0c, 0xae, 0x07, 0xfb, 0x0b, 0x8b, 0x07, 0x82, 0x0b, 0x43, 0x07, 0x02, 0x0b, 0xba, 0x06, 0x63, 0x0a, 0xd0, 0x05, 0x83, 0x09, 0x7d, 0x04, 0x49, 0x08, 0xe1, 0x02, 0xc0, 0x06, 0x3e, 0x01, 0x1a, 0x05, 0xe7, 0xff, 0xa4, 0x03, 0x1c, 0xff, 0xa2, 0x02, 0xf4, 0xfe, 0x3a, 0x02, 0x56, 0xff, 0x66, 0x02, 0x08, 0x00, 0xff, 0x02, 0xc7, 0x00, 0xc7, 0x03, 0x61, 0x01, 0x80, 0x04, 0xb6, 0x01, 0xf5, 0x04, 0xb9, 0x01, 0xfc, 0x04, 0x67, 0x01, 0x7e, 0x04, 0xc3, 0x00, 0x76, 0x03, 0xd7, 0xff, 0xfe, 0x01, 0xc0, 0xfe, 0x52, 0x00, 0xad, 0xfd, 0xc7, 0xfe, 0xdc, 0xfc, 0xb4, 0xfd, 0x88, 0xfc, 0x52, 0xfd, 0xd2, 0xfc, 0xaa, 0xfd, 0xb7, 0xfd, 0x8f, 0xfe, 163 | 0x0a, 0xff, 0xb3, 0xff, 0x89, 0x00, 0xc6, 0x00, 0xee, 0x01, 0x98, 0x01, 0x09, 0x03, 0x23, 0x02, 0xce, 0x03, 0x8a, 0x02, 0x51, 0x04, 0xf9, 0x02, 0xb9, 0x04, 0x90, 0x03, 0x2b, 0x05, 0x4d, 0x04, 0xb5, 0x05, 0x0e, 0x05, 0x41, 0x06, 0x9d, 0x05, 0xa3, 0x06, 0xcb, 0x05, 0xaa, 0x06, 0x83, 0x05, 0x3b, 0x06, 0xd2, 0x04, 0x68, 0x05, 0xe9, 0x03, 0x73, 0x04, 0x07, 0x03, 0xaf, 0x03, 0x68, 0x02, 0x63, 0x03, 0x30, 0x02, 0xa9, 0x03, 0x5f, 0x02, 0x60, 0x04, 0xd8, 0x02, 0x40, 0x05, 0x6a, 0x03, 0x01, 0x06, 0xeb, 0x03, 0x7e, 0x06, 0x45, 0x04, 0xc8, 0x06, 0x7b, 0x04, 0x13, 0x07, 0xa4, 0x04, 0x92, 0x07, 0xd9, 0x04, 0x57, 0x08, 0x2b, 0x05, 0x47, 0x09, 0x9b, 0x05, 0x2c, 0x0a, 0x20, 0x06, 0xd8, 0x0a, 0xb1, 0x06, 0x4a, 0x0b, 0x4d, 0x07, 0xab, 0x0b, 0xf8, 0x07, 0x33, 0x0c, 0xae, 0x08, 164 | 0xfd, 0x0c, 0x5e, 0x09, 0xef, 0x0d, 0xe7, 0x09, 0xb7, 0x0e, 0x27, 0x0a, 0xfa, 0x0e, 0x0c, 0x0a, 0x87, 0x0e, 0x9e, 0x09, 0x76, 0x0d, 0x01, 0x09, 0x27, 0x0c, 0x64, 0x08, 0x13, 0x0b, 0xee, 0x07, 0x95, 0x0a, 0xae, 0x07, 0xbe, 0x0a, 0x9c, 0x07, 0x55, 0x0b, 0xa2, 0x07, 0xfa, 0x0b, 0xb3, 0x07, 0x5e, 0x0c, 0xd0, 0x07, 0x66, 0x0c, 0x00, 0x08, 0x36, 0x0c, 0x49, 0x08, 0x0d, 0x0c, 0xa1, 0x08, 0x1e, 0x0c, 0xed, 0x08, 0x6e, 0x0c, 0x0a, 0x09, 0xd3, 0x0c, 0xe0, 0x08, 0x08, 0x0d, 0x6e, 0x08, 0xdb, 0x0c, 0xca, 0x07, 0x48, 0x0c, 0x19, 0x07, 0x7d, 0x0b, 0x7d, 0x06, 0xc5, 0x0a, 0x0f, 0x06, 0x68, 0x0a, 0xde, 0x05, 0x84, 0x0a, 0xeb, 0x05, 0x0c, 0x0b, 0x38, 0x06, 0xcf, 0x0b, 0xbf, 0x06, 0x96, 0x0c, 0x7a, 0x07, 0x48, 0x0d, 0x5d, 0x08, 0xf6, 0x0d, 0x63, 0x09, 0xd1, 0x0e, 0x90, 0x0a, 165 | 0x10, 0x10, 0xf5, 0x0b, 0xca, 0x11, 0xa3, 0x0d, 0xdf, 0x13, 0x9a, 0x0f, 0xfc, 0x15, 0xb6, 0x11, 0xb5, 0x17, 0xad, 0x13, 0xba, 0x18, 0x25, 0x15, 0xf3, 0x18, 0xdb, 0x15, 0x96, 0x18, 0xc8, 0x15, 0x0f, 0x18, 0x33, 0x15, 0xd3, 0x17, 0x96, 0x14, 0x2f, 0x18, 0x72, 0x14, 0x29, 0x19, 0x12, 0x15, 0x89, 0x1a, 0x6c, 0x16, 0xf8, 0x1b, 0x29, 0x18, 0x28, 0x1d, 0xcb, 0x19, 0xf8, 0x1d, 0xeb, 0x1a, 0x79, 0x1e, 0x64, 0x1b, 0xd4, 0x1e, 0x5c, 0x1b, 0x34, 0x1f, 0x27, 0x1b, 0xac, 0x1f, 0x1d, 0x1b, 0x2f, 0x20, 0x6e, 0x1b, 0xa2, 0x20, 0x13, 0x1c, 0xed, 0x20, 0xd5, 0x1c, 0x02, 0x21, 0x6f, 0x1d, 0xe3, 0x20, 0xac, 0x1d, 0x9b, 0x20, 0x7a, 0x1d, 0x33, 0x20, 0xf1, 0x1c, 0xb6, 0x1f, 0x42, 0x1c, 0x31, 0x1f, 0xa5, 0x1b, 0xb6, 0x1e, 0x45, 0x1b, 0x5b, 0x1e, 0x31, 0x1b, 0x2e, 0x1e, 0x60, 0x1b, 166 | 0x2a, 0x1e, 0xae, 0x1b, 0x36, 0x1e, 0xef, 0x1b, 0x2b, 0x1e, 0xf7, 0x1b, 0xe6, 0x1d, 0xae, 0x1b, 0x55, 0x1d, 0x0c, 0x1b, 0x81, 0x1c, 0x1f, 0x1a, 0x83, 0x1b, 0x02, 0x19, 0x79, 0x1a, 0xd2, 0x17, 0x7c, 0x19, 0xad, 0x16, 0x9a, 0x18, 0xa8, 0x15, 0xd4, 0x17, 0xcf, 0x14, 0x28, 0x17, 0x22, 0x14, 0x8e, 0x16, 0x92, 0x13, 0xf3, 0x15, 0xfd, 0x12, 0x3d, 0x15, 0x39, 0x12, 0x50, 0x14, 0x23, 0x11, 0x17, 0x13, 0xb0, 0x0f, 0x9b, 0x11, 0xff, 0x0d, 0x05, 0x10, 0x51, 0x0c, 0x97, 0x0e, 0xf5, 0x0a, 0x94, 0x0d, 0x2d, 0x0a, 0x21, 0x0d, 0x0b, 0x0a, 0x39, 0x0d, 0x71, 0x0a, 0xa9, 0x0d, 0x18, 0x0b, 0x2c, 0x0e, 0xb0, 0x0b, 0x80, 0x0e, 0xfa, 0x0b, 0x7b, 0x0e, 0xde, 0x0b, 0x0c, 0x0e, 0x5d, 0x0b, 0x37, 0x0d, 0x87, 0x0a, 0x05, 0x0c, 0x69, 0x09, 0x80, 0x0a, 0x09, 0x08, 0xbc, 0x08, 0x6f, 0x06, 167 | 0xde, 0x06, 0xb2, 0x04, 0x1e, 0x05, 0xf8, 0x02, 0xb8, 0x03, 0x75, 0x01, 0xd2, 0x02, 0x4f, 0x00, 0x6a, 0x02, 0x8e, 0xff, 0x4f, 0x02, 0x16, 0xff, 0x32, 0x02, 0xb0, 0xfe, 0xc2, 0x01, 0x1f, 0xfe, 0xcf, 0x00, 0x38, 0xfd, 0x5b, 0xff, 0xef, 0xfb, 0x95, 0xfd, 0x56, 0xfa, 0xc5, 0xfb, 0x9a, 0xf8, 0x32, 0xfa, 0xf1, 0xf6, 0x0d, 0xf9, 0x90, 0xf5, 0x6a, 0xf8, 0xa7, 0xf4, 0x43, 0xf8, 0x51, 0xf4, 0x7b, 0xf8, 0x90, 0xf4, 0xed, 0xf8, 0x45, 0xf5, 0x6e, 0xf9, 0x32, 0xf6, 0xd8, 0xf9, 0x0e, 0xf7, 0x12, 0xfa, 0x9c, 0xf7, 0x16, 0xfa, 0xbd, 0xf7, 0xf0, 0xf9, 0x82, 0xf7, 0xbe, 0xf9, 0x1e, 0xf7, 0x9c, 0xf9, 0xce, 0xf6, 0x9f, 0xf9, 0xc2, 0xf6, 0xcd, 0xf9, 0x09, 0xf7, 0x1f, 0xfa, 0x8e, 0xf7, 0x86, 0xfa, 0x2b, 0xf8, 0xf2, 0xfa, 0xb7, 0xf8, 0x57, 0xfb, 0x16, 0xf9, 0xaf, 0xfb, 0x43, 0xf9, 168 | 0xf3, 0xfb, 0x45, 0xf9, 0x24, 0xfc, 0x31, 0xf9, 0x4b, 0xfc, 0x24, 0xf9, 0x7b, 0xfc, 0x3a, 0xf9, 0xce, 0xfc, 0x8d, 0xf9, 0x55, 0xfd, 0x28, 0xfa, 0x11, 0xfe, 0x04, 0xfb, 0xea, 0xfe, 0xfe, 0xfb, 0xb6, 0xff, 0xe8, 0xfc, 0x48, 0x00, 0x94, 0xfd, 0x88, 0x00, 0xe9, 0xfd, 0x7d, 0x00, 0xf1, 0xfd, 0x47, 0x00, 0xd1, 0xfd, 0x1a, 0x00, 0xbe, 0xfd, 0x1e, 0x00, 0xe8, 0xfd, 0x69, 0x00, 0x68, 0xfe, 0xf8, 0x00, 0x3f, 0xff, 0xbb, 0x01, 0x58, 0x00, 0xa0, 0x02, 0x95, 0x01, 0x98, 0x03, 0xd6, 0x02, 0x99, 0x04, 0x02, 0x04, 0x98, 0x05, 0x04, 0x05, 0x84, 0x06, 0xcf, 0x05, 0x45, 0x07, 0x5f, 0x06, 0xc5, 0x07, 0xbb, 0x06, 0xf3, 0x07, 0xea, 0x06, 0xca, 0x07, 0xf1, 0x06, 0x4f, 0x07, 0xc6, 0x06, 0x8e, 0x06, 0x54, 0x06, 0x9b, 0x05, 0x88, 0x05, 0x91, 0x04, 0x67, 0x04, 0x95, 0x03, 0x1c, 0x03, 169 | 0xd0, 0x02, 0xf5, 0x01, 0x65, 0x02, 0x46, 0x01, 0x61, 0x02, 0x4b, 0x01, 0xb8, 0x02, 0x01, 0x02, 0x44, 0x03, 0x28, 0x03, 0xd7, 0x03, 0x59, 0x04, 0x4a, 0x04, 0x34, 0x05, 0x8b, 0x04, 0x8d, 0x05, 0x9b, 0x04, 0x72, 0x05, 0x84, 0x04, 0x20, 0x05, 0x4c, 0x04, 0xd8, 0x04, 0xee, 0x03, 0xba, 0x04, 0x63, 0x03, 0xb9, 0x04, 0xa9, 0x02, 0xa7, 0x04, 0xd2, 0x01, 0x5a, 0x04, 0xf9, 0x00, 0xc0, 0x03, 0x3b, 0x00, 0xf1, 0x02, 0xa0, 0xff, 0x18, 0x02, 0x21, 0xff, 0x5f, 0x01, 0xa7, 0xfe, 0xda, 0x00, 0x2a, 0xfe, 0x84, 0x00, 0xbc, 0xfd, 0x57, 0x00, 0x8f, 0xfd, 0x58, 0x00, 0xda, 0xfd, 0xa5, 0x00, 0xc2, 0xfe, 0x64, 0x01, 0x3c, 0x00, 0xaa, 0x02, 0x0b, 0x02, 0x60, 0x04, 0xcc, 0x03, 0x39, 0x06, 0x1d, 0x05, 0xc4, 0x07, 0xb3, 0x05, 0x92, 0x08, 0x6f, 0x05, 0x5f, 0x08, 0x5c, 0x04, 0x2a, 0x07, 170 | 0xa5, 0x02, 0x3a, 0x05, 0x86, 0x00, 0xfd, 0x02, 0x46, 0xfe, 0xe7, 0x00, 0x28, 0xfc, 0x45, 0xff, 0x68, 0xfa, 0x2b, 0xfe, 0x2d, 0xf9, 0x7c, 0xfd, 0x7a, 0xf8, 0xfd, 0xfc, 0x2a, 0xf8, 0x79, 0xfc, 0x01, 0xf8, 0xda, 0xfb, 0xbd, 0xf7, 0x2d, 0xfb, 0x37, 0xf7, 0x91, 0xfa, 0x70, 0xf6, 0x22, 0xfa, 0x90, 0xf5, 0xe4, 0xf9, 0xcf, 0xf4, 0xbd, 0xf9, 0x60, 0xf4, 0x8b, 0xf9, 0x57, 0xf4, 0x3b, 0xf9, 0xac, 0xf4, 0xe1, 0xf8, 0x43, 0xf5, 0xae, 0xf8, 0xf7, 0xf5, 0xd9, 0xf8, 0xa8, 0xf6, 0x74, 0xf9, 0x36, 0xf7, 0x54, 0xfa, 0x7a, 0xf7, 0x0f, 0xfb, 0x47, 0xf7, 0x28, 0xfb, 0x71, 0xf6, 0x40, 0xfa, 0xe5, 0xf4, 0x46, 0xf8, 0xbb, 0xf2, 0x89, 0xf5, 0x3a, 0xf0, 0x97, 0xf2, 0xcc, 0xed, 0x0a, 0xf0, 0xe2, 0xeb, 0x53, 0xee, 0xc3, 0xea, 0x8f, 0xed, 0x7b, 0xea, 0x91, 0xed, 0xc8, 0xea, 0xf2, 0xed, 171 | 0x31, 0xeb, 0x3a, 0xee, 0x2e, 0xeb, 0x03, 0xee, 0x52, 0xea, 0x08, 0xed, 0x75, 0xe8, 0x34, 0xeb, 0xc2, 0xe5, 0xa5, 0xe8, 0xb0, 0xe2, 0xad, 0xe5, 0xd7, 0xdf, 0xc2, 0xe2, 0xc4, 0xdd, 0x67, 0xe0, 0xc6, 0xdc, 0x05, 0xdf, 0xd6, 0xdc, 0xc0, 0xde, 0xa9, 0xdd, 0x6e, 0xdf, 0xc9, 0xde, 0x9c, 0xe0, 0xca, 0xdf, 0xbc, 0xe1, 0x66, 0xe0, 0x55, 0xe2, 0x90, 0xe0, 0x33, 0xe2, 0x59, 0xe0, 0x67, 0xe1, 0xd7, 0xdf, 0x33, 0xe0, 0x14, 0xdf, 0xdd, 0xde, 0x08, 0xde, 0x8f, 0xdd, 0xb1, 0xdc, 0x50, 0xdc, 0x2c, 0xdb, 0x18, 0xdb, 0xb9, 0xd9, 0xeb, 0xd9, 0xad, 0xd8, 0xe8, 0xd8, 0x50, 0xd8, 0x42, 0xd8, 0xb4, 0xd8, 0x24, 0xd8, 0xab, 0xd9, 0x98, 0xd8, 0xda, 0xda, 0x79, 0xd9, 0xe2, 0xdb, 0x82, 0xda, 0x88, 0xdc, 0x6e, 0xdb, 0xd0, 0xdc, 0x13, 0xdc, 0xed, 0xdc, 0x72, 0xdc, 0x1d, 0xdd, 0xa8, 0xdc, 172 | 0x8d, 0xdd, 0xdd, 0xdc, 0x3e, 0xde, 0x2c, 0xdd, 0x14, 0xdf, 0x9a, 0xdd, 0xea, 0xdf, 0x20, 0xde, 0xb2, 0xe0, 0xba, 0xde, 0x7c, 0xe1, 0x70, 0xdf, 0x66, 0xe2, 0x51, 0xe0, 0x87, 0xe3, 0x63, 0xe1, 0xdb, 0xe4, 0x96, 0xe2, 0x39, 0xe6, 0xc1, 0xe3, 0x69, 0xe7, 0xac, 0xe4, 0x3c, 0xe8, 0x2e, 0xe5, 0xa4, 0xe8, 0x3e, 0xe5, 0xc0, 0xe8, 0x06, 0xe5, 0xce, 0xe8, 0xcf, 0xe4, 0x12, 0xe9, 0xea, 0xe4, 0xbc, 0xe9, 0x8c, 0xe5, 0xcf, 0xea, 0xb5, 0xe6, 0x23, 0xec, 0x2d, 0xe8, 0x73, 0xed, 0x99, 0xe9, 0x79, 0xee, 0xa1, 0xea, 0x0a, 0xef, 0x17, 0xeb, 0x29, 0xef, 0x07, 0xeb, 0x02, 0xef, 0xb3, 0xea, 0xd5, 0xee, 0x6f, 0xea, 0xd3, 0xee, 0x7a, 0xea, 0x0f, 0xef, 0xe0, 0xea, 0x70, 0xef, 0x77, 0xeb, 0xc9, 0xef, 0xfa, 0xeb, 0xfa, 0xef, 0x38, 0xec, 0x01, 0xf0, 0x29, 0xec, 0x04, 0xf0, 0xf8, 0xeb, 173 | 0x34, 0xf0, 0xe5, 0xeb, 0xac, 0xf0, 0x1c, 0xec, 0x54, 0xf1, 0x91, 0xec, 0xe6, 0xf1, 0x02, 0xed, 0x0e, 0xf2, 0x1c, 0xed, 0x95, 0xf1, 0xa5, 0xec, 0x8e, 0xf0, 0xa5, 0xeb, 0x4c, 0xef, 0x66, 0xea, 0x47, 0xee, 0x55, 0xe9, 0xe1, 0xed, 0xcf, 0xe8, 0x3f, 0xee, 0xf8, 0xe8, 0x37, 0xef, 0xb4, 0xe9, 0x74, 0xf0, 0xc2, 0xea, 0x9e, 0xf1, 0xdf, 0xeb, 0x85, 0xf2, 0xe8, 0xec, 0x28, 0xf3, 0xd7, 0xed, 0xa5, 0xf3, 0xb4, 0xee, 0x14, 0xf4, 0x75, 0xef, 0x73, 0xf4, 0xfc, 0xef, 0xa4, 0xf4, 0x21, 0xf0, 0x86, 0xf4, 0xcf, 0xef, 0x12, 0xf4, 0x21, 0xef, 0x6a, 0xf3, 0x5c, 0xee, 0xce, 0xf2, 0xd7, 0xed, 0x80, 0xf2, 0xd2, 0xed, 0xa5, 0xf2, 0x55, 0xee, 0x38, 0xf3, 0x34, 0xef, 0x14, 0xf4, 0x26, 0xf0, 0x0a, 0xf5, 0xf0, 0xf0, 0xfb, 0xf5, 0x82, 0xf1, 0xe3, 0xf6, 0xff, 0xf1, 0xd1, 0xf7, 0x9b, 0xf2, 174 | 0xd1, 0xf8, 0x80, 0xf3, 0xdd, 0xf9, 0xa6, 0xf4, 0xd6, 0xfa, 0xd8, 0xf5, 0x89, 0xfb, 0xc0, 0xf6, 0xc9, 0xfb, 0x14, 0xf7, 0x7e, 0xfb, 0xb1, 0xf6, 0xb9, 0xfa, 0xb2, 0xf5, 0xa9, 0xf9, 0x63, 0xf4, 0x97, 0xf8, 0x29, 0xf3, 0xc6, 0xf7, 0x58, 0xf2, 0x66, 0xf7, 0x1e, 0xf2, 0x7a, 0xf7, 0x70, 0xf2, 0xe1, 0xf7, 0x14, 0xf3, 0x5f, 0xf8, 0xbf, 0xf3, 0xb7, 0xf8, 0x2d, 0xf4, 0xc8, 0xf8, 0x43, 0xf4, 0x99, 0xf8, 0x15, 0xf4, 0x5b, 0xf8, 0xd7, 0xf3, 0x4d, 0xf8, 0xca, 0xf3, 0xa2, 0xf8, 0x1b, 0xf4, 0x6b, 0xf9, 0xd6, 0xf4, 0x8c, 0xfa, 0xe0, 0xf5, 0xd2, 0xfb, 0x0f, 0xf7, 0x03, 0xfd, 0x34, 0xf8, 0xfa, 0xfd, 0x31, 0xf9, 0xae, 0xfe, 0xf3, 0xf9, 0x29, 0xff, 0x70, 0xfa, 0x7b, 0xff, 0xa2, 0xfa, 0xa9, 0xff, 0x85, 0xfa, 0xaf, 0xff, 0x1e, 0xfa, 0x85, 0xff, 0x89, 0xf9, 0x2e, 0xff, 0xed, 0xf8, 175 | 0xbb, 0xfe, 0x78, 0xf8, 0x48, 0xfe, 0x41, 0xf8, 0xee, 0xfd, 0x40, 0xf8, 0xb8, 0xfd, 0x4b, 0xf8, 0x98, 0xfd, 0x28, 0xf8, 0x6d, 0xfd, 0xae, 0xf7, 0x14, 0xfd, 0xd8, 0xf6, 0x75, 0xfc, 0xc7, 0xf5, 0x92, 0xfb, 0xba, 0xf4, 0x90, 0xfa, 0xeb, 0xf3, 0xae, 0xf9, 0x84, 0xf3, 0x39, 0xf9, 0x94, 0xf3, 0x6f, 0xf9, 0x15, 0xf4, 0x66, 0xfa, 0xf5, 0xf4, 0xf8, 0xfb, 0x13, 0xf6, 0xc2, 0xfd, 0x42, 0xf7, 0x3d, 0xff, 0x3e, 0xf8, 0xe4, 0xff, 0xb5, 0xf8, 0x6c, 0xff, 0x5f, 0xf8, 0xda, 0xfd, 0x19, 0xf7, 0x88, 0xfb, 0xfe, 0xf4, 0xfa, 0xf8, 0x63, 0xf2, 0xab, 0xf6, 0xb8, 0xef, 0xe1, 0xf4, 0x63, 0xed, 0x9e, 0xf3, 0x9d, 0xeb, 0xb7, 0xf2, 0x68, 0xea, 0x00, 0xf2, 0xa2, 0xe9, 0x71, 0xf1, 0x29, 0xe9, 0x24, 0xf1, 0xef, 0xe8, 0x41, 0xf1, 0xf9, 0xe8, 0xd1, 0xf1, 0x51, 0xe9, 0xa6, 0xf2, 0xe2, 0xe9, 176 | 0x60, 0xf3, 0x76, 0xea, 0x9d, 0xf3, 0xbe, 0xea, 0x2b, 0xf3, 0x7e, 0xea, 0x29, 0xf2, 0xac, 0xe9, 0xf9, 0xf0, 0x81, 0xe8, 0x0c, 0xf0, 0x5f, 0xe7, 0xae, 0xef, 0xa4, 0xe6, 0xd5, 0xef, 0x7b, 0xe6, 0x32, 0xf0, 0xc6, 0xe6, 0x59, 0xf0, 0x27, 0xe7, 0xff, 0xef, 0x37, 0xe7, 0x24, 0xef, 0xb5, 0xe6, 0x17, 0xee, 0xb0, 0xe5, 0x4e, 0xed, 0x86, 0xe4, 0x2e, 0xed, 0xbc, 0xe3, 0xe4, 0xed, 0xc4, 0xe3, 0x56, 0xef, 0xd3, 0xe4, 0x36, 0xf1, 0xc1, 0xe6, 0x2d, 0xf3, 0x22, 0xe9, 0xf9, 0xf4, 0x6e, 0xeb, 0x83, 0xf6, 0x3a, 0xed, 0xd2, 0xf7, 0x5f, 0xee, 0xfe, 0xf8, 0xfe, 0xee, 0x19, 0xfa, 0x6a, 0xef, 0x28, 0xfb, 0xfb, 0xef, 0x28, 0xfc, 0xe7, 0xf0, 0x19, 0xfd, 0x31, 0xf2, 0x08, 0xfe, 0xb4, 0xf3, 0x0e, 0xff, 0x3f, 0xf5, 0x44, 0x00, 0xaf, 0xf6, 0xad, 0x01, 0xfc, 0xf7, 0x2f, 0x03, 0x2e, 0xf9, 177 | 0x8e, 0x04, 0x44, 0xfa, 0x81, 0x05, 0x26, 0xfb, 0xd1, 0x05, 0xa8, 0xfb, 0x75, 0x05, 0xa8, 0xfb, 0xa0, 0x04, 0x2b, 0xfb, 0xb4, 0x03, 0x6f, 0xfa, 0x22, 0x03, 0xdc, 0xf9, 0x3c, 0x03, 0xdb, 0xf9, 0x1a, 0x04, 0xa3, 0xfa, 0x92, 0x05, 0x21, 0xfc, 0x57, 0x07, 0x04, 0xfe, 0x18, 0x09, 0xe3, 0xff, 0xa4, 0x0a, 0x74, 0x01, 0xf1, 0x0b, 0xa1, 0x02, 0x07, 0x0d, 0x87, 0x03, 0xeb, 0x0d, 0x4a, 0x04, 0x89, 0x0e, 0xf5, 0x04, 0xbc, 0x0e, 0x6a, 0x05, 0x6e, 0x0e, 0x79, 0x05, 0xb5, 0x0d, 0x10, 0x05, 0xe2, 0x0c, 0x5a, 0x04, 0x6e, 0x0c, 0xc7, 0x03, 0xc9, 0x0c, 0xe4, 0x03, 0x2e, 0x0e, 0x19, 0x05, 0x80, 0x10, 0x78, 0x07, 0x5a, 0x13, 0xab, 0x0a, 0x37, 0x16, 0x18, 0x0e, 0xa3, 0x18, 0x1a, 0x11, 0x64, 0x1a, 0x41, 0x13, 0x7c, 0x1b, 0x76, 0x14, 0x1a, 0x1c, 0xee, 0x14, 0x77, 0x1c, 0x09, 0x15, 178 | 0xc2, 0x1c, 0x25, 0x15, 0x16, 0x1d, 0x83, 0x15, 0x86, 0x1d, 0x38, 0x16, 0x1e, 0x1e, 0x38, 0x17, 0xe7, 0x1e, 0x65, 0x18, 0xda, 0x1f, 0x95, 0x19, 0xd7, 0x20, 0x97, 0x1a, 0xa7, 0x21, 0x3e, 0x1b, 0x0d, 0x22, 0x66, 0x1b, 0xdf, 0x21, 0x02, 0x1b, 0x22, 0x21, 0x2e, 0x1a, 0x10, 0x20, 0x2b, 0x19, 0x07, 0x1f, 0x51, 0x18, 0x69, 0x1e, 0xf4, 0x17, 0x7a, 0x1e, 0x44, 0x18, 0x47, 0x1f, 0x43, 0x19, 0xa4, 0x20, 0xbc, 0x1a, 0x3f, 0x22, 0x5c, 0x1c, 0xb9, 0x23, 0xca, 0x1d, 0xbf, 0x24, 0xc4, 0x1e, 0x22, 0x25, 0x29, 0x1f, 0xd9, 0x24, 0xff, 0x1e, 0x00, 0x24, 0x64, 0x1e, 0xc4, 0x22, 0x81, 0x1d, 0x5f, 0x21, 0x78, 0x1c, 0x03, 0x20, 0x66, 0x1b, 0xd7, 0x1e, 0x61, 0x1a, 0xf5, 0x1d, 0x80, 0x19, 0x6b, 0x1d, 0xdd, 0x18, 0x3c, 0x1d, 0x90, 0x18, 0x58, 0x1d, 0xa2, 0x18, 0x9e, 0x1d, 0xfc, 0x18, 179 | 0xdb, 0x1d, 0x67, 0x19, 0xcf, 0x1d, 0x94, 0x19, 0x48, 0x1d, 0x3d, 0x19, 0x35, 0x1c, 0x45, 0x18, 0xbb, 0x1a, 0xca, 0x16, 0x27, 0x19, 0x25, 0x15, 0xe1, 0x17, 0xc5, 0x13, 0x39, 0x17, 0x0b, 0x13, 0x4d, 0x17, 0x1a, 0x13, 0xf5, 0x17, 0xcd, 0x13, 0xd3, 0x18, 0xc5, 0x14, 0x74, 0x19, 0x90, 0x15, 0x80, 0x19, 0xd0, 0x15, 0xcf, 0x18, 0x5b, 0x15, 0x78, 0x17, 0x3a, 0x14, 0xb7, 0x15, 0xa0, 0x12, 0xde, 0x13, 0xd5, 0x10, 0x37, 0x12, 0x23, 0x0f, 0xfc, 0x10, 0xd0, 0x0d, 0x4b, 0x10, 0x10, 0x0d, 0x25, 0x10, 0xfb, 0x0c, 0x6f, 0x10, 0x7e, 0x0d, 0xec, 0x10, 0x53, 0x0e, 0x4c, 0x11, 0x0e, 0x0f, 0x3e, 0x11, 0x37, 0x0f, 0x8c, 0x10, 0x81, 0x0e, 0x34, 0x0f, 0xe5, 0x0c, 0x69, 0x0d, 0xb3, 0x0a, 0x85, 0x0b, 0x71, 0x08, 0xe6, 0x09, 0xa8, 0x06, 0xcf, 0x08, 0xa9, 0x05, 0x4e, 0x08, 0x76, 0x05, 180 | 0x46, 0x08, 0xc5, 0x05, 0x81, 0x08, 0x2f, 0x06, 0xc8, 0x08, 0x5b, 0x06, 0xf2, 0x08, 0x26, 0x06, 0xe8, 0x08, 0x9b, 0x05, 0x97, 0x08, 0xdf, 0x04, 0xef, 0x07, 0x0a, 0x04, 0xdc, 0x06, 0x19, 0x03, 0x59, 0x05, 0xec, 0x01, 0x77, 0x03, 0x66, 0x00, 0x64, 0x01, 0x86, 0xfe, 0x63, 0xff, 0x74, 0xfc, 0xb5, 0xfd, 0x7c, 0xfa, 0x85, 0xfc, 0xef, 0xf8, 0xdc, 0xfb, 0x00, 0xf8, 0xa0, 0xfb, 0xb1, 0xf7, 0xa3, 0xfb, 0xd3, 0xf7, 0xb6, 0xfb, 0x1b, 0xf8, 0xb6, 0xfb, 0x42, 0xf8, 0x95, 0xfb, 0x21, 0xf8, 0x5a, 0xfb, 0xbd, 0xf7, 0x14, 0xfb, 0x39, 0xf7, 0xd7, 0xfa, 0xc7, 0xf6, 0xb3, 0xfa, 0x87, 0xf6, 0xaa, 0xfa, 0x7a, 0xf6, 0xb2, 0xfa, 0x81, 0xf6, 0xb3, 0xfa, 0x6f, 0xf6, 0x93, 0xfa, 0x20, 0xf6, 0x37, 0xfa, 0x8a, 0xf5, 0x94, 0xf9, 0xbc, 0xf4, 0xb2, 0xf8, 0xd6, 0xf3, 0xa8, 0xf7, 0xf7, 0xf2, 181 | 0x9b, 0xf6, 0x2b, 0xf2, 0xb3, 0xf5, 0x73, 0xf1, 0x11, 0xf5, 0xcf, 0xf0, 0xce, 0xf4, 0x53, 0xf0, 0xf8, 0xf4, 0x28, 0xf0, 0x8c, 0xf5, 0x80, 0xf0, 0x7a, 0xf6, 0x79, 0xf1, 0xa0, 0xf7, 0x01, 0xf3, 0xcf, 0xf8, 0xcb, 0xf4, 0xd4, 0xf9, 0x66, 0xf6, 0x80, 0xfa, 0x63, 0xf7, 0xb3, 0xfa, 0x87, 0xf7, 0x68, 0xfa, 0xdd, 0xf6, 0xb1, 0xf9, 0xb9, 0xf5, 0xb5, 0xf8, 0x89, 0xf4, 0xa9, 0xf7, 0xb1, 0xf3, 0xc9, 0xf6, 0x63, 0xf3, 0x4a, 0xf6, 0x9d, 0xf3, 0x53, 0xf6, 0x38, 0xf4, 0xef, 0xf6, 0x06, 0xf5, 0x03, 0xf8, 0xe6, 0xf5, 0x56, 0xf9, 0xca, 0xf6, 0x99, 0xfa, 0xb0, 0xf7, 0x87, 0xfb, 0x90, 0xf8, 0xfa, 0xfb, 0x5a, 0xf9, 0xfe, 0xfb, 0xf9, 0xf9, 0xc2, 0xfb, 0x5d, 0xfa, 0x88, 0xfb, 0x8d, 0xfa, 0x7e, 0xfb, 0x9f, 0xfa, 0xb3, 0xfb, 0xb4, 0xfa, 0x10, 0xfc, 0xe9, 0xfa, 0x74, 0xfc, 0x50, 0xfb, 182 | 0xcb, 0xfc, 0xe9, 0xfb, 0x19, 0xfd, 0xaa, 0xfc, 0x74, 0xfd, 0x80, 0xfd, 0xef, 0xfd, 0x56, 0xfe, 0x80, 0xfe, 0x16, 0xff, 0x05, 0xff, 0xac, 0xff, 0x50, 0xff, 0x0d, 0x00, 0x4d, 0xff, 0x3f, 0x00, 0x17, 0xff, 0x60, 0x00, 0xf8, 0xfe, 0xa2, 0x00, 0x47, 0xff, 0x37, 0x01, 0x3f, 0x00, 0x43, 0x02, 0xdb, 0x01, 0xc8, 0x03, 0xcf, 0x03, 0x9d, 0x05, 0xa7, 0x05, 0x7a, 0x07, 0xfb, 0x06, 0x0f, 0x09, 0x93, 0x07, 0x1b, 0x0a, 0x7e, 0x07, 0x81, 0x0a, 0xfd, 0x06, 0x4e, 0x0a, 0x61, 0x06, 0xb4, 0x09, 0xe3, 0x05, 0xf4, 0x08, 0x94, 0x05, 0x4d, 0x08, 0x61, 0x05, 0xe8, 0x07, 0x30, 0x05, 0xd7, 0x07, 0xf7, 0x04, 0x0f, 0x08, 0xc5, 0x04, 0x78, 0x08, 0xbf, 0x04, 0xf6, 0x08, 0x04, 0x05, 0x78, 0x09, 0x99, 0x05, 0xf3, 0x09, 0x59, 0x06, 0x63, 0x0a, 0x04, 0x07, 0xc1, 0x0a, 0x57, 0x07, 0xfc, 0x0a, 183 | }); err != nil { 184 | t.Error("Encode failed, err is", err) 185 | return 186 | } 187 | if len(frame) != 139 { 188 | t.Error("AAC encode failed, size is", len(frame)) 189 | return 190 | } 191 | 192 | // flush got the last packets. 193 | // @remark user should flush util frame is nil. 194 | if frame, err = e.Flush(); err != nil { 195 | t.Error("Flush failed, err is", err) 196 | return 197 | } 198 | if len(frame) != 225 { 199 | t.Error("Flush failed, size is", len(frame)) 200 | return 201 | } 202 | 203 | if frame, err = e.Flush(); err != nil { 204 | t.Error("Flush failed, err is", err) 205 | return 206 | } 207 | if len(frame) != 198 { 208 | t.Error("Flush failed, size is", len(frame)) 209 | return 210 | } 211 | 212 | if frame, err = e.Flush(); err != nil { 213 | t.Error("Flush failed, err is", err) 214 | return 215 | } 216 | if len(frame) != 0 { 217 | t.Error("Flush failed, size is", len(frame)) 218 | return 219 | } 220 | 221 | if frame, err = e.Flush(); err != nil { 222 | t.Error("Flush failed, err is", err) 223 | return 224 | } 225 | if len(frame) != 0 { 226 | t.Error("Flush failed, size is", len(frame)) 227 | return 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /fdkaac/example_test.go: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2016 winlin 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | // this software and associated documentation files (the "Software"), to deal in 7 | // the Software without restriction, including without limitation the rights to 8 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | // the Software, and to permit persons to whom the Software is furnished to do so, 10 | // subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in all 13 | // copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | package fdkaac_test 23 | 24 | import ( 25 | "fmt" 26 | "github.com/winlinvip/go-fdkaac/fdkaac" 27 | ) 28 | 29 | func ExampleAacDecoder_RAW() { 30 | var err error 31 | d := fdkaac.NewAacDecoder() 32 | 33 | asc := []byte{0x12, 0x10} 34 | if err := d.InitRaw(asc); err != nil { 35 | fmt.Println("init decoder failed, err is", err) 36 | return 37 | } 38 | defer d.Close() 39 | 40 | // directly decode the frame to pcm. 41 | var pcm []byte 42 | if pcm, err = d.Decode([]byte{ 43 | 0x21, 0x17, 0x55, 0x35, 0xa1, 0x0c, 0x2f, 0x00, 0x00, 0x50, 0x23, 0xa6, 0x81, 0xbf, 0x9c, 0xbf, 44 | 0x13, 0x73, 0xa9, 0xb0, 0x41, 0xed, 0x60, 0x23, 0x48, 0xf7, 0x34, 0x07, 0x12, 0x53, 0xd8, 0xeb, 45 | 0x49, 0xf4, 0x1e, 0x73, 0xc9, 0x01, 0xfd, 0x16, 0x9f, 0x8e, 0xb5, 0xd5, 0x9b, 0xb6, 0x49, 0xdb, 46 | 0x35, 0x61, 0x3b, 0x54, 0xad, 0x5f, 0x9d, 0x34, 0x94, 0x88, 0x58, 0x89, 0x33, 0x54, 0x89, 0xc4, 47 | 0x09, 0x80, 0xa2, 0xa1, 0x28, 0x81, 0x42, 0x10, 0x48, 0x94, 0x05, 0xfb, 0x03, 0xc7, 0x64, 0xe1, 48 | 0x54, 0x17, 0xf6, 0x65, 0x15, 0x00, 0x48, 0xa9, 0x80, 0x00, 0x38}); err != nil { 49 | fmt.Println("decode failed, err is", err) 50 | return 51 | } 52 | 53 | fmt.Println("SampleRate:", d.SampleRate()) 54 | fmt.Println("FrameSize:", d.FrameSize()) 55 | fmt.Println("NumChannels:", d.NumChannels()) 56 | fmt.Println("AacSampleRate:", d.AacSampleRate()) 57 | fmt.Println("Profile:", d.Profile()) 58 | fmt.Println("AudioObjectType:", d.AudioObjectType()) 59 | fmt.Println("ChannelConfig:", d.ChannelConfig()) 60 | fmt.Println("Bitrate:", d.Bitrate()) 61 | fmt.Println("AacSamplesPerFrame:", d.AacSamplesPerFrame()) 62 | fmt.Println("AacNumChannels:", d.AacNumChannels()) 63 | fmt.Println("ExtensionAudioObjectType:", d.ExtensionAudioObjectType()) 64 | fmt.Println("ExtensionSamplingRate:", d.ExtensionSamplingRate()) 65 | fmt.Println("NumLostAccessUnits:", d.NumLostAccessUnits()) 66 | fmt.Println("NumTotalBytes:", d.NumTotalBytes()) 67 | fmt.Println("NumBadBytes:", d.NumBadBytes()) 68 | fmt.Println("NumTotalAccessUnits:", d.NumTotalAccessUnits()) 69 | fmt.Println("NumBadAccessUnits:", d.NumBadAccessUnits()) 70 | fmt.Println("SampleBits:", d.SampleBits()) 71 | fmt.Println("PCM:", len(pcm)) 72 | 73 | // Output: 74 | // SampleRate: 44100 75 | // FrameSize: 1024 76 | // NumChannels: 2 77 | // AacSampleRate: 44100 78 | // Profile: 1 79 | // AudioObjectType: 2 80 | // ChannelConfig: 2 81 | // Bitrate: 31352 82 | // AacSamplesPerFrame: 1024 83 | // AacNumChannels: 2 84 | // ExtensionAudioObjectType: 0 85 | // ExtensionSamplingRate: 0 86 | // NumLostAccessUnits: 0 87 | // NumTotalBytes: 91 88 | // NumBadBytes: 0 89 | // NumTotalAccessUnits: 1 90 | // NumBadAccessUnits: 0 91 | // SampleBits: 16 92 | // PCM: 4096 93 | } 94 | 95 | func ExampleAacDecoder_ADTS() { 96 | var err error 97 | d := fdkaac.NewAacDecoder() 98 | 99 | if err := d.InitAdts(); err != nil { 100 | fmt.Println("init decoder failed, err is", err) 101 | return 102 | } 103 | defer d.Close() 104 | 105 | var pcm []byte 106 | if pcm, err = d.Decode([]byte{0xff, 0xf1, 0x50, 0x80, 0x0c, 0x40, 0xfc, 107 | 0x21, 0x17, 0x55, 0x35, 0xa1, 0x0c, 0x2f, 0x00, 0x00, 0x50, 0x23, 0xa6, 0x81, 0xbf, 0x9c, 0xbf, 108 | 0x13, 0x73, 0xa9, 0xb0, 0x41, 0xed, 0x60, 0x23, 0x48, 0xf7, 0x34, 0x07, 0x12, 0x53, 0xd8, 0xeb, 109 | 0x49, 0xf4, 0x1e, 0x73, 0xc9, 0x01, 0xfd, 0x16, 0x9f, 0x8e, 0xb5, 0xd5, 0x9b, 0xb6, 0x49, 0xdb, 110 | 0x35, 0x61, 0x3b, 0x54, 0xad, 0x5f, 0x9d, 0x34, 0x94, 0x88, 0x58, 0x89, 0x33, 0x54, 0x89, 0xc4, 111 | 0x09, 0x80, 0xa2, 0xa1, 0x28, 0x81, 0x42, 0x10, 0x48, 0x94, 0x05, 0xfb, 0x03, 0xc7, 0x64, 0xe1, 112 | 0x54, 0x17, 0xf6, 0x65, 0x15, 0x00, 0x48, 0xa9, 0x80, 0x00, 0x38}); err != nil { 113 | fmt.Println("decode failed, err is", err) 114 | return 115 | } 116 | 117 | fmt.Println("SampleRate:", d.SampleRate()) 118 | fmt.Println("FrameSize:", d.FrameSize()) 119 | fmt.Println("NumChannels:", d.NumChannels()) 120 | fmt.Println("AacSampleRate:", d.AacSampleRate()) 121 | fmt.Println("Profile:", d.Profile()) 122 | fmt.Println("AudioObjectType:", d.AudioObjectType()) 123 | fmt.Println("ChannelConfig:", d.ChannelConfig()) 124 | fmt.Println("Bitrate:", d.Bitrate()) 125 | fmt.Println("AacSamplesPerFrame:", d.AacSamplesPerFrame()) 126 | fmt.Println("AacNumChannels:", d.AacNumChannels()) 127 | fmt.Println("ExtensionAudioObjectType:", d.ExtensionAudioObjectType()) 128 | fmt.Println("ExtensionSamplingRate:", d.ExtensionSamplingRate()) 129 | fmt.Println("NumLostAccessUnits:", d.NumLostAccessUnits()) 130 | fmt.Println("NumTotalBytes:", d.NumTotalBytes()) 131 | fmt.Println("NumBadBytes:", d.NumBadBytes()) 132 | fmt.Println("NumTotalAccessUnits:", d.NumTotalAccessUnits()) 133 | fmt.Println("NumBadAccessUnits:", d.NumBadAccessUnits()) 134 | fmt.Println("SampleBits:", d.SampleBits()) 135 | fmt.Println("PCM:", len(pcm)) 136 | 137 | // Output: 138 | // SampleRate: 44100 139 | // FrameSize: 1024 140 | // NumChannels: 2 141 | // AacSampleRate: 44100 142 | // Profile: 1 143 | // AudioObjectType: 2 144 | // ChannelConfig: 2 145 | // Bitrate: 33764 146 | // AacSamplesPerFrame: 1024 147 | // AacNumChannels: 2 148 | // ExtensionAudioObjectType: 0 149 | // ExtensionSamplingRate: 0 150 | // NumLostAccessUnits: 0 151 | // NumTotalBytes: 98 152 | // NumBadBytes: 0 153 | // NumTotalAccessUnits: 1 154 | // NumBadAccessUnits: 0 155 | // SampleBits: 16 156 | // PCM: 4096 157 | } 158 | 159 | func ExampleAacDecoder_ADTS_Stream_NotEnoughBits() { 160 | var err error 161 | d := fdkaac.NewAacDecoder() 162 | 163 | // @remark the partial stream only support by ADTS. 164 | if err := d.InitAdts(); err != nil { 165 | fmt.Println("init decoder failed, err is", err) 166 | return 167 | } 168 | defer d.Close() 169 | 170 | // Fill then decode, aac stream. 171 | // AAC Frame #0, part 0 172 | var pcm []byte 173 | if pcm, err = d.Decode([]byte{0xff, 0xf1, 0x50, 0x80, 0x0c, 0x40, 0xfc, 174 | 0x21, 0x17, 0x55, 0x35, 0xa1, 0x0c, 0x2f, 0x00, 0x00, 0x50, 0x23, 0xa6, 0x81, 0xbf, 0x9c, 0xbf, 175 | 0x13, 0x73, 0xa9, 0xb0, 0x41, 0xed, 0x60, 0x23, 0x48, 0xf7, 0x34, 0x07, 0x12, 0x53, 0xd8, 0xeb, 176 | 0x49, 0xf4, 0x1e, 0x73, 0xc9, 0x01, 0xfd, 0x16, 0x9f, 0x8e, 0xb5, 0xd5, 0x9b, 0xb6, 0x49, 0xdb, 177 | 0x35, 0x61, 0x3b, 0x54, 0xad, 0x5f, 0x9d, 0x34, 0x94, 0x88, 0x58, 0x89, 0x33, 0x54, 0x89, 0xc4, 178 | 0x09, 0x80, 0xa2, 0xa1, 0x28, 0x81, 0x42, 0x10, 0x48, 0x94, 0x05, 0xfb, 0x03, 0xc7, 0x64, 0xe1, 179 | 0x54}); err != nil { 180 | fmt.Println("fill decoder failed, err is", err) 181 | return 182 | } 183 | if len(pcm) != 0 { 184 | fmt.Println("not enough bits") 185 | return 186 | } 187 | 188 | // AAC Frame #0, part 1 189 | if pcm, err = d.Decode([]byte{0x17, 0xf6, 0x65, 0x15, 0x00, 0x48, 0xa9, 0x80, 0x00, 0x38}); err != nil { 190 | fmt.Println("fill decoder failed, err is", err) 191 | return 192 | } 193 | 194 | fmt.Println("SampleRate:", d.SampleRate()) 195 | fmt.Println("FrameSize:", d.FrameSize()) 196 | fmt.Println("NumChannels:", d.NumChannels()) 197 | fmt.Println("AacSampleRate:", d.AacSampleRate()) 198 | fmt.Println("Profile:", d.Profile()) 199 | fmt.Println("AudioObjectType:", d.AudioObjectType()) 200 | fmt.Println("ChannelConfig:", d.ChannelConfig()) 201 | fmt.Println("Bitrate:", d.Bitrate()) 202 | fmt.Println("AacSamplesPerFrame:", d.AacSamplesPerFrame()) 203 | fmt.Println("AacNumChannels:", d.AacNumChannels()) 204 | fmt.Println("ExtensionAudioObjectType:", d.ExtensionAudioObjectType()) 205 | fmt.Println("ExtensionSamplingRate:", d.ExtensionSamplingRate()) 206 | fmt.Println("NumLostAccessUnits:", d.NumLostAccessUnits()) 207 | fmt.Println("NumTotalBytes:", d.NumTotalBytes()) 208 | fmt.Println("NumBadBytes:", d.NumBadBytes()) 209 | fmt.Println("NumTotalAccessUnits:", d.NumTotalAccessUnits()) 210 | fmt.Println("NumBadAccessUnits:", d.NumBadAccessUnits()) 211 | fmt.Println("SampleBits:", d.SampleBits()) 212 | fmt.Println("PCM:", len(pcm)) 213 | 214 | // Output: 215 | // SampleRate: 44100 216 | // FrameSize: 1024 217 | // NumChannels: 2 218 | // AacSampleRate: 44100 219 | // Profile: 1 220 | // AudioObjectType: 2 221 | // ChannelConfig: 2 222 | // Bitrate: 33764 223 | // AacSamplesPerFrame: 1024 224 | // AacNumChannels: 2 225 | // ExtensionAudioObjectType: 0 226 | // ExtensionSamplingRate: 0 227 | // NumLostAccessUnits: 0 228 | // NumTotalBytes: 98 229 | // NumBadBytes: 0 230 | // NumTotalAccessUnits: 1 231 | // NumBadAccessUnits: 0 232 | // SampleBits: 16 233 | // PCM: 4096 234 | } 235 | 236 | func ExampleAacDecoder_ADTS_Frames() { 237 | var err error 238 | d := fdkaac.NewAacDecoder() 239 | 240 | if err := d.InitAdts(); err != nil { 241 | fmt.Println("init decoder failed, err is", err) 242 | return 243 | } 244 | defer d.Close() 245 | 246 | // AAC FRAME #0 247 | var pcm0 []byte 248 | if pcm0, err = d.Decode([]byte{0xff, 0xf1, 0x50, 0x80, 0x0c, 0x40, 0xfc, 249 | 0x21, 0x17, 0x55, 0x35, 0xa1, 0x0c, 0x2f, 0x00, 0x00, 0x50, 0x23, 0xa6, 0x81, 0xbf, 0x9c, 0xbf, 250 | 0x13, 0x73, 0xa9, 0xb0, 0x41, 0xed, 0x60, 0x23, 0x48, 0xf7, 0x34, 0x07, 0x12, 0x53, 0xd8, 0xeb, 251 | 0x49, 0xf4, 0x1e, 0x73, 0xc9, 0x01, 0xfd, 0x16, 0x9f, 0x8e, 0xb5, 0xd5, 0x9b, 0xb6, 0x49, 0xdb, 252 | 0x35, 0x61, 0x3b, 0x54, 0xad, 0x5f, 0x9d, 0x34, 0x94, 0x88, 0x58, 0x89, 0x33, 0x54, 0x89, 0xc4, 253 | 0x09, 0x80, 0xa2, 0xa1, 0x28, 0x81, 0x42, 0x10, 0x48, 0x94, 0x05, 0xfb, 0x03, 0xc7, 0x64, 0xe1, 254 | 0x54, 0x17, 0xf6, 0x65, 0x15, 0x00, 0x48, 0xa9, 0x80, 0x00, 0x38}); err != nil { 255 | fmt.Println("decode failed, err is", err) 256 | return 257 | } 258 | 259 | // AAC FRAME #1 260 | var pcm1 []byte 261 | if pcm1, err = d.Decode([]byte{0xff, 0xf1, 0x50, 0x80, 0x0b, 0xe0, 0xfc, 262 | 0x21, 0x17, 0x55, 0x55, 0x19, 0x1a, 0x2a, 0x2d, 0x54, 0xce, 0x00, 0x58, 0x1a, 0x1e, 0x42, 0x0e, 263 | 0x1f, 0xd2, 0xd4, 0x9c, 0x15, 0x77, 0xf4, 0x07, 0x38, 0x3d, 0xc5, 0x04, 0x19, 0x64, 0x39, 0x98, 264 | 0x01, 0xae, 0x2e, 0xb1, 0xd0, 0x87, 0xca, 0x33, 0x17, 0xfb, 0x05, 0x00, 0x7a, 0x60, 0x47, 0x79, 265 | 0x6b, 0x9b, 0xdf, 0x2d, 0xfd, 0x32, 0xc6, 0x9f, 0x1f, 0x21, 0x4b, 0x04, 0x9b, 0xe2, 0x4d, 0x62, 266 | 0xc8, 0x01, 0xe0, 0x98, 0x0a, 0x37, 0x48, 0x44, 0x42, 0x02, 0x00, 0xd0, 0x7d, 0xae, 0xb4, 0x32, 267 | 0xf1, 0xcc, 0x76, 0x5f, 0x18, 0xac, 0xae, 0x0e}); err != nil { 268 | fmt.Println("decode failed, err is", err) 269 | return 270 | } 271 | 272 | fmt.Println("SampleRate:", d.SampleRate()) 273 | fmt.Println("FrameSize:", d.FrameSize()) 274 | fmt.Println("NumChannels:", d.NumChannels()) 275 | fmt.Println("AacSampleRate:", d.AacSampleRate()) 276 | fmt.Println("Profile:", d.Profile()) 277 | fmt.Println("AudioObjectType:", d.AudioObjectType()) 278 | fmt.Println("ChannelConfig:", d.ChannelConfig()) 279 | fmt.Println("Bitrate:", d.Bitrate()) 280 | fmt.Println("AacSamplesPerFrame:", d.AacSamplesPerFrame()) 281 | fmt.Println("AacNumChannels:", d.AacNumChannels()) 282 | fmt.Println("ExtensionAudioObjectType:", d.ExtensionAudioObjectType()) 283 | fmt.Println("ExtensionSamplingRate:", d.ExtensionSamplingRate()) 284 | fmt.Println("NumLostAccessUnits:", d.NumLostAccessUnits()) 285 | fmt.Println("NumTotalBytes:", d.NumTotalBytes()) 286 | fmt.Println("NumBadBytes:", d.NumBadBytes()) 287 | fmt.Println("NumTotalAccessUnits:", d.NumTotalAccessUnits()) 288 | fmt.Println("NumBadAccessUnits:", d.NumBadAccessUnits()) 289 | fmt.Println("SampleBits:", d.SampleBits()) 290 | fmt.Println("PCM0:", len(pcm0)) 291 | fmt.Println("PCM1:", len(pcm1)) 292 | 293 | // Output: 294 | // SampleRate: 44100 295 | // FrameSize: 1024 296 | // NumChannels: 2 297 | // AacSampleRate: 44100 298 | // Profile: 1 299 | // AudioObjectType: 2 300 | // ChannelConfig: 2 301 | // Bitrate: 32730 302 | // AacSamplesPerFrame: 1024 303 | // AacNumChannels: 2 304 | // ExtensionAudioObjectType: 0 305 | // ExtensionSamplingRate: 0 306 | // NumLostAccessUnits: 0 307 | // NumTotalBytes: 193 308 | // NumBadBytes: 0 309 | // NumTotalAccessUnits: 2 310 | // NumBadAccessUnits: 0 311 | // SampleBits: 16 312 | // PCM0: 4096 313 | // PCM1: 4096 314 | } 315 | 316 | func ExampleAacEncoder_LC() { 317 | var err error 318 | 319 | e := fdkaac.NewAacEncoder() 320 | if err = e.InitLc(2, 44100, 48000); err != nil { 321 | fmt.Println("Init encoder failed, err is", err) 322 | return 323 | } 324 | defer e.Close() 325 | 326 | fmt.Println("FrameSize:", e.FrameSize()) 327 | 328 | var frame []byte 329 | if frame, err = e.Encode([]byte{ 330 | 0x32, 0x04, 0xf4, 0xfd, 0x0d, 0x05, 0xaa, 0xfe, 0xfc, 0x05, 0x8b, 0xff, 0x0e, 0x07, 0x9f, 0x00, 0x44, 0x08, 0xdc, 0x01, 0x88, 0x09, 0x21, 0x03, 0xaa, 0x0a, 0x3f, 0x04, 0x75, 0x0b, 0x04, 0x05, 0xc5, 0x0b, 0x54, 0x05, 0xa0, 0x0b, 0x39, 0x05, 0x3e, 0x0b, 0xe6, 0x04, 0xf1, 0x0a, 0xa6, 0x04, 0x06, 0x0b, 0xbf, 0x04, 0x9f, 0x0b, 0x57, 0x05, 0xa7, 0x0c, 0x5f, 0x06, 0xd6, 0x0d, 0xa0, 0x07, 0xdc, 0x0e, 0xcc, 0x08, 0x7f, 0x0f, 0x9f, 0x09, 0xb5, 0x0f, 0xfc, 0x09, 0xa1, 0x0f, 0xed, 0x09, 0x7b, 0x0f, 0x9f, 0x09, 0x72, 0x0f, 0x4c, 0x09, 0x9c, 0x0f, 0x29, 0x09, 0xf5, 0x0f, 0x53, 0x09, 0x70, 0x10, 0xd0, 0x09, 0x05, 0x11, 0x91, 0x0a, 0xb7, 0x11, 0x78, 0x0b, 0x8c, 0x12, 0x63, 0x0c, 0x7b, 0x13, 0x2e, 0x0d, 0x6c, 0x14, 0xc4, 0x0d, 0x32, 0x15, 0x1d, 0x0e, 0xa9, 0x15, 0x43, 0x0e, 331 | 0xc4, 0x15, 0x4e, 0x0e, 0x98, 0x15, 0x56, 0x0e, 0x54, 0x15, 0x6e, 0x0e, 0x2c, 0x15, 0x99, 0x0e, 0x3d, 0x15, 0xcc, 0x0e, 0x81, 0x15, 0xf7, 0x0e, 0xd5, 0x15, 0x0e, 0x0f, 0x0b, 0x16, 0x0f, 0x0f, 0x04, 0x16, 0x00, 0x0f, 0xbe, 0x15, 0xe9, 0x0e, 0x53, 0x15, 0xce, 0x0e, 0xe6, 0x14, 0xab, 0x0e, 0x93, 0x14, 0x7a, 0x0e, 0x5e, 0x14, 0x36, 0x0e, 0x36, 0x14, 0xde, 0x0d, 0x02, 0x14, 0x7d, 0x0d, 0xb3, 0x13, 0x1d, 0x0d, 0x4d, 0x13, 0xc5, 0x0c, 0xec, 0x12, 0x7a, 0x0c, 0xad, 0x12, 0x3b, 0x0c, 0xa2, 0x12, 0x0a, 0x0c, 0xc0, 0x12, 0xe2, 0x0b, 0xe7, 0x12, 0xc2, 0x0b, 0xed, 0x12, 0xa0, 0x0b, 0xb2, 0x12, 0x6f, 0x0b, 0x38, 0x12, 0x25, 0x0b, 0xa0, 0x11, 0xbc, 0x0a, 0x19, 0x11, 0x3e, 0x0a, 0xca, 0x10, 0xc3, 0x09, 0xbc, 0x10, 0x65, 0x09, 0xd4, 0x10, 0x38, 0x09, 0xe6, 0x10, 0x3a, 0x09, 332 | 0xca, 0x10, 0x5a, 0x09, 0x77, 0x10, 0x7b, 0x09, 0x07, 0x10, 0x86, 0x09, 0xa5, 0x0f, 0x70, 0x09, 0x72, 0x0f, 0x3d, 0x09, 0x6b, 0x0f, 0xf6, 0x08, 0x67, 0x0f, 0x9f, 0x08, 0x2b, 0x0f, 0x34, 0x08, 0x8c, 0x0e, 0xaa, 0x07, 0x87, 0x0d, 0xf9, 0x06, 0x47, 0x0c, 0x21, 0x06, 0x0e, 0x0b, 0x31, 0x05, 0x16, 0x0a, 0x40, 0x04, 0x75, 0x09, 0x60, 0x03, 0x17, 0x09, 0x9f, 0x02, 0xd3, 0x08, 0x03, 0x02, 0x8c, 0x08, 0x8f, 0x01, 0x3e, 0x08, 0x4b, 0x01, 0x02, 0x08, 0x39, 0x01, 0xf6, 0x07, 0x56, 0x01, 0x20, 0x08, 0x8e, 0x01, 0x63, 0x08, 0xbe, 0x01, 0x8a, 0x08, 0xc3, 0x01, 0x67, 0x08, 0x86, 0x01, 0xef, 0x07, 0x0f, 0x01, 0x49, 0x07, 0x85, 0x00, 0xb7, 0x06, 0x1d, 0x00, 0x77, 0x06, 0x04, 0x00, 0x9e, 0x06, 0x48, 0x00, 0x0c, 0x07, 0xcc, 0x00, 0x78, 0x07, 0x57, 0x01, 0x98, 0x07, 0xa7, 0x01, 333 | 0x3f, 0x07, 0x90, 0x01, 0x74, 0x06, 0x0a, 0x01, 0x6c, 0x05, 0x35, 0x00, 0x6d, 0x04, 0x48, 0xff, 0xaf, 0x03, 0x7d, 0xfe, 0x4a, 0x03, 0xfd, 0xfd, 0x30, 0x03, 0xd2, 0xfd, 0x3e, 0x03, 0xeb, 0xfd, 0x4b, 0x03, 0x21, 0xfe, 0x3d, 0x03, 0x4a, 0xfe, 0x0a, 0x03, 0x42, 0xfe, 0xb7, 0x02, 0xf9, 0xfd, 0x51, 0x02, 0x75, 0xfd, 0xe5, 0x01, 0xd0, 0xfc, 0x7a, 0x01, 0x2b, 0xfc, 0x14, 0x01, 0xa6, 0xfb, 0xb5, 0x00, 0x50, 0xfb, 0x5e, 0x00, 0x2a, 0xfb, 0x11, 0x00, 0x25, 0xfb, 0xd0, 0xff, 0x2d, 0xfb, 0x9c, 0xff, 0x32, 0xfb, 0x76, 0xff, 0x29, 0xfb, 0x5a, 0xff, 0x15, 0xfb, 0x44, 0xff, 0x02, 0xfb, 0x32, 0xff, 0xfd, 0xfa, 0x27, 0xff, 0x1a, 0xfb, 0x2b, 0xff, 0x63, 0xfb, 0x47, 0xff, 0xdd, 0xfb, 0x7f, 0xff, 0x7b, 0xfc, 0xc8, 0xff, 0x1f, 0xfd, 0x0d, 0x00, 0xa2, 0xfd, 0x31, 0x00, 0xe1, 0xfd, 334 | 0x1d, 0x00, 0xca, 0xfd, 0xce, 0xff, 0x69, 0xfd, 0x54, 0xff, 0xe3, 0xfc, 0xd2, 0xfe, 0x69, 0xfc, 0x6a, 0xfe, 0x24, 0xfc, 0x32, 0xfe, 0x1f, 0xfc, 0x2a, 0xfe, 0x4d, 0xfc, 0x46, 0xfe, 0x8c, 0xfc, 0x6f, 0xfe, 0xbd, 0xfc, 0x94, 0xfe, 0xd2, 0xfc, 0xae, 0xfe, 0xd0, 0xfc, 0xb7, 0xfe, 0xc6, 0xfc, 0xa9, 0xfe, 0xbc, 0xfc, 0x7d, 0xfe, 0xb1, 0xfc, 0x2e, 0xfe, 0x9d, 0xfc, 0xc9, 0xfd, 0x80, 0xfc, 0x6d, 0xfd, 0x6e, 0xfc, 0x49, 0xfd, 0x8f, 0xfc, 0x8b, 0xfd, 0x0d, 0xfd, 0x45, 0xfe, 0xfc, 0xfd, 0x5f, 0xff, 0x47, 0xff, 0xa0, 0x00, 0xb8, 0x00, 0xbc, 0x01, 0x06, 0x02, 0x78, 0x02, 0xf8, 0x02, 0xbd, 0x02, 0x79, 0x03, 0x9c, 0x02, 0x9e, 0x03, 0x40, 0x02, 0x8e, 0x03, 0xda, 0x01, 0x73, 0x03, 0x8b, 0x01, 0x61, 0x03, 0x5f, 0x01, 0x59, 0x03, 0x52, 0x01, 0x52, 0x03, 0x5c, 0x01, 0x4a, 0x03, 335 | 0x78, 0x01, 0x4a, 0x03, 0xa0, 0x01, 0x63, 0x03, 0xcc, 0x01, 0x98, 0x03, 0xea, 0x01, 0xdd, 0x03, 0xe4, 0x01, 0x10, 0x04, 0xaa, 0x01, 0x0f, 0x04, 0x3d, 0x01, 0xc8, 0x03, 0xb5, 0x00, 0x4b, 0x03, 0x34, 0x00, 0xbf, 0x02, 0xe0, 0xff, 0x5a, 0x02, 0xcb, 0xff, 0x43, 0x02, 0xf1, 0xff, 0x89, 0x02, 0x3b, 0x00, 0x18, 0x03, 0x8a, 0x00, 0xcb, 0x03, 0xc7, 0x00, 0x78, 0x04, 0xe6, 0x00, 0x00, 0x05, 0xeb, 0x00, 0x54, 0x05, 0xe0, 0x00, 0x77, 0x05, 0xcd, 0x00, 0x77, 0x05, 0xb5, 0x00, 0x65, 0x05, 0x97, 0x00, 0x54, 0x05, 0x6d, 0x00, 0x4f, 0x05, 0x35, 0x00, 0x58, 0x05, 0xec, 0xff, 0x65, 0x05, 0x96, 0xff, 0x64, 0x05, 0x34, 0xff, 0x3e, 0x05, 0xc9, 0xfe, 0xe1, 0x04, 0x56, 0xfe, 0x4f, 0x04, 0xdc, 0xfd, 0x99, 0x03, 0x5f, 0xfd, 0xe1, 0x02, 0xea, 0xfc, 0x4d, 0x02, 0x89, 0xfc, 0xfc, 0x01, 336 | 0x4b, 0xfc, 0xf4, 0x01, 0x38, 0xfc, 0x24, 0x02, 0x44, 0xfc, 0x64, 0x02, 0x51, 0xfc, 0x83, 0x02, 0x30, 0xfc, 0x53, 0x02, 0xb8, 0xfb, 0xc0, 0x01, 0xd8, 0xfa, 0xd5, 0x00, 0xa9, 0xf9, 0xc1, 0xff, 0x6f, 0xf8, 0xc7, 0xfe, 0x7a, 0xf7, 0x29, 0xfe, 0x0a, 0xf7, 0x0c, 0xfe, 0x29, 0xf7, 0x69, 0xfe, 0xa3, 0xf7, 0x0c, 0xff, 0x1f, 0xf8, 0xa9, 0xff, 0x47, 0xf8, 0xfa, 0xff, 0xf4, 0xf7, 0xdd, 0xff, 0x3e, 0xf7, 0x5f, 0xff, 0x6f, 0xf6, 0xb8, 0xfe, 0xd7, 0xf5, 0x27, 0xfe, 0xa4, 0xf5, 0xdc, 0xfd, 0xcb, 0xf5, 0xe0, 0xfd, 0x14, 0xf6, 0x19, 0xfe, 0x3f, 0xf6, 0x5c, 0xfe, 0x29, 0xf6, 0x7e, 0xfe, 0xd8, 0xf5, 0x67, 0xfe, 0x6f, 0xf5, 0x11, 0xfe, 0x0e, 0xf5, 0x81, 0xfd, 0xb1, 0xf4, 0xbd, 0xfc, 0x33, 0xf4, 0xc9, 0xfb, 0x5f, 0xf3, 0xae, 0xfa, 0x1e, 0xf2, 0x7a, 0xf9, 0x89, 0xf0, 0x47, 0xf8, 337 | 0xe8, 0xee, 0x30, 0xf7, 0x8f, 0xed, 0x48, 0xf6, 0xb6, 0xec, 0x91, 0xf5, 0x5a, 0xec, 0x00, 0xf5, 0x45, 0xec, 0x88, 0xf4, 0x2c, 0xec, 0x23, 0xf4, 0xda, 0xeb, 0xd8, 0xf3, 0x4b, 0xeb, 0xb2, 0xf3, 0xaa, 0xea, 0xb6, 0xf3, 0x2d, 0xea, 0xd7, 0xf3, 0xf6, 0xe9, 0xf7, 0xf3, 0xfc, 0xe9, 0xf0, 0xf3, 0x0a, 0xea, 0xab, 0xf3, 0xe5, 0xe9, 0x26, 0xf3, 0x6a, 0xe9, 0x78, 0xf2, 0xa5, 0xe8, 0xc7, 0xf1, 0xc8, 0xe7, 0x2f, 0xf1, 0x12, 0xe7, 0xc0, 0xf0, 0xaf, 0xe6, 0x73, 0xf0, 0xa1, 0xe6, 0x38, 0xf0, 0xc1, 0xe6, 0xff, 0xef, 0xd6, 0xe6, 0xbd, 0xef, 0xb1, 0xe6, 0x6c, 0xef, 0x47, 0xe6, 0x0a, 0xef, 0xad, 0xe5, 0x96, 0xee, 0x0d, 0xe5, 0x0f, 0xee, 0x89, 0xe4, 0x7c, 0xed, 0x2b, 0xe4, 0xe6, 0xec, 0xdc, 0xe3, 0x5e, 0xec, 0x7c, 0xe3, 0xef, 0xeb, 0xf1, 0xe2, 0x9a, 0xeb, 0x41, 0xe2, 0x59, 0xeb, 338 | 0x93, 0xe1, 0x22, 0xeb, 0x18, 0xe1, 0xf1, 0xea, 0xf4, 0xe0, 0xca, 0xea, 0x26, 0xe1, 0xba, 0xea, 0x83, 0xe1, 0xc9, 0xea, 0xca, 0xe1, 0xf4, 0xea, 0xc9, 0xe1, 0x2a, 0xeb, 0x76, 0xe1, 0x56, 0xeb, 0xfb, 0xe0, 0x67, 0xeb, 0xa2, 0xe0, 0x63, 0xeb, 0xae, 0xe0, 0x61, 0xeb, 0x41, 0xe1, 0x87, 0xeb, 0x48, 0xe2, 0xf8, 0xeb, 0x8e, 0xe3, 0xc1, 0xec, 0xd5, 0xe4, 0xdb, 0xed, 0xf6, 0xe5, 0x23, 0xef, 0xe6, 0xe6, 0x6a, 0xf0, 0xad, 0xe7, 0x7b, 0xf1, 0x4f, 0xe8, 0x28, 0xf2, 0xc0, 0xe8, 0x5b, 0xf2, 0xeb, 0xe8, 0x1a, 0xf2, 0xca, 0xe8, 0x93, 0xf1, 0x7d, 0xe8, 0x11, 0xf1, 0x4b, 0xe8, 0xed, 0xf0, 0x88, 0xe8, 0x6d, 0xf1, 0x6c, 0xe9, 0xa2, 0xf2, 0xe7, 0xea, 0x5f, 0xf4, 0xa5, 0xec, 0x40, 0xf6, 0x29, 0xee, 0xce, 0xf7, 0x06, 0xef, 0xb0, 0xf8, 0x18, 0xef, 0xd0, 0xf8, 0x92, 0xee, 0x66, 0xf8, 339 | 0xea, 0xed, 0xdf, 0xf7, 0xa1, 0xed, 0xae, 0xf7, 0x0e, 0xee, 0x24, 0xf8, 0x3d, 0xef, 0x53, 0xf9, 0xf8, 0xf0, 0x10, 0xfb, 0xeb, 0xf2, 0x0e, 0xfd, 0xcc, 0xf4, 0x02, 0xff, 0x76, 0xf6, 0xb9, 0x00, 0xed, 0xf7, 0x21, 0x02, 0x44, 0xf9, 0x47, 0x03, 0x8c, 0xfa, 0x3f, 0x04, 0xc7, 0xfb, 0x22, 0x05, 0xea, 0xfc, 0xfe, 0x05, 0xec, 0xfd, 0xe0, 0x06, 0xd0, 0xfe, 0xcc, 0x07, 0xab, 0xff, 0xc8, 0x08, 0x9a, 0x00, 0xd6, 0x09, 0xb4, 0x01, 0xf9, 0x0a, 0x02, 0x03, 0x2e, 0x0c, 0x75, 0x04, 0x72, 0x0d, 0xf0, 0x05, 0xbc, 0x0e, 0x4e, 0x07, 0xff, 0x0f, 0x73, 0x08, 0x2d, 0x11, 0x4b, 0x09, 0x36, 0x12, 0xd9, 0x09, 0x0d, 0x13, 0x2a, 0x0a, 0xae, 0x13, 0x5b, 0x0a, 0x1c, 0x14, 0x82, 0x0a, 0x61, 0x14, 0xae, 0x0a, 0x86, 0x14, 0xdb, 0x0a, 0x8d, 0x14, 0xfb, 0x0a, 0x77, 0x14, 0xf8, 0x0a, 0x44, 0x14, 340 | 0xc8, 0x0a, 0xfa, 0x13, 0x75, 0x0a, 0xa8, 0x13, 0x18, 0x0a, 0x61, 0x13, 0xd0, 0x09, 0x2e, 0x13, 0xb1, 0x09, 0x0e, 0x13, 0xbb, 0x09, 0xed, 0x12, 0xdc, 0x09, 0xb6, 0x12, 0xf7, 0x09, 0x5b, 0x12, 0xf5, 0x09, 0xe6, 0x11, 0xd4, 0x09, 0x70, 0x11, 0xa5, 0x09, 0x1c, 0x11, 0x82, 0x09, 0x05, 0x11, 0x8b, 0x09, 0x31, 0x11, 0xcf, 0x09, 0x94, 0x11, 0x55, 0x0a, 0x1d, 0x12, 0x13, 0x0b, 0xb9, 0x12, 0xf5, 0x0b, 0x61, 0x13, 0xdb, 0x0c, 0x0d, 0x14, 0x9f, 0x0d, 0xae, 0x14, 0x14, 0x0e, 0x24, 0x15, 0x15, 0x0e, 0x48, 0x15, 0x8e, 0x0d, 0xf3, 0x14, 0x84, 0x0c, 0x16, 0x14, 0x16, 0x0b, 0xbe, 0x12, 0x74, 0x09, 0x16, 0x11, 0xd4, 0x07, 0x54, 0x0f, 0x60, 0x06, 0xab, 0x0d, 0x35, 0x05, 0x41, 0x0c, 0x64, 0x04, 0x31, 0x0b, 0xf7, 0x03, 0x89, 0x0a, 0xf5, 0x03, 0x50, 0x0a, 0x54, 0x04, 0x81, 0x0a, 341 | 0x01, 0x05, 0x03, 0x0b, 0xd5, 0x05, 0xac, 0x0b, 0xa0, 0x06, 0x45, 0x0c, 0x3b, 0x07, 0x9f, 0x0c, 0x96, 0x07, 0xa7, 0x0c, 0xb6, 0x07, 0x66, 0x0c, 0xae, 0x07, 0xfb, 0x0b, 0x8b, 0x07, 0x82, 0x0b, 0x43, 0x07, 0x02, 0x0b, 0xba, 0x06, 0x63, 0x0a, 0xd0, 0x05, 0x83, 0x09, 0x7d, 0x04, 0x49, 0x08, 0xe1, 0x02, 0xc0, 0x06, 0x3e, 0x01, 0x1a, 0x05, 0xe7, 0xff, 0xa4, 0x03, 0x1c, 0xff, 0xa2, 0x02, 0xf4, 0xfe, 0x3a, 0x02, 0x56, 0xff, 0x66, 0x02, 0x08, 0x00, 0xff, 0x02, 0xc7, 0x00, 0xc7, 0x03, 0x61, 0x01, 0x80, 0x04, 0xb6, 0x01, 0xf5, 0x04, 0xb9, 0x01, 0xfc, 0x04, 0x67, 0x01, 0x7e, 0x04, 0xc3, 0x00, 0x76, 0x03, 0xd7, 0xff, 0xfe, 0x01, 0xc0, 0xfe, 0x52, 0x00, 0xad, 0xfd, 0xc7, 0xfe, 0xdc, 0xfc, 0xb4, 0xfd, 0x88, 0xfc, 0x52, 0xfd, 0xd2, 0xfc, 0xaa, 0xfd, 0xb7, 0xfd, 0x8f, 0xfe, 342 | 0x0a, 0xff, 0xb3, 0xff, 0x89, 0x00, 0xc6, 0x00, 0xee, 0x01, 0x98, 0x01, 0x09, 0x03, 0x23, 0x02, 0xce, 0x03, 0x8a, 0x02, 0x51, 0x04, 0xf9, 0x02, 0xb9, 0x04, 0x90, 0x03, 0x2b, 0x05, 0x4d, 0x04, 0xb5, 0x05, 0x0e, 0x05, 0x41, 0x06, 0x9d, 0x05, 0xa3, 0x06, 0xcb, 0x05, 0xaa, 0x06, 0x83, 0x05, 0x3b, 0x06, 0xd2, 0x04, 0x68, 0x05, 0xe9, 0x03, 0x73, 0x04, 0x07, 0x03, 0xaf, 0x03, 0x68, 0x02, 0x63, 0x03, 0x30, 0x02, 0xa9, 0x03, 0x5f, 0x02, 0x60, 0x04, 0xd8, 0x02, 0x40, 0x05, 0x6a, 0x03, 0x01, 0x06, 0xeb, 0x03, 0x7e, 0x06, 0x45, 0x04, 0xc8, 0x06, 0x7b, 0x04, 0x13, 0x07, 0xa4, 0x04, 0x92, 0x07, 0xd9, 0x04, 0x57, 0x08, 0x2b, 0x05, 0x47, 0x09, 0x9b, 0x05, 0x2c, 0x0a, 0x20, 0x06, 0xd8, 0x0a, 0xb1, 0x06, 0x4a, 0x0b, 0x4d, 0x07, 0xab, 0x0b, 0xf8, 0x07, 0x33, 0x0c, 0xae, 0x08, 343 | 0xfd, 0x0c, 0x5e, 0x09, 0xef, 0x0d, 0xe7, 0x09, 0xb7, 0x0e, 0x27, 0x0a, 0xfa, 0x0e, 0x0c, 0x0a, 0x87, 0x0e, 0x9e, 0x09, 0x76, 0x0d, 0x01, 0x09, 0x27, 0x0c, 0x64, 0x08, 0x13, 0x0b, 0xee, 0x07, 0x95, 0x0a, 0xae, 0x07, 0xbe, 0x0a, 0x9c, 0x07, 0x55, 0x0b, 0xa2, 0x07, 0xfa, 0x0b, 0xb3, 0x07, 0x5e, 0x0c, 0xd0, 0x07, 0x66, 0x0c, 0x00, 0x08, 0x36, 0x0c, 0x49, 0x08, 0x0d, 0x0c, 0xa1, 0x08, 0x1e, 0x0c, 0xed, 0x08, 0x6e, 0x0c, 0x0a, 0x09, 0xd3, 0x0c, 0xe0, 0x08, 0x08, 0x0d, 0x6e, 0x08, 0xdb, 0x0c, 0xca, 0x07, 0x48, 0x0c, 0x19, 0x07, 0x7d, 0x0b, 0x7d, 0x06, 0xc5, 0x0a, 0x0f, 0x06, 0x68, 0x0a, 0xde, 0x05, 0x84, 0x0a, 0xeb, 0x05, 0x0c, 0x0b, 0x38, 0x06, 0xcf, 0x0b, 0xbf, 0x06, 0x96, 0x0c, 0x7a, 0x07, 0x48, 0x0d, 0x5d, 0x08, 0xf6, 0x0d, 0x63, 0x09, 0xd1, 0x0e, 0x90, 0x0a, 344 | 0x10, 0x10, 0xf5, 0x0b, 0xca, 0x11, 0xa3, 0x0d, 0xdf, 0x13, 0x9a, 0x0f, 0xfc, 0x15, 0xb6, 0x11, 0xb5, 0x17, 0xad, 0x13, 0xba, 0x18, 0x25, 0x15, 0xf3, 0x18, 0xdb, 0x15, 0x96, 0x18, 0xc8, 0x15, 0x0f, 0x18, 0x33, 0x15, 0xd3, 0x17, 0x96, 0x14, 0x2f, 0x18, 0x72, 0x14, 0x29, 0x19, 0x12, 0x15, 0x89, 0x1a, 0x6c, 0x16, 0xf8, 0x1b, 0x29, 0x18, 0x28, 0x1d, 0xcb, 0x19, 0xf8, 0x1d, 0xeb, 0x1a, 0x79, 0x1e, 0x64, 0x1b, 0xd4, 0x1e, 0x5c, 0x1b, 0x34, 0x1f, 0x27, 0x1b, 0xac, 0x1f, 0x1d, 0x1b, 0x2f, 0x20, 0x6e, 0x1b, 0xa2, 0x20, 0x13, 0x1c, 0xed, 0x20, 0xd5, 0x1c, 0x02, 0x21, 0x6f, 0x1d, 0xe3, 0x20, 0xac, 0x1d, 0x9b, 0x20, 0x7a, 0x1d, 0x33, 0x20, 0xf1, 0x1c, 0xb6, 0x1f, 0x42, 0x1c, 0x31, 0x1f, 0xa5, 0x1b, 0xb6, 0x1e, 0x45, 0x1b, 0x5b, 0x1e, 0x31, 0x1b, 0x2e, 0x1e, 0x60, 0x1b, 345 | 0x2a, 0x1e, 0xae, 0x1b, 0x36, 0x1e, 0xef, 0x1b, 0x2b, 0x1e, 0xf7, 0x1b, 0xe6, 0x1d, 0xae, 0x1b, 0x55, 0x1d, 0x0c, 0x1b, 0x81, 0x1c, 0x1f, 0x1a, 0x83, 0x1b, 0x02, 0x19, 0x79, 0x1a, 0xd2, 0x17, 0x7c, 0x19, 0xad, 0x16, 0x9a, 0x18, 0xa8, 0x15, 0xd4, 0x17, 0xcf, 0x14, 0x28, 0x17, 0x22, 0x14, 0x8e, 0x16, 0x92, 0x13, 0xf3, 0x15, 0xfd, 0x12, 0x3d, 0x15, 0x39, 0x12, 0x50, 0x14, 0x23, 0x11, 0x17, 0x13, 0xb0, 0x0f, 0x9b, 0x11, 0xff, 0x0d, 0x05, 0x10, 0x51, 0x0c, 0x97, 0x0e, 0xf5, 0x0a, 0x94, 0x0d, 0x2d, 0x0a, 0x21, 0x0d, 0x0b, 0x0a, 0x39, 0x0d, 0x71, 0x0a, 0xa9, 0x0d, 0x18, 0x0b, 0x2c, 0x0e, 0xb0, 0x0b, 0x80, 0x0e, 0xfa, 0x0b, 0x7b, 0x0e, 0xde, 0x0b, 0x0c, 0x0e, 0x5d, 0x0b, 0x37, 0x0d, 0x87, 0x0a, 0x05, 0x0c, 0x69, 0x09, 0x80, 0x0a, 0x09, 0x08, 0xbc, 0x08, 0x6f, 0x06, 346 | 0xde, 0x06, 0xb2, 0x04, 0x1e, 0x05, 0xf8, 0x02, 0xb8, 0x03, 0x75, 0x01, 0xd2, 0x02, 0x4f, 0x00, 0x6a, 0x02, 0x8e, 0xff, 0x4f, 0x02, 0x16, 0xff, 0x32, 0x02, 0xb0, 0xfe, 0xc2, 0x01, 0x1f, 0xfe, 0xcf, 0x00, 0x38, 0xfd, 0x5b, 0xff, 0xef, 0xfb, 0x95, 0xfd, 0x56, 0xfa, 0xc5, 0xfb, 0x9a, 0xf8, 0x32, 0xfa, 0xf1, 0xf6, 0x0d, 0xf9, 0x90, 0xf5, 0x6a, 0xf8, 0xa7, 0xf4, 0x43, 0xf8, 0x51, 0xf4, 0x7b, 0xf8, 0x90, 0xf4, 0xed, 0xf8, 0x45, 0xf5, 0x6e, 0xf9, 0x32, 0xf6, 0xd8, 0xf9, 0x0e, 0xf7, 0x12, 0xfa, 0x9c, 0xf7, 0x16, 0xfa, 0xbd, 0xf7, 0xf0, 0xf9, 0x82, 0xf7, 0xbe, 0xf9, 0x1e, 0xf7, 0x9c, 0xf9, 0xce, 0xf6, 0x9f, 0xf9, 0xc2, 0xf6, 0xcd, 0xf9, 0x09, 0xf7, 0x1f, 0xfa, 0x8e, 0xf7, 0x86, 0xfa, 0x2b, 0xf8, 0xf2, 0xfa, 0xb7, 0xf8, 0x57, 0xfb, 0x16, 0xf9, 0xaf, 0xfb, 0x43, 0xf9, 347 | 0xf3, 0xfb, 0x45, 0xf9, 0x24, 0xfc, 0x31, 0xf9, 0x4b, 0xfc, 0x24, 0xf9, 0x7b, 0xfc, 0x3a, 0xf9, 0xce, 0xfc, 0x8d, 0xf9, 0x55, 0xfd, 0x28, 0xfa, 0x11, 0xfe, 0x04, 0xfb, 0xea, 0xfe, 0xfe, 0xfb, 0xb6, 0xff, 0xe8, 0xfc, 0x48, 0x00, 0x94, 0xfd, 0x88, 0x00, 0xe9, 0xfd, 0x7d, 0x00, 0xf1, 0xfd, 0x47, 0x00, 0xd1, 0xfd, 0x1a, 0x00, 0xbe, 0xfd, 0x1e, 0x00, 0xe8, 0xfd, 0x69, 0x00, 0x68, 0xfe, 0xf8, 0x00, 0x3f, 0xff, 0xbb, 0x01, 0x58, 0x00, 0xa0, 0x02, 0x95, 0x01, 0x98, 0x03, 0xd6, 0x02, 0x99, 0x04, 0x02, 0x04, 0x98, 0x05, 0x04, 0x05, 0x84, 0x06, 0xcf, 0x05, 0x45, 0x07, 0x5f, 0x06, 0xc5, 0x07, 0xbb, 0x06, 0xf3, 0x07, 0xea, 0x06, 0xca, 0x07, 0xf1, 0x06, 0x4f, 0x07, 0xc6, 0x06, 0x8e, 0x06, 0x54, 0x06, 0x9b, 0x05, 0x88, 0x05, 0x91, 0x04, 0x67, 0x04, 0x95, 0x03, 0x1c, 0x03, 348 | 0xd0, 0x02, 0xf5, 0x01, 0x65, 0x02, 0x46, 0x01, 0x61, 0x02, 0x4b, 0x01, 0xb8, 0x02, 0x01, 0x02, 0x44, 0x03, 0x28, 0x03, 0xd7, 0x03, 0x59, 0x04, 0x4a, 0x04, 0x34, 0x05, 0x8b, 0x04, 0x8d, 0x05, 0x9b, 0x04, 0x72, 0x05, 0x84, 0x04, 0x20, 0x05, 0x4c, 0x04, 0xd8, 0x04, 0xee, 0x03, 0xba, 0x04, 0x63, 0x03, 0xb9, 0x04, 0xa9, 0x02, 0xa7, 0x04, 0xd2, 0x01, 0x5a, 0x04, 0xf9, 0x00, 0xc0, 0x03, 0x3b, 0x00, 0xf1, 0x02, 0xa0, 0xff, 0x18, 0x02, 0x21, 0xff, 0x5f, 0x01, 0xa7, 0xfe, 0xda, 0x00, 0x2a, 0xfe, 0x84, 0x00, 0xbc, 0xfd, 0x57, 0x00, 0x8f, 0xfd, 0x58, 0x00, 0xda, 0xfd, 0xa5, 0x00, 0xc2, 0xfe, 0x64, 0x01, 0x3c, 0x00, 0xaa, 0x02, 0x0b, 0x02, 0x60, 0x04, 0xcc, 0x03, 0x39, 0x06, 0x1d, 0x05, 0xc4, 0x07, 0xb3, 0x05, 0x92, 0x08, 0x6f, 0x05, 0x5f, 0x08, 0x5c, 0x04, 0x2a, 0x07, 349 | 0xa5, 0x02, 0x3a, 0x05, 0x86, 0x00, 0xfd, 0x02, 0x46, 0xfe, 0xe7, 0x00, 0x28, 0xfc, 0x45, 0xff, 0x68, 0xfa, 0x2b, 0xfe, 0x2d, 0xf9, 0x7c, 0xfd, 0x7a, 0xf8, 0xfd, 0xfc, 0x2a, 0xf8, 0x79, 0xfc, 0x01, 0xf8, 0xda, 0xfb, 0xbd, 0xf7, 0x2d, 0xfb, 0x37, 0xf7, 0x91, 0xfa, 0x70, 0xf6, 0x22, 0xfa, 0x90, 0xf5, 0xe4, 0xf9, 0xcf, 0xf4, 0xbd, 0xf9, 0x60, 0xf4, 0x8b, 0xf9, 0x57, 0xf4, 0x3b, 0xf9, 0xac, 0xf4, 0xe1, 0xf8, 0x43, 0xf5, 0xae, 0xf8, 0xf7, 0xf5, 0xd9, 0xf8, 0xa8, 0xf6, 0x74, 0xf9, 0x36, 0xf7, 0x54, 0xfa, 0x7a, 0xf7, 0x0f, 0xfb, 0x47, 0xf7, 0x28, 0xfb, 0x71, 0xf6, 0x40, 0xfa, 0xe5, 0xf4, 0x46, 0xf8, 0xbb, 0xf2, 0x89, 0xf5, 0x3a, 0xf0, 0x97, 0xf2, 0xcc, 0xed, 0x0a, 0xf0, 0xe2, 0xeb, 0x53, 0xee, 0xc3, 0xea, 0x8f, 0xed, 0x7b, 0xea, 0x91, 0xed, 0xc8, 0xea, 0xf2, 0xed, 350 | 0x31, 0xeb, 0x3a, 0xee, 0x2e, 0xeb, 0x03, 0xee, 0x52, 0xea, 0x08, 0xed, 0x75, 0xe8, 0x34, 0xeb, 0xc2, 0xe5, 0xa5, 0xe8, 0xb0, 0xe2, 0xad, 0xe5, 0xd7, 0xdf, 0xc2, 0xe2, 0xc4, 0xdd, 0x67, 0xe0, 0xc6, 0xdc, 0x05, 0xdf, 0xd6, 0xdc, 0xc0, 0xde, 0xa9, 0xdd, 0x6e, 0xdf, 0xc9, 0xde, 0x9c, 0xe0, 0xca, 0xdf, 0xbc, 0xe1, 0x66, 0xe0, 0x55, 0xe2, 0x90, 0xe0, 0x33, 0xe2, 0x59, 0xe0, 0x67, 0xe1, 0xd7, 0xdf, 0x33, 0xe0, 0x14, 0xdf, 0xdd, 0xde, 0x08, 0xde, 0x8f, 0xdd, 0xb1, 0xdc, 0x50, 0xdc, 0x2c, 0xdb, 0x18, 0xdb, 0xb9, 0xd9, 0xeb, 0xd9, 0xad, 0xd8, 0xe8, 0xd8, 0x50, 0xd8, 0x42, 0xd8, 0xb4, 0xd8, 0x24, 0xd8, 0xab, 0xd9, 0x98, 0xd8, 0xda, 0xda, 0x79, 0xd9, 0xe2, 0xdb, 0x82, 0xda, 0x88, 0xdc, 0x6e, 0xdb, 0xd0, 0xdc, 0x13, 0xdc, 0xed, 0xdc, 0x72, 0xdc, 0x1d, 0xdd, 0xa8, 0xdc, 351 | 0x8d, 0xdd, 0xdd, 0xdc, 0x3e, 0xde, 0x2c, 0xdd, 0x14, 0xdf, 0x9a, 0xdd, 0xea, 0xdf, 0x20, 0xde, 0xb2, 0xe0, 0xba, 0xde, 0x7c, 0xe1, 0x70, 0xdf, 0x66, 0xe2, 0x51, 0xe0, 0x87, 0xe3, 0x63, 0xe1, 0xdb, 0xe4, 0x96, 0xe2, 0x39, 0xe6, 0xc1, 0xe3, 0x69, 0xe7, 0xac, 0xe4, 0x3c, 0xe8, 0x2e, 0xe5, 0xa4, 0xe8, 0x3e, 0xe5, 0xc0, 0xe8, 0x06, 0xe5, 0xce, 0xe8, 0xcf, 0xe4, 0x12, 0xe9, 0xea, 0xe4, 0xbc, 0xe9, 0x8c, 0xe5, 0xcf, 0xea, 0xb5, 0xe6, 0x23, 0xec, 0x2d, 0xe8, 0x73, 0xed, 0x99, 0xe9, 0x79, 0xee, 0xa1, 0xea, 0x0a, 0xef, 0x17, 0xeb, 0x29, 0xef, 0x07, 0xeb, 0x02, 0xef, 0xb3, 0xea, 0xd5, 0xee, 0x6f, 0xea, 0xd3, 0xee, 0x7a, 0xea, 0x0f, 0xef, 0xe0, 0xea, 0x70, 0xef, 0x77, 0xeb, 0xc9, 0xef, 0xfa, 0xeb, 0xfa, 0xef, 0x38, 0xec, 0x01, 0xf0, 0x29, 0xec, 0x04, 0xf0, 0xf8, 0xeb, 352 | 0x34, 0xf0, 0xe5, 0xeb, 0xac, 0xf0, 0x1c, 0xec, 0x54, 0xf1, 0x91, 0xec, 0xe6, 0xf1, 0x02, 0xed, 0x0e, 0xf2, 0x1c, 0xed, 0x95, 0xf1, 0xa5, 0xec, 0x8e, 0xf0, 0xa5, 0xeb, 0x4c, 0xef, 0x66, 0xea, 0x47, 0xee, 0x55, 0xe9, 0xe1, 0xed, 0xcf, 0xe8, 0x3f, 0xee, 0xf8, 0xe8, 0x37, 0xef, 0xb4, 0xe9, 0x74, 0xf0, 0xc2, 0xea, 0x9e, 0xf1, 0xdf, 0xeb, 0x85, 0xf2, 0xe8, 0xec, 0x28, 0xf3, 0xd7, 0xed, 0xa5, 0xf3, 0xb4, 0xee, 0x14, 0xf4, 0x75, 0xef, 0x73, 0xf4, 0xfc, 0xef, 0xa4, 0xf4, 0x21, 0xf0, 0x86, 0xf4, 0xcf, 0xef, 0x12, 0xf4, 0x21, 0xef, 0x6a, 0xf3, 0x5c, 0xee, 0xce, 0xf2, 0xd7, 0xed, 0x80, 0xf2, 0xd2, 0xed, 0xa5, 0xf2, 0x55, 0xee, 0x38, 0xf3, 0x34, 0xef, 0x14, 0xf4, 0x26, 0xf0, 0x0a, 0xf5, 0xf0, 0xf0, 0xfb, 0xf5, 0x82, 0xf1, 0xe3, 0xf6, 0xff, 0xf1, 0xd1, 0xf7, 0x9b, 0xf2, 353 | 0xd1, 0xf8, 0x80, 0xf3, 0xdd, 0xf9, 0xa6, 0xf4, 0xd6, 0xfa, 0xd8, 0xf5, 0x89, 0xfb, 0xc0, 0xf6, 0xc9, 0xfb, 0x14, 0xf7, 0x7e, 0xfb, 0xb1, 0xf6, 0xb9, 0xfa, 0xb2, 0xf5, 0xa9, 0xf9, 0x63, 0xf4, 0x97, 0xf8, 0x29, 0xf3, 0xc6, 0xf7, 0x58, 0xf2, 0x66, 0xf7, 0x1e, 0xf2, 0x7a, 0xf7, 0x70, 0xf2, 0xe1, 0xf7, 0x14, 0xf3, 0x5f, 0xf8, 0xbf, 0xf3, 0xb7, 0xf8, 0x2d, 0xf4, 0xc8, 0xf8, 0x43, 0xf4, 0x99, 0xf8, 0x15, 0xf4, 0x5b, 0xf8, 0xd7, 0xf3, 0x4d, 0xf8, 0xca, 0xf3, 0xa2, 0xf8, 0x1b, 0xf4, 0x6b, 0xf9, 0xd6, 0xf4, 0x8c, 0xfa, 0xe0, 0xf5, 0xd2, 0xfb, 0x0f, 0xf7, 0x03, 0xfd, 0x34, 0xf8, 0xfa, 0xfd, 0x31, 0xf9, 0xae, 0xfe, 0xf3, 0xf9, 0x29, 0xff, 0x70, 0xfa, 0x7b, 0xff, 0xa2, 0xfa, 0xa9, 0xff, 0x85, 0xfa, 0xaf, 0xff, 0x1e, 0xfa, 0x85, 0xff, 0x89, 0xf9, 0x2e, 0xff, 0xed, 0xf8, 354 | 0xbb, 0xfe, 0x78, 0xf8, 0x48, 0xfe, 0x41, 0xf8, 0xee, 0xfd, 0x40, 0xf8, 0xb8, 0xfd, 0x4b, 0xf8, 0x98, 0xfd, 0x28, 0xf8, 0x6d, 0xfd, 0xae, 0xf7, 0x14, 0xfd, 0xd8, 0xf6, 0x75, 0xfc, 0xc7, 0xf5, 0x92, 0xfb, 0xba, 0xf4, 0x90, 0xfa, 0xeb, 0xf3, 0xae, 0xf9, 0x84, 0xf3, 0x39, 0xf9, 0x94, 0xf3, 0x6f, 0xf9, 0x15, 0xf4, 0x66, 0xfa, 0xf5, 0xf4, 0xf8, 0xfb, 0x13, 0xf6, 0xc2, 0xfd, 0x42, 0xf7, 0x3d, 0xff, 0x3e, 0xf8, 0xe4, 0xff, 0xb5, 0xf8, 0x6c, 0xff, 0x5f, 0xf8, 0xda, 0xfd, 0x19, 0xf7, 0x88, 0xfb, 0xfe, 0xf4, 0xfa, 0xf8, 0x63, 0xf2, 0xab, 0xf6, 0xb8, 0xef, 0xe1, 0xf4, 0x63, 0xed, 0x9e, 0xf3, 0x9d, 0xeb, 0xb7, 0xf2, 0x68, 0xea, 0x00, 0xf2, 0xa2, 0xe9, 0x71, 0xf1, 0x29, 0xe9, 0x24, 0xf1, 0xef, 0xe8, 0x41, 0xf1, 0xf9, 0xe8, 0xd1, 0xf1, 0x51, 0xe9, 0xa6, 0xf2, 0xe2, 0xe9, 355 | 0x60, 0xf3, 0x76, 0xea, 0x9d, 0xf3, 0xbe, 0xea, 0x2b, 0xf3, 0x7e, 0xea, 0x29, 0xf2, 0xac, 0xe9, 0xf9, 0xf0, 0x81, 0xe8, 0x0c, 0xf0, 0x5f, 0xe7, 0xae, 0xef, 0xa4, 0xe6, 0xd5, 0xef, 0x7b, 0xe6, 0x32, 0xf0, 0xc6, 0xe6, 0x59, 0xf0, 0x27, 0xe7, 0xff, 0xef, 0x37, 0xe7, 0x24, 0xef, 0xb5, 0xe6, 0x17, 0xee, 0xb0, 0xe5, 0x4e, 0xed, 0x86, 0xe4, 0x2e, 0xed, 0xbc, 0xe3, 0xe4, 0xed, 0xc4, 0xe3, 0x56, 0xef, 0xd3, 0xe4, 0x36, 0xf1, 0xc1, 0xe6, 0x2d, 0xf3, 0x22, 0xe9, 0xf9, 0xf4, 0x6e, 0xeb, 0x83, 0xf6, 0x3a, 0xed, 0xd2, 0xf7, 0x5f, 0xee, 0xfe, 0xf8, 0xfe, 0xee, 0x19, 0xfa, 0x6a, 0xef, 0x28, 0xfb, 0xfb, 0xef, 0x28, 0xfc, 0xe7, 0xf0, 0x19, 0xfd, 0x31, 0xf2, 0x08, 0xfe, 0xb4, 0xf3, 0x0e, 0xff, 0x3f, 0xf5, 0x44, 0x00, 0xaf, 0xf6, 0xad, 0x01, 0xfc, 0xf7, 0x2f, 0x03, 0x2e, 0xf9, 356 | 0x8e, 0x04, 0x44, 0xfa, 0x81, 0x05, 0x26, 0xfb, 0xd1, 0x05, 0xa8, 0xfb, 0x75, 0x05, 0xa8, 0xfb, 0xa0, 0x04, 0x2b, 0xfb, 0xb4, 0x03, 0x6f, 0xfa, 0x22, 0x03, 0xdc, 0xf9, 0x3c, 0x03, 0xdb, 0xf9, 0x1a, 0x04, 0xa3, 0xfa, 0x92, 0x05, 0x21, 0xfc, 0x57, 0x07, 0x04, 0xfe, 0x18, 0x09, 0xe3, 0xff, 0xa4, 0x0a, 0x74, 0x01, 0xf1, 0x0b, 0xa1, 0x02, 0x07, 0x0d, 0x87, 0x03, 0xeb, 0x0d, 0x4a, 0x04, 0x89, 0x0e, 0xf5, 0x04, 0xbc, 0x0e, 0x6a, 0x05, 0x6e, 0x0e, 0x79, 0x05, 0xb5, 0x0d, 0x10, 0x05, 0xe2, 0x0c, 0x5a, 0x04, 0x6e, 0x0c, 0xc7, 0x03, 0xc9, 0x0c, 0xe4, 0x03, 0x2e, 0x0e, 0x19, 0x05, 0x80, 0x10, 0x78, 0x07, 0x5a, 0x13, 0xab, 0x0a, 0x37, 0x16, 0x18, 0x0e, 0xa3, 0x18, 0x1a, 0x11, 0x64, 0x1a, 0x41, 0x13, 0x7c, 0x1b, 0x76, 0x14, 0x1a, 0x1c, 0xee, 0x14, 0x77, 0x1c, 0x09, 0x15, 357 | 0xc2, 0x1c, 0x25, 0x15, 0x16, 0x1d, 0x83, 0x15, 0x86, 0x1d, 0x38, 0x16, 0x1e, 0x1e, 0x38, 0x17, 0xe7, 0x1e, 0x65, 0x18, 0xda, 0x1f, 0x95, 0x19, 0xd7, 0x20, 0x97, 0x1a, 0xa7, 0x21, 0x3e, 0x1b, 0x0d, 0x22, 0x66, 0x1b, 0xdf, 0x21, 0x02, 0x1b, 0x22, 0x21, 0x2e, 0x1a, 0x10, 0x20, 0x2b, 0x19, 0x07, 0x1f, 0x51, 0x18, 0x69, 0x1e, 0xf4, 0x17, 0x7a, 0x1e, 0x44, 0x18, 0x47, 0x1f, 0x43, 0x19, 0xa4, 0x20, 0xbc, 0x1a, 0x3f, 0x22, 0x5c, 0x1c, 0xb9, 0x23, 0xca, 0x1d, 0xbf, 0x24, 0xc4, 0x1e, 0x22, 0x25, 0x29, 0x1f, 0xd9, 0x24, 0xff, 0x1e, 0x00, 0x24, 0x64, 0x1e, 0xc4, 0x22, 0x81, 0x1d, 0x5f, 0x21, 0x78, 0x1c, 0x03, 0x20, 0x66, 0x1b, 0xd7, 0x1e, 0x61, 0x1a, 0xf5, 0x1d, 0x80, 0x19, 0x6b, 0x1d, 0xdd, 0x18, 0x3c, 0x1d, 0x90, 0x18, 0x58, 0x1d, 0xa2, 0x18, 0x9e, 0x1d, 0xfc, 0x18, 358 | 0xdb, 0x1d, 0x67, 0x19, 0xcf, 0x1d, 0x94, 0x19, 0x48, 0x1d, 0x3d, 0x19, 0x35, 0x1c, 0x45, 0x18, 0xbb, 0x1a, 0xca, 0x16, 0x27, 0x19, 0x25, 0x15, 0xe1, 0x17, 0xc5, 0x13, 0x39, 0x17, 0x0b, 0x13, 0x4d, 0x17, 0x1a, 0x13, 0xf5, 0x17, 0xcd, 0x13, 0xd3, 0x18, 0xc5, 0x14, 0x74, 0x19, 0x90, 0x15, 0x80, 0x19, 0xd0, 0x15, 0xcf, 0x18, 0x5b, 0x15, 0x78, 0x17, 0x3a, 0x14, 0xb7, 0x15, 0xa0, 0x12, 0xde, 0x13, 0xd5, 0x10, 0x37, 0x12, 0x23, 0x0f, 0xfc, 0x10, 0xd0, 0x0d, 0x4b, 0x10, 0x10, 0x0d, 0x25, 0x10, 0xfb, 0x0c, 0x6f, 0x10, 0x7e, 0x0d, 0xec, 0x10, 0x53, 0x0e, 0x4c, 0x11, 0x0e, 0x0f, 0x3e, 0x11, 0x37, 0x0f, 0x8c, 0x10, 0x81, 0x0e, 0x34, 0x0f, 0xe5, 0x0c, 0x69, 0x0d, 0xb3, 0x0a, 0x85, 0x0b, 0x71, 0x08, 0xe6, 0x09, 0xa8, 0x06, 0xcf, 0x08, 0xa9, 0x05, 0x4e, 0x08, 0x76, 0x05, 359 | 0x46, 0x08, 0xc5, 0x05, 0x81, 0x08, 0x2f, 0x06, 0xc8, 0x08, 0x5b, 0x06, 0xf2, 0x08, 0x26, 0x06, 0xe8, 0x08, 0x9b, 0x05, 0x97, 0x08, 0xdf, 0x04, 0xef, 0x07, 0x0a, 0x04, 0xdc, 0x06, 0x19, 0x03, 0x59, 0x05, 0xec, 0x01, 0x77, 0x03, 0x66, 0x00, 0x64, 0x01, 0x86, 0xfe, 0x63, 0xff, 0x74, 0xfc, 0xb5, 0xfd, 0x7c, 0xfa, 0x85, 0xfc, 0xef, 0xf8, 0xdc, 0xfb, 0x00, 0xf8, 0xa0, 0xfb, 0xb1, 0xf7, 0xa3, 0xfb, 0xd3, 0xf7, 0xb6, 0xfb, 0x1b, 0xf8, 0xb6, 0xfb, 0x42, 0xf8, 0x95, 0xfb, 0x21, 0xf8, 0x5a, 0xfb, 0xbd, 0xf7, 0x14, 0xfb, 0x39, 0xf7, 0xd7, 0xfa, 0xc7, 0xf6, 0xb3, 0xfa, 0x87, 0xf6, 0xaa, 0xfa, 0x7a, 0xf6, 0xb2, 0xfa, 0x81, 0xf6, 0xb3, 0xfa, 0x6f, 0xf6, 0x93, 0xfa, 0x20, 0xf6, 0x37, 0xfa, 0x8a, 0xf5, 0x94, 0xf9, 0xbc, 0xf4, 0xb2, 0xf8, 0xd6, 0xf3, 0xa8, 0xf7, 0xf7, 0xf2, 360 | 0x9b, 0xf6, 0x2b, 0xf2, 0xb3, 0xf5, 0x73, 0xf1, 0x11, 0xf5, 0xcf, 0xf0, 0xce, 0xf4, 0x53, 0xf0, 0xf8, 0xf4, 0x28, 0xf0, 0x8c, 0xf5, 0x80, 0xf0, 0x7a, 0xf6, 0x79, 0xf1, 0xa0, 0xf7, 0x01, 0xf3, 0xcf, 0xf8, 0xcb, 0xf4, 0xd4, 0xf9, 0x66, 0xf6, 0x80, 0xfa, 0x63, 0xf7, 0xb3, 0xfa, 0x87, 0xf7, 0x68, 0xfa, 0xdd, 0xf6, 0xb1, 0xf9, 0xb9, 0xf5, 0xb5, 0xf8, 0x89, 0xf4, 0xa9, 0xf7, 0xb1, 0xf3, 0xc9, 0xf6, 0x63, 0xf3, 0x4a, 0xf6, 0x9d, 0xf3, 0x53, 0xf6, 0x38, 0xf4, 0xef, 0xf6, 0x06, 0xf5, 0x03, 0xf8, 0xe6, 0xf5, 0x56, 0xf9, 0xca, 0xf6, 0x99, 0xfa, 0xb0, 0xf7, 0x87, 0xfb, 0x90, 0xf8, 0xfa, 0xfb, 0x5a, 0xf9, 0xfe, 0xfb, 0xf9, 0xf9, 0xc2, 0xfb, 0x5d, 0xfa, 0x88, 0xfb, 0x8d, 0xfa, 0x7e, 0xfb, 0x9f, 0xfa, 0xb3, 0xfb, 0xb4, 0xfa, 0x10, 0xfc, 0xe9, 0xfa, 0x74, 0xfc, 0x50, 0xfb, 361 | 0xcb, 0xfc, 0xe9, 0xfb, 0x19, 0xfd, 0xaa, 0xfc, 0x74, 0xfd, 0x80, 0xfd, 0xef, 0xfd, 0x56, 0xfe, 0x80, 0xfe, 0x16, 0xff, 0x05, 0xff, 0xac, 0xff, 0x50, 0xff, 0x0d, 0x00, 0x4d, 0xff, 0x3f, 0x00, 0x17, 0xff, 0x60, 0x00, 0xf8, 0xfe, 0xa2, 0x00, 0x47, 0xff, 0x37, 0x01, 0x3f, 0x00, 0x43, 0x02, 0xdb, 0x01, 0xc8, 0x03, 0xcf, 0x03, 0x9d, 0x05, 0xa7, 0x05, 0x7a, 0x07, 0xfb, 0x06, 0x0f, 0x09, 0x93, 0x07, 0x1b, 0x0a, 0x7e, 0x07, 0x81, 0x0a, 0xfd, 0x06, 0x4e, 0x0a, 0x61, 0x06, 0xb4, 0x09, 0xe3, 0x05, 0xf4, 0x08, 0x94, 0x05, 0x4d, 0x08, 0x61, 0x05, 0xe8, 0x07, 0x30, 0x05, 0xd7, 0x07, 0xf7, 0x04, 0x0f, 0x08, 0xc5, 0x04, 0x78, 0x08, 0xbf, 0x04, 0xf6, 0x08, 0x04, 0x05, 0x78, 0x09, 0x99, 0x05, 0xf3, 0x09, 0x59, 0x06, 0x63, 0x0a, 0x04, 0x07, 0xc1, 0x0a, 0x57, 0x07, 0xfc, 0x0a, 362 | }); err != nil { 363 | fmt.Println("Encode failed, err is", err) 364 | return 365 | } 366 | fmt.Println("AAC:", len(frame)) 367 | 368 | if frame, err = e.Encode([]byte{ 369 | 0x26, 0x07, 0xff, 0x0a, 0x77, 0x06, 0xbe, 0x0a, 0x7c, 0x05, 0x3e, 0x0a, 0x83, 0x04, 0x9d, 0x09, 0xcf, 0x03, 0x04, 0x09, 0x80, 0x03, 0x98, 0x08, 0x86, 0x03, 0x65, 0x08, 0xae, 0x03, 0x5c, 0x08, 0xc2, 0x03, 0x61, 0x08, 0xa9, 0x03, 0x5b, 0x08, 0x73, 0x03, 0x4d, 0x08, 0x4d, 0x03, 0x50, 0x08, 0x62, 0x03, 0x81, 0x08, 0xb6, 0x03, 0xe2, 0x08, 0x16, 0x04, 0x46, 0x09, 0x28, 0x04, 0x5a, 0x09, 0x97, 0x03, 0xcb, 0x08, 0x3e, 0x02, 0x6e, 0x07, 0x45, 0x00, 0x69, 0x05, 0x16, 0xfe, 0x29, 0x03, 0x37, 0xfc, 0x41, 0x01, 0x10, 0xfb, 0x27, 0x00, 0xc9, 0xfa, 0x0d, 0x00, 0x40, 0xfb, 0xc9, 0x00, 0x23, 0xfc, 0xf6, 0x01, 0x14, 0xfd, 0x1a, 0x03, 0xcc, 0xfd, 0xdd, 0x03, 0x25, 0xfe, 0x1a, 0x04, 0x15, 0xfe, 0xde, 0x03, 0x9d, 0xfd, 0x4c, 0x03, 0xc2, 0xfc, 0x80, 0x02, 0x88, 0xfb, 0x86, 0x01, 370 | 0xfe, 0xf9, 0x5a, 0x00, 0x41, 0xf8, 0xf9, 0xfe, 0x7b, 0xf6, 0x6f, 0xfd, 0xd6, 0xf4, 0xd6, 0xfb, 0x6d, 0xf3, 0x51, 0xfa, 0x42, 0xf2, 0xfe, 0xf8, 0x45, 0xf1, 0xea, 0xf7, 0x5e, 0xf0, 0x11, 0xf7, 0x79, 0xef, 0x61, 0xf6, 0x8f, 0xee, 0xc3, 0xf5, 0xa5, 0xed, 0x28, 0xf5, 0xc7, 0xec, 0x87, 0xf4, 0x02, 0xec, 0xe8, 0xf3, 0x62, 0xeb, 0x5a, 0xf3, 0xf4, 0xea, 0xf6, 0xf2, 0xc6, 0xea, 0xd3, 0xf2, 0xe0, 0xea, 0x01, 0xf3, 0x40, 0xeb, 0x7f, 0xf3, 0xd6, 0xeb, 0x40, 0xf4, 0x82, 0xec, 0x24, 0xf5, 0x21, 0xed, 0x06, 0xf6, 0x8f, 0xed, 0xc0, 0xf6, 0xb7, 0xed, 0x32, 0xf7, 0x94, 0xed, 0x47, 0xf7, 0x2c, 0xed, 0xfc, 0xf6, 0x95, 0xec, 0x65, 0xf6, 0xf0, 0xeb, 0xae, 0xf5, 0x66, 0xeb, 0x17, 0xf5, 0x20, 0xeb, 0xdd, 0xf4, 0x37, 0xeb, 0x26, 0xf5, 0xa6, 0xeb, 0xe6, 0xf5, 0x43, 0xec, 0xd9, 0xf6, 371 | 0xcb, 0xec, 0x9e, 0xf7, 0xf8, 0xec, 0xd8, 0xf7, 0x9e, 0xec, 0x5c, 0xf7, 0xc8, 0xeb, 0x46, 0xf6, 0xae, 0xea, 0xf2, 0xf4, 0xa6, 0xe9, 0xd2, 0xf3, 0xfc, 0xe8, 0x40, 0xf3, 0xd6, 0xe8, 0x57, 0xf3, 0x31, 0xe9, 0xf6, 0xf3, 0xe5, 0xe9, 0xd8, 0xf4, 0xcc, 0xea, 0xc1, 0xf5, 0xcb, 0xeb, 0x98, 0xf6, 0xde, 0xec, 0x6b, 0xf7, 0x0a, 0xee, 0x59, 0xf8, 0x4b, 0xef, 0x76, 0xf9, 0x8b, 0xf0, 0xb2, 0xfa, 0xa5, 0xf1, 0xe2, 0xfb, 0x7a, 0xf2, 0xd5, 0xfc, 0x01, 0xf3, 0x6f, 0xfd, 0x49, 0xf3, 0xb7, 0xfd, 0x75, 0xf3, 0xd0, 0xfd, 0xaa, 0xf3, 0xe2, 0xfd, 0xfb, 0xf3, 0x0a, 0xfe, 0x69, 0xf4, 0x4e, 0xfe, 0xe6, 0xf4, 0xa5, 0xfe, 0x63, 0xf5, 0x04, 0xff, 0xdd, 0xf5, 0x6b, 0xff, 0x5b, 0xf6, 0xe8, 0xff, 0xf2, 0xf6, 0x8e, 0x00, 0xba, 0xf7, 0x6c, 0x01, 0xc5, 0xf8, 0x89, 0x02, 0x20, 0xfa, 0xe1, 0x03, 372 | 0xc7, 0xfb, 0x69, 0x05, 0xa8, 0xfd, 0x14, 0x07, 0x9f, 0xff, 0xd3, 0x08, 0x7a, 0x01, 0x8f, 0x0a, 0x08, 0x03, 0x28, 0x0c, 0x20, 0x04, 0x76, 0x0d, 0xae, 0x04, 0x54, 0x0e, 0xb5, 0x04, 0xa4, 0x0e, 0x49, 0x04, 0x5f, 0x0e, 0x86, 0x03, 0x98, 0x0d, 0x91, 0x02, 0x7d, 0x0c, 0x96, 0x01, 0x5a, 0x0b, 0xd1, 0x00, 0x8c, 0x0a, 0x89, 0x00, 0x6b, 0x0a, 0x01, 0x01, 0x37, 0x0b, 0x5a, 0x02, 0xf7, 0x0c, 0x82, 0x04, 0x79, 0x0f, 0x28, 0x07, 0x56, 0x12, 0xda, 0x09, 0x19, 0x15, 0x2b, 0x0c, 0x64, 0x17, 0xdf, 0x0d, 0x17, 0x19, 0xfe, 0x0e, 0x4e, 0x1a, 0xc7, 0x0f, 0x4b, 0x1b, 0x7e, 0x10, 0x49, 0x1c, 0x48, 0x11, 0x5a, 0x1d, 0x11, 0x12, 0x5c, 0x1e, 0x9c, 0x12, 0x11, 0x1f, 0xaa, 0x12, 0x44, 0x1f, 0x27, 0x12, 0xe9, 0x1e, 0x33, 0x11, 0x25, 0x1e, 0x19, 0x10, 0x3d, 0x1d, 0x2c, 0x0f, 0x73, 0x1c, 373 | 0x9a, 0x0e, 0xf1, 0x1b, 0x68, 0x0e, 0xbc, 0x1b, 0x7a, 0x0e, 0xcc, 0x1b, 0xb0, 0x0e, 0x18, 0x1c, 0x00, 0x0f, 0xa0, 0x1c, 0x72, 0x0f, 0x65, 0x1d, 0x17, 0x10, 0x5b, 0x1e, 0xe7, 0x10, 0x56, 0x1f, 0xb8, 0x11, 0x1a, 0x20, 0x47, 0x12, 0x69, 0x20, 0x53, 0x12, 0x22, 0x20, 0xbb, 0x11, 0x54, 0x1f, 0x91, 0x10, 0x30, 0x1e, 0x16, 0x0f, 0xfb, 0x1c, 0xa3, 0x0d, 0xec, 0x1b, 0x89, 0x0c, 0x1f, 0x1b, 0xfa, 0x0b, 0x99, 0x1a, 0xfb, 0x0b, 0x54, 0x1a, 0x6e, 0x0c, 0x4b, 0x1a, 0x1f, 0x0d, 0x82, 0x1a, 0xd7, 0x0d, 0xf8, 0x1a, 0x6e, 0x0e, 0x9c, 0x1b, 0xcd, 0x0e, 0x47, 0x1c, 0xf2, 0x0e, 0xc2, 0x1c, 0xe1, 0x0e, 0xde, 0x1c, 0xa0, 0x0e, 0x7e, 0x1c, 0x2d, 0x0e, 0xa9, 0x1b, 0x81, 0x0d, 0x82, 0x1a, 0x9b, 0x0c, 0x3d, 0x19, 0x83, 0x0b, 0x06, 0x18, 0x54, 0x0a, 0xf7, 0x16, 0x2c, 0x09, 0x0b, 0x16, 374 | 0x1a, 0x08, 0x27, 0x15, 0x14, 0x07, 0x1c, 0x14, 0xf1, 0x05, 0xc2, 0x12, 0x82, 0x04, 0x03, 0x11, 0xb4, 0x02, 0xf5, 0x0e, 0xa8, 0x00, 0xd4, 0x0c, 0xb7, 0xfe, 0xf9, 0x0a, 0x4f, 0xfd, 0xba, 0x09, 0xc4, 0xfc, 0x47, 0x09, 0x1f, 0xfd, 0x92, 0x09, 0x14, 0xfe, 0x56, 0x0a, 0x1f, 0xff, 0x29, 0x0b, 0xbb, 0xff, 0xab, 0x0b, 0x9b, 0xff, 0x9e, 0x0b, 0xb9, 0xfe, 0xf6, 0x0a, 0x4b, 0xfd, 0xc4, 0x09, 0x9a, 0xfb, 0x2b, 0x08, 0xda, 0xf9, 0x4a, 0x06, 0x22, 0xf8, 0x46, 0x04, 0x83, 0xf6, 0x53, 0x02, 0x1f, 0xf5, 0xc4, 0x00, 0x3e, 0xf4, 0xf9, 0xff, 0x36, 0xf4, 0x3e, 0x00, 0x3c, 0xf5, 0x9e, 0x01, 0x37, 0xf7, 0xcd, 0x03, 0xaf, 0xf9, 0x2e, 0x06, 0xea, 0xfb, 0x08, 0x08, 0x2a, 0xfd, 0xc5, 0x08, 0xf8, 0xfc, 0x26, 0x08, 0x4a, 0xfb, 0x4d, 0x06, 0x80, 0xf8, 0xa5, 0x03, 0x3a, 0xf5, 0xac, 0x00, 375 | 0x18, 0xf2, 0xce, 0xfd, 0x90, 0xef, 0x49, 0xfb, 0xd4, 0xed, 0x3e, 0xf9, 0xe2, 0xec, 0xbc, 0xf7, 0x97, 0xec, 0xd3, 0xf6, 0xcf, 0xec, 0x94, 0xf6, 0x6d, 0xed, 0x01, 0xf7, 0x5f, 0xee, 0xff, 0xf7, 0x96, 0xef, 0x5a, 0xf9, 0x03, 0xf1, 0xd0, 0xfa, 0x8b, 0xf2, 0x26, 0xfc, 0x0d, 0xf4, 0x34, 0xfd, 0x61, 0xf5, 0xf0, 0xfd, 0x62, 0xf6, 0x5d, 0xfe, 0xfd, 0xf6, 0x8a, 0xfe, 0x35, 0xf7, 0x86, 0xfe, 0x2a, 0xf7, 0x60, 0xfe, 0x0a, 0xf7, 0x2a, 0xfe, 0x00, 0xf7, 0xee, 0xfd, 0x1b, 0xf7, 0xb1, 0xfd, 0x49, 0xf7, 0x67, 0xfd, 0x5f, 0xf7, 0xff, 0xfc, 0x38, 0xf7, 0x6a, 0xfc, 0xd1, 0xf6, 0xb1, 0xfb, 0x53, 0xf6, 0xf9, 0xfa, 0x0b, 0xf6, 0x7e, 0xfa, 0x44, 0xf6, 0x79, 0xfa, 0x24, 0xf7, 0x0a, 0xfb, 0x98, 0xf8, 0x24, 0xfc, 0x5b, 0xfa, 0x92, 0xfd, 0x0e, 0xfc, 0x04, 0xff, 0x64, 0xfd, 0x30, 0x00, 376 | 0x34, 0xfe, 0xe8, 0x00, 0x84, 0xfe, 0x20, 0x01, 0x7a, 0xfe, 0xf1, 0x00, 0x4e, 0xfe, 0x8e, 0x00, 0x36, 0xfe, 0x35, 0x00, 0x5c, 0xfe, 0x24, 0x00, 0xd9, 0xfe, 0x85, 0x00, 0xad, 0xff, 0x60, 0x01, 0xb7, 0x00, 0x8c, 0x02, 0xbe, 0x01, 0xbe, 0x03, 0x7d, 0x02, 0x9b, 0x04, 0xc0, 0x02, 0xdf, 0x04, 0x79, 0x02, 0x7d, 0x04, 0xca, 0x01, 0xaa, 0x03, 0xfa, 0x00, 0xc2, 0x02, 0x50, 0x00, 0x22, 0x02, 0xf7, 0xff, 0xfe, 0x01, 0xf0, 0xff, 0x4b, 0x02, 0x1f, 0x00, 0xd6, 0x02, 0x62, 0x00, 0x62, 0x03, 0xa9, 0x00, 0xcf, 0x03, 0x01, 0x01, 0x26, 0x04, 0x77, 0x01, 0x89, 0x04, 0x0b, 0x02, 0x12, 0x05, 0x9a, 0x02, 0xb9, 0x05, 0xf0, 0x02, 0x56, 0x06, 0xe6, 0x02, 0xb8, 0x06, 0x82, 0x02, 0xcc, 0x06, 0xfb, 0x01, 0xaa, 0x06, 0xab, 0x01, 0x93, 0x06, 0xdd, 0x01, 0xd1, 0x06, 0xb1, 0x02, 0x95, 0x07, 377 | 0x0c, 0x04, 0xe3, 0x08, 0xb3, 0x05, 0x9e, 0x0a, 0x6f, 0x07, 0x9c, 0x0c, 0x26, 0x09, 0xbc, 0x0e, 0xe4, 0x0a, 0xeb, 0x10, 0xbb, 0x0c, 0x1a, 0x13, 0xa9, 0x0e, 0x2f, 0x15, 0x80, 0x10, 0xfc, 0x16, 0xf8, 0x11, 0x4e, 0x18, 0xd1, 0x12, 0x07, 0x19, 0xf9, 0x12, 0x2e, 0x19, 0x97, 0x12, 0xf5, 0x18, 0x04, 0x12, 0xa5, 0x18, 0x9e, 0x11, 0x7e, 0x18, 0xa2, 0x11, 0xa0, 0x18, 0x10, 0x12, 0xff, 0x18, 0xb3, 0x12, 0x6e, 0x19, 0x3c, 0x13, 0xba, 0x19, 0x65, 0x13, 0xb9, 0x19, 0x0c, 0x13, 0x58, 0x19, 0x40, 0x12, 0x9e, 0x18, 0x34, 0x11, 0xa6, 0x17, 0x2b, 0x10, 0x9a, 0x16, 0x5e, 0x0f, 0xa6, 0x15, 0xea, 0x0e, 0xed, 0x14, 0xc6, 0x0e, 0x7e, 0x14, 0xc9, 0x0e, 0x4a, 0x14, 0xc0, 0x0e, 0x2c, 0x14, 0x89, 0x0e, 0xf9, 0x13, 0x2b, 0x0e, 0x9d, 0x13, 0xd8, 0x0d, 0x2e, 0x13, 0xda, 0x0d, 0xe9, 0x12, 378 | 0x6f, 0x0e, 0x15, 0x13, 0xa3, 0x0f, 0xdd, 0x13, 0x44, 0x11, 0x2e, 0x15, 0xea, 0x12, 0xb4, 0x16, 0x2c, 0x14, 0xf9, 0x17, 0xc7, 0x14, 0x9d, 0x18, 0xba, 0x14, 0x76, 0x18, 0x3d, 0x14, 0xa7, 0x17, 0xa0, 0x13, 0x86, 0x16, 0x1e, 0x13, 0x6e, 0x15, 0xc6, 0x12, 0x9d, 0x14, 0x81, 0x12, 0x18, 0x14, 0x29, 0x12, 0xbb, 0x13, 0xa6, 0x11, 0x50, 0x13, 0x00, 0x11, 0xaf, 0x12, 0x4b, 0x10, 0xc9, 0x11, 0x9c, 0x0f, 0xab, 0x10, 0xef, 0x0e, 0x6a, 0x0f, 0x2d, 0x0e, 0x1b, 0x0e, 0x39, 0x0d, 0xcd, 0x0c, 0x05, 0x0c, 0x83, 0x0b, 0x9e, 0x0a, 0x36, 0x0a, 0x21, 0x09, 0xde, 0x08, 0xb0, 0x07, 0x6f, 0x07, 0x5f, 0x06, 0xe9, 0x05, 0x3b, 0x05, 0x5f, 0x04, 0x4f, 0x04, 0xfd, 0x02, 0xae, 0x03, 0x00, 0x02, 0x72, 0x03, 0x9c, 0x01, 0xa6, 0x03, 0xdb, 0x01, 0x35, 0x04, 0x90, 0x02, 0xe5, 0x04, 0x5c, 0x03, 379 | 0x64, 0x05, 0xd3, 0x03, 0x6d, 0x05, 0xab, 0x03, 0xf0, 0x04, 0xe6, 0x02, 0x1a, 0x04, 0xce, 0x01, 0x44, 0x03, 0xd6, 0x00, 0xcb, 0x02, 0x60, 0x00, 0xdf, 0x02, 0x92, 0x00, 0x74, 0x03, 0x47, 0x01, 0x47, 0x04, 0x27, 0x02, 0xff, 0x04, 0xd6, 0x02, 0x59, 0x05, 0x15, 0x03, 0x35, 0x05, 0xdb, 0x02, 0x9d, 0x04, 0x41, 0x02, 0xaf, 0x03, 0x6b, 0x01, 0x8e, 0x02, 0x74, 0x00, 0x5d, 0x01, 0x6e, 0xff, 0x37, 0x00, 0x67, 0xfe, 0x3b, 0xff, 0x75, 0xfd, 0x81, 0xfe, 0xb9, 0xfc, 0x11, 0xfe, 0x4a, 0xfc, 0xdc, 0xfd, 0x27, 0xfc, 0xb9, 0xfd, 0x2b, 0xfc, 0x78, 0xfd, 0x21, 0xfc, 0xf7, 0xfc, 0xd6, 0xfb, 0x35, 0xfc, 0x3a, 0xfb, 0x56, 0xfb, 0x6a, 0xfa, 0x92, 0xfa, 0x9e, 0xf9, 0x1b, 0xfa, 0x19, 0xf9, 0x0e, 0xfa, 0x06, 0xf9, 0x6c, 0xfa, 0x70, 0xf9, 0x21, 0xfb, 0x45, 0xfa, 0x15, 0xfc, 0x62, 0xfb, 380 | 0x38, 0xfd, 0xa6, 0xfc, 0x79, 0xfe, 0xf4, 0xfd, 0xcb, 0xff, 0x34, 0xff, 0x11, 0x01, 0x54, 0x00, 0x2a, 0x02, 0x3d, 0x01, 0xf6, 0x02, 0xe2, 0x01, 0x64, 0x03, 0x3d, 0x02, 0x78, 0x03, 0x52, 0x02, 0x47, 0x03, 0x2e, 0x02, 0xf3, 0x02, 0xe1, 0x01, 0x9c, 0x02, 0x7d, 0x01, 0x5d, 0x02, 0x13, 0x01, 0x45, 0x02, 0xb7, 0x00, 0x5e, 0x02, 0x7e, 0x00, 0xa2, 0x02, 0x78, 0x00, 0x03, 0x03, 0xa3, 0x00, 0x6b, 0x03, 0xed, 0x00, 0xc6, 0x03, 0x3a, 0x01, 0x10, 0x04, 0x74, 0x01, 0x5e, 0x04, 0x9d, 0x01, 0xd4, 0x04, 0xd0, 0x01, 0x94, 0x05, 0x32, 0x02, 0xa8, 0x06, 0xdc, 0x02, 0xf2, 0x07, 0xc5, 0x03, 0x38, 0x09, 0xc2, 0x04, 0x3e, 0x0a, 0x9b, 0x05, 0xeb, 0x0a, 0x2d, 0x06, 0x5c, 0x0b, 0x82, 0x06, 0xd4, 0x0b, 0xcc, 0x06, 0x9c, 0x0c, 0x4e, 0x07, 0xd7, 0x0d, 0x2f, 0x08, 0x65, 0x0f, 0x62, 0x09, 381 | 0xf4, 0x10, 0xa7, 0x0a, 0x25, 0x12, 0xab, 0x0b, 0xb9, 0x12, 0x30, 0x0c, 0xb5, 0x12, 0x2b, 0x0c, 0x53, 0x12, 0xc7, 0x0b, 0xea, 0x11, 0x4c, 0x0b, 0xc0, 0x11, 0xff, 0x0a, 0xf1, 0x11, 0x09, 0x0b, 0x77, 0x12, 0x72, 0x0b, 0x3c, 0x13, 0x35, 0x0c, 0x36, 0x14, 0x49, 0x0d, 0x6b, 0x15, 0xab, 0x0e, 0xe0, 0x16, 0x51, 0x10, 0x87, 0x18, 0x1e, 0x12, 0x26, 0x1a, 0xd3, 0x13, 0x69, 0x1b, 0x23, 0x15, 0xf6, 0x1b, 0xc6, 0x15, 0x98, 0x1b, 0x94, 0x15, 0x57, 0x1a, 0x9b, 0x14, 0x74, 0x18, 0x16, 0x13, 0x55, 0x16, 0x58, 0x11, 0x61, 0x14, 0xb6, 0x0f, 0xe2, 0x12, 0x74, 0x0e, 0x00, 0x12, 0xbe, 0x0d, 0xbf, 0x11, 0xab, 0x0d, 0x13, 0x12, 0x41, 0x0e, 0xe6, 0x12, 0x75, 0x0f, 0x16, 0x14, 0x20, 0x11, 0x76, 0x15, 0x04, 0x13, 0xc7, 0x16, 0xca, 0x14, 0xc3, 0x17, 0x1c, 0x16, 0x26, 0x18, 0xb8, 0x16, 382 | 0xc8, 0x17, 0x83, 0x16, 0xa5, 0x16, 0x94, 0x15, 0xe6, 0x14, 0x25, 0x14, 0xd7, 0x12, 0x86, 0x12, 0xd2, 0x10, 0x05, 0x11, 0x2a, 0x0f, 0xd6, 0x0f, 0x0b, 0x0e, 0x10, 0x0f, 0x73, 0x0d, 0xa7, 0x0e, 0x31, 0x0d, 0x70, 0x0e, 0xf3, 0x0c, 0x36, 0x0e, 0x6e, 0x0c, 0xc3, 0x0d, 0x6f, 0x0b, 0xf6, 0x0c, 0xf8, 0x09, 0xcb, 0x0b, 0x38, 0x08, 0x5b, 0x0a, 0x76, 0x06, 0xd2, 0x08, 0xf4, 0x04, 0x5f, 0x07, 0xd5, 0x03, 0x22, 0x06, 0x17, 0x03, 0x2c, 0x05, 0x9c, 0x02, 0x7a, 0x04, 0x49, 0x02, 0x06, 0x04, 0x0d, 0x02, 0xc8, 0x03, 0xed, 0x01, 0xb7, 0x03, 0xf0, 0x01, 0xc2, 0x03, 0x0b, 0x02, 0xc7, 0x03, 0x17, 0x02, 0x96, 0x03, 0xdc, 0x01, 0xfe, 0x02, 0x2b, 0x01, 0xe5, 0x01, 0xf8, 0xff, 0x59, 0x00, 0x6a, 0xfe, 0x8e, 0xfe, 0xd5, 0xfc, 0xd4, 0xfc, 0x95, 0xfb, 0x74, 0xfb, 0xea, 0xfa, 0x9c, 0xfa, 383 | 0xe7, 0xfa, 0x4d, 0xfa, 0x64, 0xfb, 0x61, 0xfa, 0x1b, 0xfc, 0xa1, 0xfa, 0xba, 0xfc, 0xd0, 0xfa, 0xf9, 0xfc, 0xb9, 0xfa, 0xad, 0xfc, 0x30, 0xfa, 0xc3, 0xfb, 0x18, 0xf9, 0x44, 0xfa, 0x68, 0xf7, 0x57, 0xf8, 0x34, 0xf5, 0x3d, 0xf6, 0xb9, 0xf2, 0x4b, 0xf4, 0x57, 0xf0, 0xd2, 0xf2, 0x73, 0xee, 0x05, 0xf2, 0x50, 0xed, 0xd9, 0xf1, 0xec, 0xec, 0x06, 0xf2, 0xf8, 0xec, 0x1d, 0xf2, 0xf4, 0xec, 0xb6, 0xf1, 0x66, 0xec, 0xa3, 0xf0, 0x14, 0xeb, 0x06, 0xef, 0x26, 0xe9, 0x49, 0xed, 0x14, 0xe7, 0xea, 0xeb, 0x73, 0xe5, 0x43, 0xeb, 0xa8, 0xe4, 0x5c, 0xeb, 0xbc, 0xe4, 0xe8, 0xeb, 0x54, 0xe5, 0x67, 0xec, 0xdb, 0xe5, 0x63, 0xec, 0xcc, 0xe5, 0xa9, 0xeb, 0xec, 0xe4, 0x5b, 0xea, 0x69, 0xe3, 0xdf, 0xe8, 0xbd, 0xe1, 0xae, 0xe7, 0x73, 0xe0, 0x1f, 0xe7, 0xed, 0xdf, 0x46, 0xe7, 0x37, 0xe0, 384 | 0xf3, 0xe7, 0x0f, 0xe1, 0xd2, 0xe8, 0x0b, 0xe2, 0x94, 0xe9, 0xcd, 0xe2, 0x10, 0xea, 0x2d, 0xe3, 0x48, 0xea, 0x3b, 0xe3, 0x59, 0xea, 0x2c, 0xe3, 0x5b, 0xea, 0x2b, 0xe3, 0x4a, 0xea, 0x36, 0xe3, 0xff, 0xe9, 0x1b, 0xe3, 0x42, 0xe9, 0x8c, 0xe2, 0xef, 0xe7, 0x4e, 0xe1, 0x0c, 0xe6, 0x60, 0xdf, 0xdc, 0xe3, 0x09, 0xdd, 0xcb, 0xe1, 0xcb, 0xda, 0x4a, 0xe0, 0x2f, 0xd9, 0xa3, 0xdf, 0x8d, 0xd8, 0xde, 0xdf, 0xe8, 0xd8, 0xba, 0xe0, 0xef, 0xd9, 0xc6, 0xe1, 0x1a, 0xdb, 0x94, 0xe2, 0xe6, 0xdb, 0xd7, 0xe2, 0x07, 0xdc, 0x85, 0xe2, 0x80, 0xdb, 0xcc, 0xe1, 0x98, 0xda, 0xfa, 0xe0, 0xb0, 0xd9, 0x5a, 0xe0, 0x1b, 0xd9, 0x1b, 0xe0, 0xfb, 0xd8, 0x44, 0xe0, 0x42, 0xd9, 0xc2, 0xe0, 0xc5, 0xd9, 0x72, 0xe1, 0x58, 0xda, 0x37, 0xe2, 0xe5, 0xda, 0xf3, 0xe2, 0x67, 0xdb, 0x8f, 0xe3, 0xdc, 0xdb, 385 | 0xee, 0xe3, 0x35, 0xdc, 0xf9, 0xe3, 0x56, 0xdc, 0xa8, 0xe3, 0x25, 0xdc, 0x14, 0xe3, 0xa1, 0xdb, 0x76, 0xe2, 0xf3, 0xda, 0x19, 0xe2, 0x6a, 0xda, 0x3e, 0xe2, 0x57, 0xda, 0x00, 0xe3, 0xef, 0xda, 0x49, 0xe4, 0x30, 0xdc, 0xde, 0xe5, 0xe1, 0xdd, 0x82, 0xe7, 0xb4, 0xdf, 0x12, 0xe9, 0x6e, 0xe1, 0x94, 0xea, 0x00, 0xe3, 0x2b, 0xec, 0x86, 0xe4, 0xf5, 0xed, 0x2d, 0xe6, 0xed, 0xef, 0x08, 0xe8, 0xdd, 0xf1, 0xf7, 0xe9, 0x74, 0xf3, 0xb5, 0xeb, 0x6c, 0xf4, 0xf3, 0xec, 0xb7, 0xf4, 0x88, 0xed, 0x88, 0xf4, 0x91, 0xed, 0x47, 0xf4, 0x66, 0xed, 0x64, 0xf4, 0x7c, 0xed, 0x26, 0xf5, 0x31, 0xee, 0x94, 0xf6, 0xa6, 0xef, 0x78, 0xf8, 0xb6, 0xf1, 0x79, 0xfa, 0x07, 0xf4, 0x45, 0xfc, 0x35, 0xf6, 0xa9, 0xfd, 0xf2, 0xf7, 0x9d, 0xfe, 0x1f, 0xf9, 0x31, 0xff, 0xcb, 0xf9, 0x86, 0xff, 0x23, 0xfa, 386 | 0xb8, 0xff, 0x5e, 0xfa, 0xdd, 0xff, 0xa9, 0xfa, 0x06, 0x00, 0x1e, 0xfb, 0x3d, 0x00, 0xbb, 0xfb, 0x84, 0x00, 0x6a, 0xfc, 0xcd, 0x00, 0x05, 0xfd, 0x01, 0x01, 0x67, 0xfd, 0x03, 0x01, 0x79, 0xfd, 0xc5, 0x00, 0x42, 0xfd, 0x50, 0x00, 0xe3, 0xfc, 0xc5, 0xff, 0x90, 0xfc, 0x59, 0xff, 0x79, 0xfc, 0x36, 0xff, 0xba, 0xfc, 0x71, 0xff, 0x4a, 0xfd, 0xfb, 0xff, 0x0a, 0xfe, 0xac, 0x00, 0xcc, 0xfe, 0x55, 0x01, 0x71, 0xff, 0xd2, 0x01, 0xeb, 0xff, 0x14, 0x02, 0x42, 0x00, 0x25, 0x02, 0x87, 0x00, 0x1a, 0x02, 0xc3, 0x00, 0x01, 0x02, 0xf0, 0x00, 0xe0, 0x01, 0xfb, 0x00, 0xa8, 0x01, 0xc8, 0x00, 0x3d, 0x01, 0x45, 0x00, 0x86, 0x00, 0x6b, 0xff, 0x7e, 0xff, 0x4d, 0xfe, 0x3b, 0xfe, 0x10, 0xfd, 0xf5, 0xfc, 0xea, 0xfb, 0xf8, 0xfb, 0x16, 0xfb, 0x8a, 0xfb, 0xc0, 0xfa, 0xc8, 0xfb, 0xf4, 0xfa, 387 | 0x97, 0xfc, 0x97, 0xfb, 0xa5, 0xfd, 0x62, 0xfc, 0x83, 0xfe, 0x01, 0xfd, 0xd5, 0xfe, 0x2b, 0xfd, 0x7b, 0xfe, 0xc6, 0xfc, 0x97, 0xfd, 0xeb, 0xfb, 0x81, 0xfc, 0xd8, 0xfa, 0x8f, 0xfb, 0xd0, 0xf9, 0xf0, 0xfa, 0xf5, 0xf8, 0x91, 0xfa, 0x3e, 0xf8, 0x38, 0xfa, 0x85, 0xf7, 0xab, 0xf9, 0xa7, 0xf6, 0xdc, 0xf8, 0xa6, 0xf5, 0xfa, 0xf7, 0xaf, 0xf4, 0x5d, 0xf7, 0x03, 0xf4, 0x4b, 0xf7, 0xd4, 0xf3, 0xd1, 0xf7, 0x1d, 0xf4, 0xaf, 0xf8, 0x9c, 0xf4, 0x74, 0xf9, 0xf1, 0xf4, 0xb0, 0xf9, 0xc3, 0xf4, 0x28, 0xf9, 0xec, 0xf3, 0xed, 0xf7, 0x85, 0xf2, 0x53, 0xf6, 0xd4, 0xf0, 0xc2, 0xf4, 0x2b, 0xef, 0x95, 0xf3, 0xce, 0xed, 0xf8, 0xf2, 0xe1, 0xec, 0xee, 0xf2, 0x6d, 0xec, 0x5b, 0xf3, 0x6e, 0xec, 0x15, 0xf4, 0xd0, 0xec, 0xe9, 0xf4, 0x6f, 0xed, 0x9d, 0xf5, 0x0e, 0xee, 0xf0, 0xf5, 0x5a, 0xee, 388 | 0xab, 0xf5, 0x03, 0xee, 0xb1, 0xf4, 0xda, 0xec, 0x12, 0xf3, 0xf0, 0xea, 0x09, 0xf1, 0x8e, 0xe8, 0xeb, 0xee, 0x24, 0xe6, 0x07, 0xed, 0x12, 0xe4, 0x8b, 0xeb, 0x8e, 0xe2, 0x7d, 0xea, 0x90, 0xe1, 0xc4, 0xe9, 0xea, 0xe0, 0x44, 0xe9, 0x69, 0xe0, 0xeb, 0xe8, 0xf2, 0xdf, 0xbc, 0xe8, 0x8e, 0xdf, 0xc2, 0xe8, 0x60, 0xdf, 0x06, 0xe9, 0x88, 0xdf, 0x87, 0xe9, 0x11, 0xe0, 0x3c, 0xea, 0xef, 0xe0, 0x1b, 0xeb, 0x05, 0xe2, 0x22, 0xec, 0x38, 0xe3, 0x51, 0xed, 0x78, 0xe4, 0xa5, 0xee, 0xc1, 0xe5, 0x10, 0xf0, 0x15, 0xe7, 0x79, 0xf1, 0x73, 0xe8, 0xc8, 0xf2, 0xd7, 0xe9, 0xf2, 0xf3, 0x38, 0xeb, 0xf2, 0xf4, 0x88, 0xec, 0xcd, 0xf5, 0xb1, 0xed, 0x7e, 0xf6, 0x99, 0xee, 0xf3, 0xf6, 0x25, 0xef, 0x15, 0xf7, 0x47, 0xef, 0xdb, 0xf6, 0x0b, 0xef, 0x56, 0xf6, 0x99, 0xee, 0xb0, 0xf5, 0x29, 0xee, 389 | 0x1e, 0xf5, 0xe8, 0xed, 0xbf, 0xf4, 0xe2, 0xed, 0x8f, 0xf4, 0xfc, 0xed, 0x6e, 0xf4, 0x04, 0xee, 0x3a, 0xf4, 0xd9, 0xed, 0xef, 0xf3, 0x88, 0xed, 0xba, 0xf3, 0x54, 0xed, 0xe1, 0xf3, 0x99, 0xed, 0xa8, 0xf4, 0x9c, 0xee, 0x22, 0xf6, 0x63, 0xf0, 0x21, 0xf8, 0xa9, 0xf2, 0x4a, 0xfa, 0xfc, 0xf4, 0x3c, 0xfc, 0xf4, 0xf6, 0xbb, 0xfd, 0x5f, 0xf8, 0xc4, 0xfe, 0x4e, 0xf9, 0x80, 0xff, 0x03, 0xfa, 0x27, 0x00, 0xc1, 0xfa, 0xe2, 0x00, 0xac, 0xfb, 0xb9, 0x01, 0xb8, 0xfc, 0x9f, 0x02, 0xbf, 0xfd, 0x81, 0x03, 0xa1, 0xfe, 0x55, 0x04, 0x53, 0xff, 0x1e, 0x05, 0xea, 0xff, 0xe7, 0x05, 0x88, 0x00, 0xb9, 0x06, 0x4b, 0x01, 0x9f, 0x07, 0x42, 0x02, 0xaf, 0x08, 0x72, 0x03, 0x07, 0x0a, 0xe5, 0x04, 0xc9, 0x0b, 0xa7, 0x06, 0x02, 0x0e, 0xbd, 0x08, 0x9a, 0x10, 0x1a, 0x0b, 0x4d, 0x13, 0x91, 0x0d, 390 | 0xc4, 0x15, 0xe2, 0x0f, 0xb4, 0x17, 0xce, 0x11, 0xfd, 0x18, 0x2e, 0x13, 0xac, 0x19, 0xfc, 0x13, 0xed, 0x19, 0x4d, 0x14, 0xeb, 0x19, 0x3c, 0x14, 0xb6, 0x19, 0xdc, 0x13, 0x4c, 0x19, 0x3c, 0x13, 0xaf, 0x18, 0x78, 0x12, 0x01, 0x18, 0xc4, 0x11, 0x8e, 0x17, 0x6d, 0x11, 0xab, 0x17, 0xbc, 0x11, 0x93, 0x18, 0xd2, 0x12, 0x37, 0x1a, 0x8f, 0x14, 0x44, 0x1c, 0x96, 0x16, 0x3c, 0x1e, 0x75, 0x18, 0xac, 0x1f, 0xd1, 0x19, 0x5a, 0x20, 0x84, 0x1a, 0x4f, 0x20, 0xa4, 0x1a, 0xc0, 0x1f, 0x5e, 0x1a, 0xea, 0x1e, 0xdc, 0x19, 0xf1, 0x1d, 0x28, 0x19, 0xe2, 0x1c, 0x41, 0x18, 0xc1, 0x1b, 0x2d, 0x17, 0xa4, 0x1a, 0x16, 0x16, 0xba, 0x19, 0x41, 0x15, 0x35, 0x19, 0xf2, 0x14, 0x2d, 0x19, 0x43, 0x15, 0x8e, 0x19, 0x0f, 0x16, 0x13, 0x1a, 0xfb, 0x16, 0x6a, 0x1a, 0x9f, 0x17, 0x53, 0x1a, 0xb4, 0x17, 391 | 0xbe, 0x19, 0x37, 0x17, 0xcd, 0x18, 0x5f, 0x16, 0xbf, 0x17, 0x81, 0x15, 0xd1, 0x16, 0xe4, 0x14, 0x2c, 0x16, 0xa9, 0x14, 0xd8, 0x15, 0xc2, 0x14, 0xc5, 0x15, 0x08, 0x15, 0xd2, 0x15, 0x4c, 0x15, 0xd9, 0x15, 0x6a, 0x15, 0xb4, 0x15, 0x4d, 0x15, 0x48, 0x15, 0xf4, 0x14, 0x8e, 0x14, 0x67, 0x14, 0x9d, 0x13, 0xbf, 0x13, 0xa0, 0x12, 0x18, 0x13, 0xcb, 0x11, 0x8b, 0x12, 0x38, 0x11, 0x20, 0x12, 0xe5, 0x10, 0xce, 0x11, 0xad, 0x10, 0x7c, 0x11, 0x69, 0x10, 0x1b, 0x11, 0x08, 0x10, 0xaf, 0x10, 0x9e, 0x0f, 0x56, 0x10, 0x54, 0x0f, 0x2f, 0x10, 0x41, 0x0f, 0x3e, 0x10, 0x4a, 0x0f, 0x4f, 0x10, 0x1c, 0x0f, 0x02, 0x10, 0x50, 0x0e, 0xf5, 0x0e, 0xa7, 0x0c, 0xfb, 0x0c, 0x39, 0x0a, 0x44, 0x0a, 0x7f, 0x07, 0x5b, 0x07, 0x25, 0x05, 0xec, 0x04, 0xc3, 0x03, 0x7f, 0x03, 0x97, 0x03, 0x3b, 0x03, 392 | 0x6c, 0x04, 0xd8, 0x03, 0xb9, 0x05, 0xc6, 0x04, 0xdf, 0x06, 0x76, 0x05, 0x6f, 0x07, 0x8e, 0x05, 0x45, 0x07, 0x04, 0x05, 0x88, 0x06, 0x04, 0x04, 0x7e, 0x05, 0xd0, 0x02, 0x71, 0x04, 0x98, 0x01, 0x91, 0x03, 0x79, 0x00, 0xfe, 0x02, 0x85, 0xff, 0xc9, 0x02, 0xd2, 0xfe, 0xf8, 0x02, 0x7c, 0xfe, 0x83, 0x03, 0x90, 0xfe, 0x43, 0x04, 0xfa, 0xfe, 0xfe, 0x04, 0x81, 0xff, 0x79, 0x05, 0xd8, 0xff, 0x92, 0x05, 0xc5, 0xff, 0x50, 0x05, 0x3e, 0xff, 0xe1, 0x04, 0x6d, 0xfe, 0x7a, 0x04, 0x94, 0xfd, 0x38, 0x04, 0xe9, 0xfc, 0x12, 0x04, 0x76, 0xfc, 0xe3, 0x03, 0x22, 0xfc, 0x8f, 0x03, 0xc5, 0xfb, 0x1b, 0x03, 0x51, 0xfb, 0xb3, 0x02, 0xd9, 0xfa, 0x93, 0x02, 0x8e, 0xfa, 0xd9, 0x02, 0x92, 0xfa, 0x6f, 0x03, 0xe6, 0xfa, 0x10, 0x04, 0x5a, 0xfb, 0x66, 0x04, 0xaa, 0xfb, 0x3e, 0x04, 0xa0, 0xfb, 393 | 0xa4, 0x03, 0x39, 0xfb, 0xe1, 0x02, 0xa4, 0xfa, 0x56, 0x02, 0x31, 0xfa, 0x51, 0x02, 0x28, 0xfa, 0xe8, 0x02, 0xaf, 0xfa, 0xf8, 0x03, 0xba, 0xfb, 0x35, 0x05, 0x12, 0xfd, 0x4a, 0x06, 0x68, 0xfe, 0xf3, 0x06, 0x6f, 0xff, 0x0c, 0x07, 0xec, 0xff, 0x91, 0x06, 0xc4, 0xff, 0x9e, 0x05, 0x06, 0xff, 0x62, 0x04, 0xe9, 0xfd, 0x20, 0x03, 0xc2, 0xfc, 0x17, 0x02, 0xe8, 0xfb, 0x76, 0x01, 0x99, 0xfb, 0x4b, 0x01, 0xe1, 0xfb, 0x81, 0x01, 0x99, 0xfc, 0xf0, 0x01, 0x7f, 0xfd, 0x6a, 0x02, 0x55, 0xfe, 0xd8, 0x02, 0xfe, 0xfe, 0x35, 0x03, 0x85, 0xff, 0x86, 0x03, 0x06, 0x00, 0xcc, 0x03, 0x96, 0x00, 0xfc, 0x03, 0x31, 0x01, 0x0c, 0x04, 0xc1, 0x01, 0x03, 0x04, 0x37, 0x02, 0x07, 0x04, 0xa2, 0x02, 0x53, 0x04, 0x31, 0x03, 0x15, 0x05, 0x19, 0x04, 0x50, 0x06, 0x71, 0x05, 0xc4, 0x07, 0x11, 0x07, 394 | 0x09, 0x09, 0x9f, 0x08, 0xb5, 0x09, 0xae, 0x09, 0x94, 0x09, 0xf8, 0x09, 0xb6, 0x08, 0x76, 0x09, 0x67, 0x07, 0x5f, 0x08, 0xf9, 0x05, 0x06, 0x07, 0x9f, 0x04, 0xaa, 0x05, 0x5b, 0x03, 0x68, 0x04, 0x1b, 0x02, 0x40, 0x03, 0xe5, 0x00, 0x3f, 0x02, 0xf4, 0xff, 0x94, 0x01, 0xb4, 0xff, 0x96, 0x01, 0x8a, 0x00, 0x92, 0x02, 0x99, 0x02, 0xa1, 0x04, 0x98, 0x05, 0x83, 0x07, 0xe5, 0x08, 0xa8, 0x0a, 0xbb, 0x0b, 0x66, 0x0d, 0x8a, 0x0d, 0x39, 0x0f, 0x26, 0x0e, 0xf5, 0x0f, 0xd1, 0x0d, 0xc6, 0x0f, 0x04, 0x0d, 0x0f, 0x0f, 0x37, 0x0c, 0x37, 0x0e, 0xa9, 0x0b, 0x7b, 0x0d, 0x5a, 0x0b, 0xec, 0x0c, 0x26, 0x0b, 0x7d, 0x0c, 0xed, 0x0a, 0x24, 0x0c, 0xb1, 0x0a, 0xe9, 0x0b, 0x99, 0x0a, 0xe4, 0x0b, 0xd5, 0x0a, 0x31, 0x0c, 0x82, 0x0b, 0xd8, 0x0c, 0x99, 0x0c, 0xc6, 0x0d, 0xe7, 0x0d, 0xd2, 0x0e, 395 | 0x24, 0x0f, 0xca, 0x0f, 0x09, 0x10, 0x7e, 0x10, 0x65, 0x10, 0xca, 0x10, 0x23, 0x10, 0x96, 0x10, 0x4a, 0x0f, 0xd7, 0x0f, 0xf8, 0x0d, 0x92, 0x0e, 0x56, 0x0c, 0xe0, 0x0c, 0x8a, 0x0a, 0xe7, 0x0a, 0xb5, 0x08, 0xd7, 0x08, 0xec, 0x06, 0xdf, 0x06, 0x40, 0x05, 0x22, 0x05, 0xc2, 0x03, 0xb7, 0x03, 0x8b, 0x02, 0xa9, 0x02, 0xb6, 0x01, 0xfe, 0x01, 0x53, 0x01, 0xaf, 0x01, 0x59, 0x01, 0xaa, 0x01, 0x9b, 0x01, 0xcb, 0x01, 0xd9, 0x01, 0xe7, 0x01, 0xd8, 0x01, 0xdc, 0x01, 0x82, 0x01, 0x9e, 0x01, 0xf0, 0x00, 0x42, 0x01, 0x5e, 0x00, 0xf3, 0x00, 0x0a, 0x00, 0xd4, 0x00, 0x09, 0x00, 0xeb, 0x00, 0x3b, 0x00, 0x17, 0x01, 0x58, 0x00, 0x21, 0x01, 0x20, 0x00, 0xe1, 0x00, 0x7d, 0xff, 0x54, 0x00, 0x99, 0xfe, 0xa6, 0xff, 0xc0, 0xfd, 0x18, 0xff, 0x33, 0xfd, 0xd3, 0xfe, 0x00, 0xfd, 0xcd, 0xfe, 396 | 0xf0, 0xfc, 0xc9, 0xfe, 0xae, 0xfc, 0x7b, 0xfe, 0xf7, 0xfb, 0xb5, 0xfd, 0xcc, 0xfa, 0x8e, 0xfc, 0x73, 0xf9, 0x57, 0xfb, 0x53, 0xf8, 0x75, 0xfa, 0xbd, 0xf7, 0x22, 0xfa, 0xb7, 0xf7, 0x4e, 0xfa, 0xfa, 0xf7, 0xa0, 0xfa, 0x10, 0xf8, 0xa3, 0xfa, 0x8d, 0xf7, 0xfe, 0xf9, 0x42, 0xf6, 0x98, 0xf8, 0x4b, 0xf4, 0xa0, 0xf6, 0xfa, 0xf1, 0x6b, 0xf4, 0xac, 0xef, 0x48, 0xf2, 0xa6, 0xed, 0x65, 0xf0, 0x07, 0xec, 0xcb, 0xee, 0xce, 0xea, 0x74, 0xed, 0xf2, 0xe9, 0x5e, 0xec, 0x6b, 0xe9, 0x98, 0xeb, 0x35, 0xe9, 0x36, 0xeb, 0x46, 0xe9, 0x37, 0xeb, 0x7e, 0xe9, 0x79, 0xeb, 0xae, 0xe9, 0xb5, 0xeb, 0x9a, 0xe9, 0x9a, 0xeb, 0x12, 0xe9, 0xe8, 0xea, 0xff, 0xe7, 0x8b, 0xe9, 0x6a, 0xe6, 0x9c, 0xe7, 0x79, 0xe4, 0x5b, 0xe5, 0x66, 0xe2, 0x14, 0xe3, 0x71, 0xe0, 0x08, 0xe1, 0xd0, 0xde, 0x62, 0xdf, 397 | 0xad, 0xdd, 0x32, 0xde, 0x18, 0xdd, 0x76, 0xdd, 0x09, 0xdd, 0x1e, 0xdd, 0x62, 0xdd, 0x18, 0xdd, 0xfe, 0xdd, 0x54, 0xdd, 0xb8, 0xde, 0xc6, 0xdd, 0x7f, 0xdf, 0x66, 0xde, 0x55, 0xe0, 0x32, 0xdf, 0x4b, 0xe1, 0x25, 0xe0, 0x75, 0xe2, 0x3c, 0xe1, 0xde, 0xe3, 0x74, 0xe2, 0x82, 0xe5, 0xce, 0xe3, 0x50, 0xe7, 0x48, 0xe5, 0x29, 0xe9, 0xdc, 0xe6, 0xe8, 0xea, 0x77, 0xe8, 0x5e, 0xec, 0xed, 0xe9, 0x5b, 0xed, 0xff, 0xea, 0xb1, 0xed, 0x67, 0xeb, 0x42, 0xed, 0xf4, 0xea, 0x12, 0xec, 0xa2, 0xe9, 0x48, 0xea, 0xa7, 0xe7, 0x32, 0xe8, 0x63, 0xe5, 0x29, 0xe6, 0x49, 0xe3, 0x83, 0xe4, 0xb8, 0xe1, 0x7b, 0xe3, 0xe3, 0xe0, 0x2c, 0xe3, 0xd1, 0xe0, 0x96, 0xe3, 0x6a, 0xe1, 0xa7, 0xe4, 0x8f, 0xe2, 0x43, 0xe6, 0x26, 0xe4, 0x41, 0xe8, 0x1a, 0xe6, 0x6d, 0xea, 0x4d, 0xe8, 0x8c, 0xec, 0x94, 0xea, 398 | 0x66, 0xee, 0xba, 0xec, 0xdd, 0xef, 0x91, 0xee, 0xfe, 0xf0, 0x0e, 0xf0, 0xfa, 0xf1, 0x4e, 0xf1, 0x0d, 0xf3, 0x88, 0xf2, 0x5e, 0xf4, 0xee, 0xf3, 0xe2, 0xf5, 0x8b, 0xf5, 0x59, 0xf7, 0x35, 0xf7, 0x6a, 0xf8, 0x9b, 0xf8, 0xd0, 0xf8, 0x72, 0xf9, 0x84, 0xf8, 0x9c, 0xf9, 0xc3, 0xf7, 0x3f, 0xf9, 0xfb, 0xf6, 0xbc, 0xf8, 0x99, 0xf6, 0x83, 0xf8, 0xdc, 0xf6, 0xe5, 0xf8, 0xc0, 0xf7, 0xf6, 0xf9, 0x09, 0xf9, 0x89, 0xfb, 0x66, 0xfa, 0x50, 0xfd, 0x9f, 0xfb, 0x00, 0xff, 0xa5, 0xfc, 0x73, 0x00, 0x8e, 0xfd, 0xac, 0x01, 0x78, 0xfe, 0xc5, 0x02, 0x6a, 0xff, 0xd0, 0x03, 0x47, 0x00, 0xc6, 0x04, 0xd5, 0x00, 0x83, 0x05, 0xdb, 0x00, 0xd6, 0x05, 0x47, 0x00, 0xa4, 0x05, 0x3c, 0xff, 0xfb, 0x04, 0x0e, 0xfe, 0x18, 0x04, 0x21, 0xfd, 0x55, 0x03, 0xc6, 0xfc, 0x03, 0x03, 0x13, 0xfd, 0x4d, 0x03, 399 | 0xe1, 0xfd, 0x25, 0x04, 0xdf, 0xfe, 0x47, 0x05, 0xb5, 0xff, 0x5c, 0x06, 0x29, 0x00, 0x1a, 0x07, 0x38, 0x00, 0x65, 0x07, 0x0d, 0x00, 0x58, 0x07, 0xec, 0xff, 0x31, 0x07, 0x0b, 0x00, 0x35, 0x07, 0x7b, 0x00, 0x89, 0x07, 0x20, 0x01, 0x28, 0x08, 0xc6, 0x01, 0xe5, 0x08, 0x3a, 0x02, 0x84, 0x09, 0x64, 0x02, 0xd9, 0x09, 0x4d, 0x02, 0xd6, 0x09, 0x14, 0x02, 0x8f, 0x09, 0xd9, 0x01, 0x28, 0x09, 0xa9, 0x01, 0xc2, 0x08, 0x7c, 0x01, 0x6d, 0x08, 0x44, 0x01, 0x28, 0x08, 0xfb, 0x00, 0xee, 0x07, 0xb7, 0x00, 0xc6, 0x07, 0xa5, 0x00, 0xc2, 0x07, 0xee, 0x00, 0xfe, 0x07, 0xa7, 0x01, 0x88, 0x08, 0xb8, 0x02, 0x56, 0x09, 0xda, 0x03, 0x3a, 0x0a, 0xb4, 0x04, 0xee, 0x0a, 0xf4, 0x04, 0x26, 0x0b, 0x6e, 0x04, 0xaf, 0x0a, 0x2d, 0x03, 0x7d, 0x09, 0x6c, 0x01, 0xb6, 0x07, 0x87, 0xff, 0xac, 0x05, 400 | 0xdc, 0xfd, 0xc1, 0x03, 0xb5, 0xfc, 0x53, 0x02, 0x39, 0xfc, 0xa1, 0x01, 0x6a, 0xfc, 0xb9, 0x01, 0x25, 0xfd, 0x79, 0x02, 0x32, 0xfe, 0x98, 0x03, 0x52, 0xff, 0xbe, 0x04, 0x43, 0x00, 0x9a, 0x05, 0xd4, 0x00, 0xf8, 0x05, 0xe4, 0x00, 0xc5, 0x05, 0x66, 0x00, 0x08, 0x05, 0x5f, 0xff, 0xdd, 0x03, 0xea, 0xfd, 0x63, 0x02, 0x32, 0xfc, 0xbd, 0x00, 0x71, 0xfa, 0x0d, 0xff, 0xe2, 0xf8, 0x7c, 0xfd, 0xbc, 0xf7, 0x34, 0xfc, 0x1c, 0xf7, 0x59, 0xfb, 0xfe, 0xf6, 0xfb, 0xfa, 0x3f, 0xf7, 0x0c, 0xfb, 0xa6, 0xf7, 0x63, 0xfb, 0xfc, 0xf7, 0xc5, 0xfb, 0x24, 0xf8, 0x03, 0xfc, 0x1f, 0xf8, 0x09, 0xfc, 0x0f, 0xf8, 0xe8, 0xfb, 0x22, 0xf8, 0xcc, 0xfb, 0x7e, 0xf8, 0xe9, 0xfb, 0x2e, 0xf9, 0x60, 0xfc, 0x1b, 0xfa, 0x2c, 0xfd, 0x11, 0xfb, 0x20, 0xfe, 0xd2, 0xfb, 0xf4, 0xfe, 0x24, 0xfc, 0x57, 0xff, 401 | }); err != nil { 402 | fmt.Println("Encode failed, err is", err) 403 | return 404 | } 405 | fmt.Println("AAC:", len(frame)) 406 | 407 | fmt.Println("Flushing") 408 | for { 409 | if frame, err = e.Flush(); err != nil { 410 | fmt.Println("Flush failed, err is", err) 411 | return 412 | } 413 | fmt.Println("AAC:", len(frame)) 414 | 415 | if frame == nil { 416 | break 417 | } 418 | } 419 | 420 | // Output: 421 | // FrameSize: 1024 422 | // AAC: 139 423 | // AAC: 225 424 | // Flushing 425 | // AAC: 191 426 | // AAC: 174 427 | // AAC: 0 428 | } 429 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | // Please use library. 2 | package main 3 | 4 | import ( 5 | _ "github.com/winlinvip/go-fdkaac/fdkaac" 6 | ) 7 | 8 | func main() { 9 | return 10 | } 11 | --------------------------------------------------------------------------------