From a5e0f5b230d2c900ff36be9806e3ddb3d537386b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 24 May 2023 15:51:59 +0200 Subject: [PATCH] gh-104773: PEP 594: Remove the sunau module (#104863) * Remove Lib/test/audiodata/pluck-*.au files. * Remove Lib/test/audiotest.au file. --- Doc/library/sunau.rst | 274 --------- Doc/library/superseded.rst | 1 - Doc/tools/.nitignore | 1 - Doc/whatsnew/3.11.rst | 2 +- Doc/whatsnew/3.12.rst | 2 +- Doc/whatsnew/3.13.rst | 3 + Doc/whatsnew/3.4.rst | 8 +- Doc/whatsnew/3.7.rst | 4 +- Lib/sunau.py | 533 ------------------ Lib/test/audiodata/pluck-pcm16.au | Bin 13252 -> 0 bytes Lib/test/audiodata/pluck-pcm24.au | Bin 19866 -> 0 bytes Lib/test/audiodata/pluck-pcm32.au | Bin 26480 -> 0 bytes Lib/test/audiodata/pluck-pcm8.au | Bin 6638 -> 0 bytes Lib/test/audiodata/pluck-ulaw.au | Bin 6638 -> 0 bytes Lib/test/audiotest.au | Bin 28144 -> 0 bytes Lib/test/test_sunau.py | 160 ------ Misc/NEWS.d/3.7.0b3.rst | 2 +- Misc/NEWS.d/3.8.0a1.rst | 2 +- ...-05-24-14-58-13.gh-issue-104773.sQaXrY.rst | 2 + Python/stdlib_module_names.h | 1 - Tools/wasm/wasm_assets.py | 2 +- 21 files changed, 16 insertions(+), 981 deletions(-) delete mode 100644 Doc/library/sunau.rst delete mode 100644 Lib/sunau.py delete mode 100644 Lib/test/audiodata/pluck-pcm16.au delete mode 100644 Lib/test/audiodata/pluck-pcm24.au delete mode 100644 Lib/test/audiodata/pluck-pcm32.au delete mode 100644 Lib/test/audiodata/pluck-pcm8.au delete mode 100644 Lib/test/audiodata/pluck-ulaw.au delete mode 100644 Lib/test/audiotest.au delete mode 100644 Lib/test/test_sunau.py create mode 100644 Misc/NEWS.d/next/Library/2023-05-24-14-58-13.gh-issue-104773.sQaXrY.rst diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst deleted file mode 100644 index c7a38d96ade1..000000000000 --- a/Doc/library/sunau.rst +++ /dev/null @@ -1,274 +0,0 @@ -:mod:`sunau` --- Read and write Sun AU files -============================================ - -.. module:: sunau - :synopsis: Provide an interface to the Sun AU sound format. - :deprecated: - -.. sectionauthor:: Moshe Zadka - -**Source code:** :source:`Lib/sunau.py` - -.. deprecated-removed:: 3.11 3.13 - The :mod:`sunau` module is deprecated - (see :pep:`PEP 594 <594#sunau>` for details). - --------------- - -The :mod:`sunau` module provides a convenient interface to the Sun AU sound -format. Note that this module is interface-compatible with the modules -:mod:`aifc` and :mod:`wave`. - -An audio file consists of a header followed by the data. The fields of the -header are: - -+---------------+-----------------------------------------------+ -| Field | Contents | -+===============+===============================================+ -| magic word | The four bytes ``.snd``. | -+---------------+-----------------------------------------------+ -| header size | Size of the header, including info, in bytes. | -+---------------+-----------------------------------------------+ -| data size | Physical size of the data, in bytes. | -+---------------+-----------------------------------------------+ -| encoding | Indicates how the audio samples are encoded. | -+---------------+-----------------------------------------------+ -| sample rate | The sampling rate. | -+---------------+-----------------------------------------------+ -| # of channels | The number of channels in the samples. | -+---------------+-----------------------------------------------+ -| info | ASCII string giving a description of the | -| | audio file (padded with null bytes). | -+---------------+-----------------------------------------------+ - -Apart from the info field, all header fields are 4 bytes in size. They are all -32-bit unsigned integers encoded in big-endian byte order. - -The :mod:`sunau` module defines the following functions: - - -.. function:: open(file, mode) - - If *file* is a string, open the file by that name, otherwise treat it as a - seekable file-like object. *mode* can be any of - - ``'r'`` - Read only mode. - - ``'w'`` - Write only mode. - - Note that it does not allow read/write files. - - A *mode* of ``'r'`` returns an :class:`AU_read` object, while a *mode* of ``'w'`` - or ``'wb'`` returns an :class:`AU_write` object. - - -The :mod:`sunau` module defines the following exception: - -.. exception:: Error - - An error raised when something is impossible because of Sun AU specs or - implementation deficiency. - - -The :mod:`sunau` module defines the following data items: - -.. data:: AUDIO_FILE_MAGIC - - An integer every valid Sun AU file begins with, stored in big-endian form. This - is the string ``.snd`` interpreted as an integer. - - -.. data:: AUDIO_FILE_ENCODING_MULAW_8 - AUDIO_FILE_ENCODING_LINEAR_8 - AUDIO_FILE_ENCODING_LINEAR_16 - AUDIO_FILE_ENCODING_LINEAR_24 - AUDIO_FILE_ENCODING_LINEAR_32 - AUDIO_FILE_ENCODING_ALAW_8 - - Values of the encoding field from the AU header which are supported by this - module. - - -.. data:: AUDIO_FILE_ENCODING_FLOAT - AUDIO_FILE_ENCODING_DOUBLE - AUDIO_FILE_ENCODING_ADPCM_G721 - AUDIO_FILE_ENCODING_ADPCM_G722 - AUDIO_FILE_ENCODING_ADPCM_G723_3 - AUDIO_FILE_ENCODING_ADPCM_G723_5 - - Additional known values of the encoding field from the AU header, but which are - not supported by this module. - - -.. _au-read-objects: - -AU_read Objects ---------------- - -AU_read objects, as returned by :func:`.open` above, have the following methods: - - -.. method:: AU_read.close() - - Close the stream, and make the instance unusable. (This is called automatically - on deletion.) - - -.. method:: AU_read.getnchannels() - - Returns number of audio channels (1 for mono, 2 for stereo). - - -.. method:: AU_read.getsampwidth() - - Returns sample width in bytes. - - -.. method:: AU_read.getframerate() - - Returns sampling frequency. - - -.. method:: AU_read.getnframes() - - Returns number of audio frames. - - -.. method:: AU_read.getcomptype() - - Returns compression type. Supported compression types are ``'ULAW'``, ``'ALAW'`` - and ``'NONE'``. - - -.. method:: AU_read.getcompname() - - Human-readable version of :meth:`getcomptype`. The supported types have the - respective names ``'CCITT G.711 u-law'``, ``'CCITT G.711 A-law'`` and ``'not - compressed'``. - - -.. method:: AU_read.getparams() - - Returns a :func:`~collections.namedtuple` ``(nchannels, sampwidth, - framerate, nframes, comptype, compname)``, equivalent to output of the - :meth:`get\*` methods. - - -.. method:: AU_read.readframes(n) - - Reads and returns at most *n* frames of audio, as a :class:`bytes` object. The data - will be returned in linear format. If the original data is in u-LAW format, it - will be converted. - - -.. method:: AU_read.rewind() - - Rewind the file pointer to the beginning of the audio stream. - -The following two methods define a term "position" which is compatible between -them, and is otherwise implementation dependent. - - -.. method:: AU_read.setpos(pos) - - Set the file pointer to the specified position. Only values returned from - :meth:`tell` should be used for *pos*. - - -.. method:: AU_read.tell() - - Return current file pointer position. Note that the returned value has nothing - to do with the actual position in the file. - -The following two functions are defined for compatibility with the :mod:`aifc`, -and don't do anything interesting. - - -.. method:: AU_read.getmarkers() - - Returns ``None``. - - -.. method:: AU_read.getmark(id) - - Raise an error. - - -.. _au-write-objects: - -AU_write Objects ----------------- - -AU_write objects, as returned by :func:`.open` above, have the following methods: - - -.. method:: AU_write.setnchannels(n) - - Set the number of channels. - - -.. method:: AU_write.setsampwidth(n) - - Set the sample width (in bytes.) - - .. versionchanged:: 3.4 - Added support for 24-bit samples. - - -.. method:: AU_write.setframerate(n) - - Set the frame rate. - - -.. method:: AU_write.setnframes(n) - - Set the number of frames. This can be later changed, when and if more frames - are written. - - -.. method:: AU_write.setcomptype(type, name) - - Set the compression type and description. Only ``'NONE'`` and ``'ULAW'`` are - supported on output. - - -.. method:: AU_write.setparams(tuple) - - The *tuple* should be ``(nchannels, sampwidth, framerate, nframes, comptype, - compname)``, with values valid for the :meth:`set\*` methods. Set all - parameters. - - -.. method:: AU_write.tell() - - Return current position in the file, with the same disclaimer for the - :meth:`AU_read.tell` and :meth:`AU_read.setpos` methods. - - -.. method:: AU_write.writeframesraw(data) - - Write audio frames, without correcting *nframes*. - - .. versionchanged:: 3.4 - Any :term:`bytes-like object` is now accepted. - - -.. method:: AU_write.writeframes(data) - - Write audio frames and make sure *nframes* is correct. - - .. versionchanged:: 3.4 - Any :term:`bytes-like object` is now accepted. - - -.. method:: AU_write.close() - - Make sure *nframes* is correct, and close the file. - - This method is called upon deletion. - -Note that it is invalid to set any parameters after calling :meth:`writeframes` -or :meth:`writeframesraw`. - diff --git a/Doc/library/superseded.rst b/Doc/library/superseded.rst index a655c09c956f..1ab7b08d4d20 100644 --- a/Doc/library/superseded.rst +++ b/Doc/library/superseded.rst @@ -21,6 +21,5 @@ backwards compatibility. They have been superseded by other modules. nntplib.rst optparse.rst spwd.rst - sunau.rst uu.rst xdrlib.rst diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index b8d3e7d0374a..cdd896eda1aa 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -207,7 +207,6 @@ Doc/library/stdtypes.rst Doc/library/string.rst Doc/library/struct.rst Doc/library/subprocess.rst -Doc/library/sunau.rst Doc/library/sys.rst Doc/library/sys_path_init.rst Doc/library/sysconfig.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index e59604e7778f..9734d43ef87d 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1737,7 +1737,7 @@ Modules +---------------------+---------------------+---------------------+---------------------+---------------------+ | :mod:`!cgi` | :mod:`imghdr` | :mod:`nntplib` | :mod:`spwd` | :mod:`xdrlib` | +---------------------+---------------------+---------------------+---------------------+---------------------+ - | :mod:`!cgitb` | :mod:`mailcap` | :mod:`!ossaudiodev` | :mod:`sunau` | | + | :mod:`!cgitb` | :mod:`mailcap` | :mod:`!ossaudiodev` | :mod:`!sunau` | | +---------------------+---------------------+---------------------+---------------------+---------------------+ (Contributed by Brett Cannon in :issue:`47061` and Victor Stinner in diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 844d063dbab6..316296ae038e 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -901,7 +901,7 @@ Modules (see :pep:`594`): * :mod:`!pipes` * :mod:`!sndhdr` * :mod:`spwd` -* :mod:`sunau` +* :mod:`!sunau` * :mod:`!telnetlib` * :mod:`uu` * :mod:`xdrlib` diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index d086f3c12e5e..83d539b6fc3d 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -161,6 +161,9 @@ Removed use the `pygame project `_ for audio playback. (Contributed by Victor Stinner in :gh:`104780`.) +* :pep:`594`: Remove the :mod:`!sunau` module, deprecated in Python 3.11. + (Contributed by Victor Stinner in :gh:`104773`.) + Porting to Python 3.13 ====================== diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst index d4ed8abe772a..b9008328b49f 100644 --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -1528,10 +1528,10 @@ work on Windows. This change was actually inadvertently made in 3.3.4. sunau ----- -The :meth:`~sunau.getparams` method now returns a namedtuple rather than a +The :meth:`~!sunau.getparams` method now returns a namedtuple rather than a plain tuple. (Contributed by Claudiu Popa in :issue:`18901`.) -:meth:`sunau.open` now supports the context management protocol: when used in a +:meth:`!sunau.open` now supports the context management protocol: when used in a :keyword:`with` block, the ``close`` method of the returned object will be called automatically at the end of the block. (Contributed by Serhiy Storchaka in :issue:`18878`.) @@ -1540,8 +1540,8 @@ in :issue:`18878`.) support for writing 24 sample using the module. (Contributed by Serhiy Storchaka in :issue:`19261`.) -The :meth:`~sunau.AU_write.writeframesraw` and -:meth:`~sunau.AU_write.writeframes` methods now accept any :term:`bytes-like +The :meth:`~!sunau.AU_write.writeframesraw` and +:meth:`~!sunau.AU_write.writeframes` methods now accept any :term:`bytes-like object`. (Contributed by Serhiy Storchaka in :issue:`8311`.) diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 41d7e08f2b39..967608d512f1 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -2061,8 +2061,8 @@ ssl sunau ----- -:func:`sunau.openfp` has been deprecated and will be removed in Python 3.9. -Use :func:`sunau.open` instead. +:func:`!sunau.openfp` has been deprecated and will be removed in Python 3.9. +Use :func:`!sunau.open` instead. (Contributed by Brian Curtin in :issue:`31985`.) diff --git a/Lib/sunau.py b/Lib/sunau.py deleted file mode 100644 index c6caab959abd..000000000000 --- a/Lib/sunau.py +++ /dev/null @@ -1,533 +0,0 @@ -"""Stuff to parse Sun and NeXT audio files. - -An audio file consists of a header followed by the data. The structure -of the header is as follows. - - +---------------+ - | magic word | - +---------------+ - | header size | - +---------------+ - | data size | - +---------------+ - | encoding | - +---------------+ - | sample rate | - +---------------+ - | # of channels | - +---------------+ - | info | - | | - +---------------+ - -The magic word consists of the 4 characters '.snd'. Apart from the -info field, all header fields are 4 bytes in size. They are all -32-bit unsigned integers encoded in big-endian byte order. - -The header size really gives the start of the data. -The data size is the physical size of the data. From the other -parameters the number of frames can be calculated. -The encoding gives the way in which audio samples are encoded. -Possible values are listed below. -The info field currently consists of an ASCII string giving a -human-readable description of the audio file. The info field is -padded with NUL bytes to the header size. - -Usage. - -Reading audio files: - f = sunau.open(file, 'r') -where file is either the name of a file or an open file pointer. -The open file pointer must have methods read(), seek(), and close(). -When the setpos() and rewind() methods are not used, the seek() -method is not necessary. - -This returns an instance of a class with the following public methods: - getnchannels() -- returns number of audio channels (1 for - mono, 2 for stereo) - getsampwidth() -- returns sample width in bytes - getframerate() -- returns sampling frequency - getnframes() -- returns number of audio frames - getcomptype() -- returns compression type ('NONE' or 'ULAW') - getcompname() -- returns human-readable version of - compression type ('not compressed' matches 'NONE') - getparams() -- returns a namedtuple consisting of all of the - above in the above order - getmarkers() -- returns None (for compatibility with the - aifc module) - getmark(id) -- raises an error since the mark does not - exist (for compatibility with the aifc module) - readframes(n) -- returns at most n frames of audio - rewind() -- rewind to the beginning of the audio stream - setpos(pos) -- seek to the specified position - tell() -- return the current position - close() -- close the instance (make it unusable) -The position returned by tell() and the position given to setpos() -are compatible and have nothing to do with the actual position in the -file. -The close() method is called automatically when the class instance -is destroyed. - -Writing audio files: - f = sunau.open(file, 'w') -where file is either the name of a file or an open file pointer. -The open file pointer must have methods write(), tell(), seek(), and -close(). - -This returns an instance of a class with the following public methods: - setnchannels(n) -- set the number of channels - setsampwidth(n) -- set the sample width - setframerate(n) -- set the frame rate - setnframes(n) -- set the number of frames - setcomptype(type, name) - -- set the compression type and the - human-readable compression type - setparams(tuple)-- set all parameters at once - tell() -- return current position in output file - writeframesraw(data) - -- write audio frames without pathing up the - file header - writeframes(data) - -- write audio frames and patch up the file header - close() -- patch up the file header and close the - output file -You should set the parameters before the first writeframesraw or -writeframes. The total number of frames does not need to be set, -but when it is set to the correct value, the header does not have to -be patched up. -It is best to first set all parameters, perhaps possibly the -compression type, and then write audio frames using writeframesraw. -When all frames have been written, either call writeframes(b'') or -close() to patch up the sizes in the header. -The close() method is called automatically when the class instance -is destroyed. -""" - -from collections import namedtuple -import warnings - -warnings._deprecated(__name__, remove=(3, 13)) - - -_sunau_params = namedtuple('_sunau_params', - 'nchannels sampwidth framerate nframes comptype compname') - -# from -AUDIO_FILE_MAGIC = 0x2e736e64 -AUDIO_FILE_ENCODING_MULAW_8 = 1 -AUDIO_FILE_ENCODING_LINEAR_8 = 2 -AUDIO_FILE_ENCODING_LINEAR_16 = 3 -AUDIO_FILE_ENCODING_LINEAR_24 = 4 -AUDIO_FILE_ENCODING_LINEAR_32 = 5 -AUDIO_FILE_ENCODING_FLOAT = 6 -AUDIO_FILE_ENCODING_DOUBLE = 7 -AUDIO_FILE_ENCODING_ADPCM_G721 = 23 -AUDIO_FILE_ENCODING_ADPCM_G722 = 24 -AUDIO_FILE_ENCODING_ADPCM_G723_3 = 25 -AUDIO_FILE_ENCODING_ADPCM_G723_5 = 26 -AUDIO_FILE_ENCODING_ALAW_8 = 27 - -# from -AUDIO_UNKNOWN_SIZE = 0xFFFFFFFF # ((unsigned)(~0)) - -_simple_encodings = [AUDIO_FILE_ENCODING_MULAW_8, - AUDIO_FILE_ENCODING_LINEAR_8, - AUDIO_FILE_ENCODING_LINEAR_16, - AUDIO_FILE_ENCODING_LINEAR_24, - AUDIO_FILE_ENCODING_LINEAR_32, - AUDIO_FILE_ENCODING_ALAW_8] - -class Error(Exception): - pass - -def _read_u32(file): - x = 0 - for i in range(4): - byte = file.read(1) - if not byte: - raise EOFError - x = x*256 + ord(byte) - return x - -def _write_u32(file, x): - data = [] - for i in range(4): - d, m = divmod(x, 256) - data.insert(0, int(m)) - x = d - file.write(bytes(data)) - -class Au_read: - - def __init__(self, f): - if isinstance(f, str): - import builtins - f = builtins.open(f, 'rb') - self._opened = True - else: - self._opened = False - self.initfp(f) - - def __del__(self): - if self._file: - self.close() - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def initfp(self, file): - self._file = file - self._soundpos = 0 - magic = int(_read_u32(file)) - if magic != AUDIO_FILE_MAGIC: - raise Error('bad magic number') - self._hdr_size = int(_read_u32(file)) - if self._hdr_size < 24: - raise Error('header size too small') - if self._hdr_size > 100: - raise Error('header size ridiculously large') - self._data_size = _read_u32(file) - if self._data_size != AUDIO_UNKNOWN_SIZE: - self._data_size = int(self._data_size) - self._encoding = int(_read_u32(file)) - if self._encoding not in _simple_encodings: - raise Error('encoding not (yet) supported') - if self._encoding in (AUDIO_FILE_ENCODING_MULAW_8, - AUDIO_FILE_ENCODING_ALAW_8): - self._sampwidth = 2 - self._framesize = 1 - elif self._encoding == AUDIO_FILE_ENCODING_LINEAR_8: - self._framesize = self._sampwidth = 1 - elif self._encoding == AUDIO_FILE_ENCODING_LINEAR_16: - self._framesize = self._sampwidth = 2 - elif self._encoding == AUDIO_FILE_ENCODING_LINEAR_24: - self._framesize = self._sampwidth = 3 - elif self._encoding == AUDIO_FILE_ENCODING_LINEAR_32: - self._framesize = self._sampwidth = 4 - else: - raise Error('unknown encoding') - self._framerate = int(_read_u32(file)) - self._nchannels = int(_read_u32(file)) - if not self._nchannels: - raise Error('bad # of channels') - self._framesize = self._framesize * self._nchannels - if self._hdr_size > 24: - self._info = file.read(self._hdr_size - 24) - self._info, _, _ = self._info.partition(b'\0') - else: - self._info = b'' - try: - self._data_pos = file.tell() - except (AttributeError, OSError): - self._data_pos = None - - def getfp(self): - return self._file - - def getnchannels(self): - return self._nchannels - - def getsampwidth(self): - return self._sampwidth - - def getframerate(self): - return self._framerate - - def getnframes(self): - if self._data_size == AUDIO_UNKNOWN_SIZE: - return AUDIO_UNKNOWN_SIZE - if self._encoding in _simple_encodings: - return self._data_size // self._framesize - return 0 # XXX--must do some arithmetic here - - def getcomptype(self): - if self._encoding == AUDIO_FILE_ENCODING_MULAW_8: - return 'ULAW' - elif self._encoding == AUDIO_FILE_ENCODING_ALAW_8: - return 'ALAW' - else: - return 'NONE' - - def getcompname(self): - if self._encoding == AUDIO_FILE_ENCODING_MULAW_8: - return 'CCITT G.711 u-law' - elif self._encoding == AUDIO_FILE_ENCODING_ALAW_8: - return 'CCITT G.711 A-law' - else: - return 'not compressed' - - def getparams(self): - return _sunau_params(self.getnchannels(), self.getsampwidth(), - self.getframerate(), self.getnframes(), - self.getcomptype(), self.getcompname()) - - def getmarkers(self): - return None - - def getmark(self, id): - raise Error('no marks') - - def readframes(self, nframes): - if self._encoding in _simple_encodings: - if nframes == AUDIO_UNKNOWN_SIZE: - data = self._file.read() - else: - data = self._file.read(nframes * self._framesize) - self._soundpos += len(data) // self._framesize - if self._encoding == AUDIO_FILE_ENCODING_MULAW_8: - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - data = audioop.ulaw2lin(data, self._sampwidth) - return data - return None # XXX--not implemented yet - - def rewind(self): - if self._data_pos is None: - raise OSError('cannot seek') - self._file.seek(self._data_pos) - self._soundpos = 0 - - def tell(self): - return self._soundpos - - def setpos(self, pos): - if pos < 0 or pos > self.getnframes(): - raise Error('position not in range') - if self._data_pos is None: - raise OSError('cannot seek') - self._file.seek(self._data_pos + pos * self._framesize) - self._soundpos = pos - - def close(self): - file = self._file - if file: - self._file = None - if self._opened: - file.close() - -class Au_write: - - def __init__(self, f): - if isinstance(f, str): - import builtins - f = builtins.open(f, 'wb') - self._opened = True - else: - self._opened = False - self.initfp(f) - - def __del__(self): - if self._file: - self.close() - self._file = None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def initfp(self, file): - self._file = file - self._framerate = 0 - self._nchannels = 0 - self._sampwidth = 0 - self._framesize = 0 - self._nframes = AUDIO_UNKNOWN_SIZE - self._nframeswritten = 0 - self._datawritten = 0 - self._datalength = 0 - self._info = b'' - self._comptype = 'ULAW' # default is U-law - - def setnchannels(self, nchannels): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - if nchannels not in (1, 2, 4): - raise Error('only 1, 2, or 4 channels supported') - self._nchannels = nchannels - - def getnchannels(self): - if not self._nchannels: - raise Error('number of channels not set') - return self._nchannels - - def setsampwidth(self, sampwidth): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - if sampwidth not in (1, 2, 3, 4): - raise Error('bad sample width') - self._sampwidth = sampwidth - - def getsampwidth(self): - if not self._framerate: - raise Error('sample width not specified') - return self._sampwidth - - def setframerate(self, framerate): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - self._framerate = framerate - - def getframerate(self): - if not self._framerate: - raise Error('frame rate not set') - return self._framerate - - def setnframes(self, nframes): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - if nframes < 0: - raise Error('# of frames cannot be negative') - self._nframes = nframes - - def getnframes(self): - return self._nframeswritten - - def setcomptype(self, type, name): - if type in ('NONE', 'ULAW'): - self._comptype = type - else: - raise Error('unknown compression type') - - def getcomptype(self): - return self._comptype - - def getcompname(self): - if self._comptype == 'ULAW': - return 'CCITT G.711 u-law' - elif self._comptype == 'ALAW': - return 'CCITT G.711 A-law' - else: - return 'not compressed' - - def setparams(self, params): - nchannels, sampwidth, framerate, nframes, comptype, compname = params - self.setnchannels(nchannels) - self.setsampwidth(sampwidth) - self.setframerate(framerate) - self.setnframes(nframes) - self.setcomptype(comptype, compname) - - def getparams(self): - return _sunau_params(self.getnchannels(), self.getsampwidth(), - self.getframerate(), self.getnframes(), - self.getcomptype(), self.getcompname()) - - def tell(self): - return self._nframeswritten - - def writeframesraw(self, data): - if not isinstance(data, (bytes, bytearray)): - data = memoryview(data).cast('B') - self._ensure_header_written() - if self._comptype == 'ULAW': - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - data = audioop.lin2ulaw(data, self._sampwidth) - nframes = len(data) // self._framesize - self._file.write(data) - self._nframeswritten = self._nframeswritten + nframes - self._datawritten = self._datawritten + len(data) - - def writeframes(self, data): - self.writeframesraw(data) - if self._nframeswritten != self._nframes or \ - self._datalength != self._datawritten: - self._patchheader() - - def close(self): - if self._file: - try: - self._ensure_header_written() - if self._nframeswritten != self._nframes or \ - self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - finally: - file = self._file - self._file = None - if self._opened: - file.close() - - # - # private methods - # - - def _ensure_header_written(self): - if not self._nframeswritten: - if not self._nchannels: - raise Error('# of channels not specified') - if not self._sampwidth: - raise Error('sample width not specified') - if not self._framerate: - raise Error('frame rate not specified') - self._write_header() - - def _write_header(self): - if self._comptype == 'NONE': - if self._sampwidth == 1: - encoding = AUDIO_FILE_ENCODING_LINEAR_8 - self._framesize = 1 - elif self._sampwidth == 2: - encoding = AUDIO_FILE_ENCODING_LINEAR_16 - self._framesize = 2 - elif self._sampwidth == 3: - encoding = AUDIO_FILE_ENCODING_LINEAR_24 - self._framesize = 3 - elif self._sampwidth == 4: - encoding = AUDIO_FILE_ENCODING_LINEAR_32 - self._framesize = 4 - else: - raise Error('internal error') - elif self._comptype == 'ULAW': - encoding = AUDIO_FILE_ENCODING_MULAW_8 - self._framesize = 1 - else: - raise Error('internal error') - self._framesize = self._framesize * self._nchannels - _write_u32(self._file, AUDIO_FILE_MAGIC) - header_size = 25 + len(self._info) - header_size = (header_size + 7) & ~7 - _write_u32(self._file, header_size) - if self._nframes == AUDIO_UNKNOWN_SIZE: - length = AUDIO_UNKNOWN_SIZE - else: - length = self._nframes * self._framesize - try: - self._form_length_pos = self._file.tell() - except (AttributeError, OSError): - self._form_length_pos = None - _write_u32(self._file, length) - self._datalength = length - _write_u32(self._file, encoding) - _write_u32(self._file, self._framerate) - _write_u32(self._file, self._nchannels) - self._file.write(self._info) - self._file.write(b'\0'*(header_size - len(self._info) - 24)) - - def _patchheader(self): - if self._form_length_pos is None: - raise OSError('cannot seek') - self._file.seek(self._form_length_pos) - _write_u32(self._file, self._datawritten) - self._datalength = self._datawritten - self._file.seek(0, 2) - -def open(f, mode=None): - if mode is None: - if hasattr(f, 'mode'): - mode = f.mode - else: - mode = 'rb' - if mode in ('r', 'rb'): - return Au_read(f) - elif mode in ('w', 'wb'): - return Au_write(f) - else: - raise Error("mode must be 'r', 'rb', 'w', or 'wb'") diff --git a/Lib/test/audiodata/pluck-pcm16.au b/Lib/test/audiodata/pluck-pcm16.au deleted file mode 100644 index 398f07f071974314161f1f364d005586921eba1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 13252 zc-jq@WmHya8-<@Z@pjQI2r8I}-D0DR-Q7BN_lWwL*xjNsc4IM)iJgoBA}w8S_sQ@5 zan@Putn*{9=h^$Z_uXRI!WjSne*ofcc-|O*rdrP%p%!B8zzM(|>rEJw@+G}Ll~8y3 zU&q$xmGA+cEhIf2&cxrpZ5(yZqqW#-*!NRLLV_bV>B+v87AcHr3s| zRvEYEHgh&UwwGOFcXB$(4EAhsE4GJr3)8AwEj#w#)!hAA+2WLMUW8AtKue=C7)#>P5+fk zhxS+XP5z|q^3b8G>FpyMm$QTFs!xM)xqaBqXLBv(ksoR<1uZJ`V@4H!d&L#5lEmhp zH0S5X_nuUE$7eu!sNh>a+BMLgu;Uy%z;K3-Ce8e``egpRV?0+r{1ac379=j5+!3Cu zu~N!r9ptFGRMW!miP!qpgkMGy^iysWy=pIqX|okk%2{ic%jZ_@RopBrRF3`bkQI;q zPZAn3l&?4*YrQNSlzJuFIib_G))$!pdkhc_xG_XTbkFDx?zzs$`ge@ zN?v?uTeOP}D7eX_6bxy8yl7SPC*^Mqv-M4siH@1O=J1-LX<|>hMr>oBFM5}AynRd~ zq3O%L;@sYkfWhl4VV0Ijk9q%8{a3Y6ryW1Xw?h*2?Z0k>?rCMb=KP0^ih&zNX@+5_ zj494iw9nio8`EPYeW1-{IsvYc?3r33|M@LW({Br_QN#_FXTu!&Q>FxK87DvS%r<+9 z`**#(<6*Zty;x1bjAjh|=C^X;c4s zFjyYHQIs^1x0E)?ik6k-PLbY2-> zTeS523#tQ2K=yoT3f-#nV%n8qmNhN4Z?d*D5-ZaFmnUn-|YPL+( zF0Q%s=$l2v9e09oFJp@{;PqU6c-x%v@v7^^*9t!t!NT(eRywY*IoYOoYmXllW&Bs; z65^ZNl^KHRlnqoSxW4glluoo-Nl9NtnOK(}aNvge%P!kHT;9yOrIJLE1kbO7sULzL^i=-ha zTv(U4r`aMp1DqBTagdT|;i(D3V9BA4~SVNs>O0j;Akm51|yI(bz`nHn?R9z&`WZxD8^bY5YyQB2|brEGtTTCy^s|+aE znsvJ15d2Vh51lQ^Z2F~YRp>&q!RqFhS$ycyi)o6&!ZLYf04rHoJ(lR_t`aAAtKoj< zy4WEdv)STC4aMpFS7IXWES;z6t{kLE)^1OFp?)`IkYXK|E&cUr40+z8v#S^@S#;-z ztS>ksN$NI^VncUH+GvtxV*F1{==)XP{>N8n$F$FucO^fOf4oZ+{%6f`WIQ=v|K2&I zG_`%3g6B5>{AXYE1vk0ZMaiV0v}fqAng-F^t&CkK+U!nQ-ra|q?w_huResB4{hY0d z`s!5Sao5v~zJ87?GvKuAVW%-%S9TQKM)adsQcAfaqDrgYwL`P3MTJt*s+H{Y{S+!; zc`g~IpUA=}b6xRAxlkVLeW$Kfv#*X$+-bDNK1I3j#eA=p z&j)M!t5otH)C*#9@psM^JJOklKiY?Ym$t$lOI#0$zl677FzFC)$+t9BXt$<()~)A< ztEz__R4h$jLf7|iLH;u~QPTI(eA$n$6Qzr~#8I!>MpJGOAsyI;SDI;uSJ0lBS|js6 z`M8c7i5p)J@>dJ~XSWm_t>6ALxiqFxVE)~JoB6?+=L`QWTll-7I<`X8*z_Hv@3@9h zD~bQ?(>1csjeM%o=X;$2f?|-aJ?2YJv)w{mwqO27%%a`fJg1|N{iyabw^?jW=v|xT zsZC3Cvz|BeewcMZV;FNr>G&>4)qx$!)IT57>vA(>ZSQ+YePafZrhf6{3Gjvf62U9R zG_dGm&UDi?%=#)n-7}WhTvg6b{~T|>TiUWdHFsUjrN}QRZI^(-DqfS z7$0AIJUHF-R|LmQmDH0CbGZ7EztQiEdqGgy-D!R!W1;qrZ=$TIZaA(PJOGmoT;%4o zCgkK=HEKDu2b|YvDKP{zk^b9QuATSmFYnz~zpLfJQ8WnqA$Ir{?=XJ*SO2BRR2GO| z=0`S+$?L@_is{VW6~VT#b@zNF)@9-8g52kZ><9;a7FODWIz8L(_t(#Ua;w(|;T*be z*<#*XlMptsayR{7wYS%1qhG{sCPkG?KeFx8Wyuo)i{R%-h=X0G@)1r*5mX)Kc^YolQDLDCUqQBK-UfNOJvSOrqp#e7VVIS)5%C0l9etlq6*f8DWhRJVQhIDcq z)SYiWPBO<`$vDg`CK5;)sNHL<3d6e5fMc`v{vHI3%6&Syo*u ztBKZuU9MS;?52q-QvZ5cl~|Nwij^0-)eT$Xwjq^jUvSvp zZfqQK`|Dr+=il#?$@r$OpWe-Dw>VNtc1f#?erTL!Z&ewF(9nJSRqsA3FY!Xq878k` zl-Jiry>pbIH_QLhwrOl5wN!|k^4n?~+^)aS1#m+ z6z|AX=RfMI6eDlCt!6MObr}sxl%)D>4#J5@}GSYZFuu#2LbGcYh9+YrbwX@2po-g=L3o2oky za7ve5GfMgNy>GJLdhHI;7lOH(A&U6n0(kA%z*RrMBIRPi=%A-`HP?e{Z!v3Vq@!~c{1?R_+` zSwz2pmQ6ZP-jRLWA^!UXiEMD)B>QJWZRJ?W&(hcG?Nx_Ezq%u%QZ+>=J4}*S6|zcC z`>cp)tRB~{TG1_Py|RyUhkWjv3}N+G(YThlS>+DYR-WVPtF`~#s#a&tt*(O6rWa8o z_^IltWLbp|O%(4X1`!AG*yuO3wBbm3JC>CPe_IZ+URD{-mTxGLsy7rw_&q9Zty*J= zg+ItZ)Y~W3YiYzEfkzsBQpJQHYAAF{M0KRamDE;`ruKAABar z&oyjY8X2Z3|E7EFg`}5SU!;f@!z8!qY}u1<4%q6=Vas>x$~vWQea#VhzuKR_@6-taP^z&s$)95Tm$zrsi zATnTI=?lMd>oN&P4-hqeEoCbrruwdp3iSFjbO|1vrTa-+Z~Fcp&*EL*>-|KBhkymS2p_AAzvEzt?5l(fy>0f!~yT92( zKk^L4?7`ZRn#;Ate!k;c;M=&sdA5LDj_Gu4D=d? z!?hE#G{WMqE%fR2p;de6lhtqN(RGQY3w66H2AewDE^uGzOo=~zS@M9L2KPAv*cE8H z(A8@eJ=iBpc@=3Smf{iz{bj`ONd+JB?r>3M$=)@NOCkA+O0U$wV^T8g67^58N%G3; z8vO^=ki5$Uh!gC~4d?5h8e1BEa*3`2`AYI}Sc-r1$o&ly<+lU+*H1#jYiHZe5iu@F zgBes&%xk}3?Jb|*<%`6e%++;d$++@H%;>6%#7F%scUxn${)XkOZ7e?@HKogmL^_R2 z634jOxz5Ah9Hp5>clYU`K1$D*zo;4P{PjJmVAMd=$tw^ zgps@q7(&IVpWu4@4!2{kz|pQwwlLFE(&X1Ds;y81}j81%wj>mQ*V z6%r8qx34ynNMBsxl_WC6t(ol5*~6mz4G_@9RqE zu4^=2yMuj$w**%E{qpXpE|w=r<|7s@?F?KJ0B!#MhUUBMVwHB^&2h?hcV56__X%p`QlK8Z;+|7qUu#EuW*E^tB7 zT74w&aOk~YWq?!u6-2v}^pt&=T`p88vQz~P?EWBZg5r&s*`=0jb?J4=p5oaHi6&VdiPFuE>jMo=rrkJ-DTwx^#I~E6JZ`)RR6nY z&e-D1)lF)Dqb7W@w^O6@|103UsvzhAy~UTOdMPK;T4*CXGT8)aThBHzwlTi2Znc@Y zMc}%mPCeUC2%R1>DiCX5i+x14_CMz}TLZRKwO-ORB189Y*asCB)^P>-GmP-p`P#nb zrFH+1eGMdfZtP{=WIJ2$C&n^CbX&SBl}Zc**O_o`o$IhTl59*3*Tu*VYlf03Y^q~o z@#{)w&W6&s8g+F&zT>R*-X!hp^T{VtRufo8{0J~pcHIM+FFlps%NG&~`(?&$h&CKH zKCpFmra>#tQLpj(9&8Ko4v6-BCFIi0YkqV6Y%AH-noQ(wC@9v3a`G%bPCS;Uu%_o- zH}rM1(x*sY7y^-5&*PVU{rIeBBc0sTLG*&Qujv4?{3h$mHETFDXJ8ge;5 z)jhJLS6$W4SB@J`w$01m9fz1>hzj7U2 z3MQBbF+L`pVyp2k{A$=<)7I3ie2DWA8wObQDRQ;+An~W;D!gN!4nH9&+1#hMMCm<~ zwDH?mQ*p83Y|in@t9A8N{viA^VZ~1U$ zrunncQNP9xjU$Oz7oj{wF@Ase?DgFp@D>E=QfjS|kM`2&8-|eg0?Vi->`E~* zzmFreNN;J*pEm21b*5tRm+@6)chj)4NV}V#EF|cR__%Zj(cCIW=M3ji8aha>^?M}o z_Gw9Fa7#{_aR#BJ*oarWs;4N=yVUsm*I8PM*rPp zI(tf}DJ*tO{@vAlR7^C@Rz5Uc=C_&pm#;IuD!Xf+C?4f%y$_&0k|l(fDGYbiKgAKm zQZgZ6DSg4a7p-AD#3<3*kK`xUw=suRzmnMMUMpVP@~9i&0=ytM5D$F3RI>t3Xgd3A zsH@tE{5FX{XJ!rd-R9|bs9%q+8E?wExfNQ5VtqJmPhy5wsD6O@o0U~`)!L+DgA(Z? z-{bTxt`WFjQtw<}cFDX5%rkaXYK?8#d}CsHdy}Rj$`%j%vKze9;0zMe8ca}8J&hSfqU7x}%&`&ACoBJ|eU$uhyUdot{n19xph<$aP=m29O9^~4FPod*fn&OIb zzxO(opPz;N$hXGt z(J_OB9BLj!J)(0YgMB+oKPt~i_cPnbM|Fq!lNGORtxa3>%TQRIjQp%mL6>aDh>rYA z>KUD>n50Qp&h_m~#rbK38(w+fwqgT&80sy7t~bJKi&gr!1uMEZ+v!TgXz3TSiKU%n zxTTlujq1L#XYdF00*$B%13)oZKZZcnn^+~Uv4u!G8pkqQ>Kj$}sGVQ)vo05OF%MJc zyZ*%kMSo)(Jlk@Unn<^h>b#!FCn`qE3%Q1pYGVRSsmgM7Hb$8ifHw8r$maD2kBmRX8_l1DZTxZPDQS_djjWfWlQx=tDlY@~ zZP#$2`6BgGVUi6G8mfGwUZV+sD^$tmG)Yj+0AEhNV##N_8v52SwYEB{c8T!G z;HCU%+kn?FW>X$$XnjBoqGBYm+Bo^&@*T=iLWn%gvWL81Gmop(n{9i9FNRX$UpB1w`I3$hY+EzE&LApv-1cy!P2EJRe!o(R@a1| zRsWa#g_*)P9D6O-*ax=RU26&qGW9-T;tXVyc zKkBB1y`~AGUfLSn^}k1LQg)MVA+(BJ?p3l2bv~r%m<2NEE&JV9!XE>d>Erl2A|YZps(_ib))o^JCO{Rz6a0Aufjn2O<|D6 zCb-$rA~aTuJ?KH8z;6i7Q1qlnk?p0wxH@UaIy=ePMnVUzYJa=Kyt5}3p=Y#!D*2a8Hu z0Zz7kre`=TR4Us{mJaqwipd;!Mn-}Yijzp9SZg~kH90e=W71jJoAd|&O22_&S^@0j zM}Ytn7Eh5EzyP1~C{ccnY)_4$ABnH%?D{ftuf>8EP`5<2kiw2PZgF-tzOxQ@cQ=QU z@#a6sL~EdHwtbs@x@!*D$$3j>gR8Pl)VVMl6XnaTK)bGLj-N%GaXdZJ=`0D(O zBORsmBe5!?=(=P%E4;s4U{fhVs}Y3jw94}$uFW0F&9ms%b{KO35AI} z;c3%!@S4zq46hf^CKCu9J&J0Mx=~vVal{*QE^0;!;zYs5^)Z=UPs{`C5zfz+m$;eb zPg1lVaf|lp_8rbE;%??9T_#+UDRB@PP8D(;B^S(_>5KIyVyA07xDC&9yl{l+imtiL z^bmJ2@qsCjzURxN58yI1l6VOY($jHk$zJDQbe{cx)E{&;v5fFRW~u{9@$yHNa01$I zj)D)-bT~_UANj~0;0uywRCtE%FjCw=NB1qhZNJVa42_BCdf;(mp za4d1G=CfSe36V{fu;NfE18apX$q)H1zU}ua^oet z_#&AaARL5xKpD{!k0AFm7s!*gRHB$1h06&!a^dkPU-t)|O4#sD>wQd!OVD2BB=k~t z8>dKpi2`Z@xx}U-_L#PyH24sl22sK&`yKX?ZIkPr?O#VTVTSD=YJzPq|IHrdY~pCi ztDQe^Ix|@^jekuiz|rDvqPgQEInC&~4NrQyicMe-;jlOg)bTdz5Z@hd;-}N^gvBxy z@WESP37m+xV}IfS*Ug3c))~ybxA%36wwcb+yubY{nP=AuMfSc<(Qf1tolVgJ zcRZc$*-B1{hrl|t(KUw%H}xV~SzWlT&;w=&S3q|#Mf9f{3d`^eVLmMp8%jAa2U}qQ zypG$TPeeO@2QkSm#hI`a>xg7D3JyaNY8N^!3BoF8G_r7dbV(YGUdw*rKcz9m3i>M9 z(d8s6O~v@IFcg-8Y>{`(;XgRM*jBayuEXp{#~m`#{$0$m-*Q#jS@yo;8{F<%PFWd- zej^ZYDkyT7qZj7Icz|^p`oSl_a^W)gDpren@}xK)FB2zI@nWs?Eie+3Q81F=IJAn8 z3jYx?_FMQA2tozKzbFJ;g&$QbP($fBblB~U_OfO)obHAe$o|2UR6!t#oG51d65q`; z@JH@48UuK6+kH@YQ$hV3c_tl z7-{(j4q*pCrLYT}5o1ADVhHfZ*Fgv3KaegBhR4Z{=oGqww?Q}24WtmOo!1E|SAmBU zm(U)dg}j`AE_od4%oU-|Oc8YAbXX#-LG2{}A+uyI{vggJe63?~vO5cH2dQubdtEGa zbr1-9EL-V%=eDD+u8T%1!r+5K)9<+*kymp zrMi5W&oIQj49#<0;_kSbF;|@~VTr3VKH_ddhcoF!C+>`}Lzv|FDsHh&&{8{s>m2i!$mW;zgSnPhCj4{&cV2&K}8(QNrU zv>L2Ha~K2i25;d<$ugKLIfi;khM`Jy2oH30!E)zkG*~GAGUTn;pN0!X2k!evxbG!L)EC+T-GY_4e()1r?-6kKqFOK`NniFeh~xioFA)}4D+JN`L+rqh5(f%L#PRTexX0tF z8mtAYs8_HTH37B7k8nd+i7g(jN!%;qh(jO^k7Of!C&^PxXbkFe#MF=FEC~O2vnS61m^EzMa^x|gl?^%B|muW3_bsuM^ zyIXQ5w+!}kk0(zs9m$Do63}zy%q0QX&Io6m?S*2lPz1tOF$4l}1imERLnhFj3W8E< z1>~>+)gz3b!q>z&zJS>49z~1>23!XR;(0h3>tqL!Na&H7`v+a&-=TPNJd#Qj$e(_V zW|0ff1GXnR=Xiqr_-1f|kP9}kN#YvU2qD&^^CkCzU5k8~Lt?et#{P6~N=7LIbmg$!Y-Pz#d8#(1unjPgJrxd0SU>tF`a1l>h( zcssmLv=nlQHSQh6crlM4VKP37&f#v-2RM@Cu`hqw!{Qcb0nrgf(N9o_$GgKw3p&bG zpk#*$d2tDFvZw$DxFGSYixCz(JMw;P8T$*KVGLkBGl(1K&hk9_J&8#n1~HAvgKQ9r z;rei2`Js;KJm**}j9}9}$r>iy13JNoeZ&zcODrM2fRogpa3e7uEkM(8ADD_6@hmaf z%@U)9uY^Cmho3<`o-6qm_os?*7vT;jxEz$~=>#L_k*EVb1C6E<(OzK@+U8u00@yWh zsi*??xU1r4PoKQ!T){73y|}iJV0(dT<~Uc+_;DTF8R9JWQ+$qzB9j;gy2&B_B@dmm z`8$qbf{u+61`92O|A}eBdvr@|hJJ|mJj9$q#lxP&Uep{N#R_;3zXzR(uFOedFrQ6? z!`nCquEIO$>v$%;9#0gX<5t`ql!;VmHI?hp8i!_3Yf-Y8i?+GKQA6el+$#jJ^*eJe(YGHJI8zSza5vu7Wf=> z5U;0y;icdw9>hII43wY?R8O>krqMj=0NMe4(RMeDnlq8`pl}})^S6Kx^I8mXb>&@d zJ(nq7Wb@!mwvo_)ImvZp;)Ep(jYcr-NN?sd-pF1N$8o#dEBH>1ZTuyM;%oUALX_BA zSOEVMGSO#oC>|v`$(!H}Q2?(Z4(;@u=U|9%3D=GY;U*FRuq`$~8NNqu!ux3!?|}t) zIp@SNpaJ?u9zutxEVP;0gN~vobd-^yzV2HvO&AO*K?{1agT)c92SR7}KHgub=0f2z zc82hf$>L@(vjrv745l%?iGP_F_%pi+$heWrI-YRk^Q+vuJT6!w01*j&;WXhAdM-wJ z8s&R30qiGiZ~<B&76mo@zz$$D(X9NMg5|0x_U^F3m z)D1&g&t{S5VbMlD9~ZLsu@!X2zafpE;qy3!K7~(vn0|oQ<8eX;rU-A8;bCtoH4*)d z|3w$M5om^cEG*;4!EV9@&&D=NeCU24q`N!vm-waJb=Zh46Q8n!xH=|_U&;Ir>|>VW zQsx=alpO}+I5{_od+03Yo4da8>$!*gGvS^9z!70ITIad@6P^~a5HutN;KplU7R*8^ za1`z@oWyDDJ)9?=!P!uS(@`ltPe)`!RQbf;ohzGardKHW6N8 zU3?sO%Jn~9=Q_?$;|B8=g*|*F=p=MO@xmRnTI_{+(MjmR8+;a?fShMjn}EH=Zg?;I z3ug!p{1H<4A&SRmslE6t8H`iJzIZLqF%X{+-w;2*Ue7d|fx=J=I1UwyZ}C*FCB7g`!fC*U zufg~DI9cL(_Iuiv3UAJXJz0ky5hip;yn&KE8*L-@2RtIA0TX`_v|&4o zBRw3Qz&_?@i2`>7q_H+3kX^=yu`01ClZz%ZwSQ;) z;k_USulM-3H!xvHWT7wQGxUh`L3hDfw4cdCaqMDvRoDULJnNz6J#mY>Ksdw>;m?Wd zxX&P)Ya;Ao&+{$V_QH3Dg~cqy73?4ADf?X<%l*kb=PF$(d`C8zU%`v~J#jfN!a2e; z)I%sldT|}G2(-gS2+&ga9!^Iaz-FxCBk>G=2HpaW;LWfTUP-LLD@YC}!Q*&^fN)Qc zfCOTQN9S&oMm9lL;405vau{`Gqu{?ne;6V32g|v};ti&y@RmjVPr=Aj9*<5D%xsRw zqqBrfY@~+)VfZ3D8QIuhVl_9L{U2BAD&*TU8T>N-1%FHI%{!s5CreSnHW~cmv}m9#tYF9JV)q{yNPK?#LqnUJ__CN z=uAN^&<<`o>d9~(Ht{f4*bb7pSfe%6=QV7q`LU9l-5^V$l?xLq~3EYU9 zfZyo35RV&h20T!##A7@j9f|$%Q1S&H=jr}qgsV7C?2H^Z3Oyx*(P=Ua?L%+T2EHrm z&e-7>{*s4H_rO^minWYc^k*ImZTT{OD!9Tu79Vh}_-pKQLCG!!YuK?Ev0HFAwgOae zvw4CmbEop%n0S5@--1sU%)AS16b8XcAsuxWd*Ed8x92>MqF-NNZ_h) zthml|$HllC+KJnfD{vRQ6Le4Q zDsTj5aU<~>mU|{z7Brxf#16FD(@p1i8sHeghGN*E@Dpc&1BEZ(3I7l9Xa5z)Fdv1@ zoQuB)8u1d)lS>l1a#}u%eJ{le^h2Y>Tj(txi?MJXdx4u+2Jd=ua~vaL1g1e(WEOUz zXK)nSO2nc`#1}LeXQSTYQxwKtfuFgPaJcXfcqd3eG#4hWVCsY`+(EuT{KU5ee{xra zU0fIbBU>#_WS_wz_Oqvj`9mXjKq%+6Y$tvVqvW4)-FU08OlT~=7UsZV!gFX4TcDfb zBYYQ(!jV9Pb?|T40CfN)y2fup)j}^MfF$IC6HqOoMisC1lcl?O2k4Jm00WZ2 z-LNqV0|U^0J`a88U8n*KM1`;k`ha(#4B`TM>tWYJ;cv7H^g%=MWE4egMGC?f$zdaC z;jX|3Tpa8t%mSIhA<&V_6Hl`Xg*=w?oQ;xS0#wyb;57LhZRv Jzz+Zb{|~=C(N+Ke diff --git a/Lib/test/audiodata/pluck-pcm24.au b/Lib/test/audiodata/pluck-pcm24.au deleted file mode 100644 index 0bb230418a3844b81637c7b4b1ea3f18f3bfe2d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 19866 zc-j<~WmHsO7shYR+(~ADp}Rvxky1oJ!U9B06l_#bK}E$t#12F;ut7yIF#t(L6p;`V zk(TbBVY=tu_y2y{Yn=~go!{AeJ~SjRCsgL6Z_=O^E^k26&ou`k7g?Kgu7Zh z@GW!yXqF%vM|_Q<$S0D^KW|m5UJ+tiqVen#r#C`p&9}2CpdC?^h~q4OuhRgakvg(0 z%|PvA-l`%`dg;^YygbI1_Ii&_Mw!M?ej06J)(*c{l#M4zH5kPNn^AI+N>K}0x?jz& z|LU&@^#z1N;gs5>tDmM0C2VQygnEwgWna|-EmJzbAvnY)$+RMcY6Qx+uYUt!CGsX)sXRWOl#9rXqI&89#K&6 z<+MP>@)%CqK9#K%L6EB2Tt0REhbsM`I6Oo-WVX7Fsv0l-sJ|DFw%szn4}5%ooX;n! zy`AY?MkVBpbr&%mah;;;nu+`80$+71o&Mw1p(jvL9gBqCuOCCi( zXIOQ4wfvtt`8LXV^&wl^;vh#dXCl4DoGrwe$CnWjBQJz2Ste^7AHj|tLQI!BA()& ztI^4Y_}u-XeHpms*&&sYO1L`I8pZ6B%CB|dQFOmzA}}?kSs#aRGs%O8$#+9o?dfX2 zy+>oOYS15s?NQfuRs6@Uy=*#um9<7$=!o}A=Cj{FPkyEajs5o<19XkG_nt#xu`)Uf*B`s=A>- z*ubx=&P%VhwWq(-(?Vz1wqrb`i{1H-m8C05U_Gqx!#E{XU<-I{8Flv=Fi=NPNC!$Y zI$z@Wys_Y2zF5kqF4;UhdbzQ^Be49i*Szy^UFg)Vevl;2TY8gJKcD~DNw#HFheEQgS+iX^WniFv^JDUdy;dLA z64?ohQ*w!yaCvVUDz;lQ{|(h=opf&k({bRx+n9K};m(URe6hiuGEx;(_3#S9xP`;b zSir}3{ypNH*6#lCsj)HF!sSDyOeEoI-=V$^#><}j6$9L?ZmTP3%H?j2BAV~@-r32% z1Am4O!qX*BI46%V>fTCEe=k_%1r%kxuZ)IUv?u}_c)LC{d>mR5)%JD-Shdj;Ux*b8 zmCzep?V)VbB79Ztrk7gKLbHL>2Z#|pjw|}9mmW1Av0|9@uiZbPG5+@U8Zs+Cb^2VE zIw4_S))KYr_y2o8rL;FTLxDPg3u2$5BJ&Eq3B~?;&!B>6_GVeoIV{Jb;#{ai&;Li{ z4Yt`ImzI>FjqPgL<-M=kyMIM=V~@I@6?E|mQK#PSS+faFA9~NP@@__l`-@e79!>AB zLh3ilijt0IR(&WcbRyGS_m?Y|Sk zz08&ZN77AMWx^A3!6Z2xL9>j#4D^WCFY9&`ku+2Feb!J7-M!CgG7k;CbUUrt_#yWf z#C&ygu~R8kpE~-ioRB7J`4Elk&SZxt^_ccG3Q z)RR<`4tyJ1KZ-0)k&VIlrZ&&V$Q=`P>%#~c+y2kK;0W%NN!s@&r+Gic zzX3>XCY=uS4CN9Pzl^U4NY3|}Np~pNT%Xojrb&Ozp)r4Ii~_{WaVPoz^dGbJmN1~OaSoFcluy%K6I?EJRz_vG=ecXyOO?(`(- z5;)5TymO5I#f+P#*qz4&%3_h)0bDvuB=|$=T$fuA#q?fMH&m)No}+VMEoJGj#Bmie z1&?L6VI}CohZOlVV`^8h^skj(+I(rjV)xK5N{<1>+L_>G0^)xaJxU=`Ur@z^<|BjZ zOd#pP4rcOAhXFR7+%?DHF(utS|M4s0^1{RI4Fu~mb1WB~+DuR9}*nO0**y)~cHuxI!NPW4#8ucpGXASX7D{|1Jw=q)5+u<0R zDQOvk>lvb;5a4^NutV;B=%h5Cj3oA9KQ;p^cM}AU@tip7nZ6m+H1&&-Pk)})ICW07 zGFWZm&dQXhv_p+02b$4|T}vH?2%m;F1ned)gNt^*rLP1r5rM05zlCFDN zQx}rkk`E2op0YL!>3r|2_dd1LfZg!aqx-XLaR1wW(l@ttVLOC~A)m(5|V(HkXEm70&I0aZ3FfT=Mr8df^=rFke89x##)3EST3-Xrsr z!y+v$-tI^9wYG@vd{KXyt~?Wj&&@@q9!k%wq`nB8(Y;k8YQ|UFFRbE=%}-}AIe$ab z-qXdq8nLxxdXT<*A0fkePpJhOcdEU5CdKhXKI;`(>xq59EdsY~iT7GUnm$ldgZ>4~ zrEFT*F;nh+4SPnqr>%y$X>)@b^+En3Cx0ZdWOO(|wLRpQ&jL}d*T8JAsb}ljPbLhk z>C!@LJMTWRT))55ab-`=v7W-`Erk~cR5{eJhhsY;G(*_ad0#D~0_69&^!^%@wp4Oa zLqn^j)geV^1S(2=&XSbyqdI6tW4cRXA)Dl}3)NDuKnir9Tesda*PYFMDT=6I|NU%# zvYX#EXq0ZJaDM?ExAK78GFN`&S_RiX+8??WqB8;Uq5-{TugF}}%&!Jf6 z$>O3A89U;#4dLW3eA9apz4gt~7SunSy5B6YN7`s9z;i?50P*r{tx~_{CB` zxuE2xuco$J(UCa1g`3M~8lhq_x}p+0TTta$C4TXAjWRIVo*Ew7H`2$vwu!X=$X3Ak8~$Tj!tPl)9JmS)O)nP z#D83Sjq_mYHJYhXSMeA)qb>6E5uGrRd(^Wji1mt@6Xy0RPx{28!-hrQxCy__m3;Y@ z@1!XLK^(<1%VZSV>rMyiq>E&Gf(%B=b2pFctao(;64gJP(heG?bQMglF@r~C!OL(M znKTu<6D}}6TGkS_ArtfrXm)OhHv!z6ZN0w_StSE3>&RcJHY7}a@9}@9HnXl?ecj~4 zAgK&(HWO9*O*d*<#MKKcCs`-*0+2;z9jj_5#>&A01w)N;PsX>e1ly zde~4Z3|%#u7p;v-1c!3XicK+Uxz?Kw%AE^J&{Hes&4^%;fro$DwQ!x&>23a&RH2b( zO*xh>fC_2+Goifetnq*sCL23Ot{p)e7-KA!=Gl^ItuN-+aC!QmTKfcAWFfqgq0v-G z4S22Jl~1MRnQY!&wC%h;b&L8IV-4p7TN{il3E%|&1?PLa{Z?V)fYXOO@L^ody1mec zl0Uoyz-B+MV^#q4bKx8fxNH$<)Ib(#>V=-uI5x$jI_f~xZzu1lw@hF+^-1qSW*8sA zn|}{JEfeRht~tM+ZMUvn(|;hS7ax20uMaVQTG%dGPqdf!R4|$yqDI!AAN$8*tGqSV z-WD(XXufX=aG$4lKuPOZp%VSk@uW@7KW3POR|U~^8Oq-uM<`u)$nT>RNpI*?TR2Pf zxLxBz*D%(ni~+Y=#%!D6wbP7!A2?98DJxcyAFc6mCgruGeC}r*zm1?}naQfX8bvIN z6r@O7k9JrP?WyS^B}{C4^qBLnp_^*HFeC>@+NaEA7%zL}?bxrDViQcYbO&)i^;wou*~W?|{4`K!~~|92}j$@qQV zP<*?(tD6l!nV^1;Xf#Vk_@r}wgD`~Z+IK-3RUl3pR+YGY|5=N>QYgByz<2ZI&qIlU z%S^A@(5KI#K`(Sn=BaXcM)r#;i?ej5Y&x#VsUeF@dHR3>hQ)E7deS(O zy-H8j$er=XD5$IDV~UQ!j%uzEQPITP{X;loGwVRr@REA0@NB2#8NA$}^ZN#d|Leiy zS!(bpuCIyF%9o(fUQ7N>^QAf5<8PMGBdPpp^W`zKoNk*jHL|SESm4lM(nS|G8WhFj zN5h!b_WUDvHGx)kbh6{a0)a;(k>sin1^m4H6L^>>IHd#UiM)$Hl2s(fZMW6i)>D5T z(BD+9j9q4;y6{^*rB9D*+*U)?f6ijil$$Cwmz|obu>}b6>)7C;#>5%JN?cbq_&rLQG~xQ+7VJ>mJZxPf>Rj=sj!T?s{Ty zLA%4@Gwb}apB=~GedeP#(dqL(%&mrf54RA{2-MHz{0C{VXc8x85KVSD^M;S=1G&wmJ6%%vvKoaa+tLa@Z(6yG^!eh8BZAl^CoM z{$y-P{LH99?%Qw7UuLR}Z=3dQAuRbk&r`cE znnQJ~K(7G7==w%U8lJ8>%o#)H2Wqvyr)_g_I5@7M!PWNk*Z$%nFs;|wrtDlZ#M~~b z3oOGwyzSo_KZzft^c!`{?Wn_%Z6m+IY^~1o4dk$oWBU)2-;tzvs~(Ebc0boo`(QK~ zNu#vbh4o1U2ka*ekw11;PlFYcp}PJXJHD@kGWLS|pYfXfSot9%rRo~%0)}o|+kOq_ zdf(SGDgfQAd(B?bTpIp$-({}SH+Fx;g6DYN=IN5{&3BC(+>L=9JB>aJwTBLB4dzrQ z)xc>2#n+b(%TUE6OFp$v`8TRNR}Cg@)!2Ay@VB!yeLa6>pRuZnxK=ii zut76mW(zp2?Q@6fI-&g`(EZZ|oqfL?eDrj+z34`cx-Bny9$!|kt*Nj^fEjPu7Zy%? z-qf#%9JbA(1Z4CTS9boX@4d3Vk_+^-?U~%Wq(_N@A= zdF^FKb`bG#$r+J%6boBHM_qI$v z(N{Ri^ET@&S~sV92W#V2mn^!*&6#=+LN(g;#zPeJ?*`>Hx+<}}JKK$o{nVs~4BwDx z(a^ye7bbn|2D@ie_XZD&*L6DF7`evMta!nVKWVf43q~wfaczm83fs@EC!KsV8nJ}< z7|{N^g}CBYx!ZXXVuS zF~*F)xlhN)V+}C_WBtFtS+lvNu~zG1Rhz#ucBB(}#lt!aQ22gt@?j*X7P&D5Z@6Gr zc?>17EY|u`UG6AUtEjqVe~zjFf7{AOgE^0dL-Cn?lnh4vP?tHNQ+#H?pRH#%E5=dc{hL$r)q;uG$z3al z_wkX!i2{Kis2+^0#3sW!J_JY|@=Tt3nKu0Ka_Vzp!a z%&X(KUUNQbPJhwRx1lHz7v1R^f^&<=`U~+wWdCm^yfR0ubqmb0G@NmlaN>~ld0R^H zUTXeoD%ZR_j|a7{D0jQa4ZYtiIM8>94n>~pvUAo;vK#oZN2l+);P4np{s>)m6KBTj zI6#ymedb&Gwd0$tbf0PNH89@41m57v3@}lxh=e{#IJuko#~nsLrw;pdVUb}Y$VYm( zI_F8E{@l61{Zm%WxNgD>%`KT$nG+MLFyjtcU*iF_eIW$fYcNG-|KHlkn40VIh!E?p z-N~d%f_j%;AXKX=XgU%mr~iI3`@T2z5OabPt3fxJyf?z{OP&xnwQLrTA4nT`Q^WaU zOR?Z6B1?3;uMjF4puSu*;O^wHI@rUCdm;#McT|hJ3ExOITQ^L8s=>niX~qGZ1=kTT z|DSUUc*%Knjplt@NBPNgJT97he^5DX_pRwe^=nY9trNx;UA-pEH@d+9TOj4HTJKVwDSi)cR(kt4LTIK%UIOM{nASP zeXsgul;Y;Arj8k$J`=@_ClhNunXj}aUPXZRS0`Gj1Ct5k&v|{8a?ZV_%C!!P59`xAH&vk7;e!d!4Q4$Oy_D#8f;;CxL<6hU|%qkD-Q3|aL6J=9I;Fb(Hp;Rw&$Le zdngb{F<7y6aN;82Nhc?7mDFP%bFf?%wqph&C2Xy=Us|lW#uheys=j$uv)VcAKu*1b zDZ6COlwr>3^||Q%vau=(8tOB->=yU=!O4q}!>b~=^Gk&pCzXF5pufvW`dMh!JyMa4 zV(TQB@=C0?NO5Qyig3gh2sC#`ph17Nn#bs`EFtDz5^t=x@0gfq^?Pk}f4E&&-RzEc zg-Yw+gGrUFv0vin0;5iK+Hj?2R*wGNcVxm+ljoYmPY(^JElJ<6X}&p*22~Qx?-Oz( zl{#WN5>Fdar_s-y_fH1aR8-NF9nl#b3m^_&K+KGUIS72bBb;ppN?BHR~xYslui ze6?uwMG;b!&yLKNIjx$ui(zN~nEAJqpr0B>D0h4WL;DCLN1@*og4jaI99KOrmz23mX2oLJI~2PY)9JfO zn?_kF_3ACdRL*5J)P=8hR|Y+5-x}Ck8QJ1;scmM<*!_cp>jR-Ol8o)EYy4S#eUFju zBEzgF+DuD>M{V@?Ei9fdN*kw^UI5vDphcZ{c8>ClAwX(UG%c3QcrMb=lKXeF#9Lh~44{4_k>y^- zXKfAN`x|C?8VoA%4m}`c!Jxft=yqwh<-Z=>6oB*db4mAXa2IB=b5VwLdSu;w~y! zBR3kCGrvQTS72re+c8haIH>f9?SJT zqc5GB*htz_11Za(16Hazp_qcB{M>{W!x9Un^v)`Qr3=66s8m%h{ag*&wu4EvYKlVU z*#IL}neh*y{)`+S&^3Wl%8xF4v#LpBH zm!5@xl>;FSn45;o(nG4vmfdYtq`1Nbhsod@wdKj0b3ZYX)fh}7cyyIa_t6BSqK6jV zxqV;D*PFe*b|XQ*xpRZ@ZyCf(Tvq)8omv0%@n}QqnVKQydJnp(<`VTt6L`72@J(nP7tATKlo+TN*Ln1wb4BF_%NoHAg*L3!ex zEZJJtB$ba81D0#iydd(Oc#Y@L^n-60%Y2avirhk*7c|y0HPY`L-nt>A_vMx`o63p4 z5XiPv)jNYFW->KXbmPbMo>i!IR2melLC?i%E31h6sg*tNaCLRtx#&%9yXf8!2guz}RW23#>NY>SPqE(g)V7SM9@nZ{rHDiN;xy zS678*dlbE2)J_$UY<clh9BQ8{6W zf`d?@vX*JzOT5z#!pAXFx*Ko@4Y|>0)X4_*awcZDA}f{vFK)=K-IPa4r1!VstCtb1 zO^9nsHEhf%_o|pHq6kmlD6-y*!WnBs&_R)o*{ZwFP8;zY*upaluze9 z5qerka$G@C9NhGWaa>!o>7^n6juA_xXSZJaD(DC*z$8Vu{ZWsHJlw9$LqoV`yWo)T4+qs7K z`0A*KNa4nlT{A+SoTgenMJ+F*iEH6EJel=T{8f&~Xc!1Hgs?*ds#H^5LArBNx7oNk! zU;4s>q+^cSU!Kw7Q#7$5Y1A7!aTTiiBCW`k-vp=8EY2%3+b&wTvQ_|`f<2Y0W~tiH zTlycS{^@G{&}BL`D!m)uFl8-0_ujZl25qtvmhHw2erk}NK!T3Nzx!yBjuEn+^i*B( zw-6V-`PVu_?D?r{Lklm+Q?8Z9WjfFV-Bn(M2&{bukqilQ=vrR0NgAH4t-S;>Lv=Av!A5%rdN~jO zwLYYbymFkJEEo+lM?XeR{|walc~|v3Nv-D%6?u)&)3l81Am0J~n7@>JH}w|PF%Fuj ze?LQ>qlYFB02RAc7Qf}&ukh-FrUmI!Cr%3S?CEuL5XVDOD21N3jwtoiS&3?0v(UcU zu2(q>=+D%6c4~qodTR9T zNwPyE+xH}MZJ~5v1|>z8@H-y@{xJK@U}l_d+z~pNpuh4tGfSbB%^=zSqkZ0mz4C{) zdMfO7#U@YrsQ~+Xs_4=kwrwk-+0L)~POW>4Crq;D@zkDe)YdA~E?Nu4>|kw`Pwld# zpItAMkx3dnje=N0xv|;A9^xsk?zMx2qEJOz6gGx-_auq8I`?}}d3QSS6$p3dQ+m-b zH)~pTX#;ohpP~3Z?)UG5?8Ha3Yu~r;h8{V<#dv0>*V(`TICjDy8-dN zEAY4ze1TKPk0M3qv^4D1cKYc(GGor4ud9v_UzV$H`l!0JoTOE$6l_yWJ{Miv&)fc9 z1oX4xtDtOjIy-{mDV5PSs!P5TRU$2ExVrxiWZN1|<3;S{^B8q?0{kg$K2u$Cfh^~k z4w;kpp45IgfM%B~t($?5&-$jWOHLjb%&OuYkOI36rx#&#y3@4VJjK7b=@oN^T#dQR zxM9mm#mfIpiCNelN#y4=f=P?TQI!I`nQ#pwYt`%mUQS zRd)X-WbQne<{~}uus3Suw3Qv7x^?1M4hpQ9+!IbddY8}0M)u56x;%hVYKh`3qCpI^ z(N!(xs7_EX!|H`@f(3zX%?fy{N)4jbUd76Kz?x*q@Hg>}X~Cd;dh!~$v5C`NMt-j^ zeEy3`v;zW+wL)#Enx#aiBa9Dh&c&0ALs5cL1hrWj>aoY^=KoCIxX?1RSc#UDx97FGs_FH_04VZaGwmecZ zZVCvxjl8f#+(y_@{|EtX)71(>(rxtC1!4hDck?2WnG567arDoW>?IjKv1;_#c6t4Q z0VSDtN1fNwGs#m&uE$Thr=mJvr+bv}GArrjeE5Dp^dNzlTSj}WpkG_gI$5ixy-J5y zNBF%}+v6>!nZqo!!xdLhFJ0N7Nbx6*Kd?-YG8Zt(nf{eVPEqGmdek(%?U@?a%Ej8#M!l|z zO#$p%BKPQS%9=Us*lxM`!pZ5lksU`SzkL|H-Oj1?2Say=uH~rL`=}hO;kpqh)rLcX z3BliZ0q=;#-_T|w(n^W;d^2+0f70bmz8NMz*GVXTGkIH2_29*DWr1*ZDffZ_`#>3F zS~5vKO!(!%ergCk_YvNALfkg0zJDctd4&FfXk9t78>E$9 ze7|LsN`YE#G2NGKSmn!z$z`f=rpX%saG`AuW3TT;pbKM(j}?pp6(83)O% zx0=Ov)Gaq?YjvqT`;}%GX|!fKU?Z5`KHAzXb-OohJCnPY47k`#d2k4`Hcj0sgBXpx z?X!`vVHpxie0LUFeUZ9cPR(3I8)9h`a*0n*Xbs5l#cf*V>j3#W=F(Xz^Ev40%e>kI z?0kXhp+ItfC%NaN&^d~-s6p&;UftS2@im9q%L58|!k1QXZznIqgV;`{P4g(LW*UU_ z&?~8oqhFc&Kfyy2YF8z^+zFDwrtxSsd}2gizD4?4Oxi}`cbr#vG;;hi#ubwjyakga zhl%|svAWkB&1>|ZSA-`E;NzF%+y~qaGr%HA@X-QU(Mq&2BsoQ^&-q7viBK;*qHp+# z=}c0K>iL&j2*qCGkp;>T5}P|9y!I3O<-r-UMoP@sNEK*bH+}dZ;(T0W@ru~kp)&bL znZJpsN23LM(eXA^ZI32#9?rhPdMpRcR%^tRU@r!#;yNDh9s-k;%y1>ogWU63s$oL9 zepzyA1>@K%`C$)wzDQLAiEA7IEkABkJ@oRw>~xM8ps&whQVt?&%YUn}?m?ABY9GBt zIj1S_^Cp7g5%W;#sSB#BiD>O{Nve)=vk!lM)#UR?_QUBZ%Fv{ZxoTJ9)F}q_>wl5U z7tX#SzBa&rqoF9+C)@=Au`x)_AA-k-T1Pf{B${ecO}9Rb58a~g(H2=RCGYN^80Z8! z;cTctRv)0+Yb99r2w5CI{cs%E;6I%?2ca19r;ebcN77~ynd%N){7o(YO!8CwC&+3` z%Ya9Kdd>`xa710DfsZ{_^ZLa<@`bc8N&YDvvb;`~cdDo$$_kf@uh38P6vE|<&3dYb zR2jSiyP?AkyN^%N$WHE1j-PIxFY$~zec@TkITE6tNxQO7b~K)nac)v8jDU@ZcWnYH zJkUd~iqt(Sha&Nzv?+m#cXW(xQOfRkt>C7x*A0^I#!s^^BP<7j{EP7RKB@Odp(0E9 zv;X)ZB6%(#sn0mYyyQ!u0+$eQ=3>V!H zj3zbyO`$3-gq zRL422&Hb4ufBb%W?mIN1gS-1AQm{+lHc$Luo%md~$b%)fi3GcjU~!EU(I5E8IHmk7 z$$k`?)TCO3$!zl}LrolV8*1q>wZ9!avtBNfurnFHGAaB$58W;l z^KTO~If|KAC`IRh8`ntPIH8RRrdd%4F~9>C+JkI}w32rGi7>;R%*~K|KSR8$B=0nY zS>Fk|Q^2PWYXD_=87;XW_uIEUhQO(28HwbbZ3S{lw5e zXnq3z;}hEWU~15daN`l5Qw{B>5#P~qwaZw>R>ek}>2rn>cem*pZNaMbGOskAu|B~& zlown>2zV{f|0~_~Pjt~qwC%bysu#HUR;fcI@3;cIg(#?W%ln1gqN3h=)ph$iB?Xy_DK=Sh-Y~3U7d5>-#lKki+JUA#%K0#SN6MG&= z-V_Pbvmj^%gkcK&*rNG$3KTq{s8SJ)zv$X^M29G7K|JxYDQ9*xQnQuU z5(+u!5fqvDmRyVnDVN;ga%!btuJQaiA}gMx2I5yt!}gKN{~8Vh7(2G8$_2| zB`rq%>B9uBVegi_D)%zeN@8MNaA zxZ|99VFRQwN-1cCpSh9jjS0IJAm~xTfZlZZZY0s0r>6$ZGe%kp@iId^`mu_zm4C5N z)?da?v=ApP5})-KqH$p434!}p;vT-B@2_HSg~%;S)D|isXkibmWS6fJ50$8pNb-dO z(DWe@pdpjnRYzx{ZvKJ*25S0_eR>w6ye@%nf^2`FWdf_hu*-!?M*(D{ILbu z`5Ymr!_J;arZuE^rqOi_-c$fvN5ftV_<`L}!frsg1A^#`^W{)@8RbJMd^U~rWfP*v zB7|KeTzSI#B{~Hrv z>BMAf;cS-jE+*3T7a!axK6XUaR4Bd3AOJCnEB{D}oA^pTu>yjbrr3ot!slBe+IwP@ zB_~Kqu+tHB&x8iH1B7|NYCY_>2S#21#uJs7!ij_16yr3w^n-H4Bq=#S)m2SVGX&rs zSnoWvC<{c_Aij6tklTdYo8|wt<>6~#Ry)#z64v#=gX<7VFeICXH?%^X&KfJ+;jICP zXeNB=ub?0v21WQGAL!}<`nESvX%!`J4V=a$>nf3s`NT~m!U02}8j4(#aL-(U3W#97 z5s)?tSY~7EnnmxO6(#3{r=Ck|f`p|H#ddqJT`j`m24YyOFr{Dh+eu{EAh8=4&x%qp z)<~LX!G*AVyBBHeBGr$Z=(6MB`V2g&1#y@bSHC6fI6pn_DAJlM>^up3q~W%kK(9mC zolbnsJ7DsGO28-H3{WjQ&%GJe24wjbtFEICqf(ne$U1Bfw5!nD;RF{Sx*P1r`+on^xm`kwo)7SS$yQD8crO zqof$z;w4%B4~Q~_1qj&T3BFqmJLW^b-ylwTs-!tcn6`-K1^+Gq2M@#Q3y`aZ(7JnI zhzVq2$PllD(z8f<6R_GciCqlDwN!HIq31WqwmneA6s27q-djnwb3~4OL0>K;xK~KU zmdI!jx0?jt$;N_Hz(Fa{xD>~~NO#Rv)$SHExr(`(!X??#+dM^`QvCK9!FHGE_aeMQ zAbK4top2IK)D%Uw;$P)plD>5RE~4a^Tzmwr3B*7faQhmd$6hwD0{Y&>+jj;I%n)qO zgIY#ZOLl<6eb{qPpy3xj4B^xJ3HQF>(F*wBXMD>f(Yq6$I8Clv3UHXnmLAB!5hAO@ zjxy-z9|R4;8ZpH7yyycFei#Ahk3(H<$Y&ffss&!I2J4*F4!?mcjK~{Gp*x8(W*&44 zQ%oqJ^~0$9Lg>IUO0gD<`j9E_5%33z_893dQY`+4{B`8*Xou^F$`|R-x(fg{0ldwZ zr50cXUgEkaWoVW#=B=!aC4c23X^lVv&xt?n1uAXDA$GDhvUs(H!W9tzdH}rckf^GN zmdE5&Df(-pGJhuIT8D2lQY@r_8{hKt10jbP{`gl&%S5^C6nM!WOJ4}o-^b550?tN= z(ik5yfG#E_MOvot_v7UuD+aoKz#dlA@zb&wc z09b7c(!hn5&H+3&gMZyceX|xlz2S8dfO3XNPBabvO z3y!6emboKqZB_f4kTbLRUa#Pa48@FAC?yXVbO)^hf+q$QCp&Rq>ewi8V3%6y>1{ zfSIO{dH}R~$}c_xt};<9nG32d#V!{Ek6rLNM8MMwSz z>g+aXp}MkrDdaAY_sBs}C0x=4_Ff>5r$VmJN%fhKpq#WT5UyK*@7{~(d=RWV317F9 z{rL+e34v$9;Ob^Y_HDc~Pde{4Mu-;8{;e2!C#}3A6TOEP9*{nZgP12IBc~MK8YSoN z$qPax$CS8{wM6QHM8A@`643aS3ZunvR=aBHJJr=kxb0F=bS&VD@;}W79vR7l{ea7I zY~ynvFc%YF1aw!z5BC7tesFC)5LAlHT@18*BBdvQ?|TV%wV^l75Kj)@o)5PCK?04y z+2@c4+oTgi$l^JQYZUnLYh?K;sBaR`!66?Rd2t=2UrtRw2rWXfA`&!@Aus<7PMAa1 zuHYw2^5S-o9YT5^4V`x)?S2n0Sp#b2!mp^pd@>xslD^vt#l8dP7=XKXD(@x$7OSQG zzp*RTqOw!UXDq39oV<FxZTw z2tC*;Td-2~P)(XsB(FO!-62+WU67tIg(}-*Hf_ZGMEQ{)NTEV$X^ZdrrmEU6wT{Fl zYXz$#@I$wySC8TkvQ?GF_(L`9?Na<NC`gO47x0}mAv?ax4a z*TKhMz#EQ$b(x5199VJ}8pLeF?`nIR0TBz?wEn~}t9Ddcz( z>y&^S{Z*J02uqQ>-3R7wS?~9kbRS3ah9^#HVRZCZDgy$ zzesDQKzymp*M#WsPrka4pxvyfn*%r(s{(^$2bI{qR>5Eq4vb6w^AR_7Rj50@bQrrk zfrq{XQ~mJE6>z;hKC}$h+6%;%5i7re-WtSBJjl5V&R4)zP2hinAzTGkKS$19QGP8) z?$*loND%K1P|*s1H2_2(;JH>v&RM8qH`O%{`aJ?aWJ6yf6+Ak$uMNBI0Z}H1N8Q0e zJ<^g=h&~gQPD4j&NNy?A5G=b{3gu;r>mETS#Te-mxZw_VIs-U(McyI9Ll#Khyikp| zN;JvJ2m@7huR>QBiu@~|TZ}IllHD&;Y@d?Nj#qLbWmFmH?9bXd%XMMo)??O{Qfko{^ zJsXg8iFi~5N@v16b7=e}glvVs#DU+(k&QxCXC!iMr)>QMvgRwm)qp4VgUe3C(Hr5* z?J&!maw7%?KxAqL#H&-5FrZhjRaG&NPc~uWAVeaPX#XJXr)Xs&6!C1yK7zabqb)l6eBOo_D?0_XN95)AS9Jv@UZ8hQi5yfI1F!hS^YPO>KsOl+E6laAk{VOit zjXij(4EDk*Ut#-4u&H<;Asn~Yfp-Su*S0o;;;lLvv+ zbxNIZJi|;XS%4kVmbhf73_wNCaYYvwe7IW9B>*P`@_By#dnLG#C5QzO^ zA-YO1PaiHl4{|oaQNE;4r{QHI#Lf`dQ;fashf#fHa~zcU88%$@pW~zJen9gq(Cz=A z4G1y75xTw`i%~!qqb2)OAiWI5v8Uic6P)P>d|)ZFnRsol>|PL-8!w6TQ|&#bV2PA- z`5>W2;XMsZl*sQCDcJ*Ztv2PnINA45d{?LJ^8oyGo7|$GaC)X(90+A&O4w2L%})gu zOLnTO^8Sc}&tsZn3d;r9iZpC?D0cP?o}Y$Qg+d>0;4`A3#%1`&d&q+Oz;1}>Weoa$ zK(2;Bvy-6I2AD<%Z&ksSMSy2A;%+T}G=T&iP_^VCrWxP|0owgW2S@Ie6gf-*x?hM!@M$xbpdk~@go*><~O?5!OVCJ)2co&tI6 z5cLwp=J$yEQx&ipG3f>`Yr=yz;A}Gd_$cvK0~~(>Z8w7t>jOPAd>mToCZE5ApkXWj zg~N$4iWek2Y`ZeaO?G&Z%7ZFCw_5d5AV;cHlToU&6wKNQcl?O$qk)a_Sp6R8S2Z4D z39lK%r8fxKbfEef(tZ+ryA6^7P|_rLGZqd$2?8~6f1=Xq9Ac8I38^vkeeKc(p%@L-f8 zq72LLlefHAZXc2FR$){}`K&KsE?K_V9{GG!UM7csjVexm2FT9J_3!0zk5r^|ahsd! z_;uOky{d9=RV<{!a2z^>`S*g`Qn44!(3e8oS_wn3_)junnFDas3gHEV2hCxdHfV(e ze6khRjsfS!!g)JX)OrN$R7~DQDE>f2FFctCg3IAgHOM&*{4fC>RD+V%;GkF&hOk$kx?l75LzTl6SB0ZY*`{wlM+&yvP=l6<`psaEkq$(WE3(*MT$^D zgzU>hiy~2sQqO(1*ZW@o!u7e9FQ2!MxJJofdzy<7I}|XJK0hR5D|JJfMHJUfZ{c$@g_R`>{)m6B*vXU9 zxtz9dV22abBa&ZoSAA`9w{&%Ok>Z8b{7OZsp`owQ$!umji!M3H-iqeQdffAX&U6t^ z3gun3{MBpmYLMuqML)WVm_#_fMyP2}I6>|&RkX>-=aM2r@!p5Zt?RORnz#)m)O}w9M40W4Vh1~ypXHQ zRz(iejhx0)qIvjZma4^;i|Bhhd1Wqj-^=Rs)yGXdVv)LjBih+ojqoAm1Jr9&>3f5E z@4D$*D=N0R7rT&9Pg`NClb>@%NCa1)84B)d0F_b1w9nOII7+hJ)`$T++=y=Q;BFe) zY6f@Pt)6#BzZ_NfWRRfqYVl{q?k7lQ;nXg)sf7>i!wz+AS$B;ad$c5M;PaB$v_O8G zh@J0v^{;5;ZQ-~9T=$579UyXvbRDQ5H~BqQ`Rb2uj3Y;G;seE4JqPn`v0r~;azQ#p zlO1pA%S+_OY|(5$ZU$ z8*moS{!Y}5tYJLAWwk$_5=LvL@$ExJu#T6y%Fi1_?*mw>BF+%z)yrq4}O>iUHiw(|j_9oFt`w0c0GLXS`u+xa!ml=8Qg> zfcK6TS)G&yqeNy7=W{&L^5RfrnH`dYvT=9QsmUWLC4~8XcX^zSy?J&gP>kX-p5kdaJNA;`wi7 znvZC^3uku|5ga_C1pP$p&E?TSN{T>pzmb<~v5h56e1KaLu>VjvN099`GJHNeT0z#E z@y9JBX%Q+tLK3}j_))UCS~I|qY?`cj6Ha#ZM^948|Ged|a>(S5IN^8M<^7J`G~)B&@%U%N=OOcY5KCT&L5$&J%m@)2YS$ zSged1&PrRO$2w*;R&3Fu$ql^!emZiec<8P&1-~6lQ44vWKs}B_ZX$iMMf&8h(EI9j ze^!;$lDwD?ccH)P@s(#df5|U=m*LJ_p2Z=PMbH6od?YG;;bSWqW2h`Xf`&VgdQXha zV3|F>?T7>IVYLNXmq6NDaf`hq(2>vY{(m&L=Ofv$1pn;4sD4U#5Q%uEp%!GV6;7xn zEA9w zQECDw=F31!#VQ*a&n66^=N_>CGd?sC|CtXSr%_&Ss7m4&&l8s{-sv0(eTc>wkfl?x zVHWwLkz9)Udc-i1;?3Mq}bxM7q_Jshu@95&8Wa{Kz8SXT=$NVvD8Y6=+1n z(hl-FYr4;dq#v3du@F}Vg~K6c26spT=eufSAuhG%Cn~XXy*M9yZ`k^XQ zwxE%tTvpRtcPyN{+N&;~_}X`TU>(1_UNn5>IxSjlBitFTR>h?a;9@47){>peGKyt2X5I^%uA03Ag1EF_eO5`Ti0v8s1u$bK1RMMg)Vw@-;#0hs5EAL8|fM; z+el)42HmzL7BygGN_vdcv@IsRClR`yn8(XA7NkvUk#ZHDMBvYEaHv7q><$reO1&}s zp^|;4!0&@-cmRWfsQWDZ;1v53j6HgYJNr=nc7CZh>Z;IODt!yoVsEj*mwmV9Ii{$O zEjI{6ql(x%OJP5Qne^iii|O@3nel=iii6SDY34yPI*#eZ;p4F^wyl_Ugb5$@^lKhq zptjNH$(-$S;xBuNV?9NO6sfKhex-QRUU9iSzy&#|4*n~aSChz-_h|k`Vzd-@GRF5z z@U;ru$pO3*WO^_ZCi0=?AXCJN-${oc=K+Q$#(x53E&)EeZ z@|AWUpz46KbvV?dqOx}IGUq;6 zIw|Wd!0^3d>Zz06Q%!@k5FAv7@4{ii$mURMfR& zk61wJN)07pDIp>C^Y{IAW_HfZ&Rlbz`?>C@l}qOW0OSD7PxyQC0O;uU_hhp>{hQ^i zJ$-1zR96Hn6VkePynB750 z(ht7U^$`(}jtD`M6Y@Z*YCf>`n4G7J^@bj6pM(1CY?K!{4Vl_^K*tYw1MAv2!f5^% zvtb@{h4Xrl*0j-hiNXf0&=BsnnIkrXi zIPOO(>0xR9z~$~8)wqYTK$b<~^>^;juCwycmzVzE^_P3Ll2tkfJ<#p#b6H~B%T&e{z^_q{63R1 z^$*sOtj^cCc|*QX*1jvE&*Ta~WBF@5^qn46U#g@1mrf_j+q#!L)v269^URcujvS5pZOxGZvSiAetP-Hmg!?DTX~!9<3CD(y*exWuHPcyToUdv zt2Yf;XHrL2H#XvYm+SJ#?$3~fcL(Z<9@1DBC+_obKl0eT40Q$1DW5mp$p7*4k+r4% z$J3)~0)06|3*5d1($es5P&W4tShsQpkSrXbsY-bPr8m|ni;Bh~S;7J$$0P&dqB1o3 z+f^V8N>T+X0WGMK$UQ2zk|JRaIomZ6NfQ~xl~Fke8!;4}T5=J%wkst2|NI8U6-(4L z?FZ5V-c-Ek++e^S9jh@2i-GOJ&)3JRDAatH3q6Rwpmv-$44oT}%13xYhf>~$e)gGs z-{U4I-m?H%eU@N_x5UVD#xtXE?0(qkSQ}KF^aXW#w3#Y@cZD|mdmiY+g@kO>0-|N^ z5XGJaDZnnfBrl#zLTBvwMS|LXxU=iBD&yjF(CM*tNVz=_*_+2}62b()(P0nuVqYP0 zE|5(foXJO^PS@4r%NoFCE+|E1t0>X2vA{F$G~x0YVpS{lQtq;oXxc(Ic?R`hpvTXS$p+ zZS>Tfd^H$24393oW&NaB`-a&h^S5YNBYn17AIRcC*16*amz~fVtvfkp-XP>S@Hn}! zHJWlR8U7%sLl+thUlr0ndOPHNOvtR8_lFjSO~gAr*HbcO4wW;&1z;C*;lG=10M8SS z|L5to=^cs=83EnyekVFJFQDt|*T7oPq|GegzfFIb{8#v&gVv zHRby8y2gxNqWc5-Bk=GXcJs{=#QEvfUEI`O!}-S#vMbhc*+Ul;=3cKvVBFN2h*L>x=;j&T$`1GcJ1pcE2{ZQltX>xy8CJqyHeuu2a;H)$O2bn?KmZ zWi`OP`Z|4hf(UrtI|A#srQ>eAjl|;gp~z)_>i_4cIIBdl;+z!;qFCX5SCB|x3{k&o z3`XJ(`|;w(kCEuXHpWBL3kbY7szwani1-@?N>=NTEP-uiQorMBDCyLI1)BH-Hfs_7 z|GDgXnYNb2FfQGNsGA}MiVk+h-mIDoxYuT4t)sSOI5cgESKAVR$u|zXPE=F+Hecx; zKMzplQ}YOyYcJ@Mj678IH;;=Pr>LUy_hDhf11RWLqAu#xnc{W36<@M_90h*}P{p52 zVE=mRUj4GSko#q7MyutBM(fuLazs0ntiVH@zGS?Oa;aE z<%|q}X#>ur?oEDrhIUG4J}I8KmvUV0ICbukGytCMHW~c)k=z5lgrVI&0@1p*RQb*e zKsK7B`!qa(*l#)U_JIV!tmEd2CeYKAH_h8xB*_sQ$DdVwXB@z9-@*(u~W|vsxi{APjGL3nd*ZP!Ej& zVmscFyDMnq;q@8)NEbrab@%B(jb%ujaGTI3(2y72ExtM-13Ahwxdo5@P^Q5z$lhL|pkvMvy^8L@ zO3gviC9RocG6s+quTzQE^Dk5tr=>V=)~xun?-59(X`^iHH=Pt#wWU0d0h&M6NEKyd z{LPNrG^S0*okYrjuEu%5A-r0eV{lS-kKx3`Wh;fxv7=S2!uF9IUGnKc60{{EY zJANVW=lw1~c(4_Fv+*nx-LGXt)47BoJt(ukzc1wPPsZf=4+){i5tZM-2|yCihk@HX z5Vo=$T<(RCN6szk_9r&LG7jQHx@94Wp9EB$e*t)DM)}WMODLy2QmbzXL8iF?-k!7s z=!brU?jb9vGL@c+n!AuH%IgIy{S~Ni>q7A3j1v{AA41l9$IGHSBLF+?0MV-BBs*v1=Eqhqhqgbnb$KmW&^mT)eD5E6Xf2A#2y3^LauVG3cJ0p$?zH0? zPG4<|Xu*9N>t6_EBadsa-Cd#Ep6LiZ*$7-ewyKHven`4;DYWI>(2DYFsE?DUQM_}r z<^RvK?`pHN+l3h6;;Smnk7Ym{r=`G=AMJ%`B#2F50N?sa8??KL6n0Mq*q)=b*wIxp z@Ye@~1^>abSL&c=z?U%Xew^s_EfPukM`?K<-s8McHuBxbkI1q8ba>N`Ce-qJ z4)f%!8P#P+LX&cjvh>0))T`TEs*uV+&0hUf1=Ljdxpo~@c;hH#dwo=1yhjdshT-w0 zP(ud&UP@Qv2k40H4ywtPsW7^z)J}7!@5ZLDT5-W7_3ir$5C(_hAIr0lOSK02s3t;j ze1+1~WgN||<50Q_xwPYvV1K`pf8C+pRaZA}3~v6`PUV}{n>ODclHDiaDYV6uYOE6@ zAuE}8j2pLCAy_L0e95I$NlTeBq_PaTVF2H=V-CVn4$@JjdLR=OQi`ZEP<*-%xOXPw zZ_Yf(T$QIqys$0ViqL*Q*zGueRZv43<-&y-Oiie@*e~-VR{5dWP5a z+(5SU>8btfC8FxK1k*hQ_n}8LTLswlfhY-y`6@X&Y@GlfpDH+zIqaWm( zd=o)vKf5S?Dcu7MMKb+%C}{OldH4<>_s#7K+!_)|%N8F}GJUzK_eKNcUK`4MIXnf} zFYP%}xN9P1tbfE59`^!uJ5o??%1WvjgRT!xr%J^iWuD&$qA29FlJ zK^|x70kB_NC>?NN79D`N%+0;%UIMQ~*ml&4cn$%ZNv> zrXf$SN@_&MUBJ~KV@%x@NE~_xYhAM-mD{RMoSWPp@iu%?I%nJ*FO>aKT#f&U1aZ@q zk_o$%obqFJg%=5_@7^NT_8h$c|x3!w;7Ou;n*wHpaQ ze$97aFnPe@>ecA0dNe4j@&{mPL}c}=GRk|!A+n+Gzo5lqqs@h&mO4pbZe3szcUzL@o5E(#kR z32Q<+(Dqo_+?rFX=zxb5!EF4DLTruDGV5iYu#TtXwJcCHw7EdKKIlNn>qkPL(?+~? z;V83zxhLuZHdAi5HUaNZ6|}hUK2bZN4dhg{{undNi8$O^Dc;ft@OEJ2 z-Ovw+H=7$@BRfa3JKxS43wemO=-R-rWi-Vd*NTDAk5fg@C3t(GgK}H64*lLV6MF95 zOJ4at5V;ENOhEgY6yLs#3I6E?ojt3*d>wcVwHVH8zdq3;{pYKo*w6yX{Kk-+mvgfU z@N(3)(`%65{|L0Xh}0#57)m?v3aSV&)6EIvh}t_#fVaSeH?6#lwaLVxL-NAxbu}M~ zkM2<0Sh3J+=~c3_X#nLP6NjGdn+|-?X*xG96iS){l^)qIfa7%2e)a?DhQ=)kM8keh zZS{ytFnDS{UAb>HCD6Ji=sZ1v$JR$gz1LGZWS^6=oGznX@@lk#hi$dZyU&sC-ycB9 zh$||;!h1j>y`v4DIiG$wdpq!x%p%=p1(ELEHxl9P9YACnp*D>C23fsfO0Um$>zuno8; z)qw^{7ljY|9dW((C~*5(LpTol1qg49WjY3}2F@R!i8AsT(Q;?JGJE@EsE?RL<$1)R z(orRZQ+Ja0o94n0@&U**O{VxAEL8C;SM(!l0jiw5ozVUE1bRE9+$SC;Tl(GAge)Ek zKx#vTugXSA^G8#5w}f`T8;QhMx)7GG zPqKXmPsLfG&o%{*TSU1(^rYLS^aXD^y{7{E4ni#lLm2mS2T`Yl9#FU_Oxap?ma*UG zWVJn#3tLNYBDy&i*owAg(Pz)$&a-IEt6U$-k$ZS)=;z~AmMkQPtlrnDYT*rfjn8wL5fq(^+HiSAn2|cWC?Np>oe5 ziIj_*x59a0%1-~Ze#lZVjcgk_7HNYTuZGcy7nD z`GK84EAMfp&-N)q^H>SqlimT%3+_`bdn%CqQLj%g-+utkp5h9zd<70(hD;rPF#+*M z4ok)NwuiF%ZJ1!xrEH(zXu_^(2ng&j0KUmghdy=fVg5b~l8hZd1P|oV4*ila;XpUg zwCFzez40ieYbYhNBZ@%rmVQ+2qY~=Z{N=9b#O9uRRAa9Z#tOM-`%0sy`?IKenE~0TO9?a^MEtlKeXWG6zCdvg(zE>4qZ5#G|Zr2 zRiN@RVl{Ud>1ClvkINwhr#S9jn~lZD^yWR;{^=Qry^vAi=jy1+VIT3JrYMjf{MYxJ zb146Z>ydNqv?eU91Kqg#80`Um;rb;hc$bs+QBzEgiZASGwi-uJ?~~s{aPrR3rcFL1 z=Z=wrnRk)MF4T0HeHgmsPDYaVD$H-j3(B@)7&q9y1OIHPgMP9#WX|mDzdh-q%F|Vf zY%|`3dkotI>+kiX=o1=P5xWt-9ozy6Od+7es|)%mOhP^lW6-b8B`EaOJVYPPBO3Y) zg@!&N{97CYTkmCLHp^FH?5kt(;K(IV{4WV3ib|2YzK)X2yRY;;uceuJXO;dtyvh8i zC(v{IF#3Id62(~@l3jIBK-O;`NMl3*NuQhr_*GRS1&>AZL#dP?6{%ZJ3%!ZP~IwtQcNku&M zpvpgvBU$}NU`zY?(!FDYW zO}k6!maT%K8$xJy{vv$^TtYhkBJ@kUMF-X*nVMAU4z&S*`!#}TM~*?( z+61LMZYq`kQi<5-79rNM^IaRh4<raE5up5V7#;q6I$&Tb?HhO>vU-IL zE@^WaNPB3Nzl)Ah*f>8J)F%V?ZxE2As4eq4oJiMPt8MCScikRJkmTw2kh8mFyl)X=N6w;MsWaAw3@b-s(l!`g}W5 zv}ziP@aqI>xOrQg1Goh`b_3C2aRRdB;4v%?IEE1)J?GLb9XvSHW@ZX(uyGa zTZ%uiHM(Zw6x?G(B>9t7Pk9eK3M4&i)ZVv7QhgrpKt78e}c8MMz#oA6yzK-G3h0*=ia=;CqTD35)Y zQU0|BlrY0fNe^fSynO>T^;2(<9OsmKEMEU&Z2w-|y=*8IuzWGz<|P++nm5rAL*4`D z?#}bV?%sr!Yak)u+H4Z6%~HA~az^0gK3=wP%5!wF|J^nVIP`U=pc#HwSr6C8!>M--r9b zNZj{C0_mRTOIMGzQnHu+#EWb>u(w#qqHDd7-tiuK$j0Io>Q>TADnMl&cc9vV5umK7 zBYamf29~uXg~ZZa_}=f?M(O&{^JKQZ`))j+;CM}HFqfF zp8?_C-)15H#3aq%i%7JyneqASH`4eqcdO>1s|x*jmWKv64(6@6I z9^O+2`CbVibdUkG272RibqVPZget_Ns};4g#FX(vSJF_&1(lOZabccATlzA9cHQlY zst&#+gT6i>THD4d+MPd-F#0iK=Mc%k;$wJzd4Cj`lnnKP-niGQASxtWfLs$+Fgb588Tsxv~w@IiI>40`=DbW4-gtIzzCYY=h>UNV>Ap6YcnXYqAYk4ItsTDqbk${t` zDM?ucxT8KmuDYD$Oxckb@g@lggr2DF#6dvP<0xjekIRneeal7|dkk_awGhrAT<2s}<-F$-VJF!i0dLI}M1P zH=26UYbRt9QsIv#6{1(l06TG8c40(!r7R`gQF}g49h{+x>7N`NodWW7Y+--Gv%ZW1ofx<+l=a zjtaOe9!v4U_t6}2tF*(Yu?V=r$X67I6*AjMIq*xF30phToQ^mN3L(x4I0 z(04!N_K!<_-}OFfNV$VP=7b=csG=LMeNh)&yMsJpkHS*t9u&|hfX&-}D?B3l1JTS$ z4BL7uNq&A7&Yf5#43R9OT+Yv;L(1xq`*I!dcV7jBxA)`HT`DE(+vp(Yr&CLtQWbP# zl7y)o9t+qI!)PwS~AD$M07XnsAG z2<)~Pr+H3FwC^NgmV8XM{W(53XjTZcembV>l3=8`M>=MP7{h_<09wmD{iT$AKCXRt z`ETDlm=XRxzauoz!L(I(eH+U3O^YtnDGhIj=&gurMr?kPDr|s!F&LEO?fr)RKPDA&obb>c`H5r;Vmh!FMPqkTi z9JcF|fWS!cTmR7nRaUc;QR;ZXlbf!76S$g2Hafgtr+rtYnn7977M3pW8s#zMe=Ce11U-{nAx}^y9ejVSBBWs3lkjGA6b74xp_o>!aCoyR35b zZ7TPeKbI1W`j+AKLx;;ULe*?+k*BahN0-n^poQN~{dwXN>d*8DSopCs%)jvf*}^`j zmhE{%dFnplEf<@Vfdy_rTJc8hk**>9j@_U{ym(FUMGuny_+(~4eJB#X+^6-px{ef# zdXvWwNmcT0CnB5A^&igZIgQ3uom7T%VMJZl5>VfHC2sgxN83jKP?+;wDaqQ|3f@Bx z5KJDTLtrhRgVPCz$ny3tY0G#cUUlgq;=a8n*C$?s zt=-1O*GDWR_1E5m#xwtFnkT`ST!vm-JILHXQp?x-FKf;+<#Y$%m>PJY(Y+%qBB zOunR9gM<8RysBjE-yTQ+6G^YwyOis(Xj-uNZ|8Y7OjE6F#Z9^6nVfcC0sVRooqKs2 z$}6$JhRTslsd+9Ty_2Oi9r9NM6t6=rcQ+8e#(L8K%opIgCz1}d=0oALSt{Rg%PGF1 zDb@Aq0E$y1z&Y7w#Ob!?i1o_7RMzBiN#vWK#Gm8*5hwk>6qg?b{qn`~LS2YD$|+fV+!&<*k}P>EswJxLS_>`0bPWcacxeyb^Z__lg(EPXH?;y2fhHepB1FUkc_(sdf<&N$M9D6smwfL zBr186h<^6iMde2Rgu2w_WZC4A1pAqg+o~UwCl7i;x=k*o1LXriK>AtA8w(})Z=2BKI$AaD4nA5S+G~mdB(L^8S5Dhjq+iFgWjVeM%zD ze4D8NFqaYR6REa6{f1u>5cqSrqyk z6yqDAZXJivt&Am&O)J#Kh;q8M|LR0@hwYk{-F+zI{RxaEu$s1DFXimS-RT_c0N@m* zHgk8+j<<(It+Efk%r&jst}=zTDy;{Fv~~48Lb#(R5=90n-6#Eo9zNcrYdb%}F4Qrv_NS_!dD?Y%XZ4l1Px|3xwormH^bGz- z6+-^`JpdLorJ#zho5-4j(J1(GAeo9m0`U)?WPNxd~S&V)@KZr^OMWD)2p8?Z#4DF=O9p&$0py!vq zz^Bu1!q2$`4+x7SJ;sL6z9)*1B*cW=KJ+2^DZ8=-YeFdQ5MQ;urAW)}Gfi%p?v=p4 z^oumk?4+?=kb;IqeYFh-nn)9CIMwoDozl7cKm<7VGDzAD;;x5t6@EuNV9@RJRDjDU z+}C&oNxlX$AY3JF-Rx%83louX^l7Eh_3w(MH<+cl2IP{rSBaYh(8t+A1W!9gNZ)XA z=MVScEmLM_ibv0+bYm*%{7xTGE-7NS%Qpi2OGMQs|rUa!?2HSr(=+=}lbL)4r%2JuB1ECXjf;*!U zL`TnhjC=pdTcTvk{+N5$7iPNC}G#?eh%#;cnfLm1oA=Oe*Yvxl&bN4WkQs*;28 zco5Nz3QVv=KQI}(y~IyGWIH)+bq;rOP(gWY`U)zh7SZG@1l_V zLkSi9v7T~aF_>e0xSy@?m$_h02dW+vP`}Ub0yTqfpoUe;$=Zi6DBe&jZs1CA_OqYb z`a!$M1{4LG&n$&?@+rU><$l!?_=FU6Yo8?O-yQJJ^;C054>f~J>VGU@y`XLNBgULM zTkRY_tSv7rnB-5$(z&;9Lx_*RrLfTp0FS(iS<`POwoLn>DS7jgsxaO z8as=0HT8(2QFxkaa#Wt1vnWx_N{!e1n}k=WKOwI90sZJOg8NIN@HK3r_$?EX-S4&1 zV$TLl@J|d7q)gS>OUBb&QO8tc#uw7kIx5f5UP&8{zM$&woCVFXZ5flMr;243G!iaHBT=`Y~h}+z)T*TFB^6nQ76h zuL^^Y4`MgAX6Vh`aeen}y5Y=TtSZJxS$j1kweAblanB;9B$QMLLX)EfncV(GJx|Cun+R!304}V8B>TU;1pDn%WPWu!-g1zYTrWt6h71wZM=Sx&$`4Ev z*hFw*ZJzcY=5m+v>l)ctOzVf<;eH9jaGz{D>8qwFhwTF)yM0_;ZEq#mGa{0jpUr0+ z{_mykqHY9>=YzHVoeBjHeZm8|lW`&GrnG*0pm7?n4*C77BW#I%j0&gxq#8!WYAs%A zat4diNOxR-^>;oY*2m>8hCTj7b=L%%=`@llR|X=}{g=44%|A+DzVXF1?FitlSuPhH z4ny1pAIvRRegoExy&(;Ajezyx{2jJ1Ac?1tslEDlMnd;k!jmY0ycSobednEfR=q$` zQd&Y8PX4BUofN~$j4rUY_CBbZ76Ju#6BYIEM^f(Zj}i8Zds1DBuPP+mD{8JRP3RT$ zkzx-jCH$6t1LETc3Eu%9k?Znc+U?~QT%_<-2~tXF@M`{cd)v>0E&uE`H+&fd>zhuK zb^mR^o1NE~`bi4F?XpsCW*>-_rA<=s&9MnSN&)S)uPyT4n+JT~R6yVtdCvX(CcK6z zg~E?}fiYI5V(WILx|dy}*&{FDZG*-^o@R>9uPlY)NBHB`mC3lX{hiSTa58Mk@YWR9 zM1#i8dldE)afuCHLba^YL&;QVq4Rq{asAtyu(EFr&Wu|K%i1Xkqsa@|XZKBa#BU3C zuir#*QhWXo?GiKGs0P#|Jg8)!@88{U3WMwiHITjk4&rU}!+q|tq0n1Icts5Z{I5$H z+x*XR$2sOm$@zTLIKipS8!rRZ6FUGy)+W5_`UW71N~HCJHW1jv2ei4gV}|&EoaBAJ zr(lDx3`V!1IoO&M`I^;0CgNd!%8N9XZl%1gxgufsZ&LbXp2Cq4x1UYKYOEdP!j@o? zX*>c{`j*==eTQv6L!vV7lig7+{X*_yUM=gVM{v~PI!wMCXUJvcNrerWfzG}+X(d$x6Y^yOclq}O-mrY+yIccjqi^bDqDF zf3s&iI8%_zy5#I5sa}h5A8w<)+&e&*e+O%PPqiVj-o0tL8<*f;ev#xh<1Vo88Xhk6 zdc)Y7W(%#g7nR0+%jkxGZqi2ZhtaQp3)t5Lu>RUyTpVj=TBTFvZl;$c-)^M5%+pD? zxH%+u_5`y>&;Y0(9!+#XXwe4T`(!C4xb{M83;W>- z?w-F%*X<`w8&s$){Vmy`GHby6fIamC97rbXrmF81O;~@g$*3Q#pvrp&;S9D$Q4yMi zHxIm^WDTy(vu>K9^1R*ncfK(Pf4*Nhx93E)L8OLUzmil#mxVOP#5eOJG81`Q@^!xI z8eFiXLgRM9|Mzce@Ys=Dl5a$0*DoPe8QGL4z)F>f{nj{S_026ez3#a3v zwa3(ruGb)Up#s@@oS48q@FAMtk}l`_FHOX9dIFcFYiXZRCAe$5OSF7rTfozYMSG68 zPS}r(Vx%ATY8=msRjlk3v8jSWEpzH&Q<(+U*Y1O?sozzGqGz<|rXOg&_=&>!5eSS3 zdg+zW9!Na07=E|aTGv~8jbY~o(sktm)U=7Gb?M|zxUE+ zf7}f0v2Lrl!k$FA?i*8G|mx3B^ex*p!XIQ&rbMifsllmu{ePW}QfBP9Dy<*kM_6?^!H++CD-s6x@ z!$*SmnP9wQt^_Yw4$qt-GbX8pQG-B>z|X*$qV1%fr(>OZ9c(E&H6 zQCtjNJfOmo{#xrf(4XQS2~8G?`C73$pI|0i)Y2n+@y6$TDBF^u!er-2myuVgpw3ST z7ehCtyZRAuksVYxHcd$pF07-gy>3&Eyfjr+|Gl6E2e^aUtY+5EN8$+zM!%v6T0;5> zYwOogm2+0ZTIv?9JDf)tKExqb!km}JeHzm3%Rpd{3Zpq6E4l0=?NtUb2l2*G=7teB z)cj0}6#NL(36&=3-MbAg`p8AHG^iFGoJLx<6(sO7uL^4q`vUukOTvmb_o?R2Sq!to zAJ?m%5p4WXVy$Qu#rqT$t|tQ^`{F>)=G1Nkx7Spy{pIrn{?k(lg0Gxt=`6bzd$5_3 zE#hI`eO3Z~H$RmR7JwYr#sqofH$ZT61uoqh#O)T*=YdLI*sFxbXti3X>`yfg9;On%X+kcyGqtio zdKB<>5b3(~Ho)vo3JbnU0nj5@I&&JPpIkz4**kFE<}<+RdS7UlwWKx&ZpK8t2WsjQ z!jWZLW^!G-Z-fr6qiPmq!|L3tRPE1d8ua^3HjM2JUGo{W`PpuaGi2aBXJG7)`c92F zXUVh;jTwh%{;c(xf{x2+k>_>jkr@Fcv($uiq8v$zmjPQFN4l^oTU9?|Dq@|^<5&GE z!p*&oC)I~X;>;ou270ugQ5R!?yiPNc>JB{vY}XvD;h)Yb?z9S`m74(gH?}6Q$M3`> z!!4NP!T>^A?n$~oU=W}DkM=5U1V1Dlj*2?6!n)Q~ahSm$_=mj#Fycl=mu!PwfWD!!LMa z@=w6a?4MYjcpus-g>&_P{iJ!{d$r?JjM`8hMsgpuq4eChB&);6!ur2mgWG+b%Gfr8 z;^*Xt+k<~Yaqk%#zOOV~I;KC6IdgG=%R-?CKbm&xcjKOCEP&N!{8sm+kC5Y1**Hnd zN7T@8T+8JM)i!K;q^%*wEGmAYF}nxn3HK+fO`ArmU6aPCEURJ&**zm>&t|8zWOpHe z*WeD!_b+PpW&db#%{DE6grCyS6(hvUxk{JepA{~i$2IIX4^v$3LbXwYkoe{uvS!qJ zzzs=AHgDPyZr{6EE%>l5+;qeT*=7z5XzcwK)m}^_^(X6Lowyv-whzJW^EOYY+vG}1 zo_m4@!5}r~+U~_I`%0aX zzo39zae$(+ZZ#4JPif3Qj8G)$1HsPEEXj)}O5tED`nzixm-uH8oB|8nG#wF(x7y}r zcc+}XGrlhUKdBp6KUE6*?a^2spT^mt`x%j?0NN$2#RAXiz|yiiNroDbwRt${I@4Ee zKPfrV${Ec#)IJ@UX{m&>PO27l>w~d1gE9G?K{S7hn@-kmDTLgf0sN$;BFhFIBcUMT<+j?d$&%O$khAx3x)8omik2LuS?x1k z%JwHB@Q$_4bt-x8zTswb2HsMuCs<^+WenDs#VzE49Ih^{v2wZz6%+8n5pK+ zAJv9c-jI2}8MB078eXeO_4DNJ25ZPRi0yw*CH#C2ahJt^ZbuEpD8U6(WX^q@Xh#ziafO_9C zVUZK^axs#X)=n+vEoH!o9y_Hcu3>DUa-?+KS#|TdKD3BAN1I-50sLb&wdmgfCCBsS z2A;f52_D}%EYkK=0;O%2o8vG9$=mPPC(lj?K2iz83sgH#oa)XyKRpQyOP6|`9Rt~; zKdB|B{V-niGMu0AHA!%9V}kSb<3vHu31MAXf520pif=T$)3BFGNAhpTQk^cz^Bm`h z4c4jcqwBW?5T-u8i27`As%hM0)Y?BSxgp38@L)oA!$qh2XF0nO@Us-ihVV zlJZ}&cz7gmTpU>^nvsY&vh*Wt_JmY^Npmt-kA{gdwyD@ptWd0ysEwu|BywA$Z8`Kw z#s6_eDa`E-xN)E3xryJ@>}laif^usz%jlNv{@$Nrhq!5-JHq~Boi#sZW)0DRw`s{- zR~!egXK6j2*CAHZ*#~0#5rXUf4GAVriswfyz}S7)$MBPJ%+PrW!ObRg4L=hIc9id6 zp7ny+IqUWgM*~}I8+z2t7(QstPxoav#2E-E zZ$+zI~_KyXPHYPIx8+8Vj3sHtC+t@krx1e41_P7bIt2JzZz6A090j zuU56nmxgmcUW>Nm`=*Mr+aP=S0U)~DsAR2}`<6X|+11lGuqMYo zU?16vHG~X=tOu6OA-3%2CzAh9yI%qrh=L6FDEFjpqBNN6?KsAE4Gh&k`Fqw*@VG2GA{A<3O`u z4Pqt!m(kScIpQyD)Hc!IwAMwh5{$jlabs=*ZsK{-juY*kwI=UX@>f10?A*je(T@8# z3qR@32U46{`wwMb8;J>e#lfZ#u8aV`k)TJN2(E2^o{4i1W9j1>!Ot3pAViIR?TqdBZ z+wv~+8P1$Qm4LlO-3pe_{15#yn(Hu%_sp5Ze?2RM`|m|9m*^RH z3zG=WjQcU1uqE-F{(V8?$RaI!XM@GJvLI(`TB`8r3>DX! zp3R%KQ^nhTR@3l!AmT1}S1@lTK=z`NNY27>NucvYiSusvN%pK>)0;y>HI|AIsOiWF z+VrYDWn6lTF?J}_IDhLtH91ZLeo7eD+}V?`9dpzf<#DKG`Bd1Fw3@Jge*nxoUGsQg zX|{FuZzQxH1Wsk+W&SHR0Ql4R}|VF*Jq2}78K z=_DZ;LKJ66LNQ98l@3F-?S1?0hwt?tyl$@N1ICJhDR-INcuO?nNtz4CmaeNoaI5K%4Z6wo`9eG5V_F z@2LfNo+i05+Czt19VuZwI}_;Y1Y-+-&V=5q4DzV_ZO2E?H@FXu1jIkJLO0LnfVV^^ zYT9^1M-*>0+K>NFg#BIB9Glk$PCFb9j`lHg!_IDSbUp~^XPqpKf6q6$xYve;C^xes zY=VU8*uv0g=x*SZhZ-8&@nvi!HM}usd8`v2ur=0;%ydXryrbVq1=5|ByCzKaa=WE4 z(SakCZu+NQT+04OVAJMNX#0dMPE{KXA>x329AzdX&jf#5yjVPReikeH)*n9HQ^H1!E%uV{~?OthcVsY z)mb~RUyc^N$g~hcv!%>FNggr3qq(u=SPOn}TLr7)b8*{IT4KMq4b3?o3}$nI?NF%bWornFZIg!tH%dN$+`f>q8H;I(`$$KAW?TsBz5Jdc(%3GD`I zNPBg|q$^hE(O+h&m{vDssm(m`GGpV5aYF9HpI42S!>rD_p{7PhYaw+@44O(FnBcz7 zan3c%419-LMK-M$xD^FkS=e_Uj0{zPPyHvkzD`%6hi~eC#U#pb@Y(b~3$qpIZH*^0 zX-Ne9W^HEon0>%fvX1+Px^X|(`0$S3({igQ0|feCKC`*6U2X33@^$Fg_9B-s+lY>^M_vajb{p^S z?r}{>z(T2@&B3H^yHG6Zc zq^Wp$EFG2+*swZF;d||8V;mQ zB_{y5{2|`KJQ4AI)Jn32)96+bZl-g5i_q|5z%A~|P@`K~V0c#c@0?%>8njycyY{{Y zb?7dqCvOwLJ%5L?r$%RjmwFMG=w}7~T|Ef8n}MtD;)Qpo)pOr}Ug2#m6M)tGE8Vw# z)WL9ZAL5Od4XyMyqB&1Rc&X5dhHf_zeFo~d(*AjbLMCfU-DJQodX=(KQxR^xsGhLc zwMZ^$0D%ih_-cf@<$Ytbhs&pUEIkm5W*j$?f3o#x#wjH=IZlPzm1}sBQzfW_tHfh< ztpw?^V+C~s%{Z==R4_RJ5VOTnCgzQnNF1pDJ=Q41kIqI=1IiTWP_`OW1uTcXgAL^M zLr!ijZtX}Kr(otrM>OQ0u~P7+%ysEfn3J92g+rpPj@#!HaI>4#(dny<{CA4Dse+Y| z)-sF3El0_f-Fe}7Yclhu9vU&>2H;wQ_etav?PI%?cjawO#1>svsf9a1|ATMT|@Mx)zS(3SEO6!6DFej+Wf@o^fyU7?1b zcX_zirkK(23p&Be^Jettfkv<_*o=!u>AC2YbBMpLm;afwMTQUd^K||DN`&?`=)k!U zKRBy2oVs#U$bHOy?UY_NvAk6kje}prQZ-kd&d0|TuEuKsjgHNCo=cD;;U=}CW}ApI zzt%XCjw{HUGjt9$E#tcOiEuarWyC6@muomr;kH?!q`FR&;*4@LBfqL*_MZ&n#PS`D ztKv*xf}8U9osmj#vg;2rB*+4^WHlRpArl1Oc*8dBt^i(&;W%xD5p)c?i=V%w!LyfEkOp7wo#A|?iyfS z&pOm+xEkK^X>gxdE`$HgXcAmoWk*RvlLXP%EO=6=5q7w75gS`r8*<#uc&ewb^Qtly z#a+zx@m>?vJ+bChz4XLiU^>P#w zBX^!xS?GV}N}S?NTJp+!m7}SbnT?B^=^QC=;^UXjzdt|yXI4}!x9(`XbN>b-cj5}4dECv)rL{iDX31-~w6JnC z;%|a84;hQCu6p3Sfu0?%7t2#e2`6QTq) zynVn*oOG8`yZQ)-1F1$=X_b-a{6~uF=jY*_Gju>ds1|+q2;;XN=0qp!EiKLlNKks7 z9Q7O$j1F{`P}6s-&`7n0J93DEUl^fV;yN>Yy~`$8s}i9ub!I`o&lYs{YrHUmI;Gd^vf~S?Z*3u?6rcC#z>XwEBwJ#j6pWgJ1T~;HoFDz#Uc=fw%%4|FKyCW$kkK3w{}pe?>LUq4IF=Hz}~HRS|BO zX@XBLh=?6~RrLJ_IYjDngKLFDL&!d;AXOHH?{{el8m~XZLwW}irX4c$Av(6j@N6A= zQKQFc|0SV&s$}X{D?5sLm&YCqT!=jCO8FZC1hA@8tYA{U1-0_^cXR$!pbafEh#UD{ z$P$v`I-D;=+2@T-#V0MOdtMSNxU(D1J9d!OoE;9OMZ`S)Y@xio)JXNJgdCD*;YL;0y7UENDze_oHF&d_{-L5>EnG7A_Xw*iq5$xY z*GtKfpNzcuvqV&4fEm=+j;E`}66B@JMGQMUw&Bzr9eZj;fn(TMJNqSg2>mfh%mL;( zo3zEmbp=xZSMI}wCalF7*G*hb>S0v>OasQ1JNcdZDxqMHh`*t+96Eh7@UNbwsP>X4 zB9v-;FChaytgR!$8=TBXm5n&CRPUNw2Z+%7dSGvN1J|wbhLbhfcvbiotSzs{p0Xeh z-D(X6u#l)9AVj~4OX%BeN|Et$GV`R_N5@}L@WQJUNWeD>TD~`-js~sU7 z!9F(jXV=uEu=ShgfUOblxc-0r#!Ev0ci^4`y&s|iol39sRue+-K3l-wayJ$}yfKsL zd!-0vk2WI70}Ix^RKo1DxrF4pg?+2ZA~sbTU3-!wM0kyq`!LIoAUfp1WKlbO?2sIt z(I?@+ODgwUQveoyw(&uP6t}-x#2Ebr==HP|X3)G)w9+gkMh%gmUQt$HbzPbYHs0Vny0+`ldhS013NE=&6I0aM7WQoO{(UkTPc*{a1t!ceY2Z z(=kfIuIp%b3_ELKxkQ1alfF$$e*uQ{P&BQr5wbJe zMpAc^#cYx_h7Da@&fch_L7Spd_V)xmZU+S1oITAo29H5ZxP(; zkP-8*OVBDDj}~{(W4Y%RcsALLDQ_?C^r-@3!Dfw%G)ahg!CJP&lOVk4=6-jM!}&>3 z@W+BeynKRKa7QD-lWTnWA7|+Bn5J?z>q|0r>ujY<6U^xRT|4%kENJ#pquZQ96_WO< zc8h#(LGy?R{!~9TIvAbLuBOJL-K#tuYYrJur?V|7wZR0}b}!?EL5<+LC#0_k)4AuL zvt7rhN!S~k^BoC67G|Z|oAPWdqKEvJLtc@blKpgoy4%;tW4Cnle_wTEhj)3jG(qor z7-r^{eO&Ik`_+OCi+#ynUkp5ruNT=AtU^~*E?w7!aRXLuK(8kg+&{<;cs3mLHjP&bLAlz?TRdQ_E>L6J)?8TyXCP^bE|^=HMayjzA%&- z@=eVBmwkYgSd?td)d+`WX>;Aj^2k+t>~!KWDVRU58+CwR4o4ktO;*ax%I9XU(|#>JrMLl(Q$IUegb^+MF?qt<3t4 zDNS>lJ)+{2fz-u{Snu3H3=>?!&Tes$i|MqGP225>CX5iVY(*dRy1 zvzV*neSqh-HDqCjSgxz`firM~jB({kT;ILCXv=H^cYakX>V4007`<)~)yrgKMPvGt zX=Al?U`__EKJcZ*(HXhzfG#Bn_{f*g}?Ya=d-DCv{O!&drZ3rT2{pa>b96 zGl4D2n|96;F_-?xNaBf!`M%tjDL4e!K0^WL_s@Pdre!L8z1fR>xgrOZJhgB$e7fM! zDkj!tmAvTQ4w~$zYPIDPt3!ya||?p<^* zi_r5FCGYq-2|84n&ws;;(2iIB{N!d%9eb=red1f9qeB4MGER$v__XW#c>%ofV-Tw- zS`E>Uc-Hfg4UEpsr)G$R+^n!#XU-T4J9_g(*M3_V)44#%ehV_vqGM9HcDa~}DloA* zRwMcLnx2lV@g}1g1>3?el^l4_32(To$%*~Fh`SraWC7`gOa7;zG{<>qjGXitpd zMBFp?65ixNvEXp;&cv?}8(iBn0{4AqK+_!}ct*JpcU*0UL*f?V>?Jy;#Y-~*KPss2 zsW!snZw+|#c>?~P?G53S8hodyg4p>(iPN?QyH&L=!l|lcRIwoz?|jt2EIw9^$88Ma zl!scNT5T-x@h3pWCsuy?6eBu3QP1C$;f2!9=&;-E3Z(C!PW5*JG!v;@D|QvZrxm$O zg-<^0=99-p58DEiVf(0e&G%vA*Uzq@4n4b(`Q)16G%<^^^H^~oDII02fb(Z%P#GCk zZmjhe)%K^BK6Si^Jk5!iykHGE&kw-P*OJKvkA*}iG?4ec>ItGoOsPIoe4J?`I zg9_zFF7>60s5}=2=H{&>IF%RoBj zn7g~^0~LJKK!11BlW!W$Ov1{1a_4RlIOyJkOqgrLR^L+cJ|!gjK9o_jk67WLCk1qy z8!CEUaW#E=W{TrugOVA%*6w^!tY$WA6m;G&Cv#_C2AlK6#&G!-aO4`zhA&G;8yK2> z9W6x1v(q`%$4X-LS~cjo%AerctAIo8z?-aj@HIaZmd(pVr$*Joxl28vFO#2Xp^Y|_mvp7AJRz!-Kvsl0${Ctl2=B)=Ki=x=TU3N6? zNFi$)B}M8r!Q8lkhyatc+@Hk#ggrtF9{xQIpMDewPdrV4*E7|50+I zH?_wHK2=cf^NR4p1wz*0(S(a4MbIrI0O!oiLK6aG@TtfO{-G-ZeDZQRuUm=|r>_%n zlb4^y>H;A{UsGer=X#XTr2*AaM&8Y0H7fW|&Ts$Sh_Ww)5}9>QbhT2$o*pn0ZGYkG zdOXyGgy($e;5IZ=k4k2X%7vih^kPP~Iuy89Jtp(}h&i8kZCwkW+Sy(gf6)Hr2Bv?w z5yVOF(-GgdfDM9R>Rx6Tb2ZnC8l50#26(k3D_;w^RNHehCsKyK&hjVUC5nhaZ3WcC z>ju<*QxNsdL&nf4VRVu{*fp|7OEdSx&aDv=X4>jdsz%{tlKm}glq;NhIWC5)-?fD8 zabgJM$VgV#IvFkgv4!jWZXnjr6>^XF>xtKic5onZD=xTM0T)jTM?LQPBj2Fr8+wx& zeQtKY$2X4SNMQv%uoU3)A`Kgn*%SYBFak7s?!d;rdiZ=yDn2$;$E$j+$49^Dc}H#t zv7Xd{Rs-aCTUr)V9xlS8|5U)MNf(i$M9-V%AwDqZI+j(~#6=nVhai-w(l_}um=_srZ6~VYOcC7tY!t-tIh4)NV z@G9br_|Sj`PrV{zPlc4*;S#$(=6kV6 zU*u5JpV}EiVgo_<9jRSL4(7tx z$0KP91&Num!$quJ8Oq>JUZCP`F&+LXnQf>PQEzB7GjVSi6@A;zYEpx!o}>{fD*@Hz zl@VVIw^0!*&8R8WK)ubhaNkG&MMw26qV^E6^yf&z`MHId8P>gseB_if>o)i>_r1i- z^$R)N_`iY}N3;!g{FcPdzJ3t(S)*WIdj3G?m-=#%efksP+#=9^L0e3N81OD+A4;t+ zgeNE0!&UdBD8y(3`911TReA)Ib3FpfZc3SsS0z|wi2@TmDsb%dFxdKLDPGnPiti`V zc**T_-min@c-4j^q##OhbhVY0e=y>}d?A-(y@u$Qa(v&DMo;~!d2@5sDAO~BC;p;G zXHFW?z!RQG+a#bPr+XsVw?LBqpAkNZAH>i*Xy{jy$?op34P^?{P#&YD@g0eF58yE_*13e#f%hs-$QS1-p~FtdTnLaYMfNcT_HQ>RVg(k!VGF< zD=6t_6%NXMR0%ZoX<2K(1EAa7k2vJLCC#9$eL%Qqm>`xx!_6@uH06^H8zzJu)h%e6J+h4?=yEN#JW`ILg0}!%nEo#v*A1{e7JkPoLm*)9=I+w5!-sxlta%a4l5I+GY3>~QR$UgClX{3Ayvx93P7qM$Yc{sUf;m*& zY#C6O&ZNQ?N-^OnrxKM~JoC-L^LCv^vR)!?w8jk|T&w3kjV{Am~n+MRN`8m*2lp&CV@oZ}$vzEi0BNYtF9y zZ<2ZLtxaevS%OFHF{9PAjP+`pibkHxqS_>C;Hwe)m`N)XaI&6YpR~*XH&lpOG^QR9 zyDw6+!^GUEjJIUYF&Vq)s)1Re(=Z30(O}iI|LCtvEdbseO3!PEVSf0>51=k+;zfuH> z{HEgGHA>W`JAu27)bm{xc!ya4)7|9s|F_Xg0@Z#?4>nF7WcFVX!da(cP&bb3iTC?zmE!W7bNWYIrX^R z$z+h3BEhYFtxjlt?VKL!>@yT@On_;m2XaRkAxRL!fI*MsCvy>X$ zR>#EG+DKuUg1K|hN{?Gz!PtitvGM)9*gg;axks7D+2ti$V8{|7`yiHt-+NYbgKZm7 z)<7M13;E$2ky0?bunzY!6antjN?2PK3omS44ZEAuk@SrY5Vs0jW8Xx=(UCJ_BI}xk9gDb`uoEWfr3q2 zJqA3#rDUgV+5v|BuNSSEW90U3pGS3TYUX^x9eTng5yR$JaM2g?nOR5&cFxw&#g}z# zWr7dAxVJC!>baS2y;RM$4Q{E0`460!uoFg8H;nmD)hCD6$CFzK$Tsju#X}E6>syw+Cio0(Uc(K{BRX2oDd45JnPZT@hbL0#}#Pr zFEyCx(GG=_B;$oId{Lj#QetOsF=|~MPqd#YK`lpm!QSmz_{V<}eQ~EJymiZi9(qzO=AXkPM=1pGQ!x(rRfyuP_n&$%;8#>cVbq5O#$j_ z-RQ=@(>d9uC-l|{YUZ_H3?10rleOtGDe|-(Q2*VcJ+)@!1paiOT!MyG7ShGxUZCTL Ji{Ss?{{axc^56gf diff --git a/Lib/test/audiodata/pluck-pcm8.au b/Lib/test/audiodata/pluck-pcm8.au deleted file mode 100644 index b7172c8f23475babb68760aae89e394243c38f5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 6638 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 diff --git a/Lib/test/audiotest.au b/Lib/test/audiotest.au deleted file mode 100644 index f76b0501b8c61b4fabbb3715b69a9434a42469cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 28144 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 Z4&pQz4F}v{u`KT_Yt&178*3KR{{b+_jduV5 diff --git a/Lib/test/test_sunau.py b/Lib/test/test_sunau.py deleted file mode 100644 index 40408b01eda9..000000000000 --- a/Lib/test/test_sunau.py +++ /dev/null @@ -1,160 +0,0 @@ -import unittest -from test import audiotests -import io -import struct -import sys -from test.support import warnings_helper - -sunau = warnings_helper.import_deprecated("sunau") -audioop = warnings_helper.import_deprecated("audioop") - - -class SunauTest(audiotests.AudioWriteTests, - audiotests.AudioTestsWithSourceFile): - module = sunau - - -class SunauPCM8Test(SunauTest, unittest.TestCase): - sndfilename = 'pluck-pcm8.au' - sndfilenframes = 3307 - nchannels = 2 - sampwidth = 1 - framerate = 11025 - nframes = 48 - comptype = 'NONE' - compname = 'not compressed' - frames = bytes.fromhex("""\ - 02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \ - EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \ - 11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \ - 490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \ - """) - - -class SunauPCM16Test(SunauTest, unittest.TestCase): - sndfilename = 'pluck-pcm16.au' - sndfilenframes = 3307 - nchannels = 2 - sampwidth = 2 - framerate = 11025 - nframes = 48 - comptype = 'NONE' - compname = 'not compressed' - frames = bytes.fromhex("""\ - 022EFFEA 4B5C00F9 311404EF 80DB0844 CBE006B0 48AB03F3 BFE601B5 0367FE80 \ - B853FA42 B4AFF351 2997EBCD 1A5AE6DC EDF9E492 C627E277 0E06E0B7 EF29E029 \ - 5759E271 FB34E83F 1377EF85 D82CF727 978EFB79 F5F7FC12 0864FB9E DF30FB40 \ - 1183FA30 3EEAFB59 BC78FCB4 66D5FF60 CF130415 431A097D C1BA0EC7 512312A0 \ - EEE11754 82071666 7FFE1448 80001298 49990EB7 52B40DC1 EFAD0F65 CE3A0FBE \ - E4B70CE6 63490A57 08CC0A1D 2BBC0B09 51480E46 8BCB113C B6F60EE9 44150A5A \ - """) - - -class SunauPCM24Test(SunauTest, unittest.TestCase): - sndfilename = 'pluck-pcm24.au' - sndfilenframes = 3307 - nchannels = 2 - sampwidth = 3 - framerate = 11025 - nframes = 48 - comptype = 'NONE' - compname = 'not compressed' - frames = bytes.fromhex("""\ - 022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \ - CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \ - B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \ - EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \ - 5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \ - 978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \ - 117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \ - CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \ - EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \ - 499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \ - E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \ - 51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \ - """) - - -class SunauPCM32Test(SunauTest, unittest.TestCase): - sndfilename = 'pluck-pcm32.au' - sndfilenframes = 3307 - nchannels = 2 - sampwidth = 4 - framerate = 11025 - nframes = 48 - comptype = 'NONE' - compname = 'not compressed' - frames = bytes.fromhex("""\ - 022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \ - CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \ - B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \ - EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \ - 5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \ - 978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \ - 117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \ - CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \ - EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \ - 499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \ - E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \ - 51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \ - """) - - -class SunauULAWTest(SunauTest, unittest.TestCase): - sndfilename = 'pluck-ulaw.au' - sndfilenframes = 3307 - nchannels = 2 - sampwidth = 2 - framerate = 11025 - nframes = 48 - comptype = 'ULAW' - compname = 'CCITT G.711 u-law' - frames = bytes.fromhex("""\ - 022CFFE8 497C00F4 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \ - B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \ - 557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \ - 11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C09BC C1840EBC 517C12FC \ - EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \ - E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \ - """) - if sys.byteorder != 'big': - frames = audioop.byteswap(frames, 2) - - -class SunauLowLevelTest(unittest.TestCase): - - def test_read_bad_magic_number(self): - b = b'SPA' - with self.assertRaises(EOFError): - sunau.open(io.BytesIO(b)) - b = b'SPAM' - with self.assertRaisesRegex(sunau.Error, 'bad magic number'): - sunau.open(io.BytesIO(b)) - - def test_read_too_small_header(self): - b = struct.pack('>LLLLL', sunau.AUDIO_FILE_MAGIC, 20, 0, - sunau.AUDIO_FILE_ENCODING_LINEAR_8, 11025) - with self.assertRaisesRegex(sunau.Error, 'header size too small'): - sunau.open(io.BytesIO(b)) - - def test_read_too_large_header(self): - b = struct.pack('>LLLLLL', sunau.AUDIO_FILE_MAGIC, 124, 0, - sunau.AUDIO_FILE_ENCODING_LINEAR_8, 11025, 1) - b += b'\0' * 100 - with self.assertRaisesRegex(sunau.Error, 'header size ridiculously large'): - sunau.open(io.BytesIO(b)) - - def test_read_wrong_encoding(self): - b = struct.pack('>LLLLLL', sunau.AUDIO_FILE_MAGIC, 24, 0, 0, 11025, 1) - with self.assertRaisesRegex(sunau.Error, r'encoding not \(yet\) supported'): - sunau.open(io.BytesIO(b)) - - def test_read_wrong_number_of_channels(self): - b = struct.pack('>LLLLLL', sunau.AUDIO_FILE_MAGIC, 24, 0, - sunau.AUDIO_FILE_ENCODING_LINEAR_8, 11025, 0) - with self.assertRaisesRegex(sunau.Error, 'bad # of channels'): - sunau.open(io.BytesIO(b)) - - -if __name__ == "__main__": - unittest.main() diff --git a/Misc/NEWS.d/3.7.0b3.rst b/Misc/NEWS.d/3.7.0b3.rst index 547fb50f5ecf..980110646b29 100644 --- a/Misc/NEWS.d/3.7.0b3.rst +++ b/Misc/NEWS.d/3.7.0b3.rst @@ -326,7 +326,7 @@ documentation. Improved exceptions raised for invalid number of channels and sample width when read an audio file in modules :mod:`aifc`, :mod:`wave` and -:mod:`sunau`. +:mod:`!sunau`. .. diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 2564167cdf08..75902b471694 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -5577,7 +5577,7 @@ documentation. Improved exceptions raised for invalid number of channels and sample width when read an audio file in modules :mod:`aifc`, :mod:`wave` and -:mod:`sunau`. +:mod:`!sunau`. .. diff --git a/Misc/NEWS.d/next/Library/2023-05-24-14-58-13.gh-issue-104773.sQaXrY.rst b/Misc/NEWS.d/next/Library/2023-05-24-14-58-13.gh-issue-104773.sQaXrY.rst new file mode 100644 index 000000000000..fc103cd9aa39 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-05-24-14-58-13.gh-issue-104773.sQaXrY.rst @@ -0,0 +1,2 @@ +:pep:`594`: Remove the :mod:`!sunau` module, deprecated in Python 3.11. +Patch by Victor Stinner. diff --git a/Python/stdlib_module_names.h b/Python/stdlib_module_names.h index fe396a896ce3..37d5c05579eb 100644 --- a/Python/stdlib_module_names.h +++ b/Python/stdlib_module_names.h @@ -248,7 +248,6 @@ static const char* _Py_stdlib_module_names[] = { "stringprep", "struct", "subprocess", -"sunau", "symtable", "sys", "sysconfig", diff --git a/Tools/wasm/wasm_assets.py b/Tools/wasm/wasm_assets.py index a2ec54ec9867..47bc238c6481 100755 --- a/Tools/wasm/wasm_assets.py +++ b/Tools/wasm/wasm_assets.py @@ -84,7 +84,7 @@ OMIT_NETWORKING_FILES = ( OMIT_MODULE_FILES = { "_asyncio": ["asyncio/"], - "audioop": ["aifc.py", "sunau.py", "wave.py"], + "audioop": ["aifc.py", "wave.py"], "_crypt": ["crypt.py"], "_curses": ["curses/"], "_ctypes": ["ctypes/"], -- 2.47.3