OpusEncoder structure.
+ * @param[in] channels int: Number of channels.
+ * This must be 1 or 2.
+ * @returns The size in bytes.
+ * @note Since this function does not take the application as input, it will overestimate
+ * the size required for OPUS_APPLICATION_RESTRICTED_SILK and OPUS_APPLICATION_RESTRICTED_CELT.
+ * That is generally not a problem, except when trying to know the size to use for a copy.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels);
+
+/**
+ */
+
+/** Allocates and initializes an encoder state.
+ * There are three coding modes:
+ *
+ * @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice
+ * signals. It enhances the input signal by high-pass filtering and
+ * emphasizing formants and harmonics. Optionally it includes in-band
+ * forward error correction to protect against packet loss. Use this
+ * mode for typical VoIP applications. Because of the enhancement,
+ * even at high bitrates the output may sound different from the input.
+ *
+ * @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most
+ * non-voice signals like music. Use this mode for music and mixed
+ * (music/voice) content, broadcast, and applications requiring less
+ * than 15 ms of coding delay.
+ *
+ * @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that
+ * disables the speech-optimized mode in exchange for slightly reduced delay.
+ * This mode can only be set on an newly initialized or freshly reset encoder
+ * because it changes the codec delay.
+ *
+ * This is useful when the caller knows that the speech-optimized modes will not be needed (use with caution).
+ * @param [in] Fs opus_int32: Sampling rate of input signal (Hz)
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param [in] channels int: Number of channels (1 or 2) in input signal
+ * @param [in] application int: Coding mode (one of @ref OPUS_APPLICATION_VOIP, @ref OPUS_APPLICATION_AUDIO, or @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY)
+ * @param [out] error int*: @ref opus_errorcodes
+ * @note Regardless of the sampling rate and number channels selected, the Opus encoder
+ * can switch to a lower audio bandwidth or number of channels if the bitrate
+ * selected is too low. This also means that it is safe to always use 48 kHz stereo input
+ * and let the encoder optimize the encoding.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create(
+ opus_int32 Fs,
+ int channels,
+ int application,
+ int *error
+);
+
+/** Initializes a previously allocated encoder state
+ * The memory pointed to by st must be at least the size returned by opus_encoder_get_size().
+ * This is intended for applications which use their own allocator instead of malloc.
+ * @see opus_encoder_create(),opus_encoder_get_size()
+ * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
+ * @param [in] st OpusEncoder*: Encoder state
+ * @param [in] Fs opus_int32: Sampling rate of input signal (Hz)
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param [in] channels int: Number of channels (1 or 2) in input signal
+ * @param [in] application int: Coding mode (one of OPUS_APPLICATION_VOIP, OPUS_APPLICATION_AUDIO, or OPUS_APPLICATION_RESTRICTED_LOWDELAY)
+ * @retval #OPUS_OK Success or @ref opus_errorcodes
+ */
+OPUS_EXPORT int opus_encoder_init(
+ OpusEncoder *st,
+ opus_int32 Fs,
+ int channels,
+ int application
+) OPUS_ARG_NONNULL(1);
+
+/** Encodes an Opus frame.
+ * @param [in] st OpusEncoder*: Encoder state
+ * @param [in] pcm opus_int16*: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16)
+ * @param [in] frame_size int: Number of samples per channel in the
+ * input signal.
+ * This must be an Opus frame size for
+ * the encoder's sampling rate.
+ * For example, at 48 kHz the permitted
+ * values are 120, 240, 480, 960, 1920,
+ * and 2880.
+ * Passing in a duration of less than
+ * 10 ms (480 samples at 48 kHz) will
+ * prevent the encoder from using the LPC
+ * or hybrid modes.
+ * @param [out] data unsigned char*: Output payload.
+ * This must contain storage for at
+ * least \a max_data_bytes.
+ * @param [in] max_data_bytes opus_int32: Size of the allocated
+ * memory for the output
+ * payload. This may be
+ * used to impose an upper limit on
+ * the instant bitrate, but should
+ * not be used as the only bitrate
+ * control. Use #OPUS_SET_BITRATE to
+ * control the bitrate.
+ * @returns The length of the encoded packet (in bytes) on success or a
+ * negative error code (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode(
+ OpusEncoder *st,
+ const opus_int16 *pcm,
+ int frame_size,
+ unsigned char *data,
+ opus_int32 max_data_bytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Encodes an Opus frame.
+ * @param [in] st OpusEncoder*: Encoder state
+ * @param [in] pcm opus_int32*: Input signal (interleaved if 2 channels) representing (or slightly exceeding) 24-bit values. length is frame_size*channels*sizeof(opus_int32)
+ * @param [in] frame_size int: Number of samples per channel in the
+ * input signal.
+ * This must be an Opus frame size for
+ * the encoder's sampling rate.
+ * For example, at 48 kHz the permitted
+ * values are 120, 240, 480, 960, 1920,
+ * and 2880.
+ * Passing in a duration of less than
+ * 10 ms (480 samples at 48 kHz) will
+ * prevent the encoder from using the LPC
+ * or hybrid modes.
+ * @param [out] data unsigned char*: Output payload.
+ * This must contain storage for at
+ * least \a max_data_bytes.
+ * @param [in] max_data_bytes opus_int32: Size of the allocated
+ * memory for the output
+ * payload. This may be
+ * used to impose an upper limit on
+ * the instant bitrate, but should
+ * not be used as the only bitrate
+ * control. Use #OPUS_SET_BITRATE to
+ * control the bitrate.
+ * @returns The length of the encoded packet (in bytes) on success or a
+ * negative error code (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode24(
+ OpusEncoder *st,
+ const opus_int32 *pcm,
+ int frame_size,
+ unsigned char *data,
+ opus_int32 max_data_bytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Encodes an Opus frame from floating point input.
+ * @param [in] st OpusEncoder*: Encoder state
+ * @param [in] pcm float*: Input in float format (interleaved if 2 channels), with a normal range of +/-1.0.
+ * Samples with a range beyond +/-1.0 are supported but will
+ * be clipped by decoders using the integer API and should
+ * only be used if it is known that the far end supports
+ * extended dynamic range.
+ * length is frame_size*channels*sizeof(float)
+ * @param [in] frame_size int: Number of samples per channel in the
+ * input signal.
+ * This must be an Opus frame size for
+ * the encoder's sampling rate.
+ * For example, at 48 kHz the permitted
+ * values are 120, 240, 480, 960, 1920,
+ * and 2880.
+ * Passing in a duration of less than
+ * 10 ms (480 samples at 48 kHz) will
+ * prevent the encoder from using the LPC
+ * or hybrid modes.
+ * @param [out] data unsigned char*: Output payload.
+ * This must contain storage for at
+ * least \a max_data_bytes.
+ * @param [in] max_data_bytes opus_int32: Size of the allocated
+ * memory for the output
+ * payload. This may be
+ * used to impose an upper limit on
+ * the instant bitrate, but should
+ * not be used as the only bitrate
+ * control. Use #OPUS_SET_BITRATE to
+ * control the bitrate.
+ * @returns The length of the encoded packet (in bytes) on success or a
+ * negative error code (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode_float(
+ OpusEncoder *st,
+ const float *pcm,
+ int frame_size,
+ unsigned char *data,
+ opus_int32 max_data_bytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Frees an OpusEncoder allocated by opus_encoder_create().
+ * @param[in] st OpusEncoder*: State to be freed.
+ */
+OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st);
+
+/** Perform a CTL function on an Opus encoder.
+ *
+ * Generally the request and subsequent arguments are generated
+ * by a convenience macro.
+ * @param st OpusEncoder*: Encoder state.
+ * @param request This and all remaining parameters should be replaced by one
+ * of the convenience macros in @ref opus_genericctls or
+ * @ref opus_encoderctls.
+ * @see opus_genericctls
+ * @see opus_encoderctls
+ */
+OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
+/**@}*/
+
+/** @defgroup opus_decoder Opus Decoder
+ * @{
+ *
+ * @brief This page describes the process and functions used to decode Opus.
+ *
+ * The decoding process also starts with creating a decoder
+ * state. This can be done with:
+ * @code
+ * int error;
+ * OpusDecoder *dec;
+ * dec = opus_decoder_create(Fs, channels, &error);
+ * @endcode
+ * where
+ * @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 48000
+ * @li channels is the number of channels (1 or 2)
+ * @li error will hold the error code in case of failure (or #OPUS_OK on success)
+ * @li the return value is a newly created decoder state to be used for decoding
+ *
+ * While opus_decoder_create() allocates memory for the state, it's also possible
+ * to initialize pre-allocated memory:
+ * @code
+ * int size;
+ * int error;
+ * OpusDecoder *dec;
+ * size = opus_decoder_get_size(channels);
+ * dec = malloc(size);
+ * error = opus_decoder_init(dec, Fs, channels);
+ * @endcode
+ * where opus_decoder_get_size() returns the required size for the decoder state. Note that
+ * future versions of this code may change the size, so no assumptions should be made about it.
+ *
+ * The decoder state is always continuous in memory and only a shallow copy is sufficient
+ * to copy it (e.g. memcpy())
+ *
+ * To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data:
+ * @code
+ * frame_size = opus_decode(dec, packet, len, decoded, max_size, 0);
+ * @endcode
+ * where
+ *
+ * @li packet is the byte array containing the compressed data
+ * @li len is the exact number of bytes contained in the packet
+ * @li decoded is the decoded audio data in opus_int16 (or float for opus_decode_float())
+ * @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array
+ *
+ * opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet.
+ * If that value is negative, then an error has occurred. This can occur if the packet is corrupted or if the audio
+ * buffer is too small to hold the decoded audio.
+ *
+ * Opus is a stateful codec with overlapping blocks and as a result Opus
+ * packets are not coded independently of each other. Packets must be
+ * passed into the decoder serially and in the correct order for a correct
+ * decode. Lost packets can be replaced with loss concealment by calling
+ * the decoder with a null pointer and zero length for the missing packet.
+ *
+ * A single codec state may only be accessed from a single thread at
+ * a time and any required locking must be performed by the caller. Separate
+ * streams must be decoded with separate decoder states and can be decoded
+ * in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOSTACK
+ * defined.
+ *
+ */
+
+/** Opus decoder state.
+ * This contains the complete state of an Opus decoder.
+ * It is position independent and can be freely copied.
+ * @see opus_decoder_create,opus_decoder_init
+ */
+typedef struct OpusDecoder OpusDecoder;
+
+/** Opus DRED decoder.
+ * This contains the complete state of an Opus DRED decoder.
+ * It is position independent and can be freely copied.
+ * @see opus_dred_decoder_create,opus_dred_decoder_init
+ */
+typedef struct OpusDREDDecoder OpusDREDDecoder;
+
+
+/** Opus DRED state.
+ * This contains the complete state of an Opus DRED packet.
+ * It is position independent and can be freely copied.
+ * @see opus_dred_create,opus_dred_init
+ */
+typedef struct OpusDRED OpusDRED;
+
+/** Gets the size of an OpusDecoder structure.
+ * @param [in] channels int: Number of channels.
+ * This must be 1 or 2.
+ * @returns The size in bytes.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels);
+
+/** Allocates and initializes a decoder state.
+ * @param [in] Fs opus_int32: Sample rate to decode at (Hz).
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param [in] channels int: Number of channels (1 or 2) to decode
+ * @param [out] error int*: #OPUS_OK Success or @ref opus_errorcodes
+ *
+ * Internally Opus stores data at 48000 Hz, so that should be the default
+ * value for Fs. However, the decoder can efficiently decode to buffers
+ * at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use
+ * data at the full sample rate, or knows the compressed data doesn't
+ * use the full frequency range, it can request decoding at a reduced
+ * rate. Likewise, the decoder is capable of filling in either mono or
+ * interleaved stereo pcm buffers, at the caller's request.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create(
+ opus_int32 Fs,
+ int channels,
+ int *error
+);
+
+/** Initializes a previously allocated decoder state.
+ * The state must be at least the size returned by opus_decoder_get_size().
+ * This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size
+ * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
+ * @param [in] st OpusDecoder*: Decoder state.
+ * @param [in] Fs opus_int32: Sampling rate to decode to (Hz).
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param [in] channels int: Number of channels (1 or 2) to decode
+ * @retval #OPUS_OK Success or @ref opus_errorcodes
+ */
+OPUS_EXPORT int opus_decoder_init(
+ OpusDecoder *st,
+ opus_int32 Fs,
+ int channels
+) OPUS_ARG_NONNULL(1);
+
+/** Decode an Opus packet.
+ * @param [in] st OpusDecoder*: Decoder state
+ * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss
+ * @param [in] len opus_int32: Number of bytes in payload*
+ * @param [out] pcm opus_int16*: Output signal (interleaved if 2 channels). length
+ * is frame_size*channels*sizeof(opus_int16)
+ * @param [in] frame_size Number of samples per channel of available space in \a pcm.
+ * If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will
+ * not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1),
+ * then frame_size needs to be exactly the duration of audio that is missing, otherwise the
+ * decoder will not be in the optimal state to decode the next incoming packet. For the PLC and
+ * FEC cases, frame_size must be a multiple of 2.5 ms.
+ * @param [in] decode_fec int: Flag (0 or 1) to request that any in-band forward error correction data be
+ * decoded. If no such data is available, the frame is decoded as if it were lost.
+ * @returns Number of decoded samples per channel or @ref opus_errorcodes
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode(
+ OpusDecoder *st,
+ const unsigned char *data,
+ opus_int32 len,
+ opus_int16 *pcm,
+ int frame_size,
+ int decode_fec
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Decode an Opus packet.
+ * @param [in] st OpusDecoder*: Decoder state
+ * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss
+ * @param [in] len opus_int32: Number of bytes in payload*
+ * @param [out] pcm opus_int32*: Output signal (interleaved if 2 channels) representing (or slightly exceeding) 24-bit values. length
+ * is frame_size*channels*sizeof(opus_int32)
+ * @param [in] frame_size Number of samples per channel of available space in \a pcm.
+ * If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will
+ * not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1),
+ * then frame_size needs to be exactly the duration of audio that is missing, otherwise the
+ * decoder will not be in the optimal state to decode the next incoming packet. For the PLC and
+ * FEC cases, frame_size must be a multiple of 2.5 ms.
+ * @param [in] decode_fec int: Flag (0 or 1) to request that any in-band forward error correction data be
+ * decoded. If no such data is available, the frame is decoded as if it were lost.
+ * @returns Number of decoded samples or @ref opus_errorcodes
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode24(
+ OpusDecoder *st,
+ const unsigned char *data,
+ opus_int32 len,
+ opus_int32 *pcm,
+ int frame_size,
+ int decode_fec
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Decode an Opus packet with floating point output.
+ * @param [in] st OpusDecoder*: Decoder state
+ * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss
+ * @param [in] len opus_int32: Number of bytes in payload
+ * @param [out] pcm float*: Output signal (interleaved if 2 channels). length
+ * is frame_size*channels*sizeof(float)
+ * @param [in] frame_size Number of samples per channel of available space in \a pcm.
+ * If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will
+ * not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1),
+ * then frame_size needs to be exactly the duration of audio that is missing, otherwise the
+ * decoder will not be in the optimal state to decode the next incoming packet. For the PLC and
+ * FEC cases, frame_size must be a multiple of 2.5 ms.
+ * @param [in] decode_fec int: Flag (0 or 1) to request that any in-band forward error correction data be
+ * decoded. If no such data is available the frame is decoded as if it were lost.
+ * @returns Number of decoded samples per channel or @ref opus_errorcodes
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float(
+ OpusDecoder *st,
+ const unsigned char *data,
+ opus_int32 len,
+ float *pcm,
+ int frame_size,
+ int decode_fec
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Perform a CTL function on an Opus decoder.
+ *
+ * Generally the request and subsequent arguments are generated
+ * by a convenience macro.
+ * @param st OpusDecoder*: Decoder state.
+ * @param request This and all remaining parameters should be replaced by one
+ * of the convenience macros in @ref opus_genericctls or
+ * @ref opus_decoderctls.
+ * @see opus_genericctls
+ * @see opus_decoderctls
+ */
+OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
+
+/** Frees an OpusDecoder allocated by opus_decoder_create().
+ * @param[in] st OpusDecoder*: State to be freed.
+ */
+OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st);
+
+/** Gets the size of an OpusDREDDecoder structure.
+ * @returns The size in bytes.
+ */
+OPUS_EXPORT int opus_dred_decoder_get_size(void);
+
+/** Allocates and initializes an OpusDREDDecoder state.
+ * @param [out] error int*: #OPUS_OK Success or @ref opus_errorcodes
+ */
+OPUS_EXPORT OpusDREDDecoder *opus_dred_decoder_create(int *error);
+
+/** Initializes an OpusDREDDecoder state.
+ * @param[in] dec OpusDREDDecoder*: State to be initialized.
+ */
+OPUS_EXPORT int opus_dred_decoder_init(OpusDREDDecoder *dec);
+
+/** Frees an OpusDREDDecoder allocated by opus_dred_decoder_create().
+ * @param[in] dec OpusDREDDecoder*: State to be freed.
+ */
+OPUS_EXPORT void opus_dred_decoder_destroy(OpusDREDDecoder *dec);
+
+/** Perform a CTL function on an Opus DRED decoder.
+ *
+ * Generally the request and subsequent arguments are generated
+ * by a convenience macro.
+ * @param dred_dec OpusDREDDecoder*: DRED Decoder state.
+ * @param request This and all remaining parameters should be replaced by one
+ * of the convenience macros in @ref opus_genericctls or
+ * @ref opus_decoderctls.
+ * @see opus_genericctls
+ * @see opus_decoderctls
+ */
+OPUS_EXPORT int opus_dred_decoder_ctl(OpusDREDDecoder *dred_dec, int request, ...);
+
+/** Gets the size of an OpusDRED structure.
+ * @returns The size in bytes.
+ */
+OPUS_EXPORT int opus_dred_get_size(void);
+
+/** Allocates and initializes a DRED state.
+ * @param [out] error int*: #OPUS_OK Success or @ref opus_errorcodes
+ */
+OPUS_EXPORT OpusDRED *opus_dred_alloc(int *error);
+
+/** Frees an OpusDRED allocated by opus_dred_create().
+ * @param[in] dec OpusDRED*: State to be freed.
+ */
+OPUS_EXPORT void opus_dred_free(OpusDRED *dec);
+
+/** Decode an Opus DRED packet.
+ * @param [in] dred_dec OpusDRED*: DRED Decoder state
+ * @param [in] dred OpusDRED*: DRED state
+ * @param [in] data char*: Input payload
+ * @param [in] len opus_int32: Number of bytes in payload
+ * @param [in] max_dred_samples opus_int32: Maximum number of DRED samples that may be needed (if available in the packet).
+ * @param [in] sampling_rate opus_int32: Sampling rate used for max_dred_samples argument. Needs not match the actual sampling rate of the decoder.
+ * @param [out] dred_end opus_int32*: Number of non-encoded (silence) samples between the DRED timestamp and the last DRED sample.
+ * @param [in] defer_processing int: Flag (0 or 1). If set to one, the CPU-intensive part of the DRED decoding is deferred until opus_dred_process() is called.
+ * @returns Offset (positive) of the first decoded DRED samples, zero if no DRED is present, or @ref opus_errorcodes
+ */
+OPUS_EXPORT int opus_dred_parse(OpusDREDDecoder *dred_dec, OpusDRED *dred, const unsigned char *data, opus_int32 len, opus_int32 max_dred_samples, opus_int32 sampling_rate, int *dred_end, int defer_processing) OPUS_ARG_NONNULL(1);
+
+/** Finish decoding an Opus DRED packet. The function only needs to be called if opus_dred_parse() was called with defer_processing=1.
+ * The source and destination will often be the same DRED state.
+ * @param [in] dred_dec OpusDRED*: DRED Decoder state
+ * @param [in] src OpusDRED*: Source DRED state to start the processing from.
+ * @param [out] dst OpusDRED*: Destination DRED state to store the updated state after processing.
+ * @returns @ref opus_errorcodes
+ */
+OPUS_EXPORT int opus_dred_process(OpusDREDDecoder *dred_dec, const OpusDRED *src, OpusDRED *dst);
+
+/** Decode audio from an Opus DRED packet with 16-bit output.
+ * @param [in] st OpusDecoder*: Decoder state
+ * @param [in] dred OpusDRED*: DRED state
+ * @param [in] dred_offset opus_int32: position of the redundancy to decode (in samples before the beginning of the real audio data in the packet).
+ * @param [out] pcm opus_int16*: Output signal (interleaved if 2 channels). length
+ * is frame_size*channels*sizeof(opus_int16)
+ * @param [in] frame_size Number of samples per channel to decode in \a pcm.
+ * frame_size must be a multiple of 2.5 ms.
+ * @returns Number of decoded samples or @ref opus_errorcodes
+ */
+OPUS_EXPORT int opus_decoder_dred_decode(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, opus_int16 *pcm, opus_int32 frame_size);
+
+/** Decode audio from an Opus DRED packet with 24-bit output.
+ * @param [in] st OpusDecoder*: Decoder state
+ * @param [in] dred OpusDRED*: DRED state
+ * @param [in] dred_offset opus_int32: position of the redundancy to decode (in samples before the beginning of the real audio data in the packet).
+ * @param [out] pcm opus_int32*: Output signal (interleaved if 2 channels). length
+ * is frame_size*channels*sizeof(opus_int16)
+ * @param [in] frame_size Number of samples per channel to decode in \a pcm.
+ * frame_size must be a multiple of 2.5 ms.
+ * @returns Number of decoded samples or @ref opus_errorcodes
+ */
+OPUS_EXPORT int opus_decoder_dred_decode24(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, opus_int32 *pcm, opus_int32 frame_size);
+
+/** Decode audio from an Opus DRED packet with floating point output.
+ * @param [in] st OpusDecoder*: Decoder state
+ * @param [in] dred OpusDRED*: DRED state
+ * @param [in] dred_offset opus_int32: position of the redundancy to decode (in samples before the beginning of the real audio data in the packet).
+ * @param [out] pcm float*: Output signal (interleaved if 2 channels). length
+ * is frame_size*channels*sizeof(float)
+ * @param [in] frame_size Number of samples per channel to decode in \a pcm.
+ * frame_size must be a multiple of 2.5 ms.
+ * @returns Number of decoded samples or @ref opus_errorcodes
+ */
+OPUS_EXPORT int opus_decoder_dred_decode_float(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, float *pcm, opus_int32 frame_size);
+
+
+/** Parse an opus packet into one or more frames.
+ * Opus_decode will perform this operation internally so most applications do
+ * not need to use this function.
+ * This function does not copy the frames, the returned pointers are pointers into
+ * the input packet.
+ * @param [in] data char*: Opus packet to be parsed
+ * @param [in] len opus_int32: size of data
+ * @param [out] out_toc char*: TOC pointer
+ * @param [out] frames char*[48] encapsulated frames
+ * @param [out] size opus_int16[48] sizes of the encapsulated frames
+ * @param [out] payload_offset int*: returns the position of the payload within the packet (in bytes)
+ * @returns number of frames
+ */
+OPUS_EXPORT int opus_packet_parse(
+ const unsigned char *data,
+ opus_int32 len,
+ unsigned char *out_toc,
+ const unsigned char *frames[48],
+ opus_int16 size[48],
+ int *payload_offset
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5);
+
+/** Gets the bandwidth of an Opus packet.
+ * @param [in] data char*: Opus packet
+ * @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass)
+ * @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass)
+ * @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass)
+ * @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass)
+ * @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass)
+ * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const unsigned char *data) OPUS_ARG_NONNULL(1);
+
+/** Gets the number of samples per frame from an Opus packet.
+ * @param [in] data char*: Opus packet.
+ * This must contain at least one byte of
+ * data.
+ * @param [in] Fs opus_int32: Sampling rate in Hz.
+ * This must be a multiple of 400, or
+ * inaccurate results will be returned.
+ * @returns Number of samples per frame.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(const unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1);
+
+/** Gets the number of channels from an Opus packet.
+ * @param [in] data char*: Opus packet
+ * @returns Number of channels
+ * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const unsigned char *data) OPUS_ARG_NONNULL(1);
+
+/** Gets the number of frames in an Opus packet.
+ * @param [in] packet char*: Opus packet
+ * @param [in] len opus_int32: Length of packet
+ * @returns Number of frames
+ * @retval OPUS_BAD_ARG Insufficient data was passed to the function
+ * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1);
+
+/** Gets the number of samples of an Opus packet.
+ * @param [in] packet char*: Opus packet
+ * @param [in] len opus_int32: Length of packet
+ * @param [in] Fs opus_int32: Sampling rate in Hz.
+ * This must be a multiple of 400, or
+ * inaccurate results will be returned.
+ * @returns Number of samples
+ * @retval OPUS_BAD_ARG Insufficient data was passed to the function
+ * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) OPUS_ARG_NONNULL(1);
+
+/** Checks whether an Opus packet has LBRR.
+ * @param [in] packet char*: Opus packet
+ * @param [in] len opus_int32: Length of packet
+ * @returns 1 is LBRR is present, 0 otherwise
+ * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_has_lbrr(const unsigned char packet[], opus_int32 len);
+
+/** Gets the number of samples of an Opus packet.
+ * @param [in] dec OpusDecoder*: Decoder state
+ * @param [in] packet char*: Opus packet
+ * @param [in] len opus_int32: Length of packet
+ * @returns Number of samples
+ * @retval OPUS_BAD_ARG Insufficient data was passed to the function
+ * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
+
+/** Applies soft-clipping to bring a float signal within the [-1,1] range. If
+ * the signal is already in that range, nothing is done. If there are values
+ * outside of [-1,1], then the signal is clipped as smoothly as possible to
+ * both fit in the range and avoid creating excessive distortion in the
+ * process.
+ * @param [in,out] pcm float*: Input PCM and modified PCM
+ * @param [in] frame_size int Number of samples per channel to process
+ * @param [in] channels int: Number of channels
+ * @param [in,out] softclip_mem float*: State memory for the soft clipping process (one float per channel, initialized to zero)
+ */
+OPUS_EXPORT void opus_pcm_soft_clip(float *pcm, int frame_size, int channels, float *softclip_mem);
+
+
+/**@}*/
+
+/** @defgroup opus_repacketizer Repacketizer
+ * @{
+ *
+ * The repacketizer can be used to merge multiple Opus packets into a single
+ * packet or alternatively to split Opus packets that have previously been
+ * merged. Splitting valid Opus packets is always guaranteed to succeed,
+ * whereas merging valid packets only succeeds if all frames have the same
+ * mode, bandwidth, and frame size, and when the total duration of the merged
+ * packet is no more than 120 ms. The 120 ms limit comes from the
+ * specification and limits decoder memory requirements at a point where
+ * framing overhead becomes negligible.
+ *
+ * The repacketizer currently only operates on elementary Opus
+ * streams. It will not manipulate multistream packets successfully, except in
+ * the degenerate case where they consist of data from a single stream.
+ *
+ * The repacketizing process starts with creating a repacketizer state, either
+ * by calling opus_repacketizer_create() or by allocating the memory yourself,
+ * e.g.,
+ * @code
+ * OpusRepacketizer *rp;
+ * rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size());
+ * if (rp != NULL)
+ * opus_repacketizer_init(rp);
+ * @endcode
+ *
+ * Then the application should submit packets with opus_repacketizer_cat(),
+ * extract new packets with opus_repacketizer_out() or
+ * opus_repacketizer_out_range(), and then reset the state for the next set of
+ * input packets via opus_repacketizer_init().
+ *
+ * For example, to split a sequence of packets into individual frames:
+ * @code
+ * unsigned char *data;
+ * int len;
+ * while (get_next_packet(&data, &len))
+ * {
+ * unsigned char out[1276];
+ * opus_int32 out_len;
+ * int nb_frames;
+ * int err;
+ * int i;
+ * err = opus_repacketizer_cat(rp, data, len);
+ * if (err != OPUS_OK)
+ * {
+ * release_packet(data);
+ * return err;
+ * }
+ * nb_frames = opus_repacketizer_get_nb_frames(rp);
+ * for (i = 0; i < nb_frames; i++)
+ * {
+ * out_len = opus_repacketizer_out_range(rp, i, i+1, out, sizeof(out));
+ * if (out_len < 0)
+ * {
+ * release_packet(data);
+ * return (int)out_len;
+ * }
+ * output_next_packet(out, out_len);
+ * }
+ * opus_repacketizer_init(rp);
+ * release_packet(data);
+ * }
+ * @endcode
+ *
+ * Alternatively, to combine a sequence of frames into packets that each
+ * contain up to TARGET_DURATION_MS milliseconds of data:
+ * @code
+ * // The maximum number of packets with duration TARGET_DURATION_MS occurs
+ * // when the frame size is 2.5 ms, for a total of (TARGET_DURATION_MS*2/5)
+ * // packets.
+ * unsigned char *data[(TARGET_DURATION_MS*2/5)+1];
+ * opus_int32 len[(TARGET_DURATION_MS*2/5)+1];
+ * int nb_packets;
+ * unsigned char out[1277*(TARGET_DURATION_MS*2/2)];
+ * opus_int32 out_len;
+ * int prev_toc;
+ * nb_packets = 0;
+ * while (get_next_packet(data+nb_packets, len+nb_packets))
+ * {
+ * int nb_frames;
+ * int err;
+ * nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]);
+ * if (nb_frames < 1)
+ * {
+ * release_packets(data, nb_packets+1);
+ * return nb_frames;
+ * }
+ * nb_frames += opus_repacketizer_get_nb_frames(rp);
+ * // If adding the next packet would exceed our target, or it has an
+ * // incompatible TOC sequence, output the packets we already have before
+ * // submitting it.
+ * // N.B., The nb_packets > 0 check ensures we've submitted at least one
+ * // packet since the last call to opus_repacketizer_init(). Otherwise a
+ * // single packet longer than TARGET_DURATION_MS would cause us to try to
+ * // output an (invalid) empty packet. It also ensures that prev_toc has
+ * // been set to a valid value. Additionally, len[nb_packets] > 0 is
+ * // guaranteed by the call to opus_packet_get_nb_frames() above, so the
+ * // reference to data[nb_packets][0] should be valid.
+ * if (nb_packets > 0 && (
+ * ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) ||
+ * opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames >
+ * TARGET_DURATION_MS*48))
+ * {
+ * out_len = opus_repacketizer_out(rp, out, sizeof(out));
+ * if (out_len < 0)
+ * {
+ * release_packets(data, nb_packets+1);
+ * return (int)out_len;
+ * }
+ * output_next_packet(out, out_len);
+ * opus_repacketizer_init(rp);
+ * release_packets(data, nb_packets);
+ * data[0] = data[nb_packets];
+ * len[0] = len[nb_packets];
+ * nb_packets = 0;
+ * }
+ * err = opus_repacketizer_cat(rp, data[nb_packets], len[nb_packets]);
+ * if (err != OPUS_OK)
+ * {
+ * release_packets(data, nb_packets+1);
+ * return err;
+ * }
+ * prev_toc = data[nb_packets][0];
+ * nb_packets++;
+ * }
+ * // Output the final, partial packet.
+ * if (nb_packets > 0)
+ * {
+ * out_len = opus_repacketizer_out(rp, out, sizeof(out));
+ * release_packets(data, nb_packets);
+ * if (out_len < 0)
+ * return (int)out_len;
+ * output_next_packet(out, out_len);
+ * }
+ * @endcode
+ *
+ * An alternate way of merging packets is to simply call opus_repacketizer_cat()
+ * unconditionally until it fails. At that point, the merged packet can be
+ * obtained with opus_repacketizer_out() and the input packet for which
+ * opus_repacketizer_cat() needs to be re-added to a newly reinitialized
+ * repacketizer state.
+ */
+
+typedef struct OpusRepacketizer OpusRepacketizer;
+
+/** Gets the size of an OpusRepacketizer structure.
+ * @returns The size in bytes.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void);
+
+/** (Re)initializes a previously allocated repacketizer state.
+ * The state must be at least the size returned by opus_repacketizer_get_size().
+ * This can be used for applications which use their own allocator instead of
+ * malloc().
+ * It must also be called to reset the queue of packets waiting to be
+ * repacketized, which is necessary if the maximum packet duration of 120 ms
+ * is reached or if you wish to submit packets with a different Opus
+ * configuration (coding mode, audio bandwidth, frame size, or channel count).
+ * Failure to do so will prevent a new packet from being added with
+ * opus_repacketizer_cat().
+ * @see opus_repacketizer_create
+ * @see opus_repacketizer_get_size
+ * @see opus_repacketizer_cat
+ * @param rp OpusRepacketizer*: The repacketizer state to
+ * (re)initialize.
+ * @returns A pointer to the same repacketizer state that was passed in.
+ */
+OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);
+
+/** Allocates memory and initializes the new repacketizer with
+ * opus_repacketizer_init().
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_create(void);
+
+/** Frees an OpusRepacketizer allocated by
+ * opus_repacketizer_create().
+ * @param[in] rp OpusRepacketizer*: State to be freed.
+ */
+OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp);
+
+/** Add a packet to the current repacketizer state.
+ * This packet must match the configuration of any packets already submitted
+ * for repacketization since the last call to opus_repacketizer_init().
+ * This means that it must have the same coding mode, audio bandwidth, frame
+ * size, and channel count.
+ * This can be checked in advance by examining the top 6 bits of the first
+ * byte of the packet, and ensuring they match the top 6 bits of the first
+ * byte of any previously submitted packet.
+ * The total duration of audio in the repacketizer state also must not exceed
+ * 120 ms, the maximum duration of a single packet, after adding this packet.
+ *
+ * The contents of the current repacketizer state can be extracted into new
+ * packets using opus_repacketizer_out() or opus_repacketizer_out_range().
+ *
+ * In order to add a packet with a different configuration or to add more
+ * audio beyond 120 ms, you must clear the repacketizer state by calling
+ * opus_repacketizer_init().
+ * If a packet is too large to add to the current repacketizer state, no part
+ * of it is added, even if it contains multiple frames, some of which might
+ * fit.
+ * If you wish to be able to add parts of such packets, you should first use
+ * another repacketizer to split the packet into pieces and add them
+ * individually.
+ * @see opus_repacketizer_out_range
+ * @see opus_repacketizer_out
+ * @see opus_repacketizer_init
+ * @param rp OpusRepacketizer*: The repacketizer state to which to
+ * add the packet.
+ * @param[in] data const unsigned char*: The packet data.
+ * The application must ensure
+ * this pointer remains valid
+ * until the next call to
+ * opus_repacketizer_init() or
+ * opus_repacketizer_destroy().
+ * @param len opus_int32: The number of bytes in the packet data.
+ * @returns An error code indicating whether or not the operation succeeded.
+ * @retval #OPUS_OK The packet's contents have been added to the repacketizer
+ * state.
+ * @retval #OPUS_INVALID_PACKET The packet did not have a valid TOC sequence,
+ * the packet's TOC sequence was not compatible
+ * with previously submitted packets (because
+ * the coding mode, audio bandwidth, frame size,
+ * or channel count did not match), or adding
+ * this packet would increase the total amount of
+ * audio stored in the repacketizer state to more
+ * than 120 ms.
+ */
+OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
+
+
+/** Construct a new packet from data previously submitted to the repacketizer
+ * state via opus_repacketizer_cat().
+ * @param rp OpusRepacketizer*: The repacketizer state from which to
+ * construct the new packet.
+ * @param begin int: The index of the first frame in the current
+ * repacketizer state to include in the output.
+ * @param end int: One past the index of the last frame in the
+ * current repacketizer state to include in the
+ * output.
+ * @param[out] data const unsigned char*: The buffer in which to
+ * store the output packet.
+ * @param maxlen opus_int32: The maximum number of bytes to store in
+ * the output buffer. In order to guarantee
+ * success, this should be at least
+ * 1276 for a single frame,
+ * or for multiple frames,
+ * 1277*(end-begin).
+ * However, 1*(end-begin) plus
+ * the size of all packet data submitted to
+ * the repacketizer since the last call to
+ * opus_repacketizer_init() or
+ * opus_repacketizer_create() is also
+ * sufficient, and possibly much smaller.
+ * @returns The total size of the output packet on success, or an error code
+ * on failure.
+ * @retval #OPUS_BAD_ARG [begin,end) was an invalid range of
+ * frames (begin < 0, begin >= end, or end >
+ * opus_repacketizer_get_nb_frames()).
+ * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the
+ * complete output packet.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Return the total number of frames contained in packet data submitted to
+ * the repacketizer state so far via opus_repacketizer_cat() since the last
+ * call to opus_repacketizer_init() or opus_repacketizer_create().
+ * This defines the valid range of packets that can be extracted with
+ * opus_repacketizer_out_range() or opus_repacketizer_out().
+ * @param rp OpusRepacketizer*: The repacketizer state containing the
+ * frames.
+ * @returns The total number of frames contained in the packet data submitted
+ * to the repacketizer state.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);
+
+/** Construct a new packet from data previously submitted to the repacketizer
+ * state via opus_repacketizer_cat().
+ * This is a convenience routine that returns all the data submitted so far
+ * in a single packet.
+ * It is equivalent to calling
+ * @code
+ * opus_repacketizer_out_range(rp, 0, opus_repacketizer_get_nb_frames(rp),
+ * data, maxlen)
+ * @endcode
+ * @param rp OpusRepacketizer*: The repacketizer state from which to
+ * construct the new packet.
+ * @param[out] data const unsigned char*: The buffer in which to
+ * store the output packet.
+ * @param maxlen opus_int32: The maximum number of bytes to store in
+ * the output buffer. In order to guarantee
+ * success, this should be at least
+ * 1277*opus_repacketizer_get_nb_frames(rp).
+ * However,
+ * 1*opus_repacketizer_get_nb_frames(rp)
+ * plus the size of all packet data
+ * submitted to the repacketizer since the
+ * last call to opus_repacketizer_init() or
+ * opus_repacketizer_create() is also
+ * sufficient, and possibly much smaller.
+ * @returns The total size of the output packet on success, or an error code
+ * on failure.
+ * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the
+ * complete output packet.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1);
+
+/** Pads a given Opus packet to a larger size (possibly changing the TOC sequence).
+ * @param[in,out] data const unsigned char*: The buffer containing the
+ * packet to pad.
+ * @param len opus_int32: The size of the packet.
+ * This must be at least 1.
+ * @param new_len opus_int32: The desired size of the packet after padding.
+ * This must be at least as large as len.
+ * @returns an error code
+ * @retval #OPUS_OK \a on success.
+ * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len.
+ * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet.
+ */
+OPUS_EXPORT int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len);
+
+/** Remove all padding from a given Opus packet and rewrite the TOC sequence to
+ * minimize space usage.
+ * @param[in,out] data const unsigned char*: The buffer containing the
+ * packet to strip.
+ * @param len opus_int32: The size of the packet.
+ * This must be at least 1.
+ * @returns The new size of the output packet on success, or an error code
+ * on failure.
+ * @retval #OPUS_BAD_ARG \a len was less than 1.
+ * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len);
+
+/** Pads a given Opus multi-stream packet to a larger size (possibly changing the TOC sequence).
+ * @param[in,out] data const unsigned char*: The buffer containing the
+ * packet to pad.
+ * @param len opus_int32: The size of the packet.
+ * This must be at least 1.
+ * @param new_len opus_int32: The desired size of the packet after padding.
+ * This must be at least 1.
+ * @param nb_streams opus_int32: The number of streams (not channels) in the packet.
+ * This must be at least as large as len.
+ * @returns an error code
+ * @retval #OPUS_OK \a on success.
+ * @retval #OPUS_BAD_ARG \a len was less than 1.
+ * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet.
+ */
+OPUS_EXPORT int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams);
+
+/** Remove all padding from a given Opus multi-stream packet and rewrite the TOC sequence to
+ * minimize space usage.
+ * @param[in,out] data const unsigned char*: The buffer containing the
+ * packet to strip.
+ * @param len opus_int32: The size of the packet.
+ * This must be at least 1.
+ * @param nb_streams opus_int32: The number of streams (not channels) in the packet.
+ * This must be at least 1.
+ * @returns The new size of the output packet on success, or an error code
+ * on failure.
+ * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len.
+ * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, int nb_streams);
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OPUS_H */
diff --git a/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_custom.h b/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_custom.h
new file mode 100644
index 0000000..128650f
--- /dev/null
+++ b/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_custom.h
@@ -0,0 +1,381 @@
+/* Copyright (c) 2007-2008 CSIRO
+ Copyright (c) 2007-2009 Xiph.Org Foundation
+ Copyright (c) 2008-2012 Gregory Maxwell
+ Written by Jean-Marc Valin and Gregory Maxwell */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/**
+ @file opus_custom.h
+ @brief Opus-Custom reference implementation API
+ */
+
+#ifndef OPUS_CUSTOM_H
+#define OPUS_CUSTOM_H
+
+#include "opus_defines.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
+# define OPUS_CUSTOM_EXPORT OPUS_EXPORT
+# define OPUS_CUSTOM_EXPORT_STATIC OPUS_EXPORT
+#else
+# define OPUS_CUSTOM_EXPORT
+# ifdef OPUS_BUILD
+# define OPUS_CUSTOM_EXPORT_STATIC static OPUS_INLINE
+# else
+# define OPUS_CUSTOM_EXPORT_STATIC
+# endif
+#endif
+
+/** @defgroup opus_custom Opus Custom
+ * @{
+ * Opus Custom is an optional part of the Opus specification and
+ * reference implementation which uses a distinct API from the regular
+ * API and supports frame sizes that are not normally supported.\ Use
+ * of Opus Custom is discouraged for all but very special applications
+ * for which a frame size different from 2.5, 5, 10, or 20 ms is needed
+ * (for either complexity or latency reasons) and where interoperability
+ * is less important.
+ *
+ * In addition to the interoperability limitations the use of Opus custom
+ * disables a substantial chunk of the codec and generally lowers the
+ * quality available at a given bitrate. Normally when an application needs
+ * a different frame size from the codec it should buffer to match the
+ * sizes but this adds a small amount of delay which may be important
+ * in some very low latency applications. Some transports (especially
+ * constant rate RF transports) may also work best with frames of
+ * particular durations.
+ *
+ * Libopus only supports custom modes if they are enabled at compile time.
+ *
+ * The Opus Custom API is similar to the regular API but the
+ * @ref opus_encoder_create and @ref opus_decoder_create calls take
+ * an additional mode parameter which is a structure produced by
+ * a call to @ref opus_custom_mode_create. Both the encoder and decoder
+ * must create a mode using the same sample rate (fs) and frame size
+ * (frame size) so these parameters must either be signaled out of band
+ * or fixed in a particular implementation.
+ *
+ * Similar to regular Opus the custom modes support on the fly frame size
+ * switching, but the sizes available depend on the particular frame size in
+ * use. For some initial frame sizes on a single on the fly size is available.
+ */
+
+/** Contains the state of an encoder. One encoder state is needed
+ for each stream. It is initialized once at the beginning of the
+ stream. Do *not* re-initialize the state for every frame.
+ @brief Encoder state
+ */
+typedef struct OpusCustomEncoder OpusCustomEncoder;
+
+/** State of the decoder. One decoder state is needed for each stream.
+ It is initialized once at the beginning of the stream. Do *not*
+ re-initialize the state for every frame.
+ @brief Decoder state
+ */
+typedef struct OpusCustomDecoder OpusCustomDecoder;
+
+/** The mode contains all the information necessary to create an
+ encoder. Both the encoder and decoder need to be initialized
+ with exactly the same mode, otherwise the output will be
+ corrupted. The mode MUST NOT BE DESTROYED until the encoders and
+ decoders that use it are destroyed as well.
+ @brief Mode configuration
+ */
+typedef struct OpusCustomMode OpusCustomMode;
+
+/** Creates a new mode struct. This will be passed to an encoder or
+ * decoder. The mode MUST NOT BE DESTROYED until the encoders and
+ * decoders that use it are destroyed as well.
+ * @param [in] Fs int: Sampling rate (8000 to 96000 Hz)
+ * @param [in] frame_size int: Number of samples (per channel) to encode in each
+ * packet (64 - 1024, prime factorization must contain zero or more 2s, 3s, or 5s and no other primes)
+ * @param [out] error int*: Returned error code (if NULL, no error will be returned)
+ * @return A newly created mode
+ */
+OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error);
+
+/** Destroys a mode struct. Only call this after all encoders and
+ * decoders using this mode are destroyed as well.
+ * @param [in] mode OpusCustomMode*: Mode to be freed.
+ */
+OPUS_CUSTOM_EXPORT void opus_custom_mode_destroy(OpusCustomMode *mode);
+
+
+#if !defined(OPUS_BUILD) || defined(CELT_ENCODER_C)
+
+/* Encoder */
+/** Gets the size of an OpusCustomEncoder structure.
+ * @param [in] mode OpusCustomMode *: Mode configuration
+ * @param [in] channels int: Number of channels
+ * @returns size
+ */
+OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_encoder_get_size(
+ const OpusCustomMode *mode,
+ int channels
+) OPUS_ARG_NONNULL(1);
+
+#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
+/** Initializes a previously allocated encoder state
+ * The memory pointed to by st must be the size returned by opus_custom_encoder_get_size.
+ * This is intended for applications which use their own allocator instead of malloc.
+ * @see opus_custom_encoder_create(),opus_custom_encoder_get_size()
+ * To reset a previously initialized state use the OPUS_RESET_STATE CTL.
+ * @param [in] st OpusCustomEncoder*: Encoder state
+ * @param [in] mode OpusCustomMode *: Contains all the information about the characteristics of
+ * the stream (must be the same characteristics as used for the
+ * decoder)
+ * @param [in] channels int: Number of channels
+ * @return OPUS_OK Success or @ref opus_errorcodes
+ */
+OPUS_CUSTOM_EXPORT int opus_custom_encoder_init(
+ OpusCustomEncoder *st,
+ const OpusCustomMode *mode,
+ int channels
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
+# endif
+#endif
+
+
+/** Creates a new encoder state. Each stream needs its own encoder
+ * state (can't be shared across simultaneous streams).
+ * @param [in] mode OpusCustomMode*: Contains all the information about the characteristics of
+ * the stream (must be the same characteristics as used for the
+ * decoder)
+ * @param [in] channels int: Number of channels
+ * @param [out] error int*: Returns an error code
+ * @return Newly created encoder state.
+*/
+OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomEncoder *opus_custom_encoder_create(
+ const OpusCustomMode *mode,
+ int channels,
+ int *error
+) OPUS_ARG_NONNULL(1);
+
+
+/** Destroys an encoder state.
+ * @param[in] st OpusCustomEncoder*: State to be freed.
+ */
+OPUS_CUSTOM_EXPORT void opus_custom_encoder_destroy(OpusCustomEncoder *st);
+
+/** Encodes a frame of audio.
+ * @param [in] st OpusCustomEncoder*: Encoder state
+ * @param [in] pcm float*: PCM audio in float format, with a normal range of +/-1.0.
+ * Samples with a range beyond +/-1.0 are supported but will
+ * be clipped by decoders using the integer API and should
+ * only be used if it is known that the far end supports
+ * extended dynamic range. There must be exactly
+ * frame_size samples per channel.
+ * @param [in] frame_size int: Number of samples per frame of input signal
+ * @param [out] compressed char *: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long.
+ * @param [in] maxCompressedBytes int: Maximum number of bytes to use for compressing the frame
+ * (can change from one frame to another)
+ * @return Number of bytes written to "compressed".
+ * If negative, an error has occurred (see error codes). It is IMPORTANT that
+ * the length returned be somehow transmitted to the decoder. Otherwise, no
+ * decoding is possible.
+ */
+OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode_float(
+ OpusCustomEncoder *st,
+ const float *pcm,
+ int frame_size,
+ unsigned char *compressed,
+ int maxCompressedBytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Encodes a frame of audio.
+ * @param [in] st OpusCustomEncoder*: Encoder state
+ * @param [in] pcm opus_int16*: PCM audio in signed 16-bit format (native endian).
+ * There must be exactly frame_size samples per channel.
+ * @param [in] frame_size int: Number of samples per frame of input signal
+ * @param [out] compressed char *: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long.
+ * @param [in] maxCompressedBytes int: Maximum number of bytes to use for compressing the frame
+ * (can change from one frame to another)
+ * @return Number of bytes written to "compressed".
+ * If negative, an error has occurred (see error codes). It is IMPORTANT that
+ * the length returned be somehow transmitted to the decoder. Otherwise, no
+ * decoding is possible.
+ */
+OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode(
+ OpusCustomEncoder *st,
+ const opus_int16 *pcm,
+ int frame_size,
+ unsigned char *compressed,
+ int maxCompressedBytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Encodes a frame of audio.
+ * @param [in] st OpusCustomEncoder*: Encoder state
+ * @param [in] pcm opus_int32*: PCM audio in signed 32-bit format (native endian) representing (or slightly exceeding) 24-bit values.
+ * There must be exactly frame_size samples per channel.
+ * @param [in] frame_size int: Number of samples per frame of input signal
+ * @param [out] compressed char *: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long.
+ * @param [in] maxCompressedBytes int: Maximum number of bytes to use for compressing the frame
+ * (can change from one frame to another)
+ * @return Number of bytes written to "compressed".
+ * If negative, an error has occurred (see error codes). It is IMPORTANT that
+ * the length returned be somehow transmitted to the decoder. Otherwise, no
+ * decoding is possible.
+ */
+OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode24(
+ OpusCustomEncoder *st,
+ const opus_int32 *pcm,
+ int frame_size,
+ unsigned char *compressed,
+ int maxCompressedBytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Perform a CTL function on an Opus custom encoder.
+ *
+ * Generally the request and subsequent arguments are generated
+ * by a convenience macro.
+ * @see opus_encoderctls
+ */
+OPUS_CUSTOM_EXPORT int opus_custom_encoder_ctl(OpusCustomEncoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1);
+
+
+#if !defined(OPUS_BUILD) || defined(CELT_DECODER_C)
+/* Decoder */
+
+/** Gets the size of an OpusCustomDecoder structure.
+ * @param [in] mode OpusCustomMode *: Mode configuration
+ * @param [in] channels int: Number of channels
+ * @returns size
+ */
+OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_decoder_get_size(
+ const OpusCustomMode *mode,
+ int channels
+) OPUS_ARG_NONNULL(1);
+
+/** Initializes a previously allocated decoder state
+ * The memory pointed to by st must be the size returned by opus_custom_decoder_get_size.
+ * This is intended for applications which use their own allocator instead of malloc.
+ * @see opus_custom_decoder_create(),opus_custom_decoder_get_size()
+ * To reset a previously initialized state use the OPUS_RESET_STATE CTL.
+ * @param [in] st OpusCustomDecoder*: Decoder state
+ * @param [in] mode OpusCustomMode *: Contains all the information about the characteristics of
+ * the stream (must be the same characteristics as used for the
+ * encoder)
+ * @param [in] channels int: Number of channels
+ * @return OPUS_OK Success or @ref opus_errorcodes
+ */
+OPUS_CUSTOM_EXPORT_STATIC int opus_custom_decoder_init(
+ OpusCustomDecoder *st,
+ const OpusCustomMode *mode,
+ int channels
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
+
+#endif
+
+
+/** Creates a new decoder state. Each stream needs its own decoder state (can't
+ * be shared across simultaneous streams).
+ * @param [in] mode OpusCustomMode: Contains all the information about the characteristics of the
+ * stream (must be the same characteristics as used for the encoder)
+ * @param [in] channels int: Number of channels
+ * @param [out] error int*: Returns an error code
+ * @return Newly created decoder state.
+ */
+OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomDecoder *opus_custom_decoder_create(
+ const OpusCustomMode *mode,
+ int channels,
+ int *error
+) OPUS_ARG_NONNULL(1);
+
+/** Destroys a decoder state.
+ * @param[in] st OpusCustomDecoder*: State to be freed.
+ */
+OPUS_CUSTOM_EXPORT void opus_custom_decoder_destroy(OpusCustomDecoder *st);
+
+/** Decode an opus custom frame with floating point output
+ * @param [in] st OpusCustomDecoder*: Decoder state
+ * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss
+ * @param [in] len int: Number of bytes in payload
+ * @param [out] pcm float*: Output signal (interleaved if 2 channels). length
+ * is frame_size*channels*sizeof(float)
+ * @param [in] frame_size Number of samples per channel of available space in *pcm.
+ * @returns Number of decoded samples or @ref opus_errorcodes
+ */
+OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode_float(
+ OpusCustomDecoder *st,
+ const unsigned char *data,
+ int len,
+ float *pcm,
+ int frame_size
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Decode an opus custom frame
+ * @param [in] st OpusCustomDecoder*: Decoder state
+ * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss
+ * @param [in] len int: Number of bytes in payload
+ * @param [out] pcm opus_int16*: Output signal (interleaved if 2 channels). length
+ * is frame_size*channels*sizeof(opus_int16)
+ * @param [in] frame_size Number of samples per channel of available space in *pcm.
+ * @returns Number of decoded samples or @ref opus_errorcodes
+ */
+OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode(
+ OpusCustomDecoder *st,
+ const unsigned char *data,
+ int len,
+ opus_int16 *pcm,
+ int frame_size
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Decode an opus custom frame
+ * @param [in] st OpusCustomDecoder*: Decoder state
+ * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss
+ * @param [in] len int: Number of bytes in payload
+ * @param [out] pcm opus_int32*: Output signal (interleaved if 2 channels) representing (or slightly exceeding) 24-bit values. length
+ * is frame_size*channels*sizeof(opus_int32)
+ * @param [in] frame_size Number of samples per channel of available space in *pcm.
+ * @returns Number of decoded samples or @ref opus_errorcodes
+ */
+OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode24(
+ OpusCustomDecoder *st,
+ const unsigned char *data,
+ int len,
+ opus_int32 *pcm,
+ int frame_size
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Perform a CTL function on an Opus custom decoder.
+ *
+ * Generally the request and subsequent arguments are generated
+ * by a convenience macro.
+ * @see opus_genericctls
+ */
+OPUS_CUSTOM_EXPORT int opus_custom_decoder_ctl(OpusCustomDecoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1);
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OPUS_CUSTOM_H */
diff --git a/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_defines.h b/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_defines.h
new file mode 100644
index 0000000..4a61406
--- /dev/null
+++ b/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_defines.h
@@ -0,0 +1,867 @@
+/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited
+ Written by Jean-Marc Valin and Koen Vos */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/**
+ * @file opus_defines.h
+ * @brief Opus reference implementation constants
+ */
+
+#ifndef OPUS_DEFINES_H
+#define OPUS_DEFINES_H
+
+#include "opus_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @defgroup opus_errorcodes Error codes
+ * @{
+ */
+/** No error @hideinitializer*/
+#define OPUS_OK 0
+/** One or more invalid/out of range arguments @hideinitializer*/
+#define OPUS_BAD_ARG -1
+/** Not enough bytes allocated in the buffer @hideinitializer*/
+#define OPUS_BUFFER_TOO_SMALL -2
+/** An internal error was detected @hideinitializer*/
+#define OPUS_INTERNAL_ERROR -3
+/** The compressed data passed is corrupted @hideinitializer*/
+#define OPUS_INVALID_PACKET -4
+/** Invalid/unsupported request number @hideinitializer*/
+#define OPUS_UNIMPLEMENTED -5
+/** An encoder or decoder structure is invalid or already freed @hideinitializer*/
+#define OPUS_INVALID_STATE -6
+/** Memory allocation has failed @hideinitializer*/
+#define OPUS_ALLOC_FAIL -7
+/**@}*/
+
+/** @cond OPUS_INTERNAL_DOC */
+/**Export control for opus functions */
+
+#ifndef OPUS_EXPORT
+# if defined(_WIN32)
+# if defined(OPUS_BUILD) && defined(DLL_EXPORT)
+# define OPUS_EXPORT __declspec(dllexport)
+# else
+# define OPUS_EXPORT
+# endif
+# elif defined(__GNUC__) && defined(OPUS_BUILD)
+# define OPUS_EXPORT __attribute__ ((visibility ("default")))
+# else
+# define OPUS_EXPORT
+# endif
+#endif
+
+# if !defined(OPUS_GNUC_PREREQ)
+# if defined(__GNUC__)&&defined(__GNUC_MINOR__)
+# define OPUS_GNUC_PREREQ(_maj,_min) \
+ ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))
+# else
+# define OPUS_GNUC_PREREQ(_maj,_min) 0
+# endif
+# endif
+
+#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
+# if OPUS_GNUC_PREREQ(3,0)
+# define OPUS_RESTRICT __restrict__
+# elif (defined(_MSC_VER) && _MSC_VER >= 1400)
+# define OPUS_RESTRICT __restrict
+# else
+# define OPUS_RESTRICT
+# endif
+#else
+# define OPUS_RESTRICT restrict
+#endif
+
+#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
+# if OPUS_GNUC_PREREQ(2,7)
+# define OPUS_INLINE __inline__
+# elif (defined(_MSC_VER))
+# define OPUS_INLINE __inline
+# else
+# define OPUS_INLINE
+# endif
+#else
+# define OPUS_INLINE inline
+#endif
+
+/**Warning attributes for opus functions
+ * NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out
+ * some paranoid null checks. */
+#if defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)
+# define OPUS_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
+#else
+# define OPUS_WARN_UNUSED_RESULT
+#endif
+#if !defined(OPUS_BUILD) && defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)
+# define OPUS_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x)))
+#else
+# define OPUS_ARG_NONNULL(_x)
+#endif
+
+/** These are the actual Encoder CTL ID numbers.
+ * They should not be used directly by applications.
+ * In general, SETs should be even and GETs should be odd.*/
+#define OPUS_SET_APPLICATION_REQUEST 4000
+#define OPUS_GET_APPLICATION_REQUEST 4001
+#define OPUS_SET_BITRATE_REQUEST 4002
+#define OPUS_GET_BITRATE_REQUEST 4003
+#define OPUS_SET_MAX_BANDWIDTH_REQUEST 4004
+#define OPUS_GET_MAX_BANDWIDTH_REQUEST 4005
+#define OPUS_SET_VBR_REQUEST 4006
+#define OPUS_GET_VBR_REQUEST 4007
+#define OPUS_SET_BANDWIDTH_REQUEST 4008
+#define OPUS_GET_BANDWIDTH_REQUEST 4009
+#define OPUS_SET_COMPLEXITY_REQUEST 4010
+#define OPUS_GET_COMPLEXITY_REQUEST 4011
+#define OPUS_SET_INBAND_FEC_REQUEST 4012
+#define OPUS_GET_INBAND_FEC_REQUEST 4013
+#define OPUS_SET_PACKET_LOSS_PERC_REQUEST 4014
+#define OPUS_GET_PACKET_LOSS_PERC_REQUEST 4015
+#define OPUS_SET_DTX_REQUEST 4016
+#define OPUS_GET_DTX_REQUEST 4017
+#define OPUS_SET_VBR_CONSTRAINT_REQUEST 4020
+#define OPUS_GET_VBR_CONSTRAINT_REQUEST 4021
+#define OPUS_SET_FORCE_CHANNELS_REQUEST 4022
+#define OPUS_GET_FORCE_CHANNELS_REQUEST 4023
+#define OPUS_SET_SIGNAL_REQUEST 4024
+#define OPUS_GET_SIGNAL_REQUEST 4025
+#define OPUS_GET_LOOKAHEAD_REQUEST 4027
+/* #define OPUS_RESET_STATE 4028 */
+#define OPUS_GET_SAMPLE_RATE_REQUEST 4029
+#define OPUS_GET_FINAL_RANGE_REQUEST 4031
+#define OPUS_GET_PITCH_REQUEST 4033
+#define OPUS_SET_GAIN_REQUEST 4034
+#define OPUS_GET_GAIN_REQUEST 4045 /* Should have been 4035 */
+#define OPUS_SET_LSB_DEPTH_REQUEST 4036
+#define OPUS_GET_LSB_DEPTH_REQUEST 4037
+#define OPUS_GET_LAST_PACKET_DURATION_REQUEST 4039
+#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040
+#define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041
+#define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042
+#define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043
+/* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */
+#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046
+#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047
+#define OPUS_GET_IN_DTX_REQUEST 4049
+#define OPUS_SET_DRED_DURATION_REQUEST 4050
+#define OPUS_GET_DRED_DURATION_REQUEST 4051
+#define OPUS_SET_DNN_BLOB_REQUEST 4052
+/*#define OPUS_GET_DNN_BLOB_REQUEST 4053 */
+#define OPUS_SET_OSCE_BWE_REQUEST 4054
+#define OPUS_GET_OSCE_BWE_REQUEST 4055
+#define OPUS_SET_QEXT_REQUEST 4056
+#define OPUS_GET_QEXT_REQUEST 4057
+#define OPUS_SET_IGNORE_EXTENSIONS_REQUEST 4058
+#define OPUS_GET_IGNORE_EXTENSIONS_REQUEST 4059
+
+/** Defines for the presence of extended APIs. */
+#define OPUS_HAVE_OPUS_PROJECTION_H
+
+/* Macros to trigger compilation errors when the wrong types are provided to a CTL */
+#define opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x))
+
+#ifdef DISABLE_PTR_CHECK
+/* Disable checks to prevent ubsan from complaining about NULL checks
+ in test_opus_api. */
+#define opus_check_int_ptr(ptr) (ptr)
+#define opus_check_uint_ptr(ptr) (ptr)
+#define opus_check_uint8_ptr(ptr) (ptr)
+#define opus_check_val16_ptr(ptr) (ptr)
+#define opus_check_void_ptr(ptr) (ptr)
+#else
+#define opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr)))
+#define opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr)))
+#define opus_check_uint8_ptr(ptr) ((ptr) + ((ptr) - (opus_uint8*)(ptr)))
+#define opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr)))
+#define opus_check_void_ptr(x) ((void)((void *)0 == (x)), (x))
+#endif
+/** @endcond */
+
+/** @defgroup opus_ctlvalues Pre-defined values for CTL interface
+ * @see opus_genericctls, opus_encoderctls
+ * @{
+ */
+/* Values for the various encoder CTLs */
+#define OPUS_AUTO -1000 /**Fs value passed to opus_encoder_init()
+ * or opus_decoder_init().
+ * @param[out] x opus_int32 *: Sampling rate of encoder or decoder.
+ * @hideinitializer
+ */
+#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, opus_check_int_ptr(x)
+
+/** If set to 1, disables the use of phase inversion for intensity stereo,
+ * improving the quality of mono downmixes, but slightly reducing normal
+ * stereo quality. Disabling phase inversion in the decoder does not comply
+ * with RFC 6716, although it does not cause any interoperability issue and
+ * is expected to become part of the Opus standard once RFC 6716 is updated
+ * by draft-ietf-codec-opus-update.
+ * @see OPUS_GET_PHASE_INVERSION_DISABLED
+ * @param[in] x opus_int32: Allowed values:
+ * streams parameter used
+ * to initialize the encoder.
+ * @param[out] y OpusEncoder**: Returns a pointer to the given
+ * encoder state.
+ * @retval OPUS_BAD_ARG The index of the requested stream was out of range.
+ * @hideinitializer
+ */
+#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST, opus_check_int(x), opus_check_encstate_ptr(y)
+
+/** Gets the decoder state for an individual stream of a multistream decoder.
+ * @param[in] x opus_int32: The index of the stream whose decoder you
+ * wish to retrieve.
+ * This must be non-negative and less than
+ * the streams parameter used
+ * to initialize the decoder.
+ * @param[out] y OpusDecoder**: Returns a pointer to the given
+ * decoder state.
+ * @retval OPUS_BAD_ARG The index of the requested stream was out of range.
+ * @hideinitializer
+ */
+#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST, opus_check_int(x), opus_check_decstate_ptr(y)
+
+/**@}*/
+
+/** @defgroup opus_multistream Opus Multistream API
+ * @{
+ *
+ * The multistream API allows individual Opus streams to be combined into a
+ * single packet, enabling support for up to 255 channels. Unlike an
+ * elementary Opus stream, the encoder and decoder must negotiate the channel
+ * configuration before the decoder can successfully interpret the data in the
+ * packets produced by the encoder. Some basic information, such as packet
+ * duration, can be computed without any special negotiation.
+ *
+ * The format for multistream Opus packets is defined in
+ * RFC 7845
+ * and is based on the self-delimited Opus framing described in Appendix B of
+ * RFC 6716.
+ * Normal Opus packets are just a degenerate case of multistream Opus packets,
+ * and can be encoded or decoded with the multistream API by setting
+ * streams to 1 when initializing the encoder or
+ * decoder.
+ *
+ * Multistream Opus streams can contain up to 255 elementary Opus streams.
+ * These may be either "uncoupled" or "coupled", indicating that the decoder
+ * is configured to decode them to either 1 or 2 channels, respectively.
+ * The streams are ordered so that all coupled streams appear at the
+ * beginning.
+ *
+ * A mapping table defines which decoded channel i
+ * should be used for each input/output (I/O) channel j. This table is
+ * typically provided as an unsigned char array.
+ * Let i = mapping[j] be the index for I/O channel j.
+ * If i < 2*coupled_streams, then I/O channel j is
+ * encoded as the left channel of stream (i/2) if i
+ * is even, or as the right channel of stream (i/2) if
+ * i is odd. Otherwise, I/O channel j is encoded as
+ * mono in stream (i - coupled_streams), unless it has the special
+ * value 255, in which case it is omitted from the encoding entirely (the
+ * decoder will reproduce it as silence). Each value i must either
+ * be the special value 255 or be less than streams + coupled_streams.
+ *
+ * The output channels specified by the encoder
+ * should use the
+ * Vorbis
+ * channel ordering. A decoder may wish to apply an additional permutation
+ * to the mapping the encoder used to achieve a different output channel
+ * order (e.g. for outputting in WAV order).
+ *
+ * Each multistream packet contains an Opus packet for each stream, and all of
+ * the Opus packets in a single multistream packet must have the same
+ * duration. Therefore the duration of a multistream packet can be extracted
+ * from the TOC sequence of the first stream, which is located at the
+ * beginning of the packet, just like an elementary Opus stream:
+ *
+ * @code
+ * int nb_samples;
+ * int nb_frames;
+ * nb_frames = opus_packet_get_nb_frames(data, len);
+ * if (nb_frames < 1)
+ * return nb_frames;
+ * nb_samples = opus_packet_get_samples_per_frame(data, 48000) * nb_frames;
+ * @endcode
+ *
+ * The general encoding and decoding process proceeds exactly the same as in
+ * the normal @ref opus_encoder and @ref opus_decoder APIs.
+ * See their documentation for an overview of how to use the corresponding
+ * multistream functions.
+ */
+
+/** Opus multistream encoder state.
+ * This contains the complete state of a multistream Opus encoder.
+ * It is position independent and can be freely copied.
+ * @see opus_multistream_encoder_create
+ * @see opus_multistream_encoder_init
+ */
+typedef struct OpusMSEncoder OpusMSEncoder;
+
+/** Opus multistream decoder state.
+ * This contains the complete state of a multistream Opus decoder.
+ * It is position independent and can be freely copied.
+ * @see opus_multistream_decoder_create
+ * @see opus_multistream_decoder_init
+ */
+typedef struct OpusMSDecoder OpusMSDecoder;
+
+/**\name Multistream encoder functions */
+/**@{*/
+
+/** Gets the size of an OpusMSEncoder structure.
+ * @param streams int: The total number of streams to encode from the
+ * input.
+ * This must be no more than 255.
+ * @param coupled_streams int: Number of coupled (2 channel) streams
+ * to encode.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * encoded channels (streams +
+ * coupled_streams) must be no
+ * more than 255.
+ * @returns The size in bytes on success, or a negative error code
+ * (see @ref opus_errorcodes) on error.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_encoder_get_size(
+ int streams,
+ int coupled_streams
+);
+
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_surround_encoder_get_size(
+ int channels,
+ int mapping_family
+);
+
+
+/** Allocates and initializes a multistream encoder state.
+ * Call opus_multistream_encoder_destroy() to release
+ * this object when finished.
+ * @param Fs opus_int32: Sampling rate of the input signal (in Hz).
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param channels int: Number of channels in the input signal.
+ * This must be at most 255.
+ * It may be greater than the number of
+ * coded channels (streams +
+ * coupled_streams).
+ * @param streams int: The total number of streams to encode from the
+ * input.
+ * This must be no more than the number of channels.
+ * @param coupled_streams int: Number of coupled (2 channel) streams
+ * to encode.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * encoded channels (streams +
+ * coupled_streams) must be no
+ * more than the number of input channels.
+ * @param[in] mapping const unsigned char[channels]: Mapping from
+ * encoded channels to input channels, as described in
+ * @ref opus_multistream. As an extra constraint, the
+ * multistream encoder does not allow encoding coupled
+ * streams for which one channel is unused since this
+ * is never a good idea.
+ * @param application int: The target encoder application.
+ * This must be one of the following:
+ * streams +
+ * coupled_streams).
+ * @param streams int: The total number of streams to encode from the
+ * input.
+ * This must be no more than the number of channels.
+ * @param coupled_streams int: Number of coupled (2 channel) streams
+ * to encode.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * encoded channels (streams +
+ * coupled_streams) must be no
+ * more than the number of input channels.
+ * @param[in] mapping const unsigned char[channels]: Mapping from
+ * encoded channels to input channels, as described in
+ * @ref opus_multistream. As an extra constraint, the
+ * multistream encoder does not allow encoding coupled
+ * streams for which one channel is unused since this
+ * is never a good idea.
+ * @param application int: The target encoder application.
+ * This must be one of the following:
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: Number of samples per channel in the input
+ * signal.
+ * This must be an Opus frame size for the
+ * encoder's sampling rate.
+ * For example, at 48 kHz the permitted values
+ * are 120, 240, 480, 960, 1920, and 2880.
+ * Passing in a duration of less than 10 ms
+ * (480 samples at 48 kHz) will prevent the
+ * encoder from using the LPC or hybrid modes.
+ * @param[out] data unsigned char*: Output payload.
+ * This must contain storage for at
+ * least \a max_data_bytes.
+ * @param [in] max_data_bytes opus_int32: Size of the allocated
+ * memory for the output
+ * payload. This may be
+ * used to impose an upper limit on
+ * the instant bitrate, but should
+ * not be used as the only bitrate
+ * control. Use #OPUS_SET_BITRATE to
+ * control the bitrate.
+ * @returns The length of the encoded packet (in bytes) on success or a
+ * negative error code (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode(
+ OpusMSEncoder *st,
+ const opus_int16 *pcm,
+ int frame_size,
+ unsigned char *data,
+ opus_int32 max_data_bytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Encodes a multistream Opus frame.
+ * @param st OpusMSEncoder*: Multistream encoder state.
+ * @param[in] pcm const opus_int32*: The input signal as interleaved
+ * samples representing (or slightly exceeding) 24-bit values.
+ * This must contain
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: Number of samples per channel in the input
+ * signal.
+ * This must be an Opus frame size for the
+ * encoder's sampling rate.
+ * For example, at 48 kHz the permitted values
+ * are 120, 240, 480, 960, 1920, and 2880.
+ * Passing in a duration of less than 10 ms
+ * (480 samples at 48 kHz) will prevent the
+ * encoder from using the LPC or hybrid modes.
+ * @param[out] data unsigned char*: Output payload.
+ * This must contain storage for at
+ * least \a max_data_bytes.
+ * @param [in] max_data_bytes opus_int32: Size of the allocated
+ * memory for the output
+ * payload. This may be
+ * used to impose an upper limit on
+ * the instant bitrate, but should
+ * not be used as the only bitrate
+ * control. Use #OPUS_SET_BITRATE to
+ * control the bitrate.
+ * @returns The length of the encoded packet (in bytes) on success or a
+ * negative error code (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode24(
+ OpusMSEncoder *st,
+ const opus_int32 *pcm,
+ int frame_size,
+ unsigned char *data,
+ opus_int32 max_data_bytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Encodes a multistream Opus frame from floating point input.
+ * @param st OpusMSEncoder*: Multistream encoder state.
+ * @param[in] pcm const float*: The input signal as interleaved
+ * samples with a normal range of
+ * +/-1.0.
+ * Samples with a range beyond +/-1.0
+ * are supported but will be clipped by
+ * decoders using the integer API and
+ * should only be used if it is known
+ * that the far end supports extended
+ * dynamic range.
+ * This must contain
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: Number of samples per channel in the input
+ * signal.
+ * This must be an Opus frame size for the
+ * encoder's sampling rate.
+ * For example, at 48 kHz the permitted values
+ * are 120, 240, 480, 960, 1920, and 2880.
+ * Passing in a duration of less than 10 ms
+ * (480 samples at 48 kHz) will prevent the
+ * encoder from using the LPC or hybrid modes.
+ * @param[out] data unsigned char*: Output payload.
+ * This must contain storage for at
+ * least \a max_data_bytes.
+ * @param [in] max_data_bytes opus_int32: Size of the allocated
+ * memory for the output
+ * payload. This may be
+ * used to impose an upper limit on
+ * the instant bitrate, but should
+ * not be used as the only bitrate
+ * control. Use #OPUS_SET_BITRATE to
+ * control the bitrate.
+ * @returns The length of the encoded packet (in bytes) on success or a
+ * negative error code (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode_float(
+ OpusMSEncoder *st,
+ const float *pcm,
+ int frame_size,
+ unsigned char *data,
+ opus_int32 max_data_bytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Frees an OpusMSEncoder allocated by
+ * opus_multistream_encoder_create().
+ * @param st OpusMSEncoder*: Multistream encoder state to be freed.
+ */
+OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st);
+
+/** Perform a CTL function on a multistream Opus encoder.
+ *
+ * Generally the request and subsequent arguments are generated by a
+ * convenience macro.
+ * @param st OpusMSEncoder*: Multistream encoder state.
+ * @param request This and all remaining parameters should be replaced by one
+ * of the convenience macros in @ref opus_genericctls,
+ * @ref opus_encoderctls, or @ref opus_multistream_ctls.
+ * @see opus_genericctls
+ * @see opus_encoderctls
+ * @see opus_multistream_ctls
+ */
+OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
+
+/**@}*/
+
+/**\name Multistream decoder functions */
+/**@{*/
+
+/** Gets the size of an OpusMSDecoder structure.
+ * @param streams int: The total number of streams coded in the
+ * input.
+ * This must be no more than 255.
+ * @param coupled_streams int: Number streams to decode as coupled
+ * (2 channel) streams.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * coded channels (streams +
+ * coupled_streams) must be no
+ * more than 255.
+ * @returns The size in bytes on success, or a negative error code
+ * (see @ref opus_errorcodes) on error.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_decoder_get_size(
+ int streams,
+ int coupled_streams
+);
+
+/** Allocates and initializes a multistream decoder state.
+ * Call opus_multistream_decoder_destroy() to release
+ * this object when finished.
+ * @param Fs opus_int32: Sampling rate to decode at (in Hz).
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param channels int: Number of channels to output.
+ * This must be at most 255.
+ * It may be different from the number of coded
+ * channels (streams +
+ * coupled_streams).
+ * @param streams int: The total number of streams coded in the
+ * input.
+ * This must be no more than 255.
+ * @param coupled_streams int: Number of streams to decode as coupled
+ * (2 channel) streams.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * coded channels (streams +
+ * coupled_streams) must be no
+ * more than 255.
+ * @param[in] mapping const unsigned char[channels]: Mapping from
+ * coded channels to output channels, as described in
+ * @ref opus_multistream.
+ * @param[out] error int *: Returns #OPUS_OK on success, or an error
+ * code (see @ref opus_errorcodes) on
+ * failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSDecoder *opus_multistream_decoder_create(
+ opus_int32 Fs,
+ int channels,
+ int streams,
+ int coupled_streams,
+ const unsigned char *mapping,
+ int *error
+) OPUS_ARG_NONNULL(5);
+
+/** Initialize a previously allocated decoder state object.
+ * The memory pointed to by \a st must be at least the size returned by
+ * opus_multistream_encoder_get_size().
+ * This is intended for applications which use their own allocator instead of
+ * malloc.
+ * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
+ * @see opus_multistream_decoder_create
+ * @see opus_multistream_deocder_get_size
+ * @param st OpusMSEncoder*: Multistream encoder state to initialize.
+ * @param Fs opus_int32: Sampling rate to decode at (in Hz).
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param channels int: Number of channels to output.
+ * This must be at most 255.
+ * It may be different from the number of coded
+ * channels (streams +
+ * coupled_streams).
+ * @param streams int: The total number of streams coded in the
+ * input.
+ * This must be no more than 255.
+ * @param coupled_streams int: Number of streams to decode as coupled
+ * (2 channel) streams.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * coded channels (streams +
+ * coupled_streams) must be no
+ * more than 255.
+ * @param[in] mapping const unsigned char[channels]: Mapping from
+ * coded channels to output channels, as described in
+ * @ref opus_multistream.
+ * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
+ * on failure.
+ */
+OPUS_EXPORT int opus_multistream_decoder_init(
+ OpusMSDecoder *st,
+ opus_int32 Fs,
+ int channels,
+ int streams,
+ int coupled_streams,
+ const unsigned char *mapping
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
+
+/** Decode a multistream Opus packet.
+ * @param st OpusMSDecoder*: Multistream decoder state.
+ * @param[in] data const unsigned char*: Input payload.
+ * Use a NULL
+ * pointer to indicate packet
+ * loss.
+ * @param len opus_int32: Number of bytes in payload.
+ * @param[out] pcm opus_int16*: Output signal, with interleaved
+ * samples.
+ * This must contain room for
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: The number of samples per channel of
+ * available space in \a pcm.
+ * If this is less than the maximum packet duration
+ * (120 ms; 5760 for 48kHz), this function will not be capable
+ * of decoding some packets. In the case of PLC (data==NULL)
+ * or FEC (decode_fec=1), then frame_size needs to be exactly
+ * the duration of audio that is missing, otherwise the
+ * decoder will not be in the optimal state to decode the
+ * next incoming packet. For the PLC and FEC cases, frame_size
+ * must be a multiple of 2.5 ms.
+ * @param decode_fec int: Flag (0 or 1) to request that any in-band
+ * forward error correction data be decoded.
+ * If no such data is available, the frame is
+ * decoded as if it were lost.
+ * @returns Number of samples decoded on success or a negative error code
+ * (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode(
+ OpusMSDecoder *st,
+ const unsigned char *data,
+ opus_int32 len,
+ opus_int16 *pcm,
+ int frame_size,
+ int decode_fec
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Decode a multistream Opus packet.
+ * @param st OpusMSDecoder*: Multistream decoder state.
+ * @param[in] data const unsigned char*: Input payload.
+ * Use a NULL
+ * pointer to indicate packet
+ * loss.
+ * @param len opus_int32: Number of bytes in payload.
+ * @param[out] pcm opus_int32*: Output signal, with interleaved
+ * samples representing (or slightly exceeding) 24-bit values.
+ * This must contain room for
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: The number of samples per channel of
+ * available space in \a pcm.
+ * If this is less than the maximum packet duration
+ * (120 ms; 5760 for 48kHz), this function will not be capable
+ * of decoding some packets. In the case of PLC (data==NULL)
+ * or FEC (decode_fec=1), then frame_size needs to be exactly
+ * the duration of audio that is missing, otherwise the
+ * decoder will not be in the optimal state to decode the
+ * next incoming packet. For the PLC and FEC cases, frame_size
+ * must be a multiple of 2.5 ms.
+ * @param decode_fec int: Flag (0 or 1) to request that any in-band
+ * forward error correction data be decoded.
+ * If no such data is available, the frame is
+ * decoded as if it were lost.
+ * @returns Number of samples decoded on success or a negative error code
+ * (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode24(
+ OpusMSDecoder *st,
+ const unsigned char *data,
+ opus_int32 len,
+ opus_int32 *pcm,
+ int frame_size,
+ int decode_fec
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Decode a multistream Opus packet with floating point output.
+ * @param st OpusMSDecoder*: Multistream decoder state.
+ * @param[in] data const unsigned char*: Input payload.
+ * Use a NULL
+ * pointer to indicate packet
+ * loss.
+ * @param len opus_int32: Number of bytes in payload.
+ * @param[out] pcm opus_int16*: Output signal, with interleaved
+ * samples.
+ * This must contain room for
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: The number of samples per channel of
+ * available space in \a pcm.
+ * If this is less than the maximum packet duration
+ * (120 ms; 5760 for 48kHz), this function will not be capable
+ * of decoding some packets. In the case of PLC (data==NULL)
+ * or FEC (decode_fec=1), then frame_size needs to be exactly
+ * the duration of audio that is missing, otherwise the
+ * decoder will not be in the optimal state to decode the
+ * next incoming packet. For the PLC and FEC cases, frame_size
+ * must be a multiple of 2.5 ms.
+ * @param decode_fec int: Flag (0 or 1) to request that any in-band
+ * forward error correction data be decoded.
+ * If no such data is available, the frame is
+ * decoded as if it were lost.
+ * @returns Number of samples decoded on success or a negative error code
+ * (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode_float(
+ OpusMSDecoder *st,
+ const unsigned char *data,
+ opus_int32 len,
+ float *pcm,
+ int frame_size,
+ int decode_fec
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Perform a CTL function on a multistream Opus decoder.
+ *
+ * Generally the request and subsequent arguments are generated by a
+ * convenience macro.
+ * @param st OpusMSDecoder*: Multistream decoder state.
+ * @param request This and all remaining parameters should be replaced by one
+ * of the convenience macros in @ref opus_genericctls,
+ * @ref opus_decoderctls, or @ref opus_multistream_ctls.
+ * @see opus_genericctls
+ * @see opus_decoderctls
+ * @see opus_multistream_ctls
+ */
+OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
+
+/** Frees an OpusMSDecoder allocated by
+ * opus_multistream_decoder_create().
+ * @param st OpusMSDecoder: Multistream decoder state to be freed.
+ */
+OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st);
+
+/**@}*/
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OPUS_MULTISTREAM_H */
diff --git a/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_projection.h b/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_projection.h
new file mode 100644
index 0000000..26f3cbb
--- /dev/null
+++ b/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_projection.h
@@ -0,0 +1,643 @@
+/* Copyright (c) 2017 Google Inc.
+ Written by Andrew Allen */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/**
+ * @file opus_projection.h
+ * @brief Opus projection reference API
+ */
+
+#ifndef OPUS_PROJECTION_H
+#define OPUS_PROJECTION_H
+
+#include "opus_multistream.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @cond OPUS_INTERNAL_DOC */
+
+/** These are the actual encoder and decoder CTL ID numbers.
+ * They should not be used directly by applications.c
+ * In general, SETs should be even and GETs should be odd.*/
+/**@{*/
+#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST 6001
+#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST 6003
+#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST 6005
+/**@}*/
+
+
+/** @endcond */
+
+/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs
+ *
+ * These are convenience macros that are specific to the
+ * opus_projection_encoder_ctl() and opus_projection_decoder_ctl()
+ * interface.
+ * The CTLs from @ref opus_genericctls, @ref opus_encoderctls,
+ * @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a
+ * projection encoder or decoder as well.
+ */
+/**@{*/
+
+/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder.
+ * @param[out] x opus_int32 *: Returns the gain (in dB. S7.8-format)
+ * of the demixing matrix.
+ * @hideinitializer
+ */
+#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, opus_check_int_ptr(x)
+
+
+/** Gets the size in bytes of the demixing matrix from the encoder.
+ * @param[out] x opus_int32 *: Returns the size in bytes of the
+ * demixing matrix.
+ * @hideinitializer
+ */
+#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, opus_check_int_ptr(x)
+
+
+/** Copies the demixing matrix to the supplied pointer location.
+ * @param[out] x unsigned char *: Returns the demixing matrix to the
+ * supplied pointer location.
+ * @param y opus_int32: The size in bytes of the reserved memory at the
+ * pointer location.
+ * @hideinitializer
+ */
+#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, opus_check_int(y)
+
+
+/**@}*/
+
+/** Opus projection encoder state.
+ * This contains the complete state of a projection Opus encoder.
+ * It is position independent and can be freely copied.
+ * @see opus_projection_ambisonics_encoder_create
+ */
+typedef struct OpusProjectionEncoder OpusProjectionEncoder;
+
+
+/** Opus projection decoder state.
+ * This contains the complete state of a projection Opus decoder.
+ * It is position independent and can be freely copied.
+ * @see opus_projection_decoder_create
+ * @see opus_projection_decoder_init
+ */
+typedef struct OpusProjectionDecoder OpusProjectionDecoder;
+
+
+/**\name Projection encoder functions */
+/**@{*/
+
+/** Gets the size of an OpusProjectionEncoder structure.
+ * @param channels int: The total number of input channels to encode.
+ * This must be no more than 255.
+ * @param mapping_family int: The mapping family to use for selecting
+ * the appropriate projection.
+ * @returns The size in bytes on success, or a negative error code
+ * (see @ref opus_errorcodes) on error.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size(
+ int channels,
+ int mapping_family
+);
+
+
+/** Allocates and initializes a projection encoder state.
+ * Call opus_projection_encoder_destroy() to release
+ * this object when finished.
+ * @param Fs opus_int32: Sampling rate of the input signal (in Hz).
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param channels int: Number of channels in the input signal.
+ * This must be at most 255.
+ * It may be greater than the number of
+ * coded channels (streams +
+ * coupled_streams).
+ * @param mapping_family int: The mapping family to use for selecting
+ * the appropriate projection.
+ * @param[out] streams int *: The total number of streams that will
+ * be encoded from the input.
+ * @param[out] coupled_streams int *: Number of coupled (2 channel)
+ * streams that will be encoded from the input.
+ * @param application int: The target encoder application.
+ * This must be one of the following:
+ * streams +
+ * coupled_streams).
+ * @param streams int: The total number of streams to encode from the
+ * input.
+ * This must be no more than the number of channels.
+ * @param coupled_streams int: Number of coupled (2 channel) streams
+ * to encode.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * encoded channels (streams +
+ * coupled_streams) must be no
+ * more than the number of input channels.
+ * @param application int: The target encoder application.
+ * This must be one of the following:
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: Number of samples per channel in the input
+ * signal.
+ * This must be an Opus frame size for the
+ * encoder's sampling rate.
+ * For example, at 48 kHz the permitted values
+ * are 120, 240, 480, 960, 1920, and 2880.
+ * Passing in a duration of less than 10 ms
+ * (480 samples at 48 kHz) will prevent the
+ * encoder from using the LPC or hybrid modes.
+ * @param[out] data unsigned char*: Output payload.
+ * This must contain storage for at
+ * least \a max_data_bytes.
+ * @param [in] max_data_bytes opus_int32: Size of the allocated
+ * memory for the output
+ * payload. This may be
+ * used to impose an upper limit on
+ * the instant bitrate, but should
+ * not be used as the only bitrate
+ * control. Use #OPUS_SET_BITRATE to
+ * control the bitrate.
+ * @returns The length of the encoded packet (in bytes) on success or a
+ * negative error code (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode(
+ OpusProjectionEncoder *st,
+ const opus_int16 *pcm,
+ int frame_size,
+ unsigned char *data,
+ opus_int32 max_data_bytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+/** Encodes a projection Opus frame.
+ * @param st OpusProjectionEncoder*: Projection encoder state.
+ * @param[in] pcm const opus_int32*: The input signal as interleaved
+ * samples representing (or slightly exceeding) 24-bit values.
+ * This must contain
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: Number of samples per channel in the input
+ * signal.
+ * This must be an Opus frame size for the
+ * encoder's sampling rate.
+ * For example, at 48 kHz the permitted values
+ * are 120, 240, 480, 960, 1920, and 2880.
+ * Passing in a duration of less than 10 ms
+ * (480 samples at 48 kHz) will prevent the
+ * encoder from using the LPC or hybrid modes.
+ * @param[out] data unsigned char*: Output payload.
+ * This must contain storage for at
+ * least \a max_data_bytes.
+ * @param [in] max_data_bytes opus_int32: Size of the allocated
+ * memory for the output
+ * payload. This may be
+ * used to impose an upper limit on
+ * the instant bitrate, but should
+ * not be used as the only bitrate
+ * control. Use #OPUS_SET_BITRATE to
+ * control the bitrate.
+ * @returns The length of the encoded packet (in bytes) on success or a
+ * negative error code (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode24(
+ OpusProjectionEncoder *st,
+ const opus_int32 *pcm,
+ int frame_size,
+ unsigned char *data,
+ opus_int32 max_data_bytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+
+/** Encodes a projection Opus frame from floating point input.
+ * @param st OpusProjectionEncoder*: Projection encoder state.
+ * @param[in] pcm const float*: The input signal as interleaved
+ * samples with a normal range of
+ * +/-1.0.
+ * Samples with a range beyond +/-1.0
+ * are supported but will be clipped by
+ * decoders using the integer API and
+ * should only be used if it is known
+ * that the far end supports extended
+ * dynamic range.
+ * This must contain
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: Number of samples per channel in the input
+ * signal.
+ * This must be an Opus frame size for the
+ * encoder's sampling rate.
+ * For example, at 48 kHz the permitted values
+ * are 120, 240, 480, 960, 1920, and 2880.
+ * Passing in a duration of less than 10 ms
+ * (480 samples at 48 kHz) will prevent the
+ * encoder from using the LPC or hybrid modes.
+ * @param[out] data unsigned char*: Output payload.
+ * This must contain storage for at
+ * least \a max_data_bytes.
+ * @param [in] max_data_bytes opus_int32: Size of the allocated
+ * memory for the output
+ * payload. This may be
+ * used to impose an upper limit on
+ * the instant bitrate, but should
+ * not be used as the only bitrate
+ * control. Use #OPUS_SET_BITRATE to
+ * control the bitrate.
+ * @returns The length of the encoded packet (in bytes) on success or a
+ * negative error code (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode_float(
+ OpusProjectionEncoder *st,
+ const float *pcm,
+ int frame_size,
+ unsigned char *data,
+ opus_int32 max_data_bytes
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
+
+
+/** Frees an OpusProjectionEncoder allocated by
+ * opus_projection_ambisonics_encoder_create().
+ * @param st OpusProjectionEncoder*: Projection encoder state to be freed.
+ */
+OPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st);
+
+
+/** Perform a CTL function on a projection Opus encoder.
+ *
+ * Generally the request and subsequent arguments are generated by a
+ * convenience macro.
+ * @param st OpusProjectionEncoder*: Projection encoder state.
+ * @param request This and all remaining parameters should be replaced by one
+ * of the convenience macros in @ref opus_genericctls,
+ * @ref opus_encoderctls, @ref opus_multistream_ctls, or
+ * @ref opus_projection_ctls
+ * @see opus_genericctls
+ * @see opus_encoderctls
+ * @see opus_multistream_ctls
+ * @see opus_projection_ctls
+ */
+OPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
+
+
+/**@}*/
+
+/**\name Projection decoder functions */
+/**@{*/
+
+/** Gets the size of an OpusProjectionDecoder structure.
+ * @param channels int: The total number of output channels.
+ * This must be no more than 255.
+ * @param streams int: The total number of streams coded in the
+ * input.
+ * This must be no more than 255.
+ * @param coupled_streams int: Number streams to decode as coupled
+ * (2 channel) streams.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * coded channels (streams +
+ * coupled_streams) must be no
+ * more than 255.
+ * @returns The size in bytes on success, or a negative error code
+ * (see @ref opus_errorcodes) on error.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_decoder_get_size(
+ int channels,
+ int streams,
+ int coupled_streams
+);
+
+
+/** Allocates and initializes a projection decoder state.
+ * Call opus_projection_decoder_destroy() to release
+ * this object when finished.
+ * @param Fs opus_int32: Sampling rate to decode at (in Hz).
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param channels int: Number of channels to output.
+ * This must be at most 255.
+ * It may be different from the number of coded
+ * channels (streams +
+ * coupled_streams).
+ * @param streams int: The total number of streams coded in the
+ * input.
+ * This must be no more than 255.
+ * @param coupled_streams int: Number of streams to decode as coupled
+ * (2 channel) streams.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * coded channels (streams +
+ * coupled_streams) must be no
+ * more than 255.
+ * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix
+ * that mapping from coded channels to output channels,
+ * as described in @ref opus_projection and
+ * @ref opus_projection_ctls.
+ * @param demixing_matrix_size opus_int32: The size in bytes of the
+ * demixing matrix, as
+ * described in @ref
+ * opus_projection_ctls.
+ * @param[out] error int *: Returns #OPUS_OK on success, or an error
+ * code (see @ref opus_errorcodes) on
+ * failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionDecoder *opus_projection_decoder_create(
+ opus_int32 Fs,
+ int channels,
+ int streams,
+ int coupled_streams,
+ unsigned char *demixing_matrix,
+ opus_int32 demixing_matrix_size,
+ int *error
+) OPUS_ARG_NONNULL(5);
+
+
+/** Initialize a previously allocated projection decoder state object.
+ * The memory pointed to by \a st must be at least the size returned by
+ * opus_projection_decoder_get_size().
+ * This is intended for applications which use their own allocator instead of
+ * malloc.
+ * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
+ * @see opus_projection_decoder_create
+ * @see opus_projection_deocder_get_size
+ * @param st OpusProjectionDecoder*: Projection encoder state to initialize.
+ * @param Fs opus_int32: Sampling rate to decode at (in Hz).
+ * This must be one of 8000, 12000, 16000,
+ * 24000, or 48000.
+ * @param channels int: Number of channels to output.
+ * This must be at most 255.
+ * It may be different from the number of coded
+ * channels (streams +
+ * coupled_streams).
+ * @param streams int: The total number of streams coded in the
+ * input.
+ * This must be no more than 255.
+ * @param coupled_streams int: Number of streams to decode as coupled
+ * (2 channel) streams.
+ * This must be no larger than the total
+ * number of streams.
+ * Additionally, The total number of
+ * coded channels (streams +
+ * coupled_streams) must be no
+ * more than 255.
+ * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix
+ * that mapping from coded channels to output channels,
+ * as described in @ref opus_projection and
+ * @ref opus_projection_ctls.
+ * @param demixing_matrix_size opus_int32: The size in bytes of the
+ * demixing matrix, as
+ * described in @ref
+ * opus_projection_ctls.
+ * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
+ * on failure.
+ */
+OPUS_EXPORT int opus_projection_decoder_init(
+ OpusProjectionDecoder *st,
+ opus_int32 Fs,
+ int channels,
+ int streams,
+ int coupled_streams,
+ unsigned char *demixing_matrix,
+ opus_int32 demixing_matrix_size
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
+
+
+/** Decode a projection Opus packet.
+ * @param st OpusProjectionDecoder*: Projection decoder state.
+ * @param[in] data const unsigned char*: Input payload.
+ * Use a NULL
+ * pointer to indicate packet
+ * loss.
+ * @param len opus_int32: Number of bytes in payload.
+ * @param[out] pcm opus_int16*: Output signal, with interleaved
+ * samples.
+ * This must contain room for
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: The number of samples per channel of
+ * available space in \a pcm.
+ * If this is less than the maximum packet duration
+ * (120 ms; 5760 for 48kHz), this function will not be capable
+ * of decoding some packets. In the case of PLC (data==NULL)
+ * or FEC (decode_fec=1), then frame_size needs to be exactly
+ * the duration of audio that is missing, otherwise the
+ * decoder will not be in the optimal state to decode the
+ * next incoming packet. For the PLC and FEC cases, frame_size
+ * must be a multiple of 2.5 ms.
+ * @param decode_fec int: Flag (0 or 1) to request that any in-band
+ * forward error correction data be decoded.
+ * If no such data is available, the frame is
+ * decoded as if it were lost.
+ * @returns Number of samples decoded on success or a negative error code
+ * (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode(
+ OpusProjectionDecoder *st,
+ const unsigned char *data,
+ opus_int32 len,
+ opus_int16 *pcm,
+ int frame_size,
+ int decode_fec
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Decode a projection Opus packet.
+ * @param st OpusProjectionDecoder*: Projection decoder state.
+ * @param[in] data const unsigned char*: Input payload.
+ * Use a NULL
+ * pointer to indicate packet
+ * loss.
+ * @param len opus_int32: Number of bytes in payload.
+ * @param[out] pcm opus_int32*: Output signal, with interleaved
+ * samples representing (or slightly exceeding) 24-bit values.
+ * This must contain room for
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: The number of samples per channel of
+ * available space in \a pcm.
+ * If this is less than the maximum packet duration
+ * (120 ms; 5760 for 48kHz), this function will not be capable
+ * of decoding some packets. In the case of PLC (data==NULL)
+ * or FEC (decode_fec=1), then frame_size needs to be exactly
+ * the duration of audio that is missing, otherwise the
+ * decoder will not be in the optimal state to decode the
+ * next incoming packet. For the PLC and FEC cases, frame_size
+ * must be a multiple of 2.5 ms.
+ * @param decode_fec int: Flag (0 or 1) to request that any in-band
+ * forward error correction data be decoded.
+ * If no such data is available, the frame is
+ * decoded as if it were lost.
+ * @returns Number of samples decoded on success or a negative error code
+ * (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode24(
+ OpusProjectionDecoder *st,
+ const unsigned char *data,
+ opus_int32 len,
+ opus_int32 *pcm,
+ int frame_size,
+ int decode_fec
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+/** Decode a projection Opus packet with floating point output.
+ * @param st OpusProjectionDecoder*: Projection decoder state.
+ * @param[in] data const unsigned char*: Input payload.
+ * Use a NULL
+ * pointer to indicate packet
+ * loss.
+ * @param len opus_int32: Number of bytes in payload.
+ * @param[out] pcm opus_int16*: Output signal, with interleaved
+ * samples.
+ * This must contain room for
+ * frame_size*channels
+ * samples.
+ * @param frame_size int: The number of samples per channel of
+ * available space in \a pcm.
+ * If this is less than the maximum packet duration
+ * (120 ms; 5760 for 48kHz), this function will not be capable
+ * of decoding some packets. In the case of PLC (data==NULL)
+ * or FEC (decode_fec=1), then frame_size needs to be exactly
+ * the duration of audio that is missing, otherwise the
+ * decoder will not be in the optimal state to decode the
+ * next incoming packet. For the PLC and FEC cases, frame_size
+ * must be a multiple of 2.5 ms.
+ * @param decode_fec int: Flag (0 or 1) to request that any in-band
+ * forward error correction data be decoded.
+ * If no such data is available, the frame is
+ * decoded as if it were lost.
+ * @returns Number of samples decoded on success or a negative error code
+ * (see @ref opus_errorcodes) on failure.
+ */
+OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode_float(
+ OpusProjectionDecoder *st,
+ const unsigned char *data,
+ opus_int32 len,
+ float *pcm,
+ int frame_size,
+ int decode_fec
+) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
+
+
+/** Perform a CTL function on a projection Opus decoder.
+ *
+ * Generally the request and subsequent arguments are generated by a
+ * convenience macro.
+ * @param st OpusProjectionDecoder*: Projection decoder state.
+ * @param request This and all remaining parameters should be replaced by one
+ * of the convenience macros in @ref opus_genericctls,
+ * @ref opus_decoderctls, @ref opus_multistream_ctls, or
+ * @ref opus_projection_ctls.
+ * @see opus_genericctls
+ * @see opus_decoderctls
+ * @see opus_multistream_ctls
+ * @see opus_projection_ctls
+ */
+OPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
+
+
+/** Frees an OpusProjectionDecoder allocated by
+ * opus_projection_decoder_create().
+ * @param st OpusProjectionDecoder: Projection decoder state to be freed.
+ */
+OPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st);
+
+
+/**@}*/
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OPUS_PROJECTION_H */
diff --git a/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_types.h b/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_types.h
new file mode 100644
index 0000000..7cf6755
--- /dev/null
+++ b/OpusSharp.Natives/runtimes/ios/native/libopus.xcframework/ios-arm64/Headers/opus_types.h
@@ -0,0 +1,166 @@
+/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */
+/* Modified by Jean-Marc Valin */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/* opus_types.h based on ogg_types.h from libogg */
+
+/**
+ @file opus_types.h
+ @brief Opus reference implementation types
+*/
+#ifndef OPUS_TYPES_H
+#define OPUS_TYPES_H
+
+#define opus_int int /* used for counters etc; at least 16 bits */
+#define opus_int64 long long
+#define opus_int8 signed char
+
+#define opus_uint unsigned int /* used for counters etc; at least 16 bits */
+#define opus_uint64 unsigned long long
+#define opus_uint8 unsigned char
+
+/* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */
+#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H))
+#include fzujwcEn6=mg>V@C773mrv{%F)*Byxi;pVs1xqB2~%;BNpXA z2D0qPx0mPi%3M-X?#c7!tRmvuYzQo^ncQ`$gXXX*yQCZ(&a6r@r{wWsS?W+r$*IVt z;1o$?QOR-)zGPVzi6pZsSnSIxO9+K0U06yK67w%{$av-N4hJegm`Bfn&cYnc&9xU} z$rP26U1BeXPLefMwI@?a0ZFl}u{_yG->JE*xL*XG?7L8S3VI=-+4N{kD7TVqd!?-Z z?1f7e`an3o^0uJ8s?=IuQpszTlv+!dmq97fB+)dMduiF_P*kL~WbImF#R}$D+WFdY zHKxq%U93=?ODg!TWs_?^TagP{m(yI~R5+H>n#oz5jlHvE1<&;tuLT7TE#EtjBLmBT!@SW$VHNesDz#G{ z%!j92-q=x` r|0Pb}2_*1QH5jH6>3OuO|=vRNAdHK&vBl z`b=K4Z+cGV0;NvM?94^hh2yNHl|5|IQ%3Fk7L-CFFx|OT-q@)H#8~cx5Lp*a;QjKF zely9f@Nk4Yf2k?fc`4SpDZH&G?-5VNoRo|V>ykqI(h9kABJEB$i?Z#7xfP0IV_ldy z_D)F!m3WgYBc8E1^RB!*3r>EO;x&0!T1Y;eqefO<*7-}8Kt3?mL|7wvIWpluRyaui zS-~jD)`g>!`YlQEDk-eU^6r7_x{~6;YN%D%oFYd~KjrYba;*6!p!Z&difUh&IEGVD zSzVfI1;3I=Kb$<>yP0=UaY^6OWyKEI#G*0YEqLD8e)7iklQ+Jfyd>{D#Z+dO6jzok zE4L;lSc@u%6TJAhzZ&-}{;sBXHB#i|u556bcmGB9DyyPUJg&36;yjClA`7;!z{ |f=|y1kq#i{_nPdZaSG1z#C52Y|vK&W=yzhD3ky8n8NG4EWQIEFq^z-mS z>mzgR(Eq7DSZ95w)>YIW$0>{U!wbDr%Zf|k=y~UORI#_Nhn0s-1lvK8dr0BJI48qe zSz?{Lh@;@Sa~DzWoDBFG q`X$lLho(0ZwU;sIAuPWs&U{3Bm3*ZEEOj(b^0mH@?3`>5pOw*k_o}m~S#ewBn zUQQ1j%B96nKeAfo#c*jyV~6BP!AnIBPt947iXFMVu$nf=p8c%cF_k!qX&ajhFAFGT z1L7eS!%r=#$h2o!XU<*>E$bnd=4Es;M=q~-1?0g|c*hHoGr>oX=Q@_=K|>eX%S#;a z9OX`7WMm71MoV)&ID2O*8mPbeWBSePReuf?2kgMoTr3KD@U-Zg-K$M;mNh#I=3I7z zD|$EN+jt5B$n^K5<^9`TnY05LZT0ker?Q-XSMAbr$8yp`$r+xRxYNQ@MlG=f8TV{F zdv?ZmmM<$EZJp&2$-D6@#n#8m?WNG8yq63mcmXy|w2ro>&Yv;UBYxf`WA0fp_MRo< z?@@wD`@RzE9M3535HZHuyQ@3nqYwhki?xSyp+bwm$m94J;gRN+%icmoNjVI8G3_ra z 4!(brT~(zkMdy39Asw)!$6$a3;P_w;C>&J`&a=*( zvw&l#Z88i)xudF2=EL$n(JPZvmZSJGcQEjL*{$}fF4IeN+^MN#!K>|)rMMxo{^(mm z`YXF6cS(g;n|@TEcPa4qQH*^`70)%hvb@l%ptyuWkQI4$ICMSD?@;40WTZ>IX(`WL zx(tdCS`uWIm*-+v14p%YjS7dn!{s~wJ2=7Ay-Ko6unY1c2@#W04Br#X;JCdiDAvp? zLs8=18Q3my72uWY84OkTCbf_2;ML;ZG-NF+Uus1h$Fal#TJH?*j`{P-ylV>X7{Fx+ z9ierPNi7&{_iEU`O}o>Z!a+UjMjLsr)_lQBN~;mwCF!}Vte@;W_{?`Y=%Y0t_*|=a z)w#=a7|jD5-(i-OxQJX~9@fg^L-on_X3izKxj7VLL+liB9 X zdV}^*N((NuN(@?#+K@YkT?~c5l~`Mal^k#$0r9Sa2nZbj+?C}Wp)AdY(k!6}W}&0h zQ`bAsyRxE2c`YR|8aqw71FmA_AXD$GVu;#u4;@N1#P)bF(W@;oDOBDoCnpyX{Sqkb z-npc0`XQ!V4xjUqK9uz;!!{a`(>_>fM&XL^N$sc5YY{xdAcxjdlZcXIfZiFNioM5s zhyGrJ_Rj7za_=H}>1BUUnHBG{z6347@q{-${k8Sx6FPqY7s|T<-p-5R=un97VdSp8 zipYt}vm<0kVXl4(J<*(gih9pD$B7daYhf0JhCT6BZp(T9 Y zL0q6%JX$?|{zIX1YmQ^711C-7Rzk=;lcdNSAAyqSVI(e#-n_%Jda<~Y*N4S>GJ9Cu zlhb>lJ-L0>$&>B1yt!4CxrnzwQ{aFPn`UTBvfCcg?=JoBw#C4A@3t_36w#Fzub+ IU0En6yA({clUCs(gDqGVJ>Ms zg=LwnPK!zq|LK)ePCKYOSv_ZJh4$(a+UCl16fG;PbkM=0-E-)7&w?ISy1R{sk?(=h z+Ka{RZr+F8`mNBzdiN+raMy|h-g}P=I<%KQ?hj8N#_g|)7bAKXS1iNH?K1h)nZh>T zF`~O_en+Qw)m3`$$@cgn{j6Cp3*$|xQqb>WDn<8POkRA?#Z=0_W9U5<`dv(~((hPI zPpx||rl-bt%&Vu$Jr
{NIxyhbCpcli^BOEU&!9s z-rh#9lHPOBtB3{ 8V{%Ua^ddk?;g~88h;P9-nTpy<926xJt&m9FG7%jF0~XX zv4ACrb>x-Up_t(e$-$HFsbIy$3j_o2QR{n _>Q3Unf!hiR@Rpk4&n|8LR}sP?bE!!n%wjKH)_iJ z&b#>GE}W!;xa0eMNU7?-**{h7pMVN4hPjJ6@527)nrhr*5$_cB-?Z|(diE~7ck_Gn zOpSZ-arrVRZ+ uDu)TcxtPCkwMkyUV-txi{WZK%C_$UQ$AL|M*FRXVZjxdlUn> zD}QPEGKQ0Y>fCZ1q{$G+Co&w3JBswd`(%lu<@dvs|2*%Lji1>6`()!2llc2*HXZE~ zD@K;cc;5Ny({FLD6E_@{|8RAYEmq?{Gah{K76&_udyMz`w4GB*s;CV &=!;L{_$>0w z &qRX}y~x`A3>Ef8IE~zgy{M9Xawm(`ubF=i#|`YWUAm zzAt!2f%WNk%KG~T`igRJu68ecKl;1UDus{tZ=7%X!$o;C-Xge;mAIWn(RR=`-Men{ zKa`Z2PgHojvL2^CW(?Py>C *D|0pH4MvwQ5+|%L0QGIN!aZR>cd|wgZr6(<=;l z8nzklS$5gGyEEI>+SVwhE}(oZV_~SDLFvCDEqsuDAo^_f0ZVMOiQ3KqJ}SeznwgH3 ztDlJrW~T**<3Mzt j`nahqM7v5Gp=V7QFQ* $e9A z?0%Ca(tn `4}dsyNqdnOwd zy`?!&(j*3nQ~dE-!F{H<5jwpYeN&&cnCAjNmf5XVoxTzy6n#^oYWZrZy5*Kt)AFxJ zd|GbK_ieeo!ms7_5n=P^YM<7dYE|nOYN7RCSffFh>u`hQ784|w*7Bxt8*nxJd7H8G zej)B_wK{&*vrlClU9_WI#8?Jn9Xo?0*Eg%h2+?nFqgH6Ej<=jKrU{Yy=Hu~=ll<6b z(Wk9i#Mo8H?*M)<&K4FMYhrB{(@~w%CFV|e&RG+Cz^yj6)~bzNhi-Rge(B4CJN1&Q zTO}5BeAAtId&NVbc_wI|fiX a i@uWAuN zpB9e}T7CEe1gO_FT~hRV{B&C{icOT3x<&< z*oUw uhKtf6ItUWbs)VS8Mbo@3;9^BY2C(xx}4v3XTCUv zg+8;=H{v4rdPeods(tugs|qVPjxtr%(gP{6W>a){v}yTj>6!I-ZnA+VK35NH-4@Mm zq^elvPye~<>DN^Q8wUyl8{hxe>N5jXgBmB`xuqV^dgSTaJ=slb=hx%8@bt7j@2zE< zzr+(B!){n0KigCTx}0BkXMW5=PlO7gjg@G>h=nzd#Zxy^I*=;Hn6hWG10QSHjWwu$ zy1RSO&G{*qw`9!kk=-<(-A9De-;@ZLYZda;DAQn0eZV*1ojPIjO|>t0M&0_SP{}oz z^GgKgH}>zBszg9X&|i#Eg0?{W+6H4c=2{ds7(0WQ>mxNQ`yJb6Y`_zVb(rw?&Z@6g z`$jCTm7am!9eV@380E*xx**Ts7q{@`>ND-g`&!RjUju%wHpx8Hp_bg=szY1Pt0Pb* zxkNv a1j&7zZOF)9 zyQ^HvQ3bthuFE*_<6Y&2(|?+=>6KmOPd@gmj6HAfDleY@RL025yUK$M`$Mj)BU^_Z zoz&<{x(Vxk3G03Xa}lKyyPP7+++I_9AiBD=M@OknT1?3-!PKF?-!$zgOH9Z5T3ECx zImu#5fgEMyi5AsSbp-uYQ7>?Kgu@Gf7Uai3&h0-E^p+|XVu9{J-=V_Fun2=MUcp>( zy($#nV>B$dR;4b;ert{KqS_Ll%{2PjNLIEMb8$f(+ J zj7rn^BGceCLqGja@O@$m+x#!JU+a!dwR=*U*38ew6aCb*Jv*H!1E0MI9wk2ei1~G~ zTiuy!r%MN-#b{I3banu*Wd~1Vp#=pfcY&{H9X`QY(z=tb5QS|<>1b?Yo?1*7R;_;K z_KKO{s~O<0>EN?e@LLLGJGlk?w;8$uq_QSFn_;S&EP#ijoEb=O=~nxkzBXA`^ywIV zQP*()qAM{0&~t%k9|SxG;0p%c5b$d#^qgk%`B3KWNM~-)T%fbC%+Il2UC>9nCrhr* z70l&|nHfhq )(! zu#ug9l6#r}o-?w{ykN;4hc&%2h`F`ZSE|J7j;gCck~^*1zJCJj!Ym&aENb63io?zr znGkIf#8^`-c(NTl8Fh>$zO04~M!q@8Y&r&ca6ld`ps@w=a18Pgjqid+73F|jY=B(I zX;FyU0QqQve0b6h$VnXJ#FN%SUg$eRU9wZL{~_wdY8JwfHxPO>K#VhWMxQZu)-o3p zvS1hNCMIQ><_$KRIzuJ*70mS%v-Y`;ROW`y8HRWJHh-iF?`r?DJJX?cx?+9CKgVkF z4s5T^I}jnTv2je>sH$-sVCHBOI~i@-QSE?_5pA;Ido=1Xv&F>bSWFVeDM%KR2p_^e z*Yf{;E*R{AAU P}o_jF_el zE{{fkI@xY(^{TV+2Sl_X+bckZiRZ6DjyIrfw}q8$gzlm|QHaxZYgyTFAC@^yh$ JUh2G&)XSm53C2Q2V{{u15+Yj49u?IJ5K~%cGy)Z zvN;gmU=Z7F3uL=XM~dJ#QD7l?pLLIAkiYYO^W#W&kW7(mk&JbuO70t}Gaz4*tLyhO zTk ^&hgYV%Z`yS+HeV32b%~;vo zaFz+3;?l!b=FPZY_LanrkEUag{D2Y8WfahmIy+_f^cxg$Q-r#h=qFuFiKo>*`Ns zkm(m;bFZuY;sfB*>_J=7TbrS?D&WiPgH9a>9nSuxnm=&wu8c#0nt6koc4eFgR2$+= zq(9z *rJO>0hw6e(HifZ&KPM!wc0_`yE3ABJ!B1pF53(+)@v2ou)Q)IpM?Y zfj>ML{$NeDyDC*3kiKH2E~55+R(1mGMq|iP$CzG#KTuS%>gknalUQWqPE};14|w8R zbwFzfpaD-X9$!3ucq%l9r|iR1ac)fUmUCl^E1s^OzXi{Li?0_CytuFUt@_^ }r(c%2%_opD;F7CrYlXOqZS(%!1QaX(Bdi zj~lT!3)5lEKl!87(kP&=pwp+V5<)i$%yk0kIl*jUEo5*mwF$;Lz)o!xHX5z7;Xl2< z&1ij;m8GG5+M!0{akL>j_E*T_)d -W6stXIoXsQ`_)xC}?%51Bt2!zK zKD%BVqDvRGe%KGGLZgxenLlm7hd4)Al%Ofg0>4T~W4nm7Z&~~O+l=?})jfWCUwf{a zqS*7h@>BcIkLLMS@ceL$C3d9{8U _jCnZ9z>nN6!!pDBX9-2;2n z40{tWE4uMB*!*kYr|W95^^hRFVG+%y^MEOUG1yb$H-O%tePajUH9_C_HvE40S2wm} z&1fG0x!8;iH1?{xF5(&Tm9I_y9dv>K-JpUWqJ|%$fzI%O?(l^U@q;cA;fH8jZl|g? zcc%uN{#?yAFO6pIj{#k&lIztUO0M7CFS&O|K{p&{?w2P_kJ~*tHLm56v^X7nf;9N3 z^t7r6-kJjak^3}rA7t#tmwwxf@tFU|d^Q>jb_gz7|DoE4YOb95xe>4OmVKh$V2p!a zcB~d$vn?OMA7^DrNN@Q2`KnmRc!QtVNIJ;zF4i1-G!b<~%lk$x<}G$A_B_=qpGK^p z$)J+lOf~JjE1(yAaw6|Ma|73A4~{V4C@dCS+prD-?1PAXpeTf;`vc#G@5A+(f-7$u z*)IHKlm8vMh@J-W6;X$5&I5QheX;t?6}5kBU%EDe-Wi}bPVhP5c$UF0f-lrhJ-Pg6 z-%~#Rd&) Q(3Ti$jYZn2C7}PA!^qZ@TvD$5l6vZl%2>MsmvSgl{z8oc}BI%ia1E? zQkJ>g#9HisVD6la%w78)b2mhPU@SZ@xi=h(ZOngHa;0HjhaZbSF(3MN0sPe~>Yx)M zzQ =o+XHldGSI^9_Y_2 zX71gO%#6!>kGW=HUzazNxpfAMsX?o4%p1tudidX^Z!`BTwV`z^cxcH}%>8(v;Hqh5 z?&Z%j_evA-7Yl1p8RNTC+38N~HS<1`+?Z>(EkzG`A8A@~RdUl_v-0g^*9CQ0YtGDM z*Jao@c`uSmyvABTej~Zfj@YEUUn90cc5+>^ zYc_Q3IOyGNfe{5aF;}%%L&sYZ=+w666-%;jzx;X0-L{xzHmtZ+RdpWxfwh|i8=sFg zm@OC^tyqVv*pE)ZT4-TkyFioUE#{t$J-}r6{dqAbjCogOUMZXVD9ij(t!uS`ABpbT zw*^<;+mbs 0Y1VN#{|2;PZmDf(zltaZ&1lT?i^? zj>Fu0^5K7t?X0;~B?=MgS1}gRa@<$|8n4uJRmI^u;nKYR@K>FKwi)x^liV1;yl2~> z(#E4KUl+O&`4}&7BYu#X_Xo^3{ACAlh(6jzE#gr+ic<-?begLlSWXy4trDXW@jV}M zA{`so*isX ?B>#$SVQ26V&Pp^;Wsp`Xs=QMPlD2ZvlVJZPca3o@2Nu@j0Tmz9(Ff4 z3j2rLR>{2t@`G4 2KT#$Y&^5@p@{&;F_oq!h0NeTLt(~@Nd!t|MXhq z6(a8w@@tV-1X_w=|MuW{8?w6x&pY|WNq^2S!YN5md QUw<{L329r6#&=C{DP#%)c)}WhlVwt$SXiw zeSA928|b*I*0+)`TvQHT1%G9INPAy4mh8e64d6?P46cFCL%P6$_4L?m@_!l;`;4-% zvI~emX`wF*z{mN}--QFgbAT9Ym*Zi{9i5o=)e-CkwMDC*E{IQV`2@P=;! #>{TT52P+vcNmga|i2S 77ogV?@2dCtYIJjf#CJwyEMHsjH7 zHX$z>GOG=5^hetk#IOSpV{lqVn4X$D!jyMhg6+Z@{unk)E5WWKu5qYsitRVfsoEh( zPhxH+9G=pw-ZDiLQg7{654dGp_wb%<-C{hUd$Ru2Hr1{R*<*XkIW-S5^bKO35%8gG z&q{9lyG*u0U+@^H?PnARifmnJlH4mWpJbm%KViQ}aqkcZ{09fd8V7xL(3d4%Rzvsj z`EP~{_RJIJJr?t{f$U!$Y<&%LT?u6_vV9KBUFZF*W!byb*MQba@FnTE8qjtD>yU#r z&&8T7Ng;oh+rv7xnbw48rZ(qMPo_&Un-rSEdh)c$qd8+f(jJ>{*dC^Bn`&!yP8A2k z7k*4|+txjTe8V2wTgcz&oN8bD@E*G=Xpe2Yg1ZLm?!j*xO?h{4=gDIgyKvguYpfQG z)n>fYZp9?57kIXEwd870MWm}BtIK{YxwBr jL++E@C~2zr1 #x$Y&%v<1xQB-^@M4N3e-|Y^~rSE#&;MWOwXf_?o^86u#NW`9?Kg=9_lVXa~Pn zK1O_^_#iUhfZsi7&l>gRbu-q-ZuF`LzIOP|XkoAkS@$V??M);6PZ#;IbOuYl>^#h^ zM;|YPjFT??q94E5TQ3t25znEWtOsPC0_~)q^RPCT)D6!P&YRHj-ni_L2U?5lKS+1! zc%sEKk3?fE=ql8ux|W-y7R1*!pHwl|ZuP^ru!oe-bmE|c$xhiJM+Z|?r*E&AjeYnm z?8hI%zI-P3=Q9w~n~s=XD)#Lu*uN(urgyxM_Vb{<2~W?NL-c?4#3HtI*U_2kckl6U z;w*I#Vk#7u`x<^K#VWSbzBpELk&SMQrt=3s`Mi}GB=^sw*;uDadV^xoUp%r6=cEH# zqam*}hezXK=PhjE(Rk)M>MKDGLR({_*|-6)XJ5cJe2g=S{fOtZ<9s7DQgYR-eqHyl z_-EtSqnK-_n(cF8KUED_tHOCF&OLUlrt`GHtsOWA5}|v)#yQ?sgBbirb?Y}c$D%$j z!lsaJ{|fQS%UF-EM@cT0j94_{yZO+i-Kc*FI3ht~L+ppfW6>WPXY1K`@Lrf3c&T0& z`~=boaj27z7)&c-Ft|U^RDgXs?eqPEq^AoVg-HRmn$V(SMM+z=0r9ZCo1=u#E(Raw zOT@*ZR PmfOn+js1ZLAyxD;7n{@$=X7nROzw@l6#(p3L zu^tP~qg3Xj&&Jeb9mv9WitWVISmZkamYV1TbY_NrHg6LQUCE#oe(dIhLSWY#_-_-x z?%qdzw|~{$tM3A&`}Uov|L^Vl4~PqruI}t-j ND4&KQ^buHj+=@f%CxgI2RQd;$M8uV({HF zUx@3;u`rywy gt!aP zMPFi1*N*u)zdkvR?2ku2z9d-yUz2QHlD`jXy?`@kZ`rscuzl^Q^MBIzOPq7HW8bFu zE(35zJGk{@b-3JLCuDy2AT}2A(CSSa(L!y=W{VogCt?(x0vm^)d7)dyXwr_*aN*? zz3S;}SkLR~Ae_(pV}5n54CAA7O(t4Q(fFPWsEWmd@iUyqn*kG50gVP#U?a}5WnM1; zuWv%!_ZpsBVX(~WXCbGZ(2u)8KlMv8>luR%dM*um?jp`==xzx35OEp*)@{&j66lv^ z+mdRbUnJ}^Ub*jt@kxy5Aolrx#Te+kCkSx}YNO~j&;i`4=#$Tyq02n9$Cyt%8(ouq zz(apDbec?mO^mGDEYNKSxo)HLo{xkeneKC-o9H6GuZO%IguX}zO|&;^R%Q2`zg|@j zh(8$3%IGdiBMUoGyN2Dk0NptN6Iu mbXnlhPts{Hu+xi^tlh)H!T@wvpAoxxsQ#tf!{nf zzAw&E+;-BPn#-e@dlLBSDEzi#Ax;;={_?ml_S4u;QhbeKrdL1uWk&wrca|p;FXK%6 zMfjTn>X9C&^X_5L{a?bzpggkqR3`vy*$#U_dWQ7GQRo(;UA(?4qXGUC>5xUx0XE1$ z71srb&&j%AKIkL;(}DI3y5(c&p55T1&f$o?V!zkvr^M(#j$v^h7cf`H>%!)puM4N! zp?k?ky?}NX;n&c<-Q!z#l}N5HUzi`)?l*4)J8Su|YN-&UhOIW^I|Dq3*iY9q=DHB- zoO){vbFaaezKLS+O(R-gNquzxm73u4tKgZh)f zz|u5D)t#g1L-=SX)17#08x+!qO09Vz|>lYx0%scNu&9E(hl4$_mNViheNX z>2a%Y_YZPPv6|V4ZB9Y_?1w^RI`Kjh_FHGs=O4gd+td*S`QWEn!#^-m9Jw35GR*u9YMytLm{YzE=`c#PuHcY>Co7=s)~K|6}2&^+{QcLBa0(c|5=J=>d>NQD;I z3lA-`F*d}e l#WlcX$9D#MW8-*ZgJ6rn=Qj8wbpO&LpWgdSB~RfW zn#)U|VLR^c>|j1o%#dI*i!4fQfG))yvRUyPGIpo#DpzqmAZA9JE SmcoGt-#elIlfx~hgCVSp>SjTAkd27$XZ`y67=3+<2KWn~eA_*U z@PHY@v}LQGz6zZ{zAMEaQ*h@grRj 98#+u`#A- p&^r;)C}yu XEHxhIoOAm*m$e81C#GS~YQ?#4QKaJkAMs^lUxw|W^Kb %bXH*fW~3Q+R-@7 zYmvq{nlTPD=rA8f8sjk2xTrp4oW{|Nao8vg*`{%rk*0B&b;>xJ`8dph?2YpnM;GX) z*Z`eV6@lLnvv9?(5+k&*?|DK%*CF^Kv7)w7OvauWK9`yJ5d0^C|KhlhWe1Hv!Z
#8*rC9;b=nR4fxFGaVBAgPGh($ zoCtqd-us~)?Ul(FJ_z5=jyaeDJn-S)O$Q!Y1Lcl|0KYpBemCJ!{BFEca=-xJ+JlGo z`|=$N;EKZe1nn#1fNLbi{5HlM1p3=C<~EG^ZH)Jt*O&{cQ_mD#S#hQXaeTV-m%i%d z=k#IvMp|PVWRT>q0OwffL-s90fp-M(1>$J~&Sv1;1AK(nGau=|84n!8IW9U6CtQ+@ z3+upft>rP*-F4Qx;!VlW1qUI=w^tmJ?@>e7_KGDPp5+xwN>!ik8t#KTBfjuq{h${_ z=m#zIgbw;b4 ^@CTdP6 I} zyi!>7LfUxTmG*5thBG}Y_ElftKIxVF;e#R0WDjMTA6G?<`8XZ+HAawqzALpXZUSs- z#}T&q(imYg{&o`gM+Uauhy45T`~q|TYV|8Ubl@J%LJQ(AmT!{JX!7kz(*#Yy(6(*H z#KUWhYgn+}f;$FO7Alv8qOAVEy=<%pr%LH>sN7!;XbCM?)3(KEhhH3)W=~RqcAPhc zP=4a!dgD;sYcZsiC23XK^lg~GIM9s0A2IeF%<*-#HvXEUG>OhagAnWM5P}PYSmwgt zxysZ-pAOfuF%PU#FGB2OVS(kOaT@j;af!H_70$-`Vh`^(1#vw1avj*SoQK_^bFNF+ zPv2fK2mFu@zDNUq%m$y#g8g_1_G2bumotjGQ`Pca>31-1h-;mGTQD?QRDz!R-ix?I z8TcV_bWp@=AG}s|+EJF2h;vm73r?qUS_|wCPg6U{@`Phwb&sQXLT4x&OM6<;^5L`K z`-Pu_4pH#Smj Wx23c=;6{@AbJ&UhVca~)(0`b6F<>XMj?`q_y&pM@CCAo$zfeAXY2UB*7- zW6TrzG@WN2io1flDDCTK_UtFLd_SQB+&G?voG2f%=p@Fq34V4#+)1Ne(CZ6UHR@jB zdH%@r$Jy{U>>mnFZ&J?Rg+`+lF%1!S9j@Y@D(;@7i>qeoMR`9U7R-9Bf&6o~5%(Q_ zC>YZz<`h3%a{WNirjHv=vC`01hi+gaVz4*9!5N%8U2<9ZK0(sPn(iO|zLCb=j;8~A zDvHS|`-DNQmmqhS;G^HVpW;p7t)G9}{qxR2$t~1(r1_{ZPu?>O=-D%D^V&0*fm JN 6_Y|L7R4r=}x~!d4I6Y zYk%Mwld?BJ-+WAji^f9z!w>s8-tlqMI7E!&3g!!E67dg!7KXKm2mHU0h2)hK=T^>Y z2p`>R?SgLZ#9jNNxNF}EevJpeYQe8vsP_r@GtQ!m7_llWbUW_B+rgKRQ`t^x!Ixq$ z*%W1dqj~*zWRuPm{@eUJ$X*QYe56MxKAs*h9e1F5{JUd{e@F60zR@iBcskhTJ+Niu z;}!dilzqGspHZ@pmtfF0Ci?3evwWhT8!qZ)9}jm>W!rAXo#hxuzU}p=T z>>Gi1GHn{^4VwdL?&H}+l; +KfdBb~rJ@Z=Y0hW)n z$JaZIatG4f*CSs@qWav|Gh;7jqcr#R%sLtm(iji yfYO@zLh?@%3hT zd_D5l;QPcS|G)9|D7IJtKDY)yBB8oi_Vo-sz8-uuyc =wAk&2avaEz$V<$(&*Dh_(!A#oHROMi?C-{hh>tS #^Uaclao_*@1`7 zcrWntje#o-p>)1Y_Pc!oVqDmh3-Dq8h +qGxJ+qN@^P3X0n$n+>Supkn#%LcT$q8=N6Oodo7`Z=x&L*HQqmO~9j5q-}_ zUNpWR@xuEWXgG%P#bSIL;lISgKP3Ikwm(wy4g8jP+&_z(5fT!Icg*6Z8W!o;?hM5I z<#(PXyz@-<33sh-3)8pDe+DfY-`VsXc*j{2q{92n65f6GymO8BfqK3B+=6$nDbMrn zv+zs8(Uj4G_pf7+Z^66NmiiY0Ex pRpBZXPbBh`2pI|gmp^cP0PX#5G!$auWx;dvjs0PkaW;eBj7`XSu(E_Nf{#iq1} z9{w)&C_UcA_D9 cK`A3F_w>GA&f>=9aeH#`*Yd(b_87v0e$Iot&KyQ Wrxj5oXkLH7N|cSG1yMEIle(9>PerN14Oxxqbin8eZ;B< zre9GFOpn7INqTpFjqiqZ_XNpBavP0zg@|6dQ%!vyof)!dAb5!G77}04oNU7THk}wB z?jr}sp#28y4X&yp)6 {G~A&vgyH3xM}`=H2l_t zhKH0so`Y_>f_U+4z;3+nhQBwNNn=fioOSM!T14!d%+=KgL}9Sr@ Gbd``bZKr-42 zIiz$l{|y3?Ly|omWU&>pn1V7({SH|UsSV*u?jwiZvKI|`i>}`x%OJ@wbi+sseg`2R zGDm%<5 b?;Bq*J;0S+x z0qXce7V{Hz5owUcL!7T^O$t5-e-Uqova%G|2wJzvD98J$8J_hcUd0)k92Zt;H1k>! z8-5u+3&pRqH`nf&@r&9$I}xjX3s3IJ=y~h# ;`u4qhfv%J@}5cb5FKlY4#dzscR(b(KY3LhfOtCXW3;Ww zh@)HnVJ^<1xH@1A?)0W2hMxSl?epwBmfpc>adzRJ4v(dKXehv0{L46tw}D^4C-OT| z(ARHx-jPZLP4w *(#T6o3aBu=ge3MNj)v=%b^!$K%oADVPV+T|5qzLB3EF{EMHdwi)lGN9eu_ z>5DYnJJ+j8Kg8>F>O1=3YWMmO;w1-kjxB|KlmDR*hxcS$_d0X;oVQbd$($a#6Zv0Q zbI{f+zPUD|C%)M$U*+h@M-$~E0AO4U_l(%*-QC^S`9t5SMt809(06+U|9yV*5<7k( zH)oO=f6<}5(mZ9VIkz~6jrswKD@HBD|D&dtWG^eqEv~E>^^l`-jy-GCeEgBdMS1vH z^id<}7l5ipI7%u;WG! {d5HU4<_`JU!0XfZTc<4um3+d zwZBI5%nzFT%cmbt%E|2)m-4sP`bSq*OfxWg+<2NJCJ2H`tyX&;ruGj?7&B#B+mVy+ zT>t!=ZkliU(0tQ}=AQEKKBxS_`HozMcZB79oR7$Lus@JLIE$6*`U4UU>=78X3B*Hq z;NvlBi}N$N9c&9D985YsBVtZ>#@feT&)QL7TXwDufAkn11bSG)GgxDMQc~N_jY9^} zlI5Q;^rt_2Y3G;k*S>LP-~6w?`1IpxBc=
hUEVOO^v{-<=^^Vk8Iqq? Mv8&BnJvA?$XWUwZ8@dFR|tUnx~5>Pmdh1rEz+?vIAr;nK}-hvxY(;s-^QMq$rF=Ge; zsMbiqW@m=P8sFRztEax$z%?@l4|LA3n}KjI10_Dqu|SCuRpX50fkZgdY(#$`H(0d> zZR;9x&CR0W!vxi9VRn1OO!L~5_R^$(B&^-LC3)BDFScdrY~gG6UKSfxycoBm{#cN6 z$*m`@q`V_jsc%!!aP_I^=*@BOhAljNG4$}LIfJr55&ERu^Jd4!So=SBE=_*Px^-j@ zWo0F9GSiGL#1C7I0i#9~#@r$v6RxXSpmQ1 kAsro;Bg_k>$dSi}7)7q72wUcc;?50F&vM?*j7R=*l?ec9sm &u$gKi;%{ykUJ!f?q|fUv*wx^(? YcpLpN22tmJ@P~3OHpqnM>zxP4eZ6e!eEU} zm?i8UZ~ilTfW@)@^xa`*8E2(%A4wOn;{wg7Ut5@S5&MSSQcJ3@%zK}(tJi2)RG~RU zSUkRS-9M>{+NN_xu~PPpU>1z0{ML+M$>Ey%iAPhD_N7kTCrmkzI%&Up>Xy1G?6d2E zpPlmkWI ng043OepVV-bSkhz3hHF1>ZbfHbt2PDIeKJr127z# zaw;`x(~(K+;C1~4XJA)C(9OMp2c^IcbI_M)$PAxLK^+N!U8j7nn}e=NL6;H&Z(a}l z=PBRw3xY1&0xy|^iV}jZGzVQ`?SceUM~_V0qMo|%P*Pj!R7SnG1ztMk+fnMrl7oQr z;{|~?Px)R3ky6kXW?&0yGuEe0JgJU&WzEF4)QI}JDf{ZCwhKs3-g0E}e&h>NFuJX& zlMmEQ-h0S+Qa!1@E)rkPs!jFO>cLH^l;3$IsZ+go&0^*Z8*lJuwunvlu~|af_{hN0 z>#FcAIgf44d8`n>>tTK(AoM1m*tR&fTAtWt>}Ik}-{u<~!X7+(%J?po2RSu)|1;J1 zo@(J2D$d@2li9m+@0#8IH2LodO^1EY?Ee;XSo=RJ;$A93Gaf49(D>gFt3|PCtX) eL1_%%s_RqBl7qf z(}%Xm_U$Go^$t~^S68}U?F62t^-#q%dFl!f*}NX)m2dU41svWUc^SH~4NU@|nLj*a zx=xyN$Z IzHGA2MEHh$LF$*CMG^xOW=hLBVokkmZ#ocN{@MS2&Q>2ToUk|*}9(Z#> z;6K@ZXqeQ9y{QxH>n5`L$p=y+pdRbhQ`(?Zk4)T`Jh@&ywOK6%{c{2In}HOdnJ{pb z$i6u|YLj}>D@UfBIx^`S6_8B%2WeyJqfh?7Y&kN8 z6&M1cIScptUS>f>2595Je>we-{A@wswe~=KxsK7<0zZXCX!9*d2 psLDX4 zUnK;7iez)ph323(-=Y2?T#&PxmAMrL*ZC}F8LTxx9GuXmYEmsIG9PaiX4%zt-#{3z zhA~x`+tOx%R4Y5`8x!CQ4EDP1zCKupy@wX7)o6ZJ+Pj7p;_rENcQN_8|6%fbGr4Vl zGHKMpgmdi-96sJqO0&AALG26U)exD)SL8BNVMUVtf@wu2HPM8hJ*2^eUkHq) zLgkQr8PhkYk-&1^yC7MTPUfZxc+BNze9038`g3wc_{n|60Wm`&4)=Wg8Dik z>s|^|)@UC5ZP_jKvDevk!d_Onw`1ZHvM6~wjXq0`tkJa{(%V?WVc+NhO4}C$o`}~Z zON9v!cTfXAv+BhF-{Bf~p-cB3%JUJ-KJEVFBYzDy)u1`#dwzfh$)S6ZWWP){7$Tlt zY=HQ`Z5A5>);(aBTdn!U6O3A|W!iVyhi#|UvL;ojZ?dFuup(Q&1-@2NompBtwrzaE z@5~AwbF$GEvGs?df~v_JV6&_1^eRc$HdrHsyeK?Sm{gw3W?96w0UPjRW1x+Q$sXkE z40Db-+jc!g>B6aTIQ=5F{+N>lJlAch=kr_V;qW1uuz+<* z =y2VD zP@^{BB};&A++y{Kug}{2?=uv&`v#2{o~id6zUgYffdrd6siAIk6Y8rc?N-CZopMw? zb*tf%Lz<3|`x2hMZhK }w_6>3TNcK0}KcBbD&w*ra-lusrA$hCMV_VICTRUQop;#Dn zUswy%yPN|;H)cA0{-bT9RzG~o9~XGqHe}kK@Ow^rQ8j#@YJ7706F;UNM_p7sJjbwF zh(z0V-D`5&>rX63+Zplu*N(KkS#KFozcgjD?oZA7#ffVSpi|mQ(;lKwa_u=F8BRzR zFWx?2?_tpos~|<*7mG3S3CTz%nqSe*j2AHw@Iosbm*soali 1ix}6KS8hLywo08VfIT4 z5`#lh)@=$47RIJ*{pCxCU!FAT#K*6Gb>M;8;EyiU{PB~Q-m(5=?5_q7Jox Y_%#A+3)GF?WQlwlu?b`#e#XuwKl)bUrqmGS z$E-DoI!%s!Tk@@#1*G`rYy)b)VZQ4U8+z9nd+X_r$aUU$ew7kFR6WUGkV9CKjp#}7 zOC9{K1<@=Ky{YgEB15)JPB_^dc!V(tIR;GmC(SnxCHa>3>dq(RXJcMDV)iEKxrC>- zdy^fWapTW7se&ZqmRNXO)723VXhnwpl}{U6m$@@}wo*aK@=bX0_>)Uim@Frn67dO6 z%TKEl5H8a&jT1Rc;}rZ`E~;Dc>J+Atrp?U!ZL@|&|J4UYRD(V?mfAX~1=AOZ?kQJf z>hO%s+Mf!7Q%>POB1t#@S^NedVUa&FN&hS*+y L$uv#cNv~;>mPuNmKq=D;v|ODeZ7CNqXvK1qNoh;LQbM^^tddKc1}G2^ zOI6fVQOglE2x3vhOk1!@<&7MUr)rfHil=zcQ<39AUygojPYe2<@BN Hr(%p)^yab}q za39=tw=4g2Vs{v2hpB@EfpUZrPyN#aC4z)qOhP4o_V@p*#A^?w$T_S|6hVJbQ)JGL zuw%FGCP7m?xbj{Z5rAhL{=hSi&wOM&gTYRgkq=b<{ikyvEBo-nKr$-P^!nld$m;5v zG7E^+{|~W&UGG6t{EysD9^C(*6_dQTDiVf0wEmq!y}gV@17XWdIBJ|V@INcLMVFwS z?`=ZtFkxO2V+@Ni8TU&I3Nb}1qj-r^wD}ZhwF)U%A0t)d_;`iIXHmR5q{#Gn6~#VA z=J7pTJ8ROpYuDb xgFXO@roJGa0a zNxbB$?*I8z`m3*As`gGjSaIN^Y2KyjO3>${=D+hFnWWu2`@l8pipW=%{zvU&wzz6% zdXH43)R+E8Ucpme|MX9Oe-Xtn49D~Qo&Sv9j=SY83D1uTS-)9z>(O7g-QO1X{C}OR z+4{?O PVcvc z)ARnFJNm+B%T|`Y>3C%JsiVYU)O$x^j&{O#Hf7g!_3J8P@R=TSUVUeiNhE4Fw5(Tx zjrtuOanl}=tu!Tf2uZ-qR w5J`9oFOub~|DQgFt0UXPiRT`}Cfnn9aQW zu}XPvC2$k+TstBrY&=lF^3AtoknI+G;|gGtH9$`^KHB0)N6cv`;-7(t>#Vf28+hJU zU61&;L=auj_IoeQYH^^O}KmoeFk1{B7^d+i%YEfT7+w2@1XKoPJR{-QTJFaCM`t zq_M{4+E|I0k&T+hjlRZ&^AALRj{%7gG2o530(2@90W57cla|ycAgcO;UI!FUUkJFB zq;K)$3eCbizj@k0*YqAs>d1rejlllYwk(`~(;JCeAbCyl$5!2-9+4(b;6SG9dh|&{ zR oN! zE*OC@itp`D`Wh-wlrY`znt9v>97J9dkh7gL+J&jW7hjal=qWnBo{~eY){As}!k1?w zuJe)Kg%CRolmyVhKUpHG>4+;VVkmwLkwCQ!SR!t*DVMKXbsdhR-v0RO`lN64NnQFR z=)pn#s0!veU|wdnOMw}g+Ea20dLJGZX!@;1$d{0C?r#zQU?clO5!X18Xl6Tc>4r8r zJj;p}7%HfR5kJ-9s5edxbwbn4gr4f*x_sc7NJ0( vqzZ_R+Cl4q&S-P?)^01N2is| z$jmbB_Ud2CGiFP6?$hnk#@tsn6@ta$G)&k7`SX}X;EIJ`g4+VW6$QT}48MeDnPX<= zmv1hw+O%b(wG@8p68$*mMB6&}U8eFHBmB&GIkU3LTD^+dJbWjUnVZ38uuPhmIx#bs zg|m#z?2O6d#9w_{x3+q {a#qmFb^9a)ML2##uE z(qD$umJZ6a5faqno0$B=tdl+r3CB^w1W0%t5>7(GO_Y!h2}dE}BS^>zhlGic@HQlT zj`BbW8IW)i60UW`IJJX9Ob7f?N@I(&mCd$Kz*w8y=~aKGG%qU2CeA92S)KM?$COT6 zAN&DZ!S@NBmaXhbs?1h?0)JA^Cs#h^{|f(5&a>vr*Bxi&x>2=tb~3x}9J=rw{*L^s zq}sZn?{Lj^qvpCpb6wC3;R!>=gds=5O(EfyF|miejgP9!R&MjlOWDpLR1Twf(f0{^ zTS&HLQ{KsD`V;oLkPIbmvB|$szHnUrMRHYL;5)}V@-=>WrCZpVvD;cu%|MQ>ycd_OMvNA-*CHnBGUe_D#c#_YdZO2!gbZG72N$n185dPsw z@DDBxAN%UHkPfHaMZ7bsbmg%}HmrUu<+YU)He{|0pZ=`& z5r4CQnvWbn%3kz&`RxwmXGE(|Z6jz (&POZy zJ1DwDgRQ#mVZ~_`@JQs*1Knef2=@#tFxh|Qfx7C2MX3|i=XB84u$Fd9A^Zx1O-aM? z1o9qWo2MUy#R}MLAdt;@UU*G2#Dp*y273>&XkuPE!odiT9oOJ(_>TQ>1Uifz#;+3y zTM%9ARGs0;V@jjCO}*W|SYq`VZZt3nb+|DsjcV$5`_vT)9zA#2?&x<1FxO(YiMm)4 z2&5Y`gGYHgXX~_?LoGtOYd!IEepfvGirpC)k`Zfs3|md{?fUNe#pG4Wt&Iv-RV2`( z1FuOOO2g%FY8hwbZ%ItK7Fv@_WcJY>JoB74O-OfSS>C#3G?7$-?g`#T1DvFwj!Vgu zfNNr>;olw2R>cs1&LXSzmk&v1^k&(Oz_yDYD>IC^qY2~h&z*K}&sF=4wWo7uVYyU| z1Jez+4}3xU49h9t_;{LELd2x)$x7om=jG$z;!68Vz<%Smd)hc|?mzG~#S9}N;*;rw zbb!d92b@HP?S`Zvqc-G}XYzbVQuyhRE4rQYhU?lxbCogb048;Wvt7P0hceNIpBX6^ zjk!DJs>O1{p;s0cVnw-$Y%^wD8OBf!CZ~C5#>z1GeSzQZIfZyWw%PyQzkmBp`2Hv0 z{8onDethU(naxALZG(T1M+$jXQ_pCYT@9q(Is7J+mPY99jt!Cx${t?6L23Mf_t^uw zPV-ekXXfU_E4LUoYKjtULQ4F6n^3RGXKltq8jZn@lahFTs+(?+kWo~VUdh`{v_vP4 zsUorNg<{(xJP%{aR}^O9o46^D&ANAZT%qxV#+579ls5=1cG}@DR-x1O`hUi6pWaxU!6+7IJysXN>Ig!P<{jLHL9^szD+=7jHP;$E?x(AXVr zr()vsLM)9fWS*V*!kCo=Lpg8FZvPZ6i}Mi;;RzJ9+x=`qY<}LLW8D4@g;95tZ(t*~ z!nM3^R$m~sf;~sGj&)3aH77XvpvS(Bv220EGJ0>SA#1on9~?iw)n`nVRIaAp zH>lZpjIucYs^61u7xa=eogqX~2ibY7vN)&7GEN$+o=5GuOi^Z-k;}Y7IsWodTG_!7 zLtyd_O(rJ#eEO^simYHHovK1Rv{rr8fO@aa;B?TCf=~1c>C*d&v4 XyVgj))=7?lm%}?RG^M z+)qjEXVdI(e-Q3>?SuQv8CbT@`IY#`j&T9Fz@yW^a3`Y}q2WF@t5F|^6 >UzJQR!L0R;x;z`Qv_ajN3QC- M-%dD~VJaM! JSLqY4^oHX)ho JA(c={Lq z>Cr4X4QmZGIvBThi~`n?-D%z94abOXuE0#rCRD}wYi#L3PKJ>m&gZ1D*oITY{w`An zEfXY>9B7Hp7;y}D%U*?H;#VkSj{az6-NHzv%(31KI>0fC`m<^qL!^*0+Q~EWG D!rcpAnfmSp z Z&u4QPs z)sN}sn}x;B=#9qA!3Jm;A_p4AsH#tmv#q8BI`hQ5+{|vew_{RI6bp0hV0!EZ t?Y|GM`am ;g z$xk?$FLFmhjx=`X%(Sv#Pt*))Y~Y6GJSX$daA#YNrtj(Z(wf<%1Lp6iaWH@NN>D{H z)ehNmH2sF;mF&48PT*uAx$1_p7<(ef{Flu&?zjXB$uDC2n20L~c3g;o#;kzn5ABj~ zyWUuIbE9kO!ThOcNO7L+*i|b98r$iZa}b71jW}d%iS_e{)T4MNjAwvxf7H?a6zFIR z($U}zf~mTh_H;BGBhg$QLi(EAh^DGH0#B|=_(Bi!+BF@`YmfX|{0ZfMqj@ciLc*SU zB4R1|q_+c>F!5t$Fl-&1L=#KJd7K8R2vfaPGY(DR#*Q?9R@w_rG=qOf90*HDl(0s6 z*AjdVpKhR>e7c0Hx28K83IZODbbVb4c2kS{0#ra_-2Tk 1NTv=X<(G8@FcYmDzolEc zp=gGu=zC*+R;1y@{8WisyKf`sGWT+g+PE#8tDjtGle3y?jjR>`B|@D0oGIG2k|F)z zQ%&iZAgIu+tsh?7PrEI;n4Ekv+-RU2pSqZ#i9|7 c6*Fy z8g?7!5eey)?Rs98(^Ag3nFjlEb=Sxgbu1 (1)8C~o=3#?h=oI+Tp<>-FO9ZocKI0yZ9JVv7KW(;X^w33--z)I$x#B_JU zI^2_``EXoWl)B4>5p{TfvP2 x8gQwM$AF*&^2^T2iaY%(K&kD+k-7|NX)c^ZNyQkHOxkjC)KmPe)3qWx=Rt zjQpyweNZiK=t?`6JRo`0d(F-9js5PKl;;{bi*|OpIDbU15uOg8D0x?o{V=)St{aAV z!jfgA`UhEkN=tcQ|6{Nm+%x1_!Z%yj=UaWHPiu-7lH;2j@vw4V>2}Scg>9O8Wt^iw zb6Eh5P~s7MSeq56pTB{0*YUOmF3+QA-Djg<-RCC?+?kr3&$28>i+8oBk3H0|%o}Gj zE*Z3$E%7}275k`=@X~rs(J;)^heMo%5B6GqBPHEhXB~`I@|CbkEtHsfj+vRB`5_iB z)G4!w_4@c@M36gU$oel*ReTG7b4F~ArC)yfMsbj9NNPE^!5H5o^DU?1?OXKA0%4x# zy@NJa01E75Zpt(V4cEtYl$s5+Eqp})(xaiGv{6u>*_})n$q$mMsb3Astdg#D$EKE@ zgR)5-$CRJt#JzgP1J8RBC;zO<$|8;_;~tFr>sM|_YDY=tU68bBQ=FVU*$OLMH7wYj z_7q{4aVA$K4>6KAWZL|EE`Ez5A<(S<_L@LKFj?P#A1<(?R zp0h6(Jh&5SU!EWTia+X4j^txRFZW^TGIxO?Y+qM3YF`^X&N*+aVC!5uAOj^|Y4VFY z8dN9f=ybr*(s)qE{o$aaInpt%D#4=HG)#0&Kq}bYfb{j-NCoTTMY|3r oMIEk(G|=H`+vldaB(u^QO2_SU7PL9`6{K~zB&syf-8rDU zi;V(k^?N{t+a;o+9n3{q*8?yNv~C+ 7U`CX6?wMmqnVI|m<#X?>8^H51argZIU> zi%1To4Ie-qke DK-!psYxUNae18`^wT! zWR!d(QC5U`p?Y}(0q*70YM>ly&oiz9pDQXCpls19uVAn&*{;=8Q-8|t=G8?6YlrP1 zryGLd6`WAYvmT6Gg-P-b;#5ymnl$!PP3ndq6uja_ b@xDhNQ zx?6@~5AW%Qxe=aE?hK>=R0FFS3{=NFOxmex%%Bs}B`<)lE>W(5Vo_M~Hl#UH!k}ex zxa+N&wvt}#)5cO?sa4iBYDd3&Mo`AKl-qW2e`hTC8u?zTok`jVK63Zlnlh@#m{bwg z;@DC2Q1e2b9Dg0lZJvd`xsh*sZu1m$9vJz?W;E|kX!A>dD4BLPo?g%o-OOYZ1yoVC zD}-?YJwVJ}P+Qh+Y?GI^8~t*FZ0R9>=LRBgw!NRsALZ#M%SL%(s`ff3o{tKp<8JN2 zZGgIUUgmy(f#O8oefA%T0L!Z=c(9K#=!?WL?GC%zC4t4F-PK1`Tlp?=E&QI(bv~P> z$xK5l$MnHne7i&S1-hXrm8%Pcp@#Vhhg0~u-)h^= jYyHxWz*BfPtAyUf^r zOGUMFl=8BP$cS`4J=zQHr-zmvD$PVl+WBL*Ra!d9i8Jq)G+B3#Zp*j6D_6*FV!$0J z f>BRYPheAl6DkiZo!ZPqG3SEa_%h3fYJlgxYD6 zu{HO{&+M}+Hd EU{jAI3T;d7wqE|J|W%wj;vE9Spk-^`9nC8uJ9Vkoh_pW$+>X{)n$dzt@noV zC=ZTdqd*@F+oRGb(3RFO(3OnLhwM?{9Q;N`vD7_{0wXn`Knk=9VOZ%@q!WweVY(B_ zpOFGJiWs)19_hpvkWOUd1W=$C4J;_orNk@#a@)>8%n9YA>Xwe?)*J~aP+uXBXfW|( zWx($TN72Op!u9a8%$t72u!l|=BXVQv6O_4BL&8CNFx_k+JUxO6sgDN@YTxV;GN)VT z%wzz-gjIyOVFV}DuMGse_zF$~faZ#Gw%=2YNmonRlCnTNy$_hfcHh3~63rB5KaWMI zOMC5UPCPKi1^SDTzyK+w*e`gP;67wk(oU5JALa(r5R#8YOGh}e#6@oK(3IY+ddC1V zhT&snFl;f9R?$Q&jhxZ2*HOgpj;yrRyKejz*(TWmuIOT;YX86UhxL6q;e+T13FpX^ zfU>@=O~C-Je;}SjDXH8z93gL50fyvv4 Cx6{q>*{JK zzrHel5p~%opHROZNHSvTpmAJF$BtHn%NJ4KU=b7QAv!x&GOeXkVMr3e`WauuR*Pan z{idKx)j8_A@g03$qY9r^rMYE~Jg$2F#B&`do|C-uoavqCobWHP>Qy`W<+vllX2qq= zihlod9q!p*F0g*N!13jR)-M+baBS9AemSn{%W<~8>9t>uYXiwj5Q7_s*8c;8dp-ES zBFg;FNwih3THy3J2vmRonH6l`5<2m~;E4x@PCQ_7eHRntr#DRQUC{sK0=@3U0~n-q z@Y7|Py$f(GTkZ2VNyhc$*Mp1a5F2ex2iJbK`o-Zy`*0$zIG5&iu47K&=@yLXRILrx z3meUohD>Z9CtnVBN1H=VcB)DP;T1NMZxyk%z_+TT&g@S}FYO8xNohhlXY3lQX#?*H z*HpK;vN6{+awF}$>GIr4l*CwqpoRyWQ}ZryjBFz;d08IMOZsI1$cZ(a(Ol-ImHX&+ zdt}DRf`jxja<3+n0aYc<8r=T0hq=6SA+u`u4llB$g{0x^B*pE(UQ^T@Z%Mu-)k)ik zdVNbdMPxHCizL|`Y8f4Vz?fQLa1Kr`v^MiYDxxMYOc9sj^5i9UBoVtEbelw6n=^VF z&M}75c3*^$F0dB$_J%;Tz!l`jIpe@ucKc-6YGar7B{o`}e<~B&?*BRg7WH*58Z3D_ zl7Qnk?C97VL9kWaDbp+(jPX;>d0_54rX#~VU_z$9V-}6Ic9z~Eo#}ldTZZmDCg#G4 zxg4iaF1`pUq`&=#;}aa1`1uwEN`J?XWc*N4bY}j0YDK5&P#~@X*4a9#HNLJxO%F0E z9j;eh3}n*zk|ei^dXcgByPsskkV(erp-pTh;rZJi#qdiU-S~FkDStSP8j23T#M!pD zw^R?gHVrkv9f3x+rP|gwHt@KwA-df@syCOOE16U$6;g*fa_I%76YHe-=pn;WgJFA= zdd^rwLP6>#gP} Py15 zag}3`v1&4m(4=#zWtO jlEJuqinqiu(0koR4h-_71Xwtv`-s2Bm4KOzftfvel(6`q+Ph9aSfH`^ zH5w&@_;ZFL|MGaM;BnxPaq+*@r_PKV{-pMwNjHL_<2k2ijwwIB97T`_6taF($oYO= z>2}1N$KN`m%B2NR CLx$ znhs)M$%-UTa61+`hRE_z `FHWypuVNLq~RF-ingkC ziaUDO;@)dy{}do3v)MhsKv>R8Rj+6_r&KmxbNh1Li`}!s?^hWv!|(K|#R*SXjX50F zzz`Y!J=#nb11vNCKIg4~FNfosvBb6#LwDWtjvbZuHo5dC44`dj*D$n=zx|;qm+&O$ z-WtoE!wO8v;q9|Rk=!@&9Mj Zdy_|W1HV^WO+~?U z@wRb$Wz@l^6zhdQ1x7md*bU`a0 pv|;nP!`=2RU(ZI*F3n5R~4t17B@I1 zLuW0FB|qcNlomdigf1pNxQSoBSCE~MjJ1FG9G!f?lz+d+vySm^he^HG;AN>)rAe`~ z$f}lyJ?8ayAEYS8WnjFb*h;3i0TkgD{U5|$4SVbv|1BY$Q05Y)h%!D9+b8`_eI_FJ zpfSM?^t)RI#ZFsz7V6R#UA_!XW?J5`eG*kBjh(kYp_e=JRyjGva 4{|$WHw~dr71q12J?5aP`WaUVf#Y2abPXVmaxI2y-ioh1N&7Q)AO#h z3k_w`q@DAp)~x@iU`ihbzuO2kTI~nC^ $Y_5GTDj~D zpwM@7sA5k(uv$!Z8GDW)AGUYA)@NVITrYxWenYR!y;;P;Qk0eD6~Y|nvphn)PBLNI zJd6bI$-&398gN9k5T_k ?t&K;|yf&lRT}= 2kJVUTAd|& zO>IIuWM?I$_Sx?t1Dqj|0Zy)@AroUloA8wTtB}pC?G4u)(jwRF?bMcP{s7-no+r(= z>`}WKRZwV;eM@lk*xHv`o?^ $E_P22xcIJs4Xytl)fa!bqEM;K#f+?XKDF_e^1Bxx2 2pY4hY8FzNFr9cpQQ1V<~+ z^Yxa|InHMjGP!RsLI^1f2aEGl+Ml*c4fl1qVXdh#Rt1<%dISkFz`Jsu=uDStk2`i* zb|LojWN2*$U >K0L 4C}VzGqV;|b@*9Tb^Cuj|pZ+A>r9EYAp G5I&|)ed5RU(~@vd;g5Hyf#}~S7U(zE z)lB*E$0?m;*Yj0Uw$vUF>vi4xe9OJRoPv5qjfhp6r+oY4loZl4lI2yhy=)yk$Mq5U z>f3XFnsQ8OqvgLCOQp WbWa;A{vuP1X* ztiq&d<}K4$JFZ6hD4wnu6L5iB-{2I!MP7-wNHh$X*_68Fe7aEw4>4#k6QD)p8|d-G zc(mkZ1fK(}x7%*ZfK^ln@Xo30UZ!i(%-D#zcsseJc-l|vM?G3I#+D*K9o_R`GMJm2 zppCsx@B5&y@p(AgjLx3h_rbu2&-aZY?sT7Tb}I`G&MKNcrrg5GfupMtTO>65s%sjX zI{nU&bc}j^_qF5R>(F&u#jbmzYm~lI{?^?ly0vhdT{)`ze7ZTQ*Z3O!n%I|ty5YV& z^?P5Y$x@>g?_|&8fkdZ9iT#)MI)3_)@Lf+-AA(U4oB2-wiu9u c9x%c-AQIW#$7d{I9y(j9H;Ky4h4It0lw9Hw&ce)yUK_$=f@9MWWt -%OTDE=5lCA>&%zX>w zhesI;K<*w*HM{d)xNF8v&n-#ESHz!HSEH53lyyP*71QMl$YzlIdQ#L1<6u#}2_TUf za(wrlaHe6|b&t?Vvfv62%o}_%< MH#?=$80`6oCMV1V88XA=MbcG6fWEOFZ`#QrJaS@SRj(A`7w z6H`DSCq@|nhY0jgn{oQ*(7t=c9x3|w!r!Vm*oyEJ*riL|DZt5^ m&DI#iKXjYCilyWdsu-MX;llW;glatxltKpay1zWwfGCAi zbbCj$5bt~l0&~n*_)>B`RSIlxgd@Ewp-0~WIZr2!1KYdZ7k5ILt%jl +ok4eC5CY=QOM&{zRD6K*u{$eo7~HSB*Xgz6l1u%lVOEVTxz zF%Jlq-P^*3LcIJ?(g__C9TJ3yqUlxR3SrK_lyo8{6;eKpSh{=vU77KBWD=GXn!x%0 z38J(8Pa}qUDqL!ItU9z22$p*xXR;mfIs7!_eq1mXwez>4`|-Iz(h22T(ZI%7H}BZe zn-yGu9`K8CArPKkFrzAA^H^v)^DXp%l`oi*Pbj~CpsTal_ylT=Tla+`mb!lngQmkw zXQo#rn9_jfaZ#~Dz p>fc3t{F05klJ6hLl6F(dKjwlf&{wz<^y*aBrAhq zPfHNj@}|hOp!eh;U#Vk9+Me;isPDf|9Rt41-=q-sw8mbQf)Nl95zq*A?r*`%31JVH zFM&H0R5$Z$c)eEjzxgrmM8^1?;K59jJy4PfPE7PNsE-P=-YmNC4s+UpksFawkX!p2 zMkb_R?gHwu-Kt!MC`adLFgCMUnF8y|rGufEI;mc@#8EFxsHRE {E=y5|iaaa``m ztm1l&EOv}|<4&;DbXyJEXOXX>0g!IBlUAF {(HM)8W eS`2#i!1V&>}ouEow(J_#K*dvtR@ zIT@2>x0KsY@$IcD6Rvb?$?2GMt*eOWiOL7qyOqoQ6ikhD{O$bQbGA7Rif~O{2{j~n zqPyQ+3QSPD(IU&v(*t0;rl3=s!h`VolQjT|;vcj-7E9Ln43fR8mFX+E-Ujd@B(`~q z>c1GT^n?$|z>C4K8AUR|6ju$ja4)9(6G}}*skO3`DR!&W6h?+ @c~afA_&`nAnbq9x!4^MF8y~LYx|B4$)*AsTZ% QA}A8pz^?4yzpn_95BkDXP=AfOTOt^1LdwL z^+ukg(vS;tz0V&1G?+l!`)7S`5DgxJ+_qjCuiM#Xi$eLdp~#8ag>2Azxceo8YR5)t z5>_%}%>{cwZt$q*qm(hbE+j3uZF+c?y>q!Oaatc8B!EM^ZNAqBtXeRtBfaylBsk}a z`cQIeI`~Nm9wK^Ly8jhf1>Z$0X8B |uifIr^YT4b>5CMJY1>gO3 !hBL#JDOUXje&eu3PQ63K;2fXziIO7S0P# zwfB}!&>TUef)RQgCH#Cyc!ktxvLH%LjDz#VJI_@1VdSBsxF#K?&H)o)8J1Wx8)9eb zqm%)?31(~oi}fBM!TuoB&^JdMiG=2D@f1bU_>GA~BkXvI9}tp9wRP)99ifz=QGQCP z8`X|Hx9{T6kT3eQl`ubh+`tlmDgj^9l>SzU7QScn&q3XCYnS{ebj#)F b4D$Lc;pJv%Ami(lFa-7w;!G-AFbC6OR!#wvP`7|L`$o4bV5EH}2hX z5efN3p;~wY7^Xc&)Uc(&dJ~us+P;tKx@Xq~ 9TSxA2J`{(L0ge2KOtzm zD|!8+$9rc#9+dw%{D&WscduhY@;$?nkBO2OjkYIO3>0iz4>rK4E=F?%ZyRc)2hXM( zli;~xlGqJE@O~nPChEnL3DBDh 1Gfh$uR+kb0}CEy$vWuPEWmEpAtCj?tq{jgx|M(lX|S&2?H+!w0aWUa zDvaC-sir8D+T!U`gK}>rq&5!?Fb#Y@Q!*uJUZWtYI=>t*%tog;n&yxD jWM{gf zCC`;(4fjyqglJ96XhwGZsVkBkPrf~QFU1Yc=lNzP1{|>OOBymYvK3t5Nxqpw2_GmL z?u}uY3^2{z$hQ)hPwdP+i7P{8QZ|TEMURX9-htg1aI~W}c5^-Oo;!HVe=-{R=TgD= z*2or8?8oBicsOMmEEMFNcT1Y10fLr~MV^?L+W<35YC9tG9Wm!)O9$Lqi|jshA$Gpr z^3bQn2#JDMt*RorjBf9Dml$JVUCC=$L=`WB3E9U^xNRaE$37YbL+yR9pc2k!9g&PD z9%|WfKJ!-CjY%%0@WTF&(~aYy?F??k1LJQ=ByS?J<#xD8wjAWU!x~YV4$}7bfGJ5M zf`#bBU|RqpSaP84eTu_Cu;fL Sci-JteT7(7% z#Yl)NVlbKx-Q_c*NQh0|FZgqzh<)0sgnR??`precB|x5@P)<|>&cw$cmsd~y0J+rt zEW8Ea9Jmtzvvrw%0nD}<3G=&<@S8|jKLzC+bYBGFFTH&b6PJvt@imIFchw I~s&L|Ad5XPa$D{6y$7OgsRcI165<$-VP9+ zfT}Twgk7hR@ZbR?{2LNBmLcK&O(0C}-`fQcJsVXc0APEf`Ew-9K8u7`r|jx%#;Z}C zd+tSXeDCe;25;%GUk~BFXkxR7HBqDo!kQlE;g%b1M$RE2lx^@Q##f}?&!LxQ-19%N z=OHc51Sm{)mf~pQhjj$sgb_yiw}wpTZ|DE o3tq#e6R zdVLO*hkSkp_!fPB5d;bi#FTCv+W@<`%Ga$}TVAuO{Ex@e7;DWc@l~7*`~OJK1ot4; z7%QFHWX?OHfh~buR+$yK0blVu^W-zxhWks5K0v(AaYvX7#>n}tF;j>Ezdj9xk$~^* zT$Td-Mn}_MV!?0plE0}V4c01G0*bHJ+XW14^3}*De=a`_rjd{QlNeZX$T-oCzb!Z+ zF8@ikFF;0Vz&_Qsci1{DBo74fdP{gtIs`p1Rj6M>K#>+E-%;OJew z@-!^|5LbdhP}^d6(e`d6OGxlXH864MQr5)74z)!aY;5MT4ymhwu?c23Vicvcqk z2b6A$S`vylMu6!%jMDk2XQqR<09G4;Qdz^D_$Y+ZTV({-3n-o5hOl{cfCPR9Vp}!4 zH4qAd_uE}reN2-Wv1$Q5;We9P!0JB%g$>XsYydnaK$#Tbf{BL~{*#E`la#spg>mRY zq3pDS4IhHmy+xWP_DW^p!;#Sl{y;!NBz1}Fm2LB392g)N_y`FX0e+C~bk~DPr|m(6 zHBn$pSGwyd*=akb7SE%pxe 8saH0ahiq$K0XsT z_?U;C&NC1;@<1B$T<) i!y=kv#O_J26#pJpNDiWq;L=;g_C>?Y<18|3F zVj88)lDtIZ>AfSdhtkivCIIs`xxrNc99S6y2{WWWGeTJ26IGi+7LI~N<+$)jQztr? zCWQ-ONjoYv182hcp-9I5n7%%M_?k@MYl7Nr{Xb>jL`@W;CRiiK?~R&D^yJcQr;tgZ zDeJZSop@0SUoSf=b3#}B6b~yqgPf*AMCCBBnGgNhsi}kD*jrtd!TabBb)B=?9jhVo z@3t)}UYS+JH31ep?O@{Cj4O@04N68We+@#j>xp^GSRm=w#|ap{ggC2l4keByU~xGD z;)miK>+=Cl5=#jwcOM^&(ukLe1k4hxnT`CoGXxAA08naM{#vNWKorEAfM=~ QTH_ye#IIZ*4=;1CF{ pbpRvA}Nni-63-s*un zjcQ4GZEs?mzUAyv@7blj9ZQLLcKSS){F|?Ew`N8afJ~muyPSCBXkzi2?lY^q3o^P3 zxQotZ>={`+0OpsG88Lt*BI|Uh!QQpn9@uF1CrZd<3V6}s+e@9=cNS`es_w$7z}bgS z6>b*ZI!3GnYOTHNZ&Atdq!X#A>f3VJPS8T#B&_Wh@dOBathSJYY^eoB_HGIo`ZMny zhB8ZSUL&|t3&)=NRQukYvqfXy|5STw{dY|FNT4wOOuK73bth1Gwc&Qboj_sVn9dax z#8Xz%ovO}C`p>G@)zmR%g^hIV1H{Vub|I5GUyn@cfq@yp6wj{3lHB1aDCyL}y;qi` z_=ba}yslBk? 0b7 9Vn|p8zU3pFjvbztzYgq!aB{E_JW WeZ&sJMvuFvm1Sr680SM8} zNVszn5-w_FV7tQK=|LdslAOzXvrd@ %t>Od=AVn=&L~Pv8qHccCVFQ{4+x>l74m7A%C;aQ}c>gB}H~G1ZnD zaHS;Cn|f=m7un^F)0k`it3!LS$lV*ci`H}MF?h1>Tl=BTX2<+PHN7=Q=Gf)4r!n99 zuiBo(A|p0&7eHn#$Xv6xbvC;eNM__+#OE|l?0l~18-F;?tKA Hh^e_DB61TuIS?Nm$=$AQPj8SuIO11JuHe^ z_uUco36De|K97^aW0pvPmkqf#0RC{VQdA@`A1TT4FUn23K8&YPP*FXn6Qf*V&)7FU zI1T8)ss&{PHPn#Uo{e^hK? =l|?plZ<9)mI=o-Q`FjP`-1Q$HQ2kQSq41_B|W!itfSB_e&vqiEo^HY|QQqPjxJ z$hN9p;Xc$y;intyiGT-)_t-vL!~ohr_18pV2S7qibx~sr42lk8qt=O7Za=GWYkP$; z0RUx5Hi^=rZ-gM|+Qv 4yR8xVG&m&EpDAtS- zGp=n}$IOTqGY*#A&3LFBpq5q4c>bM?qwM&aapL-;MPMzlOt87;!{&;fEDxRtpkSqi zT+LNO*wn>(6nHe7%iGR3+hGV9o=9*tDj_CdELwMNImLBHhYM*sfaSYjDljB0L6jR0 ztju9xT=<6vV-{5z87Gw &Yo>3EA{=0Ti%k&(iV)HoEcK~b_1HbEbU z*aXp@I0D2ekm#T97dAj(M<@>UsUIRoymswwdoTv#se)(!z+{BhYte!&Qot<&x^>~J z {ego4-38 zF+3a5K)J}MBpZK{AQIh%2JU3e#r(ry& K5$HZ-Sl??3DH;Rj%U)&}=1#Oca5``}#ro*K}A $f0;e4y6VO+ar+hWpO#3frS0y?!TWI*iB*_gO;W~v_itpSP=F`qunH%#YOKv zBs>&02dcrNMbDUys?pSt3be>uNZ1yKR+69zww}0_AYooyA=m1+cQ*Hn%W0RmLY_o1 z*_^nXUPn2*9!Ac{Au%TV6_j&-4$8T$5G~YyK{ ;B)iakzxsZ_12ed|Yb`yb_^cu8-VdPfx)nbN0KN zmit8C-Phsb2ANve*#&E37~~sW?};BnEu3_OhJ|qv1*_r&qDBmA9>VjgG{4#-JMjM( zccBrvi;YsQ+z-Azo;)lX)sn m-U3xKu;2HoV%0 zHbtrGGl%_anSFj)1^X4B20^YhRGM9` |h?(?va!Vc&vzdK~U~bto4h5 JVSG=+(36CbU% zVYme}2ThbRSA(99xer!=0c7QFd;qNeLpX#L$Bh4PJaKIDL?>#tc>3d%z)(m 8lzcCt3}VFj$jkYK%4aMdBg?y<_$YeDVVN~{5cUzU z?e@ K7o#WG-2>EpoC?W*a7ITWvM}gFCEOVY6#eu z^Dq&M%9o{;&`LKVZQUp$-Z{$%14|KZDZVTt>ZHc`z2&0&K7IUA$kL;bJ_5Vi+E~AZ z;-IlD5((#Az(JGw;z9om9 AlZ`!S^YPS~G$zXuBPXu+aadm-D> r&<;#@|=fqnw z59nJ)TOcy^Wpp8AUkg#OyB97zV3~Sgv1Br2u;ppU0Cr#Jp(nCPCt0>^&&R% H_jK31(1c^e8VKT;bV>sB$j?!e zfKq2kD+5>+oW`defl0Y$!I}0!zJYH>G ~UIYzuN)zqVI+0Qu;R zWI@6*%cL6P`vKWM_9YNKu
ytJOi=77kOU=uG$_yWqGLUNcIJ; zXI6xy6yO221pfblXKAGtS %rZ@35rYxT`V z)mV;%gA)*F?Hla{;ZuYk>U;n(HRGb&fiNmZ@mHbw2rWK`oM_w>ghS6GCz|UE1T9OR z4M4lCMZ)@ONeOCf_*fYXdt2l<*8C^OLGIYkiQC}z8w+A^h|@x!|GykZcg_gMQHeMX zVKs8%_+aNncP7MWTpRXk(-)ZFxF~!{fq`!qZb-B8`acDV4p||N1h@9Bg&2sw4h%-* zH84-|lu8ztC1|RL7T`*oz5&cx%%xKLPf8(;mPROtK9_>s%7ERPTT)pX!1jTGod?_O zX}_aB03)>?IggqpH&pdPtZ4BwZ;a3v*38sP9LqaISH#N15vHSgC5Yz7f#@a9(soDG zn0ATdD~Cm2xhr}IL|36)FLCxGcSIMa!+z_LT(6CYhQ*zN&{QzCa?oSuFwi2i@(?(y zd=Xyu;^+ZtVyo_ACA=3Q2HB%s4$&U1gBR*3;IzluYlnBG!NWMM*iexiv7uk1P_+vI z*j@bMRb1X3Pv5VH>1*?g+{P?4SAm*HpDTt*%@7N%1-f+55q#+f8Bs!k_sJ`dvbl&p zphE6XgHwOwAFbY$QON4Og{ %4cS^1iOJ0OZo};jRE<+0GVT2?vFp3(T;qp?dO?`_r1;RU3-*6EXKpRI~<;k(c zv~!l1jlOGuhn6=M!5$O8^j_G0an%QL0w_N2vs`8FDf0rmV3W?cPH1?Dd4t$4cqJ=& ztG6Cva)Rdj?0Dg{^*~AgL`U-W2j+Fdu7O$IQVky)oyE?xL8RBFkYmTyrPPBED#!;T zVZ1^#F`g=!&3WXm--pbMsv2c|e>yzbY>o*aGN2xBDIa?4<4n5gI5f3R+V6)}<}?tA zbl)+ZRKGYJSe;CI|08!qPn^r7TTY0gt->AAJ)Ll)epu93bw~8wo=p1CaIV%1BchVX zx0?}o<`I3RSG@r|%@|G!Ef@$WA}Xz|h!CXjM&NuIIx$zt9TNT`#1NyX_1C zgu-o^7%q_~G0jK(Leu}?7p#ehU+BdFU7`&r1M>gF-n$1xRp$TW=gbT zCOd*7T&GB4*69pA<@D9UFpJaK8<361jbTDdY%%cigav%9TJe5qXG*~d*CgpeV~XUY zQMn3@3t}@J+b~rHXJOXRM%>LSlc!VEP6tJ8OqRa&{U$HVNQr8s)c&R@VA y2OH9V;V^ucmcjrN %|X9L>uz z9w5ryDhj-Umt{;%>Ba7ye>LzrA9xf=Nd_qJ_6!Ql@s^BEP+)sJ1um|l;}X{>uq~7V zpR?1cjo;A0YAY}8FX1H)OH$5*4gS@@9A4ruk>moEB%av*GEp{;B*8})1(x!%j1(^t ze5|3s4ZJL)l>{I1R-O%BmT{Q`AIU38JkiPvKAzCy)JE?#n)mjTEJOYw1#aPA4J_yF zIj%{$*pg#?(uo=Mb)syVNkw;KJBd{KdCI&j1KS#8a05|Jfi;iU)K_TwwauZx=Xk-# zk0es*9`k-2KT`>FTO8!_{<0Q+ZZiVU%kP83>(0Y26MrtGLIsnLMqHJzgg>Qfs#HyO zTK&d_r*G?l<;O9Nw{P1j@*NA}(;dwG#k_U4F)AD&xozX+9Wc`N{*&X4-ODA)Bu@F{ z_=NXzoy+m*7fhRN%af$=`YXIDut{rMUU3?qZ&5`4fKP(ej{h)hSxx8iByH_@E7w|e zjj3>jp6H;U_-G8L{OR`G+VQ;6$A0?cONXvK{Lt~`?Y!m3H~zsB=>K=yKTjg5t `0D`I?ym{>o-Bo-^_GB(EAITzhS14;m@fAEAPQ0qdge~ z**L?H$>GA%ys`}$!ikjO?xAN^{)=Cfc%Fqf`aAS_X#D?xkD4MY#hI55nBvBnm+m$? z^Rin!^O7c y%+vZbm1f{6nXj!FBayphW$vk+k1CCH~>z9|EG zu!3Q|$@|(p&72iBA?iB3|5T^KF=VaRZ3gGDXMM`3wrb73R;H&t(-Bd7+>9K6Mfh zsN}5kIZ0puSKMZNe7|Hx|8eMl;>bgK42)NJw=H%+%B_WN4sSf}uayqfsKb>c7dem> z=l!%&Fr@^0QrDBT(wVXywtJEIG0dH81VtoccY>{p=dK0+#RR=f2(tG> hw>>K~2RMS`3}@XogO7$ndH?v#ve~uh4bf^Ao%6v%8XuZL=;`n;PhBe2y`A zEnZC2lGMG^<_i;?kKxcpn*0w@iVp8Zzp^4>T^xRPAA-F5M#sG sf1k#$P5!G|lhB_1l`>W?qwgPP`6Vz%$~fq+I^XUFkYGaa6-x8r=@^0x6e z9i#F~O)2NDC2LF7m$ Qd K(orz*4qmIjV>1F3_sT4=L)S*T0OV 0MY;fw#Tk|JD74W0tj;VdyARcO+j}sVulHSNlxzZKUUjddt?YZ4z19>u~ z82Z#MkSVj9p)~foHJDWPi?L0A+7Z;aT(&);u6O$ *|>oYd>{Ok+d2sAg>62k@0EG-r+U1zEHV6Ti6-eXPEtugjeJ|&ETu|KEEAbU-$lQ z|F}ujzp8-XA}Y)jT&OfajUe&jksGell2(V6r&H|HdbP&O?=Ct{|2M)bia=+3$khv} zU9O5hpZ%5mu ykmL-)o7Hl z8v;19_vP_(DqWi5w7veVu9#I%n@7kW9=YeJQ9d?EnLS}oFI=UqPBz&)Wx|AYE^Kt- zq98GfQbKFjWguCAEo*f=!3+D+dAVjLT>3Gs>Q}s2|j$$vkPIRiN1$i$-R538Wp! zDhd5G7soFheDqj~mvwWm+OY~X%_F5bs9SHP<8tEZ9aC4pwi+B5Gh&nq?!-rr$BK46 zIsX;fvBiswtCcb5oRgo=#JHB@P}yEvOs~{ejL*P{6uoyBPNdvhwySNy&P_qt%ECkU zUJfjl{rwr!c5dNk*-yLZh2f9U_OI~5u=hdQpnbPZ+@P5rq7B+lf^(Pe#b7Y60rQ;C zquWiD!kM;CX?>m+TR1a+pyg>CwKfIO7H$H`RqT+fgoJyc1k&~1w1hr+%IFQVT_mh~ zZlQN&40c>)(2~Hb>Xc`&|7@K$cv9{SPrT%gYyJw9!=iWj?d`K&f{y5|4aFME*PQ1T( zLjFlem)~)`9*udwgyha?zwSV`|3R >ooOXw)vabLC5b3Wel;&@#BAun3F z2V*WdoTS4W+_Dzc#^}>VRkLGahj;AzBs5D?Y=%wY_S2Q#{28!%H3FYCjluX9SsD%h zV)*x+h8V4tUG?2|6v=mtPlf;a`KvvzV?*=G%!KmmB;=X^aTQm@pB^|U3ukd|Aeqh$ zkoJjBw+-h8IFhC(cG}IYCJVM;4L;xD$a{7ARn64I`tdHPwTJggEk0-xtMNYnAXzYi z6r)ZXL{&j`+b5l)ls`Px_fJyagHr9QQtby)?FH#cqv4sq4Qb@X3s<`vdGW;6kN~XM zxDAb*T`4qj$ -g)bm(K`v2a**b8s{>^Bp^<+q zH1hIi?{4Iws=-EHA2Qg;Q!F5}=be{s8eh8Xd?~5zr3Dtp@vy2nhS%e{sx+?ZKD LeY@(feuvuK=ZDjh z;|?ahDr>^&!?-_k4#_`$E&0c87%!^!`H?>&YPw1$ksD^iO!8zX2D~;y@mi96#pJW9 z;Ilh}fheD;C|@X_H`z5h*!67i;L4~}7CTC9y7X#bppwpO?q5o(e$YvHwYny-{uy2M z#}gyhaFIn^ ^R#lp^PpwK(M1h-HW==;H3buQ147crVk;k<`3r zP8*{xow{wxIq8)C fxy&8z6X}+ G7sL@SH}yqI>pE`Bi>dRX4lX^gX| 5vlycd$N@6)4W5pNpuR>vGA>!?Z%7UIKUwz z?@c%E!GV@yI#GP1heFw+5z4jjNDQ=0x)>bOt;HVW5jh9F5xe#XwzkU0aPCibxFyFZ zdEjhxxCy$}^-gH#E+zHdsW=9Z94vz}@L4+pDexb(T@dV!l+dxkdC(k|&x9HCd-OOB z$9>=Od<)LU)osFwIUIRAnaB;aTr%S{+^#2#{g%_$Cga51fc0F*)6xfVVy>S(S{1SI z1zCCVIcbH@BbrB` cZht0GRmi7;2B&w swSa^EF7`b5Ift}dibF{2DAH>4Ntv4;Up~=kKR8Ca zIxgT3Dl_Siq zEye-MY5iPxn1(HfHsUnPQq;xvpGbUPoMggz&qqlyJ6X-EPdAXvBR&9PjNU2|kW}7B z6*pZ)a+(Eng!9a#PBeyD9)H2v$v>JQi26EU0JZ#k$)nJLxxd?scBMFr!!e96V6;XX zR;hVX8~C!?=Jz*kT$GP(#B;vYZK1ZHe!o`z65HqxM)mbH*~Yvd9RB{SigBIc<>x=G z2(OQ-FUhk{Jrhr~=*od@famc}z)!j_d^Frr+%MsWWCW?W;l;S$9}rB!T}__2{)}*B zSML @8G6* zZv6eg(@~bc vQz@$nAu?s8UwpB2Cp|2@FF`DY9avl@6R&wl{#E>EJfS)|`Tgg%9T3V2G7 zmE5T>3hw}(;`;(WSpLBOS)@N6csG5ba~gQc*DT=O`6B#3fT#G2fOoe;!ha1svJ;rukH===0AaVR{)+$Y*9&ePRRx#3XhqYRa8*C zt}G{GZDC|id2zJh703I<R6 zz+ cI@>S}Y||Lg`xa^9A}m$H;runo?8%@|u&C zQI-Q=eETr#PEGK^3UUgviZ>t({pZET-0>D)Qt+Wx6|Bp*WM@aNnjU?JIKFFGR#Zat z@2bvROSYxJQj#rDDngdS#D05#ge}|gC|4} z>k9ct@zq8iA3&giZz>8D1|Krk6=z$@2un$ 9Th0=y>4h&wBwu-e8dqSfy|FAEJDMu zpo3)<72~sxIa&F91fjYkOLDT;W#vRt(XWqjr{%7U^)c@1;9KYVXao>GUTG;Qh>eM` z(8nz!@`_6F@k&FaVcG*|QKi$?;dk1+qAXrFx^&vYys}hF<}~^~<^A}aW%0DgER mzSSCtq5MzsD)0WMqe74mGKMxE`#Sfe|X0mh8B8W#$8>H>U^;8-EoMWPaxp# zedrm&XmD5e6X*@=e?mle2h6zBk@!rYu?@%E>4O<}b;69F_ri>ycf$<69|}!1W3VHN zObqFX8E9mKT~Q3qXNE7o;hk}40I}8c;oL0%^* 28(B+|L_B=${rTGS)mY4Oiu_jLQaJES|z zpqnoXp^DuFG1x`LauNHT+a+{T!F5+J6;SSOD!BfKekug|4;@wTbk`H#Qw7wWu9_iC zt*IF_nF+s ~R0P8UjBPi &S=afa1X0M45ztEc)6&E=J(bi+e&& VyPV~Qm&A~6x?+g_p)?z*UOZiKmAozEI z&tLNAA_V^%LOy?%zkn#g{|ff4W28UNA2U<%@B0t&`(_FL95#!;lz-U*{#y|dx90Pe zpE@AG#2bLY5E=CgF!2f?+Ec_u!9Ud{z{GQaK?rwNfQemzu?SZUi2Xror2rF`1I`6L z0T3U-jo5GE_xGvw0!*v}#6CW?R)C4QfY?{0W(zP;3rO*;M#z!?#{oj<710kQ9wS-+ zF@{9citaK%WIZAd5C=daw1@ 6{hd%5Fg7uM*7oBAiu#iRpmEUzz|{#sE@0g8)~4IEA4m7f}mH@lyc7T11Qp>nHR3 zzlc;o3Kt;4ThN)tzA&Oug!v-WiSRHsgec+&Eua>#Yob732T1r%^do}( J dz{JKeLOL;kME`iGP_9luD%Vy( zD%T?dOl$$fkdk^>fQk8lR6e-^Tp0&Q`Rs=ff?z!$U(O<2A;MG h X(09uwWIqI gzELQaGLL_)5V?DMSmR7jla<7$PZReek?ksQ)AY7~+>-9DW{Qmw1SZ=>!oejU0) z_;u=z <4ER)t1?klV>R7hNf7Yk+5 7uxF zyVoP@M1S}C;~M!Rewi4*UG#UaKQ4&=m7+f{FGl_~qI&`HgPRli**DBh>o@Wb7yVO3 zw?TBri0(Mi-6Q7bmPr2#awEO@qI*DePZHgc6n{wlV6AmmdEhhlj7E+*Bt z#;C?rPD0 zjTqj&zTPXk-RtGm;D@J=af>c`rrUk}LByFsm#zxj