libaudio-flac-decoder-perl-0.3+dfsg.orig/0000755000175000017500000000000011112626122017554 5ustar gregoagregoalibaudio-flac-decoder-perl-0.3+dfsg.orig/dither.c0000644000175000017500000001260211105675616021216 0ustar gregoagregoa/* plugin_common - Routines common to several plugins * Copyright (C) 2002,2003,2004 Josh Coalson * * dithering routine derived from (other GPLed source): * mad - MPEG audio decoder * Copyright (C) 2000-2001 Robert Leslie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "include/common.h" #include "include/dither.h" #include "FLAC/assert.h" /* 32-bit pseudo-random number generator * * @@@ According to Miroslav, this one is poor quality, the one from the * @@@ original replaygain code is much better */ static FLAC__INLINE FLAC__uint32 prng(FLAC__uint32 state) { return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL; } /* dither routine derived from MAD winamp plugin */ typedef struct { FLAC__int32 error[3]; FLAC__int32 random; } dither_state; static FLAC__INLINE FLAC__int32 linear_dither( unsigned source_bps, unsigned target_bps, FLAC__int32 sample, dither_state *dither, const FLAC__int32 MIN, const FLAC__int32 MAX) { unsigned scalebits; FLAC__int32 output, mask, random; FLAC__ASSERT(source_bps < 32); FLAC__ASSERT(target_bps <= 24); FLAC__ASSERT(target_bps <= source_bps); /* noise shape */ sample += dither->error[0] - dither->error[1] + dither->error[2]; dither->error[2] = dither->error[1]; dither->error[1] = dither->error[0] / 2; /* bias */ output = sample + (1L << (source_bps - target_bps - 1)); scalebits = source_bps - target_bps; mask = (1L << scalebits) - 1; /* dither */ random = (FLAC__int32)prng(dither->random); output += (random & mask) - (dither->random & mask); dither->random = random; /* clip */ if (output > MAX) { output = MAX; if (sample > MAX) { sample = MAX; } } else if (output < MIN) { output = MIN; if (sample < MIN) { sample = MIN; } } /* quantize */ output &= ~mask; /* error feedback */ dither->error[0] = sample - output; /* scale */ return output >> scalebits; } size_t pack_pcm_signed_big_endian(FLAC__byte *data, FLAC__int32 *input, unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps) { static dither_state dither[FLAC__MAX_SUPPORTED_CHANNELS]; FLAC__byte * const start = data; FLAC__int32 sample; unsigned samples, channel; const unsigned bytes_per_sample = target_bps / 8; const unsigned incr = bytes_per_sample * channels; const FLAC__int32 MIN = -(1L << (source_bps - 1)); const FLAC__int32 MAX = ~MIN; /*(1L << (source_bps-1)) - 1 */ FLAC__ASSERT(channels > 0 && channels <= FLAC__MAX_SUPPORTED_CHANNELS); FLAC__ASSERT(source_bps < 32); FLAC__ASSERT(target_bps <= 24); FLAC__ASSERT(target_bps <= source_bps); FLAC__ASSERT((source_bps & 7) == 0); FLAC__ASSERT((target_bps & 7) == 0); for (channel = 0; channel < channels; channel++) { samples = wide_samples; data = start + bytes_per_sample * channel; while (samples--) { if (source_bps != target_bps) { sample = linear_dither(source_bps, target_bps, *input++, &dither[channel], MIN, MAX); } else { sample = *input++; } switch (target_bps) { case 8: data[0] = sample ^ 0x80; break; case 16: data[0] = (FLAC__byte)(sample >> 8); data[1] = (FLAC__byte)sample; break; case 24: data[0] = (FLAC__byte)(sample >> 16); data[1] = (FLAC__byte)(sample >> 8); data[2] = (FLAC__byte)sample; break; } data += incr; } } return wide_samples * channels * (target_bps/8); } size_t pack_pcm_signed_little_endian(FLAC__byte *data, FLAC__int32 *input, unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps) { static dither_state dither[FLAC__MAX_SUPPORTED_CHANNELS]; FLAC__byte * const start = data; FLAC__int32 sample; unsigned samples, channel; const unsigned bytes_per_sample = target_bps / 8; const unsigned incr = bytes_per_sample * channels; const FLAC__int32 MIN = -(1L << (source_bps - 1)); const FLAC__int32 MAX = ~MIN; /*(1L << (source_bps-1)) - 1 */ FLAC__ASSERT(channels > 0 && channels <= FLAC__MAX_SUPPORTED_CHANNELS); FLAC__ASSERT(source_bps < 32); FLAC__ASSERT(target_bps <= 24); FLAC__ASSERT(target_bps <= source_bps); FLAC__ASSERT((source_bps & 7) == 0); FLAC__ASSERT((target_bps & 7) == 0); for (channel = 0; channel < channels; channel++) { samples = wide_samples; data = start + bytes_per_sample * channel; while (samples--) { if (source_bps != target_bps) { sample = linear_dither(source_bps, target_bps, *input++, &dither[channel], MIN, MAX); } else { sample = *input++; } switch(target_bps) { case 8: data[0] = sample ^ 0x80; break; case 24: data[2] = (FLAC__byte)(sample >> 16); /* fall through */ case 16: data[1] = (FLAC__byte)(sample >> 8); data[0] = (FLAC__byte)sample; } data += incr; } } return wide_samples * channels * (target_bps/8); } libaudio-flac-decoder-perl-0.3+dfsg.orig/typemap0000644000175000017500000000004311105675616021171 0ustar gregoagregoaFLAC__int64 T_IV FLAC__uint64 T_UV libaudio-flac-decoder-perl-0.3+dfsg.orig/replaygain_synthesis.c0000644000175000017500000004537011105675616024213 0ustar gregoagregoa/* replaygain_synthesis - Routines for applying ReplayGain to a signal * Copyright (C) 2002,2003,2004 Josh Coalson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * This is an aggregation of pieces of code from John Edwards' WaveGain * program. Mostly cosmetic changes were made; otherwise, the dithering * code is almost untouched and the gain processing was converted from * processing a whole file to processing chunks of samples. * * The original copyright notices for WaveGain's dither.c and wavegain.c * appear below: */ /* * (c) 2002 John Edwards * mostly lifted from work by Frank Klemm * random functions for dithering. */ /* * Copyright (C) 2002 John Edwards * Additional code by Magnus Holmgren and Gian-Carlo Pascutto */ #include /* for memset() */ #include /* #include "private/fast_float_math_hack.h" */ #include "include/common.h" #include "include/replaygain_synthesis.h" #include "FLAC/assert.h" /* * the following is based on parts of dither.c */ /* * This is a simple random number generator with good quality for audio purposes. * It consists of two polycounters with opposite rotation direction and different * periods. The periods are coprime, so the total period is the product of both. * * ------------------------------------------------------------------------------------------------- * +-> |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| * | ------------------------------------------------------------------------------------------------- * | | | | | | | * | +--+--+--+-XOR-+--------+ * | | * +--------------------------------------------------------------------------------------+ * * ------------------------------------------------------------------------------------------------- * |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| <-+ * ------------------------------------------------------------------------------------------------- | * | | | | | * +--+----XOR----+--+ | * | | * +----------------------------------------------------------------------------------------+ * * * The first has an period of 3*5*17*257*65537, the second of 7*47*73*178481, * which gives a period of 18.410.713.077.675.721.215. The result is the * XORed values of both generators. */ static unsigned int random_int_() { static const unsigned char parity_[256] = { 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0 }; static unsigned int r1_ = 1; static unsigned int r2_ = 1; unsigned int t1, t2, t3, t4; /* Parity calculation is done via table lookup, this is also available * on CPUs without parity, can be implemented in C and avoid unpredictable * jumps and slow rotate through the carry flag operations. */ t3 = t1 = r1_; t4 = t2 = r2_; t1 &= 0xF5; t2 >>= 25; t1 = parity_[t1]; t2 &= 0x63; t1 <<= 31; t2 = parity_[t2]; return (r1_ = (t3 >> 1) | t1 ) ^ (r2_ = (t4 + t4) | t2 ); } /* gives a equal distributed random number */ /* between -2^31*mult and +2^31*mult */ static double random_equi_(double mult) { return mult * (int) random_int_(); } /* gives a triangular distributed random number */ /* between -2^32*mult and +2^32*mult */ static double random_triangular_(double mult) { return mult * ( (double) (int) random_int_() + (double) (int) random_int_() ); } static const float F44_0 [16 + 32] = { (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0, (float)0 }; static const float F44_1 [16 + 32] = { /* SNR(w) = 4.843163 dB, SNR = -3.192134 dB */ (float) 0.85018292704024355931, (float) 0.29089597350995344721, (float)-0.05021866022121039450, (float)-0.23545456294599161833, (float)-0.58362726442227032096, (float)-0.67038978965193036429, (float)-0.38566861572833459221, (float)-0.15218663390367969967, (float)-0.02577543084864530676, (float) 0.14119295297688728127, (float) 0.22398848581628781612, (float) 0.15401727203382084116, (float) 0.05216161232906000929, (float)-0.00282237820999675451, (float)-0.03042794608323867363, (float)-0.03109780942998826024, (float) 0.85018292704024355931, (float) 0.29089597350995344721, (float)-0.05021866022121039450, (float)-0.23545456294599161833, (float)-0.58362726442227032096, (float)-0.67038978965193036429, (float)-0.38566861572833459221, (float)-0.15218663390367969967, (float)-0.02577543084864530676, (float) 0.14119295297688728127, (float) 0.22398848581628781612, (float) 0.15401727203382084116, (float) 0.05216161232906000929, (float)-0.00282237820999675451, (float)-0.03042794608323867363, (float)-0.03109780942998826024, (float) 0.85018292704024355931, (float) 0.29089597350995344721, (float)-0.05021866022121039450, (float)-0.23545456294599161833, (float)-0.58362726442227032096, (float)-0.67038978965193036429, (float)-0.38566861572833459221, (float)-0.15218663390367969967, (float)-0.02577543084864530676, (float) 0.14119295297688728127, (float) 0.22398848581628781612, (float) 0.15401727203382084116, (float) 0.05216161232906000929, (float)-0.00282237820999675451, (float)-0.03042794608323867363, (float)-0.03109780942998826024, }; static const float F44_2 [16 + 32] = { /* SNR(w) = 10.060213 dB, SNR = -12.766730 dB */ (float) 1.78827593892108555290, (float) 0.95508210637394326553, (float)-0.18447626783899924429, (float)-0.44198126506275016437, (float)-0.88404052492547413497, (float)-1.42218907262407452967, (float)-1.02037566838362314995, (float)-0.34861755756425577264, (float)-0.11490230170431934434, (float) 0.12498899339968611803, (float) 0.38065885268563131927, (float) 0.31883491321310506562, (float) 0.10486838686563442765, (float)-0.03105361685110374845, (float)-0.06450524884075370758, (float)-0.02939198261121969816, (float) 1.78827593892108555290, (float) 0.95508210637394326553, (float)-0.18447626783899924429, (float)-0.44198126506275016437, (float)-0.88404052492547413497, (float)-1.42218907262407452967, (float)-1.02037566838362314995, (float)-0.34861755756425577264, (float)-0.11490230170431934434, (float) 0.12498899339968611803, (float) 0.38065885268563131927, (float) 0.31883491321310506562, (float) 0.10486838686563442765, (float)-0.03105361685110374845, (float)-0.06450524884075370758, (float)-0.02939198261121969816, (float) 1.78827593892108555290, (float) 0.95508210637394326553, (float)-0.18447626783899924429, (float)-0.44198126506275016437, (float)-0.88404052492547413497, (float)-1.42218907262407452967, (float)-1.02037566838362314995, (float)-0.34861755756425577264, (float)-0.11490230170431934434, (float) 0.12498899339968611803, (float) 0.38065885268563131927, (float) 0.31883491321310506562, (float) 0.10486838686563442765, (float)-0.03105361685110374845, (float)-0.06450524884075370758, (float)-0.02939198261121969816, }; static const float F44_3 [16 + 32] = { /* SNR(w) = 15.382598 dB, SNR = -29.402334 dB */ (float) 2.89072132015058161445, (float) 2.68932810943698754106, (float) 0.21083359339410251227, (float)-0.98385073324997617515, (float)-1.11047823227097316719, (float)-2.18954076314139673147, (float)-2.36498032881953056225, (float)-0.95484132880101140785, (float)-0.23924057925542965158, (float)-0.13865235703915925642, (float) 0.43587843191057992846, (float) 0.65903257226026665927, (float) 0.24361815372443152787, (float)-0.00235974960154720097, (float) 0.01844166574603346289, (float) 0.01722945988740875099, (float) 2.89072132015058161445, (float) 2.68932810943698754106, (float) 0.21083359339410251227, (float)-0.98385073324997617515, (float)-1.11047823227097316719, (float)-2.18954076314139673147, (float)-2.36498032881953056225, (float)-0.95484132880101140785, (float)-0.23924057925542965158, (float)-0.13865235703915925642, (float) 0.43587843191057992846, (float) 0.65903257226026665927, (float) 0.24361815372443152787, (float)-0.00235974960154720097, (float) 0.01844166574603346289, (float) 0.01722945988740875099, (float) 2.89072132015058161445, (float) 2.68932810943698754106, (float) 0.21083359339410251227, (float)-0.98385073324997617515, (float)-1.11047823227097316719, (float)-2.18954076314139673147, (float)-2.36498032881953056225, (float)-0.95484132880101140785, (float)-0.23924057925542965158, (float)-0.13865235703915925642, (float) 0.43587843191057992846, (float) 0.65903257226026665927, (float) 0.24361815372443152787, (float)-0.00235974960154720097, (float) 0.01844166574603346289, (float) 0.01722945988740875099 }; static double scalar16_(const float* x, const float* y) { return x[ 0]*y[ 0] + x[ 1]*y[ 1] + x[ 2]*y[ 2] + x[ 3]*y[ 3] + x[ 4]*y[ 4] + x[ 5]*y[ 5] + x[ 6]*y[ 6] + x[ 7]*y[ 7] + x[ 8]*y[ 8] + x[ 9]*y[ 9] + x[10]*y[10] + x[11]*y[11] + x[12]*y[12] + x[13]*y[13] + x[14]*y[14] + x[15]*y[15]; } void FLAC__replaygain_synthesis__init_dither_context(DitherContext *d, int bits, int shapingtype) { static unsigned char default_dither [] = { 92, 92, 88, 84, 81, 78, 74, 67, 0, 0 }; static const float* F [] = { F44_0, F44_1, F44_2, F44_3 }; int index; if (shapingtype < 0) shapingtype = 0; if (shapingtype > 3) shapingtype = 3; d->ShapingType = (NoiseShaping)shapingtype; index = bits - 11 - shapingtype; if (index < 0) index = 0; if (index > 9) index = 9; memset ( d->ErrorHistory , 0, sizeof (d->ErrorHistory ) ); memset ( d->DitherHistory, 0, sizeof (d->DitherHistory) ); d->FilterCoeff = F [shapingtype]; d->Mask = ((FLAC__uint64)-1) << (32 - bits); d->Add = 0.5 * ((1L << (32 - bits)) - 1); d->Dither = 0.01f*default_dither[index] / (((FLAC__int64)1) << bits); d->LastHistoryIndex = 0; } /* * the following is based on parts of wavegain.c */ static FLAC__INLINE FLAC__int64 dither_output_(DitherContext *d, FLAC__bool do_dithering, int shapingtype, int i, double Sum, int k) { double doubletmp, Sum2; FLAC__int64 val; #define ROUND64(x) ( doubletmp = (x) + d->Add + (FLAC__int64)0x001FFFFD80000000L, *(FLAC__int64*)(&doubletmp) - (FLAC__int64)0x433FFFFD80000000L ) if(do_dithering) { if(shapingtype == 0) { double tmp = random_equi_(d->Dither); Sum2 = tmp - d->LastRandomNumber [k]; d->LastRandomNumber [k] = (int)tmp; Sum2 = Sum += Sum2; val = ROUND64(Sum2) & d->Mask; } else { Sum2 = random_triangular_(d->Dither) - scalar16_(d->DitherHistory[k], d->FilterCoeff + i); Sum += d->DitherHistory [k] [(-1-i)&15] = (float)Sum2; Sum2 = Sum + scalar16_(d->ErrorHistory [k], d->FilterCoeff + i); val = ROUND64(Sum2) & d->Mask; d->ErrorHistory [k] [(-1-i)&15] = (float)(Sum - val); } return val; } else return ROUND64(Sum); #undef ROUND64 } #if 0 float peak = 0.f, new_peak, factor_clip double scale, dB; ... peak is in the range -32768.0 .. 32767.0 /* calculate factors for ReplayGain and ClippingPrevention */ *track_gain = GetTitleGain() + settings->man_gain; scale = (float) pow(10., *track_gain * 0.05); if(settings->clip_prev) { factor_clip = (float) (32767./( peak + 1)); if(scale < factor_clip) factor_clip = 1.f; else factor_clip /= scale; scale *= factor_clip; } new_peak = (float) peak * scale; dB = 20. * log10(scale); *track_gain = (float) dB; const double scale = (float) pow(10., (double)gain * 0.05); /*@@@@ why downcast pow() output to float? */ #endif size_t FLAC__replaygain_synthesis__apply_gain(FLAC__byte *data_out, FLAC__bool little_endian_data_out, FLAC__bool unsigned_data_out, const FLAC__int32 * const input[], unsigned wide_samples, unsigned channels, const unsigned source_bps, const unsigned target_bps, const double scale, const FLAC__bool hard_limit, FLAC__bool do_dithering, DitherContext *dither_context) { static const FLAC__int32 conv_factors_[33] = { -1, /* 0 bits-per-sample (not supported) */ -1, /* 1 bits-per-sample (not supported) */ -1, /* 2 bits-per-sample (not supported) */ -1, /* 3 bits-per-sample (not supported) */ 268435456, /* 4 bits-per-sample */ 134217728, /* 5 bits-per-sample */ 67108864, /* 6 bits-per-sample */ 33554432, /* 7 bits-per-sample */ 16777216, /* 8 bits-per-sample */ 8388608, /* 9 bits-per-sample */ 4194304, /* 10 bits-per-sample */ 2097152, /* 11 bits-per-sample */ 1048576, /* 12 bits-per-sample */ 524288, /* 13 bits-per-sample */ 262144, /* 14 bits-per-sample */ 131072, /* 15 bits-per-sample */ 65536, /* 16 bits-per-sample */ 32768, /* 17 bits-per-sample */ 16384, /* 18 bits-per-sample */ 8192, /* 19 bits-per-sample */ 4096, /* 20 bits-per-sample */ 2048, /* 21 bits-per-sample */ 1024, /* 22 bits-per-sample */ 512, /* 23 bits-per-sample */ 256, /* 24 bits-per-sample */ 128, /* 25 bits-per-sample */ 64, /* 26 bits-per-sample */ 32, /* 27 bits-per-sample */ 16, /* 28 bits-per-sample */ 8, /* 29 bits-per-sample */ 4, /* 30 bits-per-sample */ 2, /* 31 bits-per-sample */ 1 /* 32 bits-per-sample */ }; static const FLAC__int64 hard_clip_factors_[33] = { 0, /* 0 bits-per-sample (not supported) */ 0, /* 1 bits-per-sample (not supported) */ 0, /* 2 bits-per-sample (not supported) */ 0, /* 3 bits-per-sample (not supported) */ -8, /* 4 bits-per-sample */ -16, /* 5 bits-per-sample */ -32, /* 6 bits-per-sample */ -64, /* 7 bits-per-sample */ -128, /* 8 bits-per-sample */ -256, /* 9 bits-per-sample */ -512, /* 10 bits-per-sample */ -1024, /* 11 bits-per-sample */ -2048, /* 12 bits-per-sample */ -4096, /* 13 bits-per-sample */ -8192, /* 14 bits-per-sample */ -16384, /* 15 bits-per-sample */ -32768, /* 16 bits-per-sample */ -65536, /* 17 bits-per-sample */ -131072, /* 18 bits-per-sample */ -262144, /* 19 bits-per-sample */ -524288, /* 20 bits-per-sample */ -1048576, /* 21 bits-per-sample */ -2097152, /* 22 bits-per-sample */ -4194304, /* 23 bits-per-sample */ -8388608, /* 24 bits-per-sample */ -16777216, /* 25 bits-per-sample */ -33554432, /* 26 bits-per-sample */ -67108864, /* 27 bits-per-sample */ -134217728, /* 28 bits-per-sample */ -268435456, /* 29 bits-per-sample */ -536870912, /* 30 bits-per-sample */ -1073741824, /* 31 bits-per-sample */ (FLAC__int64)(-1073741824) * 2 /* 32 bits-per-sample */ }; const FLAC__int32 conv_factor = conv_factors_[target_bps]; const FLAC__int64 hard_clip_factor = hard_clip_factors_[target_bps]; /* * The integer input coming in has a varying range based on the * source_bps. We want to normalize it to [-1.0, 1.0) so instead * of doing two multiplies on each sample, we just multiple * 'scale' by 1/(2^(source_bps-1)) */ const double multi_scale = scale / (double)(1u << (source_bps-1)); FLAC__byte * const start = data_out; unsigned i, channel; const FLAC__int32 *input_; double sample; const unsigned bytes_per_sample = target_bps / 8; const unsigned last_history_index = dither_context->LastHistoryIndex; NoiseShaping noise_shaping = dither_context->ShapingType; FLAC__int64 val64; FLAC__int32 val32; FLAC__int32 uval32; const FLAC__uint32 twiggle = 1u << (target_bps - 1); FLAC__ASSERT(channels > 0 && channels <= FLAC_SHARE__MAX_SUPPORTED_CHANNELS); FLAC__ASSERT(source_bps >= 4); FLAC__ASSERT(target_bps >= 4); FLAC__ASSERT(source_bps <= 32); FLAC__ASSERT(target_bps < 32); FLAC__ASSERT((target_bps & 7) == 0); for(channel = 0; channel < channels; channel++) { const unsigned incr = bytes_per_sample * channels; data_out = start + bytes_per_sample * channel; input_ = input[channel]; for(i = 0; i < wide_samples; i++, data_out += incr) { sample = (double)input_[i] * multi_scale; if(hard_limit) { /* hard 6dB limiting */ if(sample < -0.5) sample = tanh((sample + 0.5) / (1-0.5)) * (1-0.5) - 0.5; else if(sample > 0.5) sample = tanh((sample - 0.5) / (1-0.5)) * (1-0.5) + 0.5; } sample *= 2147483647.f; val64 = dither_output_(dither_context, do_dithering, noise_shaping, (i + last_history_index) % 32, sample, channel) / conv_factor; val32 = (FLAC__int32)val64; if(val64 >= -hard_clip_factor) val32 = (FLAC__int32)(-(hard_clip_factor+1)); else if(val64 < hard_clip_factor) val32 = (FLAC__int32)hard_clip_factor; uval32 = (FLAC__uint32)val32; if (unsigned_data_out) uval32 ^= twiggle; if (little_endian_data_out) { switch(target_bps) { case 24: data_out[2] = (FLAC__byte)(uval32 >> 16); /* fall through */ case 16: data_out[1] = (FLAC__byte)(uval32 >> 8); /* fall through */ case 8: data_out[0] = (FLAC__byte)uval32; break; } } else { switch(target_bps) { case 24: data_out[0] = (FLAC__byte)(uval32 >> 16); data_out[1] = (FLAC__byte)(uval32 >> 8); data_out[2] = (FLAC__byte)uval32; break; case 16: data_out[0] = (FLAC__byte)(uval32 >> 8); data_out[1] = (FLAC__byte)uval32; break; case 8: data_out[0] = (FLAC__byte)uval32; break; } } } } dither_context->LastHistoryIndex = (last_history_index + wide_samples) % 32; return wide_samples * channels * (target_bps/8); } libaudio-flac-decoder-perl-0.3+dfsg.orig/Makefile.PL0000644000175000017500000000127311105675616021547 0ustar gregoagregoause ExtUtils::MakeMaker; use Config; $LDDLFLAGS = ''; $LDDLFLAGS = '-all_load' if $^O eq 'darwin'; $LDDLFLAGS = '-L/usr/pkg/lib' if $^O eq 'netbsd'; if ($^O =~ /win32/i) { $LIBS = '-lFLAC_static'; } else { $LIBS = '-lFLAC'; } WriteMakefile( 'NAME' => 'Audio::FLAC::Decoder', 'VERSION_FROM' => 'Decoder.pm', 'LIBS' => [$LIBS], 'DEFINE' => '-O', 'LDDLFLAGS' => "$Config{'lddlflags'} $LDDLFLAGS", MYEXTLIB => 'libflacsupport$(LIB_EXT)', ); sub MY::postamble { if ($^O =~ /win32/i) { return '$(MYEXTLIB): $(O_FILES) $(AR) -nologo -out:$(MYEXTLIB) $(O_FILES) $(RANLIB) $@'; } else { return '$(MYEXTLIB): $(MYEXTLIB)($(O_FILES)) $(AR) cr $@ $? $(RANLIB) $@'; } } libaudio-flac-decoder-perl-0.3+dfsg.orig/TODO0000644000175000017500000000011311105675616020255 0ustar gregoagregoa * Add replay gain support. * Skip & Until * Seeking - time_tell(), etc. libaudio-flac-decoder-perl-0.3+dfsg.orig/Decoder.pm0000644000175000017500000000560111112625651021467 0ustar gregoagregoapackage Audio::FLAC::Decoder; use strict; use vars qw($VERSION); $VERSION = '0.3'; BOOT_XS: { # If I inherit DynaLoader then I inherit AutoLoader require DynaLoader; # DynaLoader calls dl_load_flags as a static method. *dl_load_flags = DynaLoader->can('dl_load_flags'); do {__PACKAGE__->can('bootstrap') || \&DynaLoader::bootstrap}->(__PACKAGE__,$VERSION); } 1; __END__ =head1 NAME Audio::FLAC::Decoder - An object-oriented FLAC decoder =head1 SYNOPSIS use Audio::FLAC::Decoder; my $decoder = Audio::FLAC::Decoder->open("song.flac"); my $buffer; while ((my $len = $decoder->sysread($buffer) > 0) { # do something with the PCM stream } OR open FLAC, "song.flac" or die $!; my $decoder = Audio::FLAC::Decoder->open(\*FLAC); OR # can also be IO::Socket or any other IO::Handle subclass. my $fh = IO::Handle->new("song.flac"); my $decoder = Audio::FLAC::Decoder->open($fh); =head1 DESCRIPTION This module provides users with Decoder objects for FLAC files. One can read data in PCM format from the stream, seek by pcm samples, or time. =head1 CONSTRUCTOR =head2 C Opens an FLAC file for decoding. It opens a handle to the file or uses an existing handle and initializes all of the internal FLAC decoding structures. Note that the object will maintain open file descriptors until the object is collected by the garbage handler. Returns C on failure. =head1 INSTANCE METHODS =head2 C Reads PCM data from the FLAC stream into C<$buffer>. Returns the number of bytes read, 0 when it reaches the end of the stream, or a value less than 0 on error. The optional size can specify how many bytes to read. =head2 C Seeks through the compressed bitstream to the offset specified by C<$pos> in raw bytes. Returns 0 on success. =head2 C Seeks through the bitstream to the offset specified by C<$pos> in pcm samples. Returns 0 on success. =head2 C Seeks through the bitstream to the offset specified by C<$pos> in seconds. Returns 0 on success. =head2 C Returns the average bitrate for the specified logical bitstream. If C<$stream> is left out or set to -1, the average bitrate for the entire stream will be reported. =head2 C Returns the total number of seconds in the bitstream. =head2 C Returns the current offset in bytes. =head2 C Returns the current offset in seconds. - NOT YET IMPLEMENTED =head1 REQUIRES libFLAC =head1 COPYRIGHT Copyright (c) 2004-2008, Dan Sully. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. =head1 SEE ALSO L =cut libaudio-flac-decoder-perl-0.3+dfsg.orig/Changes0000644000175000017500000000042211112625732021053 0ustar gregoagregoaRevision history for Perl extension Audio::FLAC::Decoder. 0.3 Mon Nov 24 14:33:34 PST 2008 * Patch from Mark Glines to update to the latest FLAC version. 0.01 Fri Jan 3 17:33:52 2003 - original version; created by h2xs 1.21 with options -XA -n Audio::FLAC::Decoder libaudio-flac-decoder-perl-0.3+dfsg.orig/META.yml0000664000175000017500000000046311112626122021032 0ustar gregoagregoa# http://module-build.sourceforge.net/META-spec.html #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: Audio-FLAC-Decoder version: 0.3 version_from: Decoder.pm installdirs: site requires: distribution_type: module generated_by: ExtUtils::MakeMaker version 6.30_01 libaudio-flac-decoder-perl-0.3+dfsg.orig/t/0000755000175000017500000000000011112626122020017 5ustar gregoagregoalibaudio-flac-decoder-perl-0.3+dfsg.orig/t/pod.t0000644000175000017500000000021411105675616021001 0ustar gregoagregoa#!perl -T use Test::More; eval "use Test::Pod 1.14"; plan skip_all => "Test::Pod 1.14 required for testing POD" if $@; all_pod_files_ok(); libaudio-flac-decoder-perl-0.3+dfsg.orig/t/test.flac0000644000175000017500000042624511273361611021651 0ustar gregoagregoafLaC" b`KN<,(p'jA$01( reference libFLAC 1.2.1 20070917 @ '^ < 4@ 9(X ,` H `_@L9/#O,J+gA܂M(1j*w"WS(ڹ)샄oWWn,|ϑ:"YT!\˅~5褓ID Mqe-S4b^7U[ )g`#dU;#!܎1RRSE2vg'cm'Řo*Եz ګ%]gT1b)<#jNYtiI{ FjxMa C.nMVǖ.I(GgYՙ #)N>J1I( &aARu%SJ]" e-\g)QxAyOSQBMv6#L7eXqc8٭dM!Cj LMNa/O\*J3_P5$]+.N>HۅUbN>yÄN` ͆şvZ1GÕ#k>u6j!>IK4Av:Dl9-S1_4iQ.AHGDVL_,E�n#davp+yg%RN&2:B^Y:T2CaN0% JfzZXm*cgx[_pB0Zao wuSH\L; :Э!zx %.lȆaqE[- io7Q74Ptn6rQBjcqϮ; f')0ic w*Wqv&N<6m)xRc2Xc5&"WcQKUbb21oɢ1ee%m݊;FɆ$qEtmM132">ͫ U.[ IZb8g%ncSZA85_)uQD"㠍l|Z.MAeR)1ҡ v#I .^R|QPil&#A;sh̪}&a\(!7)򵷦qج vBIAuVq#8CXV#؉Z_OqyE]B@ЦSf#It%rN8R?n%*\JHS`bFdS"L7B*L15]]Di)SI/H_; ARg#H!d&8za&]i3򨗪Y@ݘIPs1͉lY,3"h(확%dN /2 ™l+jz̤,$&"}d.V()ˇ>Ml. (kv^膧\U V!K0۽E|qt)+Z뿶9J.\y+K kZN6fՅ1HH phRT.d[>o1/6iH* T>nQSD>"1Ysa!-t'LMgByr╔1D—KK nRr' !˺qltLظ6me.Iˌ_Lf>SqG]PاN`\gE$fr)/_n|`f![0ElO*ں*Ʋa-Qwdsʛe`f@d^|Oio fsmѓ#Ph\ovl!qed-%2;;)^(- KY 3rQt蟋!)JͷW'SꄙR`0L!3tT~M,.J}I1sNOS|=&,YM쌾N) P-V${&ާ)}꥜(.J,8ł-,aKkSK̥~ɘ3૥rZ3aK* k)ldNqҮQ]򔔑 hD|ˢW;H eQF",;y Zbg m}Q:bfi"& Sf %daތ&g6ǗcDߒdLM"Slqj"JY"; Bz3i7d=O\\35/af% oKSw KqYTA Do[UTұ|a bJ}Ye.0I4Wey 2-mMH|.j @UD{UAG 2 Kt)ȨTPȬ e*I"n$ʈmSZZ޺D̻! CC_!?֜RW4b($tb꬗jHmeKfS?6A3~C !kKt͑v<)+1飈[v90<@[21T$gc[pCȉ(ryG? "ؙ.sXqrTW\C =ED1)LP {ُǜ2 ^$¢ca1XȩLGQLʦ?kym,uuC$u $e%aEyf6FŏG^K\!rΌq- D&Q6UZK ^W.HA8hkO"j$Aԛ3"D=Υ ҫQ_qYTOa]H%6;Ҫ3DW$LSD%>&CbJ CisM͙at4z [9dT>ZE<]ą"bdM!ƽcHA$ۦ-㦨w/ z-Ϭ<Ž0#[03!M0n|Q.qRU\Qz :F:%eMU`iDJ3}Ί͔c:0).)Mai+%ُe<"VTNT {m'FHNlRR]UKPS>GŽ:T1t(ISPK5q .*^ƶd eT[abRb煱RQxyQ [VN1rجaB"fN;@]qL1+RԹ**ʕF,|DV_4*oݑ7QD4"ʹ8-ˉL %' iXLwǕ'N5QϠxQv_0NGU5+<qf]$&h.^q]_#apš<5F1vs\RS MtE,$(wuP~l]L2uQPIKLއ Fe&YTL(`J5zpl"gIB vJ(MMCqEA?@𸀧XytPAO V9lIQE&X)i#fI(iV݇ӡt)C=l=M-J{B$G1H#׎9w HK Bܷs'Ve~7qnʋ755UkHrO@X6ryø:{r8- nШ*%f=ʉy(xk HٙZ()ix(j(8hy+3YEAVNb[#lI)i\ɢBV3Qui?I֪S$.[4$x-)[gnXX~m;B!D &ĉl_APMq5!V̛2鴞_[f1_|Z>C,H%2]<`JXb瞑%ոr fI{n*[']e6[,591@ 26IcE:bܱl~S'RuI;YA'd2􌁲8DBl[ݟ$B}0+x*˟?΂ WjlWڅ!xhINyD@@m e-V 6&gfuΉƧ.ʽW0B'ĉI7q@)tPDYHyˠ䈢JL|"*iZMB:>e29jj|(~|.vŸp0LC&BZ0s əP<7/1h`]JM'Y) !T',4ɂy$0cAx`M;h_?9w{KTG҉3zE[nS<[Dߕ!͐p]4ų'rgG(Z1!+.3J* {U_#yfX@E¬(Dyރ@hX9蝐znydiX ёuә,̱ԁS'M@˿Ў:ݚ a2HY[nF'Nd' GH}EHgel^W4 v}u\~^IQz~C7 V#4yF**,3{ ZJ%ƯCWQS!]a ؐ)ԌMiZQѵ/ v'M/4Q絑L0q~6iqx%Ime.'I?hsdi4NBOS4~Cbi\"]!H ac3 $dD2|MFe&jJ1\8B9Ǔ%, V:"2v\O|.&cĄg|/T<ˣz9}e4U5wf],fXE:mIQ!A7,cZ0%5hcQhR }158q@}ydcjb(I ԯkk_ޥHvrQYggKss{`r,LKs~W(F`]䤇=(JT0> ! nYdۍ`"U֢YR* 33o$"H+ޑ> QqwHǙO|ʗ&ep2y% ]ұmKƑJH帋΍yvW4A>lISx0t-yaa2s7dDn\tE2D#1,"!l9Z4gQ00K!Uv5]ba9'"6yŚڛޛ"& 6bKDjzM?Q;!+ ,aI+! `0ɿwl,)l2T.v8N0yc_Bk|3*_! $&G`JsCW|m24HʲrCd&l 7 25/TˢkhzaAZA-I#*X3~֋:4&, fOM*ZwZf9?u *fmVBJCbfw^jKf(h_kOdqO ӘEFVKqN\wF.#vH`P;<8D=|IJE v'.L-CY3x;`{iBĈR*0#0,Q6b+tivV5l~k6XL쪼f'"I& F>5,w9mw{(N癨T޹ce02T7,;n"f Lkڐ!AѐryaVkSx~,ׯw:E2Z%3,_S:=uF6naY?'*D"GSc%TE9#h"e> #L%PNgTu<izY\{ 3VPSmNU2זFUjb0>9kX?-7L^/|)CScr/-րQKz%/[dć1}5n%nSK6%:VS_hGāI\l'""R!Rw80bG'́ÍGb/>r$:%dss{I r?|^\ִMfBX~Q"H89)U&/ӪoZ_dį-rBbԠ9̧ycAMh$Ȅ,?+cwdqN qwl*!@b1Ts|]^GWS d4X55 N[ "ӡHإI*vDR@zݵUBi>AMqt^P=6 -Q%^*izWpaG[K]J7'>MfGWߊk"LTjh%ȡj`:[XF'wad*TRUόY(ZӠiђ$epAE}?%lj4%CݑE_'']8aT,s%n'1VPIUHTBIB}z>CTHhF)2|z\N3ӡ0Kf2 c_UMj*Fլ+U&}4;(@uvZ0;m(^$cFɦHw)\Qʬ5n͸|AԣO2GtA3ȁiëd)EE"|0Ո49)bRwc#JlqMQs!;@0$Eɠ>sR䜧x:mAnRH0ݡG:J?`Fc@X $N8)Rj"Hj??n:;UU,d %"΃ڞ$y=k{y-5mk 6(Eb/EX#Irk? AV<핬U䝗(V&-.?> GM()oAjDN30Fڦ?vekT>Ih3:a-cA(xMdAG7s+w("3e[bx֑0B8JN7;I ^ΎRHIh3gx" .tLo?:]6AkTquE9|sԃ'䎞h=P2SV}wxG#IZ#drL;Q&3&YZIdmƳlDz4`!p T[:њT^# KIBBIq >G ^(G}rLx`mOTYh`:zm-@/_!OA5K:z̷K< *HT&e<`?m5h*aRl/G%b|BLxI)l, ZhOOH}"[t3l!|; {: Grk}--n0\B@kAOdT>ツcdd7D!UǮϝEԷ4s#^ i@%- )zܡC4H0)I\0 Qj0S A˞C]haݷ+*E9  x-77I' P*lUɈ-(jqru#1x crPb*JT`uӠc9ݒ!R#U>YC z d@~ahq+8@!rPd"݁}՘A' gj rrzT UAңMr,Bڱ(i> iQhlu6ͣ?/Nq-QZY]PvbB@-K̰~<&2^QVO $y% R'jYeBhB!2YMV?q aQB|CQ@Wxtu?Eg&.k'&Ė;$؂lT@>IRO/~餣rKCR[ =s~pk*5 $h0g@Ó8¿6DWa$ e wa@^gT 30#V)rG0eZ`Bh:ŸQeTlɧI B6m`dK% |5 ObxJ 4}$^IsAmvs^6:=Ihd,R쉇b5|%Ƽ&yHPԏ)y^ 6/ N{>aN5:Ak%eyE4MKA4N 2 )MzrfG 2B$/)W12dad>raykF I %ve c8h,a}bܣ`A# ϟFHOg\06stB `CMC1kw%"β7a}2xC:~ UX\Xo9(Z'B︆:I7(~h2{ZFR,ҩ"H{|}0}=Q1jz@D'z` :7n r'W1^1*d*$8CZuSElOj|u.ʰ²FTg5IՒf)ǖ<ʰ[Eju_ױ WJ,R9+/WD)!XMPں?(NZ i#<]M ,;7{E$keXfGSJj=tbVPDKVfO U% ,!6 0$@C-|K 1~HƏpJ PS* UxSC,4Wqq(1h 8t%3ԇܯS.>?@ǒ:j\\ p?NDR = `yɰJ+>*Q r$c<% "~t(Yqr( ?u4A+RW\1x+Me\m]Z!ҮBФ,"$k dD j N0_W∔Reh;V*i~ؔ\c<\e(Eɚ 4vEbFPeIp] 9Wٻ'|Dn5i@(Y Vs Q -rK/ʅjQF(ߌ4o?vqE W ӷJƸ&j Ҍ̭1>(x>1-x6}alUmtldx )E_.|_%~jڵg3j|TdX\ T=&1^&À`*AzA>#lj;a.7M@1'1zc5g{ȇ (8W&[QsE 'ga̔ =bifk!E|a%xW@pyjbQ:YACVq".NP Ʃ>G*D1~`΋ymIJ1'IİHˮggx_MzEk0{%j- X^ja> 4ui(ENg6Ǹ]DC7U MJ"XJ!F|fVl=yMS1 $c٥"]o \9TrCns/zB9-*(, 9xD8#i6*;*{|pPъe]2J<2Ic:u !v N[55U9,O-S۵6yУ}*YM%R{a%b~j"GΥP5 %@F*Ґ!WtNӧ=3Cjȣg&H.L!uۡz=췕+! A,πIB+ >`gM@B%gZI\rDOU+n UI ,nv)%P(UyO/&Xn+Ous碌x/11Eѥ8в&[< <, NQ?b(Ixa!(JIf J&-}Fp@-fkCHYR\+6ND^Y\ #SCj 4, 9'o󒄍3ONτFF vZ-t55}NUPNS͖ӭaddsRf/Ho>asx"rY|{ht;VF8ghU-,& al1?nAOqݫ((L՟BPgl% 'urC8Fl %E**]eKh7oX` 2|X3Ogy+/mӕ~rUHp%M=RV}/kxгsR."<$~V93o@ôC5s'HT1"Jvm3'}rET FW@Ւ*zGG:bUv̶92"Ra%H$mB@}*Z !25FD D1A3t/;-l ONl)A0!D80DqA/-V(d/Z3-hLv 8BNeR_nH"jpf_SxWH*(Nݑ?$5VvbP4\İ h`J8Zg=Q$:BlnSd!9y"{"q/jCU\hF sX1%wgnVv cpI ]Av9 ;CpB,U% m$MDƫE`ؠa%`f4%TjSәXa6o+n" 經_^jj 6l`6RĜ'%ͥdU-02OS EYUewU{ϟcEcLgL5Z; @ԷZW|"Q'Pѡ'BE>T5a/y>YN!v=0(1&+~+ bUQV bYVb< /MN"Vdԉav"f(pz'@Z"ߚv"ɓ+k ΤCp"O> s+[e/Mf܃#%zHO>J!Ȇ뵊Ad4LH[n⩾(Bl+j8f2 ]i-f2O~P+%B&MǤ'f!]ǰJӞllԞ<ޚ/=8 g@rJeqsO!72WchU-fee2W$+g`[t"Xw(iʮ _NR]"+3)Y=vٰp5͆[L ArAuhA B8ĒT!SvK5IZ(903S$dtZLχ?GfڢʘWڽ8-'ɜ9nQuT+ɰQy7n~|VxiyF󞘑ZD#A#~ȋdI?.piK% 3aW"& # SGhd̨y>엫$Cle'u' 8.洗)&-e]hفx: zi`A2]W4•a߉l}#c\o>F3.*Hգ[6ODOiw@K͕5?4(3e3hE*fJS/?D~mF a ?[SD+nDJT|/ʕ/Rĺtnz[h'kN) cT!ufKH},T%X{RU4W/yV{Du'eENgLZ-u_c1w9U T+Kpf$R >j{ʉ%%kF Y­Mq[E$ٙ ݭC٣KcI:R XB`Elv%1x*`+% F\VR>q-E}^l+Ъ(\ [6^d%inOܛZ!5HmsX.'!duhX-kФnyT&5/uJuܓD5pTSe<)LPu%08L1E1jZKĞi]0C'aQD\adp9T.f?(^0\5M O!V@ՉY3MMjkg6HAʛ)qx+%'i7, & j z ,K̔ LN<  nLg:.Jo*\*n@!uO|+ &`HYL!W$\멶VldqCI92v!,` o֞6#G!&tbʱP-Ĭ~M ԓ?Ыc;Dw7p17S]νKKVRWy~gAy~ fĸY̚hU}.)[ہ]2\}Vݩ$kSH|Sx)R˕jMTlj ͕e:(#" <FLr5V'&yT )KӅ3r1|]B.Xj Kڦde{|9⬍~Z&qd̼߰NH^R<Ҷ?Q06pKa bOcz0MzS_ZKxd&b\1OfKЭX*TzEHc?-?P&F0 .\O4J9gKX{|-\0{SUW~{}WVHp6ن{sʓiuS*G١RE6ˡ<~`ؒHK55x{R퐱$\ZwGr)b^Ju۔fkAmOяOd[?m^b-!4m@7LIo:sf߮$7)fh=NrHg'crCGq5 `A rX J쵙˧{:je#!,Ƣ`[{} ]^bNC"K}q^_Rߚh?yyCB%G& 0c.`YʊЮ9y;&o-M!$_NҿA.eLƑl9&PL +HQXa £?0O鵹Lf ϴkQ_rQL /jFmb$׬ ]= KjuK L]wenG(mvsΪtii`Kz2`ªՕ$aqkdS#u%Lr~^YN#FM>sKW@&7LjV}OP̗Y7]|!'3jyVms\2 I!cZJֽۊ J.YmVr8IЏ+XN BJ-,Ėf;{R2{qєCeG @/̈Ko0%1($4<;4%?ǩ -}S8PX%%U .,PA '[mچ5К]N?_ (E1ɊCÔ}u񾩼ut46tl"؆֜oa6FȧbP&$ɑ$.9;gU1p:<^qʨa&Gl r8L 7p !ংjREx)q"-6.'aHVGhJ\$!?Y,A_ P?ZBDj=m0P{.!+*:I9/Чra>N=E#& 3daAFT&r:!#>jFxTa5LPmU,D(QG"~lmƻ11__ЬL8qb~f4%]fHwwLelbm|ծ#u3dDR^ܓeBbE&ӣD67F#4&y]ڸFWBzN1hagjbwϏ1A69JB|&hY<ĂqC7+ts~bNjL繴W@*(6M$#J!+2Z:6fsLrfK#x7Ix6ŘQ?wE +jr1OXѥmX }jb0l qbhL[[Q jW+&܄z)@.B<QTW4)y]w28YfNQcXg]!0M#6-85̲p3q];\9lW]I Ah!6)r?3٦a ̍Õe]RʵM޸Ml]bu=&Re϶q\j>ŌSǗK"0(L&2ULw P: J4nWVN"vq2Y\dW0QRznyB%Y2B=^\i VNw^ B&q,RLR ~<$vIn;H:Mp%dٖ3H;#&CQUUYCl Ri/fRQ CR r,gr启ݮ m{{h$QӘk+rb?M A)kӛV,ke/\X6LH2K)aK;Cb>7LfZH5_muU?s SIMM<1NL) 84*IPKaYW!m^Zi/L;q>wY(e!7kI>AIG"8O *WH g5 օo@i>ZyZSLBՅ+R,-AiKmq1mԠ$ `.s/Q"{[O{M8T%0io"@Q$ˋB3 F"=W+N쇚,| \Ƀ5P3Ge d6RIݺEz7j%6'caxSK'^4.b|qcrCbʅ.}uI(o\/ddQ/ [IH2u)a%u5 =4xbiJ<%b!ˀmtpx6 Tc6G\ .vZH"`hnOeC5q VN('X7N" pRE**"B=jE6.UT}]dFTNUF{4j72QCi-G9P΢ۏxQ泋߱j$aYxP~Db5ak'P=%uYԒ_5 &+{7IE$P+EH}AmIVDfARta gV!HG-FBsrE0A1l,}8[`€#Oa|pM^It+촙yB0-)*D/BA0ϦD2gj6պ9Y2^ZxEV ye9+\`/O#? TWM2.H"|G[E<9ıbS>vTtER!Hb3m8Nj6c85,F%F)?\/tӤnqDkst@3ћO ^x ~a_ wY,\LEt,j7AAgP\+=bEiOn*TN%~Q1ь%Ϗ )vα1YMl*&6PҨJw !P4D *>W ˔+Ya !>œD% |ho#u2@pEi!-׳Ui7k] 5͒|I4f;NyU̿\O,JNiK$9]iIRzuυX#虯uD| ٗMA Wlל7 魪clΞSYj+1!Ju/]2ֻe*"0WJ1qf<ҷD6VQA~'Umz$$9%(P~iq:{@6o Lfw?l宀6`FxtM*q,]Liۇ1f(F$`z6<_t74zSq@X [ܝ'[X^8+Iͳ_8* HaaK;dm W.R(H,1YBzp͚CADQHQ.-thskZX&Aa¶h/,]=’aTMň1%Nm^DBW=p甈NPa~K&ΤߥVheBNY=m&m7] B] (fov'f.,\܋øhW,hM#őI Mc)'!J/HFXD#rGCkf#8.Ȍ/3dY0⛠m&<3+BWvF 3ZLhqTBh5<*<8T]:A8˵ `QGY olY3=ؽRH,]e/YLJ}P.ݒau4Xf/K3EG2lQ{Ǣv>Ȉb̉0|<4Ɗ[G]|\LwFW>)B0dv]XZ5Mħ>vY S`LHgbY ܈ &k 6"$ҥECD/~0s9ԊLBe |WS+h'6=yq6# Baŗ# 9::"\n_wtS0ܥ܎H4_[r{O#YjQз:wRrT^-=טބte44)T Fu~~Bx V4>8䳁ggcl bLzZ"04NFh"l5Q>J(,"t۵(7 Zn"YCo9v4 sE`6r)*ϙhY6GirIy*%$'ߗGJi5}^aB:Қ !}1!YSW?RF;([ Z[TўSX!d^([eNyLF=P s8:io<5F:LAƹ~AҼWS9fDxz|,t5Nͳ&):ł(K΍U(VW?zIr9[$YrҼp nWeKr)Bi.~zKQji,:pfu5](-:EF]V gvr^o/T?3-)e8;]"*J _z֦V%~#h'FP--1L@}0Qn1;VWj>7ܸԙJ ?h#؁fڵ`ģo;vn]}գƵ,DȣcJ?;M}fFVυAH&S;鉮rn &">"&;7wԮ]y*ZυT֡܅M'kZ/u缶?}K.dJ( 51=ArOOCM%h&-f+j}5oIm ͤ堜?ʣ9ddq+h1Φ"~M' Xj{$BkI-5IqoZc>۽lDWc7J6 = #[ch )}i +7AE|&H;Bh#܄XJ !7qpI 6yڊDXcCw+`uRS ya+ҽWN\*" a *+RcIB0b|0O)Yt I2I8&T'U\I…&0-wmrtm!' -6$P#dN*GZI'r@VWKv6sz~pbpXB7NR.**Pͪ-oa§)~ԍry"PuYw@_!1#rU}_q? Dьo+f=KGZ|b<~sc>ګhچg$Fwa8b+~ dSvU!؞lXSCw 0SS2ټ|G&/ߧCA(D$'ȭ+/L˩fch(CJI5e0pD֎1MyRFحǡ5%p^#X ՝gz(W$2#4ۡAzyյR++'"|Ih4j8I$7c 7솇;;U0Fpΐa)+*5)6oT')ԄEU9$Kiof:w%_͢I[ g[fι_'iFʹ.DjܚwP!-CLp:+ߠ5Hc”Dwݻsx\% y4DŅ* LIH}ν_? ,¦CY 1(Ḽc%tPRr$szݕ%Q6d~(LEUcbO@t"1x6ѰdwQ3E#R]pޚWsk^S>s^f:dtؤ޼|ڡ3efSɡr4<#q8}Rlx=cFb R(rIBGgR!r)SMNjAN,t+jllbJ"QbPVk|5dmʬl s{LfUmyL$%vcJQ pisEMsdL@5`Τ_3[-T_.2MJJ!d9lA/trK0{(X6$XiPB Y,=BQz4ήnV&3ҝA fZXwh/Jh&b*ޑY7/HcȘ[zPպUOu6~a `Qg%T^O]w0ubǦ)o=8@Q;C}CZSՃP Th q "h:_V2RsZ:~9aƗd,FWd7rLЧ=D-xO˳l CX^X4ePTiIQ_Nt %m|V5OL@TQ'3~.R %IVntxE@SO#ĝ2VJAħ-`qO >Ib`VRRH1=5aC:U+z>ٟۇ(i "<:i#OACXޒp9FiHoaM£rc,/y2ۯVy3Yu$48e-..AR%MΑ8,0b'TjBҮPcC ry9SD9*pՍܔ+aOW-(,;;@dB\0J !IJѯ%>xcB3~ #b4u""I .6QJ BrK=NQxbN 4'jFf 7WJ 8?&PZnGX dV 4-)z;"W.x%]#ܨDEl;$bS&T$WSw*Br{FX A3ˠۚٳbv$-à7xh'QP- [Nec-uʊM4- 녌i麖:*lV@Zť 1Sˉhp{[>tY_ӘaxfH7-_[@f3eX+c 9FRLjj<\_:B;8w*zH_bDσPǕ@#YC0ui7 COhj ,rv؋duWē ndbKsgč{)PG0Z ђ"XsߔhvSč?#5&Q*m;!}YK WF6&$~sE׎>,rj{"V=T-OA";DZ:;=27]굆;&շh:MzQG6!if7vz9?XC/y6zoDWU,gdie@H.BXzU*p|9 \f{"&s!lIX/AM#P?H3u"~!Ckby9pLvvMT.3'YDT}Wt7[n^7GJw}ugҮ*((xj:1Hbsx0dQnV74M0#Z٥FZT-+{=ql t$F.=#d(Lny } mUȷ͉On%z;BϬ)]fk4}7_"(,W+ϼ3iF^Mٙ;2&Uԡqu+D)ǙCj+籧ݼP{zށJ?5k J]]G(:D@inAyVhrc8vЁy)ቅY0J[&jo gbXmkC w=U$CFԪ߱1 {CZʘl߂8EبW>{IFԼzmI6S5$%wBGӵCR%Kh}aΣIU2XYJd߿+T\948*<{qY<'~EAƱErZH{6\ ރ_aW+D7;1Q'c[OٱP~0&쀾 =_SDIP)Y kNE2c-BiKX=*=P NmFB#{u( x{}ؠb;/P$eLoR2<1kX(`Ů+fӔ~z^dFBH̶桌Oc6aE$Eh]h<6!eL$ m1FH+6&C&9u=KDf] P? +Q8F^0JĠqhL˧|EI/i,؂0 (q",Um|U~V& V1igX6)ƊbZ>\XwKǼ3)j]q`(Ejt|KuJ\J/TtlHV7nE"75yڷg{qBHRDI#sagDLv:'7qJ2P9wȀā,P9-jw = t?/'=Q Lf:+XͶ TV[qx;V b6zX ձaߕY%{wuY֧ IN"}%owpewM̌<`$iy-~ۣ e1 .5b}BYiPk5Kۜ>ƒ`I3cJ h*{#_c0PWǑ?J`37&2=B*@`H aڲ%^ň:, O4VVP=+sTԵ*]`nN7 N$o|˂-J~gn.ГRlB^򍅊 ^$>|&ah"82v^Dw(^8E&C%ʘw_B|.)ՙ#2$r=dKFs_ Ae[BiDXIm+ʉټTn|YiՂע3ӹ\rŶ3XLmU&wuKہajT0j%_Pm΁M~Q_{LHo.]V ̤cR{Ǩ:C:[)'fs?2MG8Lqh?qI܎|}iHwb ܔҺ&X WEW IN1JrvC?U9!"KD/G}?w2,Iz iEt#H9YylB3@ĒES7`>/KPiھ& B )#gH; mݷM_nl~tf@Q^&ä-MvR L cE~Y %6:ꥍϓz89Md|dDDkG $Ҩ}'+-뻣EMDNIq~&fJئ3iV٥jmw-Q tqiBJ3}Z?@JB8k6$^a1>#"v͒`ߢ,G{ގ-"<-\qK!4%Τ"Ii՞$- 0/c ڒ IeZXÆ wDHֽxH<*ub7H)C\\$#|W .xbNr8/׋#( @70':\4"㽂@P:iqN#$n:I|XEDܤ-U s'֑f R' A퀳! k+GO~"IjC{(ejI :omrx'h4EYBzn2Hz[7]vvS ,-0[ʣbdvչGX Ղb mhiGGѫm meYZCsLKr'6 ΂Z=juڄWP]!V>#ša^mCa0m[3[-KN#HiK$`BP#Q7ԭDʁ6p$='{5E9l>tBdA^ua,@JPCpZ|Ƣ3}_`[Uʦ&:]4=Gq2vUiOj/1|e;#S3zW 2ԙ`ےm蔇5isPv}!BR}qy~ԉ1#-cH\dTN$Z-B%U否]-En ^mN3td]~V(-@[/E%4G #uecr(zI7LK)Z%Z4( b.uqWHRBF%$$be0JqWzOsW_5F׀]i\EHQyc"L'Y3A~&Q{R¤E*AYt<Zo[IoCu>ą\OvL1O3ky !B~ uro,4ӐeCzv4JkK1N߮=Ea_{{I(%ȴ=2d9p?LྱV29'a|ǭjPpo% QEox4RXŔVءFEoo#c`fZ3?M"aHa/s ?H䥂OlؑڠXVd @\VK1 |p3"ug!ymbeR1 E\>i?4>6VthWxM{NP2מڣ r($3nHE7ecaG:~$v" ^RQ4Old"F 2?*fJ\n#guCZnu=RMD<,nrT+!Oq_H6u&RL={j5~?!:9;DDȗ5a*0uKǨc -6i4NWDKSAmicehrqv8gl 7 K|dt!B#zfPD҆HfDȂj3Ғ*mg:GHKR,䄖pF*zBLmGH<e"8']7jN'. "\0SbIÃ̳ޒָ®Xbe N)_ ]B>xt}a5aB<: b1Pk C[q3PwJlaLx"z.'UXJzT0d!5z̄z.,c$¥,D9v E>0Gq3@)(UJ=AUf۠W B:^M1=Vm~=DhBZ0#}$ҡ0FG{#ה)RC7u.J-'Su* rz{l5<26w<&*߬#rMq{|U/C2;˷#2Y]t:4d|b7d&i IxJE SHh]^$#RZD G5V<;ʋc,S4xŮ&5{k&XdƤz17YLް37XPPZ?t8y_)?~* q?S]7sd/-S7&[ckGU-ǐ}bCdn-ާϪ\B^h6CZK_[ܞG\gŜDy3jZ/DY̢NA1&ЍK!煸ieD}$ɛq܆IzΠTF?XvIMKe!qg" Qo!(A#̓M(Tn%F^'5~kSLK~gB}:jKCV.(@C8^f\Vat4RrZ+m潉+F`~(<ԫSq yBZEs|zN>ok;Hlc{q:|Xw.s,}?];My;4|O*lAR~[B $*dr\M&* 2㘢%UR{?7>໊nhp6´f7)/+'95U 愮 ʿY_PX4.deS "[Tso½Z.1A=#oBS[qW%WEJ%j.,;0Ůի&t;J 5 ⣍TpHvAu}& } 6{;V;97,o߯ŷezsa-׋MqTl]dP"ZUl ߥܿ~ql\TFyi.2" ^s;`)vh+^\M3PtdMds0)&>8 >?REbq;9?9gg]%VGkJ?6U؏瓛_o(Azx"A-V 'ⴈ1?I}:tֹiuA>{!i  S?1;ԮQ)˱>%C]y]P,mv;vIz*\Ji.14I?>f5j]&HB+$&oZ\EMY2/M =6209ht-B\E)AAջ̛ÐlKgz;{C(.0@okPPKя'j`ÎK]84Aj lμ2ViIXC/>LEɞXJ]S=]qBQR_Dm4O Ɨ~} EZ믨VGj.,B.nZM}3۴S.8eR 3`)Oܬm(X'X|ưFD?݁F!jԺ w ;M~\(9,=c$ A+2EiwT`T̓h-{m,w6F D'&ߝ=^5p*`uDi(;i (k3rByFsx2KPVtzI\sלI MO2"&vgdyBcLq\Ozj̀% iQԬfy%kݦ5Tf+% y9&1mO\_=yjޛ7K4q2iI*zlًWvK+dkfv%҉E^RR. r{1 yS&vE5h˾ AA$dFvHY9;<_:'pS, 42 0Zxre@H* 3C_k3zcYK#(h-bB@me8HQ'a1-~aq5 &^m}Qߒ0卶7lDHHaM3r'vu(oS>4^bx ?pyc٘=B .8:y",!ݚ{f[HqY-""Y-.Y1*>ؗq9Y& nR06ş쬵qo=SVU"k?+eޙC+IKЋ O/oM޶B]Tt =RQ].>-5wTl-S'Z> 6÷eT*Ic:ɻ(7/'>Tb!B3`cRƐ µ':NxoBUt'LMd]EJ6 o5D}dcZNZH1_d麐+7.u>#A-C‚.cI <~E3 Ie b.=}ڰ$} g5\s&H{3i&x1m6 1DA3ZUQ? Z\=z-:F Wo;sJ|K$fʃTCp!tdz>fJt2bAn10$6bx :l+qOn2 vkB >n}c'&q i¦ȃW䣂׸\xey,@BBMf?[{wwcJ^&頳H)w`o=m.aI 8:%,0h)漜"6'Q5dD0 [0>_EM.-+^1:kL,!%|vTgq.+I0afS;=\39@%X(BUMF=,B8RZRɚ\<`DQI)@R12R7vD,ѽck%kݳuJ i+)*MMSu9&}<搼|R#!oq?zZ[5m Nb ؇? ~y ^^H?`=(T2af[Ճe7șOIs6IDk/NNStb> `ٺY@c>FF ޑLs>yn҈ 4'xd:\f8Q(2 BRE:~؝ TKvqRWm,lWRDN3(g>載gW vAMtzo@]gŗ=B>/$e gsn]ʖBt?-Dۄ/ 4N@9T|FHMIHr,rϠfUߢm >_ u}v8b-7bwhutK*6k*\M`44H^@'<[4Q-*L/"az32g][8CE]a@XS?="$dQ?q+j2qnBN ({sj,5lf*' U1n[""I==Ě{ Z2s@\Tx:hªqғL"cvxTK:"O^+21@ɵ#L?f2r$H,~U7J@.jfmWڡ;*x1!;@@զn7%\4pe%O݁ipRh:Y \6E9KsM_D_~.TjJAywpHcieJw*I'!rugxْ=șY(_f.r!EO!(G%{D?MkG xB{uhߜ /F2СRHT |k~lIB0_Ц"x0KРQrҫ$BO i%?0л 7,'½;` Z.qo. H< #G< ,uxK s הƞH< d%aEN~Lt3"1la Pn{ hFW;JmfaoYj@ gp_ Olv! 1 {5XsoF`:KNr?1#jʰhڭxDKQ̷#vd3M{r,͙G2lI@F?'X[I?6bn_ʕ9;Kۂt 5R1g3f ֿ#?x$l.%6vPváG*<~xHINp62z{[Pۜʬ+'"hss-?@ZX/ʸ RJAn^}땰ll3$a_~? W#jC٣ 4D"ĂmY/3n]~פ-)Xl2/ `2_T Hҩ 1]s^aV yyR},3P&͔2)2\1YVʻʞ;PBQ*P=%;ǔ@v^TLz[-jï)5ƚkxR%bqZئs(억E&p=w1$Z`\ғ'Zn5[Eur؛̓So׀E&B1GR3x.v*7c(2w$$(] tCU"寒4uS.3Ta?+m%A5PrьK0rX[׭m}23yCE jb&P$aݓH*oeqs)+܀sgfuș(h|̝n Uny-١{tlXJY:O'3,y&KUTDӊV[g0!i) ^!#Rx_ډ:*mb %K:/;F"Hm&n"j-Ar+/& § nH:`3SS$-hD;lY(XE}e8ʇLܲ[Yk\Rp=8Lp!5$2gEp.*Q6O㊳(5R|z)wfaHDo[L$:1hֶw%[lhˋ|JF]6~<Ewd$gTJ5ۄC4TQ~GK3:QC˚t&I6H#CB-F܉06WhI;U5ķ)&R(0D[:ɳMu{B5%^v"fZbV.Hk(/əKrsʻ&-56SҵAkآCkMu:"3ȠE#u5Y FEmRveMʪJ=xmGy?D(&/] NDDUO1+I,|6NFnbPJXHA6ːZ1K׼z[5s{'3XrfK X+O4#lo2:nN OA8 [ZW*=GE~Fl~C7j5|a#JKhg*\o&` l0Dnk0E$!78 lN59?M¹96x2CN3W:JiO :Р'YDD/x7suV Kr Ow[TR!4S}& Y6Bݛ5Y"Iɔ9JI:6O!mM4I۵>~{+gƍe(Ѐ3F?*̳.t Y.Ut;ϥD_][$/MN,prB"gepPU0,5vx8oc7[L}"?6yl ReJ1ct ۺTN% (Sst+i }JӿsB8vSB/+8Lݽu2fߕ\-(m T tO >G^lȑKm/pڊ4kf^Y٪mܖugcI!R,Jub8 [A. ce:euL˯_j7_%Czt[? n3,tbƥ?WOA ,awJgG=5?^rj"&/72P@ E1<̞_$񡾫𭕲2'; bZw(Nj-2QU0hݨ" ::LudVYnyNRwH߂wre[@$JbSLE+#52Zr,ՂrL ;|Вόc[?#il.KH+"Dy%a}枊1~~C,x&Ʋ9 ^- h0C>e "Ӑm= 5 r˝%eK90m'Ucb~2h0aUMѵjp\pUzS*Rփ4xyQi\%?1zn"Jm )G&,5VYMHJ;  *p#ՌO` {&.um.̲Z* OV\0X\5%-,9⛲RB@ITh^dWV45y {MF'7UXk>IMYz1LYc7wݖzV/Pvk48۪:(|bt᧥3QP$!T4>@"ߝ݆I͕+W$G A 8$CQS ʴm>BTNK /kr^JS[&K rꌲ34EuJbRo \~R&D+ac>(魈2gJb34٘Q{?J{ ^Q b̮Ȑ&I\I#B-,.:DLy3ލʂttF+^V?`eii;ަZf9a3(4K\$xubuz/r:8}˰2t$e1R*tݍel5yf,i_^4jǡtc#j)%4N9^1!|_gvF]F4fͼQ(eKգp$: >Γ'^ ũmV.[BsZ-sўm*ivQBGW[ʰYcّ>F_~amx7<=Qm8uJ{cƶ \VpSl[:idw Y)J1 I4@<|#Ḣ l$!% RMރ#HziV:l%J9tFSB^xJ<Ƥ* zdF-eBtw_sRwsyvrݐAE3 E9( },1Ѵm[-"̌oYEcV/є$s"F<ń!sܨ. +Svfs&յAbNR3WH? fx3/,p5 oe*C|R|%6Dmj*މµKZQb 6cL/w*D`Q0#i џW@$Q"'G^f;}r47G UL0~<p5D<3E`soR|;Pw[KQSm&Zbha & =e>`. jlS)O`@vܮpiɱ䧼j} !poYEqQ b P)ђ _l"#\ӄWbm3Bkxѹڅix{Q8§^ b8uw0gP:.XʰGR1 85&&⾴kg8(?u_bD|s'%Nh/ vO \~Ѐ-CrfF{e!FrJ$ X:zBADXGӄ@XJSv)Y}2Ç@ Q ` Ԫ[ %^,3W[~dK8Wpgwg6CK'9v"@o F vӄ0L=FmAgݲꜸ\dNY GC<(gB]'EyBTāg!\3i ZPOR{x53Rv w/?Qd ! }~7lb a)D:ii%Ąi[B׺fu'a_Q_Zػe FrFs^~H_\՛[p8+/%{ &;_C+(g^9qmin.FyjULgIv"Y q(c"7vNF&5%H;N@ݯ|7-uw. FeP<7[S)TIYdx ݏ4FоH5Q%w䞄&"u喷gb 4d籤k7f&f{"PN^͂+PG{ Ny 0a43Qs0I#싙Kz"ǽ,7&&lryKDAk֭ZBFH"rQ L>y*4'v WJ~?΃ ^g/68rԱњ֨0e-7l!~J|9=I0Rvd\ C2Gj]nk[O(K=-ER83+&VG21<2bDQSѴ.xSo}jNrɾv |cDy/,h䩫,K`Sy ŝբ7aT&BOF='qcal/I/U,p碂O/C/X 0@*k] @,[%cc4ڎZ.A0=CŗxA*Y6^2sϥI%4}uP@b c!zCpK|V-Z0کWg0`㻞 ҹ*:$}׭ qxZNv2 .VB^)Lޣ sJ.W? k&hLoADTaoghZ}@<TawzECxơEvp_T4Cx|"8Rd-k)ܴ vbֱk( ݀GZ)gB,֜ųͷd+%Ek:#Voe!x| MIO24@%MzdlٟNЉ?;(:3 Ԩ3huX'D̘+蕟 H'o8/9dID+"oRo)fNH&fF̛ոlZDn {'`F"n㶔 xHS2RP9XV mRze{k|*b92fSZkg@R # Rne`fbؐNy0jbdc MkڦM}b[,<v;\q*ҦHum3Fw]*' Q{mW!;q y<ĵ(Q,Z17ZV_/NnFJ6|:ͣ?z$6\nVx0:4JyVy+ ct 0a%l\FU{]!j6A-ͦ*xXѸ>Kj8ml*VTɀ5.ht%HoH7jMb9>F ?!1CAj'I`]e@v2 ppWWp0ɘƌz 8pKT Tl4яAC+' dTdʣ # 3v0zMv_LQpz2} OVD`0!1]ӞmM±cƁb xP%X+#Rx#A$:L M)!eKې֋hVՐ0ѐqrz̎esƪPC?%1+x`,Έ" ra0 8ѭ 44bVZkA˗Kg  7e ͖a-l y0|]%_PUY[80 @?!"J",iч));p)r3PX7rL"챏vT`YצH,ic^ahpJe4A<%A*mMu9,d' lNO24nvn*Y'~PZmNrdv 'F7TQqgV[8,o.>$x`0->tL|f:ȜG7͘prJݞ8Sjʊj5'+GxaB5{}5j8U4X9[0IjQtYE2R^IEJr,+8a:vwT<+g[;rxuy+i.=!)k$fBgOf7Yg@2W1=ȿb6r oXcjNP9w墄K-A$gc/ sLPI:Lq:'kmTFѯXψr;c3($aVt5 /Omqw>V2 cH ȼ4`f2iZojTE͚-JDw{396΀8b.rVC a#§Pvo jc:+WfTց(0^Jly?U\45Oi4:)8n @"~8}1JBt"m^b`@- F>ȗW01-n$V{(4.cx3cD= Byȧ:f#A˳C.lYN ZFǤbVxXmB0eߡp kjJ[ D WzJj>#P~Uˌ UGWߓCNoc,F? TjgϞ+8$̠Ņ C2_v2S̸VK%ׇ}G([Zs0F*}W~,} Cr:euuq,p-[d_|)}~4+H~07*,?]m -@/dE}3il;PC[ߎ}z}ۤE,2O1i|?Yb "| Tky⏇">$fDLM6ER+ #^Zg(s`^D־*BzFߴ5jBѥ+z|$M_E-!zH櫤LJ b0cj-45Fm6t*CBcR oh0U-_ -a$-z ^MG藜iQ{@2v7"ɤ6{f7К Y%Gw K#/ ՈC2{_ /mD/,%L-$]pDzlbC=71+ k0 oȢFd~^XE { owﮗr%` 1h5*+.ñ!J Au6RY,$Fq7 y ؞T@d=|"]RlWqu7}(&'uŚj(5‰DӅ^;V?}WefՐlN}? un%SNF"+Tjӓɦtf: ak{9d%Ւ2M1q ГW H] Re@s԰^*ݳӔ OC![P* C^>2ڲL@rs8k Xĵz!M!7آJ( ۘ?ӵ]F[UI@?I9IL?ҦbV_fXuB `MbֈY,.3؍+R9+(VDa! a r )'\~`Db)gŖįqmF`gc׉hth@]@$B{v}x:9!M0ZƼH$^X2 qsZu/qK Bk\#s&(_?ԽXu++Xܑi}|;#{%ZÔ}uhxI.|n7w+_]l5uy rޜvJe{&i! <2Q|ckj$ Dj. ", ,*Dml]r!IhtFj#刯&)]iҴ(@xV) ;o9(yٷCiK][-=FO[_ 7YmŦ|,N7wPq[g}9EӅ[ r{[4tcp^FP&6{8Wzʋu\֨rk&J6g΅r<]"DxL#Ipvܾga?qo 9PfʨʵemNYH +@3VK]J(76#/Ǎbc-8߈f$"!(V ~|o!5Pe^*κcrGier7ɇj40O\#mafTyUmg3'q\[-$UBj$P M)AO7Jb\,X ZɍE۱5r„6OؚS$NI Krcc Ѿ鲣KQwUeӦF`Nә3m`2y2+dвnkKoI/o\d u TZK#dCKc4jD)wpr\s۟!km Kl 3VY@/,l*o @%RP WYg8tg拊QaK/6][sk93 >bp3'meُ~pZDHH\*&/'᳅Bkn4\xХEQM( h+ @G)ןtDXeW>kH,ՙ.c5.9b2*BxU=oYasb~Ua(תaWK/Lga v%AbHnX&tM&/;{#1g}A4*&It%ɀAF !Ql޿ 7r6pfuek7Y1x, *V.3m#pA!0dTthx*Vż.򦢘(No20c݂ Ȁ0MKK|u5MM/Cw4%zܓԄsTň ^A[N>޸x[ XQs iU<3tQw@yR-a +"` oPN):NaȡJwuFr`6rZ:: j#ʢmNMZEe+RU1oO+YAl*2p"SmHZ@+J7XipH16c_Ű-}u/_٤o'x9Syѩ ]Ʊwڐen9phxEn!ue`R@y]cX'̤Vm]}T{J$|8k,UgQ B<`X. zV7Egѧlqד("Qt#2w7~,@IӖY\6 m60D(rv~W}ިȜ%ƑН|z -VZź'\=NzNUlfIEYJnq;؅ȡE:)6o9(؅_)v^(]Jqqol8·N7Q.; QrƤ@c[ly˼d༣ɚ [: /Ϝ{iyEs-Q7tꂗ)qvh7qMq:Npoe6/$#Ĕ\ߔ4{BiҔ"LjQg&Yq}7"wKz oC 8Z9PC@!aS }&waf=+J^4 |fsE;BU E)/Zٱ8)"J2v8X)b)Ïo@Bi` t*S5'DP[amk1Ep XG¶8-v4I$A$ 3$E6yPKxQ8H*u4?Yܚ&t9A2EVI& $]BNd` 4_1CPӽ$S!/x)zC]qy;uh_oM/pJ C{{"Hc, FӽZΡM%{ P[t3u}TF=0p]V>;h'>=Z*y)Hye(b'18k{J4r3M8mUr hb`91*$wl]y3 /G_!TRn8^s+[L;?,t8vX}EΦ);XH}_YƎ )g4u!AN!/8*112^ ij'Tb/FcW֜?jdfφ2iCGI~HPJ8ڌhNy xM167(&pBdh)rW5Y; u2~ ~C=!͉db@>9|> 97耛bʰӡ|@\riζeTb*QH|A 7Q~P=bI&H;*AL;o:5s dAl3yȉI껣!EDA~G3 wY ,YMߑF1cgҥHbB. U] ,+W{`Qn4QF^k_R_EB1 ϼHH11 r\d|[TmxMA͌LJ])-)ɊgtSMEUvkZR)yii9G'LГCRXS2%*D!%rQRT_t`LGNCg[A<)1j}  ao9:L`ީ X횰C?Kͱ,W՚M1=tX6])|?HhFz;)Qe:=݊UD[V==s. 0*fv^qU}| w-gCnPb呮Ŝ?feNMxS4YJJK#43G8-6ZJkO8I A+8B+t_r{%MH./aDtB01(tds;fgj8<Џ$YsqD?ǟv"US͢X \fI^@dFڊaXDDˎRJO1aPn϶FXS6n1?1Rf࠿P84 dWbqZ2-8'ja!>Z&B0Y+a8ABxh@Jߋ;[ae) A,!Z>[1tɠ_̸), W.kBe"k%u(7ҥNKv<})$bȵa/ǖa)SB3u.|xQ"^T_0`),^Xq g*w~):D<@VKTZB)T-;9X^y32~0ԶS)5:j^jV.W 4c$"^ MC:sOvb x z P$0!O0i[@)]SM3ˣG ώSu2)zXazmIJگ0D:<;=1>ƻ mgLYl#ʖ5POQO)ۂ7@v1f%NG9A L:1D!v]'wUu ƶP QMrJfu;HՈ)jؚ*(T}(}δ6탋]jxIAJ}} fHK ,䉑/;X u/&Bxj_vIE? z*|njVIZ$'qdqXֳ7oYOjcw8Hg$* {U٤DV^xC]$ kW woA#hG$ ն``Em'u4hp ~M@ ,0x`|m捍0Fe*PV37m~]ӆt WKڱ檾6}?&p},yim"ھy%Ht*:"7zܪk&jART4&EhQ@~ p6Jh*b"fk%'fr)ȡ3u)_0`C/$cW~L5!cTn5 vIߧ0 :ikDIxr Z^}$Dˡ2JYjZFdO-U%4 6zQxJ#"waw*zIWnEX&fw;YXŭXt 4 MQ3xbTLv!{H+ y[FKJ?+_z^ܢy#Lqz${&54Z122]nܝXeb-?7/l0auCGI9!Q8s|,Q}u+c /b刟6nazpS3l JrAX$8xHx:byXf md/dH[p֑5}K#~x#Y"yѨ)p.V e1FFXIA"ƟhHåF#%1\>SaH pqY i#Ekirm> )R*-jV<|@$ *MĐ+t2~g,3xR \5=rU+PJUa#2.f~9]lSm*ޑ4h?w~U yR$:PpZ~s$F:)21k4-9% )?އ#Y$ib$ΑmcPx~3ӳ\PA" 4Ԓԥ#՛ d|ZthUCV SZ<-V&jm-7TrAPa&P}K9mKΙ8hSAUI"hSGʠK?Ys_%DW4j#!)%a8gY6˶FLN,*g5#R nur K'D)N^:9QFC@q@=,fyj-5 r 46s-apU\Wɳ^:Ixֽ"`Tg@ `CfRDhT=īsLq(]ͧ+w VQ:%>j6&-k%Xu{bH|t&=k)i>h!1WzddT»=\hzļsToH/A,)ېYd2$ @:XP Ef sX(caYn5KNeNmrm0["'o+"j2-+9WUx3#Kv)&zd_TZ3eda`yy>lD^;>lj#SmDgT#y(H)46"ܚ+\\DȫSr!9/baM^JIx\'r[*`GѡIhkAwSYadi7D757hm]DFg˥9GvUT==]YqJDƋ<&tSOtz~./Зw 7H%\ z_+,<}qtإ3Tt4Rysca9ku5x&si6ipjuXƹoݷTe1 -o4vPJTF,`һlVъ"s|mnYM-Jt|ZL${k22c :.{ e3d!ꍆyby9*>f:uKVciIZqm_N5Dݨl07b1cDkZS]q|HTz\IxD>$uHd\uup'\W%tmpUqh J+̖zKq` vx3/"-qDȓplͲ7c7D_K9sWyP-Q:~81 j"6Mz62b2Jz%P<Òjq~\Z) ] 2͠K+J/xj~읡t%bl͊7ż{zM(tc~~A@l4ԙkb]qWk%>N~,zG1^IQ"B-db0f7]~)$0V S 㢭95)g@+i\.Xǰ75 e,aIҮq+RxȃݝVmP~3@CXFp9T=j P4D:xD0{wԽ[y{gVүx%"`X i6Qsfb#X!X ``P$(0ioXam kɘ& u /"&,HPcي&RCڐ!.At(ӚhBA&>DALF;?WRApAK$R(m(Fr?#_h61bKf:eΑ.F,kDllRdGt häNKr™"*J'BOMW$қmTL >#-N  a=Sn ֓61)My";?s:82 X!{Rt;ZנdΡR儢r>Q󃯑5YJTo%l3$\&<4#6*'ƀ on&I"{b­ثΟ8 :{?:ĉa֔" %Zh5S"E+ _FB@YQ=9>h~] ~ bȋ!iUi9Ȏ `HpqjH"k){z%F_hⲱʑG P y2){tU 'kԽWt W JJ&h=ຌk=γ5V"ŭEkIeo]xb$ xix #aDLTX]Ht%XΰI4Ɂ yOhi.] (gu=Jk.S;A)JA3X[,[dcJS]T$+jWv'Zx.nl"G \\G{zqޖ{: 8ZƭvngJ &BGy3JlP/фh?}T3 mW?#:"p}+LS;ݒ@:HOf2qդ mEC d7c)Jއ>R0JeT~XDu<Ӛ 3z 8bGmJEr5_PbQ=U%Z#ӇN*^r#*gO =П`].Cw@=4E-="-0gj=v&ʳr*_U2*[$ /9Hi'+%EwhDj>"3X|CPfB$n}c _̳ b ?+ h(l>F9Mua XUߓWLF DJN}0u|Ї hl*+bz˧W8FښnH%1F&<9&$T&t/Ϡ!7߉wcF}eM555:! /> a3Ϩ.:tS"=m-kq݅m,HSC;P7"f;yIdI"*mwʰtيB`ؠBmF4|gCv N/*W/)%̙*۫q=~h|R~l=Z^@=%dHę..]JK't| > 5JzAKB#~.7GF* oJ;ihb5M/hWH A*ZO>ɳ/%{f+_UlgN62UWۿ`e/(]J^3+#"KI[a4gIpuuO:6VPZ,P2N 72 %(j5g,BbC.@0,;ʄQQY> ˗ OH- Z 3ZcddɐL7NҪ:Gc&( $$%1Fh{\,c}*C  MMMI_Ԍz> 8R}Wr0" pB яD#fk"IZŊq#eՂbx;#D*?:6ىhd磢%|mTveǚט[!jjfXL"gVؕ:Bh4:{nOJ.I#wHl\O k 4 YGA_$%cySwz&W)'l$;gHU!,~EIs}C/p"(l' bZ$'s渉E4LRH!˂TXa4t9fXU4r~I!XF0\[dD% %) m#˖[A 93s!Du@_))#VA"3[ XnAoH#U| JE< 1 vg-bL'JD)Yo':2M4/O7Z!DmW"QZVT3*mGk͉\}gK_Xs.J I -i<&@3;WT?Y/STig ,}V&WNL.DV JV]1iت)rَg˸W'l!l֛yI^WQ@I6uZq)|톏-I z~.EQ]G9tI CV`V Zc`deqP|O ww(6..,Ǚ@TLHؕumMG:AΗr )23#cBFEι2Ǹr !'`C.&4upӎ_gicpuWU>9pu˵acU| Vn(/A;|#nb&Wi3th#OXԑ !ų,2=l6x6 ]jK6-#e;- _O>`ēd0F}nz -PG)]VIh.[IgXu`>E!ËEN1V)K%7@NIlҩy<ۑi蜈ɡ3_%cTE#t>~mOTj)<M"]"`MFJ݉.To&mZ%@u"fr8=10 eU. p#o f:c>;"orN4; tPJ@!-f2e;M$.!n~U)FmXSZM o5s_uG \$v^բɟt+ yȔ*Ĭ0 ̳xVUh-JڼjW+=?KVNvF6 !Sx!$0a#j\ȫpˌZC+QKfΦ'~݇[%Ti9k/~xŖJBup_-9vK3deBnƫ))x/L'y8%M "*lռ5Rً4!A?0;i\E_ ]mwmWr7qQ@eCd#Sɨ䴸cYF*eriVl`CQץyP9[R"%g j"U>`k$9mu[E+RcFKsPT*+3Ꚉk<13bV 1ŕԊ0)^ $d=۹7eYL|ö ]&4^s_@|`9c@Ė q6R֯d95vD]'YLADװ<$4audCq<]=8q$,?3)u֒Eyd*rK,-_=iw be6Y/zR* -u tGU}e00%$U%9[ iF?$GBhm$vZ (Õ֥'fHGu(Rڑ6Vg$J犥 u`xq"1r_OͿ7~_Zآ{Çv_YKv8gǮ+ M\ tnb#C02MmpSn!=?*֯ I& 2m4715_ۤRq L(I`(O{{bJJAO63dTT>^".IBz&=Y,R1=4ucgˈجġJ~*}ҽJ<Ԛ*e2nLe}C7/  6Dôj1RÍ~;a%"5Q'{{t, 9Q$՘d\Ltun9237],Zw蚸SPkoX18WI5@J2k6ǟ]o;lnou0}qi<3QVPM5 @?u BOaSH&ApP]|Z?! + BQF8vޱҁ8Kq41.ݚ'ZR`VH$P'{srCwmT!=> s V"&t|4ՆVJ&w K|ҷ$^xL>VnBZ btOtّ?۲SJ|ƹǏ0kUS ,\k8 -^Gf7$5>3E.u{_JC_sb\TjƺHiy*%ˡ<_?N (flD>b(><,Kz-z=[N3aVbppiIk68#}oö/3G 9Œ>R}dk3}8 Ū9n@>AD^cR⥙%95fa"? cPs_c@HEAStFH~{Q@Ob縥T݈r\0aa޷O]'IܾSTcnzaޗTR&vaKC}͞9ȷC'sx>CY('XI8Eot顶s]]BFшsӟ@Iʟ yTlٔw!=E7V0lغw |AҐ ?~q{F\^[aYQ=Dgg^ˮ19J8MbR D&Bܲ b-q.V aцwfU7I.DwnLL_1GGLF60ݲ JeýiHJs٘&gX$PX#Jsbz7V6MNy#}0%TBA7>IؖsBp}=IѡվT)IwM7\^E= V0ڔ}ASNx m>K"Y")>;\-Y$(&o3պ@ 73poE];ۼu+Lݢ8ysȾ%F\WLlKZ4a3 VX8+h <)qd/tO |j659-uD ?T`,ə6z-dHP,d]e<zz %fiU d~6 I{\ߋ|KGlB"@B׭a&wli9AҠX滤>o` C<~岷ZC3~uũYZ1,us,4`-D?mF$kc 27Lp<.]$|GZZQIN4L˗Η%#I ܈9[*2 !VSosF&} r[*)\CqjBt3D%CPr|?9j`]<bFOHY^}t :XrN@\c3$3xbIǥzh?]P䜄7j}C `ѥ) ־=®g0!YAMI ][p&n"aAK7qRUWh@f}7|}p96>eia7yZjJIGai'Mb% =xfk{ nz`$IU+$"AOGoX P]C}x-aI;rQ-CpDB9.=`j^] ֒I\\JO/`fI?{& O UaT2>' y9 gFG:){ Kn<ͣ+X 3:,zgcGn/{,yǼ°jϒ1FnNEf̘M2A>MgsE LjxAm F>L/O +vgotϬ#muK[w{4MY^*~_R*JXeJH}4@C"ސ8oJL vSZ"tҾa^F+9:֒bg2BoP "r;hLo[Ě"ϬqytG"ʒOlnvV9a[1(P7{\HQN C'N^lLBH=U$Y |mA9\","#+T.8R".utѝer"+gP?A r $ Fҵ6ڏ~ ;L_JEb%;޼km~5{%j+-,4z1 ъt=U];Ȭ]:΢7Fއ/",νgő&_vŒjsIie'TT+f>h zVh21=u5Wzsm`JK!kbFɔfUd_w-6bdPvM3EtŤh6@E뷈AMu#'eA'^Q`jC?*R* &-<̡O2{p o, Ar L5`UcJr濆.$!Z)필+ lJƑ EYSRyOEDYjq1 7!#PG^SSE@Cʠ]q5#dr¼v*oޗKU6SusQwb"P"qB7ˆGbHewx''P*# zڍ"K'$LC?~9G`76\t!J{ i }畕jdŷdy3*w긜DB/aO8[]Jwa&ת ZhA&ܓ"qNJY#;C0 c-Su{9O9lH$W7&]z{WDygJEzqaDX"%Mɇr\4uh^1 o5 iidrh;ro}:8kz糏Hwˁe43=f*|sˆ(0Bq=`:-ȱ/MtyAJR?PaIN<@EV<(PJSgVxDpYoġsRdX"G+p.33 8$[a{SV`SwHD530l ڈ)wm٧r 0i9x]zzu+<|K [};iŠbڶO` 'CtSI9{e6q*bTQS"H=#t6U4 Q]hTd] Lxzt&pHB-7U ڔ&p7 pRT9$jI@dQéPOf1faXuB],GZ̠/nC8"g7䂰s ]NC\ѱmik9V$9a E_2= R0F;Θ{r!_#dB)'lx}7 zP nfGB O*F7]ܾm='SLĽO vIN!Xoƶݒ;$/d<,5x!\9O9б4Ų` N,s\V Jp4ѶLR@ޠD`Ec*`h4pA|} Hj' b`fdsJ׻UW$G!I$U >6k1R· Mo{,>CQ.aNyC-;ϋ8Lnvb,hX!23Yo9Ǜ+3Y l}]Pc ^x4x36~^X?FcnDŜZF{D?ф$"/9HV-Es[w}? 2 sÇ#mDx1KI G͗X$˒ޑIKW:(ޘ!)H?= kV?/԰ r1,()9RpF8JcXah[RR @ְEӬƍȟ4%GoJRmDB묽i1VDkNAx2ګD굶v%d.Ukh֓uppÉ8ZRGQT~?){~Bgp$"g;V(pc^˒B 7@/Q`Mo]3g7:xPLbABf$3 @/Eo  ,ڂH:q|␫!ґM q %HViPnfGxq&6x+˝{< vno M"w?*cHdW|䨠M(V0C=# XW1%:'Eq$wRPq 1Ʉ(#'bPc(T7 y d HZ,޽.$5FD>$n$Cl Ǚ|߯I$ SjRz Q_O4((suHЂ亲K'nVJ-ƈeq0~?șȨT4K tD]@WW +A \nQ3|bO' ?]Q ]mE5u_q|~1'{M 2n0GnWU+EZ"myk~-t z`gJ2zqXR $Q2s)G.RL +t6G"f謡"<3_ [-#i3{_%:yqs+HdJU%&2K VȌoqpuu_{puN9%Z:^EѤ5zCw-/ sS>p'u:3_(b wԘ 5[ކF8TvߗKYɏe,хNE)r #)PDu!f&(0WE&7Jk4쎼h9udJKo蘂3]V["Xkpbe\tοБqi8H;D6 BRx cq"X@&[dlR XuH<#8rU%S pf .isny{M?>k]I͜Si*j@6w(%lw=,615oaLΈ|Q#KR@, ;1Ȕ}=ScU)_lhDиK 0y[`E(`_WEoчī˫_tMS/inqTH7lFPjF# 6K.~if-đ*]C6l m 0}|n1Dg<-Hxd.+srp] ^[%v$d_W5ӛ[6M CH6D*@пg3T ZM[l$4e]9:b&b5#HISkQ9q;'(kTS؟K_q*[H3SL5;;߼*7VڔO.iZB]#jjc/y OzlE >2"B\!KxF|wi&H.!lq%X0P#%D_?*M på/&F"79!ģPMpcȂJCH$f8o*\NS/,FDUE> m |=OwW 6P z]KB 2&$bXǛ11딾y_7 (";T\qx0kX:G pUc/D= &{"X ) 5؝sGFŚtrMsnH;*[-@=mJ'@OHf0f4N!%iw\1R=t A+ AiD'G2bݻruJQ6ǎ^B vPPq 藨Xsoƙ12DkJZ crF\tpVDu vSp_> vE'yѢ⼰e3.6Q=ڱ[^S'/ň8 |>EUWЪдt yVoM^%sL H\=#ME%8Tu*, <NtfN#c;蚞nd /i1!+$ tĸe4S',,KnJcE[r<9,!;vSErbHbs:{Mln@,d߰@ɹto(@j %yZ~N XBE=u }J~48P,꤀yia^4=eJE1NQ=],xGUzmfa H%1`S\؉bi\dBƽ e0um UUE2qxܿ-YAhhzHGu*Q1\O4̯onen9(Dr^HxV[V'oV)\qߑAY^"6wGrzrnmnrCfz"oe:-3JPs*y'ɱ ff-5KP6['Vm.x3SIHÜ\}L$$<h~6uYmT&l>EDV Ȕ8dMCRKsez7vK5vgX\6`Ȱb]2%Db-mc#ܣgp^Bp;[HkR2-dVDʬIHAxkL0)ޗ 1*J,[Ak*~E"!-n =Z"Jp%,+dY~B'!GJScw7H Ϧ ՛|q<[42 #4G qRB&x.!‹V|mi4-nؤU"} * $lXB@cFϑHr\#|B?n,l58bHRqdmH]m1 dv X a'+c{3! ?[^r3=`9WQSE: JGM.bq^A7]T*q5zw<2QP/TڑT+4zEzQo՗,9F~/(@"~*rPR)~@nZq/_V$]ĥt _ryER#oQ*JԮw^8QSzdHLIdY L 9WaY)zgKiʽѿGZ=t-9pm@eR9CJ4/ ^K>$yh9FX As66%وeO[|S'P.5ݯwAr_jkRFW3=Ҙ4ZߧWJ6CUnbJ3#R3~*t$M<MXLnC\RD@a<)Kߏ?sԮ8p5F&]Z wKgi0' & h=v jIQj)1tƸP*զg uT><쳬4"Xq _/Swir!N*;ܖd%Aj.<5 cS4@KvXFDJd.ALL>\T.Б:vV.fkYQqKX<'3}n nM3KhV`Z!S]fG,xxSrsx .*EKZ خ EI #fC; O*%柆pE9ZJ n?$!`"\๘K$( ]ըj6`^_7f$p()z1' 0aBT4-ԫK6zgKvmiQ-o~C( gY*s&!Ƣ p%CK}3ѣt3R٧Oネ`a <Ӱ\kNWhfD&|5u;\45F]QmB-O+CIvؐ~xȱL3.ɁhZam'I8P]GGae+{~ԞڅH^'&f4RKԪhR*ڶ4t%A:_|P.+^S[ I5N. %8;[U0OBS@\lovy2T\]fwh+1u*aA(K=ڿe 7_fB %ed+ωIݼGp?V'v4jKq W2 ;l:J0AIɈHǚhL'yf[f)[N昇hXT#JW, wL4²5)WPk|wWrL+bc^HO D+uq@8mbv^׷^hb55o-+O|h&m{%J-8IUT=2UΏx[LMߴe4z<"!qs~@5֯.&I"!vEN嬖 IƗ7י?|4! -n.Ҏe`PWΈuVWy=R 6BZ}Y3Oy1t[,$g~{G)ULb{`N+;g $efKڗ\ >4o!FV~1EKeyJ~\(: Ul꜐r,u=LmPw'$83U>r#Wܲ<ĈD[c0?+~j7sӣu\: ˬx6O**gːK.+Jz~JV>E>lN5/mML-m#NWz*Woee$/%@`|C$j˼vo?XrUŘǿ @}.?bY{8t2mY p!6!~Ux:Ba9mZ@ 8Y7ZT$X`y i0.:`8D&ad}e[9SQkxH@膵Dh.Q=̐pc TOc &t*m`uNwD6 m&3*"ck 4g)IQ]nfoep;B-8[q ,3ɯ` =@ൠe~L>Wy&\Ԍ@"*?5)t(k@f>=Ieҥ/鷏 <m:嚻"!w*4^Q;1?h?kP\HSB.1Sr hNhZ `^px$ WO(?gv<^̜n+'MΌb@1-1f5f8?iP$dIY5Kя?VgFЯxEZs8ņG,MUMV+6R&IOE$&j{Y{#>OiJ3$vZQT-_T lnom7FeoUG"HY?I0F. n;̨]^6ȑ(K ^(M*kW\EI^,TXKe7)Y=2j/|kKhT#DH ysA t) XSg\_l+Lm*BS'NJCCB%.b:1DB !z2 YCYi..RXjb'|=n^&֯|`&uwYdb6mw Ȥl_VA%`=zbC$aU?c$'#MA%)oxՓ (&GQmF̴ɓRs聻] ʔuY#R(Y:*jBۛl*d~Z9UAe!'sk;G.L\ ; tJx!jفk}P&BTTHa ⹚/Nk<0R-[* :'IzMxu*q6SSY^ ,Fy&-& T"Z"Ex@al~W/zCV_Uo/ ;h_iP[UWHE"RCA # ߑH5 R0!S5 ۹)HI~ڑ`S`b̙;,QԜ UO](@M=ޣXPA @cp!q |9xU(W ΌQ0/Ma#$Yt׵W>ْCT1BNuKdѭ:.5W`oϛ{G4Zj!D5eAm3aj9D '6$$jÖ9Kv:S[Ydd-HҔ}01GXv%FW[}͚4poYםMoZlʑh#eH7XGREFA 5 tdYdGb%q'}d$"!.'wZaz*`FFaƜmBL|>zͥ m8-'ck%$_O/|EYi4 B."9F`@ bZ(UZR>pXirɣ *E7}k$t7(6pW?0$ƃɤ[N(h-wtd媢zZSL2ۇ+RL蝧[TSY۽C(oFp\X+J[ј+Sש|/'"u]gbl2r/$v3y AԽ -+0f$`ONKpG,[B'8W<4n劽y95Yemhk%F/J hqsm+," 4@n[zk?E跨ϵ0lTn܎Xv 8jJp7~@҈Jn>3֚&&F"mo}iG X24[raŻxɠ BFt/W' 0nKB!V@"~,f8'bh |y2&$1kl[apNp7 ^׋' l߽ LPHBpV; w]!Uˑ`)FXrY) hxe럀SV͸iC^u260|AnvQh!_>LjZ7-|["VL/rG鍍.J W`UDBIVX$ lEW2cDF. Mzg߈?bszQ%$V$[D\l51/hE܉YmR)R$0@&MZB;E`cDNsQ~Ţ$ځ E^*J/V94Pe,#qgޒx̤^*RGg&U [$zAS ^($=c zN9m.g8&JUG`soDP<_HzEēdR&%BI#:[x'ld8Fd8='R`2d&"@5: xD@QT.w<ʎ?N A!lxMv6#{oУhLiLuH WtaXdC,UbVd+N7 "BM `~vGp1x@uˁ,ªpBzi[_8TM8dK< ſ5!bb˜,}Dx pq-~ 95y{[+̞Q(p#"jl51%AZ=-wN{Srrur]+eq=:Q<XF}p.&M%u؉"FGvT.@Uz  gO&YLuTY,w,JҾKx 3h@YLl=qP3;C,~Q=II,8J'oZ(ZNCrZԆ9S4qbKf3VmWs,p.bJOkԥKo:*=?)mz!BUzzu+C*I`g+bܱE"P1$P[1NuFAn٪#2"1rwa+ʅ5F.4/$FXY E6#J(i|CmTQ'vROvTyf[jtu-\+@)$ȸ!xFڬ4轴tW,vTDVq!K8mr soF3UEdj-g,$[.'>mpȾe\;wfrsב({lK a"~VNVZ7n?fxEt zis4:i[Fx/ߟ"Z8-8J@M;zRl􇐦a\KEƻQ;ͣnh?7nrd)ME7n\$/5qirez5Q5jUOA%ybRr'65Vh[۵k蕂.e,'ЦRLc LD5g emsra %:Rfrs˾L5q T^XD}.ԥ ejs?g~QdNJJI t|Acf!ܕwkH,UI܏$ ޲>xѥP̳4biF$jY΍e1eKj@2L^1^7NCWG5Ltc2ܗ2-fBB yUii~XzM]Rxs k67;xf-*]m5n$k"5+Iu\vn<*i;aP+Fn <$ )[BpCg:&H"9pZD]U!y/ǘ/mq C`_ӌ BC!%>2dzHa7 I`PYVg#L 0;o}^,AqYbT*&.>75<A 0G UatkB&CHrPD2^!&8bwd.#x~O8RIm0h͵)&vRO9@" ={Ň5'[\6WF!4GsC%SU'ӱiHY &5[mx,.*֒ȀA0~@XQ f=(hgb2LL@sIĒIrC&a!.K'NbXNч85I/wV3WժȽ c5hZk[PboHj)@v9k guHlBcIDF4Yig؆ ڮ{qzDٟk皵;qSPD鉠tD9hyB"Tљdve9f[]Lfʔ:Ƞ:+Jzr[T&#F _+02, aWj; yc`ovvuqbtYXIս4W_5#3vah{tѢPd%C4N`x${}2~6ÍMz rldn5idxr9N!`ܔ~F)!vwˁ 8-Td"F֖穷#!pr __*Z`Uw G%^{|8q)lJށl>F EЋKMjkY[e7 B<Fs{BGqmwU]Η ;}Q1چ\* $rn}:K2S}R=uo$QAr- j#qO&3DlUaygW%RIKdRO n8ASCeÎ+r׸m<G譆ڝL4]\MCZX='%*\KkҐ` Q}8V$/$L]^?+~.̦R״e-Qp s^{kW'13Y)tP5$c`5."H͡Ǘ6uv'\$\٥"p]S0䩋Gb[0dA.jB-7y i|yXL&|o{X1vUm1*obp뤧L{V)u*t=.%}(Z 9"nL.ijC-(3mygJA z}޴Wsp_{ 6~h,=8Ј1|ևzvؙD7-OO?UZ"gg\..­ZF[WA65$݄+ U&ScM9GP^ %ӂLDUIbD`{iW<=[.kkܟVr.TӍJsOh|aC).UvWH ʂ0u8ю#6 K/ k!bJi5ҷ8dju 3R@nrp&qjᴲe! .dK A;Ǡq rt?s"ĨcHh c *,})8?GE߁L"'d/ң- wd"7b0CݭBA^g,WL\ǗeW]"ZI&KڔBr)T@dwE> y;T~6g`vO3QXTnLF)n{ &4ބG>HlTf`vU#TR*|HEUmJ{6wʧ).eWNqURʆk d$ P14s$H0 &)u$+75<ZF+,4TI\}Em=vA–SZOaDJ:_ gP#e6;zޔJ.pGtF=XljY[srH." n DE& `En̤ZzHQ3҅ϘdҡP} 2 ?QT׈$O17h"hI-׹GH{ң8{pY07cG\ K[%9JX-T鷾|e;i\K#QV(򉲨&S WܺX뒁`܉Sw!2wT4YPsoEܒFGvhbdcj))%Y5/_V-)G_M B:9+3簉+t.y Eg+F>aۘ"uQi wezڿv1=HȌ%oYv9jIV/έۜNXI4]q J.zz'&Ik0#KXYc{ٰP,5tgL @<[nu_3|޴J]c`V-/T>KPŐ&JFQ]J,NnK-Yج~;öĕC#,dڭE'4k^މ8A\Uj"!՜c*qcDWɔЋE MM_&+ZSAG+vTq/3䷔:଀jS-1ǽ3q{ouFZut)Kn(m-V)Su BN' / J?ːo!&SĔOZdB.&>P OR[YA\NH ]īCؑ~2QI {hE0!DILX;DsI ԭbyi}"֓:ZJs}ۏ'*qC *#.<8 ,CD,H5 *x[Fم,#*62ȎE 0Yyݗ_iMRs Ғš f.2 .i9T/@1kA ^n|ML* Ǐ|lE_CKT[cC(~Kݯ2\;+ȡ+G0MiSB-Yf-GDl1W:a^i1EEX&# JMW:ӸGZY&M4[jوSIQ0sEå ~"XN@ssTM)=8J㑸I'g쑴R-XD"B_/^ZTEÑB_Y*w[!}xuǸ%K~*f5%t CUйq@|_*(^I.p(.ݘ5ڱJWQd0ĭ7f FȰWL}Ƣ!5N+ rxIIhIр66t(dgR$2N~+. jvS4l8:cI{O.Tt2Ro%MuQq`V.I$]a~$A츪f 4 q=~ df4r()"9U#U, >{&MBCI՘ 2Ew/22[*Ct^Tv:AX 2oNql}[ NE8m̃r5qiG[cۆg!x/IdɑWce-EF3d7PVE Q' KkX?ш-Mm6;lJf*9YR l +kf8z8q]b 9ƐT\ͼ;=D)#}b# ˅RX4Ma+seǞQ,oNV&o#HE@ t,8-vr]6j9ia:z[XL'rbTSBh%K9kB7J&8P(ȭ&eeU h Ptcg5A/, v+|)r2f{z.Wds} JO@/ׄ1‘P>mgDAeJU(x[hIFPiU3u.)u1q@SAV%J"]Gtom XdD5BBؚIA V}sESbJm8h:Ny'pЖg׊dܶ~%w PCl7.& 4 "g(0 RJhc ӄ/q>";eWU#BH7ZB#Ck=QK{Y|P%8ݥ*(訾׸먢K&-sȼl^lT "vQТG5B՚j2 *Qjv )9Bu+u'eoʀO f%qlze'qjpg2HSm;pהL/F|=sхΏ4:z;W܈8M\6SxN WRGeB#q$&L*T{>X,aQT n,#&b'Y%RW;*bV<_M!-"i([$e'Ł?" i6떹TO4WgZu埫:58[GZ%L"t P,N 0Hc(p&y)zvMZxB;$M /ӸGtbho81Y&,xk5,o^K+)F_e9a D1bKIX/`{tM .h~z? l!̐cm 8? tm#5~5ğq_(·mvv2.rATW@yc;YO<Uv /^%6jŕȍ+YpA[n'ި{G+,k\Qts\G"vMsa0Ľ9xF&mŢXj&${ZgYʔ>qKB1b۩!C&;sl=@^\HD=;[tuXR *Fڗ<K{g[ʸmn)B1 CP|nǦk)N[ͽ}BJ Rњ~'rn;f>{Cbb6obvAp.2];*[.R7$%AZ~@|娎"w5{j 뛊h[ c} &+P>5% v(ɓDEx@dé&%8L8m/4/ z/U*?34*t!E[5)AvB/E‹΀G"/0SEۜF)D,}},W =rbo GLaY+%ESd7 .{] % [{K:wWaGc,I秖%dCoM L/50ZJi5v<NE(*U!!T!1esO9ےQq]o/5mGȂg(O> %¤Wg/My0z%=ɚ\T`i|ӻ{ĩKގ:SEòcVDZ#aѷ5\L%t9{1 P]BC=ء B{[;G9Wѷ=${ڷFj%JH*.!-HeZM+᷇o}bb8B`Q^T)vQ|g/噢."3 EcY\Է>9q[NI4zi1y8UD[_be3G_D@зӺW,kV+Qa:nf]W'C7*yj4xV_oOHTX >;NYdђKz>$;K+7IJ/ o+w2{n E.\G ]cǀ lE'yl\ղc:F![8AC>mq{F?BLG$rUL< c/aYhuE+L<b S\'  4Eaأ Lk*go 胓@ϛ]62UVYI'!QסpۜtHC /~,lioa-> ֦.7o1^~ZpM4K%F2A8`QGzh`S+jgg60!k&N"\ėzpHfXBꑈ&CpVMB'qccPL=dd ~Oƒi%|f KdCj#{H\6I"rH*NﭚKjwFwμ)!eaa%yJwK3M.5Ҟg*ɄXZGCx1!UAOkxo5U"tk2D 'B9%Kt0'NZbC*PD.{1Z:\|ha=:7ƴW*j2l?5>$4<ГU @4q$樭RdB(x5*? F[=;CS98RnuF 1nA,șmPZA;-$`Cz%m,ڌ| o-xIu;aÀ )!x EASCE՚ݢѵSxF`~Ύiz\n&X ,5Koar(OD(p"{BӇw4*Z{8 Ru3"#C:#*Nv7vJ;-6Gt!ZuF?}s\_2qzAgeURөW8(ȉ_r !‚[a-kmY)%c?_ ow8Ԧ; 9F 4S1#,iDOܢ&@N_cnZUK;R<UKE-l[ms,TXI*06T 6UQ^ g?friK*&aNSMu SL"`91ՙ)812L QpPZ$ՂcTy#6,^MuoyV֤Iyzaȕ.sN/W2fGT,6wDoj3ģ̏y:_nWNY63e鰖=g"?J%=Fjkl' Lvt`ܓIOYM+881kHȕ/RrNQ=Q'P)ʞlZlw Ca I\/z ݢƊȒVz"ގeen$X!EEĽ=[@^,V U#h_qX]DmHa+W㟓cYF{WO8ȼt ñ@JR HijGk< ȪE h"d lbJr]"Yn6=T^XmNu{[y&`9$Ii1?l,c(%ϧ&petLtSJ|&0vY>쇰dPd=hX}:TU5:2$;XŧȞk ^]/XGa 'zi eUD6Zn%2+8Yi*pNNjwLln&IuFJnIk؆8"^ a5 vI'~0D]HtqD P 1]Oߵk &9W+L9oVKU"dr$| h82k&[b_smpT۳q30e_$flA1!i$b[eТn4,y Hxpo) ࢆL~N/?,H,wA1+-`:IeNhnLt8/]O#K`Ytu"3[ 8 ._wb rB~MKb8"(~ùɕsj u9jo/tPVdGH־XYSO3P=[u&B}U7Yx8g>CFTk9<8^vm.sVkh&_uhwHmLucv]a@~9S?a$ج;[w(3ta}"!dT:Uxxdp" ZJJq[tQm:nGWI k:btbIȡ\rXͮ5SG'Ɋ(J{e '+ c79u7'%ʜ`iv>Zs@ʘyLUKc)!cQ$BYV;7 5\L^u{́b ˒+xRDM8%"zLpe5؋f4mnaUdc̜n_LDsD,43߲Νs As&~`)^?~jz"9q;n)D x#C2 %D#x:&!}1^45kb6sMEӴT]>_(3זZgGܢ`\LSQ1 o Rx?06>9{b pØ "ȜbPˍ6en\I{聝dmHJJZ[@Ȝo$+`xb~,&A;T8 ~KKłU}^AUXR@R)V8,j9O6A#gbBn0 e[`ma䫵C5q?^#I!N@NkxSC"X q%B <= Ue̮/ّ<"֬PIWCxBPZ gu j򇷓`N)l%EvאPѶXZ/YiM`ܦ2=$%'-'gx x uѓ̇4aБF~"E%+17ݶ$Dc }>Wzn0+p~}ʩͻ?XJcos*)n 6jLQ-"ܭwgYS+͌(/#wDRQ+"੯ԳLIvuſmʦ |.tkKS*=1'rm"V`UPȵItXUB?*$YɌZu S KHA,iʑug[ )' yÌoMfy 'hD&xx@m DIge甇<ʁ44J4] TOU+h_- 0^r"z֭ ){\-HO9涶[R $g-SM5TN $9RA#.EӁ7x "`@p/7@zMx'j i9`H@β?[x#*|xƌL6B|:H~e#i%5/%΄n_SN1ѝZ/Pw/ą!}_V&Kȳ}S:gYC Lr"0Uw9NF$E(&f%amTd|nL}xToMʲ1Sӫ.0:c,B iM!ON' KoY'`u}ytDbDÓexdh?&㊃0H#$1?JY'qY,*Tti{=+,ă{I E9tx,o!EsN)pQ(B#nNy.\{۲4)Sc:"B \ 9&ˉAW+#gVY=7DzVQGVY|M)a 0*Z*L+qHb;y'8qCRԪHvl(*O$yb" -BV-MЧ*Jn; LeB|)/65oI{A Tr7"ukY"7H|e_r6E-–&:ϒ}vOHE=Yvh%SeeK\ р_Wˢ2>Аz9)0;l[LGcF *:s+rDsS@_nLgIF-*ٴc-Ge"t^#fBk8Y^hS/sIKZDJ:(US%?y Nщ.I\yܖZ<9;:U5nHZݪ71rz) ?ѽ|kՁee}>jXْ휘²"9f{_lS]P )R58+sQ/&x )acK0;A@2%Z ?G+o4!}7HUJmb/ ]a\(#bYѳ".J;3tƜ"! awCj*! O#u^i1uM;ݢzdķMf{I.! =fnBjYJ$殩Q t(Í-[3D'{=fe)*"./ە(?zݐ$;oÕĶgxy'Kar4@n,*)}*C*D&K0"ɋ El‚yk0DVC8$$h@Oe%4)9%.ܳҢeH| ht kGg2Q3t 9h;3Z|@\̰Ȅy !<;M*imFaѕc%'.,hNϓYc`sj{ pG&%f/g"s*Cxa,N^LRlЀN(F,h+mI>VKy;g>jx)9}ם!/;y1F׳N%!ET8|*Z  T疏{y^J-2h{ܰFl17y(Θ(tq48sVa :e-& #SQ~ևrDN7,[!t79,&:sΚP:VK糵A$R I+#ޥYAF5 yq~T-ܺLD L75r؆kFT6Ard<ٗO4zG< Xo*Pцo\gjɒ[x}̬g!Ro4RFL Y'c7ob/I3)CVEyY֤8#7A0.\db" ײ-}}%1@Decj1!c/g蛋.51RO\=эrFNy1z#$\Xg~_ysYEOaEP ?r8$W Q_ b YSyI5M|3!k|&fo"E o ntMO+]3TD*(Ixk'%RX2I]qգKnu%ZN(C+p&zc~/fOșu&PМ'B5+c(5Ƒ)tGWe'ƆןFs[S@:mhs톉ڎ^|Ao%i|nzSvlVEI3JT%WR&l4DDp:+I5?|*bȔ[H*o"S:hUc[T@DB*q 0eQՄ=:23zqr6>NtVp"-nRsTQ#ĔL\Vi.Dp痶f\LwFt*}p^Q\ n~wr4 cgMHZ}IVDAjrͿD &% ms)2IXQcJۚ1;nkM ßYH55 \L>]1Ym%0ϵ8vb/S6M3uY;CcČW#(􂊁\ I_IX ΄pȫ]W;X)o6Q繰-Ʃ";&9*,hP-(~>8LR;.MC9,gZn#Ii 6A"{|!`o ܃((9ClNA"/yMZ1*a^)dmf2MN ֻa om|x JjId#@Q~ǽuQޢʹH@Qˮ0X wjZl_ ʐ\ؘTqcN! $LɠF )k 6Q܍~Rơ{&}~`,Q+;$P7Q 8a@!BfUk qˈcp@D"qS} 44Kx& M}v[CvBKܹ{ioɡIp9A28Ў/r *I7fgASjPEH[ w3!QQCf3 V7TfcsI:酒 MeBqKf]H&GK bT3nD(6<Pz.x%1ų@%0CT}9x ]۬Yz݅`}E$D3]_N*<([Fv+e渀Ds4Rlr8t* &x{2"i*>a4Ju$ᔇ qW*VHm]([ ' W.4>b?$Y 66`IQEm=CBȜewkv b9 aW1»K@QsOf8{c@њrC\ҀĝZ*H(zd^;yء$>LfЂd[;¼< CO*5\OL4Uܠ5ǁwS9Fˊt y=x Vf 2=q5A仱(<`N杀0OY$[T "Аf Q늷wp=C3k̳F/ Kw%.׫Dj帍)!JL\f: RUGB21فZiHkrXo It[*Hp31p# >/@:^yاҥi8N4h,ge*n_- zxN@h2:X%i$skBss0v+m =eщp'~h%ksH+dvl8p-Ju-0@һXע5yQJbf_F*ҁ7p, ep׊T5.!+D==ܐYx}5(,-}DFA*%s[`pÝ-Oa"|I݃$ W:i[$O]MqRe4KJb.G +>)m٫=l2TJ^ǻɬV>ҠVa\l?S*тRc[t7FS%XeUjr?XMDGsHv4jIe3m庭1F\R@`bY:wEQ8[ \ '*0N2jAK/^r 1ԀLw~i/缒:Eԓeb,Z3k@ !-:0ix1B_x1~p/NG.JJCz Ni ŒCr`i~y-rE>"׻%5ZXAzeq+U/Ս́%_hg !R*zJ%TG}'Y__̴u UoC;#~03H-hT!΋A,i@ N=Jgٷhf U-Yci {/"ږ6=GYY2=չ83IU4;JjPdo T"oƕ̥WƎK0Ҭ?pkg7yp/V%{Ƌ\IpBR7L˩%$\I c$JTG j/ZUPIJw#yHHI '׵ݎ23J@ k"؇a>C< xC`xIe!uifdiQXm =M *2To4G ']b* UU#dkHeW`"xN'q)éκ}ж("_ ]?-V szLo|g*3#0溹/u'5LG{DLZP N4Dµ;J*DnHRxi'ܔj_y۸\\5V\I%FAbדq.o +Ӷr*dy-2?A; ;d`T#l"]7&Pr=nu8-l*mW_UwH:~(?XI>΄(I}(mBЅ,O9#۳r#Iv#31Paj#*"tL`LНeʈNGv(1hz+w[~aGs`)حpޑ4U԰"NXgLDSt;ƻ~r茊-/I- vkN1w#8 Ӟdc[~w/ L[q}%>5 x%/|b5/@jN\†nG\ O(}jQ 0(}HtlC>0B_ٲ`9,7P\Y58>>Rɜeq;D#"4 $Lg &iVup~u1AIY{^P/=,t+~8*<_o]t,Sr:??(ꟾݩm^Y)|8hh%Ƴu'J7$0\gv v/‚j:Vd48o]?À0mf-z`JؗV`_4q`z#bFuce`)cCb?6Kw#EOJ$\ rmʬxC?l^I:Dq#7Pqq4Z;'/8p'ogpgСBg>VK׫@I"Nof|^f}J籵߽FƳ]O@)ꃟpB,a]2鉊P *VUT97"kD)׈}LPW)tx%Zv,b:,*l%m], ۍ2|eHTVôF,?d ĬTiUi Iwt7“ wT!/ދJPe6 ԿU,CɋSpZ/T%kZFY9`R><: ~6[2OJ y* =/m1_Mrvjׯ١ObZAaIK~#5*ɖJ޷:JM:9Xo5.eeaơ+<*}-L},,k?O('ȵ~yh뙧؊Go/ӟo/BcL1 JǏi*mY/S_'X^e!D@&|D!>w#&Չ"rA?]bȃb,g",)9s4Ϝ2 X vܕv$jOS{0Q>0` 5Sz}g&XFG~ qAC.wEQԤLk8)Sj-9^Al46(MNN;02-̶(ƍyq 6J&1)NJE)͠EժfbzV"C $`X6vaU'EfY$ۢ5̤6*;(HG[P9IBFpG:-)OJÌcTk<$Kpeɒۼ(@fEb T )Y-'a)(c,l3 A[ɝuwtdVR'N5V2Bo=1Vy3a77֢(rK^##  D=94b,0) |{dǂuT(v*ҫŭ/@mZE3U5%!2\H 0g `I1IoKS!<O-< $+1B#G`"HBy+8 bڒ+L z&& bRiu%iѨ7E >E^{P(N$8تT 1|ݩI Ks]ayRQ<ؖfQѷΌ1cpv>SD'>NFXsI NdVYui>#oMx( n`EvAH{W} wt'~~; CX~eu1e&ߕW 52SǦ5,'(G, iBZ l3!*]VhQ;bϚ2]r;QL*gdae$[|qٚH4²׶ő"! IhLUt~  A癋X֍"} Uz;TX RZv^Z|efC<VR[ eNuƈ}6.̐@`IEtdy$H:&:b'H*]x3꘦1Kl䪁(`#͕hIk769h留 MÅGYxDwߺIݱi-+CiҪsPRSQPA+)4Zz?LVgvʿ&dT:HYGE=k$8K$#f"c|J):ǔл fG[D 9IjY]Z2z8_ L-~u;=?6e/3~UmWc~qE<" ?6҄Yibhd!JX1qci׭ !fBՠbiLDܯws /#jB-1IV屌Pk|J?QO"xc!c,Ft?OfVia0Pu*XPޘ?)K9:/<$vZy U&(ҹw{- )Hrsh<D{@熲4MuTVIK;C4(,~,P%?9zw6 `$tSw] ;[^6BD{W3sePospuGJ-bykF7 zċ;&ů|XGlՔYE:>sDq:yO[f$B@?ZnH+Z`o-Y> GeîF[W]{<йh󁉯mv1T@ _]ܱ]m +YB*8'}tש"_B֟T*e('W υyEbۋ#ٙȒ& fdwa#@RU0l1ay1u Hw,'RDܑUf?q}b,/BF\C5#;ADkT/V /u+:$d;$Vy *>D m6#X3 0Ǖ&֑d$u%+ $W ex 4U(LP2:1 ]:ī{r0(q:#jp6B[̘z6w5S`}TW`Fd5"TFޒёǹY ̃TUTm$@NY_nXHb/ۈlђD-)Q_&W砏a[ tfǡQqɖboI(Zi&&~X1v+DKeLkNOn1!wifdJF{Z-!֜ȼ_J;jK$Q!&Y+  =~Lԟ$dqs ($3kR m=!k&ײ?߳ZX/Ny Wro)Do1Sjh[=}!I`oJ+QOZbN77UFH;|բD#Տ_<͂+1N<-䄵4T}S7^+I{{bUF]Pk\1X̤ʴp_yuk0tOfdMRM2u?/#lm$F.߉cJ,#giw+\)vHgq=jWDF%_opHq\NZO($Q&C%V/.N0ndJ G 0?@Jo4R%ɥYpU \pq:Vnyp0DJtƪ;ȖrpX}x*:ceVpЌX,+1\T.ةn^V&?irӡJjQbV!lwqY9q=-X(c8qi4Z:K|)WZYD3TG^'KM#X܆MUsu#'R^e9^s`%YÈ p҅Ci N܊ٹ;3exxg5"@㪌B )17FΙ˜(ꏰ<'<9!L\a*$0톨RZxrw`%fr~V[4?ѓoLTTᷗkLlvPI)Ie!eq4Bs?#:rDLQ|bKd a9’AHhh^Bx U+I";$I2)\_\*~ E|F" #/ޢavSBĵgleI5fiQhC6r}J]Ч:f~CJt>CxӉ⤧jje31E%xzpwK ğDR> P/!2ARnn{itôKS^ʄ 5-4a=K]<6q-C ؇{FM.R+můq[gx6CB4#6RTXiҖˍY墴5XwSZMsMw[j 5 i{~@.-PD(%7B*)w+EjRCA۩}VGc) / + ƞ ~ @' -C7q^.L’D^xn.0F2KNke%oJ8 XJQB! J7k_ pC2RnP&7ҬsT4ПdJˎ9?>xk׆ 茬zC?r,TFAiX"Ja+PZ2QШQFyp')d`C߁vYPA:]%=sT"$8(/JsL Tc^a壕GaT Α~PR2"tz@٢l9VvBT؄tA|yTc7V67?9Of QN$1V(qxRL!HCJPȱTH\ߍE^/ݏ̋4;.oItDFxߖB}ti_6EaEMG' <(N!]BS1=o6E_O∛u~gX9eɻs j9W/Iŵ%Ӗ,bM@@$5\"M>f=…c'|bVdqŒ_-qaO,bv(K~kMS@@F ;}w 2222k-F]v f+AtzA<̰glacPXw(RUZ煮WNׁ+0C}abDW72JS T l3I۟L#uA9E?(;L&I% V0u:hq|6c{i>i012Ť;nي^a'3O3BLvhl!P\$^wY$BJ U1Q0qNlW4~K]ol]"qS%ژuV>,>|'.n+l]_?_f:-}q(,x$PII4Lq!*K#1 ,֊zM5$f{"G2yw5̹iu%g8\rš,P Ik9<^~&);>VB(Z:rd®Y1`K;CQd Zqfo*!T0¢wb6sow ZP $ ]aUِe5Pٮ?MtF_U Ve"BQا{X!qKtJ+;l˝tD[ ~&!L@+8VN]A`d`Drщd^(yL33 kрJVNlh㗗4ӰƔ`TQ]V:d"\[Dɋh&0ieUOMupL*ubJwЀe|vk( hsWМ{AѠvC8(g'}Feh=Rԧ:P"kC',^3S:6nmEHWTzH1©n aö#+m@˻pL̶A7.H GgtVDBϞ_}|8I*eb" |9Zd|'OMI(=)Mҵʒ2`A>G 8wyν#Ll8 箰;m,NRI"bzޖN"k‰zdHA|!9Bd"k^zquM"v`@[[Rc?b9䩖LĂ?ԲY(|eu _ܲ{R*MqD>31oUKwx2זVYft3mj)i<$ԁv kVD šJ8~_| {=!=eՇأ@5)+LF Xh]aƸ[o5IɻoQJ'w,j]ߢU v٩?^Z=?a!ϐNMߏ9 yTii&5\wޟҭQ$E?)(žVO|(.J-X8c軩e"4T~ep&pӈoį%1a9'Ӛ4'hnd},Mӈ8'Tag-Q>Cn%y:b?–K3fC Z4dS6uI0nW=bt}UEeS'֌*tWoad%l0נkbuMdiYTT$}  `</0%C6`gu,' {۰ B0ExBٝ',=\zW:54  (.¸-#\ @|Sґِ=yY0SV)G_8GpYMPQ/fbc|]i',?)yH5@!c<1\Wɠm {\`"USM'1Q'yXRծI 2ƢUڞnȆhن !Ħ ?E_F(sI xc IJhS}@FYA~N%R5;4hLQ^%d~2%=e#gA S'EFmo8iN%jӃ++ yb](X!ɠA.`a$ŏ MU+$d_{W!g I@7ljC4RU bTa)ZEY;]-*LTꥴs7#)tx Bn8+Ƨo`S"y JQ|iO$RpY*nA3{ ZWnf]ٺiGX$dG"ȡeA!eY#E߿wb&8lM>.D~0B< E,S-W_r&\5,mpPe}F732\Z|bLA8t1o_fʈ/FaRgqn^#:< ^j 6e,hٽs#Ŕٻ3-{jIkls&%5-_,K_Cz~WUdBh/)&6odN8<7CaȒsu?)-b8.eXkBX{urIWuVW${Vdd>wz׸%eL'+4 ZlHGatkj@QH8T[c7&+MjG `6L(eD؅-΋&0[4UϨDINL~&X]o2c)p%+R_bI]6rR 9~pAgel"\ nٴ5"=s2F%I,yhtM[UKCbjU>`N&aj"ړ&b/Ktl}>̂T<:SvudfXVƪ|7N@b*ia~Q! y6@]b(yZ  6Rw**kU2)ﴱf-+]z: 0BDD[NnT[zkGv~ R^I&F [As5aҗ)'@&Уb <C\ "qh%MڢK4\P嶊&hG׋'ndAx\2/.s+;mjBLؠM`}!qu~UkefzHWd $P}[= /?tB?F=0QI\9 T itM$:͐_#fn n޴&p:R8^o)mX0k Na"RP\(^Ƭx pl/C߳V *qCS:AUj3:,#E]A%и~xʝpOl E\5i 0'ς8͞ٲ-J3|+[\S1*O=`'^XDdT2 juۭ.1jTEuuyB8K/p6pCmo=-~)Gʩj:qׄlFF6^ア7sZ>`#|ƫ~І<3 QѢ$T jSx3JDc,8߹q#>5[N-QE;i5ޞ]3IO( 63},4[֦TDHD'b6gF C$dA](>t(mpd4X2hC+-43m\&NqQ&#Jp @zPTmaJ%K2T\d,B֬ckT3ͩ UZyu q ?(Nw٘78:WlsMg+\YsxvJL6`z}D֞$,uA:oX48hcS-QL=E//7]"UsI} Knj*ByMVrȕ 9F?v</jCIE248><`'fsalj|W\Û ?\ʥZHzr Xc1B,6^.Yc=o;+ȣIҪ,[U Ċ| ;(MX7(+ꇾ@'(kר-y?Dd`KB8 x*5c JѓíA6hXި\ vHzqB#fSRF$ؾMbؾLDyTԡC1d[;L6[EZK*ӣ5йҜo#\ `Rq VxDwɃ|qqrS #q!3ᦖٰn ]8Q63Li;9W^G= ܪX.4-EM)Joѕ'eδnW6́yG=zΒD"aVa +Bvn5{yI"[ D|9b9,&ZS@mWj[Ъu#J^dļ 賰jW2f5xJr |vM1Xt#tB '5h|:|,M OBuntf.Lc$w0}VP:X|uE~+~HHZUV;'o\CԬPE)ws0rGvfy+*W H2(C>15B_zv1zT\dgE Rb[ln6B?enhr.0 $Ju^^J#E˦MWO6@ 5-*-ku@Ч6?ㄔYXMxo̕pUw7$+hus1d!efyKsƃ,߲ٽJC}hV   Q6?J'9':c1GQ5fOBԖtIJ!tHo2>8zKX:hGS?C/CIj.i~Dd9L t[)5s, q$ن0>''NPG;~GB=IsJK@+WQJK-;,0&v {&nCϢQ\ts}"B9>hWpkh҅>Sss|SB.п=Djg[VbJb/U&öaEpǟy_L!Lc:WڎPf)/+qz۰hy@(iߕCxUˇv5̃kauaV ,eLA+uyȖک:8rTd*H;YmO滦~QG~K njD sZ~,hT0ҵ+r^9YoadTݸ;ȗ*4w;l狤I Bȴ3QFx:]2Y'y"Hg;V*iN>Q ^W.C?\t SkWQТ+G.QLҰ]U,0D'I :7U2 DwNbH/+ֆqD(j(z \ k+~ѕ`ЕI5-8]9txIC=/cYlq?)'H! A7iXgf۲IBSxѹnY@*~F%@n#4$={0./QOOrDB*b\ IM& <9=\pX_7y$Jӈ:!F7r6P`KX4SJjfֆe3+b\?` ۡ s JYb+ Q`YS؛'9czjJH(?Xmٰǝ Sk75(7%4|(DƠ膉]N(F艵&G/>%)JÕՙz`б d)[*HV@<5*E3Cڧaa5 Ȱ$CG.ܯ*ZWƝ):PW V `IRA3ЉC| +5 fN{ _*q5Va7~3Uԇji`dn!A`!+Uϱn  kJ9媉/);l4+D>Gv kd.cZ2=3f m8rR+L96Xr"z"lwq˕O؝Ӆ7vi),M g~=WdYLwԠg,$(`?]j|ELYȉ8[Sf+d[E7]RkQkIl@xD(f„҉Ѓ%Fns-e2HcꊠJWy5bZ^ɚkQ8HJ^#1 HneXV[lq LD~cU1C7pƺ*>< ]2i^(!I1M> &3G@H n}Jpo!);bvxS#0Z9gQ`<5>LIImS;#eXM 8,hhWhA~UB紑zLtR&X6;,(xHH 'oЗ/>Č"hŽDgH*6$<}B,XUdˀv n?B FNc@H쁊<@ƑѬVKaatdFd '"bIQaKTՄ6T:37:R ,; /ia-4ՖY`FL5;3t@zHX%:7۟c k鱾\SKh˗=L^zΎ;ԼS9;^!Cݜy1spF`Mcbt6\$ բnǐ' {V?PPL 뱶 HGof[ˉ B,3F>4;܂vWbD%bXa N7Y%r$1N`9yd2kvە]_DcPz|dWЀvP ;5vS /F}gD7LDC2l8s06C&?Z\?~Ӗi3{0Q!;`х >!aZHM >;*( Gjh}HK whOQ99\ g!ZW&ȱxѩ9*. 0Za6:G`Md`4('_3IPK'gp]k뎲hڂ8"Dع{[4$HK j߰]3+1M %RQ ~]+dyB-JB!5 rn)iBⵉ5ɖ/^WTOo=Z5@,E>BRaE"vc(!䴲-z#LR}r] B0`wȎPL_Z0p ESqLVB ?;gW)l#!>Rgo;M]H@6x6}5^OPK2 R̶cO@rd;sKh5kK!JfSCFjB9z졡ӈr901f2Yq]XNvjP$*. M.DʃɝX2{Ҥb ZFbNThP- :jr$OPj O5(=w%+ZI!(G\fK~R :D-tu!nCBa_AV#El a(HG?_|qz! oX0l^A |4X􆓛E:xL}icQȉ֬ph:hCCc 9')3U]edaHO_ z.2ue]R/QsHo>zwX8K<3Tu+ ڪZ78(J,e"*ݎt<$,h<m6NY (EYIĴV@"›0x.*\ԭԜȳX+jQ;j?v+ɖdޕN|㉚P[Lم)8(34kМGmbM8ƁCv ֹϣF;-BT㣋h&¶c=Vqm (Z"| bhp-b.Ԇ_d1Ӽ=t/F.e/eM=B4F~S=#n`;aɾ RS_nCFz]Rj^ZxOʁ #D$A ,,evE#(*1^SRܺdx%-y瑟̊*I 480<`Fx\<.8A=>uE,%6[D!X3bPkaBSS ~4zK1hc-ӵd_B 7]^P841Kt5;6lnKAsQ]2o fŨynD%i{עk< ӌa3msEy>o bq7 bIP(EPD SG(toz0xt&AVEiMa:p]#;l(Y.!أfRFP` fXÜ}cY[b1K+SmLD|R ,5zSX{AtπWWd9Q}ܗH$KM*<렟E!mJC7:S8Г H,99O)IueuӚp$NB{ ܿ(Cˣq(N{qvȏ={\P1rZ>b[>W1B`pBm|{ @LGZU'zvb[-θ2;ڌHd[}x8x"K@-s*uIh8 @Oi2Ȅ=v+۩DL!hCq.PL_P/h1)u;5PL7eB Aw*UZ.8$)h$07&~/oK꾌>jJ* `>W&bCȈW V` [Y,"-^Yy~ MrXJ^O⍰3&{RFT㋨9*d J:pL xQ(N5GU A@d4&1%HNu#s%aI*Uͨ[astP4O֐-eYi*z3xG`E9Q aVT%aL -3l@zb2خ ]=#4~)fB'';D%X d^˥P# |`mg7q1@4[WfDc.oF# M 'W+R8\/ٮsi;7%6ND+p8˛oo`oN_*3:/+%j3]vqiSM N4 %"ЀV+{LtsL(@nܥ4JRӕeB]HV YaIcX=}Sf/*%4^ZأH6_ޯΣ72~Ya ڵEtU-tCܼ?KomK!pLhyh .sq%L=*c6=*Ѯi_D`ryf2vmAA8f.pе߽8Te}vF7,5f LΖmQ `""69[}r/*?ᜈ߁_r1V.'}"*'tkX'>XyR]ca^Yqyy*ؕ .K,"Z!+xmf @ WEWr,p(=RI=Kp轺+}ւ/K! ZW&]ӌ3dބI>Ô0<;$D7Zsip,Ck̃+Q ; MY% #6NxYB%>z1,#]!-9)ku97*-_>F^=QarZ!$˱a`^z ꥨbN!2R4 2)cWo"4A"/-KKи!le<ZjH 'QQ:DžKK}R٭x c;yI idԖ7#P'HBj)pRlR(Y~kzc7AUm.uXB[`Q 8210֫/$ƫ`r^՞(gHb{Uw?tuL-!ЎGzӜ+:I 턕Ƽ+Z)jdnx z@z.L`JN Le:$e֤%3\odyLҺE=C“.:Z׼5,b9wk7>&֬Q3;u2׫_ʾ :k O*SUU"bK$4CC b7S_4Uu,%hXJa#a^ -i}*(N~RgljUi!Zq]Vqd=%"|5;I\"+uWĵ9$hvf^xܫelBQL ^2c;a9D^NwT?p,' |¸E"d5cH?og*!SRZضRN4߾jϼf֞S.\RVԌAs0hX;dEF_ȐUtZZXO4msM2 RH(¢FLB5?~ d0lb*Vk CINwa?` GB TEa#}-z=ȾqS xI!7x$ʃ #c M.siY(\`r"pN U8SquaÓx&8m ,uH(aSKw4}8 _Ek6KTbᏠJ:B"gR?N 9v#E_y)JYEO^*p X(&S׿?B+Bӆ6VewaTVK㩃 ;~+s:5p_אv#f5½])"ZK rw{x%_y5?Olu܃R7*JH<]+;[h$jZ| LTe[P`"Of(>j9猽uP˴vZ˄m/Ԏv=jg{ R7O' L -!;1؆zģˤI()6+Q-=Yd tu,$TIJFsWrg&8{E;Ǩq?3ܦ?Q M*[9gBS#M]'ĩȀjW2]*Vڎy%]ǀ1VYJ05k)9dqrX"md} T6$WMiKxs{fRo9h+En"%bTsbһt|6:.wUbJlE91OKf Z;wҚYomHd,%趉W*&c6yv/ Kޥ  7UFSw ?I_`4jє"9)^"[%]*@4[2[\^Xΰ5u9"{a>̕¶v[;8"H퐦rٸggV`XE"DkNrh(bx3jW o @{8*M]a8JZFA_I$~Ȉ+7Q @iagx_0@_xhR3{@DFzLuăVOB2 b/1m2E;pXBUkV0(ňvnVDz SSJjS*߾Շ BMEM2lbXO7Oŭ*-5RP1vΪ<7߬,Njؙ9z#~]l_Jew+3'H2Jtd^Krpڔbғ|v}ԚQMAIMk48lm8D=|Ol*6?1Zzh]G4#TSNh2fcY'a$>IV- 6,PFGӟ f3I\-,I.gtc[%Gjkb!݀5aڟj6*3B?=qվ)מlr{p3t6AK[6lGmIGis@+?}߰5z$N%vE=k&9xN7p<*ṑ٧/w2VX8d/կ `#Բdl,D-M`/`)ҬyrqѳcNAE+֋\#CQ;$dYe5]cP#'CpeaD3,M}mMBpLq.L>7ERc2-z=),YrdB:WK)FHTXVIW\WV9ZqyֺT%7EP&}DRWč{! PHϫmBx&&h6  IyoH g`ucOag-,μLhDNݎTPzތ1#uO)OEb M G, @-r:{ .%g3;ma'?d#7v!asK!.ߎka6&e8+Y+~&}"1HSe `=pbWYΦ QP&y|Jr†.&ZhkBSj迌D)g(YFbN!f\GuކV_Y!% 9Z{^,ImQal.9V =&_" afsw͒[>,H jȠ8X0=b7";Q !c,ͯ=KwϫtJɁaQ3cv/Oܶgq$ѩ՜ h ^ ڹaOv?b40CSޣ5Z ^29G@Dzfx#serUEj\92@A3ю-]-ܶ<;ͫw-N1y8&iB bෂ$O ]uHPۚ!\8XrRDX#qfnM>‘ $&3'<~Gf:k7YN4[JF̓9hJkveLLMVs3 B( ?*1a3 *}6t=`^#a+} ǹ1+OCl.FTy*w怽;[e-ld1d7lh+Morלl bo˄B-;45? ,Ⱁs2|Yl7@ jgFt_*Gi $nHJ",\XR ecd%2Hj'ų[aO s+L#،f>s&Qk؅S;IRv."%eM8oT,5sU4l2Ľ)AAіZ`%X~t[3)F B#*hIf= GW@UyH^TLCpG%a$eɬOͺ Sphjz^HJ @"> -}h2Sko㠰+hrvѨFkեOK})(7s'3L+~Y(kYF=æsrR7 2fszŠR-7OllyBiNR%@eA+kßC)il2M.LZܴzPBM}bMb,ƺ =P/'P]ZDPȐ=/>L;JüxTJ(e?$T2psB ΕcB,0(ML=7d8/n=Im2њ qp @Ī6 3 mWPrkdY9BgF#bKޚ=8V}B1#>~R5]N}'7*o\^ƛ3!{p<0t- cs>< a,mX| "]s)mRbńKDcHG-y+#gu?\'TvsD%7žg#V#L20,[VVsCSRT] 16LFQ};r-9m"؟K*@q#+(0v `ÔI ;)iˠA`)´lUS5 ampSnPa{$bJʷՀllibaudio-flac-decoder-perl-0.3+dfsg.orig/t/decoder.t0000644000175000017500000000153211112625526021621 0ustar gregoagregoa#!/usr/bin/perl -w use Test; BEGIN { plan tests => 15 }; use Audio::FLAC::Decoder; use Fcntl qw(:seek); ok(1); ok(my $flac = Audio::FLAC::Decoder->open("t/test.flac")); my $buffer; ok($flac->sysread($buffer)); ok($flac->bits_per_sample == 16); ok($flac->channels == 2); ok($flac->sample_rate == 44100); #ok($flac->raw_total); #ok($flac->pcm_total); #ok($flac->time_total); ok($flac->raw_tell(), 14403); #ok($flac->time_tell); ok($flac->raw_seek(0, SEEK_SET), 0); ok($flac->raw_seek(32768, SEEK_SET), 0); ok($flac->raw_tell(), 32768); # seek 5 seconds in. # Windows seems to be off by 1 byte. Why? if ($^O !~ /win32/i) { ok($flac->time_seek(5), 437488); # XXX - should check time_tell ok($flac->raw_tell(), 437488); } # test opening from a glob ok(open FH, "t/test.flac" or die $!); ok($flac = Audio::FLAC::Decoder->open(\*FH)); ok(close(FH)); libaudio-flac-decoder-perl-0.3+dfsg.orig/include/0000755000175000017500000000000011112626122021177 5ustar gregoagregoalibaudio-flac-decoder-perl-0.3+dfsg.orig/include/common.h0000644000175000017500000000207511105675616022662 0ustar gregoagregoa/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef min #undef min #endif #define min(x,y) ((x)<(y)?(x):(y)) #ifdef max #undef max #endif #define max(a,b) ((a)>(b)?(a):(b)) #ifdef WORDS_BIGENDIAN #define host_is_big_endian() TRUE #else #define host_is_big_endian() FALSE #endif #if defined _MSC_VER #define FLAC__INLINE __inline #else #define FLAC__INLINE #endif #define FLAC__MAX_SUPPORTED_CHANNELS 2 libaudio-flac-decoder-perl-0.3+dfsg.orig/include/replaygain_synthesis.h0000644000175000017500000000373511105675616025642 0ustar gregoagregoa/* replaygain_synthesis - Routines for applying ReplayGain to a signal * Copyright (C) 2002,2003,2004 Josh Coalson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include /* for size_t */ #include "FLAC/ordinals.h" #include "common.h" typedef enum { NOISE_SHAPING_NONE = 0, NOISE_SHAPING_LOW = 1, NOISE_SHAPING_MEDIUM = 2, NOISE_SHAPING_HIGH = 3 } NoiseShaping; typedef struct { const float* FilterCoeff; FLAC__uint64 Mask; double Add; float Dither; float ErrorHistory [FLAC__MAX_SUPPORTED_CHANNELS] [16]; /* 16th order Noise shaping */ float DitherHistory [FLAC__MAX_SUPPORTED_CHANNELS] [16]; int LastRandomNumber [FLAC__MAX_SUPPORTED_CHANNELS]; unsigned LastHistoryIndex; NoiseShaping ShapingType; } DitherContext; void FLAC__replaygain_synthesis__init_dither_context(DitherContext *dither, int bits, int shapingtype); /* scale = (float) pow(10., (double)replaygain * 0.05); */ size_t FLAC__replaygain_synthesis__apply_gain(FLAC__byte *data_out, FLAC__bool little_endian_data_out, FLAC__bool unsigned_data_out, const FLAC__int32 * const input[], unsigned wide_samples, unsigned channels, const unsigned source_bps, const unsigned target_bps, const double scale, const FLAC__bool hard_limit, FLAC__bool do_dithering, DitherContext *dither_context); libaudio-flac-decoder-perl-0.3+dfsg.orig/include/dither.h0000644000175000017500000000231311105675616022644 0ustar gregoagregoa/* plugin_common - Routines common to several plugins * Copyright (C) 2002,2003,2004 Josh Coalson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include /* for size_t */ #include "FLAC/ordinals.h" #include "common.h" size_t pack_pcm_signed_big_endian(FLAC__byte *data, FLAC__int32 *input, unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps); size_t pack_pcm_signed_little_endian(FLAC__byte *data, FLAC__int32 *input, unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps); libaudio-flac-decoder-perl-0.3+dfsg.orig/Decoder.xs0000644000175000017500000004675111112625104021511 0ustar gregoagregoa/* $Id: Decoder.xs,v 1.2 2004/07/18 03:40:10 daniel Exp $ */ /* This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Chunks of this code have been borrowed and influenced * by flac/decode.c and the flac XMMS plugin. * */ #ifdef __cplusplus "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #ifdef __cplusplus } #endif #include #include #include #include #include #include #include "include/common.h" #include "include/dither.h" #include "include/replaygain_synthesis.h" #ifdef _MSC_VER # define alloca _alloca #endif /* strlen the length automatically */ #define my_hv_store(a,b,c) hv_store(a,b,strlen(b),c,0) #define my_hv_fetch(a,b) hv_fetch(a,b,strlen(b),0) /* Create some generic (and shorter) names for these types. */ typedef FLAC__StreamDecoder decoder_t; typedef FLAC__StreamDecoderReadStatus read_status_t; #define FLACdecoder_new() FLAC__stream_decoder_new() #define FLACdecoder_init(a,b,c,d,e,f,g,h,i,j) FLAC__stream_decoder_init_stream(a,b,c,d,e,f,g,h,i,j) #define FLACdecoder_process_metadata(x) FLAC__stream_decoder_process_until_end_of_metadata(x) #define FLACdecoder_process_single(x) FLAC__stream_decoder_process_single(x) #define FLACdecoder_finish(x) FLAC__stream_decoder_finish(x) #define FLACdecoder_delete(x) FLAC__stream_decoder_delete(x) #define FLACdecoder_set_read_callback(x, y) FLAC__stream_decoder_set_read_callback(x, y) #define FLACdecoder_set_write_callback(x, y) FLAC__stream_decoder_set_write_callback(x, y) #define FLACdecoder_set_metadata_callback(x, y) FLAC__stream_decoder_set_metadata_callback(x, y) #define FLACdecoder_set_error_callback(x, y) FLAC__stream_decoder_set_error_callback(x, y) #define FLACdecoder_set_client_data(x, y) FLAC__stream_decoder_set_client_data(x, y) #define FLACdecoder_set_seek_callback(x, y) FLAC__stream_decoder_set_seek_callback(x, y) #define FLACdecoder_set_tell_callback(x, y) FLAC__stream_decoder_set_tell_callback(x, y) #define FLACdecoder_set_length_callback(x, y) FLAC__stream_decoder_set_length_callback(x, y) #define FLACdecoder_set_eof_callback(x, y) FLAC__stream_decoder_set_eof_callback(x, y) #define FLACdecoder_seek_absolute(x, y) FLAC__stream_decoder_seek_absolute(x, y) #define FLACdecoder_get_state(x) FLAC__stream_decoder_get_state(x) #define FLACdecoder_get_channels(x) FLAC__stream_decoder_get_channels(x) #define FLACdecoder_get_blocksize(x) FLAC__stream_decoder_get_blocksize(x) #define FLACdecoder_get_sample_rate(x) FLAC__stream_decoder_get_sample_rate(x) #define FLACdecoder_get_bits_per_sample(x) FLAC__stream_decoder_get_bits_per_sample(x) #define FLACdecoder_get_decode_position(x, y) FLAC__stream_decoder_get_decode_position(x, y) #define SAMPLES_PER_WRITE 512 typedef struct { /* i.e. specification string started with + or - */ FLAC__bool is_relative; FLAC__bool value_is_samples; union { double seconds; FLAC__int64 samples; } value; } SkipUntilSpecification; /* Allow multiple instances of the decoder object. Stuff each filehandle into (void*)stream */ typedef struct { int abort_flag; int bytes_streamed; int is_streaming; FLAC__uint64 stream_length; void *buffer; PerlIO *stream; decoder_t *decoder; FLAC__bool has_replaygain; /* (24/8) for max bytes per sample */ FLAC__byte sample_buffer[SAMPLES_PER_WRITE * FLAC__MAX_SUPPORTED_CHANNELS * (24/8)]; FLAC__int32 reservoir[FLAC__MAX_BLOCK_SIZE * 2 * FLAC__MAX_SUPPORTED_CHANNELS]; FLAC__uint64 decode_position_last; FLAC__uint64 decode_position_frame_last; FLAC__uint64 decode_position_frame; unsigned buffer_size; FLAC__int64 total_samples; unsigned bps; unsigned channels; FLAC__int64 sample_rate; FLAC__int64 length_in_msec; unsigned wide_samples_in_reservoir; SkipUntilSpecification skip_specification; SkipUntilSpecification until_specification; } flac_datasource; /* start all the callbacks here. */ static void meta_callback( const decoder_t *decoder, const FLAC__StreamMetadata *metadata, void *client_data) { flac_datasource *datasource = (flac_datasource *)client_data; if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { FLAC__uint64 skip, until; /* flac__utils_canonicalize_skip_until_specification(decoder_session->skip_specification, decoder_session->sample_rate); FLAC__ASSERT(datasource->skip_specification->value.samples >= 0); */ skip = (FLAC__uint64)datasource->skip_specification.value.samples; /* remember, metadata->data.stream_info.total_samples can be 0, meaning 'unknown' */ if (metadata->data.stream_info.total_samples > 0 && skip >= metadata->data.stream_info.total_samples) { warn("ERROR trying to skip more samples than in stream\n"); datasource->abort_flag = true; return; } else if (metadata->data.stream_info.total_samples == 0 && skip > 0) { warn("ERROR, can't skip when FLAC metadata has total sample count of 0\n"); datasource->abort_flag = true; return; } datasource->bps = metadata->data.stream_info.bits_per_sample; datasource->channels = metadata->data.stream_info.channels; datasource->sample_rate = metadata->data.stream_info.sample_rate; datasource->total_samples = metadata->data.stream_info.total_samples - skip; datasource->length_in_msec = datasource->total_samples * 10 / (datasource->sample_rate / 100); /* if (!canonicalize_until_specification( datasource->until_specification, datasource->inbasefilename, datasource>n->sample_rate, skip, metadata->data.stream_info.total_samples)) { datasource->abort_flag = true; return; } */ FLAC__ASSERT(datasource->until_specification.value.samples >= 0); until = (FLAC__uint64)datasource->until_specification.value.samples; if (until > 0) { datasource->total_samples -= (metadata->data.stream_info.total_samples - until); } if (datasource->bps != 8 && datasource->bps != 16 && datasource->bps != 24) { warn("ERROR: bits per sample is not 8/16/24\n"); datasource->abort_flag = true; return; } } } static void error_callback( const decoder_t *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) { /* flac_datasource *datasource = (flac_datasource *)client_data; */ warn("FLAC decoder error_callback: %s\n", status); } static FLAC__StreamDecoderSeekStatus seek_callback( const decoder_t *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) { flac_datasource *datasource = (flac_datasource *)client_data; /* can't seek on a socket */ if (datasource->is_streaming) { return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; } if (PerlIO_seek(datasource->stream, absolute_byte_offset, SEEK_SET) >= 0) { return FLAC__STREAM_DECODER_SEEK_STATUS_OK; } return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; } static FLAC__StreamDecoderTellStatus tell_callback( const decoder_t *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) { flac_datasource *datasource = (flac_datasource *)client_data; FLAC__uint64 pos = -1; /* can't tell on a socket */ if (datasource->is_streaming) { return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; } pos = PerlIO_tell(datasource->stream); if (pos < 0) { return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; } *absolute_byte_offset = pos; return FLAC__STREAM_DECODER_TELL_STATUS_OK; } static FLAC__StreamDecoderLengthStatus length_callback( const decoder_t *decoder, FLAC__uint64 *stream_length, void *client_data) { flac_datasource *datasource = (flac_datasource *)client_data; /* can't find the total length of a socket */ if (datasource->is_streaming) { return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; } *stream_length = datasource->stream_length; return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; } static FLAC__bool eof_callback( const decoder_t *decoder, void *client_data) { flac_datasource *datasource = (flac_datasource *)client_data; FLAC__uint64 pos = 0; if (datasource->is_streaming) { return false; } pos = PerlIO_tell(datasource->stream); if (pos >= 0 && pos >= datasource->stream_length) { /* printf("stream length: %d pos: %d\n", datasource->stream_length, pos); */ return true; } return false; } static read_status_t read_callback( const decoder_t *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) { flac_datasource *datasource = (flac_datasource *)client_data; *bytes = PerlIO_read(datasource->stream, buffer, *bytes); datasource->buffer_size = *bytes; if (*bytes == 0) return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; if (*bytes < 0) return FLAC__STREAM_DECODER_READ_STATUS_ABORT; return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; } static FLAC__StreamDecoderWriteStatus write_callback( const decoder_t *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) { flac_datasource *datasource = (flac_datasource *)client_data; const unsigned channels = frame->header.channels; const unsigned wide_samples = frame->header.blocksize; unsigned wide_sample, sample, channel; if (datasource->abort_flag) { return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; } for (sample = datasource->wide_samples_in_reservoir * channels, wide_sample = 0; wide_sample < wide_samples; wide_sample++) { for (channel = 0; channel < channels; channel++, sample++) { datasource->reservoir[sample] = buffer[channel][wide_sample]; } } datasource->wide_samples_in_reservoir += wide_samples; return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } MODULE = Audio::FLAC::Decoder PACKAGE = Audio::FLAC::Decoder PROTOTYPES: DISABLE SV* open(class, path) char *class; SV *path; CODE: /* for setting the stream length */ FLAC__uint64 pos; /* Create our new self and a ref to it - all of these are cleaned up in DESTROY */ HV *self = newHV(); SV *obj_ref = newRV_noinc((SV*) self); /* our stash for streams */ flac_datasource *datasource = safemalloc(sizeof(flac_datasource)); /* holder for the decoder itself */ datasource->decoder = FLACdecoder_new(); /* check and see if a pathname was passed in, otherwise it might be a * IO::Socket subclass, or even a *FH Glob */ if (SvOK(path) && (SvTYPE(SvRV(path)) != SVt_PVGV)) { if ((datasource->stream = PerlIO_open((char*)SvPV_nolen(path), "r")) == NULL) { FLACdecoder_finish(datasource->decoder); FLACdecoder_delete(datasource->decoder); safefree(datasource); warn("failed on open: [%d] - [%s]\n", errno, strerror(errno)); XSRETURN_UNDEF; } datasource->is_streaming = 0; } else if (SvOK(path)) { /* Did we get a Glob, or a IO::Socket subclass? * * XXX This should really be a class method so the caller * can tell us if it's streaming or not. But how to do this on * a per object basis without changing open()s arugments. That * may be the easiest/only way. XXX * */ if (sv_isobject(path) && sv_derived_from(path, "IO::Socket")) { datasource->is_streaming = 1; } else { datasource->is_streaming = 0; } /* dereference and get the SV* that contains the Magic & FH, * then pull the fd from the PerlIO object */ datasource->stream = IoIFP(GvIOp(SvRV(path))); } else { XSRETURN_UNDEF; } if (!datasource->is_streaming) { pos = PerlIO_tell(datasource->stream); if (PerlIO_seek(datasource->stream, 0, SEEK_END) != -1) { datasource->stream_length = PerlIO_tell(datasource->stream); if (PerlIO_seek(datasource->stream, pos, SEEK_SET) == -1) { FLACdecoder_finish(datasource->decoder); FLACdecoder_delete(datasource->decoder); safefree(datasource); warn("failed on seek to beginning: [%d] - [%s]\n", errno, strerror(errno)); XSRETURN_UNDEF; } } } if (FLACdecoder_init(datasource->decoder, read_callback, seek_callback, tell_callback, length_callback, eof_callback, write_callback, meta_callback, error_callback, datasource) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { warn("Failed on initializing the decoder: [%d]\n", FLACdecoder_get_state(datasource->decoder)); FLACdecoder_finish(datasource->decoder); FLACdecoder_delete(datasource->decoder); safefree(datasource); XSRETURN_UNDEF; } /* skip ahead to the pcm data */ FLACdecoder_process_metadata(datasource->decoder); datasource->bytes_streamed = 0; datasource->decode_position_last = 0; datasource->decode_position_frame = 0; datasource->decode_position_frame_last = 0; /* initalize bitrate, channels, etc */ /*__read_info(self, vf); */ /* Values stored at base level */ my_hv_store(self, "PATH", newSVsv(path)); my_hv_store(self, "DATASOURCE", newSViv((IV) datasource)); /*my_hv_store(self, "READCOMMENTS", newSViv(1)); */ /* Bless the hashref to create a class object */ sv_bless(obj_ref, gv_stashpv(class, FALSE)); RETVAL = obj_ref; OUTPUT: RETVAL long sysread(obj, buffer, nbytes = 1024) SV* obj; SV* buffer; int nbytes; CODE: { int total_bytes_read = 0; unsigned blocksize = 1; char *readBuffer = alloca(nbytes); HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); if (!datasource) XSRETURN_UNDEF; if (!datasource->decoder) XSRETURN_UNDEF; while (datasource->wide_samples_in_reservoir < SAMPLES_PER_WRITE) { unsigned s = datasource->wide_samples_in_reservoir; if (FLACdecoder_get_state(datasource->decoder) == FLAC__STREAM_DECODER_END_OF_STREAM ) { break; } else if (!FLACdecoder_process_single(datasource->decoder)) { warn("Audio::FLAC::Decoder - read error while processing frame.\n"); break; } blocksize = datasource->wide_samples_in_reservoir - s; datasource->decode_position_frame_last = datasource->decode_position_frame; if (!FLACdecoder_get_decode_position(datasource->decoder, &datasource->decode_position_frame)) { datasource->decode_position_frame = 0; } } while (nbytes > 0) { if (datasource->wide_samples_in_reservoir <= 0) { break; } else { const unsigned channels = FLACdecoder_get_channels(datasource->decoder); const unsigned bps = FLACdecoder_get_bits_per_sample(datasource->decoder); const unsigned n = min(datasource->wide_samples_in_reservoir, SAMPLES_PER_WRITE); const unsigned delta = n * channels; unsigned i; int bytes = (int)pack_pcm_signed_little_endian( datasource->sample_buffer, datasource->reservoir, n, channels, bps, bps ); for (i = delta; i < datasource->wide_samples_in_reservoir * channels; i++) { datasource->reservoir[i-delta] = datasource->reservoir[i]; } datasource->wide_samples_in_reservoir -= n; readBuffer = datasource->sample_buffer; total_bytes_read += bytes; readBuffer += bytes; nbytes -= bytes; datasource->decode_position_last = datasource->decode_position_frame - datasource->wide_samples_in_reservoir * (datasource->decode_position_frame - datasource->decode_position_frame_last) / blocksize; } } /* copy the buffer into our passed SV* */ sv_setpvn(buffer, readBuffer-total_bytes_read, total_bytes_read); if (total_bytes_read < 0) XSRETURN_UNDEF; RETVAL = total_bytes_read; } OUTPUT: RETVAL void DESTROY (obj) SV* obj; CODE: HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); FLACdecoder_finish(datasource->decoder); FLACdecoder_delete(datasource->decoder); safefree(datasource); IV channels (obj) SV* obj; CODE: HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); RETVAL = FLACdecoder_get_channels(datasource->decoder); OUTPUT: RETVAL IV bits_per_sample (obj) SV* obj; CODE: HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); RETVAL = FLACdecoder_get_bits_per_sample(datasource->decoder); OUTPUT: RETVAL IV sample_rate (obj) SV* obj; CODE: HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); RETVAL = FLACdecoder_get_sample_rate(datasource->decoder); OUTPUT: RETVAL IV raw_seek (obj, pos, whence) SV* obj; long pos; int whence; CODE: { HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); /* can't seek on a socket. */ if (datasource->is_streaming) { XSRETURN_UNDEF; } if (!FLAC__stream_decoder_reset(datasource->decoder)) { XSRETURN_UNDEF; } RETVAL = PerlIO_seek(datasource->stream, pos, whence); } OUTPUT: RETVAL FLAC__uint64 raw_tell (obj) SV* obj; CODE: { HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); FLAC__uint64 decode_position = 0; /* this is effectively doing a ftell() */ if (!FLACdecoder_get_decode_position(datasource->decoder, &decode_position)) { decode_position = -1; } RETVAL = decode_position; } OUTPUT: RETVAL IV sample_seek (obj, sample) SV* obj; IV sample; CODE: { HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); RETVAL = FLACdecoder_seek_absolute(datasource->decoder, sample); } OUTPUT: RETVAL FLAC__uint64 time_seek (obj, seconds) SV* obj; IV seconds; CODE: { HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); const double distance = (double)seconds * 1000.0 / (double)datasource->length_in_msec; unsigned target_sample = (unsigned)(distance * (double)datasource->total_samples); if (FLACdecoder_seek_absolute(datasource->decoder, (FLAC__uint64)target_sample)) { if (!FLACdecoder_get_decode_position(datasource->decoder, &datasource->decode_position_frame)) { datasource->decode_position_frame = 0; } datasource->wide_samples_in_reservoir = 0; } RETVAL = datasource->decode_position_frame; } OUTPUT: RETVAL FLAC__uint64 time_tell (obj) SV* obj; CODE: { HV *self = (HV *) SvRV(obj); flac_datasource *datasource = (flac_datasource *) SvIV(*(my_hv_fetch(self, "DATASOURCE"))); FLAC__uint64 decode_position = 0; /* float time_position = 0; */ if (!FLACdecoder_get_decode_position(datasource->decoder, &decode_position)) { decode_position = -1; } else { /* time_position = metadata->data.stream_info.total_samples * 10 / (metadata->data.stream_info.sample_rate / 100); */ } RETVAL = decode_position; } OUTPUT: RETVAL libaudio-flac-decoder-perl-0.3+dfsg.orig/examples/0000755000175000017500000000000011112626122021372 5ustar gregoagregoalibaudio-flac-decoder-perl-0.3+dfsg.orig/examples/decode0000755000175000017500000000107511105675616022564 0ustar gregoagregoa#!/usr/bin/perl -w # $Id: decode,v 1.1.1.1 2004/06/30 21:49:37 daniel Exp $ use strict; use lib qw(blib/lib blib/arch); use Audio::Wav; use Audio::FLAC::Decoder; my $details = { 'bits_sample' => 16, 'sample_rate' => 44100, 'channels' => 2, }; sub main { my $wav = Audio::Wav->new(); my $write = $wav->write('out.wav', $details); my $decoder = Audio::FLAC::Decoder->open('test.flac'); my $buffer; while (my $len = $decoder->sysread($buffer)) { last if $len <= 0; $write->write_raw($buffer); } $write->finish(); } main(); libaudio-flac-decoder-perl-0.3+dfsg.orig/README0000644000175000017500000000151711112625745020452 0ustar gregoagregoaAudio::FLAC::Decoder ============================ This module provides an object-oriented interface to the decoding related functions provided by the FLAC development libraries. This allows the user to read data from Vorbis streams in pcm format, and to seek forwards and backwards through the stream. INSTALLATION To install this module type the following: perl Makefile.PL make make test make install DEPENDENCIES libflac, libflac-dev. COPYRIGHT AND LICENCE Copyright (c) 2004-2008, Dan Sully. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of this license is included with this module (LICENSE.GPL). libaudio-flac-decoder-perl-0.3+dfsg.orig/MANIFEST0000644000175000017500000000044711105675616020730 0ustar gregoagregoaChanges Decoder.pm Decoder.xs Makefile.PL MANIFEST README TODO t/decoder.t t/pod.t t/test.flac examples/decode include/common.h include/dither.h include/replaygain_synthesis.h dither.c replaygain_synthesis.c typemap META.yml Module meta-data (added by MakeMaker)