Update to v0.1.2 from upstream project am: 06b7d72a41 am: c13fd2dbf2

Original change: https://android-review.googlesource.com/c/platform/external/libxaac/+/2170068

Change-Id: If50d76ff5ef2dc898f23b6f7f1386a1f67fad166
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/Android.bp b/Android.bp
index f10e600..10def9e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -95,6 +95,7 @@
         "decoder/ixheaacd_mps_temp_process.c",
         "decoder/ixheaacd_mps_temp_reshape.c",
         "decoder/ixheaacd_pns_js_thumb.c",
+        "decoder/ixheaacd_peak_limiter.c",
         "decoder/ixheaacd_pred_vec_block.c",
         "decoder/ixheaacd_process.c",
         "decoder/ixheaacd_ps_bitdec.c",
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 471681e..813b9d3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -85,6 +85,7 @@
     "${XAAC_ROOT}/decoder/ixheaacd_mps_temp_process.c"
     "${XAAC_ROOT}/decoder/ixheaacd_mps_temp_reshape.c"
     "${XAAC_ROOT}/decoder/ixheaacd_pns_js_thumb.c"
+    "${XAAC_ROOT}/decoder/ixheaacd_peak_limiter.c"
     "${XAAC_ROOT}/decoder/ixheaacd_pred_vec_block.c"
     "${XAAC_ROOT}/decoder/ixheaacd_process.c"
     "${XAAC_ROOT}/decoder/ixheaacd_ps_bitdec.c"
diff --git a/METADATA b/METADATA
index d97975c..d6eab38 100644
--- a/METADATA
+++ b/METADATA
@@ -1,3 +1,15 @@
+name: "libxaac"
+description: "Android fork of the xaac library."
 third_party {
+  url {
+    type: GIT
+    value: "https://github.com/ittiam-systems/libxaac.git"
+  }
+  version: "601a6a03ce6d42c50c08f8bb07c4be2cbbf3b112"
   license_type: NOTICE
+  last_upgrade_date {
+    year: 2022
+    month: 8
+    day: 01
+  }
 }
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b890e83
--- /dev/null
+++ b/README.md
@@ -0,0 +1,192 @@
+# Introduction of the Ex-HEAAC Decoder
+
+
+Ex-HEAAC (Extended HE AAC), the latest upgrade to the MPEG AAC codec family,
+is the audio codec of choice for digital radio and low bit rate
+streaming applications. Selected as the mandatory audio codec for DRM
+(Digital Radio Mondiale), Ex-HEAAC bridges the gap between speech and
+audio coding, and provides consistent high quality audio for all signal 
+types, such as speech, music or mixed content.
+
+Another important feature is the codec’s coding efficiency. The audio 
+codec produces excellent sound for both music and speech, delivering 
+high quality performance at bit rates starting as low as 6 kbit/s for 
+mono and 12 kbit/s for stereo services. Thus Ex-HEAAC streaming apps and
+streaming radio players may switch to very low bit rate streams and 
+offer a continuous playback even while the network is congested. Once 
+more bandwidth becomes available on the network again, the Ex-HEAAC
+client can request a higher bitrate version and seamless switch over 
+the full range of bitrates. Audio bitrate that’s being saved due to the 
+improved coding efficiency can be used to improve video quality. Ex-HEAAC
+supports AAC and HEAAC v2 as well.
+
+AAC is a popular audio coding technique recommended by MPEG committee. 
+The codec handles audio signals sampled in the range of 8 kHz to 96 
+kHz. It operates on a frame of 1024 samples. The bit-rates supported 
+are in the range of 8 kbps to 576 kbps per channel.
+
+SBR and PS are the tools used in combination with the AAC general audio 
+codec resulting in HEAAC v2 (also known as Enhanced AAC Plus). It
+provides significant increase in coding gain. In SBR, the high-band, 
+i.e. the high frequency part of the spectrum is replicated using the 
+low-band. In PS, channel redundancy is exploited and parameters are 
+extracted from a down-mixed channel.The bit-rate is by far below the 
+bit-rate required when using conventional AAC coding. This translates 
+into better quality at lower bit-rates.
+
+
+# Introduction to Ex-HEAAC Decoder APIs
+
+## Files to be included are
+* [`ixheaacd_apicmd_standards.h`](decoder/ixheaacd_apicmd_standards.h)
+* [`ixheaacd_type_def.h`](decoder/ixheaacd_type_def.h)
+* [`ixheaacd_memory_standards.h`](decoder/ixheaacd_memory_standards.h)
+* [`ixheaacd_error_standards.h`](decoder/ixheaacd_error_standards.h)
+* [`ixheaacd_error_handler.h`](decoder/ixheaacd_error_handler.h)
+* [`ixheaacd_aac_config.h`](decoder/ixheaacd_aac_config.h)
+
+## Decoder APIs
+
+A single API is used to get and set configurations and execute the decode thread, based on command index passed.
+* ia_xheaacd_dec_api
+
+| **API Command** | **API Sub Command** | **Description** |
+|------|------|------|
+|IA_API_CMD_GET_LIB_ID_STRINGS | IA_CMD_TYPE_LIB_NAME | Gets the decoder library name |
+|IA_API_CMD_GET_LIB_ID_STRINGS | IA_CMD_TYPE_LIB_VERSION | Gets the decoder version |
+|IA_API_CMD_GET_API_SIZE | 0 | Gets the memory requirements size of the API |
+|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS | Sets the configuration parameters of the Ex-HEAAC v2 Decoder to default values |
+|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS | Sets the attributes(size, priority, alignment) of all memory types required by the application onto the memory structure |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ	| Sets the core AAC sampling frequency for RAW header decoding | 
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PCM_WDSZ | Sets the bit width of the output pcm samples.The value has to be 16 |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX | Sets the parameter whether the output needs to be down-mix to mono(1) or not(0) |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_TOSTEREO	| Sets the flag to disable interleave mono to stereo |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DSAMPLE	| Sets the parameter whether the output needs to be downsampled(1) or not(0).This is valid only for Ex-HEAAC v2 build | 
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_FRAMEOK	| Sets the flag to 0 or 1 to indicate whether the current frame is valid(1) or not(0) |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_ISMP4	| Sets the flag to 0 or 1 to indicate whether given test vector is an mp4 file or not |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DISABLE_SYNC	| Sets the flag of ADTS syncing or not ADTS syncing as 0 or 1 |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE	| Sets the parameter auto SBR upsample to 0 or 1.Used in case of stream changing from SBR present to SBR not present.This is valid only for Ex-HEAAC v2 build |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_MAX_CHANNEL	| Sets the maximum number of channels present.Its maximum value is 2 for stereo library and 8 for multichannel library |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_COUP_CHANNEL	| Sets the number of coupling channels to be used for coupling.It can take values from 0 to 16.This command is supported only if the library has multichannel support |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX_STEREO	| Sets the flag of downmixing n number of channels to stereo.Can be 0 or 1. This command is supported only if the library has multichannel support |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISLOAS	| Sets the flag indicating that the input file is a .loas file.Can be 0 or 1 |
+|IA_API_CMD_GET_N_MEMTABS	| 0 | Gets the number of memory types |
+|IA_API_CMD_GET_N_TABLES	| 0 | Gets the number of tables |
+|IA_API_CMD_GET_MEM_INFO_SIZE	| 0 | Gets the size of the memory type being referred to by the index |
+|IA_API_CMD_GET_MEM_INFO_ALIGNMENT	| 0 | Gets the alignment information of the memory-type being referred to by the index |
+|IA_API_CMD_GET_MEM_INFO_TYPE	| 0 | Gets the type of memory being referred to by the index |
+|IA_API_CMD_SET_MEM_PTR	| 0 | Sets the pointer to the memory being referred to by the index to the input value |
+|IA_API_CMD_GET_TABLE_INFO_SIZE	| 0 | Gets the size of the memory type being referred to by the index |
+|IA_API_CMD_GET_TABLE_INFO_ALIGNMENT	| 0 | Gets the alignment information of the memory-type being referred to by the index |
+|IA_API_CMD_GET_TABLE_PTR	| 0 | Gets the address of the current location of the table |
+|IA_API_CMD_SET_TABLE_PTR	| 0 | Sets the relocated table address |
+|IA_API_CMD_INPUT_OVER	| 0 | Signals the end of bit-stream to the library |
+|IA_API_CMD_SET_INPUT_BYTES	| 0 | Sets the number of bytes available in the input buffer for initialization |
+|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_PROCESS	| Search for the valid header, does header decode to get the parameters and initializes state and configuration structure |
+|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_DONE_QUERY	| Checks if the initialization process has completed |
+|IA_API_CMD_GET_CURIDX_INPUT_BUF | 0 | Gets the number of input buffer bytes consumed by the last initialization |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ | Gets the sampling frequency | 
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS | Gets the output number of channels |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ | Gets the output PCM word size |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MODE | Gets the channel mode. (Mono or PS/Stereo/Dual-mono) |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MASK	| Gets the channel mask |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE | Gets the SBR mode (Present/ Not Present).This is valid only for Ex-HEAAC v2 build |
+|IA_API_CMD_EXECUTE | IA_CMD_TYPE_DO_EXECUTE	| Executes the decode thread |
+|IA_API_CMD_EXECUTE | IA_CMD_TYPE_DONE_QUERY	| Checks if the end of decode has been reached |
+|IA_API_CMD_GET_OUTPUT_BYTES | 0 | Gets the number of bytes output by the decoder in the last frame |
+
+## Flowchart of calling sequence
+
+![API Flowchart](docs/Api_flowchart.png)
+
+#  Building the Ex-HEAAC Decoder
+
+## Building for AOSP
+* Makefiles for building the Ex-HEAAC decoder library is provided in root(`libxaac/`) folder.
+* Makefiles for building the Ex-HEAAC decoder testbench is provided in `test` folder.
+* Build the library followed by the application using the below commands:
+Go to root directory
+```
+$ mm
+```
+
+## Using CMake
+Users can also use cmake to build for `x86`, `x86_64`, and Windows (MSVS project) platforms.
+
+### Building for native platforms
+Run the following commands to build the Ex-HEAAC Decoder for native platform:
+```
+Go to the root directory(libxaac/) of the Ex-HEAAC Decoder.
+Create a new folder in the project root directory and move to the newly created folder.
+
+$ cd <path to libxaac>
+$ mkdir bin
+$ cd bin
+$ cmake ..
+$ cmake --build .
+```
+
+### Creating MSVS project files
+To create MSVS project files for the Ex-HEAAC decoder from cmake, run the following commands:
+```
+Go to the root directory(libxaac/) of the Ex-HEAAC Decoder.
+Create a new folder in the project root directory and move to the newly created folder.
+
+$ cd <path to libxaac>
+$ mkdir bin
+$ cd bin
+$ cmake -G "Visual Studio 15 2017" ..
+```
+
+The above command creates MSVS 2017 project files. If the version is different, modify the generator name accordingly.
+The Ex-HEAAC decoder can be built using these project files.
+
+# Running the Ex-HEAAC Decoder
+
+The Ex-HEAAC Decoder can be run by providing command-line parameters(CLI options) directly or by providing a parameter file as a command line argument.
+
+Command line usage : 
+```
+<exceutable> -ifile:<input_file> -imeta:<meta_data_file> -ofile:<out_file> [options]
+
+[options] can be,
+[-pcmsz:<pcmwordsize>]
+[-dmix:<down_mix>]
+[-tostereo:<interleave_to_stereo>]
+[-dsample:<down_sample_sbr>]
+[-fs:<RAW_sample_rate>]
+[-nosync:<disable_sync>]
+[-sbrup:<auto_sbr_upsample>]
+[-maxchannel:<maximum_num_channels>]
+[-mp4:<mp4_flag>]
+
+where,
+  <inputfile>        	 is the input AAC file name.
+  <meta_data_file> 	 	 is a text file which contains metadata for USAC files with an MP4 container.
+  <outputfile>       	 is the output file name.
+  <pcmwordsize>      	 is the bits per sample info. Only 16 is valid
+  <down_mix> 		 	 is to enable/disable always mono output. Default 0.
+  <interleave_to_stereo> is to enable/disable always interleaved to stereo output. Default 1.
+  <down_sample_sbr> 	 is to enable/disable down-sampled SBR output. Default auto identification from header.
+  <RAW_sample_rate> 	 is to indicate the core AAC sample rate for a RAW stream. If this is specified no other file format headers are searched for.
+  <disable_sync> 		 is to disable the ADTS/ADIF sync search i.e when enabled the decoder expects the header to be at the start of input buffer. Default 0.
+  <auto_sbr_upsample> 	 is to enable(1) or disable(0) auto SBR upsample in case of stream changing from SBR present to SBR not present. Default 1.
+  <maximum_num_channels> is the number of maxiumum channels the input may have. Default is 6 (5.1).
+  <mp4_flag> 			 is a flag that should be set to 1 when passing raw stream along with meta data text file.
+
+```					 
+					 
+Sample CLI:
+```
+<xaac_dec_exe> -ifile:in_file.aac -ofile:out_file.wav -pcmsz:16 					 
+```
+
+# Validating the Ex-HEAAC Decoder
+
+Conformance testing for AAC/HEAAC v1/HEAAC v2 mainly involves comparing 
+decoder under test output with the ISO and 3GPP reference decoded output.
+
+Testing for USAC is done using encoded streams generated using ISO USAC 
+reference encoder. The output generated by ITTIAM USAC decoder is 
+compared against the output generated by ISO USAC decoder for 16-bit 
+conformance on the respective(ARMv7, ARMv8, X86_32, X86_64) platforms.
diff --git a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c
index 75ca6b3..d15cf74 100644
--- a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c
+++ b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c
@@ -69,7 +69,7 @@
  WORD16) = &ixheaacd_covariance_matrix_calc_2_armv7;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_dec;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -155,13 +155,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_dec;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_dec;
 
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_dec;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -169,7 +169,7 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_armv7;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_armv7;
 
 VOID(*ixheaacd_overlap_out_copy)
diff --git a/decoder/armv7/ixheaacd_function_selector_armv7.c b/decoder/armv7/ixheaacd_function_selector_armv7.c
index c9f41f9..d3a17d7 100644
--- a/decoder/armv7/ixheaacd_function_selector_armv7.c
+++ b/decoder/armv7/ixheaacd_function_selector_armv7.c
@@ -76,7 +76,7 @@
  WORD16) = &ixheaacd_covariance_matrix_calc_2_armv7;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_armv7;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -161,12 +161,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_armv7;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_armv7;
+
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_armv7;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -174,11 +175,11 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_armv7;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_armv7;
 
 VOID(*ixheaacd_overlap_out_copy)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
  const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_armv7;
 
 VOID(*ixheaacd_pretwiddle_compute)
@@ -194,18 +195,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_armv7;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_armv7;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_armv7;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_armv7;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_armv7;
@@ -214,14 +203,9 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_armv7;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_armv7;
-
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_armv7;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
diff --git a/decoder/armv7/ixheaacd_lap1.s b/decoder/armv7/ixheaacd_lap1.s
index 999dd35..2f2ced3 100644
--- a/decoder/armv7/ixheaacd_lap1.s
+++ b/decoder/armv7/ixheaacd_lap1.s
@@ -29,7 +29,7 @@
 ixheaacd_overlap_buf_out_armv7:
 
     STMFD           sp!, {r4-r5}
-    MOV             r3, r3, lsl #1
+    MOV             r3, r3, lsl #2
 
 OUTSAMPLE_LOOP:
 
@@ -37,11 +37,11 @@
     LDR             r5, [r1], #4
     SUBS            r2, r2, #2
 
-    QADD16          r4, r4, r4
-    QADD16          r5, r5, r5
+    LSL             r4,r4,#15
+    LSL             r5,r5,#15
 
-    STRH            r4, [r0], r3
-    STRH            r5, [r0], r3
+    STR            r4, [r0], r3
+    STR            r5, [r0], r3
 
     BGT             OUTSAMPLE_LOOP
 
@@ -54,7 +54,7 @@
     STMFD           sp!, {r4-r9, r14}
     MOV             r9, #32
     MOV             r8, r1
-    MOV             r3, r3, LSL #1
+    MOV             r3, r3, LSL #2
 
 
 OUT_OVERLAP_LOOP:
@@ -62,14 +62,14 @@
     LDR             r5, [r1], #4
     SUBS            r9, r9, #1
 
-    QADD16          r4, r4, r4
-    QADD16          r5, r5, r5
+    LSL             r4,r4,#15
+    LSL             r5,r5,#15
 
     LDR             r6, [r2], #4
     LDR             r7, [r2], #4
 
-    STRH            r4, [r0], r3
-    STRH            r5, [r0], r3
+    STR            r4, [r0], r3
+    STR            r5, [r0], r3
 
     STR             r6, [r8], #4
     STR             r7, [r8], #4
diff --git a/decoder/armv7/ixheaacd_no_lap1.s b/decoder/armv7/ixheaacd_no_lap1.s
index 2884191..944e32b 100644
--- a/decoder/armv7/ixheaacd_no_lap1.s
+++ b/decoder/armv7/ixheaacd_no_lap1.s
@@ -32,79 +32,60 @@
     ADD             R6, R6, R0
     MOV             R8, #-16
     SUB             R6, R6, #12
-    MOV             R7, R3, LSL #1
+    MOV             R7, R3, LSL #2
     VDUP.32         Q1, R2
-    MOV             R4, #0x8000
-    VDUP.32         Q2, R4
-
     VLD1.32         {D0, D1}, [R6], R8
     VQNEG.S32       Q0, Q0
 
 
     VLD1.32         {D6, D7}, [R6], R8
     VQSHL.S32       Q15, Q0, Q1
-    VQADD.S32       Q14, Q15, Q2
-    VSHR.S32        Q13, Q14, #16
-    VREV64.32       Q13, Q13
+    VMOV            Q13, Q15
     SUB             R5, R5, #8
 
-    VUZP.16         D27, D26
     VQNEG.S32       Q3, Q3
-
+    VREV64.32       Q13,Q13
 
 LOOP_1:
 
-
-    VST1.16         D27[0], [R1], R7
-    VQSHL.S32       Q12, Q3, Q1
-    VLD1.32         {D0, D1}, [R6], R8
-    VST1.16         D27[1], [R1], R7
-    VQADD.S32       Q11, Q12, Q2
-    VST1.16         D27[2], [R1], R7
-    VQNEG.S32       Q0, Q0
-    VST1.16         D27[3], [R1], R7
-    VSHR.S32        Q10, Q11, #16
-    VREV64.32       Q10, Q10
-    SUBS            R5, R5, #8
+   VST1.32         {D27[0]},[R1], R7
+   VQSHL.S32       Q12, Q3, Q1
+   VLD1.32         {D0, D1}, [R6], R8
+   VST1.32         {D27[1]}, [R1], R7
+   VST1.32         {D26[0]}, [R1], R7
+   VQNEG.S32       Q0, Q0
+   VST1.32         {D26[1]}, [R1], R7
+   VMOV            Q10 , Q12
+   SUBS            R5, R5, #8
 
 
-    VUZP.16         D21, D20
-    VQSHL.S32       Q15, Q0, Q1
-    VST1.16         D21[0], [R1], R7
-    VLD1.32         {D6, D7}, [R6], R8
-    VQADD.S32       Q14, Q15, Q2
-    VST1.16         D21[1], [R1], R7
-    VSHR.S32        Q13, Q14, #16
-    VST1.16         D21[2], [R1], R7
-    VREV64.32       Q13, Q13
-    VST1.16         D21[3], [R1], R7
+   VREV64.32       Q10,Q10
+   VQSHL.S32       Q15, Q0, Q1
+   VST1.32         {D21[0]},[R1], R7
+   VLD1.32         {D6, D7}, [R6],R8
+   VST1.32         {D21[1]}, [R1],R7
+   VMOV            Q13,Q15
+   VST1.32         {D20[0]}, [R1],R7
+   VST1.32         {D20[1]}, [R1],R7
 
+   VREV64.32       Q13,Q13
+   VQNEG.S32       Q3, Q3
 
-    VUZP.16         D27, D26
-    VQNEG.S32       Q3, Q3
+   BGT             LOOP_1
 
+   VST1.32         {D27[0]},[R1],R7
+   VQSHL.S32       Q12, Q3, Q1
+   VST1.32         {D27[1]}, [R1],R7
+   VST1.32         {D26[0]}, [R1],R7
+   VST1.32         {D26[1]}, [R1],R7
+   VMOV             Q10, Q12
 
-
-    BGT             LOOP_1
-
-    VST1.16         D27[0], [R1], R7
-    VQSHL.S32       Q12, Q3, Q1
-    VST1.16         D27[1], [R1], R7
-    VST1.16         D27[2], [R1], R7
-    VQADD.S32       Q11, Q12, Q2
-    VST1.16         D27[3], [R1], R7
-    VSHR.S32        Q10, Q11, #16
-
-
-    VREV64.32       Q10, Q10
-
-    VUZP.16         D21, D20
-
-    VST1.16         D21[0], [R1], R7
-    VST1.16         D21[1], [R1], R7
-    VST1.16         D21[2], [R1], R7
-    VST1.16         D21[3], [R1], R7
-    VPOP            {D8 - D15}
-    LDMFD           sp!, {R4-R12, R15}
+   VREV64.32       Q10,Q10
+   VST1.32         {D21[0]}, [R1], R7
+   VST1.32         {D21[1]}, [R1], R7
+   VST1.32         {D20[0]}, [R1], R7
+   VST1.32         {D20[1]}, [R1], R7
+   VPOP            {D8 - D15}
+   LDMFD           sp!, {R4-R12, R15}
 .end
 
diff --git a/decoder/armv7/ixheaacd_overlap_add1.s b/decoder/armv7/ixheaacd_overlap_add1.s
index b376470..5c8f3c4 100644
--- a/decoder/armv7/ixheaacd_overlap_add1.s
+++ b/decoder/armv7/ixheaacd_overlap_add1.s
@@ -32,6 +32,8 @@
     LDR             R4, [SP, #104]
     LDR             R5, [SP, #108]
     LDR             R6, [SP, #112]
+
+    LSL             R6 , R6 , #1
     MOV             R10, R5, LSL #1
     SUB             R11, R10, #1
     MOV             R10, R11, LSL #2
@@ -45,11 +47,10 @@
     MOV             R12, #-16
     VDUP.16         Q11, R4
     VLD1.32         {D6, D7}, [R10], R12
-    MOV             R7, #0x2000
+    MOV             R7, #0x0
     VREV64.32       Q3, Q3
     RSB             R7, R7, #0
     VQNEG.S32       Q0, Q3
-    VDUP.32         Q10, R7
     VUZP.16         D1, D0
     SUB             R11, R5, #1
     VUZP.16         D7, D6
@@ -66,7 +67,6 @@
     ADD             R6, R6, R2
 
 
-
     VMULL.U16       Q15, D7, D2
     VLD1.32         {D4, D5}, [R1]!
     VSHR.U32        Q15, Q15, #16
@@ -81,12 +81,7 @@
     VQMOVN.S64      D28, Q13
     VMULL.S32       Q13, D5, D15
     VQMOVN.S64      D29, Q13
-
-    VQADD.S32       Q14, Q14, Q10
     VQSUB.S32       Q13, Q15, Q14
-    VQSHL.S32       Q13, Q13, #2
-    VSHR.S32        Q13, Q13, #16
-    VUZP.16         D26, D27
 
 
     VMULL.U16       Q12, D1, D3
@@ -104,16 +99,12 @@
     VQMOVN.S64      D17, Q0
 
     VREV64.32       Q3, Q3
-    VQADD.S32       Q8, Q8, Q10
     VQNEG.S32       Q0, Q3
     VUZP.16         D1, D0
     VQSUB.S32       Q9, Q12, Q8
     VUZP.16         D7, D6
-    VQSHL.S32       Q9, Q9, #2
     VLD2.16         {D2, D3}, [R8], R12
-    VSHR.S32        Q9, Q9, #16
     VREV64.16       Q1, Q1
-    VUZP.16         D18, D19
 
     VLD1.32         {D4, D5}, [R1]!
     SUB             R5, R5, #8
@@ -121,25 +112,25 @@
 
 LOOP_1:
 
-    VST1.16         D26[0], [R11], R4
+
+    VST1.32         D26[0], [R11], R4
     VMULL.U16       Q15, D7, D2
-    VST1.16         D26[1], [R11], R4
+    VST1.32         D26[1], [R11], R4
     VMULL.U16       Q12, D1, D3
-    VST1.16         D26[2], [R11], R4
+    VST1.32         D27[0], [R11] ,R4
     VSHR.U32        Q15, Q15, #16
-    VST1.16         D26[3], [R11], R4
+    VST1.32         D27[1], [R11] ,R4
     VSHR.U32        Q12, Q12, #16
-    VST1.16         D18[0], [R6], R9
+    VST1.32         D18[0], [R6], R9
     VMLAL.S16       Q15, D6, D2
-    VST1.16         D18[1], [R6], R9
+    VST1.32         D18[1], [R6], R9
     VMLAL.S16       Q12, D0, D3
-    VST1.16         D18[2], [R6], R9
+    VST1.32         D19[0], [R6], R9
     VQSHL.S32       Q15, Q15, Q11
-    VST1.16         D18[3], [R6], R9
+    VST1.32         D19[1], [R6], R9
     VQSHL.S32       Q12, Q12, Q11
     VLD1.32         {D6, D7}, [R10], R12
 
-
     VADDL.S16       Q7, D3, D12
 
     VMULL.S32       Q8, D4, D14
@@ -148,8 +139,6 @@
     VQMOVN.S64      D29, Q8
     VREV64.32       Q3, Q3
 
-
-
     VADDL.S16       Q7, D2, D12
 
     VMULL.S32       Q0, D4, D14
@@ -160,34 +149,27 @@
     VLD2.16         {D2, D3}, [R8], R12
     VQNEG.S32       Q0, Q3
     VLD1.32         {D4, D5}, [R1]!
-    VQADD.S32       Q14, Q14, Q10
     VUZP.16         D1, D0
-    VQADD.S32       Q8, Q8, Q10
     VUZP.16         D7, D6
     VQSUB.S32       Q13, Q15, Q14
     VREV64.16       Q1, Q1
     VQSUB.S32       Q9, Q12, Q8
-    VQSHL.S32       Q13, Q13, #2
-    VQSHL.S32       Q9, Q9, #2
     VMULL.U16       Q15, D7, D2
-    VSHR.S32        Q13, Q13, #16
-    VUZP.16         D26, D27
-    VSHR.S32        Q9, Q9, #16
-    VST1.16         D26[0], [R11], R4
+    VST1.32         D26[0], [R11], R4
     VMULL.U16       Q12, D1, D3
-    VUZP.16         D18, D19
+
     VSHR.U32        Q15, Q15, #16
-    VST1.16         D26[1], [R11], R4
+    VST1.32       {D26[1]}, [R11], R4
     VMLAL.S16       Q15, D6, D2         @MLA
-    VST1.16         D26[2], [R11], R4
+    VST1.32       {D27[0]}, [R11], R4
     VSHR.U32        Q12, Q12, #16
-    VST1.16         D26[3], [R11], R4
+    VST1.32       {D27[1]}, [R11], R4
     VMLAL.S16       Q12, D0, D3         @MLA
-    VST1.16         D18[0], [R6], R9
+    VST1.32       {D18[0]}, [R6], R9
     VQSHL.S32       Q15, Q15, Q11
-    VST1.16         D18[1], [R6], R9
+    VST1.32       {D18[1]}, [R6], R9
     VQSHL.S32       Q12, Q12, Q11
-    VST1.16         D18[2], [R6], R9
+    VST1.32       {D19[0]}, [R6], R9
 
 
     VADDL.S16       Q7, D3, D12
@@ -197,7 +179,7 @@
     VMULL.S32       Q8, D5, D15
     VQMOVN.S64      D29, Q8
 
-    VST1.16         D18[3], [R6], R9
+    VST1.32         {D19[1]}, [R6], R9
 
 
     VADDL.S16       Q7, D2, D12
@@ -208,45 +190,40 @@
     VQMOVN.S64      D17, Q0
 
     VLD1.32         {D6, D7}, [R10], R12
-    VQADD.S32       Q14, Q14, Q10
     VREV64.32       Q3, Q3
     VQNEG.S32       Q0, Q3
     VUZP.16         D1, D0
     VQSUB.S32       Q13, Q15, Q14
     VUZP.16         D7, D6
-    VQADD.S32       Q8, Q8, Q10
     VLD2.16         {D2, D3}, [R8], R12
     VQSUB.S32       Q9, Q12, Q8
     VREV64.16       Q1, Q1
-    VQSHL.S32       Q13, Q13, #2
+
     VLD1.32         {D4, D5}, [R1]!
-    VQSHL.S32       Q9, Q9, #2
-    VSHR.S32        Q13, Q13, #16
+
     SUBS            R5, R5, #8
-    VSHR.S32        Q9, Q9, #16
-    VUZP.16         D26, D27
-    VUZP.16         D18, D19
+
 
 
 
     BGT             LOOP_1
 
-    VST1.16         D26[0], [R11], R4
+    VST1.32         {D26[0]}, [R11], R4
     VMULL.U16       Q15, D7, D2
-    VST1.16         D26[1], [R11], R4
+    VST1.32         {D26[1]}, [R11], R4
     VMULL.U16       Q12, D1, D3
-    VST1.16         D26[2], [R11], R4
+    VST1.32         {D27[0]}, [R11], R4
     VSHR.U32        Q15, Q15, #16
-    VST1.16         D26[3], [R11], R4
+    VST1.32         {D27[1]}, [R11], R4
     VSHR.U32        Q12, Q12, #16
 
-    VST1.16         D18[0], [R6], R9
+    VST1.32         {D18[0]}, [R6], R9
     VMLAL.S16       Q15, D6, D2
-    VST1.16         D18[1], [R6], R9
+    VST1.32         {D18[1]}, [R6], R9
     VMLAL.S16       Q12, D0, D3
-    VST1.16         D18[2], [R6], R9
+    VST1.32         {D19[0]}, [R6], R9
     VQSHL.S32       Q15, Q15, Q11
-    VST1.16         D18[3], [R6], R9
+    VST1.32         {D19[1]}, [R6], R9
     VQSHL.S32       Q12, Q12, Q11
 
 
@@ -268,29 +245,19 @@
     VMULL.S32       Q13, D5, D15
     VQMOVN.S64      D17, Q13
 
-    VQADD.S32       Q14, Q14, Q10
-    VQADD.S32       Q8, Q8, Q10
+
     VQSUB.S32       Q13, Q15, Q14
     VQSUB.S32       Q9, Q12, Q8
-    VQSHL.S32       Q13, Q13, #2
-    VQSHL.S32       Q9, Q9, #2
-    VSHR.S32        Q13, Q13, #16
-    VSHR.S32        Q9, Q9, #16
-    VUZP.16         D26, D27
 
-    VUZP.16         D18, D19
+    VST1.32         D26[0], [R11], R4
+    VST1.32         D26[1], [R11], R4
+    VST1.32         D27[0], [R11], R4
+    VST1.32         D27[1], [R11], R4
 
-
-
-    VST1.16         D26[0], [R11], R4
-    VST1.16         D26[1], [R11], R4
-    VST1.16         D26[2], [R11], R4
-    VST1.16         D26[3], [R11], R4
-
-    VST1.16         D18[0], [R6], R9
-    VST1.16         D18[1], [R6], R9
-    VST1.16         D18[2], [R6], R9
-    VST1.16         D18[3], [R6], R9
+    VST1.32         D18[0], [R6], R9
+    VST1.32         D18[1], [R6], R9
+    VST1.32         D19[0], [R6], R9
+    VST1.32         D19[1], [R6], R9
 
     VPOP            {d8 - d15}
     LDMFD           sp!, {R4-R12, R15}
diff --git a/decoder/armv7/ixheaacd_post_twiddle_overlap.s b/decoder/armv7/ixheaacd_post_twiddle_overlap.s
index 24a5ba3..57d20cd 100644
--- a/decoder/armv7/ixheaacd_post_twiddle_overlap.s
+++ b/decoder/armv7/ixheaacd_post_twiddle_overlap.s
@@ -44,7 +44,7 @@
 
     VMOV.S16        D18, #50
     RSB             R9, R5, #15
-    VMOV.S32        Q10, #0x00008000
+    VMOV.S32        Q10, #0x0000000
     VDUP.32         Q8, R5
     SUB             R5, R5, #16
     STR             R5, [sp, #116]
@@ -149,14 +149,12 @@
     VQSUB.S32       D8, D0, D8
 
 
-    VQSHL.S32       D8, D8, #2
     VDUP.32         D0, R8
-    VQADD.S32       D8, D8, D0
-    VSHR.S32        D8, D8, #16
 
 
 
     LDR             R7, [sp, #112]
+    LSL             R7 , R7 , #1
     LSL             R10, R7, #1
 
     ASR             R5, R3, #1
@@ -166,8 +164,8 @@
     MVN             R9, R10
     ADD             R9, R9, #1
 
-    VST1.16         D8[2], [R0], R9
-    VST1.16         D8[0], [R5], R10
+    VST1.32         D8[1], [R0], R9
+    VST1.32         D8[0], [R5], R10
 
 
     MOV             R8, R1
@@ -397,28 +395,19 @@
     VMLAL.S16       Q15, D15, D10
 
     VLD2.32         {Q5, Q6}, [R6], R12
-    VQSHL.S32       Q2, Q2, #2
 
     VUZP.16         D10, D11
-    VQSHL.S32       Q3, Q3, #2
 
     VUZP.16         D12, D13
-    VQADD.S32       Q7, Q2, Q10
+    VMOV            Q7,Q2
 
     VREV64.16       Q5, Q5
-    VQADD.S32       Q3, Q3, Q10
 
     VREV64.16       Q6, Q6
-    VSHR.S32        Q7, Q7, #16
-
-    VUZP.16         D14, D15
-    VSHR.S32        Q3, Q3, #16
-
-    VUZP.16         D6, D7
-
-    VMOV            D15, D6
     VQSHL.S32       Q4, Q4, Q8
 
+    VMOV             Q9,Q3
+
     VLD2.32         {Q2, Q3}, [R8]!
     VQSHL.S32       Q15, Q15, Q8
 
@@ -428,72 +417,61 @@
     VUZP.16         D6, D7
     VQSUB.S32       Q11, Q15, Q11
 
-    VQSHL.S32       Q15, Q4, #2
+     VMOV            Q15,Q4
 
     VLD2.16         {D8, D9}, [R2]!
-    VQSHL.S32       Q11, Q11, #2
-
-    VQADD.S32       Q15, Q15, Q10
-    VQADD.S32       Q11, Q11, Q10
-
-    VSHR.S32        Q15, Q15, #16
-
-    VUZP.16         D30, D31
-    VSHR.S32        Q11, Q11, #16
-
-
-    VUZP.16         D22, D23
-    VMOV            D23, D30
 
 CORE_LOOP_PTO:
-    VST1.16         D14[0], [R0, : 16], R9
+
+    VST1.32         D14[0], [R0, :32], R9
+
+    VST1.32         D22[0], [R0, :32], R9
+
+    VST1.32         D14[1], [R0, :32], R9
+
+    VST1.32         D22[1], [R0, :32], R9
+
+    VST1.32         D15[0], [R0, :32], R9
+
+    VST1.32         D23[0], [R0, :32], R9
+
+    VST1.32         D15[1], [R0, :32], R9
+
+    VST1.32         D23[1], [R0, :32], R9
+
+    VST1.32         D18[0], [R5, :32], R10
+
+    VST1.32         D30[0], [R5, :32] ,R10
+
+    VST1.32         D18[1], [R5, :32], R10
+
+    VST1.32         D30[1], [R5, :32], R10
+
+    VST1.32         D19[0], [R5, :32], R10
+
+    VST1.32         D31[0], [R5, :32], R10
+
+    VST1.32         D19[1], [R5, :32], R10
+
+    VST1.32         D31[1], [R5, :32], R10
+
     VMULL.U16       Q15, D0, D9
-
-    VST1.16         D22[0], [R0, : 16], R9
     VMULL.U16       Q14, D2, D8
-
-    VST1.16         D14[1], [R0, : 16], R9
     VMULL.U16       Q13, D0, D8
-
-    VST1.16         D22[1], [R0, : 16], R9
     VMULL.U16       Q12, D2, D9
-
-    VST1.16         D14[2], [R0, : 16], R9
     VSHR.U32        Q15, Q15, #16
-
-    VST1.16         D22[2], [R0, : 16], R9
     VSHR.U32        Q14, Q14, #16
-
-    VST1.16         D14[3], [R0, : 16], R9
     VMLAL.S16       Q15, D1, D9
-
-    VST1.16         D22[3], [R0, : 16], R9
     VMLAL.S16       Q14, D3, D8
-
-    VST1.16         D15[0], [R5, : 16], R10
     VSHR.U32        Q13, Q13, #16
-
-    VST1.16         D23[0], [R5, : 16], R10
     VSHR.U32        Q12, Q12, #16
-
-    VST1.16         D15[1], [R5, : 16], R10
     VMLAL.S16       Q13, D1, D8
-
-    VST1.16         D23[1], [R5, : 16], R10
     VMLAL.S16       Q12, D3, D9
 
-    VST1.16         D15[2], [R5, : 16], R10
     VADD.I32        Q15, Q15, Q14
-
-    VST1.16         D23[2], [R5, : 16], R10
     VNEG.S32        Q15, Q15
-
-    VST1.16         D15[3], [R5, : 16], R10
-
-    VST1.16         D23[3], [R5, : 16], R10
     VSUB.I32        Q14, Q12, Q13
 
-
     VMOV            Q13, Q15
     VMULL.U16       Q11, D4, D8
 
@@ -501,6 +479,7 @@
 
     VUZP.16         D24, D25
 
+    VMOV.S16        D18, #50
 
     VUZP.16         D26, D27
     VMULL.U16       Q1, D24, D18
@@ -660,28 +639,21 @@
     VMLAL.S16       Q15, D15, D10
 
     VLD2.32         {Q5, Q6}, [R6], R12
-    VQSHL.S32       Q2, Q2, #2
 
     VUZP.16         D10, D11
-    VQSHL.S32       Q3, Q3, #2
 
     VUZP.16         D12, D13
-    VQADD.S32       Q7, Q2, Q10
+    VMOV             Q7 , Q2
 
     VREV64.16       Q5, Q5
-    VQADD.S32       Q3, Q3, Q10
 
     VREV64.16       Q6, Q6
-    VSHR.S32        Q7, Q7, #16
 
-    VUZP.16         D14, D15
-    VSHR.S32        Q3, Q3, #16
 
-    VUZP.16         D6, D7
-
-    VMOV            D15, D6
     VQSHL.S32       Q4, Q4, Q8
 
+    VMOV            Q9,Q3
+
     VLD2.32         {Q2, Q3}, [R8]!
     VQSHL.S32       Q15, Q15, Q8
 
@@ -691,22 +663,9 @@
     VUZP.16         D6, D7
     VQSUB.S32       Q11, Q15, Q11
 
-    VQSHL.S32       Q15, Q4, #2
+     VMOV            Q15,Q4
 
     VLD2.16         {D8, D9}, [R2]!
-    VQSHL.S32       Q11, Q11, #2
-
-    VQADD.S32       Q15, Q15, Q10
-    VQADD.S32       Q11, Q11, Q10
-
-    VSHR.S32        Q15, Q15, #16
-
-    VUZP.16         D30, D31
-    VSHR.S32        Q11, Q11, #16
-
-
-    VUZP.16         D22, D23
-    VMOV            D23, D30
 
     SUBS            R3, R3, #1
     BNE             CORE_LOOP_PTO
@@ -717,54 +676,57 @@
 
 EPILOGUE:
 
-    VST1.16         D14[0], [R0], R9
+    VST1.32         D14[0], [R0], R9
+
+    VST1.32         D22[0], [R0], R9
+
+    VST1.32         D14[1], [R0], R9
+
+    VST1.32         D22[1], [R0], R9
+
+    VST1.32         D15[0], [R0], R9
+
+    VST1.32         D23[0], [R0], R9
+
+    VST1.32         D15[1], [R0], R9
+
+    VST1.32         D23[1], [R0], R9
+
+    VST1.32         D18[0], [R5], R10
+
+    VST1.32         D30[0], [R5], R10
+
+    VST1.32         D18[1], [R5], R10
+
+    VST1.32         D30[1], [R5], R10
+
+    VST1.32         D19[0], [R5], R10
+
+    VST1.32         D31[0], [R5], R10
+
+    VST1.32         D19[1], [R5], R10
+
+    VST1.32         D31[1], [R5], R10
+
     VMULL.U16       Q15, D0, D9
-
-    VST1.16         D22[0], [R0], R9
     VMULL.U16       Q14, D2, D8
-
-    VST1.16         D14[1], [R0], R9
     VMULL.U16       Q13, D0, D8
-
-    VST1.16         D22[1], [R0], R9
     VMULL.U16       Q12, D2, D9
-
-    VST1.16         D14[2], [R0], R9
     VSHR.U32        Q15, Q15, #16
-
-    VST1.16         D22[2], [R0], R9
     VSHR.U32        Q14, Q14, #16
-
-    VST1.16         D14[3], [R0], R9
     VMLAL.S16       Q15, D1, D9
-
-    VST1.16         D22[3], [R0], R9
     VMLAL.S16       Q14, D3, D8
-
-    VST1.16         D15[0], [R5], R10
     VSHR.U32        Q13, Q13, #16
-
-    VST1.16         D23[0], [R5], R10
     VSHR.U32        Q12, Q12, #16
-
-    VST1.16         D15[1], [R5], R10
     VMLAL.S16       Q13, D1, D8
-
-    VST1.16         D23[1], [R5], R10
-    VMLAL.S16       Q12, D3, D9
-
-    VST1.16         D15[2], [R5], R10
+	VMLAL.S16       Q12, D3, D9
     VADD.I32        Q15, Q15, Q14
-
-    VST1.16         D23[2], [R5], R10
-    VNEG.S32        Q15, Q15
-
-    VST1.16         D15[3], [R5], R10
+	VNEG.S32        Q15, Q15
 
 
-    VST1.16         D23[3], [R5], R10
     VSUB.I32        Q14, Q12, Q13
 
+    VMOV.S16        D18, #50
 
     VMULL.U16       Q11, D4, D8
     VMOV            Q13, Q15
@@ -925,22 +887,10 @@
 
     VMLAL.S16       Q15, D15, D10
 
-    VQSHL.S32       Q2, Q2, #2
 
-    VQSHL.S32       Q3, Q3, #2
 
     VQADD.S32       Q7, Q2, Q10
 
-    VQADD.S32       Q3, Q3, Q10
-
-    VSHR.S32        Q7, Q7, #16
-
-    VUZP.16         D14, D15
-    VSHR.S32        Q3, Q3, #16
-
-    VUZP.16         D6, D7
-
-    VMOV            D15, D6
     VQSHL.S32       Q4, Q4, Q8
 
     VQSHL.S32       Q15, Q15, Q8
@@ -949,40 +899,24 @@
 
     VQSUB.S32       Q11, Q15, Q11
 
-    VQSHL.S32       Q15, Q4, #2
+    VMOV             Q15 , Q4
 
-    VQSHL.S32       Q11, Q11, #2
-
-    VQADD.S32       Q15, Q15, Q10
-    VQADD.S32       Q11, Q11, Q10
-
-    VSHR.S32        Q15, Q15, #16
-
-    VUZP.16         D30, D31
-    VSHR.S32        Q11, Q11, #16
-
-    VUZP.16         D22, D23
-    VMOV            D23, D30
-
-
-
-
-    VST1.16         D14[0], [R0], R9
-    VST1.16         D22[0], [R0], R9
-    VST1.16         D14[1], [R0], R9
-    VST1.16         D22[1], [R0], R9
-    VST1.16         D14[2], [R0], R9
-    VST1.16         D22[2], [R0], R9
-    VST1.16         D14[3], [R0], R9
-    VST1.16         D22[3], [R0], R9
-    VST1.16         D15[0], [R5], R10
-    VST1.16         D23[0], [R5], R10
-    VST1.16         D15[1], [R5], R10
-    VST1.16         D23[1], [R5], R10
-    VST1.16         D15[2], [R5], R10
-    VST1.16         D23[2], [R5], R10
-    VST1.16         D15[3], [R5], R10
-    VST1.16         D23[3], [R5], R10
+    VST1.32         D14[0], [R0], R9
+    VST1.32         D22[0], [R0], R9
+    VST1.32         D14[1], [R0], R9
+    VST1.32         D22[1], [R0], R9
+    VST1.32         D15[0], [R0], R9
+    VST1.32         D23[0], [R0], R9
+    VST1.32         D15[1], [R0], R9
+    VST1.32         D23[1], [R0], R9
+    VST1.32         D6[0], [R5], R10
+    VST1.32         D30[0], [R5], R10
+    VST1.32         D6[1], [R5], R10
+    VST1.32         D30[1], [R5], R10
+    VST1.32         D7[0], [R5], R10
+    VST1.32         D31[0], [R5], R10
+    VST1.32         D7[1], [R5], R10
+    VST1.32         D31[1], [R5], R10
 
 ARM_EPILOGUE:
 
@@ -1212,22 +1146,10 @@
 
     VMLAL.S16       Q15, D15, D10
 
-    VQSHL.S32       Q2, Q2, #2
 
-    VQSHL.S32       Q3, Q3, #2
 
-    VQADD.S32       Q7, Q2, Q10
+    VMOV           Q7 , Q2
 
-    VQADD.S32       Q3, Q3, Q10
-
-    VSHR.S32        Q7, Q7, #16
-
-    VUZP.16         D14, D15
-    VSHR.S32        Q3, Q3, #16
-
-    VUZP.16         D6, D7
-
-    VMOV            D15, D6
     VQSHL.S32       Q4, Q4, Q8
 
     VQSHL.S32       Q15, Q15, Q8
@@ -1236,39 +1158,26 @@
 
     VQSUB.S32       Q11, Q15, Q11
 
-    VQSHL.S32       Q15, Q4, #2
-
-    VQSHL.S32       Q11, Q11, #2
-
-    VQADD.S32       Q15, Q15, Q10
-    VQADD.S32       Q11, Q11, Q10
-
-    VSHR.S32        Q15, Q15, #16
-
-    VUZP.16         D30, D31
-    VSHR.S32        Q11, Q11, #16
-
-    VUZP.16         D22, D23
-    VMOV            D23, D30
+     VMOV            Q15, Q4
 
 
 
 
-    VST1.16         D14[0], [R0], R9
-    VST1.16         D22[0], [R0], R9
-    VST1.16         D14[1], [R0], R9
-    VST1.16         D22[1], [R0], R9
-    VST1.16         D14[2], [R0], R9
-    VST1.16         D22[2], [R0], R9
-    VST1.16         D14[3], [R0], R9
+    VST1.32         D14[0], [R0], R9
+    VST1.32         D22[0], [R0], R9
+    VST1.32         D14[1], [R0], R9
+    VST1.32         D22[1], [R0], R9
+    VST1.32         D15[0], [R0], R9
+    VST1.32         D23[0], [R0], R9
+    VST1.32         D15[1], [R0], R9
 
-    VST1.16         D15[0], [R5], R10
-    VST1.16         D23[0], [R5], R10
-    VST1.16         D15[1], [R5], R10
-    VST1.16         D23[1], [R5], R10
-    VST1.16         D15[2], [R5], R10
-    VST1.16         D23[2], [R5], R10
-    VST1.16         D15[3], [R5], R10
+    VST1.32         D6[0], [R5], R10
+    VST1.32         D30[0], [R5], R10
+    VST1.32         D6[1], [R5], R10
+    VST1.32         D30[1], [R5], R10
+    VST1.32         D7[0], [R5], R10
+    VST1.32         D31[0], [R5], R10
+    VST1.32         D7[1], [R5], R10
 
     VPOP            {d8 - d15}
     LDMFD           sp!, {R4-R12}
diff --git a/decoder/armv8/ixheaacd_function_selector_armv8.c b/decoder/armv8/ixheaacd_function_selector_armv8.c
index 351e472..8cb4067 100644
--- a/decoder/armv8/ixheaacd_function_selector_armv8.c
+++ b/decoder/armv8/ixheaacd_function_selector_armv8.c
@@ -74,7 +74,7 @@
  WORD16) = &ixheaacd_covariance_matrix_calc_2_dec;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_armv8;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -159,13 +159,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_armv8;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_armv8;
 
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_armv8;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -173,11 +173,11 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_dec;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_dec;
 
 VOID(*ixheaacd_overlap_out_copy)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
  const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_dec;
 
 VOID(*ixheaacd_pretwiddle_compute)
@@ -193,18 +193,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec;
@@ -213,14 +201,9 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec;
-
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
@@ -246,4 +229,4 @@
 VOID(*ixheaacd_scale_factor_process)
 (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width,
  WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type,
- WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv8;
\ No newline at end of file
+ WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv8;
diff --git a/decoder/armv8/ixheaacd_no_lap1.s b/decoder/armv8/ixheaacd_no_lap1.s
index d339879..1c71f42 100644
--- a/decoder/armv8/ixheaacd_no_lap1.s
+++ b/decoder/armv8/ixheaacd_no_lap1.s
@@ -53,71 +53,60 @@
     ADD             X6, X6, X0
     MOV             X8, #-16
     SUB             X6, X6, #12
-    LSL             X7, X3, #1
+    LSL             X7, X3, #2
     DUP             V31.4S, W2
-    MOV             W4, #0x8000
-    DUP             V30.4S, W4
+
 
     LD1             {V0.4S}, [X6], X8
     SQNEG           V0.4S, V0.4S
 
     LD1             {V6.4S}, [X6], X8
     SQSHL           V25.4S, V0.4S, V31.4S
-    SQADD           V24.4S, V25.4S, V30.4S
-    SSHR            V23.4S, V24.4S, #16
-    REV64           V23.4S, V23.4S
+
+    REV64           V25.4S, V25.4S
     SUB             X5, X5, #8
 
-    UZP1            V27.8H, V23.8H, V23.8H
     SQNEG           V29.4S, V6.4S
 
 LOOP_1:
 
-    ST1             {V27.H}[2], [X1], X7
+    ST1             {V25.S}[2], [X1], X7
     SQSHL           V22.4S, V29.4S, V31.4S
     LD1             {V0.4S}, [X6], X8
-    ST1             {V27.H}[3], [X1], X7
-    SQADD           V21.4S, V22.4S, V30.4S
-    ST1             {V27.H}[0], [X1], X7
+    ST1             {V25.S}[3], [X1], X7
+    ST1             {V25.S}[0], [X1], X7
     SQNEG           V0.4S, V0.4S
-    ST1             {V27.H}[1], [X1], X7
-    SSHR            V20.4S, V21.4S, #16
-    REV64           V20.4S, V20.4S
+    ST1             {V25.S}[1], [X1], X7
+    REV64           V22.4S, V22.4S
     SUBS            X5, X5, #8
 
 
-    UZP1            V27.8H, V20.8H, V20.8H
     SQSHL           V25.4S, V0.4S, V31.4S
-    ST1             {V27.H}[2], [X1], X7
+    ST1             {V22.S}[2], [X1], X7
     LD1             {V6.4S}, [X6], X8
-    SQADD           V24.4S, V25.4S, V30.4S
-    ST1             {V27.H}[3], [X1], X7
-    SSHR            V23.4S, V24.4S, #16
-    ST1             {V27.H}[0], [X1], X7
-    REV64           V23.4S, V23.4S
-    ST1             {V27.H}[1], [X1], X7
+    ST1             {V22.S}[3], [X1], X7
+    ST1             {V22.S}[0], [X1], X7
+    REV64           V25.4S, V25.4S
+    ST1             {V22.S}[1], [X1], X7
 
 
-    UZP1            V27.8H, V23.8H, V23.8H
     SQNEG           V29.4S, V6.4S
 
     BGT             LOOP_1
 
-    ST1             {V27.H}[2], [X1], X7
+    ST1             {V25.S}[2], [X1], X7
     SQSHL           V22.4S, V29.4S, V31.4S
-    ST1             {V27.H}[3], [X1], X7
-    ST1             {V27.H}[0], [X1], X7
-    SQADD           V21.4S, V22.4S, V30.4S
-    ST1             {V27.H}[1], [X1], X7
-    SSHR            V20.4S, V21.4S, #16
+    ST1             {V25.S}[3], [X1], X7
+    ST1             {V25.S}[0], [X1], X7
 
-    REV64           V20.4S, V20.4S
+    ST1             {V25.S}[1], [X1], X7
 
-    UZP1            V27.8H, V20.8H, V20.8H
+    REV64            V22.4S, V22.4S
 
-    ST1             {V27.H}[2], [X1], X7
-    ST1             {V27.H}[3], [X1], X7
-    ST1             {V27.H}[0], [X1], X7
-    ST1             {V27.H}[1], [X1], X7
+
+    ST1             {V22.S}[2], [X1], X7
+    ST1             {V22.S}[3], [X1], X7
+    ST1             {V22.S}[0], [X1], X7
+    ST1             {V22.S}[1], [X1], X7
     pop_v_regs
     RET
diff --git a/decoder/armv8/ixheaacd_overlap_add1.s b/decoder/armv8/ixheaacd_overlap_add1.s
index 14f5402..844effc 100644
--- a/decoder/armv8/ixheaacd_overlap_add1.s
+++ b/decoder/armv8/ixheaacd_overlap_add1.s
@@ -47,6 +47,7 @@
 .global ixheaacd_over_lap_add1_armv8
 ixheaacd_over_lap_add1_armv8:
     push_v_regs
+    LSL             X6 , X6 , #1
     LSL             X10, X5, #1
     SUB             X11, X10, #1
     LSL             X10, X11, #2
@@ -58,11 +59,9 @@
     MOV             X12, #-16
     DUP             V11.8H, W4
     LD1             {V3.4S}, [X10], X12
-    MOV             W7, #0x2000
 
     NEG             W7, W7
     SQNEG           V0.4S, V3.4S
-    DUP             V10.4S, W7
     UZP1            V31.8H, V0.8H, V0.8H
     UZP2            V30.8H, V0.8H, V0.8H
     REV64           V31.8h, V31.8h
@@ -105,12 +104,7 @@
     SQXTN2          V28.4S, V29.2D
     MOV             V14.16B, V28.16B
 
-    SQADD           V14.4S, V14.4S, V10.4S
     SQSUB           V13.4S, V15.4S, V14.4S
-    SQSHL           V13.4S, V13.4S, #2
-    SSHR            V13.4S, V13.4S, #16
-    UZP1            V26.8H, V13.8H, V13.8H
-
     UMULL           V12.4S, V31.4H, V3.4H
     USHR            V12.4S, V12.4S, #16
     SMLAL           V12.4S, V30.4H, V3.4H
@@ -124,8 +118,6 @@
     SQXTN2          V28.4S, V29.2D
     MOV             V8.16B, V28.16B
 
-    SQADD           V8.4S, V8.4S, V10.4S
-
     SQNEG           V0.4S, V3.4S
     UZP1            V1.8H, V0.8H, V0.8H
     UZP2            V0.8H, V0.8H, V0.8H
@@ -136,12 +128,9 @@
     UZP2            V6.8H, V3.8H, V3.8H
     REV64           V7.8h, V7.8h
     REV64           V6.8h, V6.8h
-    SQSHL           V9.4S, V9.4S, #2
     LD2             {V2.4H, V3.4H}, [X8], X12
-    SSHR            V9.4S, V9.4S, #16
     REV64           V2.4H, V2.4H
     REV64           V3.4H, V3.4H
-    UZP1            V18.8H, V9.8H, V9.8H
 
     LD1             {V4.4S}, [X1], #16
     SUB             W5, W5, #8
@@ -149,21 +138,21 @@
 
 LOOP_1:
 
-    ST1             {V26.H}[0], [X11], X4
+    ST1             {V13.S}[0], [X11], X4
     UMULL           V15.4S, V7.4H, V2.4H
-    ST1             {V26.H}[1], [X11], X4
+    ST1             {V13.S}[1], [X11], X4
     UMULL           V12.4S, V1.4H, V3.4H
-    ST1             {V26.H}[2], [X11], X4
+    ST1             {V13.S}[2], [X11], X4
     USHR            V15.4S, V15.4S, #16
-    ST1             {V26.H}[3], [X11], X4
+    ST1             {V13.S}[3], [X11], X4
     USHR            V12.4S, V12.4S, #16
-    ST1             {V18.H}[0], [X6], X9
+    ST1             {V9.S}[0], [X6], X9
     SMLAL           V15.4S, V6.4H, V2.4H
-    ST1             {V18.H}[1], [X6], X9
+    ST1             {V9.S}[1], [X6], X9
     SMLAL           V12.4S, V0.4H, V3.4H
-    ST1             {V18.H}[2], [X6], X9
+    ST1             {V9.S}[2], [X6], X9
     SQSHL           V15.4S, V15.4S, V11.4S
-    ST1             {V18.H}[3], [X6], X9
+    ST1             {V9.S}[3], [X6], X9
     SQSHL           V12.4S, V12.4S, V11.4S
     LD1             {V6.4S}, [X10], X12
 
@@ -187,12 +176,10 @@
 
     LD1             {V4.4S}, [X1], #16
 
-    SQADD           V14.4S, V14.4S, V10.4S
     UZP1            V1.8H, V0.8H, V0.8H
     UZP2            V0.8H, V0.8H, V0.8H
     REV64           V1.8h, V1.8h
     REV64           V0.8h, V0.8h
-    SQADD           V8.4S, V8.4S, V10.4S
     UZP1            V7.8H, V6.8H, V6.8H
     UZP2            V6.8H, V6.8H, V6.8H
     REV64           V7.8h, V7.8h
@@ -201,27 +188,21 @@
     REV64           V2.4H, V2.4H
     REV64           V3.4H, V3.4H
     SQSUB           V9.4S, V12.4S, V8.4S
-    SQSHL           V13.4S, V13.4S, #2
-    SQSHL           V9.4S, V9.4S, #2
     UMULL           V15.4S, V7.4H, V2.4H
-    SSHR            V13.4S, V13.4S, #16
-    UZP1            V26.8H, V13.8H, V13.8H
-    SSHR            V9.4S, V9.4S, #16
-    ST1             {V26.H}[0], [X11], X4
+    ST1             {V13.S}[0], [X11], X4
     UMULL           V12.4S, V1.4H, V3.4H
-    UZP1            V18.8H, V9.8H, V9.8H
     USHR            V15.4S, V15.4S, #16
-    ST1             {V26.H}[1], [X11], X4
+    ST1             {V13.S}[1], [X11], X4
     SMLAL           V15.4S, V6.4H, V2.4H
-    ST1             {V26.H}[2], [X11], X4
+    ST1             {V13.S}[2], [X11], X4
     USHR            V12.4S, V12.4S, #16
-    ST1             {V26.H}[3], [X11], X4
+    ST1             {V13.S}[3], [X11], X4
     SMLAL           V12.4S, V0.4H, V3.4H
-    ST1             {V18.H}[0], [X6], X9
+    ST1             {V9.S}[0], [X6], X9
     SQSHL           V15.4S, V15.4S, V11.4S
-    ST1             {V18.H}[1], [X6], X9
+    ST1             {V9.S}[1], [X6], X9
     SQSHL           V12.4S, V12.4S, V11.4S
-    ST1             {V18.H}[2], [X6], X9
+    ST1             {V9.S}[2], [X6], X9
 
     SSHLL           V27.4S, V3.4H, #0
     SMULL           V28.2D, V27.2S, V4.2S
@@ -230,7 +211,7 @@
     SQXTN2          V28.4S, V29.2D
     MOV             V14.16B, V28.16B
 
-    ST1             {V18.H}[3], [X6], X9
+    ST1             {V9.S}[3], [X6], X9
 
 
     SSHLL           V27.4S, V2.4H, #0
@@ -241,7 +222,6 @@
     MOV             V8.16B, V28.16B
 
     LD1             {V3.4S}, [X10], X12
-    SQADD           V14.4S, V14.4S, V10.4S
 
     SQNEG           V0.4S, V3.4S
     UZP1            V1.8H, V0.8H, V0.8H
@@ -253,39 +233,35 @@
     UZP2            V6.8H, V3.8H, V3.8H
     REV64           V7.8H, V7.8H
     REV64           V6.8H, V6.8H
-    SQADD           V8.4S, V8.4S, V10.4S
+
     LD2             {V2.4H, V3.4H}, [X8], X12
     SQSUB           V9.4S, V12.4S, V8.4S
     REV64           V2.4H, V2.4H
     REV64           V3.4H, V3.4H
-    SQSHL           V13.4S, V13.4S, #2
+
     LD1             {V4.4S}, [X1], #16
 
-    SQSHL           V9.4S, V9.4S, #2
-    SSHR            V13.4S, V13.4S, #16
+
     SUBS            X5, X5, #8
-    SSHR            V9.4S, V9.4S, #16
-    UZP1            V26.8H, V13.8H, V13.8H
-    UZP1            V18.8H, V9.8H, V9.8H
 
     BGT             LOOP_1
 
-    ST1             {V26.H}[0], [X11], X4
+    ST1             {V13.S}[0], [X11], X4
     UMULL           V15.4S, V7.4H, V2.4H
-    ST1             {V26.H}[1], [X11], X4
+    ST1             {V13.S}[1], [X11], X4
     UMULL           V12.4s, V1.4H, V3.4H
-    ST1             {V26.H}[2], [X11], X4
+    ST1             {V13.S}[2], [X11], X4
     USHR            V15.4S, V15.4S, #16
-    ST1             {V26.H}[3], [X11], X4
+    ST1             {V13.S}[3], [X11], X4
     USHR            V12.4S, V12.4S, #16
 
-    ST1             {V18.H}[0], [X6], X9
+    ST1             {V9.S}[0], [X6], X9
     SMLAL           V15.4S, V6.4H, V2.4H
-    ST1             {V18.H}[1], [X6], X9
+    ST1             {V9.S}[1], [X6], X9
     SMLAL           V12.4S, V0.4H, V3.4H
-    ST1             {V18.H}[2], [X6], X9
+    ST1             {V9.S}[2], [X6], X9
     SQSHL           V15.4S, V15.4S, V11.4S
-    ST1             {V18.H}[3], [X6], X9
+    ST1             {V9.S}[3], [X6], X9
     SQSHL           V12.4S, V12.4S, V11.4S
 
 
@@ -303,28 +279,20 @@
     SQXTN2          V28.4S, V29.2D
     MOV             V8.16B, V28.16B
 
-    SQADD           V14.4S, V14.4S, V10.4S
-    SQADD           V8.4S, V8.4S, V10.4S
+
     SQSUB           V13.4S, V15.4S, V14.4S
     SQSUB           V9.4S, V12.4S, V8.4S
-    SQSHL           V13.4S, V13.4S, #2
-    SQSHL           V9.4S, V9.4S, #2
-    SSHR            V13.4S, V13.4S, #16
-    SSHR            V9.4S, V9.4S, #16
-    UZP1            V26.8H, V13.8H, V13.8H
-
-    UZP1            V18.8H, V9.8H, V9.8H
 
 
-    ST1             {V26.H}[0], [X11], X4
-    ST1             {V26.H}[1], [X11], X4
-    ST1             {V26.H}[2], [X11], X4
-    ST1             {V26.H}[3], [X11], X4
+    ST1             {V13.S}[0], [X11], X4
+    ST1             {V13.S}[1], [X11], X4
+    ST1             {V13.S}[2], [X11], X4
+    ST1             {V13.S}[3], [X11], X4
 
-    ST1             {V18.H}[0], [X6], X9
-    ST1             {V18.H}[1], [X6], X9
-    ST1             {V18.H}[2], [X6], X9
-    ST1             {V18.H}[3], [X6], X9
+    ST1             {V9.S}[0], [X6], X9
+    ST1             {V9.S}[1], [X6], X9
+    ST1             {V9.S}[2], [X6], X9
+    ST1             {V9.S}[3], [X6], X9
     pop_v_regs
     RET
 
diff --git a/decoder/armv8/ixheaacd_post_twiddle_overlap.s b/decoder/armv8/ixheaacd_post_twiddle_overlap.s
index b8ee331..f05e6e4 100644
--- a/decoder/armv8/ixheaacd_post_twiddle_overlap.s
+++ b/decoder/armv8/ixheaacd_post_twiddle_overlap.s
@@ -1,43 +1,43 @@
 .macro push_v_regs
-    stp             q8, q9, [sp, #-32]!
-    stp             q10, q11, [sp, #-32]!
-    stp             q12, q13, [sp, #-32]!
-    stp             q14, q15, [sp, #-32]!
+    stp       q8, q9, [sp, #-32]!
+    stp       q10, q11, [sp, #-32]!
+    stp       q12, q13, [sp, #-32]!
+    stp       q14, q15, [sp, #-32]!
 //st1 { v8.2d,  v9.2d, v10.2d, v11.2d}, [sp, #-64]!
 //st1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp, #-64]!
-    stp             X8, X9, [sp, #-16]!
-    stp             X10, X11, [sp, #-16]!
-    stp             X12, X13, [sp, #-16]!
-    stp             X14, X15, [sp, #-16]!
-    stp             X16, X17, [sp, #-16]!
-    stp             X18, X19, [sp, #-16]!
-    stp             X20, X21, [sp, #-16]!
-    stp             X22, X23, [sp, #-16]!
-    stp             X24, X25, [sp, #-16]!
-    stp             X26, X27, [sp, #-16]!
-    stp             X28, X29, [sp, #-16]!
-    stp             X30, X29, [sp, #-16]!
+    stp       X8, X9, [sp, #-16]!
+    stp       X10, X11, [sp, #-16]!
+    stp       X12, X13, [sp, #-16]!
+    stp       X14, X15, [sp, #-16]!
+  stp       X16, X17, [sp, #-16]!
+  stp       X18, X19, [sp, #-16]!
+  stp       X20, X21, [sp, #-16]!
+  stp       X22, X23, [sp, #-16]!
+  stp       X24, X25, [sp, #-16]!
+  stp       X26, X27, [sp, #-16]!
+  stp       X28, X29, [sp, #-16]!
+  stp       X30, X29, [sp, #-16]!
 .endm
 
 .macro pop_v_regs
-    ldp             X30, X29, [sp], #16
-    ldp             X28, X29, [sp], #16
-    ldp             X26, X27, [sp], #16
-    ldp             X24, X25, [sp], #16
-    ldp             X22, X23, [sp], #16
-    ldp             X20, X21, [sp], #16
-    ldp             X18, X19, [sp], #16
-    ldp             X16, X17, [sp], #16
-    ldp             X14, X15, [sp], #16
-    ldp             X12, X13, [sp], #16
-    ldp             X10, X11, [sp], #16
-    ldp             X8, X9, [sp], #16
+    ldp       X30, X29, [sp], #16
+    ldp       X28, X29, [sp], #16
+    ldp       X26, X27, [sp], #16
+    ldp       X24, X25, [sp], #16
+    ldp       X22, X23, [sp], #16
+    ldp       X20, X21, [sp], #16
+    ldp       X18, X19, [sp], #16
+    ldp       X16, X17, [sp], #16
+    ldp       X14, X15, [sp], #16
+    ldp       X12, X13, [sp], #16
+    ldp       X10, X11, [sp], #16
+    ldp       X8, X9, [sp], #16
 //ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp], #64
 //ld1 { v8.2d,  v9.2d, v10.2d, v11.2d}, [sp], #64
-    ldp             q14, q15, [sp], #32
-    ldp             q12, q13, [sp], #32
-    ldp             q10, q11, [sp], #32
-    ldp             q8, q9, [sp], #32
+    ldp       q14, q15, [sp], #32
+    ldp       q12, q13, [sp], #32
+    ldp       q10, q11, [sp], #32
+    ldp       q8, q9, [sp], #32
 .endm
 
 
@@ -48,18 +48,18 @@
 ixheaacd_post_twid_overlap_add_armv8:
 
     // STMFD sp!, {x4-x12}
-    push_v_regs
-    //stp x19, x20,[sp,#-16]!
+  push_v_regs
+  //stp x19, x20,[sp,#-16]!
     //VPUSH           {d8 - d15}
 
     //LDR w4,  [sp, #100]
-    //sxtw x4,w4
+  //sxtw x4,w4
     //LDR w5,  [sp, #104]
-    //sxtw x5,w5
+  //sxtw x5,w5
     //LDR w6,  [sp, #108]
-    //sxtw x6,w6
-    MOV             x16, x5
-    MOV             x17, x7
+  //sxtw x6,w6
+  MOV        x16, x5
+  MOV        x17, x7
     LSL             x9, x3, #2
     ASR             x9, x9, #1
     ADD             x6, x6, x9
@@ -71,141 +71,141 @@
 
 
 
-    movi            v18.4h, #50
-    sub             x20, x5, #15
-    neg             x9, x20
-    movi            v20.4s, #0x80, LSL #8
-    dup             v16.4s, w5
+    movi  v18.4h, #50
+  sub x20, x5, #15
+  neg x9, x20
+    movi  v20.4s, #0x00, LSL #8
+    dup  v16.4s,w5
     SUB             x5, x5, #16
     //STR w5,  [sp, #116]
-    MOV             w25, w5
-    sxtw            x25, w25
+  MOV        w25, w5
+  sxtw x25,w25
     MOV             x8, #1
     LSL             x8, x8, x9
     //STR w8,  [sp, #120]
-    MOV             w26, w8
+  MOV        w26, w8
 
-    //sxtw x8,w8
+  //sxtw x8,w8
 
 
 ARM_PROLOGUE:
 
 
-    LDR             w8, [x1], #4
-    sxtw            x8, w8
-    LDR             w9, [x1], #4
-    sxtw            x9, w9
+    LDR w8,  [x1], #4
+  sxtw x8,w8
+    LDR w9,  [x1], #4
+  sxtw x9,w9
 
-    LDR             w10, [x2], #4
-    sxtw            x10, w10
+    LDR w10,  [x2], #4
+  sxtw x10,w10
 
-    AND             w19, w10, 0xFFFF
-    sxth            x19, w19
-    ASR             w10, w10, #16
+  AND        w19,w10,0xFFFF
+  sxth      x19,w19
+  ASR        w10,w10,#16
 //    SMULWT          x11, x8, x10
 //
-//    SMULWB          x12, x9, x10
+//  SMULWB          x12, x9, x10
 //    SMULWB          x5, x8, x10
 //    SMLAWT          x7, x9, x10, x5
 
-    SMULL           x11, w8, w10
-    ASR             x11, x11, #16
-    SMULL           x12, w9, w19
-    ASR             x12, x12, #16
-    SMULL           x5, w8, w19
-    ASR             x5, x5, #16
-    SMULL           x7, w9, w10
-    ASR             x7, x7, #16
-    ADD             x7, x7, x5
+  SMULL          x11, w8, w10
+  ASR        x11,x11,#16
+  SMULL          x12, w9, w19
+  ASR        x12,x12,#16
+    SMULL          x5, w8, w19
+  ASR        x5,x5,#16
+    SMULL      x7, w9, w10
+  ASR        x7, x7, #16
+  ADD        x7, x7, x5
 
-    SUB             x8, x12, x11
+  SUB             x8, x12, x11
     MVN             x5, x7
     ADD             x5, x5, #1
 
 
     MOV             x9, #50
     MOV             x12, #-50
-    AND             w19, w9, 0xFFFF
-    sxth            x19, w19
-    SMULL           x10, w5, w19
-    ASR             x10, x10, #16
-    AND             w19, w12, 0xFFFF
-    sxth            x19, w19
-    SMULL           x11, w8, w19
-    ASR             x11, x11, #16
+    AND        w19,w9,0xFFFF
+  sxth      x19,w19
+  SMULL          x10, w5, w19
+    ASR        x10,x10,#16
+  AND        w19,w12,0xFFFF
+  sxth      x19,w19
+  SMULL          x11, w8, w19
+  ASR        x11,x11,#16
 
-    ADD             x8, x8, x10
+  ADD             x8, x8, x10
     ADD             x5, x5, x11
 
     //LDR w11,  [sp, #104]
-    MOV             w11, w16
-    sxth            x11, w11
-    LDR             w10, [x6], #-32
-    sxtw            x10, w10
+  MOV    w11, w16
+  sxth x11,w11
+    LDR w10,  [x6], #-32
+  sxtw x10,w10
 
-    AND             w19, w10, 0xFFFF
-    sxth            x19, w19
-    ASR             w20, w10, #16
+  AND        w19,w10,0xFFFF
+  sxth      x19,w19
+  ASR        w20,w10,#16
 
     //SMULWB          x7, x8, x10
-    SMULL           x7, w8, w19
-    ASR             x7, x7, #16
-    MVN             x8, x8
+    SMULL      x7, w8, w19
+  ASR        x7, x7, #16
+  MVN             x8, x8
     ADD             x8, x8, #1
     //SMULWT          x12, x8, x10
-    SMULL           x12, w8, w20
-    ASR             x12, x12, #16
+  SMULL      x12, w8, w20
+  ASR        x12, x12, #16
 
     CMP             x11, #0
     BLT             NEXT
 
-    SUB             x9, x11, #16
-    negs            x9, x9
+    SUB            x9, x11, #16
+  negs      x9,x9
 
 
 
 
-    // LDR w8,  [sp, #120]
-    //sxtw x8,w8
-    MOV             v1.s[0], w26
-    MOV             v2.s[0], w5
+   // LDR w8,  [sp, #120]
+  //sxtw x8,w8
+  MOV      v1.s[0], w26
+  MOV      v2.s[0], w5
 
     //sQADD            w5, w5, w8
     //ASR             w5, w5, w9
 
-    SQADD           v2.2s, v2.2s, v1.2s
-    MOV             w5, v2.s[0]
-    ASR             w5, w5, w9
+  SQADD      v2.2s, v2.2s, v1.2s
+  MOV        w5, v2.s[0]
+  ASR             w5, w5, w9
 
-    SUB             x9, x11, #31
-    negs            x9, x9
-    ASR             x20, x7, x9
+    SUB            x9, x11, #31
+  negs      x9,x9
+  ASR        x20, x7, x9
     //MOV            x8, x20
-    ADDS            x8, x20, #0
-    BGE             NEXT2
-    CMN             x8, #1
+  ADDS      x8, x20, #0
+  BGE        NEXT2
+    CMN           x8, #1
 NEXT2:
     MOV             x20, #0x80000000
-    csel            x7, x20, x7, LT
+   csel x7, x20, x7,LT
     MOV             x20, #0x7fffffff
-    csel            x7, x20, x7, GT
-    LSL             x20, x7, x11
-    csel            x7, x20, x7, EQ
+   csel x7, x20, x7,GT
+    LSL x20, x7,  x11
+  csel x7,x20,x7,EQ
 
-    SUB             x9, x11, #31
-    negs            x9, x9
-    ASR             x20, x12, x9
+    SUB            x9, x11, #31
+  negs      x9,x9
+  ASR        x20, x12, x9
     //MOV            x8, x20
-    ADDS            x8, x20, #0
-    BGE             NEXT3
-    CMN             x8, #1
+  ADDS      x8, x20, #0
+  BGE        NEXT3
+  CMN           x8, #1
 NEXT3:
     MOV             x20, #0x80000000
-    csel            x12, x20, x12, LT
+   csel x12, x20, x12,LT
     MOV             x20, #0x7fffffff
-    csel            x12, x20, x12, GT
-    LSL             x20, x12, x11
-    csel            x12, x20, x12, EQ
+   csel x12, x20, x12,GT
+    LSL x20, x12,  x11
+  csel x12,x20,x12,EQ
 
     B               NEXT1
 NEXT:
@@ -214,83 +214,83 @@
     ASR             w5, w5, w11
     MOV             w8, #0x8000
 
-    MOV             v1.s[0], w8
-    MOV             v2.s[0], w5
+  MOV      v1.s[0], w8
+  MOV      v2.s[0], w5
 
     //QADD            x5, x5, x8
 
-    SQADD           v2.2s, v2.2s, v1.2s
-    MOV             w5, v2.s[0]
+  SQADD      v2.2s, v2.2s, v1.2s
+  MOV        w5, v2.s[0]
 
-    ASR             w5, w5, #16
+  ASR             w5, w5, #16
     ASR             w7, w7, w11
     ASR             w12, w12, w11
 
 NEXT1:
-    LDR             w9, [x4]
-    sxtw            x9, w9
+    LDR w9,  [x4]
+  sxtw x9,w9
     MOV             w8, #0x8000
-    //sxtw x8,w8
+  //sxtw x8,w8
 
-    STR             w5, [x4], #4
-    sxtw            x5, w5
+    STR w5,  [x4], #4
+  sxtw x5,w5
 
 
-    ROR             w20, w10, #16
+  ROR        w20, w10, #16
     //UXTH            x5, x10, ROR #16
-    UXTH            w5, w20
-    UXTH            w10, w10
+    UXTH      w5, w20
+  UXTH            w10, w10
 
 
-    dup             v0.2s, w9
-    dup             v2.2s, w10
-    dup             v3.2s, w5
+    dup  v0.2s,w9
+    dup  v2.2s,w10
+    dup  v3.2s,w5
     //VZIP.32         D2, D3
-    ZIP1            v28.2s, v2.2s, v3.2s
-    ZIP2            v3.2s, v2.2s, v3.2s
-    MOV             v2.8b, v28.8b
-    sMULL           v0.2d, v2.2s, v0.2s
-    Sqxtn           v8.2s, v0.2d
+    ZIP1    v28.2s, v2.2s, v3.2s
+  ZIP2    v3.2s, v2.2s, v3.2s
+  MOV      v2.8b, v28.8b
+  sMULL v0.2d, v2.2s, v0.2s
+    Sqxtn v8.2s,  v0.2d
 
 
-    dup             v0.2s, w12
-    dup             v1.2s, w7
+    dup  v0.2s,w12
+    dup  v1.2s,w7
 
     //VZIP.32         D0, D1
 
-    ZIP1            v28.2s, v0.2s, v1.2s
-    ZIP2            v1.2s, v0.2s, v1.2s
-    MOV             v0.8b, v28.8b
+    ZIP1    v28.2s, v0.2s, v1.2s
+  ZIP2    v1.2s, v0.2s, v1.2s
+  MOV      v0.8b, v28.8b
 
-    SQSUB           v8.2s, v0.2s , v8.2s
+    SQSUB  v8.2s,  v0.2s ,  v8.2s
 
 
-    sQshL           v8.2s, v8.2s, #2
-    dup             v0.2s, w8
-    SQADD           v8.2s, v8.2s , v0.2s
-    sshR            v8.2s, v8.2s, #16
+    //sQshL v8.2s, v8.2s,#2
+    dup  v0.2s,w8
+    //SQADD  v8.2s,  v8.2s ,  v0.2s
+    //sshR v8.2s, v8.2s,#16
 
 
 
-    MOV             x7, x17
-    //sxtw x7,w7
-    LSL             x10, x7, #1
+    MOV x7,  x17
+  //sxtw x7,w7
+    LSL             x10, x7, #2
 
     ASR             x5, x3, #1
     //SMULBB          x5, x10, x5
-    AND             w5, w5, 0xFFFF
-    sxth            x5, w5
-    AND             w19, w10, 0xFFFF
-    sxth            x19, w19
-    SMULL           x5, w19, w5
+    AND        w5,w5,0xFFFF
+    sxth      x5,w5
+  AND        w19,w10,0xFFFF
+  sxth      x19,w19
+  SMULL      x5, w19, w5
 
     ADD             x5, x5, x0
     SUB             x0, x5, x10
     MVN             x9, x10
     ADD             x9, x9, #1
 
-    ST1             {v8.h}[2], [x0], x9
-    ST1             {v8.h}[0], [x5], x10
+    ST1 {V8.S}[1],[x0], x9
+    ST1 {V8.S}[0],[x5], x10
 
 
     MOV             x8, x1
@@ -311,875 +311,799 @@
     ASR             x3, x3, #2
     SUB             x3, x3, #2
 
-    LD2             { v0.4s, v1.4s}, [x1]
-    MOV             v2.16b, v1.16b
-    ADD             x1, x1, x12
+    LD2 { v0.4s, v1.4s}, [x1]
+  MOV        v2.16b, v1.16b
+  ADD       x1, x1, x12
 
     //VUZP.16         D0, D1
-    UZP1            v28.8h, v0.8h, v0.8h
-    UZP2            v29.8h, v0.8h, v0.8h
-    MOV             v0.d[0], v28.d[0]
-    MOV             v0.d[1], v29.d[0]
+    UZP1      v28.8h, v0.8h, v0.8h
+  UZP2      v29.8h, v0.8h, v0.8h
+  MOV        v0.d[0], v28.d[0]
+  MOV        v0.d[1], v29.d[0]
 
-    //VUZP.16         D2, D3
+  //VUZP.16         D2, D3
 
-    UZP1            v28.8h, v2.8h, v2.8h
-    UZP2            v29.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v28.d[0]
-    MOV             v2.d[1], v29.d[0]
+  UZP1      v28.8h, v2.8h, v2.8h
+  UZP2      v29.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v28.d[0]
+  MOV        v2.d[1], v29.d[0]
 
 
     //rev64  v0.8h,  v0.8h
-    rev64           v0.8h, v0.8h
-    MOV             v1.d[0], v0.d[1]
-    rev64           v2.8h, v2.8h
-    MOV             v3.d[0], v2.d[1]
-    LD2             {v8.4h, v9.4h}, [x2]
-    ADD             x2, x2, #16
+  rev64  v0.8h,  v0.8h
+  MOV        v1.d[0], v0.d[1]
+    rev64  v2.8h,  v2.8h
+  MOV        v3.d[0], v2.d[1]
+    LD2 {v8.4h, v9.4h}, [x2]
+  ADD      x2, x2, #16
 
-    LD2             { v4.4s, v5.4s}, [x8]
-    MOV             v6.16b, v5.16b
-    ADD             x8, x8, #32
-    uMULL           v30.4s, v0.4h, v9.4h
+    LD2 { v4.4s, v5.4s}, [x8]
+  MOV      v6.16b, v5.16b
+  ADD x8, x8,#32
+    uMULL v30.4s, v0.4h, v9.4h
 
 //    VUZP.16         D4, D5
 
-    UZP1            v28.8h, v4.8h, v4.8h
-    UZP2            v29.8h, v4.8h, v4.8h
-    MOV             v4.d[0], v28.d[0]
-    MOV             v5.d[0], v29.d[0]
+  UZP1      v28.8h, v4.8h, v4.8h
+  UZP2      v29.8h, v4.8h, v4.8h
+  MOV        v4.d[0], v28.d[0]
+  MOV        v5.d[0], v29.d[0]
 
-    uMULL           v28.4s, v2.4h, v8.4h
+    uMULL v28.4s, v2.4h, v8.4h
 
 //    VUZP.16         D6, D7
-    UZP1            v26.8h, v6.8h, v6.8h
-    UZP2            v27.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v26.d[0]
-    MOV             v7.d[0], v27.d[0]
+  UZP1      v26.8h, v6.8h, v6.8h
+  UZP2      v27.8h, v6.8h, v6.8h
+  MOV        v6.d[0], v26.d[0]
+  MOV        v7.d[0], v27.d[0]
 
-    uMULL           v26.4s, v0.4h, v8.4h
+  uMULL v26.4s, v0.4h, v8.4h
 
 
-    uMULL           v24.4s, v2.4h, v9.4h
+    uMULL v24.4s, v2.4h, v9.4h
 
-    LD2             { v10.4s, v11.4s}, [x6]
-    MOV             v12.16b, v11.16b
-    ADD             x6, x6, x12
-    ushR            v30.4s, v30.4s, #16
+    LD2 { v10.4s, v11.4s}, [x6]
+    MOV      v12.16b, v11.16b
+  ADD  x6, x6, x12
+    ushR v30.4s, v30.4s,#16
 
     //VUZP.16         D10, D11
 
-    UZP1            v22.8h, v10.8h, v10.8h
-    UZP2            v23.8h, v10.8h, v10.8h
-    MOV             v10.d[0], v22.d[0]
-    MOV             v10.d[1], v23.d[0]
+  UZP1      v22.8h, v10.8h, v10.8h
+  UZP2      v23.8h, v10.8h, v10.8h
+  MOV        v10.d[0], v22.d[0]
+  MOV        v10.d[1], v23.d[0]
 
-    ushR            v28.4s, v28.4s, #16
+  ushR v28.4s, v28.4s,#16
 
     //VUZP.16         D12, D13
 
-    UZP1            v22.8h, v12.8h, v12.8h
-    UZP2            v23.8h, v12.8h, v12.8h
-    MOV             v12.d[0], v22.d[0]
-    MOV             v12.d[1], v23.d[0]
+  UZP1      v22.8h, v12.8h, v12.8h
+  UZP2      v23.8h, v12.8h, v12.8h
+  MOV        v12.d[0], v22.d[0]
+  MOV        v12.d[1], v23.d[0]
 
-    sMLAL           v30.4s, v1.4h, v9.4h
+  sMLAL v30.4s, v1.4h, v9.4h
 
-    rev64           v10.8h, v10.8h
-    MOV             v11.d[0], v10.d[1]
-    sMLAL           v28.4s, v3.4h, v8.4h
+    rev64  v10.8h,  v10.8h
+  MOV    v11.d[0], v10.d[1]
+    sMLAL v28.4s, v3.4h, v8.4h
 
-    rev64           v12.8h, v12.8h
-    MOV             v13.d[0], v12.d[1]
-    ushR            v26.4s, v26.4s, #16
+    rev64  v12.8h,  v12.8h
+  MOV    v13.d[0], v12.d[1]
+    ushR v26.4s, v26.4s,#16
 
 
-    ushR            v24.4s, v24.4s, #16
+    ushR v24.4s, v24.4s,#16
 
-    sMLAL           v26.4s, v1.4h, v8.4h
-    sMLAL           v24.4s, v3.4h, v9.4h
+    sMLAL v26.4s, v1.4h, v8.4h
+    sMLAL v24.4s, v3.4h, v9.4h
 
 
 
-    ADD             v30.4s, v30.4s , v28.4s
-    NEG             v30.4s, v30.4s
+    ADD  v30.4s,  v30.4s ,  v28.4s
+    NEG  v30.4s, v30.4s
 
-    uMULL           v22.4s, v4.4h, v8.4h
+    uMULL v22.4s, v4.4h, v8.4h
 
-    SUB             v28.4s, v24.4s , v26.4s
+    SUB  v28.4s,  v24.4s ,  v26.4s
 
 
-    mov             v26.16b, v30.16b
-    mov             v24.16b, v28.16b
+    mov  v26.16b, v30.16b
+    mov  v24.16b, v28.16b
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
 
 //    VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
-    uMULL           v2.4s, v24.4h, v18.4h
+    uMULL v2.4s, v24.4h, v18.4h
 
-    uMULL           v0.4s, v26.4h, v18.4h
+    uMULL v0.4s, v26.4h, v18.4h
 
-    ushR            v22.4s, v22.4s, #16
-    sMLAL           v22.4s, v5.4h, v8.4h
+    ushR v22.4s, v22.4s,#16
+    sMLAL v22.4s, v5.4h, v8.4h
 
-    ushR            v2.4s, v2.4s, #16
-    ushR            v0.4s, v0.4s, #16
-    sMLAL           v2.4s, v25.4h, v18.4h
-    sMLAL           v0.4s, v27.4h, v18.4h
+    ushR v2.4s, v2.4s,#16
+    ushR v0.4s, v0.4s,#16
+    sMLAL v2.4s, v25.4h, v18.4h
+    sMLAL v0.4s, v27.4h, v18.4h
 
-    uMULL           v24.4s, v4.4h, v9.4h
-    uMULL           v26.4s, v6.4h, v8.4h
+    uMULL v24.4s, v4.4h, v9.4h
+    uMULL v26.4s, v6.4h, v8.4h
 
-    NEG             v2.4s, v2.4s
-    ADD             v28.4s, v28.4s , v0.4s
-    ADD             v30.4s, v30.4s , v2.4s
+    NEG  v2.4s, v2.4s
+    ADD  v28.4s,  v28.4s ,  v0.4s
+    ADD  v30.4s,  v30.4s ,  v2.4s
 
-    uMULL           v0.4s, v6.4h, v9.4h
-    sshR            v24.4s, v24.4s, #16
-    sMLAL           v24.4s, v5.4h, v9.4h
-    sshR            v26.4s, v26.4s, #16
-    sshR            v0.4s, v0.4s, #16
-    sMLAL           v26.4s, v7.4h, v8.4h
-    sMLAL           v0.4s, v7.4h, v9.4h
+    uMULL v0.4s, v6.4h, v9.4h
+    sshR v24.4s, v24.4s,#16
+    sMLAL v24.4s, v5.4h, v9.4h
+    sshR v26.4s, v26.4s,#16
+    sshR v0.4s, v0.4s,#16
+    sMLAL v26.4s, v7.4h, v8.4h
+    sMLAL v0.4s, v7.4h, v9.4h
 
 
 
 
-    ADD             v22.4s, v22.4s , v0.4s
-    NEG             v22.4s, v22.4s
-    SUB             v24.4s, v26.4s , v24.4s
+    ADD  v22.4s,  v22.4s ,  v0.4s
+    NEG  v22.4s, v22.4s
+    SUB  v24.4s,  v26.4s ,  v24.4s
 
 
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v14.4s, w11
-    SQADD           v28.4s, v28.4s , v14.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v14.4s,w11
+    SQADD  v28.4s,  v28.4s ,  v14.4s
     //LDR w11,  [sp, #116]
-    MOV             w11, w25
-    //sxtw x11,w11
-    dup             v0.4s, w11
-    sQshL           v28.4s, v28.4s, v0.4s
+  MOV    w11, w25
+  //sxtw x11,w11
+    dup  v0.4s,w11
+    sQshL v28.4s, v28.4s, v0.4s
 
-    mov             v0.16b, v22.16b
-    mov             v14.16b, v24.16b
+    mov  v0.16b, v22.16b
+    mov  v14.16b, v24.16b
 
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
 
 //    VUZP.16         D22, D23
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+  UZP1      v19.8h, v22.8h, v22.8h
+  UZP2      v21.8h, v22.8h, v22.8h
+  MOV        v22.d[0], v19.d[0]
+  MOV        v23.d[0], v21.d[0]
 
-    uMULL           v8.4s, v24.4h, v18.4h
-    uMULL           v26.4s, v22.4h, v18.4h
+  uMULL v8.4s, v24.4h, v18.4h
+    uMULL v26.4s, v22.4h, v18.4h
 
-    NEG             v2.4s, v30.4s
+    NEG  v2.4s, v30.4s
 //    VUZP.16         D30, D31
 
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
+  UZP1      v19.8h, v30.8h, v30.8h
+  UZP2      v21.8h, v30.8h, v30.8h
+  MOV        v30.d[0], v19.d[0]
+  MOV        v30.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v3.d[0], v21.d[0]
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v3.d[0], v21.d[0]
 
-    uMULL           v4.4s, v30.4h, v12.4h
+    uMULL v4.4s, v30.4h, v12.4h
 
-    uMULL           v6.4s, v2.4h, v13.4h
+    uMULL v6.4s, v2.4h, v13.4h
 
-    ushR            v8.4s, v8.4s, #16
-    ushR            v26.4s, v26.4s, #16
+    ushR v8.4s, v8.4s,#16
+    ushR v26.4s, v26.4s,#16
 
-    sMLAL           v8.4s, v25.4h, v18.4h
-    sMLAL           v26.4s, v23.4h, v18.4h
+    sMLAL v8.4s, v25.4h, v18.4h
+    sMLAL v26.4s, v23.4h, v18.4h
 
-    ushR            v4.4s, v4.4s, #16
-    ushR            v6.4s, v6.4s, #16
+    ushR v4.4s, v4.4s,#16
+    ushR v6.4s, v6.4s,#16
 
-    MOV             v19.d[0], v30.d[1]
+  MOV  v19.d[0], v30.d[1]
 
-    sMLAL           v4.4s, v19.4h, v12.4h
-    sMLAL           v6.4s, v3.4h, v13.4h
+    sMLAL v4.4s, v19.4h, v12.4h
+    sMLAL v6.4s, v3.4h, v13.4h
 
-    NEG             v8.4s, v8.4s
-    ADD             v14.4s, v14.4s , v26.4s
-    ADD             v0.4s, v0.4s , v8.4s
+    NEG  v8.4s, v8.4s
+    ADD  v14.4s,  v14.4s ,  v26.4s
+    ADD  v0.4s,  v0.4s ,  v8.4s
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v8.4s, w11
-    SQADD           v0.4s, v0.4s , v8.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v8.4s,w11
+    SQADD  v0.4s,  v0.4s ,  v8.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v26.4s, w11
-    sQshL           v0.4s, v0.4s, v26.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v26.4s,w11
+    sQshL v0.4s, v0.4s, v26.4s
 
-    mov             v26.16b, v28.16b
+    mov  v26.16b, v28.16b
 
-    LD2             { v28.4s, v29.4s}, [x4]
-    MOV             v30.16b, v29.16b
-    MOV             v29.d[0], v28.d[1]
-//   VZIP.32         Q13, Q0
+    LD2 { v28.4s, v29.4s}, [x4]
+    MOV      v30.16b, v29.16b
+    MOV      v29.d[0], v28.d[1]
+ //   VZIP.32         Q13, Q0
 
-    ZIP1            v19.4s, v26.4s, v0.4s
-    ZIP2            v0.4s, v26.4s, v0.4s
-    MOV             v26.16b, v19.16b
+    ZIP1    v19.4s, v26.4s, v0.4s
+  ZIP2    v0.4s, v26.4s, v0.4s
+  MOV      v26.16b, v19.16b
 
-    ST1             { v26.4s}, [x4], #16
-    ST1             { v0.4s}, [x4], #16
+    ST1 { v26.4s}, [x4],#16
+    ST1 { v0.4s}, [x4],#16
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D13, D1
 
-    SADDL           v0.4s, v13.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
-    sMULL           v26.2d, v28.2s, v0.2s
-    Sqxtn           v8.2s, v26.2d
-    sMULL           v26.2d, v29.2s, v1.2s
-    Sqxtn           v9.2s, v26.2d
-    MOV             v8.d[1], v9.d[0]
-    movi            v1.2s, #0
+  SADDL       v0.4s, v13.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
+    sMULL v26.2d, v28.2s, v0.2s
+    Sqxtn v8.2s,  v26.2d
+    sMULL v26.2d, v29.2s, v1.2s
+    Sqxtn v9.2s,  v26.2d
+  MOV    v8.d[1], v9.d[0]
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D12, D1
-    SADDL           v0.4s, v12.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
-    sMULL           v24.2d, v28.2s, v0.2s
-    Sqxtn           v26.2s, v24.2d
-    sMULL           v24.2d, v29.2s, v1.2s
-    Sqxtn           v27.2s, v24.2d
-    MOV             v26.d[1], v27.d[0]
+  SADDL       v0.4s, v12.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
+    sMULL v24.2d, v28.2s, v0.2s
+    Sqxtn v26.2s,  v24.2d
+    sMULL v24.2d, v29.2s, v1.2s
+    Sqxtn v27.2s,  v24.2d
+  MOV    v26.d[1], v27.d[0]
 
-    sQshL           v4.4s, v4.4s, v16.4s
-    sQshL           v6.4s, v6.4s, v16.4s
+    sQshL v4.4s, v4.4s, v16.4s
+    sQshL v6.4s, v6.4s, v16.4s
 
-    SQSUB           v4.4s, v4.4s , v8.4s
-    SQSUB           v6.4s, v6.4s , v26.4s
+    SQSUB  v4.4s,  v4.4s ,  v8.4s
+    SQSUB  v6.4s,  v6.4s ,  v26.4s
 
-    NEG             v26.4s, v14.4s
+    NEG  v26.4s, v14.4s
 //    VUZP.16         D14, D15
 
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+  UZP1      v19.8h, v14.8h, v14.8h
+  UZP2      v21.8h, v14.8h, v14.8h
+  MOV        v14.d[0], v19.d[0]
+  MOV        v15.d[0], v21.d[0]
 
 //    VUZP.16         D26, D27
 
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D10, D1
-    SADDL           v0.4s, v10.4h, v1.4h
-    MOV             v1.d[0], v0.d[0]
-    sMULL           v22.2d, v30.2s, v0.2s
-    Sqxtn           v24.2s, v22.2d
-    sMULL2          v22.2d, v30.4s, v0.4s
-    Sqxtn           v25.2s, v22.2d
-    MOV             v24.d[1], v25.d[0]
-    movi            v1.2s, #0
+   SADDL       v0.4s, v10.4h, v1.4h
+  MOV      v1.d[0], v0.d[0]
+  sMULL v22.2d, v30.2s, v0.2s
+    Sqxtn v24.2s,  v22.2d
+    sMULL2 v22.2d, v30.4s, v0.4s
+    Sqxtn v25.2s,  v22.2d
+  MOV    v24.d[1], v25.d[0]
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D11, D1
-    SADDL           v0.4s, v11.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v11.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v8.2d, v30.2s, v0.2s
-    Sqxtn           v22.2s, v8.2d
-    sMULL2          v8.2d, v30.4s, v0.4s
-    Sqxtn           v23.2s, v8.2d
-    MOV             v22.d[1], v23.d[0]
-    uMULL           v8.4s, v26.4h, v11.4h
-    uMULL           v30.4s, v14.4h, v10.4h
+  sMULL v8.2d, v30.2s, v0.2s
+    Sqxtn v22.2s,  v8.2d
+    sMULL2 v8.2d, v30.4s, v0.4s
+    Sqxtn v23.2s,  v8.2d
+  MOV    v22.d[1], v23.d[0]
+    uMULL v8.4s, v26.4h, v11.4h
+    uMULL v30.4s, v14.4h, v10.4h
 
-    LD2             { v0.4s, v1.4s}, [x1]
-    MOV             v2.16b, v1.16b
-    ADD             x1, x1, x12
+    LD2 { v0.4s, v1.4s}, [x1]
+  MOV  v2.16b, v1.16b
+  ADD x1, x1, x12
 
 //    VUZP.16         D0, D1
 
-    UZP1            v19.8h, v0.8h, v0.8h
-    UZP2            v21.8h, v0.8h, v0.8h
-    MOV             v0.d[0], v19.d[0]
-    MOV             v0.d[1], v21.d[0]
+  UZP1      v19.8h, v0.8h, v0.8h
+  UZP2      v21.8h, v0.8h, v0.8h
+  MOV        v0.d[0], v19.d[0]
+  MOV        v0.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v2.d[1], v21.d[0]
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v2.d[1], v21.d[0]
 
-    ushR            v8.4s, v8.4s, #16
+    ushR v8.4s, v8.4s,#16
 
-    rev64           v0.8h, v0.8h
-    MOV             v1.d[0], v0.d[1]
-    ushR            v30.4s, v30.4s, #16
+    rev64  v0.8h,  v0.8h
+  MOV    v1.d[0], v0.d[1]
+    ushR v30.4s, v30.4s,#16
 
-    rev64           v2.8h, v2.8h
-    MOV             v3.d[0], v2.d[1]
-    sMLAL           v8.4s, v27.4h, v11.4h
+    rev64  v2.8h,  v2.8h
+  MOV    v3.d[0], v2.d[1]
+    sMLAL v8.4s, v27.4h, v11.4h
 
-    sMLAL           v30.4s, v15.4h, v10.4h
+    sMLAL v30.4s, v15.4h, v10.4h
 
-    LD2             { v10.4s, v11.4s}, [x6]
-    ADD             x6, x6, x12
-    MOV             v12.16b, v11.16b
-    sQshL           v4.4s, v4.4s, #2
+    LD2 { v10.4s, v11.4s}, [x6]
+  ADD  x6, x6, x12
+  MOV  v12.16b, v11.16b
 
-//   VUZP.16         D10, D11
+  UZP1      v19.8h, v10.8h, v10.8h
+  UZP2      v21.8h, v10.8h, v10.8h
+  MOV        v10.d[0], v19.d[0]
+  MOV        v10.d[1], v21.d[0]
 
-    UZP1            v19.8h, v10.8h, v10.8h
-    UZP2            v21.8h, v10.8h, v10.8h
-    MOV             v10.d[0], v19.d[0]
-    MOV             v10.d[1], v21.d[0]
 
-    sQshL           v6.4s, v6.4s, #2
+ UZP1   v19.8h, v12.8h, v12.8h
+ UZP2   v21.8h, v12.8h, v12.8h
+ MOV    v12.d[0], v19.d[0]
+ MOV    v12.d[1], v21.d[0]
+  MOV V14.16B , V4.16B
 
-//    VUZP.16         D12, D13
+    rev64  v10.8h,  v10.8h
+  MOV    v11.d[0], v10.d[1]
 
-    UZP1            v19.8h, v12.8h, v12.8h
-    UZP2            v21.8h, v12.8h, v12.8h
-    MOV             v12.d[0], v19.d[0]
-    MOV             v12.d[1], v21.d[0]
 
-    SQADD           v14.4s, v4.4s , v20.4s
+    rev64  v12.8h,  v12.8h
+  MOV   v13.d[0], v12.d[1]
 
-    rev64           v10.8h, v10.8h
-    MOV             v11.d[0], v10.d[1]
-    SQADD           v6.4s, v6.4s , v20.4s
+    sQshL v8.4s, v8.4s, v16.4s
 
-    rev64           v12.8h, v12.8h
-    MOV             v13.d[0], v12.d[1]
-    sshR            v14.4s, v14.4s, #16
+    MOV V31.16B, V6.16B
+    LD2 { v4.4s, v5.4s}, [x8]
+  ADD  x8, x8,#32
 
-//    VUZP.16         D14, D15
-
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
-
-    sshR            v6.4s, v6.4s, #16
-
-//    VUZP.16         D6, D7
-
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
-
-    mov             v15.8b, v6.8b
-    sQshL           v8.4s, v8.4s, v16.4s
-
-    LD2             { v4.4s, v5.4s}, [x8]
-    ADD             x8, x8, #32
-    MOV             v6.16b, v5.16b
-    sQshL           v30.4s, v30.4s, v16.4s
+  MOV  v6.16b, v5.16b
+    sQshL v30.4s, v30.4s, v16.4s
 
 //    VUZP.16         D4, D5
 
-    UZP1            v19.8h, v4.8h, v4.8h
-    UZP2            v21.8h, v4.8h, v4.8h
-    MOV             v4.d[0], v19.d[0]
-    MOV             v5.d[0], v21.d[0]
+  UZP1      v19.8h, v4.8h, v4.8h
+  UZP2      v21.8h, v4.8h, v4.8h
+  MOV        v4.d[0], v19.d[0]
+  MOV        v5.d[0], v21.d[0]
 
-    SQSUB           v8.4s, v8.4s , v24.4s
+    SQSUB  v8.4s,  v8.4s ,  v24.4s
 
 //    VUZP.16         D6, D7
 
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
+    UZP1      v19.8h, v6.8h, v6.8h
+  UZP2      v21.8h, v6.8h, v6.8h
+  MOV        v6.d[0], v19.d[0]
+  MOV        v7.d[0], v21.d[0]
 
-    SQSUB           v22.4s, v30.4s , v22.4s
-
-    sQshL           v30.4s, v8.4s, #2
-
-    LD2             {v8.4h, v9.4h}, [x2]
-    ADD             x2, x2, #16
-    sQshL           v22.4s, v22.4s, #2
-
-    SQADD           v30.4s, v30.4s , v20.4s
-    SQADD           v22.4s, v22.4s , v20.4s
-
-    sshR            v30.4s, v30.4s, #16
-
-//    VUZP.16         D30, D31
-
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
-
-    sshR            v22.4s, v22.4s, #16
+  SQSUB  v22.4s,  v30.4s ,  v22.4s
 
 
-//    VUZP.16         D22, D23
+     MOV V30.16B, V8.16B
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+    LD2 {v8.4h, v9.4h}, [x2]
+  ADD  x2, x2, #16
 
 
-    mov             v23.8b, v30.8b
-
 CORE_LOOP:
-    ST1             {v14.h}[0], [x0]
-    ADD             x0, x0, x9
-    uMULL           v30.4s, v0.4h, v9.4h
-
-    ST1             {v22.h}[0], [x0]
-    ADD             x0, x0, x9
-    uMULL           v28.4s, v2.4h, v8.4h
-
-    ST1             {v14.h}[1], [x0]
-    ADD             x0, x0, x9
-    uMULL           v26.4s, v0.4h, v8.4h
-
-    ST1             {v22.h}[1], [x0]
-    ADD             x0, x0, x9
-    uMULL           v24.4s, v2.4h, v9.4h
-
-    ST1             {v14.h}[2], [x0]
-    ADD             x0, x0, x9
-    ushR            v30.4s, v30.4s, #16
-
-    ST1             {v22.h}[2], [x0]
-    ADD             x0, x0, x9
-    ushR            v28.4s, v28.4s, #16
-
-    ST1             {v14.h}[3], [x0]
-    ADD             x0, x0, x9
-    sMLAL           v30.4s, v1.4h, v9.4h
-
-    ST1             {v22.h}[3], [x0]
-    ADD             x0, x0, x9
-    sMLAL           v28.4s, v3.4h, v8.4h
-
-    ST1             {v15.h}[0], [x5]
-    ADD             x5, x5, x10
-    ushR            v26.4s, v26.4s, #16
-
-    ST1             {v23.h}[0], [x5]
-    ADD             x5, x5, x10
-    ushR            v24.4s, v24.4s, #16
-
-    ST1             {v15.h}[1], [x5]
-    ADD             x5, x5, x10
-    sMLAL           v26.4s, v1.4h, v8.4h
-
-    ST1             {v23.h}[1], [x5]
-    ADD             x5, x5, x10
-    sMLAL           v24.4s, v3.4h, v9.4h
-
-    ST1             {v15.h}[2], [x5]
-    ADD             x5, x5, x10
-    ADD             v30.4s, v30.4s , v28.4s
-
-    ST1             {v23.h}[2], [x5]
-    ADD             x5, x5, x10
-    NEG             v30.4s, v30.4s
-
-    ST1             {v15.h}[3], [x5]
-    ADD             x5, x5, x10
-
-    ST1             {v23.h}[3], [x5]
-    ADD             x5, x5, x10
-    SUB             v28.4s, v24.4s , v26.4s
+    ST1 {V14.S}[0], [x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[0], [x0]
+  ADD  x0, x0,  x9
 
 
-    mov             v26.16b, v30.16b
-    uMULL           v22.4s, v4.4h, v8.4h
+    ST1 {V14.S}[1], [x0]
+  ADD  x0, x0, x9
 
-    mov             v24.16b, v28.16b
+
+    ST1 {V22.S}[1], [x0]
+  ADD  x0, x0,  x9
+
+
+    ST1 {V14.S}[2], [x0]
+    ADD  x0, x0,  x9
+
+
+    ST1 {V22.S}[2], [x0]
+    ADD  x0, x0,  x9
+
+
+    ST1 {V14.S}[3], [x0]
+    ADD  x0, x0,  x9
+
+
+    ST1 {V22.S}[3], [x0]
+    ADD  x0, x0,  x9
+
+
+    ST1 {V31.S}[0], [x5]
+    ADD  x5, x5,  x10
+
+
+    ST1 {V30.S}[0], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V31.S}[1], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V30.S}[1], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V31.S}[2], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V30.S}[2], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V31.S}[3], [x5]
+  ADD  x5, x5,  x10
+
+    ST1 {V30.S}[3], [x5]
+  ADD  x5, x5,  x10
+
+
+    uMULL v30.4s, v0.4h, v9.4h
+    uMULL v28.4s, v2.4h, v8.4h
+    uMULL v26.4s, v0.4h, v8.4h
+    uMULL v24.4s, v2.4h, v9.4h
+    ushR v30.4s, v30.4s,#16
+    ushR v28.4s, v28.4s,#16
+    sMLAL v30.4s, v1.4h, v9.4h
+    sMLAL v28.4s, v3.4h, v8.4h
+    ushR v26.4s, v26.4s,#16
+    ushR v24.4s, v24.4s,#16
+    sMLAL v26.4s, v1.4h, v8.4h
+    sMLAL v24.4s, v3.4h, v9.4h
+    ADD  v30.4s,  v30.4s ,  v28.4s
+    NEG  v30.4s, v30.4s
+    SUB  v28.4s,  v24.4s ,  v26.4s
+
+    mov  v26.16b, v30.16b
+    uMULL v22.4s, v4.4h, v8.4h
+
+    mov  v24.16b, v28.16b
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
 
 //    VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
-    uMULL           v2.4s, v24.4h, v18.4h
-    uMULL           v0.4s, v26.4h, v18.4h
+  uMULL v2.4s, v24.4h, v18.4h
+    uMULL v0.4s, v26.4h, v18.4h
 
-    ushR            v22.4s, v22.4s, #16
-    sMLAL           v22.4s, v5.4h, v8.4h
+    ushR v22.4s, v22.4s,#16
+    sMLAL v22.4s, v5.4h, v8.4h
 
-    ushR            v2.4s, v2.4s, #16
-    ushR            v0.4s, v0.4s, #16
-    sMLAL           v2.4s, v25.4h, v18.4h
-    sMLAL           v0.4s, v27.4h, v18.4h
+    ushR v2.4s, v2.4s,#16
+    ushR v0.4s, v0.4s,#16
+    sMLAL v2.4s, v25.4h, v18.4h
+    sMLAL v0.4s, v27.4h, v18.4h
 
-    uMULL           v24.4s, v4.4h, v9.4h
-    uMULL           v26.4s, v6.4h, v8.4h
+    uMULL v24.4s, v4.4h, v9.4h
+    uMULL v26.4s, v6.4h, v8.4h
 
-    NEG             v2.4s, v2.4s
-    ADD             v28.4s, v28.4s , v0.4s
-    ADD             v30.4s, v30.4s , v2.4s
+    NEG  v2.4s, v2.4s
+    ADD  v28.4s,  v28.4s ,  v0.4s
+    ADD  v30.4s,  v30.4s ,  v2.4s
 
-    uMULL           v0.4s, v6.4h, v9.4h
-    sshR            v24.4s, v24.4s, #16
-    sMLAL           v24.4s, v5.4h, v9.4h
-    sshR            v26.4s, v26.4s, #16
-    sshR            v0.4s, v0.4s, #16
-    sMLAL           v26.4s, v7.4h, v8.4h
-    sMLAL           v0.4s, v7.4h, v9.4h
+    uMULL v0.4s, v6.4h, v9.4h
+    sshR v24.4s, v24.4s,#16
+    sMLAL v24.4s, v5.4h, v9.4h
+    sshR v26.4s, v26.4s,#16
+    sshR v0.4s, v0.4s,#16
+    sMLAL v26.4s, v7.4h, v8.4h
+    sMLAL v0.4s, v7.4h, v9.4h
 
 
 
-    ADD             v22.4s, v22.4s , v0.4s
+    ADD  v22.4s,  v22.4s ,  v0.4s
 
-    NEG             v22.4s, v22.4s
-    SUB             v24.4s, v26.4s , v24.4s
+    NEG  v22.4s, v22.4s
+    SUB  v24.4s,  v26.4s ,  v24.4s
 
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v14.4s, w11
-    SQADD           v28.4s, v28.4s , v14.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v14.4s,w11
+    SQADD  v28.4s,  v28.4s ,  v14.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v0.4s, w11
-    sQshL           v28.4s, v28.4s, v0.4s
+  //sxtw x11,w11
+  MOV    w11, w25
+    dup  v0.4s,w11
+    sQshL v28.4s, v28.4s, v0.4s
 
 
-    mov             v0.16b, v22.16b
-    mov             v14.16b, v24.16b
+    mov  v0.16b, v22.16b
+    mov  v14.16b, v24.16b
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
 
 //    VUZP.16         D22, D23
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+  UZP1      v19.8h, v22.8h, v22.8h
+  UZP2      v21.8h, v22.8h, v22.8h
+  MOV        v22.d[0], v19.d[0]
+  MOV        v23.d[0], v21.d[0]
 
-    uMULL           v8.4s, v24.4h, v18.4h
-    uMULL           v26.4s, v22.4h, v18.4h
+  uMULL v8.4s, v24.4h, v18.4h
+    uMULL v26.4s, v22.4h, v18.4h
 
-    NEG             v2.4s, v30.4s
+    NEG  v2.4s, v30.4s
 
 //    VUZP.16         D30, D31
 
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
+  UZP1      v19.8h, v30.8h, v30.8h
+  UZP2      v21.8h, v30.8h, v30.8h
+  MOV        v30.d[0], v19.d[0]
+  MOV        v30.d[1], v21.d[0]
 
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v3.d[0], v21.d[0]
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v3.d[0], v21.d[0]
 
-    uMULL           v4.4s, v30.4h, v12.4h
-    uMULL           v6.4s, v2.4h, v13.4h
+  uMULL v4.4s, v30.4h, v12.4h
+    uMULL v6.4s, v2.4h, v13.4h
 
-    ushR            v8.4s, v8.4s, #16
-    ushR            v26.4s, v26.4s, #16
+    ushR v8.4s, v8.4s,#16
+    ushR v26.4s, v26.4s,#16
 
-    sMLAL           v8.4s, v25.4h, v18.4h
-    sMLAL           v26.4s, v23.4h, v18.4h
+    sMLAL v8.4s, v25.4h, v18.4h
+    sMLAL v26.4s, v23.4h, v18.4h
 
-    ushR            v4.4s, v4.4s, #16
-    ushR            v6.4s, v6.4s, #16
+    ushR v4.4s, v4.4s,#16
+    ushR v6.4s, v6.4s,#16
 
-    MOV             v19.d[0], v30.d[1]
+  MOV  v19.d[0], v30.d[1]
 
-    sMLAL           v4.4s, v19.4h, v12.4h
-    sMLAL           v6.4s, v3.4h, v13.4h
+    sMLAL v4.4s, v19.4h, v12.4h
+    sMLAL v6.4s, v3.4h, v13.4h
 
-    NEG             v8.4s, v8.4s
-    ADD             v14.4s, v14.4s , v26.4s
-    ADD             v0.4s, v0.4s , v8.4s
+    NEG  v8.4s, v8.4s
+    ADD  v14.4s,  v14.4s ,  v26.4s
+    ADD  v0.4s,  v0.4s ,  v8.4s
 
 
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v8.4s, w11
-    SQADD           v0.4s, v0.4s , v8.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v8.4s,w11
+    SQADD  v0.4s,  v0.4s ,  v8.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v26.4s, w11
-    sQshL           v0.4s, v0.4s, v26.4s
-    mov             v26.16b, v28.16b
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v26.4s,w11
+    sQshL v0.4s, v0.4s, v26.4s
+    mov  v26.16b, v28.16b
 
-    LD2             { v28.4s, v29.4s}, [x4]
-    MOV             v30.16b, v29.16b
-    MOV             v29.d[0], v28.d[1]
+    LD2 { v28.4s, v29.4s}, [x4]
+  MOV  v30.16b, v29.16b
+  MOV  v29.d[0], v28.d[1]
 //    VZIP.32         Q13, Q0
 
-    ZIP1            v19.4s, v26.4s, v0.4s
-    ZIP2            v0.4s, v26.4s, v0.4s
-    MOV             v26.16b, v19.16b
+    ZIP1    v19.4s, v26.4s, v0.4s
+  ZIP2    v0.4s, v26.4s, v0.4s
+  MOV      v26.16b, v19.16b
 
-    ST1             { v26.4s}, [x4]
-    ADD             x4, x4, #16
-    ST1             { v0.4s}, [x4]
-    ADD             x4, x4, #16
+    ST1 { v26.4s}, [x4]
+  ADD x4, x4,#16
+    ST1 { v0.4s}, [x4]
+  ADD  x4, x4,#16
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D13, D1
-    SADDL           v0.4s, v13.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v13.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v26.2d, v28.2s, v0.2s
-    Sqxtn           v8.2s, v26.2d
-    sMULL           v26.2d, v29.2s, v1.2s
-    Sqxtn           v9.2s, v26.2d
-    MOV             v8.d[1], v9.d[0]
-    movi            v1.2s, #0
+    sMULL v26.2d, v28.2s, v0.2s
+    Sqxtn v8.2s,  v26.2d
+    sMULL v26.2d, v29.2s, v1.2s
+    Sqxtn v9.2s,  v26.2d
+  MOV    v8.d[1], v9.d[0]
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D12, D1
-    SADDL           v0.4s, v12.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v12.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v24.2d, v28.2s, v0.2s
-    Sqxtn           v26.2s, v24.2d
-    sMULL           v24.2d, v29.2s, v1.2s
-    Sqxtn           v27.2s, v24.2d
-    MOV             v26.d[1], v27.d[0]
-    sQshL           v4.4s, v4.4s, v16.4s
-    sQshL           v6.4s, v6.4s, v16.4s
+    sMULL v24.2d, v28.2s, v0.2s
+    Sqxtn v26.2s,  v24.2d
+    sMULL v24.2d, v29.2s, v1.2s
+    Sqxtn v27.2s,  v24.2d
+  MOV    v26.d[1], v27.d[0]
+    sQshL v4.4s, v4.4s, v16.4s
+    sQshL v6.4s, v6.4s, v16.4s
 
 
 
-    SQSUB           v4.4s, v4.4s , v8.4s
-    SQSUB           v6.4s, v6.4s , v26.4s
+    SQSUB  v4.4s,  v4.4s ,  v8.4s
+    SQSUB  v6.4s,  v6.4s ,  v26.4s
 
-    NEG             v26.4s, v14.4s
+    NEG  v26.4s, v14.4s
 //    VUZP.16         D26, D27
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
-    movi            v1.2s, #0
-    //VADDL.S16       Q0, D10, D1
-    SADDL           v0.4s, v10.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+    movi  v1.2s, #0
+   //VADDL.S16       Q0, D10, D1
+      SADDL       v0.4s, v10.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v22.2d, v30.2s, v0.2s
-    Sqxtn           v24.2s, v22.2d
-    sMULL2          v22.2d, v30.4s, v0.4s
-    Sqxtn           v25.2s, v22.2d
-    MOV             v24.d[1], v25.d[0]
-    movi            v1.2s, #0
+  sMULL v22.2d, v30.2s, v0.2s
+    Sqxtn v24.2s,  v22.2d
+    sMULL2 v22.2d, v30.4s, v0.4s
+    Sqxtn v25.2s,  v22.2d
+  MOV    v24.d[1], v25.d[0]
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D11, D1
-    SADDL           v0.4s, v11.4h, v1.4h
+  SADDL       v0.4s, v11.4h, v1.4h
 
-    sMULL           v8.2d, v30.2s, v0.2s
-    Sqxtn           v22.2s, v8.2d
-    sMULL2          v8.2d, v30.4s, v0.4s
-    Sqxtn           v23.2s, v8.2d
-    MOV             v22.d[1], v23.d[0]
+    sMULL v8.2d, v30.2s, v0.2s
+    Sqxtn v22.2s,  v8.2d
+    sMULL2 v8.2d, v30.4s, v0.4s
+    Sqxtn v23.2s,  v8.2d
+  MOV    v22.d[1], v23.d[0]
 
 //    VUZP.16         D14, D15
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+   UZP1      v19.8h, v14.8h, v14.8h
+  UZP2      v21.8h, v14.8h, v14.8h
+  MOV        v14.d[0], v19.d[0]
+  MOV        v15.d[0], v21.d[0]
 
-    uMULL           v8.4s, v26.4h, v11.4h
-    uMULL           v30.4s, v14.4h, v10.4h
+  uMULL v8.4s, v26.4h, v11.4h
+    uMULL v30.4s, v14.4h, v10.4h
 
 
-    LD2             { v0.4s, v1.4s}, [x1]
-    MOV             v2.16b, v1.16b
-    ADD             X1, X1, x12
+    LD2 { v0.4s, v1.4s}, [x1]
+  MOV v2.16b, v1.16b
+  ADD  X1, X1, x12
 
 //    VUZP.16         D0, D1
-    UZP1            v19.8h, v0.8h, v0.8h
-    UZP2            v21.8h, v0.8h, v0.8h
-    MOV             v0.d[0], v19.d[0]
-    MOV             v0.d[1], v21.d[0]
+  UZP1      v19.8h, v0.8h, v0.8h
+  UZP2      v21.8h, v0.8h, v0.8h
+  MOV        v0.d[0], v19.d[0]
+  MOV        v0.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v2.d[1], v21.d[0]
+   UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v2.d[1], v21.d[0]
 
-    ushR            v8.4s, v8.4s, #16
+  ushR v8.4s, v8.4s,#16
 
-    rev64           v0.8h, v0.8h
-    MOV             v1.d[0], v0.d[1]
-    ushR            v30.4s, v30.4s, #16
+    rev64  v0.8h,  v0.8h
+  MOV  v1.d[0], v0.d[1]
+    ushR v30.4s, v30.4s,#16
 
-    rev64           v2.8h, v2.8h
-    MOV             v3.d[0], v2.d[1]
-    sMLAL           v8.4s, v27.4h, v11.4h
+    rev64  v2.8h,  v2.8h
+  MOV  v3.d[0], v2.d[1]
+    sMLAL v8.4s, v27.4h, v11.4h
 
-    sMLAL           v30.4s, v15.4h, v10.4h
+    sMLAL v30.4s, v15.4h, v10.4h
 
-    LD2             { v10.4s, v11.4s}, [x6]
-    add             X6, x6, x12
-    MOV             v12.16b, v11.16b
-    sQshL           v4.4s, v4.4s, #2
+    LD2 { v10.4s, v11.4s}, [x6]
+  add  X6, x6, x12
+  MOV  v12.16b, v11.16b
+
 
     //VUZP.16         D10, D11
 
-    UZP1            v19.8h, v10.8h, v10.8h
-    UZP2            v21.8h, v10.8h, v10.8h
-    MOV             v10.d[0], v19.d[0]
-    MOV             v10.d[1], v21.d[0]
+     UZP1      v19.8h, v10.8h, v10.8h
+  UZP2      v21.8h, v10.8h, v10.8h
+  MOV        v10.d[0], v19.d[0]
+  MOV        v10.d[1], v21.d[0]
 
-    sQshL           v6.4s, v6.4s, #2
+
 
 //    VUZP.16         D12, D13
 
-    UZP1            v19.8h, v12.8h, v12.8h
-    UZP2            v21.8h, v12.8h, v12.8h
-    MOV             v12.d[0], v19.d[0]
-    MOV             v12.d[1], v21.d[0]
+   UZP1      v19.8h, v12.8h, v12.8h
+  UZP2      v21.8h, v12.8h, v12.8h
+        MOV        v12.d[0], v19.d[0]
+  MOV        v12.d[1], v21.d[0]
 
 
-    SQADD           v14.4s, v4.4s , v20.4s
 
-    rev64           v10.8h, v10.8h
-    MOV             v11.d[0], v10.d[1]
-    SQADD           v6.4s, v6.4s , v20.4s
+      MOV  V14.16B, V4.16B
 
-    rev64           v12.8h, v12.8h
-    MOV             v13.d[0], v12.d[1]
-    sshR            v14.4s, v14.4s, #16
-
-//    VUZP.16         D14, D15
-
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+    rev64  v10.8h,  v10.8h
+  MOV        v11.d[0], v10.d[1]
 
 
-    sshR            v6.4s, v6.4s, #16
+    rev64  v12.8h,  v12.8h
+  MOV        v13.d[0], v12.d[1]
+
+    sQshL v8.4s, v8.4s, v16.4s
+
+    LD2 { v4.4s, v5.4s}, [x8]
+  ADD  x8, x8, #32
+
+    MOV V31.16B, V6.16B
+    MOV  v6.16b, v5.16b
+
+  sQshL v30.4s, v30.4s, v16.4s
+
+
+   UZP1      v19.8h, v4.8h, v4.8h
+  UZP2      v21.8h, v4.8h, v4.8h
+  MOV        v4.d[0], v19.d[0]
+  MOV        v5.d[0], v21.d[0]
+
+
+  SQSUB  v8.4s,  v8.4s ,  v24.4s
 
 //    VUZP.16         D6, D7
 
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
+     UZP1      v19.8h, v6.8h, v6.8h
+  UZP2      v21.8h, v6.8h, v6.8h
+  MOV        v6.d[0], v19.d[0]
+  MOV        v7.d[0], v21.d[0]
+
+  SQSUB  v22.4s,  v30.4s ,  v22.4s
+
+    MOV V30.16B , V8.16B
+
+    LD2 {v8.4h, v9.4h}, [x2]
+  ADD x2, x2,#16
 
 
-    mov             v15.8b, v6.8b
-    sQshL           v8.4s, v8.4s, v16.4s
 
-    LD2             { v4.4s, v5.4s}, [x8]
-    ADD             x8, x8, #32
-    MOV             v6.16b, v5.16b
-
-    sQshL           v30.4s, v30.4s, v16.4s
-
-//    VUZP.16         D4, D5
-
-    UZP1            v19.8h, v4.8h, v4.8h
-    UZP2            v21.8h, v4.8h, v4.8h
-    MOV             v4.d[0], v19.d[0]
-    MOV             v5.d[0], v21.d[0]
-
-
-    SQSUB           v8.4s, v8.4s , v24.4s
-
-//    VUZP.16         D6, D7
-
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
-
-
-    SQSUB           v22.4s, v30.4s , v22.4s
-
-    sQshL           v30.4s, v8.4s, #2
-
-    LD2             {v8.4h, v9.4h}, [x2]
-    ADD             x2, x2, #16
-    sQshL           v22.4s, v22.4s, #2
-
-    SQADD           v30.4s, v30.4s , v20.4s
-    SQADD           v22.4s, v22.4s , v20.4s
-
-    sshR            v30.4s, v30.4s, #16
-
-//   VUZP.16         D30, D31
-
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
-
-
-    sshR            v22.4s, v22.4s, #16
-
-
-//    VUZP.16         D22, D23
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
-
-
-    mov             v23.8b, v30.8b
 
     SUBS            x3, x3, #1
     BNE             CORE_LOOP
@@ -1190,844 +1114,765 @@
 
 EPILOGUE:
 
-    ST1             {v14.h}[0], [x0]
-    ADD             x0, x0, x9
-    uMULL           v30.4s, v0.4h, v9.4h
-
-    ST1             {v22.h}[0], [x0]
-    ADD             x0, x0, x9
-    uMULL           v28.4s, v2.4h, v8.4h
-
-    ST1             {v14.h}[1], [x0]
-    ADD             x0, x0, x9
-    uMULL           v26.4s, v0.4h, v8.4h
-
-    ST1             {v22.h}[1], [x0]
-    ADD             x0, x0, x9
-    uMULL           v24.4s, v2.4h, v9.4h
-
-    ST1             {v14.h}[2], [x0]
-    ADD             x0, x0, x9
-    ushR            v30.4s, v30.4s, #16
-
-    ST1             {v22.h}[2], [x0]
-    ADD             x0, x0, x9
-    ushR            v28.4s, v28.4s, #16
-
-    ST1             {v14.h}[3], [x0]
-    ADD             x0, x0, x9
-    sMLAL           v30.4s, v1.4h, v9.4h
-
-    ST1             {v22.h}[3], [x0]
-    ADD             x0, x0, x9
-    sMLAL           v28.4s, v3.4h, v8.4h
-
-    ST1             {v15.h}[0], [x5]
-    ADD             x5, x5, x10
-    ushR            v26.4s, v26.4s, #16
-
-    ST1             {v23.h}[0], [x5]
-    ADD             x5, x5, x10
-    ushR            v24.4s, v24.4s, #16
-
-    ST1             {v15.h}[1], [x5]
-    ADD             x5, x5, x10
-    sMLAL           v26.4s, v1.4h, v8.4h
-
-    ST1             {v23.h}[1], [x5]
-    ADD             x5, x5, x10
-    sMLAL           v24.4s, v3.4h, v9.4h
-
-    ST1             {v15.h}[2], [x5]
-    ADD             x5, x5, x10
-    ADD             v30.4s, v30.4s , v28.4s
-
-    ST1             {v23.h}[2], [x5]
-    ADD             x5, x5, x10
-    NEG             v30.4s, v30.4s
-
-    ST1             {v15.h}[3], [x5]
-    ADD             x5, x5, x10
+    ST1 {V14.S}[0],[x0]
+  ADD  x0, x0, x9
 
 
-    ST1             {v23.h}[3], [x5]
-    ADD             x5, x5, x10
-    SUB             v28.4s, v24.4s , v26.4s
+    ST1 {V22.S}[0],[x0]
+  ADD  x0, x0, x9
 
 
-    uMULL           v22.4s, v4.4h, v8.4h
-    mov             v26.16b, v30.16b
-    mov             v24.16b, v28.16b
+    ST1 {V14.S}[1],[x0]
+  ADD  x0, x0, x9
 
-    mov             v26.16b, v30.16b
-    mov             v24.16b, v28.16b
+
+    ST1 {V22.S}[1],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V14.S}[2],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V22.S}[2],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V14.S}[3],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V22.S}[3],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V31.S}[0],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V30.S}[0],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V31.S}[1],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V30.S}[1],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V31.S}[2],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V30.S}[2],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V31.S}[3],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V30.S}[3],[x5]
+  ADD  x5, x5, x10
+
+
+    uMULL v30.4s, v0.4h, v9.4h
+    uMULL v28.4s, v2.4h, v8.4h
+    uMULL v26.4s, v0.4h, v8.4h
+    uMULL v24.4s, v2.4h, v9.4h
+    ushR v30.4s, v30.4s,#16
+    ushR v28.4s, v28.4s,#16
+    sMLAL v30.4s, v1.4h, v9.4h
+    sMLAL v28.4s, v3.4h, v8.4h
+    ushR v26.4s, v26.4s,#16
+    ushR v24.4s, v24.4s,#16
+    sMLAL v26.4s, v1.4h, v8.4h
+    sMLAL v24.4s, v3.4h, v9.4h
+    ADD  v30.4s,  v30.4s ,  v28.4s
+    NEG  v30.4s, v30.4s
+    SUB  v28.4s,  v24.4s ,  v26.4s
+
+
+    uMULL v22.4s, v4.4h, v8.4h
+    mov  v26.16b, v30.16b
+    mov  v24.16b, v28.16b
+
+    mov  v26.16b, v30.16b
+    mov  v24.16b, v28.16b
 
     //VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+     UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
-    uMULL           v2.4s, v24.4h, v18.4h
-    uMULL           v0.4s, v26.4h, v18.4h
+    uMULL v2.4s, v24.4h, v18.4h
+    uMULL v0.4s, v26.4h, v18.4h
 
-    ushR            v22.4s, v22.4s, #16
-    sMLAL           v22.4s, v5.4h, v8.4h
+    ushR v22.4s, v22.4s,#16
+    sMLAL v22.4s, v5.4h, v8.4h
 
-    ushR            v2.4s, v2.4s, #16
-    ushR            v0.4s, v0.4s, #16
-    sMLAL           v2.4s, v25.4h, v18.4h
-    sMLAL           v0.4s, v27.4h, v18.4h
+    ushR v2.4s, v2.4s,#16
+    ushR v0.4s, v0.4s,#16
+    sMLAL v2.4s, v25.4h, v18.4h
+    sMLAL v0.4s, v27.4h, v18.4h
 
-    uMULL           v24.4s, v4.4h, v9.4h
-    uMULL           v26.4s, v6.4h, v8.4h
+    uMULL v24.4s, v4.4h, v9.4h
+    uMULL v26.4s, v6.4h, v8.4h
 
-    NEG             v2.4s, v2.4s
-    ADD             v28.4s, v28.4s , v0.4s
-    ADD             v30.4s, v30.4s , v2.4s
+    NEG  v2.4s, v2.4s
+    ADD  v28.4s,  v28.4s ,  v0.4s
+    ADD  v30.4s,  v30.4s ,  v2.4s
 
-    uMULL           v0.4s, v6.4h, v9.4h
-    sshR            v24.4s, v24.4s, #16
-    sMLAL           v24.4s, v5.4h, v9.4h
-    sshR            v26.4s, v26.4s, #16
-    sshR            v0.4s, v0.4s, #16
-    sMLAL           v26.4s, v7.4h, v8.4h
-    sMLAL           v0.4s, v7.4h, v9.4h
+    uMULL v0.4s, v6.4h, v9.4h
+    sshR v24.4s, v24.4s,#16
+    sMLAL v24.4s, v5.4h, v9.4h
+    sshR v26.4s, v26.4s,#16
+    sshR v0.4s, v0.4s,#16
+    sMLAL v26.4s, v7.4h, v8.4h
+    sMLAL v0.4s, v7.4h, v9.4h
 
 
 
 
 
-    ADD             v22.4s, v22.4s , v0.4s
-    NEG             v22.4s, v22.4s
-    SUB             v24.4s, v26.4s , v24.4s
+    ADD  v22.4s,  v22.4s ,  v0.4s
+    NEG  v22.4s, v22.4s
+    SUB  v24.4s,  v26.4s ,  v24.4s
 
 
 
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v14.4s, w11
-    SQADD           v28.4s, v28.4s , v14.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v14.4s,w11
+    SQADD  v28.4s,  v28.4s ,  v14.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v0.4s, w11
-    sQshL           v28.4s, v28.4s, v0.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v0.4s,w11
+    sQshL v28.4s, v28.4s, v0.4s
 
 
-    mov             v0.16b, v22.16b
-    mov             v14.16b, v24.16b
+    mov  v0.16b, v22.16b
+    mov  v14.16b, v24.16b
 
 
 //    VUZP.16         D22, D23
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+  UZP1      v19.8h, v22.8h, v22.8h
+  UZP2      v21.8h, v22.8h, v22.8h
+  MOV        v22.d[0], v19.d[0]
+  MOV        v23.d[0], v21.d[0]
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+     UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
-    uMULL           v8.4s, v24.4h, v18.4h
-    uMULL           v26.4s, v22.4h, v18.4h
+    uMULL v8.4s, v24.4h, v18.4h
+    uMULL v26.4s, v22.4h, v18.4h
 
-    NEG             v2.4s, v30.4s
+    NEG  v2.4s, v30.4s
 
 //    VUZP.16         D30, D31
 
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
+  UZP1      v19.8h, v30.8h, v30.8h
+  UZP2      v21.8h, v30.8h, v30.8h
+  MOV        v30.d[0], v19.d[0]
+  MOV        v30.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v3.d[0], v21.d[0]
+   UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v3.d[0], v21.d[0]
 
-    uMULL           v4.4s, v30.4h, v12.4h
-    uMULL           v6.4s, v2.4h, v13.4h
+    uMULL v4.4s, v30.4h, v12.4h
+    uMULL v6.4s, v2.4h, v13.4h
 
-    ushR            v8.4s, v8.4s, #16
-    ushR            v26.4s, v26.4s, #16
+    ushR v8.4s, v8.4s,#16
+    ushR v26.4s, v26.4s,#16
 
-    sMLAL           v8.4s, v25.4h, v18.4h
-    sMLAL           v26.4s, v23.4h, v18.4h
+    sMLAL v8.4s, v25.4h, v18.4h
+    sMLAL v26.4s, v23.4h, v18.4h
 
-    ushR            v4.4s, v4.4s, #16
-    ushR            v6.4s, v6.4s, #16
+    ushR v4.4s, v4.4s,#16
+    ushR v6.4s, v6.4s,#16
 
-    MOV             v19.d[0], v30.d[1]
+  MOV  v19.d[0], v30.d[1]
 
-    sMLAL           v4.4s, v19.4h, v12.4h
-    sMLAL           v6.4s, v3.4h, v13.4h
+    sMLAL v4.4s, v19.4h, v12.4h
+    sMLAL v6.4s, v3.4h, v13.4h
 
-    NEG             v8.4s, v8.4s
-    ADD             v14.4s, v14.4s , v26.4s
-    ADD             v0.4s, v0.4s , v8.4s
+    NEG  v8.4s, v8.4s
+    ADD  v14.4s,  v14.4s ,  v26.4s
+    ADD  v0.4s,  v0.4s ,  v8.4s
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v8.4s, w11
-    SQADD           v0.4s, v0.4s , v8.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v8.4s,w11
+    SQADD  v0.4s,  v0.4s ,  v8.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v26.4s, w11
-    sQshL           v0.4s, v0.4s, v26.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v26.4s,w11
+    sQshL v0.4s, v0.4s, v26.4s
 
 
-    mov             v26.16b, v28.16b
+    mov  v26.16b, v28.16b
 
-    LD2             { v28.4s, v29.4s}, [x4]
-    MOV             v30.16b, v29.16b
-    MOV             v29.d[0], v28.d[1]
+    LD2 { v28.4s, v29.4s}, [x4]
+  MOV  v30.16b, v29.16b
+  MOV  v29.d[0], v28.d[1]
 //    VZIP.32         Q13, Q0
 
-    ZIP1            v19.4s, v26.4s, v0.4s
-    ZIP2            v0.4s, v26.4s, v0.4s
-    MOV             v26.16b, v19.16b
+    ZIP1    v19.4s, v26.4s, v0.4s
+  ZIP2    v0.4s, v26.4s, v0.4s
+  MOV      v26.16b, v19.16b
 
-    ST1             { v26.4s}, [x4], #16
-    ST1             { v0.4s}, [x4], #16
+  ST1 { v26.4s}, [x4],#16
+    ST1 { v0.4s}, [x4],#16
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D13, D1
-    SADDL           v0.4s, v13.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v13.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v26.2d, v28.2s, v0.2s
-    Sqxtn           v8.2s, v26.2d
-    sMULL           v26.2d, v29.2s, v1.2s
-    Sqxtn           v9.2s, v26.2d
-    MOV             v8.d[1], v9.d[0]
-    movi            v1.2s, #0
+    sMULL v26.2d, v28.2s, v0.2s
+    Sqxtn v8.2s,  v26.2d
+    sMULL v26.2d, v29.2s, v1.2s
+    Sqxtn v9.2s,  v26.2d
+  MOV    v8.d[1], v9.d[0]
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D12, D1
-    SADDL           v0.4s, v12.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v12.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v24.2d, v28.2s, v0.2s
-    Sqxtn           v26.2s, v24.2d
-    sMULL           v24.2d, v29.2s, v1.2s
-    Sqxtn           v27.2s, v24.2d
-    MOV             v26.d[1], v27.d[0]
+    sMULL v24.2d, v28.2s, v0.2s
+    Sqxtn v26.2s,  v24.2d
+    sMULL v24.2d, v29.2s, v1.2s
+    Sqxtn v27.2s,  v24.2d
+  MOV    v26.d[1], v27.d[0]
 
-    sQshL           v4.4s, v4.4s, v16.4s
-    sQshL           v6.4s, v6.4s, v16.4s
+    sQshL v4.4s, v4.4s, v16.4s
+    sQshL v6.4s, v6.4s, v16.4s
 
-    SQSUB           v4.4s, v4.4s , v8.4s
-    SQSUB           v6.4s, v6.4s , v26.4s
+    SQSUB  v4.4s,  v4.4s ,  v8.4s
+    SQSUB  v6.4s,  v6.4s ,  v26.4s
 
-    NEG             v26.4s, v14.4s
+    NEG  v26.4s, v14.4s
 //    VUZP.16         D14, D15
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+  UZP1      v19.8h, v14.8h, v14.8h
+  UZP2      v21.8h, v14.8h, v14.8h
+  MOV        v14.d[0], v19.d[0]
+  MOV        v15.d[0], v21.d[0]
 
 
-//   VUZP.16         D26, D27
+ //   VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D10, D1
-    SADDL           v0.4s, v10.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v10.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v22.2d, v30.2s, v0.2s
-    Sqxtn           v24.2s, v22.2d
-    sMULL2          v22.2d, v30.4s, v0.4s
-    Sqxtn           v25.2s, v22.2d
-    MOV             v24.d[1], v25.d[0]
-    movi            v1.2s, #0
+    sMULL v22.2d, v30.2s, v0.2s
+    Sqxtn v24.2s,  v22.2d
+    sMULL2 v22.2d, v30.4s, v0.4s
+    Sqxtn v25.2s,  v22.2d
+  MOV    v24.d[1], v25.d[0]
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D11, D1
-    SADDL           v0.4s, v11.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v11.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v8.2d, v30.2s, v0.2s
-    Sqxtn           v22.2s, v8.2d
-    sMULL2          v8.2d, v30.4s, v0.4s
-    Sqxtn           v23.2s, v8.2d
-    MOV             v22.d[1], v23.d[0]
+    sMULL v8.2d, v30.2s, v0.2s
+    Sqxtn v22.2s,  v8.2d
+    sMULL2 v8.2d, v30.4s, v0.4s
+    Sqxtn v23.2s,  v8.2d
+  MOV    v22.d[1], v23.d[0]
 
-    uMULL           v8.4s, v26.4h, v11.4h
-    uMULL           v30.4s, v14.4h, v10.4h
+    uMULL v8.4s, v26.4h, v11.4h
+    uMULL v30.4s, v14.4h, v10.4h
 
-    ushR            v8.4s, v8.4s, #16
+    ushR v8.4s, v8.4s,#16
 
-    ushR            v30.4s, v30.4s, #16
+    ushR v30.4s, v30.4s,#16
 
-    sMLAL           v8.4s, v27.4h, v11.4h
+    sMLAL v8.4s, v27.4h, v11.4h
 
-    sMLAL           v30.4s, v15.4h, v10.4h
+    sMLAL v30.4s, v15.4h, v10.4h
 
-    sQshL           v4.4s, v4.4s, #2
 
-    sQshL           v6.4s, v6.4s, #2
+    MOV V14.16B, V4.16B
 
-    SQADD           v14.4s, v4.4s , v20.4s
 
-    SQADD           v6.4s, v6.4s , v20.4s
+    sQshL v8.4s, v8.4s, v16.4s
 
-    sshR            v14.4s, v14.4s, #16
+    sQshL v30.4s, v30.4s, v16.4s
 
-//    VUZP.16         D14, D15
+    SQSUB  v8.4s,  v8.4s ,  v24.4s
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+    SQSUB  v22.4s,  v30.4s ,  v22.4s
 
-    sshR            v6.4s, v6.4s, #16
-
-//    VUZP.16         D6, D7
-
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
-
-    mov             v15.8b, v6.8b
-    sQshL           v8.4s, v8.4s, v16.4s
-
-    sQshL           v30.4s, v30.4s, v16.4s
-
-    SQSUB           v8.4s, v8.4s , v24.4s
-
-    SQSUB           v22.4s, v30.4s , v22.4s
-
-    sQshL           v30.4s, v8.4s, #2
-
-    sQshL           v22.4s, v22.4s, #2
-
-    SQADD           v30.4s, v30.4s , v20.4s
-    SQADD           v22.4s, v22.4s , v20.4s
-
-    sshR            v30.4s, v30.4s, #16
-
-    //VUZP.16         D30, D31
-
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
-
-    sshR            v22.4s, v22.4s, #16
-
-//    VUZP.16         D22, D23
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
-
-    mov             v23.8b, v30.8b
+    MOV V30.16B , V8.16B
 
 
 
 
-    ST1             {v14.h}[0], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[0], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[1], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[1], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[2], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[2], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[3], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[3], [x0]
-    ADD             x0, x0, x9
-    ST1             {v15.h}[0], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[0], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[1], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[1], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[2], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[2], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[3], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[3], [x5]
-    ADD             x5, x5, x10
+    ST1 {V14.S}[0],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[0],[x0]
+       ADD  x0, x0, x9
+    ST1 {V14.S}[1],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[1],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[2],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[2],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[3],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[3],[x0]
+  ADD  x0, x0, x9
+    ST1 {V6.S}[0],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[0],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[1],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[1],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[2],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[2],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[3],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[3],[x5]
+  ADD  x5, x5, x10
 
 ARM_EPILOGUE:
 
 ARM_LOOP:
 
-    LD2             { v0.4s, v1.4s}, [x1]
-    MOV             v2.16b, v1.16b
+    LD2 { v0.4s, v1.4s}, [x1]
+  MOV  v2.16b, v1.16b
 
     //VUZP.16         D0, D1
-    UZP1            v19.8h, v0.8h, v0.8h
-    UZP2            v21.8h, v0.8h, v0.8h
-    MOV             v0.d[0], v19.d[0]
-    MOV             v0.d[1], v21.d[0]
+      UZP1      v19.8h, v0.8h, v0.8h
+  UZP2      v21.8h, v0.8h, v0.8h
+  MOV        v0.d[0], v19.d[0]
+  MOV        v0.d[1], v21.d[0]
 
-    //VUZP.16         D2, D3
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v2.d[1], v21.d[0]
+  //VUZP.16         D2, D3
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v2.d[1], v21.d[0]
 
 
-    rev64           v0.8h, v0.8h
-    MOV             v1.d[0], v0.d[1]
-    rev64           v2.8h, v2.8h
-    MOV             v3.d[0], v2.d[1]
+    rev64  v0.8h,  v0.8h
+  MOV        v1.d[0], v0.d[1]
+    rev64  v2.8h,  v2.8h
+  MOV        v3.d[0], v2.d[1]
 
-    LD2             {v8.4h, v9.4h}, [x2]
-    ADD             x2, x2, #16
+    LD2 {v8.4h, v9.4h}, [x2]
+  ADD x2, x2,#16
 
-    LD2             {v4.2s, v5.2s}, [x8]
-    ADD             x8, x8, #16
-    MOV             v6.16b, v5.16b
-    movi            v5.2s, #0x00000000
-    movi            v7.2s, #0x00000000
+    LD2 {v4.2s, v5.2s}, [x8]
+  ADD x8, x8,#16
+    MOV  v6.16b, v5.16b
+  movi  v5.2s, #0x00000000
+    movi  v7.2s, #0x00000000
 
-    LD1             {v5.s}[0], [x8], #4
-    LD1             {v7.s}[0], [x8]
+    LD1 {v5.s}[0],[x8],#4
+    LD1 {v7.s}[0],[x8]
 
     MOV             x12, #16
-    MOV             v4.d[1], v5.d[0]
-    MOV             v6.d[1], v7.d[0]
+  MOV        v4.d[1], v5.d[0]
+  MOV        v6.d[1], v7.d[0]
 //    VUZP.16         D4, D5
 
-    UZP1            v19.8h, v4.8h, v4.8h
-    UZP2            v21.8h, v4.8h, v4.8h
-    MOV             v4.d[0], v19.d[0]
-    MOV             v5.d[0], v21.d[0]
+  UZP1      v19.8h, v4.8h, v4.8h
+  UZP2      v21.8h, v4.8h, v4.8h
+  MOV        v4.d[0], v19.d[0]
+  MOV        v5.d[0], v21.d[0]
 
 //    VUZP.16         D6, D7
 
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
+  UZP1      v19.8h, v6.8h, v6.8h
+  UZP2      v21.8h, v6.8h, v6.8h
+  MOV        v6.d[0], v19.d[0]
+  MOV        v7.d[0], v21.d[0]
 
     ADD             x6, x6, #16
 
     MOV             x12, #-4
-    LD2             {v11.2s, v12.2s}, [x6]
-    ADD             x6, x6, x12
-    MOV             v13.16b, v12.16b
+    LD2 {v11.2s, v12.2s}, [x6]
+  ADD x6, x6, x12
+  MOV v13.16b, v12.16b
 
 
-    movi            v10.2s, #0x00000000
+    movi  v10.2s, #0x00000000
 
-    LD1             {v12.s}[1], [x6]
-    ADD             x6, x6, x12
-    LD1             {v10.s}[1], [x6]
-    ADD             x6, x6, x12
-    LD1             {v12.s}[0], [x6]
-    ADD             x6, x6, x12
+    LD1 {v12.s}[1],[x6]
+  ADD  x6, x6, x12
+    LD1 {v10.s}[1],[x6]
+    ADD  x6, x6, x12
+  LD1 {v12.s}[0],[x6]
+    ADD  x6, x6, x12
 
-    MOV             v10.d[1], v11.d[0]
-    MOV             v12.d[1], v13.d[0]
+  MOV        v10.d[1], v11.d[0]
+  MOV        v12.d[1], v13.d[0]
 
     //VUZP.16         D10, D11
 
-    UZP1            v19.8h, v10.8h, v10.8h
-    UZP2            v21.8h, v10.8h, v10.8h
-    MOV             v10.d[0], v19.d[0]
-    MOV             v10.d[1], v21.d[0]
+  UZP1      v19.8h, v10.8h, v10.8h
+  UZP2      v21.8h, v10.8h, v10.8h
+  MOV        v10.d[0], v19.d[0]
+  MOV        v10.d[1], v21.d[0]
 
-    //VUZP.16         D12, D13
+  //VUZP.16         D12, D13
 
-    UZP1            v19.8h, v12.8h, v12.8h
-    UZP2            v21.8h, v12.8h, v12.8h
-    MOV             v12.d[0], v19.d[0]
-    MOV             v12.d[1], v21.d[0]
+  UZP1      v19.8h, v12.8h, v12.8h
+  UZP2      v21.8h, v12.8h, v12.8h
+  MOV        v12.d[0], v19.d[0]
+  MOV        v12.d[1], v21.d[0]
 
 
-    rev64           v10.8h, v10.8h
-    MOV             v11.d[0], v10.d[1]
-    rev64           v12.8h, v12.8h
-    MOV             v13.d[0], v12.d[1]
+    rev64  v10.8h,  v10.8h
+  MOV        v11.d[0], v10.d[1]
+    rev64  v12.8h,  v12.8h
+  MOV        v13.d[0], v12.d[1]
 
-    uMULL           v30.4s, v0.4h, v9.4h
-    uMULL           v28.4s, v2.4h, v8.4h
-    uMULL           v26.4s, v0.4h, v8.4h
-    uMULL           v24.4s, v2.4h, v9.4h
+    uMULL v30.4s, v0.4h, v9.4h
+    uMULL v28.4s, v2.4h, v8.4h
+    uMULL v26.4s, v0.4h, v8.4h
+    uMULL v24.4s, v2.4h, v9.4h
 
-    ushR            v30.4s, v30.4s, #16
-    ushR            v28.4s, v28.4s, #16
+    ushR v30.4s, v30.4s,#16
+    ushR v28.4s, v28.4s,#16
 
-    sMLAL           v30.4s, v1.4h, v9.4h
-    sMLAL           v28.4s, v3.4h, v8.4h
+    sMLAL v30.4s, v1.4h, v9.4h
+    sMLAL v28.4s, v3.4h, v8.4h
 
-    ushR            v26.4s, v26.4s, #16
-    ushR            v24.4s, v24.4s, #16
+    ushR v26.4s, v26.4s,#16
+    ushR v24.4s, v24.4s,#16
 
-    sMLAL           v26.4s, v1.4h, v8.4h
-    sMLAL           v24.4s, v3.4h, v9.4h
+    sMLAL v26.4s, v1.4h, v8.4h
+    sMLAL v24.4s, v3.4h, v9.4h
 
-    ADD             v30.4s, v30.4s , v28.4s
-    NEG             v30.4s, v30.4s
+    ADD  v30.4s,  v30.4s ,  v28.4s
+    NEG  v30.4s, v30.4s
 
-    uMULL           v22.4s, v4.4h, v8.4h
+    uMULL v22.4s, v4.4h, v8.4h
 
-    SUB             v28.4s, v24.4s , v26.4s
+    SUB  v28.4s,  v24.4s ,  v26.4s
 
 
-    mov             v26.16b, v30.16b
-    mov             v24.16b, v28.16b
+    mov  v26.16b, v30.16b
+    mov  v24.16b, v28.16b
 
 //    VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
     //VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
-    uMULL           v2.4s, v24.4h, v18.4h
-    uMULL           v0.4s, v26.4h, v18.4h
+    uMULL v2.4s, v24.4h, v18.4h
+    uMULL v0.4s, v26.4h, v18.4h
 
-    ushR            v22.4s, v22.4s, #16
-    sMLAL           v22.4s, v5.4h, v8.4h
+    ushR v22.4s, v22.4s,#16
+    sMLAL v22.4s, v5.4h, v8.4h
 
-    ushR            v2.4s, v2.4s, #16
-    ushR            v0.4s, v0.4s, #16
-    sMLAL           v2.4s, v25.4h, v18.4h
-    sMLAL           v0.4s, v27.4h, v18.4h
+    ushR v2.4s, v2.4s,#16
+    ushR v0.4s, v0.4s,#16
+    sMLAL v2.4s, v25.4h, v18.4h
+    sMLAL v0.4s, v27.4h, v18.4h
 
-    uMULL           v24.4s, v4.4h, v9.4h
-    uMULL           v26.4s, v6.4h, v8.4h
+    uMULL v24.4s, v4.4h, v9.4h
+    uMULL v26.4s, v6.4h, v8.4h
 
-    NEG             v2.4s, v2.4s
-    ADD             v28.4s, v28.4s , v0.4s
-    ADD             v30.4s, v30.4s , v2.4s
+    NEG  v2.4s, v2.4s
+    ADD  v28.4s,  v28.4s ,  v0.4s
+    ADD  v30.4s,  v30.4s ,  v2.4s
 
-    uMULL           v0.4s, v6.4h, v9.4h
-    sshR            v24.4s, v24.4s, #16
-    sMLAL           v24.4s, v5.4h, v9.4h
-    sshR            v26.4s, v26.4s, #16
-    sshR            v0.4s, v0.4s, #16
-    sMLAL           v26.4s, v7.4h, v8.4h
-    sMLAL           v0.4s, v7.4h, v9.4h
+    uMULL v0.4s, v6.4h, v9.4h
+    sshR v24.4s, v24.4s,#16
+    sMLAL v24.4s, v5.4h, v9.4h
+    sshR v26.4s, v26.4s,#16
+    sshR v0.4s, v0.4s,#16
+    sMLAL v26.4s, v7.4h, v8.4h
+    sMLAL v0.4s, v7.4h, v9.4h
 
-    ADD             v22.4s, v22.4s , v0.4s
-    NEG             v22.4s, v22.4s
-    SUB             v24.4s, v26.4s , v24.4s
+    ADD  v22.4s,  v22.4s ,  v0.4s
+    NEG  v22.4s, v22.4s
+    SUB  v24.4s,  v26.4s ,  v24.4s
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v14.4s, w11
-    SQADD           v28.4s, v28.4s , v14.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v14.4s,w11
+    SQADD  v28.4s,  v28.4s ,  v14.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v0.4s, w11
-    sQshL           v28.4s, v28.4s, v0.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v0.4s,w11
+    sQshL v28.4s, v28.4s, v0.4s
 
-    mov             v0.16b, v22.16b
-    mov             v14.16b, v24.16b
+    mov  v0.16b, v22.16b
+    mov  v14.16b, v24.16b
 
 //    VUZP.16         D22, D23
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+   UZP1      v19.8h, v22.8h, v22.8h
+  UZP2      v21.8h, v22.8h, v22.8h
+  MOV        v22.d[0], v19.d[0]
+  MOV        v23.d[0], v21.d[0]
 
-//   VUZP.16         D24, D25
+ //   VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+   UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
-    uMULL           v8.4s, v24.4h, v18.4h
-    uMULL           v26.4s, v22.4h, v18.4h
+    uMULL v8.4s, v24.4h, v18.4h
+    uMULL v26.4s, v22.4h, v18.4h
 
-    NEG             v2.4s, v30.4s
+    NEG  v2.4s, v30.4s
 //    VUZP.16         D30, D31
 
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
+  UZP1      v19.8h, v30.8h, v30.8h
+  UZP2      v21.8h, v30.8h, v30.8h
+  MOV        v30.d[0], v19.d[0]
+  MOV        v30.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v3.d[0], v21.d[0]
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v3.d[0], v21.d[0]
 
-    uMULL           v4.4s, v30.4h, v12.4h
-    uMULL           v6.4s, v2.4h, v13.4h
+    uMULL v4.4s, v30.4h, v12.4h
+    uMULL v6.4s, v2.4h, v13.4h
 
-    ushR            v8.4s, v8.4s, #16
-    ushR            v26.4s, v26.4s, #16
+    ushR v8.4s, v8.4s,#16
+    ushR v26.4s, v26.4s,#16
 
-    sMLAL           v8.4s, v25.4h, v18.4h
-    sMLAL           v26.4s, v23.4h, v18.4h
+    sMLAL v8.4s, v25.4h, v18.4h
+    sMLAL v26.4s, v23.4h, v18.4h
 
-    ushR            v4.4s, v4.4s, #16
-    ushR            v6.4s, v6.4s, #16
+    ushR v4.4s, v4.4s,#16
+    ushR v6.4s, v6.4s,#16
 
-    MOV             v19.d[0], v30.d[1]
+  MOV  v19.d[0], v30.d[1]
 
-    sMLAL           v4.4s, v19.4h, v12.4h
-    sMLAL           v6.4s, v3.4h, v13.4h
+    sMLAL v4.4s, v19.4h, v12.4h
+    sMLAL v6.4s, v3.4h, v13.4h
 
-    NEG             v8.4s, v8.4s
-    ADD             v14.4s, v14.4s , v26.4s
-    ADD             v0.4s, v0.4s , v8.4s
+    NEG  v8.4s, v8.4s
+    ADD  v14.4s,  v14.4s ,  v26.4s
+    ADD  v0.4s,  v0.4s ,  v8.4s
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v8.4s, w11
-    SQADD           v0.4s, v0.4s , v8.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v8.4s,w11
+    SQADD  v0.4s,  v0.4s ,  v8.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v26.4s, w11
-    sQshL           v0.4s, v0.4s, v26.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v26.4s,w11
+    sQshL v0.4s, v0.4s, v26.4s
 
-    mov             v26.16b, v28.16b
+    mov  v26.16b, v28.16b
 
     MOV             x6, x4
 
-    LD1             {v28.2s, v29.2s}, [x4], #16
-    movi            v19.2s, #0x00000000
-    LD1             {v30.s}[0], [x4], #4
-    LD1             {v30.s}[1], [x4], #4
-    LD1             {v19.s}[0], [x4], #4
+    LD1 {v28.2s, v29.2s}, [x4],#16
+    movi  v19.2s, #0x00000000
+    LD1 {v30.s}[0],[x4],#4
+    LD1 {v30.s}[1],[x4],#4
+    LD1 {v19.s}[0],[x4],#4
 
-    MOV             v28.d[1], v29.d[0]
-    MOV             v30.d[1], v19.d[0]
+  MOV        v28.d[1], v29.d[0]
+  MOV        v30.d[1], v19.d[0]
 
     //VUZP.32         Q14, Q15
 
-    UZP1            v19.4s, v28.4s, v30.4s
-    UZP2            v30.4s, v28.4s, v30.4s
-    MOV             v28.16b, v19.16b
-    MOV             v29.d[0], v28.d[1]
+  UZP1      v19.4s, v28.4s, v30.4s
+  UZP2      v30.4s, v28.4s, v30.4s
+  MOV        v28.16b, v19.16b
+  MOV        v29.d[0], v28.d[1]
 
-    ST1             {v26.s}[0], [x6], #4
-    ST1             {v0.s}[0], [x6], #4
-    ST1             {v26.s}[1], [x6], #4
-    ST1             {v0.s}[1], [x6], #4
-    ST1             {v26.s}[2], [x6], #4
-    ST1             {v0.s}[2], [x6], #4
-    ST1             {v26.s}[3], [x6], #4
+    ST1 {v26.s}[0],[x6],#4
+    ST1 {v0.s}[0],[x6],#4
+    ST1 {v26.s}[1],[x6],#4
+    ST1 {v0.s}[1],[x6],#4
+    ST1 {v26.s}[2],[x6],#4
+    ST1 {v0.s}[2],[x6],#4
+    ST1 {v26.s}[3],[x6],#4
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D13, D1
-    SADDL           v0.4s, v13.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v13.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v26.2d, v28.2s, v0.2s
-    Sqxtn           v8.2s, v26.2d
-    sMULL           v26.2d, v29.2s, v1.2s
-    Sqxtn           v9.2s, v26.2d
-    MOV             v8.d[1], v9.d[0]
-    movi            v1.2s, #0
+    sMULL v26.2d, v28.2s, v0.2s
+    Sqxtn v8.2s,  v26.2d
+    sMULL v26.2d, v29.2s, v1.2s
+    Sqxtn v9.2s,  v26.2d
+  MOV    v8.d[1], v9.d[0]
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D12, D1
-    SADDL           v0.4s, v12.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v12.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v24.2d, v28.2s, v0.2s
-    Sqxtn           v26.2s, v24.2d
-    sMULL           v24.2d, v29.2s, v1.2s
-    Sqxtn           v27.2s, v24.2d
-    MOV             v26.d[1], v27.d[0]
+    sMULL v24.2d, v28.2s, v0.2s
+    Sqxtn v26.2s,  v24.2d
+    sMULL v24.2d, v29.2s, v1.2s
+    Sqxtn v27.2s,  v24.2d
+  MOV    v26.d[1], v27.d[0]
 
-    sQshL           v4.4s, v4.4s, v16.4s
-    sQshL           v6.4s, v6.4s, v16.4s
+    sQshL v4.4s, v4.4s, v16.4s
+    sQshL v6.4s, v6.4s, v16.4s
 
-    SQSUB           v4.4s, v4.4s , v8.4s
-    SQSUB           v6.4s, v6.4s , v26.4s
+    SQSUB  v4.4s,  v4.4s ,  v8.4s
+    SQSUB  v6.4s,  v6.4s ,  v26.4s
 
-    NEG             v26.4s, v14.4s
+    NEG  v26.4s, v14.4s
     //VUZP.16         D14, D15
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+     UZP1      v19.8h, v14.8h, v14.8h
+  UZP2      v21.8h, v14.8h, v14.8h
+  MOV        v14.d[0], v19.d[0]
+  MOV        v15.d[0], v21.d[0]
 
-//    VUZP.16         D26, D27
+//  VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D10, D1
-    SADDL           v0.4s, v10.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v10.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v22.2d, v30.2s, v0.2s
-    Sqxtn           v24.2s, v22.2d
-    sMULL2          v22.2d, v30.4s, v0.4s
-    Sqxtn           v25.2s, v22.2d
-    MOV             v24.d[1], v25.d[0]
+    sMULL v22.2d, v30.2s, v0.2s
+    Sqxtn v24.2s,  v22.2d
+    sMULL2 v22.2d, v30.4s, v0.4s
+    Sqxtn v25.2s,  v22.2d
+  MOV    v24.d[1], v25.d[0]
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D11, D1
-    SADDL           v0.4s, v11.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v11.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v8.2d, v30.2s, v0.2s
-    Sqxtn           v22.2s, v8.2d
-    sMULL2          v8.2d, v30.4s, v0.4s
-    Sqxtn           v23.2s, v8.2d
-    MOV             v22.d[1], v23.d[0]
+    sMULL v8.2d, v30.2s, v0.2s
+    Sqxtn v22.2s,  v8.2d
+    sMULL2 v8.2d, v30.4s, v0.4s
+    Sqxtn v23.2s,  v8.2d
+  MOV    v22.d[1], v23.d[0]
 
-    uMULL           v8.4s, v26.4h, v11.4h
-    uMULL           v30.4s, v14.4h, v10.4h
+    uMULL v8.4s, v26.4h, v11.4h
+    uMULL v30.4s, v14.4h, v10.4h
 
-    ushR            v8.4s, v8.4s, #16
+    ushR v8.4s, v8.4s,#16
 
-    ushR            v30.4s, v30.4s, #16
+    ushR v30.4s, v30.4s,#16
 
-    sMLAL           v8.4s, v27.4h, v11.4h
+    sMLAL v8.4s, v27.4h, v11.4h
 
-    sMLAL           v30.4s, v15.4h, v10.4h
+    sMLAL v30.4s, v15.4h, v10.4h
 
-    sQshL           v4.4s, v4.4s, #2
+    MOV V14.16B , V4.16B
 
-    sQshL           v6.4s, v6.4s, #2
+    //mov  v15.8b, v6.8b
+    sQshL v8.4s, v8.4s, v16.4s
 
-    SQADD           v14.4s, v4.4s , v20.4s
+    sQshL v30.4s, v30.4s, v16.4s
 
-    SQADD           v6.4s, v6.4s , v20.4s
+    SQSUB  v8.4s,  v8.4s ,  v24.4s
 
-    sshR            v14.4s, v14.4s, #16
+    SQSUB  v22.4s,  v30.4s ,  v22.4s
 
-//    VUZP.16         D14, D15
-
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
-
-    sshR            v6.4s, v6.4s, #16
-
-    //VUZP.16         D6, D7
-
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
-
-    mov             v15.8b, v6.8b
-    sQshL           v8.4s, v8.4s, v16.4s
-
-    sQshL           v30.4s, v30.4s, v16.4s
-
-    SQSUB           v8.4s, v8.4s , v24.4s
-
-    SQSUB           v22.4s, v30.4s , v22.4s
-
-    sQshL           v30.4s, v8.4s, #2
-
-    sQshL           v22.4s, v22.4s, #2
-
-    SQADD           v30.4s, v30.4s , v20.4s
-    SQADD           v22.4s, v22.4s , v20.4s
-
-    sshR            v30.4s, v30.4s, #16
-
-//    VUZP.16         D30, D31
-
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
-
-    sshR            v22.4s, v22.4s, #16
-
-//    VUZP.16         D22, D23
-
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
-
-    mov             v23.8b, v30.8b
+     MOV  V30.16B, V8.16B
 
 
 
 
-    ST1             {v14.h}[0], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[0], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[1], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[1], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[2], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[2], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[3], [x0]
-    ADD             x0, x0, x9
 
-    ST1             {v15.h}[0], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[0], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[1], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[1], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[2], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[2], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[3], [x5]
-    ADD             x5, x5, x10
 
-    // VPOP            {d8 - d15}
-    // LDMFD sp!, {x4-x12}
-    //ldp x19, x20,[sp],#16
-    pop_v_regs
-    ret
-    //BX              x14
+
+    ST1 {V14.S}[0],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[0],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[1],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[1],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[2],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[2],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[3],[x0]
+  ADD  x0, x0, x9
+
+    ST1 {V6.S}[0],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[0],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[1],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[1],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[2],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[2],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[3],[x5]
+  ADD  x5, x5, x10
+
+   pop_v_regs
+   ret
+
+
diff --git a/decoder/drc_src/impd_drc_api.c b/decoder/drc_src/impd_drc_api.c
index 62df69b..7121a71 100644
--- a/decoder/drc_src/impd_drc_api.c
+++ b/decoder/drc_src/impd_drc_api.c
@@ -19,7 +19,6 @@
 */
 #include <string.h>
 #include <stdlib.h>
-
 #include "impd_type_def.h"
 #include "impd_error_standards.h"
 #include "impd_apicmd_standards.h"
@@ -108,6 +107,8 @@
   pUWORD32 pus_value = pv_value;
   pWORD8 pb_value = pv_value;
   SIZE_T *ps_value = pv_value;
+  pWORD32 pi_value = pv_value;
+  float *pf_value = pv_value;
 
   switch (i_cmd) {
     case IA_API_CMD_GET_MEM_INFO_SIZE:
@@ -269,6 +270,15 @@
           *ps_value = (SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output;
           break;
         }
+        case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: {
+          *pi_value = p_obj_drc->str_payload.pstr_loudness_info->loudness_info
+                          ->loudness_measure->method_val;
+          if (*pi_value < -1)
+            *pi_value = *pi_value * -4;
+          else
+            *pi_value = -1;
+          break;
+        }
       }
       break;
     }
@@ -335,7 +345,18 @@
           p_obj_drc->str_config.loud_norm_flag = *pus_value;
           break;
         }
-
+        case IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE: {
+          p_obj_drc->str_config.album_mode = *pus_value;
+          break;
+        }
+        case IA_DRC_DEC_CONFIG_DRC_BOOST: {
+          p_obj_drc->str_config.boost = (*pf_value);
+          break;
+        }
+        case IA_DRC_DEC_CONFIG_DRC_COMPRESS: {
+          p_obj_drc->str_config.compress = (*pf_value);
+          break;
+        }
         default: { return -1; }
       }
       break;
diff --git a/decoder/drc_src/impd_drc_api_struct_def.h b/decoder/drc_src/impd_drc_api_struct_def.h
index 6c2734a..265a82f 100644
--- a/decoder/drc_src/impd_drc_api_struct_def.h
+++ b/decoder/drc_src/impd_drc_api_struct_def.h
@@ -55,6 +55,9 @@
   WORD32 effect_type;
   WORD32 target_loudness;
   WORD32 loud_norm_flag;
+  WORD32 album_mode;
+  FLOAT32 boost;
+  FLOAT32 compress;
 
 } ia_drc_config_struct;
 
diff --git a/decoder/drc_src/impd_drc_config_params.h b/decoder/drc_src/impd_drc_config_params.h
index e83385a..13a79ec 100644
--- a/decoder/drc_src/impd_drc_config_params.h
+++ b/decoder/drc_src/impd_drc_config_params.h
@@ -41,4 +41,7 @@
 #define IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE 0x0011
 #define IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS 0x0012
 #define IA_DRC_DEC_CONFIG_DRC_LOUD_NORM 0x0013
+#define IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE 0x0014
+#define IA_DRC_DEC_CONFIG_DRC_BOOST 0x0015
+#define IA_DRC_DEC_CONFIG_DRC_COMPRESS 0x0016
 #endif
diff --git a/decoder/drc_src/impd_drc_init.c b/decoder/drc_src/impd_drc_init.c
index 6a41fc0..fa8578e 100644
--- a/decoder/drc_src/impd_drc_init.c
+++ b/decoder/drc_src/impd_drc_init.c
@@ -59,7 +59,8 @@
 WORD32
 impd_drc_dec_interface_add_effect_type(
     ia_drc_interface_struct *pstr_drc_interface, WORD32 drc_effect_type,
-    WORD32 target_loudness, WORD32 loud_norm);
+    WORD32 target_loudness, WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost,
+    FLOAT32 compress);
 
 #define BITSTREAM_FILE_FORMAT_SPLIT 1
 #define LIM_DEFAULT_THRESHOLD (0.89125094f)
@@ -111,6 +112,7 @@
   p_obj_drc->str_config.effect_type = 0;
   p_obj_drc->str_config.target_loudness = -24;
   p_obj_drc->str_config.loud_norm_flag = 0;
+  p_obj_drc->str_config.album_mode = 0;
   memset(&p_obj_drc->str_bit_handler, 0, sizeof(p_obj_drc->str_bit_handler));
 
   return IA_NO_ERROR;
@@ -411,7 +413,8 @@
   err_code = impd_drc_dec_interface_add_effect_type(
       p_obj_drc->str_payload.pstr_drc_interface,
       p_obj_drc->str_config.effect_type, p_obj_drc->str_config.target_loudness,
-      p_obj_drc->str_config.loud_norm_flag);
+      p_obj_drc->str_config.loud_norm_flag, p_obj_drc->str_config.album_mode,
+      p_obj_drc->str_config.boost, p_obj_drc->str_config.compress);
 
   if (err_code != IA_NO_ERROR) return err_code;
 
@@ -454,6 +457,16 @@
       p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info);
   if (err_code != IA_NO_ERROR) return err_code;
 
+  if (p_obj_drc->str_payload.pstr_loudness_info->loudness_info
+          ->anchor_loudness_present)
+    p_obj_drc->str_payload.pstr_selection_proc->uni_drc_sel_proc_params
+        .loudness_measurement_method = METHOD_DEFINITION_ANCHOR_LOUDNESS;
+
+  if (p_obj_drc->str_payload.pstr_loudness_info->loudness_info
+          ->expert_loudness_present)
+    p_obj_drc->str_payload.pstr_selection_proc->uni_drc_sel_proc_params
+        .loudness_measurement_system = USER_MEASUREMENT_SYSTEM_EXPERT_PANEL;
+
   err_code = impd_drc_uni_sel_proc_process(
       p_obj_drc->str_payload.pstr_selection_proc,
       p_obj_drc->str_payload.pstr_drc_config,
diff --git a/decoder/drc_src/impd_drc_interface_decoder.c b/decoder/drc_src/impd_drc_interface_decoder.c
index 4e0301c..557ea2f 100644
--- a/decoder/drc_src/impd_drc_interface_decoder.c
+++ b/decoder/drc_src/impd_drc_interface_decoder.c
@@ -23,7 +23,6 @@
 #include <assert.h>
 #include <string.h>
 #include "impd_type_def.h"
-
 #include "impd_drc_bitbuffer.h"
 #include "impd_drc_common.h"
 #include "impd_drc_interface.h"
@@ -32,7 +31,8 @@
 WORD32
 impd_drc_dec_interface_add_effect_type(
     ia_drc_interface_struct* pstr_drc_interface, WORD32 drc_effect_type,
-    WORD32 target_loudness, WORD32 loud_norm) {
+    WORD32 target_loudness, WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost,
+    FLOAT32 compress) {
   WORD32 err = 0;
   WORD32 i = 0;
 
@@ -67,7 +67,7 @@
         (FLOAT32)target_loudness;
 
     pstr_drc_interface->loudness_norm_parameter_interface_flag = 1;
-    pstr_drc_interface->loudness_norm_param_interface.album_mode = 0;
+    pstr_drc_interface->loudness_norm_param_interface.album_mode = album_mode;
     pstr_drc_interface->loudness_norm_param_interface.peak_limiter = 0;
     pstr_drc_interface->loudness_norm_param_interface
         .change_loudness_deviation_max = 1;
@@ -138,8 +138,8 @@
     pstr_drc_interface->drc_parameter_interface_flag = 1;
     pstr_drc_interface->drc_parameter_interface.change_compress = 1;
     pstr_drc_interface->drc_parameter_interface.change_boost = 1;
-    pstr_drc_interface->drc_parameter_interface.compress = 1.0f;
-    pstr_drc_interface->drc_parameter_interface.boost = 1.0f;
+    pstr_drc_interface->drc_parameter_interface.compress = compress;
+    pstr_drc_interface->drc_parameter_interface.boost = boost;
     pstr_drc_interface->drc_parameter_interface
         .change_drc_characteristic_target = 1;
     pstr_drc_interface->drc_parameter_interface.drc_characteristic_target = 0;
diff --git a/decoder/drc_src/impd_drc_static_payload.c b/decoder/drc_src/impd_drc_static_payload.c
index e389c24..3ad9562 100644
--- a/decoder/drc_src/impd_drc_static_payload.c
+++ b/decoder/drc_src/impd_drc_static_payload.c
@@ -2477,6 +2477,15 @@
   for (i = 0; i < loudness_info->measurement_count; i++) {
     err = impd_parse_loudness_measure(it_bit_buff,
                                       &(loudness_info->loudness_measure[i]));
+
+    if (loudness_info->loudness_measure[i].method_def ==
+        METHOD_DEFINITION_ANCHOR_LOUDNESS)
+      loudness_info->anchor_loudness_present = 1;
+
+    if (loudness_info->loudness_measure[i].measurement_system ==
+        MEASUREMENT_SYSTEM_EXPERT_PANEL)
+      loudness_info->expert_loudness_present = 1;
+
     if (err) return (err);
   }
 
diff --git a/decoder/drc_src/impd_drc_struct.h b/decoder/drc_src/impd_drc_struct.h
index 16e2191..5aa7e30 100644
--- a/decoder/drc_src/impd_drc_struct.h
+++ b/decoder/drc_src/impd_drc_struct.h
@@ -444,6 +444,8 @@
   WORD32 true_peak_level_measurement_system; /* Parsed but unused */
   WORD32 true_peak_level_reliability;        /* Parsed but unused */
   WORD32 measurement_count;
+  WORD32 anchor_loudness_present;
+  WORD32 expert_loudness_present;
   ia_loudness_measure_struct loudness_measure[MEASUREMENT_COUNT_MAX];
 } ia_loudness_info_struct;
 
diff --git a/decoder/generic/ixheaacd_function_selector_generic.c b/decoder/generic/ixheaacd_function_selector_generic.c
index b6c34a5..9354159 100644
--- a/decoder/generic/ixheaacd_function_selector_generic.c
+++ b/decoder/generic/ixheaacd_function_selector_generic.c
@@ -194,18 +194,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec;
@@ -214,14 +202,10 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec;
 
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
diff --git a/decoder/ixheaacd_aac_imdct.c b/decoder/ixheaacd_aac_imdct.c
index 43f2025..6b158de 100644
--- a/decoder/ixheaacd_aac_imdct.c
+++ b/decoder/ixheaacd_aac_imdct.c
@@ -467,14 +467,14 @@
 }
 
 VOID ixheaacd_post_twid_overlap_add_dec(
-    WORD16 pcm_out[], WORD32 spec_data[],
+    WORD32 pcm_out[], WORD32 spec_data[],
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
     WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
     WORD16 ch_fac) {
   WORD i;
   WORD16 cos, cos1, sin, sin1;
   WORD32 size = npoints / 2;
-  WORD16 *pcmout1 = pcm_out + (ch_fac * size);
+  WORD32 *pcmout1 = pcm_out + (ch_fac * size);
   const WORD16 *cos_sin_ptr = ptr_imdct_tables->cosine_array_2048_256;
 
   pcm_out = pcmout1 - ch_fac;
@@ -511,7 +511,7 @@
         ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outi, win1), q_shift),
         ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
 
-    *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+    *pcm_out = accu;
 
     pcm_out -= ch_fac;
     accu = ixheaacd_sub32_sat(
@@ -520,7 +520,7 @@
             q_shift),
         ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1)));
 
-    *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+    *pcmout1 = accu;
 
     pcmout1 += ch_fac;
 
@@ -550,14 +550,16 @@
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outr, win1), q_shift),
           ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
-      *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+
+      *pcm_out = accu;
       pcm_out -= ch_fac;
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_sat(
               ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1),
               q_shift),
           ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1));
-      *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+
+      *pcmout1 = accu;
       pcmout1 += ch_fac;
 
       tempr = *(spec_data - i);
@@ -585,14 +587,15 @@
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outi, win1), q_shift),
           ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
-      *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+
+      *pcm_out = accu;
       pcm_out -= ch_fac;
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_sat(
               ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outi), win1),
               q_shift),
           ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1)));
-      *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+      *pcmout1 = accu;
       pcmout1 += ch_fac;
     }
     cos1 = *cos_sin_ptr++;
@@ -620,14 +623,16 @@
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outr, win1), q_shift),
         ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
-    *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+
+    *pcm_out = accu;
     pcm_out -= ch_fac;
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_sat(
             ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1),
             q_shift),
         ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1));
-    *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+
+    *pcmout1 = accu;
     pcmout1 += ch_fac;
   } else {
     q_shift = -q_shift;
@@ -663,7 +668,7 @@
           ixheaacd_shr32(ixheaacd_mult32x16lin32(outi, win1), q_shift),
           ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
 
-      *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+      *pcm_out = accu;
 
       pcm_out -= ch_fac;
       accu = ixheaacd_sub32_sat(
@@ -672,7 +677,7 @@
               q_shift),
           ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1)));
 
-      *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+      *pcmout1 = accu;
       pcmout1 += ch_fac;
 
       for (i = size - 2; i != 0;) {
@@ -701,14 +706,16 @@
             ixheaacd_shr32(ixheaacd_mult32x16lin32(outr, win1), q_shift),
             ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
 
-        *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+        *pcm_out = accu;
         pcm_out -= ch_fac;
+
         accu = ixheaacd_sub32_sat(
             ixheaacd_shr32(
                 ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1),
                 q_shift),
             ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1));
-        *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+
+        *pcmout1 = accu;
         pcmout1 += ch_fac;
 
         tempr = *(spec_data - i);
@@ -735,15 +742,16 @@
             ixheaacd_shr32(ixheaacd_mult32x16lin32(outi, win1), q_shift),
             ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
 
-        *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+        *pcm_out = accu;
         pcm_out -= ch_fac;
+
         accu = ixheaacd_sub32_sat(
             ixheaacd_shr32(
                 ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outi), win1),
                 q_shift),
             ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1)));
 
-        *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+        *pcmout1 = accu;
         pcmout1 += ch_fac;
       }
       cos1 = *cos_sin_ptr++;
@@ -773,14 +781,14 @@
           ixheaacd_shr32(ixheaacd_mult32x16lin32(outr, win1), q_shift),
           ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
 
-      *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+      *pcm_out = accu;
       pcm_out -= ch_fac;
       accu = ixheaacd_sub32_sat(
           ixheaacd_shr32(
               ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1),
               q_shift),
           ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1));
-      *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+      *pcmout1 = accu;
       pcmout1 += ch_fac;
     }
   }
diff --git a/decoder/ixheaacd_aac_imdct.h b/decoder/ixheaacd_aac_imdct.h
index d6dc58f..950eef9 100644
--- a/decoder/ixheaacd_aac_imdct.h
+++ b/decoder/ixheaacd_aac_imdct.h
@@ -38,19 +38,19 @@
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 npoints);
 
 VOID ixheaacd_post_twid_overlap_add_dec(
-    WORD16 pcm_out[], WORD32 spec_data[],
+    WORD32 pcm_out[], WORD32 spec_data[],
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
     WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
     WORD16 ch_fac);
 
 VOID ixheaacd_post_twid_overlap_add_armv7(
-    WORD16 pcm_out[], WORD32 spec_data[],
+    WORD32 pcm_out[], WORD32 spec_data[],
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
     WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
     WORD16 ch_fac);
 
 VOID ixheaacd_post_twid_overlap_add_armv8(
-    WORD16 pcm_out[], WORD32 spec_data[],
+    WORD32 pcm_out[], WORD32 spec_data[],
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
     WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
     WORD16 ch_fac);
diff --git a/decoder/ixheaacd_aacdecoder.c b/decoder/ixheaacd_aacdecoder.c
index 6c26d2d..c9c1547 100644
--- a/decoder/ixheaacd_aacdecoder.c
+++ b/decoder/ixheaacd_aacdecoder.c
@@ -85,16 +85,18 @@
 #define EXT_FILL_DATA 1
 #define EXT_FIL 0
 
+#define MIN(x, y) ((x) > (y) ? (y) : (x))
+
 WORD32 ixheaacd_aacdec_decodeframe(
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
-    ia_aac_dec_scratch_struct *aac_scratch_ptrs, WORD16 *time_data,
+    ia_aac_dec_scratch_struct *aac_scratch_ptrs, VOID *time_data_tmp,
     FLAG frame_status, WORD *type, WORD *ch_idx, WORD init_flag, WORD channel,
     WORD *element_index_order, WORD skip_full_decode, WORD ch_fac,
     WORD slot_element, WORD max_channels, WORD32 total_channels,
     WORD32 frame_length, WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec,
     WORD32 object_type, WORD32 ch_config,
     ia_eld_specific_config_struct eld_specific_config, WORD16 adtsheader,
-    ia_drc_dec_struct *drc_dummy)
+    ia_drc_dec_struct *drc_dummy, UWORD8 *slot_pos)
 
 {
   WORD ch, ele_type;
@@ -129,6 +131,8 @@
   WORD32 *work_buffer_2 = aac_scratch_ptrs->extra_scr_4k[2];
   p_state_enhaacplus_dec = p_obj_exhaacplus_dec->p_state_aac;
 
+  WORD32 *time_data = (WORD32 *)time_data_tmp;
+
   aac_dec_handle = p_state_enhaacplus_dec->pstr_aac_dec_info[*ch_idx];
   it_bit_buff = p_state_enhaacplus_dec->ptr_bit_stream;
 
@@ -810,8 +814,14 @@
         if (skip_full_decode == 0) {
           ixheaacd_imdct_process(
               aac_dec_handle->pstr_aac_dec_overlap_info[ch], spec_coef[ch],
-              &str_ics_info[ch], time_data + slot_element, (WORD16)ch_fac,
-              scratch[ch], aac_dec_handle->pstr_aac_tables, object_type);
+              &str_ics_info[ch], time_data + slot_element, ch_fac, scratch[ch],
+              aac_dec_handle->pstr_aac_tables, object_type, slot_element);
+
+          if (slot_pos != NULL) *slot_pos = slot_element;
+
+          p_obj_exhaacplus_dec->p_state_aac
+              ->qshift_adj[p_obj_exhaacplus_dec->p_state_aac->qshift_cnt++] =
+              str_ics_info[ch].qshift_adj;
 
           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
               ->overlap_add_data.win_shape = str_ics_info[ch].window_shape;
@@ -827,7 +837,7 @@
                     time_data + slot_element, overlap1,
                     aac_dec_handle->samples_per_frame, object_type,
                     (WORD16)ch_fac, str_ics_info[ch].window_sequence,
-                    (WORD16 *)ptr_long_window_next);
+                    (WORD16 *)ptr_long_window_next, slot_element);
               } else {
                 ixheaacd_lt_update_state(
                     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
@@ -835,7 +845,7 @@
                     time_data + slot_element, overlap1,
                     aac_dec_handle->samples_per_frame, object_type,
                     (WORD16)ch_fac, str_ics_info[ch].window_sequence,
-                    (WORD16 *)ptr_short_window_next);
+                    (WORD16 *)ptr_short_window_next, slot_element);
               }
             }
           }
diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c
index 3a17d1d..8e9a2a6 100644
--- a/decoder/ixheaacd_api.c
+++ b/decoder/ixheaacd_api.c
@@ -119,6 +119,18 @@
 #define IXHEAACD_CCE_DEC_INFO_MEM_SIZE (610)
 #define IXHEAACD_CCE_DEC_INFO_MEM_SIZE_8 (IXHEAACD_CCE_DEC_INFO_MEM_SIZE + 8)
 
+#define LD_OBJ -2
+
+#define MIN(x, y) ((x) > (y) ? (y) : (x))
+
+WORD32 ixheaacd_peak_limiter_init(ia_peak_limiter_struct *peak_limiter,
+                                  UWORD32 num_channels, UWORD32 sample_rate,
+                                  FLOAT32 *buffer, UWORD32 *delay_in_samples);
+
+VOID ixheaacd_peak_limiter_process(ia_peak_limiter_struct *peak_limiter,
+                                   VOID *samples, UWORD32 frame_len,
+                                   WORD8 *qshift_adj);
+
 IA_ERRORCODE ixheaacd_dec_mem_api(
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 i_cmd,
     WORD32 i_idx, VOID *pv_value) {
@@ -277,11 +289,41 @@
 VOID ixheaacd_allocate_sbr_scr(ia_sbr_scr_struct *sbr_scratch_struct,
                                VOID *base_scratch_ptr, VOID *output_ptr,
                                WORD total_elements, WORD ch_fac,
-                               WORD32 audio_object_type) {
+                               WORD32 audio_object_type, WORD32 total_channels,
+                               WORD8 *p_qshift_arr, UWORD8 slot_pos,
+                               UWORD8 num_ch) {
   WORD32 temp = 0;
+  WORD32 j, i;
   sbr_scratch_struct->ptr_work_buf_core = base_scratch_ptr;
   sbr_scratch_struct->ptr_work_buf = (WORD8 *)base_scratch_ptr + (18 * 1024);
 
+  if (p_qshift_arr != NULL && *p_qshift_arr != LD_OBJ) {
+    WORD32 *tmp_buf = (WORD32 *)output_ptr;
+
+    for (j = 1; j < num_ch; j++) {
+      if ((*p_qshift_arr + j) == 0)
+        *(p_qshift_arr + j) = *(p_qshift_arr + j - 1);
+    }
+
+    if (total_channels > 2) {
+      for (j = 0; j < num_ch; j++) {
+        for (i = 0; i < 1024; i++) {
+          *((WORD16 *)tmp_buf + slot_pos + total_channels * i + j) =
+              ixheaacd_round16(ixheaacd_shl32_sat(
+                  *(tmp_buf + slot_pos + total_channels * i + j),
+                  *(p_qshift_arr + j)));
+        }
+      }
+    } else {
+      for (j = 0; j < num_ch; j++) {
+        for (i = 0; i < 1024; i++) {
+          *((WORD16 *)tmp_buf + total_channels * i + j) =
+              ixheaacd_round16(ixheaacd_shl32_sat(
+                  *(tmp_buf + total_channels * i + j), *(p_qshift_arr + j)));
+        }
+      }
+    }
+  }
   if (total_elements > 1) {
     sbr_scratch_struct->extra_scr_1k[0] =
         (WORD8 *)base_scratch_ptr + (18 * 1024);
@@ -319,6 +361,7 @@
   pWORD32 pui_value_signed = pv_value;
   pWORD8 pb_value = pv_value;
   pVOID *pp_value = (pVOID *)pv_value;
+  float *pf_value = pv_value;
 
   if ((i_cmd != IA_API_CMD_GET_API_SIZE) &&
       (i_cmd != IA_API_CMD_GET_LIB_ID_STRINGS)) {
@@ -406,6 +449,7 @@
           p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 0;
           p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 0;
+          p_obj_exhaacplus_dec->aac_config.output_level = -1;
 
           p_obj_exhaacplus_dec->aac_config.ui_max_channels = 6;
 
@@ -558,28 +602,29 @@
         }
         case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT: {
           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
-          if (*pui_value > 127) {
+          if (*pf_value > 1) {
             p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0;
             return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_CUT);
           }
           p_obj_exhaacplus_dec->aac_config.ui_drc_cut =
-              (WORD32)((*pui_value / 127.0) * 100);
+              (WORD32)((*pf_value) * 100);
           break;
         }
 
         case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST: {
           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
-          if (*pui_value > 127) {
+          if (*pf_value > 1) {
             p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0;
             return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_BOOST);
           }
           p_obj_exhaacplus_dec->aac_config.ui_drc_boost =
-              (WORD32)((*pui_value / 127.0) * 100);
+              (WORD32)((*pf_value) * 100);
           break;
         }
 
         case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL: {
           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
+          p_obj_exhaacplus_dec->aac_config.i_loud_ref_level = *pui_value_signed;
           if (*pui_value > 127) {
             p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
             return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_TARGET);
@@ -815,6 +860,10 @@
                    (IA_ENHAACPDEC_NUM_MEMTABS);
       break;
     }
+    case IA_API_CMD_GET_LOUDNESS_VAL: {
+      *pui_value = p_obj_exhaacplus_dec->aac_config.output_level;
+      break;
+    }
     case IA_API_CMD_SET_MEMTABS_PTR: {
       if (pv_value == NULL) return IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALLOC;
       memset(pv_value, 0, (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) *
@@ -844,6 +893,9 @@
               p_obj_exhaacplus_dec->p_state_aac->fatal_err_present) {
             err_code = IA_FATAL_ERROR;
           } else {
+            memset(p_obj_exhaacplus_dec->p_state_aac->qshift_adj, 0,
+                   sizeof(p_obj_exhaacplus_dec->p_state_aac->qshift_adj));
+            p_obj_exhaacplus_dec->p_state_aac->qshift_cnt = 0;
             err_code = ixheaacd_dec_execute(p_obj_exhaacplus_dec);
           }
           if (err_code != IA_NO_ERROR) {
@@ -1018,6 +1070,7 @@
 
     p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 0;
     p_obj_exhaacplus_dec->aac_config.downmix = 0;
+    p_obj_exhaacplus_dec->p_state_aac->peak_lim_init = 0;
 
     {
       ia_aac_dec_tables_struct *pstr_aac_tables =
@@ -1324,6 +1377,8 @@
   p_obj_exhaacplus_dec->p_state_aac =
       p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_PERSIST_IDX];
 
+  p_obj_exhaacplus_dec->p_state_aac->preroll_config_present = 0;
+
   if (p_obj_exhaacplus_dec->p_state_aac != NULL) {
     ret_val = setjmp(p_obj_exhaacplus_dec->p_state_aac->xaac_jmp_buf);
     if (ret_val != 0) {
@@ -1808,7 +1863,18 @@
           p_state_enhaacplus_dec->ch_config,
           p_state_enhaacplus_dec->eld_specific_config,
           p_state_enhaacplus_dec->s_adts_hdr_present,
-          &p_state_enhaacplus_dec->drc_dummy);
+          &p_state_enhaacplus_dec->drc_dummy,
+          &p_state_enhaacplus_dec->slot_pos);
+
+      if (p_state_enhaacplus_dec->pstr_drc_dec->drc_element_found == 1) {
+        if (p_obj_exhaacplus_dec->aac_config.i_loud_ref_level < 0) {
+          p_obj_exhaacplus_dec->aac_config.output_level =
+              p_state_enhaacplus_dec->pstr_drc_dec->prog_ref_level;
+        } else {
+          p_obj_exhaacplus_dec->aac_config.output_level =
+              p_obj_exhaacplus_dec->aac_config.i_loud_ref_level;
+        }
+      }
 
       memset(&(p_obj_exhaacplus_dec->p_state_aac->pstr_aac_dec_info[ch_idx]
                    ->pstr_aac_dec_ch_info[0]
@@ -1899,7 +1965,8 @@
         WORD16 num_channels_1_t = num_channels_1;
         ixheaacd_allocate_sbr_scr(
             &sbr_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v,
-            time_data, 1, 1, p_state_enhaacplus_dec->audio_object_type);
+            time_data, 1, 1, p_state_enhaacplus_dec->audio_object_type, 0, NULL,
+            0, 0);
 
         if (ixheaacd_applysbr(
                 p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
@@ -2227,7 +2294,7 @@
   WORD type;
   WORD total_channels = 0;
   WORD total_elements = 0;
-  WORD16 *actual_out_buffer;
+  WORD16 *actual_out_buffer = NULL;
   WORD ps_enable;
   WORD esbr_mono_downmix = 0;
   WORD8 element_used[MAX_BS_ELEMENT];
@@ -2347,7 +2414,7 @@
       scratch_pointer = 12 * 1024;
 
       p_state_enhaacplus_dec->coup_ch_output =
-          (WORD16 *)((WORD8 *)
+          (WORD32 *)((WORD8 *)
                          p_obj_exhaacplus_dec->p_state_aac->aac_scratch_mem_v +
                      scratch_pointer);
     }
@@ -2363,6 +2430,52 @@
   p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
 
   if (p_state_enhaacplus_dec->ui_in_bytes == 0) {
+    WORD32 i, j;
+    if (p_state_enhaacplus_dec->peak_lim_init == 1) {
+      p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes =
+          (p_state_enhaacplus_dec->peak_limiter.attack_time_samples) *
+          total_channels * sizeof(WORD16);
+
+      for (j = 0; j < total_channels; j++) {
+        for (i = 0;
+             i < (p_state_enhaacplus_dec->peak_limiter.attack_time_samples -
+                  p_state_enhaacplus_dec->peak_limiter.delayed_input_index);
+             i++) {
+          *(time_data + total_channels * i + j) = ixheaacd_round16(
+              *(p_state_enhaacplus_dec->peak_limiter.delayed_input +
+                (p_state_enhaacplus_dec->peak_limiter.delayed_input_index) *
+                    total_channels +
+                total_channels * i + j));
+        }
+      }
+
+      for (j = 0; j < total_channels; j++) {
+        for (i = 0;
+             i < p_state_enhaacplus_dec->peak_limiter.delayed_input_index;
+             i++) {
+          *(time_data +
+            (p_state_enhaacplus_dec->peak_limiter.attack_time_samples -
+             p_state_enhaacplus_dec->peak_limiter.delayed_input_index) *
+                total_channels +
+            total_channels * i + j) =
+              ixheaacd_round16(
+                  *(p_state_enhaacplus_dec->peak_limiter.delayed_input +
+                    total_channels * i + j));
+        }
+      }
+
+      if (p_obj_exhaacplus_dec->aac_config.dup_stereo_flag) {
+        for (i = 0;
+             i < (p_state_enhaacplus_dec->peak_limiter.attack_time_samples);
+             i++) {
+          time_data[2 * i + 1] = time_data[2 * i + 0];
+        }
+      }
+      p_state_enhaacplus_dec->peak_lim_init = 0xFF;
+    } else {
+      p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
+    }
+
     p_state_enhaacplus_dec->i_bytes_consumed = 0;
     return IA_NO_ERROR;
   }
@@ -2505,6 +2618,10 @@
     p_state_enhaacplus_dec->pstr_drc_dec->state = 1;
   }
 
+  WORD16 *intermediate_scr =
+      (WORD16 *)(WORD8 *)p_state_enhaacplus_dec->aac_scratch_mem_v +
+      (128 * 1024);
+
   for (ch_idx1 = 0; ch_idx1 < total_elements; ch_idx1++) {
     WORD32 skip_full_decode = 0;
     WORD32 ch_idx = ch_idx1;
@@ -2582,7 +2699,8 @@
       if (p_obj_exhaacplus_dec->aac_config.element_type[1] < 3 &&
           p_obj_exhaacplus_dec->aac_config.element_type[1] > 0 &&
           p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2) {
-        actual_out_buffer = p_state_enhaacplus_dec->coup_ch_output;
+        actual_out_buffer =
+            (WORD16 *)(VOID *)p_state_enhaacplus_dec->coup_ch_output;
       }
       ch_fac = 1;
       slot_ele = 0;
@@ -2599,8 +2717,8 @@
           time_data, channel, p_obj_exhaacplus_dec->aac_config.ui_max_channels,
           p_state_enhaacplus_dec->audio_object_type);
 
-      if(p_state_enhaacplus_dec->ch_config == 2 && channel == 1)
-          return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+      if (p_state_enhaacplus_dec->ch_config == 2 && channel == 1)
+        return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
 
       error_code = ixheaacd_aacdec_decodeframe(
           p_obj_exhaacplus_dec, &aac_scratch_struct, actual_out_buffer,
@@ -2614,7 +2732,21 @@
           p_state_enhaacplus_dec->ch_config,
           p_state_enhaacplus_dec->eld_specific_config,
           p_state_enhaacplus_dec->s_adts_hdr_present,
-          &p_state_enhaacplus_dec->drc_dummy);
+          &p_state_enhaacplus_dec->drc_dummy,
+          &p_state_enhaacplus_dec->slot_pos);
+
+      p_state_enhaacplus_dec->slot_pos -= (channel - 1);
+      p_state_enhaacplus_dec->sbr_present = 0;
+
+      if (p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ &&
+          p_state_enhaacplus_dec->frame_counter == 0) {
+        ixheaacd_peak_limiter_init(
+            &p_state_enhaacplus_dec->peak_limiter, total_channels,
+            p_obj_exhaacplus_dec->p_state_aac->p_config->ui_samp_freq,
+            &p_state_enhaacplus_dec->peak_limiter.buffer[0],
+            &p_obj_exhaacplus_dec->p_state_aac->delay_in_samples);
+        p_obj_exhaacplus_dec->p_state_aac->peak_lim_init = 1;
+      }
 
       if (p_state_enhaacplus_dec->audio_object_type < ER_OBJECT_START ||
           (p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LD &&
@@ -2692,10 +2824,15 @@
       if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] &&
           p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
         ia_sbr_scr_struct sbr_scratch_struct;
-        ixheaacd_allocate_sbr_scr(&sbr_scratch_struct,
-                                  p_state_enhaacplus_dec->aac_scratch_mem_v,
-                                  time_data, total_elements, ch_fac,
-                                  p_state_enhaacplus_dec->audio_object_type);
+        ixheaacd_allocate_sbr_scr(
+            &sbr_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v,
+            time_data, total_elements, ch_fac,
+            p_state_enhaacplus_dec->audio_object_type, total_channels,
+            p_obj_exhaacplus_dec->p_state_aac->qshift_adj,
+            p_state_enhaacplus_dec->slot_pos, channel);
+
+        p_state_enhaacplus_dec->sbr_present = 1;
+        p_state_enhaacplus_dec->peak_lim_init = 0;
 
         if (ixheaacd_applysbr(
                 p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
@@ -2721,8 +2858,17 @@
       sample_rate = sample_rate_dec;
     }
 
+    if (p_state_enhaacplus_dec->sbr_present ||
+        p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] == LD_OBJ) {
+      num_of_out_samples = frame_size;
+
+    } else {
+      num_of_out_samples =
+          frame_size -
+          MIN(p_obj_exhaacplus_dec->p_state_aac->delay_in_samples, frame_size);
+    }
+
     p_obj_exhaacplus_dec->aac_config.ui_samp_freq = sample_rate;
-    num_of_out_samples = frame_size;
 
     p_state_enhaacplus_dec->num_channel_last = num_ch;
     p_state_enhaacplus_dec->num_of_out_samples = num_of_out_samples;
@@ -2732,12 +2878,11 @@
     {
       if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1 &&
           channel == 1 && total_elements == 1 && num_ch == 1) {
-        WORD i;
         num_ch = 2;
+        p_obj_exhaacplus_dec->aac_config.dup_stereo_flag = 1;
 
-        for (i = 0; i < frame_size; i++) {
-          actual_out_buffer[2 * i + 1] = actual_out_buffer[2 * i + 0];
-        }
+      } else {
+        p_obj_exhaacplus_dec->aac_config.dup_stereo_flag = 0;
       }
 
       p_obj_exhaacplus_dec->aac_config.ui_n_channels = num_ch;
@@ -2750,6 +2895,22 @@
     else {
       channel_coupling_flag = 1;
     }
+
+    if (p_state_enhaacplus_dec->sbr_present && total_channels > 2) {
+      for (int j = 0; j < channel; j++) {
+        for (int i = 0; i < frame_size; i++) {
+          intermediate_scr[total_channels * i + j +
+                           p_state_enhaacplus_dec->slot_pos] =
+              actual_out_buffer[total_channels * i + j +
+                                p_state_enhaacplus_dec->slot_pos];
+        }
+      }
+    }
+  }
+
+  if (p_state_enhaacplus_dec->sbr_present && total_channels > 2) {
+    memcpy(time_data, intermediate_scr,
+           sizeof(WORD16) * frame_size * total_channels);
   }
 
   {
@@ -2766,12 +2927,63 @@
 
   p_state_enhaacplus_dec->frame_counter++;
 
+  WORD32 i, j;
+
   if (channel_coupling_flag) {
     ixheaacd_dec_ind_coupling(p_obj_exhaacplus_dec,
                               p_state_enhaacplus_dec->coup_ch_output,
                               num_of_out_samples, total_channels, time_data);
   }
 
+  for (i = 0; i < total_channels; i++) {
+    if (p_obj_exhaacplus_dec->p_state_aac->qshift_adj[i + 1] == 0)
+      p_obj_exhaacplus_dec->p_state_aac->qshift_adj[i + 1] =
+          p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0];
+  }
+
+  if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1 &&
+      total_elements == 1 && num_ch == 2 &&
+      p_obj_exhaacplus_dec->aac_config.dup_stereo_flag == 1) {
+    WORD i;
+
+    if (!p_state_enhaacplus_dec->sbr_present &&
+        p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ) {
+      for (i = 0; i < frame_size; i++) {
+        *((WORD32 *)actual_out_buffer + 2 * i + 1) =
+            *((WORD32 *)actual_out_buffer + 2 * i);
+      }
+    } else {
+      for (i = 0; i < frame_size; i++) {
+        *(actual_out_buffer + 2 * i + 1) = *(actual_out_buffer + 2 * i);
+      }
+    }
+  }
+
+  if (!p_state_enhaacplus_dec->sbr_present &&
+      p_obj_exhaacplus_dec->p_state_aac->peak_lim_init == 1 &&
+      p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ) {
+    ixheaacd_peak_limiter_process(
+        &p_state_enhaacplus_dec->peak_limiter, time_data, frame_size,
+        p_obj_exhaacplus_dec->p_state_aac->qshift_adj);
+
+    for (i = 0; i < frame_size * 2; i++) {
+      for (j = 0; j < total_channels; j++) {
+        *((WORD16 *)time_data + total_channels * i + j) =
+            ixheaacd_round16(*((WORD32 *)time_data + total_channels * i + j));
+      }
+    }
+
+    memmove(
+        time_data,
+        (time_data +
+         total_channels * p_obj_exhaacplus_dec->p_state_aac->delay_in_samples),
+        sizeof(WORD16) * num_of_out_samples * total_channels);
+
+    p_obj_exhaacplus_dec->p_state_aac->delay_in_samples =
+        p_obj_exhaacplus_dec->p_state_aac->delay_in_samples -
+        MIN(p_obj_exhaacplus_dec->p_state_aac->delay_in_samples, frame_size);
+  }
+
   if ((total_channels > 2) && (1 == p_obj_exhaacplus_dec->aac_config.downmix)) {
     ixheaacd_dec_downmix_to_stereo(p_obj_exhaacplus_dec, num_of_out_samples,
                                    total_elements, time_data, total_channels);
diff --git a/decoder/ixheaacd_apicmd_standards.h b/decoder/ixheaacd_apicmd_standards.h
index 802585d..baa8f40 100644
--- a/decoder/ixheaacd_apicmd_standards.h
+++ b/decoder/ixheaacd_apicmd_standards.h
@@ -60,6 +60,7 @@
 #define IA_API_CMD_GET_TABLE_INFO_PRIORITY 0x001C
 #define IA_API_CMD_SET_TABLE_PTR 0x001D
 #define IA_API_CMD_GET_TABLE_PTR 0x001E
+#define IA_API_CMD_GET_LOUDNESS_VAL 0x001F
 
 /*****************************************************************************/
 /* Ittiam standard API command indices                                       */
diff --git a/decoder/ixheaacd_block.c b/decoder/ixheaacd_block.c
index 2784edd..2424676 100644
--- a/decoder/ixheaacd_block.c
+++ b/decoder/ixheaacd_block.c
@@ -17,6 +17,7 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
+#include <stdlib.h>
 #include "ixheaacd_sbr_common.h"
 #include "ixheaacd_type_def.h"
 
@@ -1122,6 +1123,10 @@
     } else {
       it_bit_buff->ptr_read_next += (it_bit_buff->bit_pos) >> 3;
       it_bit_buff->bit_pos = it_bit_buff->bit_pos & 0x7;
+      if ((SIZE_T)(it_bit_buff->ptr_read_next) > (SIZE_T)(it_bit_buff->ptr_bit_buf_end + 1))
+      {
+        return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+      }
 
       bits_cons = ((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
                   ((it_bit_buff->bit_pos - start_bit_pos));
@@ -1131,9 +1136,11 @@
   return ret_val;
 }
 
-void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, WORD16 *out,
+void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, VOID *out_tmp,
                            const WORD16 *window, WORD16 q_shift, WORD16 size,
-                           WORD16 stride) {
+                           WORD16 stride , WORD slot_element) {
+ 
+  
   WORD32 accu;
   WORD32 i;
   WORD16 rounding_fac = -0x2000;
@@ -1145,6 +1152,8 @@
   WORD32 *pwin1, *pwin2;
   WORD32 *pCoef = &coef[size * 2 - 1 - 0];
 
+  WORD16 * out  = (WORD16*)out_tmp - slot_element;
+
   pwin1 = &window_i[size - 1 - 0];
   pwin2 = &window_i[size + 0];
 
@@ -1182,12 +1191,12 @@
   }
 }
 
-VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD32 *out,
                                 const WORD16 *window, WORD16 q_shift,
                                 WORD16 size, WORD16 ch_fac) {
   WORD32 accu;
   WORD32 i;
-  WORD16 rounding_fac = -0x2000;
+  WORD16 rounding_fac = 0;
 
   for (i = 0; i < size; i++) {
     WORD16 window1, window2;
@@ -1198,16 +1207,14 @@
         ixheaacd_shl32_dir_sat_limit(
             ixheaacd_mult32x16in32(coef[size * 2 - 1 - i], window2), q_shift),
         ixheaacd_mac32x16in32_drc(rounding_fac, prev[i], window1));
-    out[ch_fac * (size - i - 1)] =
-        ixheaacd_shr32(ixheaacd_shl32_dir_sat_limit(accu, 2), 16);
+    out[ch_fac * (size - i - 1)] = accu;
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_dir_sat_limit(
             ixheaacd_mult32x16in32(ixheaacd_negate32(coef[size * 2 - 1 - i]),
                                    window1),
             q_shift),
         ixheaacd_mac32x16in32_drc(rounding_fac, prev[i], window2));
-    out[ch_fac * (size + i)] =
-        ixheaacd_shr32(ixheaacd_shl32_dir_sat_limit(accu, 2), 16);
+    out[ch_fac * (size + i)] = accu;
   }
 }
 
diff --git a/decoder/ixheaacd_block.h b/decoder/ixheaacd_block.h
index 739116c..51a1d9f 100644
--- a/decoder/ixheaacd_block.h
+++ b/decoder/ixheaacd_block.h
@@ -78,15 +78,15 @@
     WORD32 aac_spect_data_resil_flag, WORD32 aac_sect_data_resil_flag,
     ia_aac_dec_tables_struct *ptr_aac_tables);
 
-VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD32 *out,
                                 const WORD16 *window, WORD16 q_shift,
                                 WORD16 size, WORD16 ch_fac);
 
-VOID ixheaacd_over_lap_add1_armv7(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_over_lap_add1_armv7(WORD32 *coef, WORD32 *prev, WORD32 *out,
                                   const WORD16 *window, WORD16 q_shift,
                                   WORD16 size, WORD16 ch_fac);
 
-VOID ixheaacd_over_lap_add1_armv8(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_over_lap_add1_armv8(WORD32 *coef, WORD32 *prev, WORD32 *out,
                                   const WORD16 *window, WORD16 q_shift,
                                   WORD16 size, WORD16 ch_fac);
 
@@ -120,10 +120,10 @@
                                        WORD32 *ptr_spec_coeff, WORD32 q_shift,
                                        WORD32 size);
 
-VOID ixheaacd_overlap_buf_out_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf,
+VOID ixheaacd_overlap_buf_out_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
                                   WORD32 size, const WORD16 ch_fac);
 
-VOID ixheaacd_overlap_buf_out_armv7(WORD16 *out_samples,
+VOID ixheaacd_overlap_buf_out_armv7(WORD32 *out_samples,
                                     WORD32 *ptr_overlap_buf, WORD32 size,
                                     const WORD16 ch_fac);
 
@@ -132,33 +132,33 @@
 VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info,
                             WORD32 *ptr_spec_coeff,
                             ia_ics_info_struct *ptr_ics_info,
-                            WORD16 out_samples[], const WORD16 ch_fac,
+                            VOID* out_samples, const WORD16 ch_fac,
                             WORD32 *scratch,
                             ia_aac_dec_tables_struct *ptr_aac_tables,
-                            WORD32 object_type);
+                            WORD32 object_type , WORD slot_element);
 
-VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift,
                                  WORD16 ch_fac);
 
-VOID ixheaacd_neg_shift_spec_armv7(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+VOID ixheaacd_neg_shift_spec_armv7(WORD32 *coef, WORD32 *out, WORD16 q_shift,
                                    WORD16 ch_fac);
 
-VOID ixheaacd_neg_shift_spec_armv8(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+VOID ixheaacd_neg_shift_spec_armv8(WORD32 *coef, WORD32 *out, WORD16 q_shift,
                                    WORD16 ch_fac);
 
 VOID ixheaacd_nolap1_32(WORD32 *coef, WORD32 *out, WORD16 cu_scale,
                         WORD16 stride);
 
-VOID ixheaacd_overlap_out_copy_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf,
+VOID ixheaacd_overlap_out_copy_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
                                    WORD32 *ptr_overlap_buf1,
                                    const WORD16 ch_fac);
 
-VOID ixheaacd_overlap_out_copy_armv7(WORD16 *out_samples,
+VOID ixheaacd_overlap_out_copy_armv7(WORD32 *out_samples,
                                      WORD32 *ptr_overlap_buf,
                                      WORD32 *ptr_overlap_buf1,
                                      const WORD16 ch_fac);
 
-VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD32 *out,
                                  const WORD16 *short_window,
                                  const WORD16 *short_window_prev,
                                  const WORD16 *long_window_prev, WORD16 q_shift,
@@ -173,7 +173,7 @@
 void ixheaacd_eld_dec_windowing(WORD32 *ptr_spect_coeff, const WORD16 *ptr_win,
                                 WORD32 framesize, WORD16 q_shift,
                                 WORD32 *ptr_overlap_buf, const WORD16 stride,
-                                WORD16 *out_samples);
+                                VOID *out_samples, WORD slot_element);
 
 WORD32 ixheaacd_extension_payload(ia_bit_buf_struct *it_bit_buff, WORD32 cnt);
 
@@ -182,8 +182,8 @@
                                  WORD32 total_channels, WORD32 object_type,
                                  WORD32 aac_sf_data_resil_flag);
 
-void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, WORD16 *out,
+void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, VOID *out_tmp,
                            const WORD16 *window, WORD16 q_shift, WORD16 size,
-                           WORD16 stride);
+                           WORD16 stride , WORD slot_element);
 
 #endif /* #ifndef IXHEAACD_BLOCK_H */
diff --git a/decoder/ixheaacd_channelinfo.h b/decoder/ixheaacd_channelinfo.h
index b582c0e..4cf1216 100644
--- a/decoder/ixheaacd_channelinfo.h
+++ b/decoder/ixheaacd_channelinfo.h
@@ -43,6 +43,7 @@
   WORD16 predictor_data_present;
   ltp_info ltp;
   ltp_info ltp2;
+  WORD8 qshift_adj;
 } ia_ics_info_struct;
 
 typedef struct {
diff --git a/decoder/ixheaacd_decode_main.c b/decoder/ixheaacd_decode_main.c
index 7ee1bcd..cc1a971 100644
--- a/decoder/ixheaacd_decode_main.c
+++ b/decoder/ixheaacd_decode_main.c
@@ -65,12 +65,14 @@
 #include "ixheaacd_create.h"
 #include "ixheaacd_dec_main.h"
 #include "ixheaacd_error_standards.h"
+#include "ixheaacd_struct_def.h"
 VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out,
                           WORD32 pcmsize, FLOAT32 (*out_samples)[4096],
                           WORD32 *out_bytes, WORD32 num_channel_out) {
   WORD32 num;
   WORD32 i;
-  FLOAT32 sample;
+  WORD32 write_local;
+  FLOAT32 write_local_float;
 
   WORD16 *out_buf = (WORD16 *)outbuffer;
 
@@ -78,29 +80,30 @@
 
   if (pcmsize == 16) {
     for (i = 0; i < num; i++) {
-      sample = (out_samples[i % num_channel_out][i / num_channel_out]);
+      write_local_float =
+          (out_samples[i % num_channel_out][i / num_channel_out]);
 
-      if (sample > MAX_16) {
-        sample = MAX_16;
-      } else if (sample < MIN_16) {
-        sample = MIN_16;
+      if (write_local_float > 32767.0f) {
+        write_local_float = 32767.0f;
+      } else if (write_local_float < -32768.0f) {
+        write_local_float = -32768.0f;
       }
-      out_buf[i] = (WORD16)sample;
+      out_buf[i] = (WORD16)write_local_float;
     }
 
     *out_bytes = num * sizeof(WORD16);
   } else {
     WORD8 *out_24bit = (WORD8 *)out_buf;
     for (i = 0; i < num; i++) {
-      WORD32 write_local;
-      sample = (out_samples[i % num_channel_out][i / num_channel_out] * 256);
+      write_local_float =
+          (out_samples[i % num_channel_out][i / num_channel_out] * 256);
 
-      if (sample > MAX_24) {
-        sample = MAX_24;
-      } else if (sample < MIN_24) {
-        sample = MIN_24;
+      if (write_local_float > 8388607.0f) {
+        write_local_float = 8388607.0f;
+      } else if (write_local_float < -8388608.0f) {
+        write_local_float = -8388608.0f;
       }
-      write_local = (WORD32)sample;
+      write_local = (WORD32)write_local_float;
 
       *out_24bit++ = (WORD32)write_local & 0xff;
       *out_24bit++ = ((WORD32)write_local >> 8) & 0xff;
@@ -112,10 +115,9 @@
 }
 
 /* audio pre roll frame parsing*/
-static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data,
-                                             UWORD8 *conf_buf,
-                                             WORD32 *preroll_units,
-                                             WORD32 *preroll_frame_offset) {
+static WORD32 ixheaacd_audio_preroll_parsing(
+    ia_dec_data_struct *pstr_dec_data, UWORD8 *conf_buf, WORD32 *preroll_units,
+    WORD32 *preroll_frame_offset, ia_aac_dec_state_struct *aac_dec_handle) {
   ia_bit_buf_struct *temp_buff =
       (ia_bit_buf_struct *)&(pstr_dec_data->dec_bit_buf);
   WORD32 independency_flag = 0;
@@ -128,7 +130,6 @@
   WORD32 num_pre_roll_frames = 0;
 
   WORD32 frame_idx = 0;
-  WORD32 frame_len[MAX_AUDIO_PREROLLS] = {0};
   WORD32 temp = 0;
 
   WORD32 config_len = 0;
@@ -171,6 +172,16 @@
       for (loop = 0; loop < config_len; loop++)
         conf_buf[loop] = ixheaacd_read_bits_buf(temp_buff, 8);
 
+      if (aac_dec_handle->preroll_config_present == 1) {
+        if (!(memcmp(aac_dec_handle->preroll_config_prev, conf_buf,
+                     sizeof(aac_dec_handle->preroll_config_prev)))) {
+          config_len = 0;
+        }
+      }
+      aac_dec_handle->preroll_config_present = 1;
+      memcpy(aac_dec_handle->preroll_config_prev, conf_buf,
+             sizeof(aac_dec_handle->preroll_config_prev));
+
       apply_crossfade = ixheaacd_read_bits_buf(temp_buff, 1);
       un_used_val = ixheaacd_read_bits_buf(temp_buff, 1);  // reserverd
 
@@ -191,15 +202,20 @@
           WORD32 val_add = ixheaacd_read_bits_buf(temp_buff, 16);
           au_len += val_add;
         }
-        preroll_frame_offset[frame_idx] = temp_buff->size - temp_buff->cnt_bits;
-        frame_len[frame_idx] =
-            (8 * au_len) + (temp_buff->size - temp_buff->cnt_bits);
+        if (config_len != 0) {
+          preroll_frame_offset[frame_idx] =
+              temp_buff->size - temp_buff->cnt_bits;
+        }
         temp_buff->ptr_read_next += au_len;
         temp_buff->cnt_bits -= au_len * 8;
       }
     }
   }
-  *preroll_units = num_pre_roll_frames;
+  if (config_len == 0)
+    *preroll_units = 0;
+  else
+    *preroll_units = num_pre_roll_frames;
+
   return config_len;
 }
 
@@ -218,11 +234,10 @@
   WORD32 suitable_tracks = 1;
   WORD32 num_samples_out;
   ia_dec_data_struct *pstr_dec_data;
-  UWORD8 config[285];  // max of escapedValue(4, 4, 8) i.e. 2^4 -1 + 2^4 -1 +
-                       // 2^8 -1;
+  UWORD8 config[MAX_PREROLL_SIZE];
   WORD32 config_len;
   WORD32 delay;
-  WORD preroll_frame_offset[4] = {0};
+  WORD preroll_frame_offset[MAX_PREROLL_FRAME_OFFSET] = {0};
   WORD preroll_units = -1;
   WORD32 access_units = 0;
 
@@ -283,9 +298,9 @@
       if (access_units == 0 &&
           pstr_audio_specific_config->str_usac_config.str_usac_dec_config
               .preroll_flag) {
-        config_len = ixheaacd_audio_preroll_parsing(pstr_dec_data, &config[0],
-                                                    &preroll_units,
-                                                    &preroll_frame_offset[0]);
+        config_len = ixheaacd_audio_preroll_parsing(
+            pstr_dec_data, &config[0], &preroll_units, &preroll_frame_offset[0],
+            aac_dec_handle);
 
         if (config_len == IA_FATAL_ERROR) return IA_FATAL_ERROR;
       }
diff --git a/decoder/ixheaacd_env_extr.h b/decoder/ixheaacd_env_extr.h
index 32b1421..4c79e95 100644
--- a/decoder/ixheaacd_env_extr.h
+++ b/decoder/ixheaacd_env_extr.h
@@ -74,7 +74,7 @@
   WORD32 over_sampling_flag;
   WORD32 pitch_in_bins;
   WORD32 pvc_mode;
-
+  WORD32 cov_count;
   WORD32 sbr_invf_mode_prev[MAX_NUM_NOISE_VALUES];
   FLOAT32 flt_env_sf_arr[MAX_NUM_ENVELOPE_VALUES];
   FLOAT32 flt_noise_floor[MAX_NUM_NOISE_VALUES];
diff --git a/decoder/ixheaacd_fft.c b/decoder/ixheaacd_fft.c
index 0932097..60482d6 100644
--- a/decoder/ixheaacd_fft.c
+++ b/decoder/ixheaacd_fft.c
@@ -28,9 +28,10 @@
 #include "ixheaacd_function_selector.h"
 
 extern const WORD32 ixheaacd_twiddle_table_fft_32x32[514];
+extern const FLOAT32 ixheaacd_twiddle_table_fft_flt[16];
 extern const WORD32 ixheaacd_twiddle_table_3pr[1155];
 extern const WORD32 ixheaacd_twiddle_table_3pi[1155];
-extern const WORD8 ixheaacd_mps_dig_rev[16];
+extern const WORD8 ixheaacd_mps_dig_rev[8];
 
 #define PLATFORM_INLINE __inline
 
@@ -61,59 +62,84 @@
   return (result);
 }
 
+static PLATFORM_INLINE FLOAT32 mult32X32float(FLOAT32 a, FLOAT32 b) {
+  FLOAT32 result;
 
-VOID ixheaacd_mps_complex_fft_64_dec(WORD32 *ptr_x, WORD32 *fin_re,
-                                     WORD32 *fin_im, WORD32 nlength) {
-  WORD32 i, j, k, n_stages;
-  WORD32 h2, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-  WORD32 del, nodespacing, in_loop_cnt;
-  WORD32 y[128];
-  WORD32 npoints = nlength;
-  WORD32 *ptr_y = y;
-  const WORD32 *ptr_w;
-  n_stages = 30 - ixheaacd_norm32(npoints);
+  result = a * b;
 
-  n_stages = n_stages >> 1;
+  return result;
+}
 
-  ptr_w = ixheaacd_twiddle_table_fft_32x32;
+static PLATFORM_INLINE FLOAT32 mac32X32float(FLOAT32 a, FLOAT32 b, FLOAT32 c) {
+  FLOAT32 result;
+
+  result = a + b * c;
+
+  return result;
+}
+
+VOID ixheaacd_mps_synth_calc_fft(FLOAT32 *ptr_xr, FLOAT32 *ptr_xi,
+                                 WORD32 npoints) {
+  WORD32 i, j, k;
+  FLOAT32 y[64], z[64];
+  FLOAT32 *ptr_y = y, *ptr_z = z;
+  const FLOAT32 *ptr_w = ixheaacd_twiddle_table_fft_flt;
 
   for (i = 0; i < npoints; i += 4) {
-    WORD32 *inp = ptr_x;
-    h2 = ixheaacd_mps_dig_rev[i >> 2];
+    FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+    FLOAT32 *inp = ptr_xr;
+    FLOAT32 tmk;
+
+    WORD32 h2 = ixheaacd_mps_dig_rev[i >> 2];
+
     inp += (h2);
 
     x0r = *inp;
     x0i = *(inp + 1);
-    inp += (npoints >> 1);
+    inp += 16;
 
     x1r = *inp;
     x1i = *(inp + 1);
-    inp += (npoints >> 1);
+    inp += 16;
 
     x2r = *inp;
     x2i = *(inp + 1);
-    inp += (npoints >> 1);
+    inp += 16;
 
     x3r = *inp;
     x3i = *(inp + 1);
 
-    x0r = ixheaacd_add32_sat(x0r, x2r);
-    x0i = ixheaacd_add32_sat(x0i, x2i);
-    x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-    x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-    x1r = ixheaacd_add32_sat(x1r, x3r);
-    x1i = ixheaacd_add32_sat(x1i, x3i);
-    x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-    x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+    x0r = x0r + x2r;
+    x0i = x0i + x2i;
 
-    x0r = ixheaacd_add32_sat(x0r, x1r);
-    x0i = ixheaacd_add32_sat(x0i, x1i);
-    x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-    x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-    x2r = ixheaacd_add32_sat(x2r, x3i);
-    x2i = ixheaacd_sub32_sat(x2i, x3r);
-    x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-    x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+    tmk = x0r - x2r;
+    x2r = tmk - x2r;
+    tmk = x0i - x2i;
+    x2i = tmk - x2i;
+
+    x1r = x1r + x3r;
+    x1i = x1i + x3i;
+
+    tmk = x1r - x3r;
+    x3r = tmk - x3r;
+    tmk = x1i - x3i;
+    x3i = tmk - x3i;
+
+    x0r = x0r + x1r;
+    x0i = x0i + x1i;
+
+    tmk = x0r - x1r;
+    x1r = tmk - x1r;
+    tmk = x0i - x1i;
+    x1i = tmk - x1i;
+
+    x2r = x2r + x3i;
+    x2i = x2i - x3r;
+
+    tmk = x2r - x3i;
+    x3i = tmk - x3i;
+    tmk = x2i + x3r;
+    x3r = tmk + x3r;
 
     *ptr_y++ = x0r;
     *ptr_y++ = x0i;
@@ -123,416 +149,719 @@
     *ptr_y++ = x1i;
     *ptr_y++ = x3i;
     *ptr_y++ = x3r;
+
+    inp = ptr_xi;
+
+    inp += (h2);
+
+    x0r = *inp;
+    x0i = *(inp + 1);
+    inp += 16;
+
+    x1r = *inp;
+    x1i = *(inp + 1);
+    inp += 16;
+
+    x2r = *inp;
+    x2i = *(inp + 1);
+    inp += 16;
+
+    x3r = *inp;
+    x3i = *(inp + 1);
+
+    x0r = x0r + x2r;
+    x0i = x0i + x2i;
+
+    tmk = x0r - x2r;
+    x2r = tmk - x2r;
+    tmk = x0i - x2i;
+    x2i = tmk - x2i;
+
+    x1r = x1r + x3r;
+    x1i = x1i + x3i;
+
+    tmk = x1r - x3r;
+    x3r = tmk - x3r;
+    tmk = x1i - x3i;
+    x3i = tmk - x3i;
+
+    x0r = x0r + x1r;
+    x0i = x0i + x1i;
+
+    tmk = x0r - x1r;
+    x1r = tmk - x1r;
+    tmk = x0i - x1i;
+    x1i = tmk - x1i;
+
+    x2r = x2r + x3i;
+    x2i = x2i - x3r;
+
+    tmk = x2r - x3i;
+    x3i = tmk - x3i;
+    tmk = x2i + x3r;
+    x3r = tmk + x3r;
+
+    *ptr_z++ = x0r;
+    *ptr_z++ = x0i;
+    *ptr_z++ = x2r;
+    *ptr_z++ = x2i;
+    *ptr_z++ = x1r;
+    *ptr_z++ = x1i;
+    *ptr_z++ = x3i;
+    *ptr_z++ = x3r;
   }
-  ptr_y -= 2 * npoints;
-  del = 4;
-  nodespacing = 64;
-  in_loop_cnt = npoints >> 4;
-  for (i = n_stages - 1; i > 0; i--) {
-    const WORD32 *twiddles = ptr_w;
-    WORD32 *data = ptr_y;
-    WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
-    WORD32 sec_loop_cnt;
+  ptr_y -= 64;
+  ptr_z -= 64;
+  {
+    FLOAT32 *data_r = ptr_y;
+    FLOAT32 *data_i = ptr_z;
+    for (k = 2; k != 0; k--) {
+      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
 
-    for (k = in_loop_cnt; k != 0; k--) {
-      x0r = (*data);
-      x0i = (*(data + 1));
-      data += (del << 1);
+      x0r = (*data_r);
+      x0i = (*(data_r + 1));
+      data_r += 8;
 
-      x1r = (*data);
-      x1i = (*(data + 1));
-      data += (del << 1);
+      x1r = (*data_r);
+      x1i = (*(data_r + 1));
+      data_r += 8;
 
-      x2r = (*data);
-      x2i = (*(data + 1));
-      data += (del << 1);
+      x2r = (*data_r);
+      x2i = (*(data_r + 1));
+      data_r += 8;
 
-      x3r = (*data);
-      x3i = (*(data + 1));
-      data -= 3 * (del << 1);
+      x3r = (*data_r);
+      x3i = (*(data_r + 1));
+      data_r -= 24;
 
-      x0r = ixheaacd_add32_sat(x0r, x2r);
-      x0i = ixheaacd_add32_sat(x0i, x2i);
-      x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-      x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-      x1r = ixheaacd_add32_sat(x1r, x3r);
-      x1i = ixheaacd_add32_sat(x1i, x3i);
-      x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-      x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+      x0r = x0r + x2r;
+      x0i = x0i + x2i;
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
 
-      x0r = ixheaacd_add32_sat(x0r, x1r);
-      x0i = ixheaacd_add32_sat(x0i, x1i);
-      x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-      x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-      x2r = ixheaacd_add32_sat(x2r, x3i);
-      x2i = ixheaacd_sub32_sat(x2i, x3r);
-      x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-      x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+      x0r = x0r + x1r;
+      x0i = x0i + x1i;
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + x3i;
+      x2i = x2i - x3r;
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
 
-      *data = x0r;
-      *(data + 1) = x0i;
-      data += (del << 1);
+      *data_r = x0r;
+      *(data_r + 1) = x0i;
+      data_r += 8;
 
-      *data = x2r;
-      *(data + 1) = x2i;
-      data += (del << 1);
+      *data_r = x2r;
+      *(data_r + 1) = x2i;
+      data_r += 8;
 
-      *data = x1r;
-      *(data + 1) = x1i;
-      data += (del << 1);
+      *data_r = x1r;
+      *(data_r + 1) = x1i;
+      data_r += 8;
 
-      *data = x3i;
-      *(data + 1) = x3r;
-      data += (del << 1);
+      *data_r = x3i;
+      *(data_r + 1) = x3r;
+      data_r += 8;
+
+      x0r = (*data_i);
+      x0i = (*(data_i + 1));
+      data_i += 8;
+
+      x1r = (*data_i);
+      x1i = (*(data_i + 1));
+      data_i += 8;
+
+      x2r = (*data_i);
+      x2i = (*(data_i + 1));
+      data_i += 8;
+
+      x3r = (*data_i);
+      x3i = (*(data_i + 1));
+      data_i -= 24;
+
+      x0r = x0r + x2r;
+      x0i = x0i + x2i;
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + x1r;
+      x0i = x0i + x1i;
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + x3i;
+      x2i = x2i - x3r;
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_i = x0r;
+      *(data_i + 1) = x0i;
+      data_i += 8;
+
+      *data_i = x2r;
+      *(data_i + 1) = x2i;
+      data_i += 8;
+
+      *data_i = x1r;
+      *(data_i + 1) = x1i;
+      data_i += 8;
+
+      *data_i = x3i;
+      *(data_i + 1) = x3r;
+      data_i += 8;
     }
-    data = ptr_y + 2;
+    data_r = ptr_y + 2;
+    data_i = ptr_z + 2;
 
-    sec_loop_cnt = (nodespacing * del);
-    sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
-                   (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
-                   (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
-                   (sec_loop_cnt / 256);
-    j = nodespacing;
+    for (k = 2; k != 0; k--) {
+      FLOAT32 tmp;
+      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
 
-    for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
-      w1h = *(twiddles + 2 * j);
-      w1l = *(twiddles + 2 * j + 1);
-      w2h = *(twiddles + 2 * (j << 1));
-      w2l = *(twiddles + 2 * (j << 1) + 1);
-      w3h = *(twiddles + 2 * j + 2 * (j << 1));
-      w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);
+      data_r += 8;
 
-      for (k = in_loop_cnt; k != 0; k--) {
-        WORD32 tmp;
-        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+      x1r = *data_r;
+      x1i = *(data_r + 1);
+      data_r += 8;
 
-        data += (del << 1);
+      x2r = *data_r;
+      x2i = *(data_r + 1);
+      data_r += 8;
 
-        x1r = *data;
-        x1i = *(data + 1);
-        data += (del << 1);
+      x3r = *data_r;
+      x3i = *(data_r + 1);
+      data_r -= 24;
 
-        x2r = *data;
-        x2i = *(data + 1);
-        data += (del << 1);
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.923880f) -
+                      mult32X32float((FLOAT32)x1i, -0.382683f));
+      x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.382683f),
+                                   (FLOAT32)x1i, 0.923880f);
+      x1r = tmp;
 
-        x3r = *data;
-        x3i = *(data + 1);
-        data -= 3 * (del << 1);
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x2r, 0.707107f) -
+                      mult32X32float((FLOAT32)x2i, -0.707107f));
+      x2i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x2r, -0.707107f),
+                                   (FLOAT32)x2i, 0.707107f);
+      x2r = tmp;
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
-                                 ixheaacd_mult32_sat(x1i, w1h));
-        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
-        x1r = tmp;
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x3r, 0.382683f) -
+                      mult32X32float((FLOAT32)x3i, -0.923880f));
+      x3i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x3r, -0.923880f),
+                                   (FLOAT32)x3i, 0.382683f);
+      x3r = tmp;
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
-                                 ixheaacd_mult32_sat(x2i, w2h));
-        x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
-        x2r = tmp;
+      x0r = (*data_r);
+      x0i = (*(data_r + 1));
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3r, w3l),
-                                 ixheaacd_mult32_sat(x3i, w3h));
-        x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
-        x3r = tmp;
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
 
-        x0r = (*data);
-        x0i = (*(data + 1));
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
 
-        x0r = ixheaacd_add32_sat(x0r, x2r);
-        x0i = ixheaacd_add32_sat(x0i, x2i);
-        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-        x1r = ixheaacd_add32_sat(x1r, x3r);
-        x1i = ixheaacd_add32_sat(x1i, x3i);
-        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+      *data_r = x0r;
+      *(data_r + 1) = x0i;
+      data_r += 8;
 
-        x0r = ixheaacd_add32_sat(x0r, x1r);
-        x0i = ixheaacd_add32_sat(x0i, x1i);
-        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-        x2r = ixheaacd_add32_sat(x2r, x3i);
-        x2i = ixheaacd_sub32_sat(x2i, x3r);
-        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+      *data_r = x2r;
+      *(data_r + 1) = x2i;
+      data_r += 8;
 
-        *data = x0r;
-        *(data + 1) = x0i;
-        data += (del << 1);
+      *data_r = x1r;
+      *(data_r + 1) = x1i;
+      data_r += 8;
 
-        *data = x2r;
-        *(data + 1) = x2i;
-        data += (del << 1);
+      *data_r = x3i;
+      *(data_r + 1) = x3r;
+      data_r += 8;
+      data_i += 8;
 
-        *data = x1r;
-        *(data + 1) = x1i;
-        data += (del << 1);
+      x1r = *data_i;
+      x1i = *(data_i + 1);
+      data_i += 8;
 
-        *data = x3i;
-        *(data + 1) = x3r;
-        data += (del << 1);
-      }
-      data -= 2 * npoints;
-      data += 2;
+      x2r = *data_i;
+      x2i = *(data_i + 1);
+      data_i += 8;
+
+      x3r = *data_i;
+      x3i = *(data_i + 1);
+      data_i -= 24;
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.923880f) -
+                      mult32X32float((FLOAT32)x1i, -0.382683f));
+      x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.382683f),
+                                   (FLOAT32)x1i, 0.923880f);
+      x1r = tmp;
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x2r, 0.707107f) -
+                      mult32X32float((FLOAT32)x2i, -0.707107f));
+      x2i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x2r, -0.707107f),
+                                   (FLOAT32)x2i, 0.707107f);
+      x2r = tmp;
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x3r, 0.382683f) -
+                      mult32X32float((FLOAT32)x3i, -0.923880f));
+      x3i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x3r, -0.923880f),
+                                   (FLOAT32)x3i, 0.382683f);
+      x3r = tmp;
+
+      x0r = (*data_i);
+      x0i = (*(data_i + 1));
+
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_i = x0r;
+      *(data_i + 1) = x0i;
+      data_i += 8;
+
+      *data_i = x2r;
+      *(data_i + 1) = x2i;
+      data_i += 8;
+
+      *data_i = x1r;
+      *(data_i + 1) = x1i;
+      data_i += 8;
+
+      *data_i = x3i;
+      *(data_i + 1) = x3r;
+      data_i += 8;
     }
-    for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
-      w1h = *(twiddles + 2 * j);
-      w2h = *(twiddles + 2 * (j << 1));
-      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
-      w1l = *(twiddles + 2 * j + 1);
-      w2l = *(twiddles + 2 * (j << 1) + 1);
-      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
+    data_r -= 62;
+    data_i -= 62;
+    for (k = 2; k != 0; k--) {
+      FLOAT32 tmp;
+      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
 
-      for (k = in_loop_cnt; k != 0; k--) {
-        WORD32 tmp;
-        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+      data_r += 8;
 
-        data += (del << 1);
+      x1r = *data_r;
+      x1i = *(data_r + 1);
+      data_r += 8;
 
-        x1r = *data;
-        x1i = *(data + 1);
-        data += (del << 1);
+      x2r = *data_r;
+      x2i = *(data_r + 1);
+      data_r += 8;
 
-        x2r = *data;
-        x2i = *(data + 1);
-        data += (del << 1);
+      x3r = *data_r;
+      x3i = *(data_r + 1);
+      data_r -= 24;
 
-        x3r = *data;
-        x3i = *(data + 1);
-        data -= 3 * (del << 1);
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.707107f) -
+                      mult32X32float((FLOAT32)x1i, -0.707107f));
+      x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.707107f),
+                                   (FLOAT32)x1i, 0.707107f);
+      x1r = tmp;
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
-                                 ixheaacd_mult32_sat(x1i, w1h));
-        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
-        x1r = tmp;
+      tmp = x2i;
+      x2i = -x2r;
+      x2r = tmp;
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
-                                 ixheaacd_mult32_sat(x2i, w2h));
-        x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
-        x2r = tmp;
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x3r, -0.707107f) +
+                      mult32X32float((FLOAT32)x3i, 0.707107f));
+      x3i = (FLOAT32)(-mult32X32float((FLOAT32)x3r, 0.707107f) +
+                      mult32X32float((FLOAT32)x3i, -0.707107f));
+      x3r = tmp;
 
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
-                                 ixheaacd_mult32_sat(x3i, w3l));
-        x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
-                                 ixheaacd_mult32_sat(x3r, w3l));
-        x3r = tmp;
+      x0r = (*data_r);
+      x0i = (*(data_r + 1));
 
-        x0r = (*data);
-        x0i = (*(data + 1));
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
 
-        x0r = ixheaacd_add32_sat(x0r, x2r);
-        x0i = ixheaacd_add32_sat(x0i, x2i);
-        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-        x1r = ixheaacd_add32_sat(x1r, x3r);
-        x1i = ixheaacd_add32_sat(x1i, x3i);
-        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
 
-        x0r = ixheaacd_add32_sat(x0r, x1r);
-        x0i = ixheaacd_add32_sat(x0i, x1i);
-        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-        x2r = ixheaacd_add32_sat(x2r, x3i);
-        x2i = ixheaacd_sub32_sat(x2i, x3r);
-        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+      *data_r = x0r;
+      *(data_r + 1) = x0i;
+      data_r += 8;
 
-        *data = x0r;
-        *(data + 1) = x0i;
-        data += (del << 1);
+      *data_r = x2r;
+      *(data_r + 1) = x2i;
+      data_r += 8;
 
-        *data = x2r;
-        *(data + 1) = x2i;
-        data += (del << 1);
+      *data_r = x1r;
+      *(data_r + 1) = x1i;
+      data_r += 8;
 
-        *data = x1r;
-        *(data + 1) = x1i;
-        data += (del << 1);
+      *data_r = x3i;
+      *(data_r + 1) = x3r;
+      data_r += 8;
+      data_i += 8;
 
-        *data = x3i;
-        *(data + 1) = x3r;
-        data += (del << 1);
-      }
-      data -= 2 * npoints;
-      data += 2;
+      x1r = *data_i;
+      x1i = *(data_i + 1);
+      data_i += 8;
+
+      x2r = *data_i;
+      x2i = *(data_i + 1);
+      data_i += 8;
+
+      x3r = *data_i;
+      x3i = *(data_i + 1);
+      data_i -= 24;
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.707107f) -
+                      mult32X32float((FLOAT32)x1i, -0.707107f));
+      x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.707107f),
+                                   (FLOAT32)x1i, 0.707107f);
+      x1r = tmp;
+
+      tmp = x2i;
+      x2i = -x2r;
+      x2r = tmp;
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x3r, -0.707107f) +
+                      mult32X32float((FLOAT32)x3i, 0.707107f));
+      x3i = (FLOAT32)(-mult32X32float((FLOAT32)x3r, 0.707107f) +
+                      mult32X32float((FLOAT32)x3i, -0.707107f));
+      x3r = tmp;
+
+      x0r = (*data_i);
+      x0i = (*(data_i + 1));
+
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_i = x0r;
+      *(data_i + 1) = x0i;
+      data_i += 8;
+
+      *data_i = x2r;
+      *(data_i + 1) = x2i;
+      data_i += 8;
+
+      *data_i = x1r;
+      *(data_i + 1) = x1i;
+      data_i += 8;
+
+      *data_i = x3i;
+      *(data_i + 1) = x3r;
+      data_i += 8;
     }
-    for (; j <= sec_loop_cnt * 2; j += nodespacing) {
-      w1h = *(twiddles + 2 * j);
-      w2h = *(twiddles + 2 * (j << 1) - 512);
-      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
-      w1l = *(twiddles + 2 * j + 1);
-      w2l = *(twiddles + 2 * (j << 1) - 511);
-      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
+    data_r -= 62;
+    data_i -= 62;
+    for (k = 2; k != 0; k--) {
+      FLOAT32 tmp;
+      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
 
-      for (k = in_loop_cnt; k != 0; k--) {
-        WORD32 tmp;
-        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+      data_r += 8;
 
-        data += (del << 1);
+      x1r = *data_r;
+      x1i = *(data_r + 1);
+      data_r += 8;
 
-        x1r = *data;
-        x1i = *(data + 1);
-        data += (del << 1);
+      x2r = *data_r;
+      x2i = *(data_r + 1);
+      data_r += 8;
 
-        x2r = *data;
-        x2i = *(data + 1);
-        data += (del << 1);
+      x3r = *data_r;
+      x3i = *(data_r + 1);
+      data_r -= 24;
 
-        x3r = *data;
-        x3i = *(data + 1);
-        data -= 3 * (del << 1);
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.382683f) -
+                      mult32X32float((FLOAT32)x1i, -0.923880f));
+      x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.923880f),
+                                   (FLOAT32)x1i, 0.382683f);
+      x1r = tmp;
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
-                                 ixheaacd_mult32_sat(x1i, w1h));
-        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
-        x1r = tmp;
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x2r, -0.707107f) +
+                      mult32X32float((FLOAT32)x2i, 0.707107f));
+      x2i = (FLOAT32)(-mult32X32float((FLOAT32)x2r, 0.707107f) +
+                      mult32X32float((FLOAT32)x2i, -0.707107f));
+      x2r = tmp;
 
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
-                                 ixheaacd_mult32_sat(x2i, w2l));
-        x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
-                                 ixheaacd_mult32_sat(x2r, w2l));
-        x2r = tmp;
+      tmp = (FLOAT32)(-mult32X32float((FLOAT32)x3r, 0.923880f) +
+                      mult32X32float((FLOAT32)x3i, -0.382683f));
+      x3i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x3r, -0.382683f),
+                                   (FLOAT32)x3i, 0.923880f);
+      x3r = tmp;
 
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
-                                 ixheaacd_mult32_sat(x3i, w3l));
-        x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
-                                 ixheaacd_mult32_sat(x3r, w3l));
-        x3r = tmp;
+      x0r = (*data_r);
+      x0i = (*(data_r + 1));
 
-        x0r = (*data);
-        x0i = (*(data + 1));
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i - x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i + (x3i * 2);
 
-        x0r = ixheaacd_add32_sat(x0r, x2r);
-        x0i = ixheaacd_add32_sat(x0i, x2i);
-        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-        x1r = ixheaacd_add32_sat(x1r, x3r);
-        x1i = ixheaacd_add32_sat(x1i, x3i);
-        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
 
-        x0r = ixheaacd_add32_sat(x0r, x1r);
-        x0i = ixheaacd_add32_sat(x0i, x1i);
-        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-        x2r = ixheaacd_add32_sat(x2r, x3i);
-        x2i = ixheaacd_sub32_sat(x2i, x3r);
-        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+      *data_r = x0r;
+      *(data_r + 1) = x0i;
+      data_r += 8;
 
-        *data = x0r;
-        *(data + 1) = x0i;
-        data += (del << 1);
+      *data_r = x2r;
+      *(data_r + 1) = x2i;
+      data_r += 8;
 
-        *data = x2r;
-        *(data + 1) = x2i;
-        data += (del << 1);
+      *data_r = x1r;
+      *(data_r + 1) = x1i;
+      data_r += 8;
 
-        *data = x1r;
-        *(data + 1) = x1i;
-        data += (del << 1);
+      *data_r = x3i;
+      *(data_r + 1) = x3r;
+      data_r += 8;
+      data_i += 8;
 
-        *data = x3i;
-        *(data + 1) = x3r;
-        data += (del << 1);
-      }
-      data -= 2 * npoints;
-      data += 2;
+      x1r = *data_i;
+      x1i = *(data_i + 1);
+      data_i += 8;
+
+      x2r = *data_i;
+      x2i = *(data_i + 1);
+      data_i += 8;
+
+      x3r = *data_i;
+      x3i = *(data_i + 1);
+      data_i -= 24;
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.382683f) -
+                      mult32X32float((FLOAT32)x1i, -0.923880f));
+      x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.923880f),
+                                   (FLOAT32)x1i, 0.382683f);
+      x1r = tmp;
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x2r, -0.707107f) +
+                      mult32X32float((FLOAT32)x2i, 0.707107f));
+      x2i = (FLOAT32)(-mult32X32float((FLOAT32)x2r, 0.707107f) +
+                      mult32X32float((FLOAT32)x2i, -0.707107f));
+      x2r = tmp;
+
+      tmp = (FLOAT32)(-mult32X32float((FLOAT32)x3r, 0.923880f) +
+                      mult32X32float((FLOAT32)x3i, -0.382683f));
+      x3i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x3r, -0.382683f),
+                                   (FLOAT32)x3i, 0.923880f);
+      x3r = tmp;
+
+      x0r = (*data_i);
+      x0i = (*(data_i + 1));
+
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i - x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i + (x3i * 2);
+
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_i = x0r;
+      *(data_i + 1) = x0i;
+      data_i += 8;
+
+      *data_i = x2r;
+      *(data_i + 1) = x2i;
+      data_i += 8;
+
+      *data_i = x1r;
+      *(data_i + 1) = x1i;
+      data_i += 8;
+
+      *data_i = x3i;
+      *(data_i + 1) = x3r;
+      data_i += 8;
     }
-    for (; j < nodespacing * del; j += nodespacing) {
-      w1h = *(twiddles + 2 * j);
-      w2h = *(twiddles + 2 * (j << 1) - 512);
-      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
-      w1l = *(twiddles + 2 * j + 1);
-      w2l = *(twiddles + 2 * (j << 1) - 511);
-      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);
-
-      for (k = in_loop_cnt; k != 0; k--) {
-        WORD32 tmp;
-        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
-        data += (del << 1);
-
-        x1r = *data;
-        x1i = *(data + 1);
-        data += (del << 1);
-
-        x2r = *data;
-        x2i = *(data + 1);
-        data += (del << 1);
-
-        x3r = *data;
-        x3i = *(data + 1);
-        data -= 3 * (del << 1);
-
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
-                                 ixheaacd_mult32_sat(x1i, w1h));
-        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
-        x1r = tmp;
-
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
-                                 ixheaacd_mult32_sat(x2i, w2l));
-        x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
-                                 ixheaacd_mult32_sat(x2r, w2l));
-        x2r = tmp;
-
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
-                                 ixheaacd_mult32_sat(x3r, w3l));
-        x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
-        x3r = tmp;
-
-        x0r = (*data);
-        x0i = (*(data + 1));
-
-        x0r = ixheaacd_add32_sat(x0r, x2r);
-        x0i = ixheaacd_add32_sat(x0i, x2i);
-        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-        x1r = ixheaacd_add32_sat(x1r, x3r);
-        x1i = ixheaacd_sub32_sat(x1i, x3i);
-        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-        x3i = ixheaacd_add32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
-
-        x0r = ixheaacd_add32_sat(x0r, x1r);
-        x0i = ixheaacd_add32_sat(x0i, x1i);
-        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-        x2r = ixheaacd_add32_sat(x2r, x3i);
-        x2i = ixheaacd_sub32_sat(x2i, x3r);
-        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
-
-        *data = x0r;
-        *(data + 1) = x0i;
-        data += (del << 1);
-
-        *data = x2r;
-        *(data + 1) = x2i;
-        data += (del << 1);
-
-        *data = x1r;
-        *(data + 1) = x1i;
-        data += (del << 1);
-
-        *data = x3i;
-        *(data + 1) = x3r;
-        data += (del << 1);
-      }
-      data -= 2 * npoints;
-      data += 2;
-    }
-    nodespacing >>= 2;
-    del <<= 2;
-    in_loop_cnt >>= 2;
+    data_r -= 62;
+    data_i -= 62;
   }
+  {
+    const FLOAT32 *twiddles = ptr_w;
+    FLOAT32 x0r, x0i, x1r, x1i;
+    for (j = 8; j != 0; j--) {
+      FLOAT32 W1 = *twiddles;
+      twiddles++;
+      FLOAT32 W4 = *twiddles;
+      twiddles++;
+      FLOAT32 tmp;
 
-  for (i = 0; i < 2 * nlength; i += 2) {
-    fin_re[i] = y[i];
-    fin_im[i] = y[i + 1];
+      x0r = *ptr_y;
+      x0i = *(ptr_y + 1);
+      ptr_y += 32;
+      ptr_xr += 32;
+
+      x1r = *ptr_y;
+      x1i = *(ptr_y + 1);
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, W1) -
+                      mult32X32float((FLOAT32)x1i, W4));
+      x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, W4),
+                                   (FLOAT32)x1i, W1);
+      x1r = tmp;
+
+      *ptr_xr = (x0r) - (x1r);
+      *(ptr_xr + 1) = (x0i) - (x1i);
+      ptr_y -= 32;
+      ptr_xr -= 32;
+
+      *ptr_xr = (x0r) + (x1r);
+      *(ptr_xr + 1) = (x0i) + (x1i);
+      ptr_y += 2;
+      ptr_xr += 2;
+
+      x0r = *ptr_z;
+      x0i = *(ptr_z + 1);
+      ptr_z += 32;
+      ptr_xi += 32;
+
+      x1r = *ptr_z;
+      x1i = *(ptr_z + 1);
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, W1) -
+                      mult32X32float((FLOAT32)x1i, W4));
+      x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, W4),
+                                   (FLOAT32)x1i, W1);
+      x1r = tmp;
+
+      *ptr_xi = (x0r) - (x1r);
+      *(ptr_xi + 1) = (x0i) - (x1i);
+      ptr_z -= 32;
+      ptr_xi -= 32;
+
+      *ptr_xi = (x0r) + (x1r);
+      *(ptr_xi + 1) = (x0i) + (x1i);
+      ptr_z += 2;
+      ptr_xi += 2;
+    }
+    twiddles = ptr_w;
+    for (j = 8; j != 0; j--) {
+      FLOAT32 W1 = *twiddles;
+      twiddles++;
+      FLOAT32 W4 = *twiddles;
+      twiddles++;
+      FLOAT32 tmp;
+
+      x0r = *ptr_y;
+      x0i = *(ptr_y + 1);
+      ptr_y += 32;
+      ptr_xr += 32;
+
+      x1r = *ptr_y;
+      x1i = *(ptr_y + 1);
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, W4) +
+                      mult32X32float((FLOAT32)x1i, W1));
+      x1i = (FLOAT32)(-mult32X32float((FLOAT32)x1r, W1) +
+                      mult32X32float((FLOAT32)x1i, W4));
+      x1r = tmp;
+
+      *ptr_xr = (x0r) - (x1r);
+      *(ptr_xr + 1) = (x0i) - (x1i);
+      ptr_y -= 32;
+      ptr_xr -= 32;
+
+      *ptr_xr = (x0r) + (x1r);
+      *(ptr_xr + 1) = (x0i) + (x1i);
+      ptr_y += 2;
+      ptr_xr += 2;
+
+      x0r = *ptr_z;
+      x0i = *(ptr_z + 1);
+      ptr_z += 32;
+      ptr_xi += 32;
+
+      x1r = *ptr_z;
+      x1i = *(ptr_z + 1);
+
+      tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, W4) +
+                      mult32X32float((FLOAT32)x1i, W1));
+      x1i = (FLOAT32)(-mult32X32float((FLOAT32)x1r, W1) +
+                      mult32X32float((FLOAT32)x1i, W4));
+      x1r = tmp;
+
+      *ptr_xi = (x0r) - (x1r);
+      *(ptr_xi + 1) = (x0i) - (x1i);
+      ptr_z -= 32;
+      ptr_xi -= 32;
+
+      *ptr_xi = (x0r) + (x1r);
+      *(ptr_xi + 1) = (x0i) + (x1i);
+      ptr_z += 2;
+      ptr_xi += 2;
+    }
   }
-
-  return;
 }
 
 VOID ixheaacd_complex_fft_p2_dec(WORD32 *xr, WORD32 *xi, WORD32 nlength,
@@ -1715,13 +2044,6 @@
 
     if (fft_mode < 0) {
       for (i = 0; i < nlength; i += 3) {
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1r)),
-                                 ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1i)));
-        ptr_x[2 * i + 1] =
-            ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1i)),
-                               ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1r)));
-        ptr_x[2 * i] = tmp;
-
         w1r++;
         w1i++;
 
@@ -1749,13 +2071,6 @@
 
     else {
       for (i = 0; i < nlength; i += 3) {
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1r)),
-                                 ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1i)));
-        ptr_x[2 * i + 1] =
-            ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1r)),
-                               ixheaacd_mult32_sat(ptr_x[2 * i], (*w1i)));
-        ptr_x[2 * i] = tmp;
-
         w1r++;
         w1i++;
 
@@ -1789,20 +2104,16 @@
     ptr_y = ptr_y + 6;
   }
 
+  ptr_y = y;
   for (i = 0; i < mpass; i++) {
-    xr[i] = y[6 * i];
-    xi[i] = y[6 * i + 1];
+    xr[i] = *ptr_y++;
+    xi[i] = *ptr_y++;
+    xr[mpass + i] = *ptr_y++;
+    xi[mpass + i] = *ptr_y++;
+    xr[2 * mpass + i] = *ptr_y++;
+    xi[2 * mpass + i] = *ptr_y++;
   }
 
-  for (i = 0; i < mpass; i++) {
-    xr[mpass + i] = y[6 * i + 2];
-    xi[mpass + i] = y[6 * i + 3];
-  }
-
-  for (i = 0; i < mpass; i++) {
-    xr[2 * mpass + i] = y[6 * i + 4];
-    xi[2 * mpass + i] = y[6 * i + 5];
-  }
   return;
 }
 
diff --git a/decoder/ixheaacd_function_selector.h b/decoder/ixheaacd_function_selector.h
index daa5aac..b2882f8 100644
--- a/decoder/ixheaacd_function_selector.h
+++ b/decoder/ixheaacd_function_selector.h
@@ -61,7 +61,7 @@
                                                WORD32);
 extern VOID (*ixheaacd_covariance_matrix_calc_2)(
     ixheaacd_lpp_trans_cov_matrix *, WORD32 *, WORD32, WORD16);
-extern VOID (*ixheaacd_over_lap_add1)(WORD32 *, WORD32 *, WORD16 *,
+extern VOID (*ixheaacd_over_lap_add1)(WORD32 *, WORD32 *, WORD32 *,
                                       const WORD16 *, WORD16, WORD16, WORD16);
 extern VOID (*ixheaacd_over_lap_add2)(WORD32 *, WORD32 *, WORD32 *,
                                       const WORD16 *, WORD16, WORD16, WORD16);
@@ -119,19 +119,19 @@
 extern VOID (*ixheaacd_post_twiddle)(WORD32[], WORD32[],
                                      ia_aac_dec_imdct_tables_struct *, WORD);
 
-extern VOID (*ixheaacd_post_twid_overlap_add)(WORD16[], WORD32[],
+extern VOID (*ixheaacd_post_twid_overlap_add)(WORD32[], WORD32[],
                                               ia_aac_dec_imdct_tables_struct *,
                                               WORD, WORD32 *, WORD16,
                                               const WORD16 *, WORD16);
 
-extern VOID (*ixheaacd_neg_shift_spec)(WORD32 *, WORD16 *, WORD16, WORD16);
+extern VOID (*ixheaacd_neg_shift_spec)(WORD32 *, WORD32 *, WORD16, WORD16);
 
 extern VOID (*ixheaacd_spec_to_overlapbuf)(WORD32 *, WORD32 *, WORD32, WORD32);
 
-extern VOID (*ixheaacd_overlap_buf_out)(WORD16 *, WORD32 *, WORD32,
+extern VOID (*ixheaacd_overlap_buf_out)(WORD32 *, WORD32 *, WORD32,
                                         const WORD16);
 
-extern VOID (*ixheaacd_overlap_out_copy)(WORD16 *, WORD32 *, WORD32 *,
+extern VOID (*ixheaacd_overlap_out_copy)(WORD32 *, WORD32 *, WORD32 *,
                                          const WORD16);
 
 extern VOID (*ixheaacd_pretwiddle_compute)(WORD32 *, WORD32 *, WORD32 *,
@@ -144,19 +144,6 @@
 extern VOID (*ixheaacd_complex_fft_p2)(WORD32 *xr, WORD32 *xi, WORD32 nlength,
                                        WORD32 fft_mode, WORD32 *preshift);
 
-extern VOID (*ixheaacd_mps_complex_fft_64)(WORD32 *ptr_x, WORD32 *fin_re,
-                                           WORD32 *fin_im, WORD32 nlength);
-
-extern VOID (*ixheaacd_mps_synt_pre_twiddle)(WORD32 *ptr_in,
-                                             const WORD32 *table_re,
-                                             const WORD32 *table_im,
-                                             WORD32 resolution);
-
-extern VOID (*ixheaacd_mps_synt_post_twiddle)(WORD32 *ptr_in,
-                                              const WORD32 *table_re,
-                                              const WORD32 *table_im,
-                                              WORD32 resolution);
-
 extern VOID (*ixheaacd_calc_pre_twid)(WORD32 *ptr_x, WORD32 *r_ptr,
                                       WORD32 *i_ptr, WORD32 nlength,
                                       const WORD32 *cos_ptr,
@@ -167,12 +154,9 @@
                                        const WORD32 *cos_ptr,
                                        const WORD32 *sin_ptr);
 
-extern VOID (*ixheaacd_mps_synt_post_fft_twiddle)(
-    WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
-    const WORD32 *table_im, WORD32 *state);
-extern VOID (*ixheaacd_mps_synt_out_calc)(WORD32 resolution, WORD32 *out,
-                                          WORD32 *state,
-                                          const WORD32 *filter_coeff);
+extern VOID (*ixheaacd_mps_synt_out_calc)(WORD32 resolution, FLOAT32 *out,
+                                          FLOAT32 *state,
+                                          const FLOAT32 *filter_coeff);
 
 extern VOID (*ixheaacd_fft_15_ld)(WORD32 *inp, WORD32 *op, WORD32 *fft3out,
                                   UWORD8 *re_arr_tab_sml_240_ptr);
diff --git a/decoder/ixheaacd_headerdecode.c b/decoder/ixheaacd_headerdecode.c
index 356cf08..2c38ec6 100644
--- a/decoder/ixheaacd_headerdecode.c
+++ b/decoder/ixheaacd_headerdecode.c
@@ -490,6 +490,7 @@
   WORD32 cnt_bits = it_bit_buff->cnt_bits;
   WORD32 dummy = 0;
   UWORD32 aot_init;
+  UWORD32 tmp_aot;
 
   ia_audio_specific_config_struct *pstr_audio_specific_config;
 
@@ -506,14 +507,20 @@
 
   aot_init = aac_state_struct->audio_object_type;
 
-  aac_state_struct->audio_object_type = ixheaacd_read_bits_buf(it_bit_buff, 5);
+  tmp_aot = ixheaacd_read_bits_buf(it_bit_buff, 5);
 
-  if (aac_state_struct->audio_object_type == 31) {
+  if (tmp_aot == 31) {
     tmp = ixheaacd_read_bits_buf(it_bit_buff, 6);
-    aac_state_struct->audio_object_type = 32 + tmp;
+    tmp_aot = 32 + tmp;
   }
+
+  if (aac_state_struct->header_dec_done || aac_state_struct->ui_init_done) {
+    if (tmp_aot != aot_init && tmp_aot != AOT_SBR && tmp_aot != AOT_PS)
+      return IA_FATAL_ERROR;
+  }
+
   pstr_audio_specific_config->audio_object_type =
-      aac_state_struct->audio_object_type;
+      aac_state_struct->audio_object_type = tmp_aot;
 
   tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
                                pstr_audio_specific_config);
diff --git a/decoder/ixheaacd_interface.h b/decoder/ixheaacd_interface.h
index 4a9c263..3dde0c3 100644
--- a/decoder/ixheaacd_interface.h
+++ b/decoder/ixheaacd_interface.h
@@ -55,8 +55,7 @@
 VOID ixheaacd_complex_fft_p2_armv7(WORD32 *xr, WORD32 *xi, WORD32 nlength,
                                    WORD32 fft_mode, WORD32 *preshift);
 
-VOID ixheaacd_mps_complex_fft_64_dec(WORD32 *ptr_x, WORD32 *fin_re,
-                                     WORD32 *fin_im, WORD32 nlength);
+VOID ixheaacd_mps_synth_calc_fft(FLOAT32 *ptr_x, FLOAT32 *ptr_y, WORD32 nPass);
 
 VOID ixheaacd_mps_complex_fft_64_armv7(WORD32 *ptr_x, WORD32 *fin_re,
                                        WORD32 *fin_im, WORD32 nlength);
@@ -71,18 +70,10 @@
 VOID ixheaacd_complex_fft_p2_asm(const WORD32 *table, WORD32 nlength,
                                  WORD32 *ptr_x, WORD32 *ptr_y);
 
-VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re,
-                                       const WORD32 *table_im,
-                                       WORD32 resolution);
-
 VOID ixheaacd_mps_synt_pre_twiddle_armv7(WORD32 *ptr_in, const WORD32 *table_re,
                                          const WORD32 *table_im,
                                          WORD32 resolution);
 
-VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re,
-                                        const WORD32 *table_im,
-                                        WORD32 resolution);
-
 VOID ixheaacd_mps_synt_post_twiddle_armv7(WORD32 *ptr_in,
                                           const WORD32 *table_re,
                                           const WORD32 *table_im,
@@ -104,20 +95,9 @@
                                    WORD32 nlength, const WORD32 *cos_ptr,
                                    const WORD32 *sin_ptr);
 
-VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, WORD32 *fin_re,
-                                            WORD32 *fin_im,
-                                            const WORD32 *table_re,
-                                            const WORD32 *table_im,
-                                            WORD32 *state);
-
-VOID ixheaacd_mps_synt_post_fft_twiddle_armv7(WORD32 resolution, WORD32 *fin_re,
-                                              WORD32 *fin_im,
-                                              const WORD32 *table_re,
-                                              const WORD32 *table_im,
-                                              WORD32 *state);
-
-VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, WORD32 *out,
-                                    WORD32 *state, const WORD32 *filter_coeff);
+VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, FLOAT32 *out,
+                                    FLOAT32 *state,
+                                    const FLOAT32 *filter_coeff);
 
 VOID ixheaacd_mps_synt_out_calc_armv7(WORD32 resolution, WORD32 *out,
                                       WORD32 *state,
diff --git a/decoder/ixheaacd_lpfuncs.c b/decoder/ixheaacd_lpfuncs.c
index 44433a0..c2828bf 100644
--- a/decoder/ixheaacd_lpfuncs.c
+++ b/decoder/ixheaacd_lpfuncs.c
@@ -120,14 +120,14 @@
   return (result);
 }
 
-VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD32 *out,
                               const WORD16 *window_long,
                               const WORD16 *window_short, WORD16 q_shift,
                               WORD16 ch_fac, WORD16 flag) {
   WORD32 i, accu;
   WORD32 *coef_1;
   const WORD16 *temp_win_sh, *temp_win_long;
-  WORD16 *out1, *out2;
+  WORD32 *out1, *out2;
   WORD32 *temp_prev;
 
   if (flag == 1) {
@@ -137,13 +137,13 @@
           (q_shift + 1));
 
       accu = ixheaacd_add32_sat(temp1, ((WORD32)prev[i] << 16));
-      out[ch_fac * i] = ixheaacd_round16(accu << 1);
+      out[ch_fac * i] = accu;
 
       accu = ixheaacd_shl32_dir_sat_limit(
           ixheaacd_mult32x16in32(-(coef[SIZE15 - 1 - i]),
                                  window_long[2 * (SIZE07 - i) - 1]),
           q_shift);
-      out[ch_fac * (i + SIZE09)] = ixheaacd_round16(accu << 2);
+      out[ch_fac * (i + SIZE09)] = (accu << 1);
     }
 
     temp_win_sh = &(window_short[0]);
@@ -158,14 +158,14 @@
       accu = ixheaacd_mult32x16in32_drc(
           prev[SIZE08 - 1 - i], ixheaacd_negate16(window_long[2 * i + 1]));
 
-      out[ch_fac * i] = ixheaacd_round16(accu << 2);
+      out[ch_fac * i] = accu;
 
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_dir_sat_limit(-(coef[SIZE15 - 1 - i]), (q_shift - 1)),
           ixheaacd_mult32x16in32_drc(prev[i + SIZE01],
                                      window_long[2 * SIZE07 - 2 - 2 * i]));
 
-      out[ch_fac * (SIZE09 + i)] = ixheaacd_round16(accu << 2);
+      out[ch_fac * (SIZE09 + i)] = accu;
     }
 
     temp_win_sh = &(window_long[SIZE14]);
@@ -187,7 +187,7 @@
         ixheaacd_shl32_dir_sat_limit(ixheaacd_mult32x16in32(temp_coef, win1),
                                      q_shift),
         ixheaacd_mult32x16in32_drc(prev1, win3));
-    *out1 = ixheaacd_round16(accu << 2);
+    *out1 = accu << flag;
     out1 += ch_fac;
 
     accu = ixheaacd_sub32_sat(
@@ -195,13 +195,13 @@
             ixheaacd_mult32x16in32(ixheaacd_negate32_sat(temp_coef), win2),
             q_shift),
         ixheaacd_mult32x16in32_drc(prev1, win4));
-    *out2 = ixheaacd_round16(accu << 2);
+    *out2 = accu << flag;
     out2 -= ch_fac;
   }
 }
 
 static PLATFORM_INLINE VOID ixheaacd_long_short_win_process(
-    WORD32 *current, WORD32 *prev, WORD16 *out, const WORD16 *short_window,
+    WORD32 *current, WORD32 *prev, WORD32 *out, const WORD16 *short_window,
     const WORD16 *long_window_prev, WORD16 q_shift, WORD16 ch_fac,
     WORD32 flag) {
   WORD i;
@@ -220,7 +220,7 @@
                                       ixheaacd_mult32x16in32(tmp2_cur, short1)),
                                      q_shift),
         ixheaacd_mult32x16in32_drc(prev[i], long_window_prev[0 - 2 - 2 * i]));
-    out[ch_fac * (0 + i)] = ixheaacd_round16(accu << 2);
+    out[ch_fac * (0 + i)] = accu;
 
     if (flag) {
       accu = ixheaacd_sub32_sat(
@@ -230,12 +230,12 @@
               q_shift),
           ixheaacd_mult32x16in32_drc(prev[SIZE02 - 1 - i],
                                      long_window_prev[-2 * SIZE02 + 2 * i]));
-      out[ch_fac * (SIZE02 - 1 - i)] = ixheaacd_round16(accu << 2);
+      out[ch_fac * (SIZE02 - 1 - i)] = accu;
     }
   }
 }
 
-VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD32 *out,
                                  const WORD16 *short_window,
                                  const WORD16 *short_window_prev,
                                  const WORD16 *long_window_prev, WORD16 q_shift,
@@ -245,7 +245,7 @@
   for (i = 0; i < SIZE07; i++) {
     accu = ixheaacd_mult32x16in32_drc(
         prev[SIZE08 - 1 - i], ixheaacd_negate16(long_window_prev[2 * i + 1]));
-    out[ch_fac * i] = ixheaacd_round16(accu << 2);
+    out[ch_fac * i] = accu;
   }
 
   for (i = 0; i < SIZE01; i++) {
@@ -256,7 +256,7 @@
             q_shift),
         ixheaacd_mult32x16in32_drc(prev[SIZE01 - 1 - i],
                                    long_window_prev[2 * SIZE07 + 1 + 2 * i]));
-    out[ch_fac * (SIZE07 + i)] = ixheaacd_round16(accu << 2);
+    out[ch_fac * (SIZE07 + i)] = accu;
   }
 
   for (i = 0; i < SIZE01; i++) {
@@ -267,7 +267,7 @@
             q_shift),
         ixheaacd_mult32x16in32_drc(prev[i],
                                    long_window_prev[SIZE16 - 2 - (2 * i)]));
-    out[ch_fac * (SIZE08 + i)] = ixheaacd_round16(accu << 2);
+    out[ch_fac * (SIZE08 + i)] = accu;
   }
 
   flag = 1;
@@ -307,12 +307,11 @@
   }
 }
 
-VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift,
                                  WORD16 ch_fac) {
   WORD32 i;
-
   for (i = 0; i < SIZE07; i++) {
-    out[ch_fac * i] = ixheaacd_round16(ixheaacd_shl32_dir_sat_limit(
+    out[ch_fac * i] = (ixheaacd_shl32_dir_sat_limit(
         ixheaacd_negate32_sat(coef[SIZE07 - 1 - i]), q_shift));
   }
 }
@@ -326,33 +325,34 @@
   }
 }
 
-VOID ixheaacd_overlap_buf_out_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf,
+VOID ixheaacd_overlap_buf_out_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
                                   WORD32 size, const WORD16 ch_fac) {
   WORD32 i;
 
   for (i = 0; i < size; i++) {
-    out_samples[ch_fac * i] = ixheaacd_shl16_sat((WORD16)ptr_overlap_buf[i], 1);
+    out_samples[ch_fac * i] =
+        (ixheaacd_shl32_sat((WORD16)ptr_overlap_buf[i], 15));
   }
 }
 
-VOID ixheaacd_overlap_out_copy_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf,
+VOID ixheaacd_overlap_out_copy_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
                                    WORD32 *ptr_overlap_buf1,
                                    const WORD16 ch_fac) {
   WORD32 i;
 
   for (i = 0; i < SIZE01; i++) {
-    out_samples[ch_fac * i] = ixheaacd_shl16_sat((WORD16)ptr_overlap_buf[i], 1);
+    out_samples[ch_fac * i] =
+        ixheaacd_shl32_sat((WORD16)ptr_overlap_buf[i], 15);
     ptr_overlap_buf[i] = ptr_overlap_buf1[i];
   }
 }
 
 VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info,
                             WORD32 *ptr_spec_coeff,
-                            ia_ics_info_struct *ptr_ics_info,
-                            WORD16 out_samples[], const WORD16 ch_fac,
-                            WORD32 *scratch,
+                            ia_ics_info_struct *ptr_ics_info, VOID *out_samples,
+                            const WORD16 ch_fac, WORD32 *scratch,
                             ia_aac_dec_tables_struct *ptr_aac_tables,
-                            WORD32 object_type) {
+                            WORD32 object_type, WORD slot_element) {
   WORD32 *ptr_overlap_buf;
   const WORD16 *ptr_long_window;
   const WORD16 *ptr_short_window;
@@ -371,6 +371,8 @@
 
     if ((512 == ptr_ics_info->frame_length) ||
         (480 == ptr_ics_info->frame_length)) {
+      ptr_ics_info->qshift_adj = -2;
+
       if (512 == ptr_ics_info->frame_length) {
         WORD32 *ld_cos_sin_ptr =
             (WORD32 *)ptr_aac_tables->pstr_imdct_tables->cosine_array_1024;
@@ -415,10 +417,13 @@
 
             if (1024 == ptr_ics_info->frame_length) {
               ia_ics_info_struct *tmp_ptr_ics_info = ptr_ics_info;
+
               (*ixheaacd_post_twid_overlap_add)(
-                  out_samples, ptr_spec_coeff,
+                  (WORD32 *)out_samples, ptr_spec_coeff,
                   ptr_aac_tables->pstr_imdct_tables, 1024, ptr_overlap_buf,
                   q_shift, ptr_long_window, ch_fac);
+
+              ptr_ics_info->qshift_adj = 2;
               ptr_ics_info = tmp_ptr_ics_info;
             }
             if ((512 == ptr_ics_info->frame_length) ||
@@ -426,21 +431,24 @@
               if (object_type != AOT_ER_AAC_ELD) {
                 if (512 == ptr_ics_info->frame_length) {
                   ixheaacd_lap1_512_480(ptr_spec_coeff, ptr_overlap_buf,
-                                        out_samples, ptr_long_window, q_shift,
-                                        SIZE04, ch_fac);
+                                        (WORD16 *)out_samples, ptr_long_window,
+                                        q_shift, SIZE04, ch_fac, slot_element);
                   ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
                                               q_shift, SIZE04);
                 } else if (480 == ptr_ics_info->frame_length) {
                   ixheaacd_lap1_512_480(ptr_spec_coeff, ptr_overlap_buf,
-                                        out_samples, ptr_long_window, q_shift,
-                                        240, ch_fac);
+                                        (WORD16 *)out_samples, ptr_long_window,
+                                        q_shift, 240, ch_fac, slot_element);
                   ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
                                               q_shift, 240);
                 }
               } else {
-                ixheaacd_eld_dec_windowing(
-                    ptr_spec_coeff, ptr_long_window, ptr_ics_info->frame_length,
-                    q_shift, ptr_overlap_buf, ch_fac, out_samples);
+                ixheaacd_eld_dec_windowing(ptr_spec_coeff, ptr_long_window,
+                                           ptr_ics_info->frame_length, q_shift,
+                                           ptr_overlap_buf, ch_fac,
+                                           (WORD16 *)out_samples, slot_element);
+
+                ptr_ics_info->qshift_adj = -2;
               }
             }
             break;
@@ -452,9 +460,10 @@
                                        ptr_aac_tables->pstr_imdct_tables, 1024);
             }
 
-            ixheaacd_process_win_seq(scratch, ptr_overlap_buf, out_samples,
-                                     ptr_long_window, ptr_short_window, q_shift,
-                                     ch_fac, 1);
+            ixheaacd_process_win_seq(scratch, ptr_overlap_buf,
+                                     (WORD32 *)out_samples, ptr_long_window,
+                                     ptr_short_window, q_shift, ch_fac, 1);
+            ptr_ics_info->qshift_adj = 1;
 
             if (512 == ptr_ics_info->frame_length) {
               ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
@@ -480,17 +489,20 @@
           case ONLY_LONG_SEQUENCE:
           case LONG_STOP_SEQUENCE:
 
-            (*ixheaacd_over_lap_add1)(scratch, ptr_overlap_buf, out_samples,
-                                      ptr_long_window, q_shift, SIZE08, ch_fac);
+            (*ixheaacd_over_lap_add1)(scratch, ptr_overlap_buf,
+                                      (WORD32 *)out_samples, ptr_long_window,
+                                      q_shift, SIZE08, ch_fac);
 
+            ptr_ics_info->qshift_adj = 2;
             break;
 
           case LONG_START_SEQUENCE:
           case EIGHT_SHORT_SEQUENCE:
 
-            ixheaacd_process_win_seq(scratch, ptr_overlap_buf, out_samples,
-                                     ptr_long_window, ptr_short_window, q_shift,
-                                     ch_fac, 1);
+            ixheaacd_process_win_seq(scratch, ptr_overlap_buf,
+                                     (WORD32 *)out_samples, ptr_long_window,
+                                     ptr_short_window, q_shift, ch_fac, 1);
+            ptr_ics_info->qshift_adj = 1;
 
             break;
         }
@@ -512,28 +524,32 @@
           case EIGHT_SHORT_SEQUENCE:
           case LONG_START_SEQUENCE:
 
-            (*ixheaacd_overlap_buf_out)(out_samples, ptr_overlap_buf, SIZE07,
-                                        ch_fac);
+            (*ixheaacd_overlap_buf_out)((WORD32 *)out_samples, ptr_overlap_buf,
+                                        SIZE07, ch_fac);
 
             (*ixheaacd_over_lap_add1)(
                 &scratch[SIZE14], &ptr_overlap_buf[SIZE07],
-                &out_samples[ch_fac * (SIZE07)], ptr_short_window, q_shift,
-                SIZE01, ch_fac);
+                ((WORD32 *)out_samples + ch_fac * (SIZE07)), ptr_short_window,
+                q_shift, SIZE01, ch_fac);
 
             {
-              WORD16 q_shift1 = q_shift + 1;
-              (*ixheaacd_neg_shift_spec)(&scratch[SIZE08],
-                                         &out_samples[ch_fac * SIZE09],
-                                         q_shift1, ch_fac);
+              WORD16 q_shift1 = q_shift - 1;
+
+              (*ixheaacd_neg_shift_spec)(
+                  &scratch[SIZE08], ((WORD32 *)out_samples + ch_fac * SIZE09),
+                  q_shift1, ch_fac);
             }
+            ptr_ics_info->qshift_adj = 2;
 
             break;
           case ONLY_LONG_SEQUENCE:
           case LONG_STOP_SEQUENCE:
 
-            ixheaacd_process_win_seq(scratch, ptr_overlap_buf, out_samples,
-                                     ptr_long_window, ptr_short_window, q_shift,
-                                     ch_fac, 0);
+            ixheaacd_process_win_seq(scratch, ptr_overlap_buf,
+                                     (WORD32 *)out_samples, ptr_long_window,
+                                     ptr_short_window, q_shift, ch_fac, 0);
+
+            ptr_ics_info->qshift_adj = 2;
             break;
         }
 
@@ -579,11 +595,11 @@
       case EIGHT_SHORT_SEQUENCE:
       case LONG_START_SEQUENCE:
 
-        (*ixheaacd_overlap_buf_out)(out_samples, ptr_overlap_buf, SIZE07,
-                                    ch_fac);
+        (*ixheaacd_overlap_buf_out)((WORD32 *)out_samples, ptr_overlap_buf,
+                                    SIZE07, ch_fac);
 
         (*ixheaacd_over_lap_add1)(&scratch[0], &ptr_overlap_buf[SIZE07],
-                                  &out_samples[ch_fac * SIZE07],
+                                  ((WORD32 *)out_samples + ch_fac * SIZE07),
                                   ptr_short_window, q_shift, SIZE01, ch_fac);
 
         for (i = 0; i < 3; i++) {
@@ -591,27 +607,32 @@
           (*ixheaacd_spec_to_overlapbuf)(overlap_buf_loc, &scratch[inc],
                                          q_shift, SIZE01);
 
-          (*ixheaacd_over_lap_add1)(&scratch[SIZE02 + inc], overlap_buf_loc,
-                                    &out_samples[ch_fac * (SIZE09 + inc)],
-                                    short_window, q_shift, SIZE01, ch_fac);
+          (*ixheaacd_over_lap_add1)(
+              &scratch[SIZE02 + inc], overlap_buf_loc,
+              ((WORD32 *)out_samples + ch_fac * (SIZE09 + inc)), short_window,
+              q_shift, SIZE01, ch_fac);
         }
 
         (*ixheaacd_over_lap_add2)(&scratch[SIZE08], &scratch[SIZE06],
                                   ptr_overlap_buf, short_window, q_shift,
                                   SIZE01, 1);
 
-        (*ixheaacd_overlap_out_copy)(&out_samples[ch_fac * SIZE15],
+        (*ixheaacd_overlap_out_copy)(((WORD32 *)out_samples + ch_fac * SIZE15),
                                      ptr_overlap_buf, &ptr_overlap_buf[SIZE01],
                                      ch_fac);
 
+        ptr_ics_info->qshift_adj = 2;
+
         break;
 
       case ONLY_LONG_SEQUENCE:
       case LONG_STOP_SEQUENCE:
 
-        ixheaacd_long_short_win_seq(scratch, ptr_overlap_buf, out_samples,
-                                    short_window, ptr_short_window,
-                                    ptr_long_window, q_shift, ch_fac);
+        ixheaacd_long_short_win_seq(
+            scratch, ptr_overlap_buf, (WORD32 *)out_samples, short_window,
+            ptr_short_window, ptr_long_window, q_shift, ch_fac);
+
+        ptr_ics_info->qshift_adj = 2;
 
         break;
     }
@@ -633,7 +654,7 @@
 void ixheaacd_eld_dec_windowing(WORD32 *ptr_spect_coeff, const WORD16 *p_win,
                                 WORD32 framesize, WORD16 q_shift,
                                 WORD32 *p_overlap_buffer, const WORD16 stride,
-                                WORD16 *out_samples)
+                                VOID *out_samples_t, WORD slot_element)
 
 {
   int i = 0;
@@ -644,6 +665,8 @@
   WORD32 *p_overlap_buffer32 = (WORD32 *)p_overlap_buffer;
   WORD32 delay = framesize >> 2;
 
+  WORD16 *out_samples = (WORD16 *)out_samples_t - slot_element;
+
   ptr_z = ptr_spect_coeff + delay;
   p_win += delay;
   ptr_out = p_overlap_buffer32;
diff --git a/decoder/ixheaacd_lt_predict.c b/decoder/ixheaacd_lt_predict.c
index 83fc9cc..9f5b852 100644
--- a/decoder/ixheaacd_lt_predict.c
+++ b/decoder/ixheaacd_lt_predict.c
@@ -396,15 +396,18 @@
   }
 }
 
-VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, WORD16 *time,
+VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, void *time_t,
                               WORD32 *overlap, WORD32 frame_len,
                               WORD32 object_type, WORD32 stride,
-                              WORD16 window_sequence, WORD16 *p_window_next) {
+                              WORD16 window_sequence, WORD16 *p_window_next,
+                              WORD slot_element) {
   WORD32 i;
+
   if (object_type == AOT_ER_AAC_LD) {
     WORD16 *ptr_ltp_state0 = &lt_pred_stat[0];
     WORD16 *ptr_ltp_state_fl = &lt_pred_stat[frame_len + 0];
     WORD16 *ptr_ltp_state_2fl = &lt_pred_stat[(frame_len * 2) + 0];
+    WORD16 *time = (WORD16 *)time_t - slot_element;
     WORD16 *ptr_time_in = &time[0 * stride];
 
     for (i = 0; i < frame_len; i++) {
@@ -417,11 +420,15 @@
   } else {
     WORD16 *ptr_ltp_state0 = &lt_pred_stat[0];
     WORD16 *ptr_ltp_state_fl = &lt_pred_stat[frame_len + 0];
-    WORD16 *ptr_time_in = &time[0 * stride];
+    WORD32 *time = (WORD32 *)time_t;
+    WORD32 *ptr_time_in = &time[0 * stride];
+
+    time = (WORD32 *)time_t;
 
     for (i = 0; i < frame_len; i++) {
       *ptr_ltp_state0++ = *ptr_ltp_state_fl;
-      *ptr_ltp_state_fl++ = *ptr_time_in;
+      *ptr_ltp_state_fl++ =
+          ixheaacd_round16(ixheaacd_shl32_sat(*ptr_time_in, 2));
       ptr_time_in += stride;
     }
   }
diff --git a/decoder/ixheaacd_lt_predict.h b/decoder/ixheaacd_lt_predict.h
index 8e4fbfc..69a2a39 100644
--- a/decoder/ixheaacd_lt_predict.h
+++ b/decoder/ixheaacd_lt_predict.h
@@ -46,10 +46,10 @@
 
 VOID ixheaacd_init_ltp_object(ltp_info *ltp);
 
-VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, WORD16 *time,
-                              WORD32 *overlap, WORD32 frame_len,
-                              WORD32 object_type, WORD32 stride,
-                              WORD16 window_sequence, WORD16 *p_window_next);
+VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, void *time, WORD32 *overlap,
+                              WORD32 frame_len, WORD32 object_type,
+                              WORD32 stride, WORD16 window_sequence,
+                              WORD16 *p_window_next, WORD slot_element);
 
 VOID ixheaacd_filter_bank_ltp(ia_aac_dec_tables_struct *aac_tables_ptr,
                               WORD16 window_sequence, WORD16 win_shape,
diff --git a/decoder/ixheaacd_mps_dec.c b/decoder/ixheaacd_mps_dec.c
index 98f6646..a5f9c11 100644
--- a/decoder/ixheaacd_mps_dec.c
+++ b/decoder/ixheaacd_mps_dec.c
@@ -69,8 +69,15 @@
 #include "ixheaacd_mps_hybfilter.h"
 #include "ixheaacd_mps_nlc_dec.h"
 #include "ixheaacd_mps_huff_tab.h"
+
+#include "math.h"
+
+#include <assert.h>
+#include <string.h>
 #include "ixheaacd_error_standards.h"
 
+#define max(a, b) (((a) > (b)) ? (a) : (b))
+
 extern const ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes;
 extern const ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes;
 extern const ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes;
@@ -126,7 +133,7 @@
   if ((self->residual_coding) && (self->res_bands > 0))
     ixheaacd_mps_qmf_hybrid_analysis_init(&self->hyb_filt_state[1]);
 
-  err_code = ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count,
+  err_code = ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count_max,
                                      self->config->bs_decorr_config);
   if (err_code != IA_NO_ERROR) return err_code;
 
@@ -163,12 +170,12 @@
 
 VOID ixheaacd_mps_qmf_hyb_analysis(ia_mps_dec_state_struct* self) {
   ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[0], self->qmf_in[0],
-                                   self->qmf_band_count, self->time_slots,
+                                   self->band_count[0], self->time_slots,
                                    self->hyb_in[0]);
 
   if ((self->residual_coding) && (self->res_bands > 0)) {
     ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[self->in_ch_count],
-                                     self->qmf_in[1], self->qmf_band_count,
+                                     self->qmf_in[1], self->band_count[1],
                                      self->time_slots, self->hyb_res);
   }
 }
@@ -178,7 +185,7 @@
 
   for (ch = 0; ch < self->out_ch_count; ch++) {
     ixheaacd_mps_qmf_hybrid_synthesis(self->hyb_dir_out[ch],
-                                      self->qmf_band_count, self->time_slots,
+                                      self->band_count[0], self->time_slots,
                                       self->qmf_out_dir[ch]);
   }
 }
@@ -209,7 +216,7 @@
     }
 
     ixheaacd_mps_decor_apply(&self->mps_decor, self->v[k], self->w_diff[k],
-                             self->time_slots);
+                             self->time_slots, NO_RES_BANDS);
 
     if (self->bs_tsd_enable) {
       for (sb_sample = 0; sb_sample < self->time_slots; sb_sample++) {
@@ -235,7 +242,7 @@
   WORD32 ts, qs, row, indx;
 
   for (ts = 0; ts < self->time_slots; ts++) {
-    for (qs = 0; qs < self->hyb_band_count; qs++) {
+    for (qs = 0; qs < self->hyb_band_count_max; qs++) {
       indx = self->hyb_band_to_processing_band_table[qs];
 
       for (row = 0; row < self->dir_sig_count; row++) {
@@ -246,8 +253,8 @@
       for (row = self->dir_sig_count;
            row < (self->dir_sig_count + self->decor_sig_count); row++) {
         if (indx < self->res_bands) {
-          self->w_dir[row][ts][qs].re = self->hyb_res[ts][qs].re;
-          self->w_dir[row][ts][qs].im = self->hyb_res[ts][qs].im;
+          self->w_dir[row][ts][qs].re = self->hyb_res[qs][ts].re;
+          self->w_dir[row][ts][qs].im = self->hyb_res[qs][ts].im;
         } else {
           self->w_dir[row][ts][qs].re = 0.0f;
           self->w_dir[row][ts][qs].im = 0.0f;
@@ -270,10 +277,54 @@
   }
 }
 
+VOID ixheaacd_mps_mix_res_decor_residual_band(ia_mps_dec_state_struct* self) {
+  WORD32 ts, qs, indx;
+  for (qs = 0; qs < self->hyb_band_count_max; qs++) {
+    indx = self->hyb_band_to_processing_band_table[qs];
+    if (indx >= self->res_bands) {
+      if (qs < self->hyb_band_count[1]) {
+        for (ts = 0; ts < self->time_slots; ts++) {
+          self->w_dir[1][ts][qs].re = 0.0f;
+          self->w_dir[1][ts][qs].im = 0.0f;
+        }
+      }
+    } else {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        self->w_diff[1][ts][qs].re = 0.0f;
+        self->w_diff[1][ts][qs].im = 0.0f;
+      }
+    }
+  }
+}
+
 VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct* self) {
   ixheaacd_mps_decor(self);
   ixheaacd_mps_mix_res_decor(self);
 }
+
+VOID ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(ia_mps_dec_state_struct* self) {
+  ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
+      &self->hyb_filt_state[0], self->qmf_in[0], self->band_count[0],
+      self->time_slots, self->w_dir[0]);
+
+  if (self->res_bands) {
+    ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
+        &self->hyb_filt_state[1], self->qmf_in[1], self->band_count[1],
+        self->time_slots, self->w_dir[1]);
+
+    if (self->res_bands != 28) {
+      ixheaacd_mps_decor_apply(&self->mps_decor, self->w_dir[0],
+                               self->w_diff[1], self->time_slots,
+                               self->res_bands);
+
+      ixheaacd_mps_mix_res_decor_residual_band(self);
+    }
+  } else {
+    ixheaacd_mps_decor_apply(&self->mps_decor, self->w_dir[0], self->w_diff[1],
+                             self->time_slots, NO_RES_BANDS);
+  }
+}
+
 WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self,
                           FLOAT32** input_buffer[4],
                           FLOAT32 (*output_buffer)[4096]) {
@@ -281,43 +332,56 @@
   WORD32 time_slots = self->time_slots;
   WORD32 in_ch_count = self->in_ch_count + self->res_ch_count;
   WORD32 err = 0;
-
+  self->hyb_band_count[0] = self->band_count[0] - QMF_BANDS_TO_HYBRID + 10;
+  self->hyb_band_count[1] = self->band_count[1] - QMF_BANDS_TO_HYBRID + 10;
+  self->hyb_band_count_max =
+      max(self->hyb_band_count[0], self->hyb_band_count[1]);
+  self->mps_decor.decor_nrg_smooth.num_bins = self->hyb_band_count_max;
+  self->mps_decor.num_bins = self->hyb_band_count_max;
   self->output_buffer = output_buffer;
 
-  assert(self->present_time_slot + time_slots <= self->time_slots);
-
-  for (ts = 0; ts < time_slots; ts++) {
-    for (ch = 0; ch < in_ch_count; ch++) {
-      for (qs = 0; qs < self->qmf_band_count; qs++) {
-        self->qmf_in[ch][self->present_time_slot + ts][qs].re =
-            self->input_gain * input_buffer[2 * ch][ts][qs];
-        self->qmf_in[ch][self->present_time_slot + ts][qs].im =
-            self->input_gain * input_buffer[2 * ch + 1][ts][qs];
-      }
-    }
-  }
-
-  self->present_time_slot += time_slots;
-
-  if (self->present_time_slot < self->time_slots) return 0;
-
-  self->present_time_slot = 0;
-
   err = ixheaacd_mps_frame_decode(self);
 
   if (err != 0) return err;
-  ixheaacd_mps_qmf_hyb_analysis(self);
 
   ixheaacd_pre_and_mix_matrix_calculation(self);
 
   ixheaacd_mps_pre_matrix_mix_matrix_smoothing(self);
 
-  err = ixheaacd_mps_apply_pre_matrix(self);
-  if (err < 0) return err;
+  for (ch = 0; ch < in_ch_count; ch++) {
+    for (ts = 0; ts < time_slots; ts++) {
+      for (qs = 0; qs < self->band_count[ch]; qs++) {
+        self->qmf_in[ch][qs][ts].re =
+            self->input_gain * input_buffer[2 * ch][ts][qs];
+        self->qmf_in[ch][qs][ts].im =
+            self->input_gain * input_buffer[2 * ch + 1][ts][qs];
+      }
+    }
+  }
 
-  ixheaacd_mps_create_w(self);
+  if (!(self->pre_mix_req | self->bs_tsd_enable)) {
+    ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(self);
+  } else {
+    ixheaacd_mps_qmf_hyb_analysis(self);
 
-  err = ixheaacd_mps_apply_mix_matrix(self);
+    err = ixheaacd_mps_apply_pre_matrix(self);
+
+    if (err < 0) return err;
+
+    ixheaacd_mps_create_w(self);
+  }
+
+  if ((!(self->res_bands | self->pre_mix_req)) &&
+      (self->config->bs_phase_coding == 0)) {
+    err = ixheaacd_mps_apply_mix_matrix_type1(self);
+
+  } else if (self->pre_mix_req) {
+    err = ixheaacd_mps_apply_mix_matrix_type2(self);
+
+  } else {
+    err = ixheaacd_mps_apply_mix_matrix_type3(self);
+  }
+
   if (err < 0) return err;
 
   if (self->config->bs_temp_shape_config == 2) {
diff --git a/decoder/ixheaacd_mps_dec.h b/decoder/ixheaacd_mps_dec.h
index 845b723..55f98bd 100644
--- a/decoder/ixheaacd_mps_dec.h
+++ b/decoder/ixheaacd_mps_dec.h
@@ -38,6 +38,8 @@
 
 #define MAX_DECORR_FIL_ORDER (DECORR_FILT_0_ORD)
 
+#define NO_RES_BANDS -1
+
 typedef struct {
   FLOAT32 re;
   FLOAT32 im;
@@ -107,7 +109,7 @@
 
 typedef struct ia_mps_hybrid_filt_struct {
   ia_cmplx_flt_struct hf_buffer[MAX_NUM_QMF_BANDS_MPS][BUFFER_LEN_HF_MPS];
-  ia_cmplx_w32_struct lf_buffer[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF_MPS];
+  ia_cmplx_flt_struct lf_buffer[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF_MPS];
 } ia_mps_hybrid_filt_struct;
 
 typedef struct ia_mps_data_struct {
@@ -151,7 +153,7 @@
 
 typedef struct ia_mps_smoothing_struct {
   WORD32 prev_smg_time;
-  WORD32 inv_prev_smg_time;
+  FLOAT32 inv_prev_smg_time;
   WORD32 prev_smg_data[MAX_PARAMETER_BANDS];
 } ia_mps_smoothing_struct;
 
@@ -188,18 +190,18 @@
   WORD32 decor_sig_count;
 
   WORD32 time_slots;
-  WORD32 present_time_slot;
-  WORD32 frame_len;
-
+  WORD32 pre_mix_req;
   WORD32 temp_shape_enable_ch_stp[2];
   WORD32 temp_shape_enable_ch_ges[2];
 
   FLOAT32 env_shape_data[2][MAX_TIME_SLOTS];
 
   WORD8 parse_nxt_frame;
-
+  WORD32 band_count[MAX_M1_INPUT];
+  WORD32 synth_count;
   WORD32 qmf_band_count;
-  WORD32 hyb_band_count;
+  WORD32 hyb_band_count[MAX_M1_INPUT];
+  WORD32 hyb_band_count_max;
   const WORD32 *hyb_band_to_processing_band_table;
 
   WORD32 res_ch_count;
@@ -226,7 +228,7 @@
   ia_mps_bs_frame bs_frame;
 
   WORD32 smoothing_time[MAX_PARAMETER_SETS_MPS];
-  WORD32 inv_smoothing_time[MAX_PARAMETER_SETS_MPS];
+  FLOAT32 inv_smoothing_time[MAX_PARAMETER_SETS_MPS];
   WORD32 smoothing_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS];
 
   WORD32 bs_tsd_enable;
@@ -248,32 +250,29 @@
   FLOAT32 phase_l_prev[MAX_PARAMETER_BANDS];
   FLOAT32 phase_r_prev[MAX_PARAMETER_BANDS];
 
-  WORD32 phase_l_fix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS];
-  WORD32 phase_r_fix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS];
+  FLOAT32 m1_param_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m1_param_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m2_decor_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m2_decor_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m2_resid_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m2_resid_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
 
-  WORD32 m1_param_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m1_param_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m2_decor_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m2_decor_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m2_resid_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m2_resid_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
+  FLOAT32 m1_param_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m1_param_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m2_decor_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m2_decor_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m2_resid_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m2_resid_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
 
-  WORD32 m1_param_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m1_param_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m2_decor_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m2_decor_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m2_resid_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m2_resid_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-
-  ia_cmplx_flt_struct qmf_in[2][MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS_NEW];
-  ia_cmplx_flt_struct hyb_in[2][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
-  ia_cmplx_flt_struct hyb_res[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
+  ia_cmplx_flt_struct qmf_in[2][MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS];
+  ia_cmplx_flt_struct hyb_in[2][MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS];
+  ia_cmplx_flt_struct hyb_res[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS];
   ia_cmplx_flt_struct v[MAX_M1_OUTPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
   ia_cmplx_flt_struct w_diff[MAX_M2_INPUT][MAX_TIME_SLOTS]
                             [MAX_HYBRID_BANDS_MPS];
@@ -297,7 +296,7 @@
 
   WORD32 bs_high_rate_mode;
 
-  WORD32 tmp_buf[84 * MAX_NUM_QMF_BANDS_SAC];
+  FLOAT32 tmp_buf[84 * MAX_NUM_QMF_BANDS_SAC];
 
   FLOAT32 r_out_re_in_m1[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
                         [MAX_M_INPUT];
@@ -340,11 +339,9 @@
 VOID ixheaacd_mps_init_pre_and_post_matrix(ia_mps_dec_state_struct *self);
 VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self);
 WORD32 ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self);
-WORD32 ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self);
-
-VOID ixheaacd_mps_config(ia_mps_dec_state_struct *self, WORD32 frame_len,
-                         WORD32 residual_coding,
-                         ia_usac_dec_mps_config_struct *mps212_config);
+WORD32 ixheaacd_mps_apply_mix_matrix_type1(ia_mps_dec_state_struct *self);
+WORD32 ixheaacd_mps_apply_mix_matrix_type2(ia_mps_dec_state_struct *self);
+WORD32 ixheaacd_mps_apply_mix_matrix_type3(ia_mps_dec_state_struct *self);
 
 WORD32 ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self);
 
@@ -359,25 +356,33 @@
 WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct *self);
 
 VOID ixheaacd_mps_par2umx_ps(ia_mps_dec_state_struct *self,
-                             ia_mps_bs_frame *curr_bit_stream, WORD32 *h_real,
+                             ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_real,
                              WORD32 param_set_idx);
-
 VOID ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct *self,
                                      ia_mps_bs_frame *curr_bit_stream,
-                                     WORD32 *h_real, WORD32 param_set_idx);
+                                     FLOAT32 *h_real, WORD32 param_set_idx);
 
 VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self,
-                               ia_mps_bs_frame *curr_bit_stream, WORD32 *h_imag,
-                               WORD32 *h_real, WORD32 param_set_idx,
-                               WORD32 res_bands);
+                               ia_mps_bs_frame *curr_bit_stream,
+                               FLOAT32 *h_imag, FLOAT32 *h_real,
+                               WORD32 param_set_idx, WORD32 res_bands);
 
-WORD32 ixheaacd_mps_upmix_interp(
-    WORD32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                   [MAX_M_INPUT],
-    WORD32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                   [MAX_M_INPUT],
-    WORD32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
-    WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self);
+WORD32 ixheaacd_mps_upmix_interp_type1(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self,
+    WORD32 bs_high_rate_mode);
+
+WORD32 ixheaacd_mps_upmix_interp_type2(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    WORD32 num_rows, ia_mps_dec_state_struct *self, WORD32 col);
 
 VOID ixheaacd_mps_phase_interpolation(
     FLOAT32 pl[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
diff --git a/decoder/ixheaacd_mps_decor.h b/decoder/ixheaacd_mps_decor.h
index 4f856f5..8153681 100644
--- a/decoder/ixheaacd_mps_decor.h
+++ b/decoder/ixheaacd_mps_decor.h
@@ -30,6 +30,6 @@
     ia_mps_decor_struct_handle self,
     ia_cmplx_flt_struct in[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
     ia_cmplx_flt_struct out[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
-    WORD32 length);
+    WORD32 length, WORD32 res_bands);
 
 #endif
diff --git a/decoder/ixheaacd_mps_decorr.c b/decoder/ixheaacd_mps_decorr.c
index 33b6aa5..b2acb26 100644
--- a/decoder/ixheaacd_mps_decorr.c
+++ b/decoder/ixheaacd_mps_decorr.c
@@ -44,6 +44,8 @@
 static const WORD32 ixheaacd_qmf_split_freq_1[] = {3, 50, 65, 65};
 static const WORD32 ixheaacd_qmf_split_freq_2[] = {0, 15, 65, 65};
 
+extern const WORD32 ixheaacd_mps_gain_set_indx[29];
+
 static const FLOAT32
     ixheaacd_lattice_coeff_0_filt_den_coeff[DECORR_FILT_0_ORD + 1] = {
         1.000000f, -0.314818f, -0.256828f, -0.173641f, -0.115077f, 0.000599f,
@@ -141,19 +143,25 @@
     ixheaacd_mps_decor_energy_adjust_filt_struct *handle,
     ia_cmplx_flt_struct in[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
     ia_cmplx_flt_struct out[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
-    WORD32 time_slots) {
+    WORD32 time_slots, WORD32 res_bands) {
   ixheaacd_mps_decor_energy_adjust_filt_struct *self =
       (ixheaacd_mps_decor_energy_adjust_filt_struct *)handle;
   FLOAT32 in_energy[MAX_PARAMETER_BANDS] = {0};
   FLOAT32 out_energy[MAX_PARAMETER_BANDS] = {0};
   FLOAT32 gain[MAX_PARAMETER_BANDS];
   WORD32 i, j, k;
+  WORD32 start_param_band = 0, start_bin = 0;
+
+  if (res_bands != NO_RES_BANDS) {
+    start_bin = ixheaacd_mps_gain_set_indx[res_bands];
+    start_param_band = res_bands;
+  }
 
   for (i = 0; i < time_slots; i++) {
     memset(in_energy, 0, sizeof(FLOAT32) * MAX_PARAMETER_BANDS);
     memset(out_energy, 0, sizeof(FLOAT32) * MAX_PARAMETER_BANDS);
 
-    for (j = 0; j < self->num_bins; j++) {
+    for (j = start_bin; j < self->num_bins; j++) {
       k = ixheaacd_hybrid_band_71_to_processing_band_28_map[j];
 
       in_energy[k] += in[i][j].re * in[i][j].re + in[i][j].im * in[i][j].im;
@@ -161,7 +169,7 @@
           out[i][j].re * out[i][j].re + out[i][j].im * out[i][j].im;
     }
 
-    for (k = 0; k < MAX_PARAMETER_BANDS; k++) {
+    for (k = start_param_band; k < MAX_PARAMETER_BANDS; k++) {
       self->smooth_in_energy[k] = self->smooth_in_energy[k] * DECOR_ALPHA +
                                   in_energy[k] * ONE_MINUS_DECOR_ALPHA;
       self->smooth_out_energy[k] = self->smooth_out_energy[k] * DECOR_ALPHA +
@@ -184,7 +192,7 @@
       }
     }
 
-    for (j = 0; j < self->num_bins; j++) {
+    for (j = start_bin; j < self->num_bins; j++) {
       k = ixheaacd_hybrid_band_71_to_processing_band_28_map[j];
 
       out[i][j].re *= gain[k];
@@ -233,12 +241,14 @@
     ia_mps_decor_struct_handle self,
     ia_cmplx_flt_struct in[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
     ia_cmplx_flt_struct out[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
-    WORD32 length) {
-  WORD32 idx, sb_sample;
+    WORD32 length, WORD32 res_bands) {
+  WORD32 idx, sb_sample, index = 0;
 
   ia_cmplx_flt_struct scratch[MAX_TIME_SLOTS];
 
-  for (idx = 0; idx < self->num_bins; idx++) {
+  if (res_bands != NO_RES_BANDS) index = ixheaacd_mps_gain_set_indx[res_bands];
+
+  for (idx = index; idx < self->num_bins; idx++) {
     for (sb_sample = 0; sb_sample < length; sb_sample++) {
       self->decor_delay_buffer[idx][self->delay_sample_count[idx] + sb_sample]
           .re = in[sb_sample][idx].re;
@@ -262,6 +272,6 @@
     }
   }
 
-  ixheaacd_mps_decor_energy_adjustment(&self->decor_nrg_smooth, in, out,
-                                       length);
+  ixheaacd_mps_decor_energy_adjustment(&self->decor_nrg_smooth, in, out, length,
+                                       res_bands);
 }
diff --git a/decoder/ixheaacd_mps_hybfilter.h b/decoder/ixheaacd_mps_hybfilter.h
index b0b8266..126dee2 100644
--- a/decoder/ixheaacd_mps_hybfilter.h
+++ b/decoder/ixheaacd_mps_hybfilter.h
@@ -24,9 +24,15 @@
 
 VOID ixheaacd_mps_qmf_hybrid_analysis(
     ia_mps_hybrid_filt_struct *handle,
-    ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS_NEW],
+    ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS],
     WORD32 num_bands, WORD32 num_samples,
-    ia_cmplx_flt_struct out_hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]);
+    ia_cmplx_flt_struct out_hyb[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]);
+
+VOID ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
+    ia_mps_hybrid_filt_struct *handle,
+    ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS],
+    WORD32 num_bands, WORD32 num_samples,
+    ia_cmplx_flt_struct v[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]);
 
 VOID ixheaacd_mps_qmf_hybrid_synthesis(
     ia_cmplx_flt_struct in_hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
diff --git a/decoder/ixheaacd_mps_hybrid_filt.c b/decoder/ixheaacd_mps_hybrid_filt.c
index 044f4b1..2c57ead 100644
--- a/decoder/ixheaacd_mps_hybrid_filt.c
+++ b/decoder/ixheaacd_mps_hybrid_filt.c
@@ -33,136 +33,177 @@
 
 #include "ixheaacd_mps_hybfilter.h"
 
-extern const WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER];
-extern const WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER];
-extern const WORD32 ixheaacd_cosine[8][13];
-extern const WORD32 ixheaacd_sine[8][13];
-extern const WORD32 ixheaacd_cosine2[2][13];
+extern const FLOAT32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER];
+extern const FLOAT32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER];
 
-static WORD32 ixheaacd_mps_mult32_local(WORD32 a, WORD32 b, WORD16 shift) {
-  WORD64 temp;
-
-  temp = (WORD64)a * (WORD64)b;
-  temp = temp >> shift;
-  return (WORD32)temp;
-}
+extern const FLOAT32 ixheaacd_sine[8][8];
+extern const FLOAT32 ixheaacd_cosine[8][8];
 
 static VOID ixheaacd_mps_hyb_filt_type1(
-    ia_cmplx_w32_struct *input, ia_cmplx_w32_struct output[8][MAX_TIME_SLOTS],
-    WORD32 num_samples, const WORD32 *filt_coeff)
+    ia_cmplx_flt_struct *input, ia_cmplx_flt_struct output[8][MAX_TIME_SLOTS],
+    WORD32 num_samples, const FLOAT32 *filt_coeff)
 
 {
   WORD32 i, n, q;
 
-  WORD32 modulation_fac_re, modulation_fac_im;
-  WORD32 in_re, in_im;
-  WORD32 temp;
-  WORD32 coeff;
-  WORD64 acc_re, acc_im;
-
-  WORD16 shift = 8;
+  FLOAT32 in_re, in_im;
+  FLOAT32 coeff;
+  FLOAT32 acc_re_l, acc_re_h, acc_im_l, acc_im_h;
 
   for (i = 0; i < num_samples; i++) {
-    for (q = 0; q < 8; q++) {
-      acc_re = 0;
-      acc_im = 0;
-      for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++) {
-        modulation_fac_re = ixheaacd_cosine[q][n];
-        modulation_fac_im = ixheaacd_sine[q][n];
+    FLOAT32 x0_re[13], x0_im[13], x0_1_re[8], x0_1_im[8];
+    FLOAT32 acc_re_val[8], acc_im_val[8];
+    for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++)  // x0 = x[n]*Cf[n]
+    {
+      in_re = input[n + i].re;
+      in_im = input[n + i].im;
 
-        in_re = (WORD32)(input[n + i].re);
-        in_im = (WORD32)(input[n + i].im);
+      coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
 
-        in_re = ixheaacd_shl32_sat(in_re, shift);
-        in_im = ixheaacd_shl32_sat(in_im, shift);
+      x0_re[n] = coeff * in_re;
+      x0_im[n] = coeff * in_im;
+    }
 
-        coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
+    // x0_2 series
 
-        temp = ixheaacd_sub32_sat(
-            ixheaacd_mps_mult32_local(in_re, modulation_fac_re, 30),
-            ixheaacd_mps_mult32_local(in_im, modulation_fac_im, 30));
+    x0_1_re[0] = x0_re[6];
+    x0_1_im[0] = x0_im[6];
 
-        if (temp >= 1073741823)
-          temp = 1073741823;
-        else if (temp <= -1073741824)
-          temp = -1073741824;
+    x0_1_re[1] = x0_re[7];
+    x0_1_im[1] = x0_im[7];
 
-        temp = ixheaacd_mps_mult32_local(coeff, temp, 30);
-        acc_re = acc_re + (WORD64)temp;
+    x0_1_re[2] = x0_re[8] - x0_re[0];
+    x0_1_im[2] = x0_im[8] - x0_im[0];
 
-        temp = ixheaacd_add32_sat(
-            ixheaacd_mps_mult32_local(in_im, modulation_fac_re, 30),
-            ixheaacd_mps_mult32_local(in_re, modulation_fac_im, 30));
+    x0_1_re[3] = x0_re[9] - x0_re[1];
+    x0_1_im[3] = x0_im[9] - x0_im[1];
 
-        if (temp >= 1073741823)
-          temp = 1073741823;
-        else if (temp <= -1073741824)
-          temp = -1073741824;
+    x0_1_re[4] = x0_re[10] - x0_re[2];
+    x0_1_im[4] = x0_im[10] - x0_im[2];
 
-        temp = ixheaacd_mps_mult32_local(coeff, temp, 30);
-        acc_im = acc_im + (WORD64)temp;
-      }
+    x0_1_re[5] = x0_re[11] - x0_re[3];
+    x0_1_im[5] = x0_im[11] - x0_im[3];
 
-      output[q][i].re = (WORD32)(acc_re >> shift);
-      output[q][i].im = (WORD32)(acc_im >> shift);
+    x0_1_re[6] = x0_re[12] - x0_re[4];
+    x0_1_im[6] = x0_im[12] - x0_im[4];
+
+    x0_1_re[7] = -(x0_re[5]);
+    x0_1_im[7] = -(x0_im[5]);
+
+    // acc_re_im_val
+    acc_re_val[0] = x0_1_re[0];
+    acc_re_val[1] = x0_1_re[1] - x0_1_re[7];
+    acc_re_val[2] = x0_1_re[2] - x0_1_re[6];
+    acc_re_val[3] = x0_1_re[3] - x0_1_re[5];
+    acc_re_val[4] = x0_1_im[1] + x0_1_im[7];
+    acc_re_val[5] = x0_1_im[2] + x0_1_im[6];
+    acc_re_val[6] = x0_1_im[3] + x0_1_im[5];
+    acc_re_val[7] = x0_1_im[4];
+
+    acc_im_val[0] = x0_1_im[0];
+    acc_im_val[1] = x0_1_im[1] - x0_1_im[7];
+    acc_im_val[2] = x0_1_im[2] - x0_1_im[6];
+    acc_im_val[3] = x0_1_im[3] - x0_1_im[5];
+    acc_im_val[4] = x0_1_re[1] + x0_1_re[7];
+    acc_im_val[5] = x0_1_re[2] + x0_1_re[6];
+    acc_im_val[6] = x0_1_re[3] + x0_1_re[5];
+    acc_im_val[7] = x0_1_re[4];
+
+    for (q = 0; q < 4; q++) {
+      acc_re_l = 0;
+      acc_im_l = 0;
+      acc_re_h = 0;
+      acc_im_h = 0;
+
+      // X_re
+      acc_re_l += acc_re_val[0];
+      acc_re_l += acc_re_val[1] * ixheaacd_cosine[q][1];
+      acc_re_l += acc_re_val[2] * ixheaacd_cosine[q][2];
+      acc_re_l += acc_re_val[3] * ixheaacd_cosine[q][3];
+
+      acc_re_h = acc_re_l;
+
+      acc_re_l -= acc_re_val[4] * ixheaacd_sine[q][1];
+      acc_re_l -= acc_re_val[5] * ixheaacd_sine[q][2];
+      acc_re_l -= acc_re_val[6] * ixheaacd_sine[q][3];
+      acc_re_l -= acc_re_val[7] * ixheaacd_sine[q][4];
+
+      acc_re_h = acc_re_h - (acc_re_l - acc_re_h);
+
+      // X_im
+      acc_im_l += acc_im_val[0];
+      acc_im_l += acc_im_val[1] * ixheaacd_cosine[q][1];
+      acc_im_l += acc_im_val[2] * ixheaacd_cosine[q][2];
+      acc_im_l += acc_im_val[3] * ixheaacd_cosine[q][3];
+
+      acc_im_h = acc_im_l;
+
+      acc_im_l += acc_im_val[4] * ixheaacd_sine[q][1];
+      acc_im_l += acc_im_val[5] * ixheaacd_sine[q][2];
+      acc_im_l += acc_im_val[6] * ixheaacd_sine[q][3];
+      acc_im_l += acc_im_val[7] * ixheaacd_sine[q][4];
+
+      acc_im_h = acc_im_h - (acc_im_l - acc_im_h);
+
+      output[q][i].re = acc_re_l;
+      output[q][i].im = acc_im_l;
+
+      output[7 - q][i].re = acc_re_h;
+      output[7 - q][i].im = acc_im_h;
     }
   }
 }
 
 static VOID ixheaacd_mps_hyb_filt_type2(
-    ia_cmplx_w32_struct *input, ia_cmplx_w32_struct output[2][MAX_TIME_SLOTS],
-    WORD32 num_samples, const WORD32 *filt_coeff)
+    ia_cmplx_flt_struct *input, ia_cmplx_flt_struct output[2][MAX_TIME_SLOTS],
+    WORD32 num_samples, const FLOAT32 *filt_coeff)
 
 {
-  WORD32 i, n, q;
+  WORD32 i, n;
 
-  WORD32 modulation_fac_re;
-  WORD32 in_re, in_im;
-  WORD32 temp;
-  WORD32 coeff;
-  WORD64 acc_re, acc_im;
-
-  WORD16 shift = 8;
+  FLOAT32 in_re, in_im;
+  FLOAT32 coeff;
+  FLOAT32 acc_re[2], acc_im[2];
 
   for (i = 0; i < num_samples; i++) {
-    for (q = 0; q < 2; q++) {
-      acc_re = 0;
-      acc_im = 0;
-      for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++) {
-        modulation_fac_re = ixheaacd_cosine2[q][n];
+    FLOAT32 x_0_re[13], x_0_im[13];
 
-        in_re = (WORD32)(input[n + i].re);
-        in_im = (WORD32)(input[n + i].im);
+    for (n = 1; n < 6; n = n + 2) {
+      in_re = input[n + i].re;
+      in_im = input[n + i].im;
 
-        in_re = ixheaacd_shl32_sat(in_re, shift);
-        in_im = ixheaacd_shl32_sat(in_im, shift);
+      in_re += input[12 - n + i].re;
+      in_im += input[12 - n + i].im;
 
-        coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
+      coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
 
-        temp = ixheaacd_mps_mult32_local(in_re, modulation_fac_re, 30);
-
-        if (temp >= 1073741823)
-          temp = 1073741823;
-        else if (temp <= -1073741824)
-          temp = -1073741824;
-
-        temp = ixheaacd_mps_mult32_local(coeff, temp, 30);
-        acc_re = acc_re + (WORD64)temp;
-
-        temp = ixheaacd_mps_mult32_local(in_im, modulation_fac_re, 30);
-
-        if (temp >= 1073741823)
-          temp = 1073741823;
-        else if (temp <= -1073741824)
-          temp = -1073741824;
-
-        temp = ixheaacd_mps_mult32_local(coeff, temp, 30);
-        acc_im = acc_im + (WORD64)temp;
-      }
-
-      output[q][i].re = (WORD32)(acc_re >> shift);
-      output[q][i].im = (WORD32)(acc_im >> shift);
+      x_0_re[n] = coeff * in_re;
+      x_0_im[n] = coeff * in_im;
     }
+
+    n = 6;
+    in_re = input[n + i].re;
+    in_im = input[n + i].im;
+
+    coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
+
+    x_0_re[n] = coeff * in_re;
+    x_0_im[n] = coeff * in_im;
+
+    x_0_re[1] = x_0_re[1] + x_0_re[3] + x_0_re[5];
+    x_0_im[1] = x_0_im[1] + x_0_im[3] + x_0_im[5];
+
+    acc_re[0] = x_0_re[6] + x_0_re[1];
+    acc_im[0] = x_0_im[6] + x_0_im[1];
+
+    acc_re[1] = x_0_re[6] - x_0_re[1];
+    acc_im[1] = x_0_im[6] - x_0_im[1];
+
+    output[0][i].re = acc_re[0];
+    output[0][i].im = acc_im[0];
+
+    output[1][i].re = acc_re[1];
+    output[1][i].im = acc_im[1];
   }
 }
 
@@ -173,17 +214,17 @@
                                    sizeof(ia_cmplx_flt_struct));
 }
 
-VOID ixheaacd_mps_qmf_hybrid_analysis(
+VOID ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
     ia_mps_hybrid_filt_struct *handle,
-    ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS_NEW],
+    ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS],
     WORD32 num_bands, WORD32 num_samples,
-    ia_cmplx_flt_struct hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]) {
+    ia_cmplx_flt_struct v[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]) {
   WORD32 lf_samples_shift;
   WORD32 hf_samples_shift;
   WORD32 lf_qmf_bands;
   WORD32 k, n;
 
-  ia_cmplx_w32_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS];
+  ia_cmplx_flt_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS];
 
   lf_samples_shift = BUFFER_LEN_LF_MPS - num_samples;
   hf_samples_shift = BUFFER_LEN_HF_MPS - num_samples;
@@ -191,33 +232,23 @@
   lf_qmf_bands = QMF_BANDS_TO_HYBRID;
 
   for (k = 0; k < lf_qmf_bands; k++) {
-    for (n = 0; n < lf_samples_shift; n++) {
-      handle->lf_buffer[k][n].re = handle->lf_buffer[k][n + num_samples].re;
-      handle->lf_buffer[k][n].im = handle->lf_buffer[k][n + num_samples].im;
-    }
+    memmove(&handle->lf_buffer[k][0].re, &handle->lf_buffer[k][num_samples].re,
+            2 * lf_samples_shift * sizeof(FLOAT32));
   }
 
   for (k = 0; k < lf_qmf_bands; k++) {
-    for (n = 0; n < num_samples; n++) {
-      handle->lf_buffer[k][n + lf_samples_shift].re = (WORD32)(in_qmf[n][k].re);
-      handle->lf_buffer[k][n + lf_samples_shift].im = (WORD32)(in_qmf[n][k].im);
-    }
+    memcpy(&handle->lf_buffer[k][lf_samples_shift].re, &in_qmf[k][0].re,
+           2 * num_samples * sizeof(FLOAT32));
+  }
+
+  for (k = 0; k < MAX_NUM_QMF_BANDS_SAC / 2 - lf_qmf_bands; k++) {
+    memmove(&handle->hf_buffer[k][0].re, &handle->hf_buffer[k][num_samples].re,
+            2 * hf_samples_shift * sizeof(FLOAT32));
   }
 
   for (k = 0; k < num_bands - lf_qmf_bands; k++) {
-    for (n = 0; n < hf_samples_shift; n++) {
-      handle->hf_buffer[k][n].re = handle->hf_buffer[k][n + num_samples].re;
-      handle->hf_buffer[k][n].im = handle->hf_buffer[k][n + num_samples].im;
-    }
-  }
-
-  for (k = 0; k < num_bands - lf_qmf_bands; k++) {
-    for (n = 0; n < num_samples; n++) {
-      handle->hf_buffer[k][n + hf_samples_shift].re =
-          (in_qmf[n][k + lf_qmf_bands].re);
-      handle->hf_buffer[k][n + hf_samples_shift].im =
-          (in_qmf[n][k + lf_qmf_bands].im);
-    }
+    memcpy(&handle->hf_buffer[k][hf_samples_shift].re,
+           &in_qmf[k + lf_qmf_bands][0].re, 2 * num_samples * sizeof(FLOAT32));
   }
 
   ixheaacd_mps_hyb_filt_type1(
@@ -226,15 +257,15 @@
 
   for (k = 0; k < 2; k++) {
     for (n = 0; n < num_samples; n++) {
-      hyb[n][k].re = (FLOAT32)scratch[k + 6][n].re;
-      hyb[n][k + 2].re = (FLOAT32)scratch[k][n].re;
-      hyb[n][k + 4].re = (FLOAT32)scratch[k + 2][n].re;
-      hyb[n][k + 4].re += (FLOAT32)scratch[5 - k][n].re;
+      v[n][k].re = scratch[k + 6][n].re;
+      v[n][k + 2].re = scratch[k][n].re;
+      v[n][k + 4].re = scratch[k + 2][n].re;
+      v[n][k + 4].re += scratch[5 - k][n].re;
 
-      hyb[n][k].im = (FLOAT32)scratch[k + 6][n].im;
-      hyb[n][k + 2].im = (FLOAT32)scratch[k][n].im;
-      hyb[n][k + 4].im = (FLOAT32)scratch[k + 2][n].im;
-      hyb[n][k + 4].im += (FLOAT32)scratch[5 - k][n].im;
+      v[n][k].im = scratch[k + 6][n].im;
+      v[n][k + 2].im = scratch[k][n].im;
+      v[n][k + 4].im = scratch[k + 2][n].im;
+      v[n][k + 4].im += scratch[5 - k][n].im;
     }
   }
 
@@ -244,8 +275,8 @@
 
   for (k = 0; k < 2; k++) {
     for (n = 0; n < num_samples; n++) {
-      hyb[n][k + 6].re = (FLOAT32)scratch[1 - k][n].re;
-      hyb[n][k + 6].im = (FLOAT32)scratch[1 - k][n].im;
+      v[n][k + 6].re = scratch[1 - k][n].re;
+      v[n][k + 6].im = scratch[1 - k][n].im;
     }
   }
 
@@ -255,19 +286,102 @@
 
   for (k = 0; k < 2; k++) {
     for (n = 0; n < num_samples; n++) {
-      hyb[n][k + 8].re = (FLOAT32)scratch[k][n].re;
-      hyb[n][k + 8].im = (FLOAT32)scratch[k][n].im;
+      v[n][k + 8].re = scratch[k][n].re;
+      v[n][k + 8].im = scratch[k][n].im;
     }
   }
 
   for (k = 0; k < num_bands - lf_qmf_bands; k++) {
     for (n = 0; n < num_samples; n++) {
-      hyb[n][k + 10].re = (handle->hf_buffer[k][n + hf_samples_shift].re);
-      hyb[n][k + 10].im = (handle->hf_buffer[k][n + hf_samples_shift].im);
+      v[n][k + 10].re = (handle->hf_buffer[k][n + hf_samples_shift].re);
+      v[n][k + 10].im = (handle->hf_buffer[k][n + hf_samples_shift].im);
     }
   }
 }
 
+VOID ixheaacd_mps_qmf_hybrid_analysis(
+    ia_mps_hybrid_filt_struct *handle,
+    ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS],
+    WORD32 num_bands, WORD32 num_samples,
+    ia_cmplx_flt_struct hyb[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]) {
+  WORD32 lf_samples_shift;
+  WORD32 hf_samples_shift;
+  WORD32 lf_qmf_bands;
+  WORD32 k, n;
+
+  ia_cmplx_flt_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS];
+
+  lf_samples_shift = BUFFER_LEN_LF_MPS - num_samples;
+  hf_samples_shift = BUFFER_LEN_HF_MPS - num_samples;
+
+  lf_qmf_bands = QMF_BANDS_TO_HYBRID;
+
+  for (k = 0; k < lf_qmf_bands; k++) {
+    memmove(&handle->lf_buffer[k][0].re, &handle->lf_buffer[k][num_samples].re,
+            2 * lf_samples_shift * sizeof(FLOAT32));
+  }
+
+  for (k = 0; k < lf_qmf_bands; k++) {
+    memcpy(&handle->lf_buffer[k][lf_samples_shift].re, &in_qmf[k][0].re,
+           2 * num_samples * sizeof(FLOAT32));
+  }
+
+  for (k = 0; k < MAX_NUM_QMF_BANDS_SAC / 2 - lf_qmf_bands; k++) {
+    memmove(&handle->hf_buffer[k][0].re, &handle->hf_buffer[k][num_samples].re,
+            2 * hf_samples_shift * sizeof(FLOAT32));
+  }
+
+  for (k = 0; k < num_bands - lf_qmf_bands; k++) {
+    memcpy(&handle->hf_buffer[k][hf_samples_shift].re,
+           &in_qmf[k + lf_qmf_bands][0].re, 2 * num_samples * sizeof(FLOAT32));
+  }
+
+  ixheaacd_mps_hyb_filt_type1(
+      &(handle->lf_buffer[0][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]),
+      scratch, num_samples, ixheaacd_ia_mps_hyb_filter_coeff_8);
+
+  for (k = 0; k < 2; k++) {
+    for (n = 0; n < num_samples; n++) {
+      hyb[k][n].re = scratch[k + 6][n].re;
+      hyb[k + 2][n].re = scratch[k][n].re;
+      hyb[k + 4][n].re = scratch[k + 2][n].re;
+      hyb[k + 4][n].re += scratch[5 - k][n].re;
+
+      hyb[k][n].im = scratch[k + 6][n].im;
+      hyb[k + 2][n].im = scratch[k][n].im;
+      hyb[k + 4][n].im = scratch[k + 2][n].im;
+      hyb[k + 4][n].im += scratch[5 - k][n].im;
+    }
+  }
+
+  ixheaacd_mps_hyb_filt_type2(
+      &(handle->lf_buffer[1][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]),
+      scratch, num_samples, ixheaacd_mps_hyb_filter_coeff_2);
+
+  for (k = 0; k < 2; k++) {
+    for (n = 0; n < num_samples; n++) {
+      hyb[k + 6][n].re = scratch[1 - k][n].re;
+      hyb[k + 6][n].im = scratch[1 - k][n].im;
+    }
+  }
+
+  ixheaacd_mps_hyb_filt_type2(
+      &(handle->lf_buffer[2][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]),
+      scratch, num_samples, ixheaacd_mps_hyb_filter_coeff_2);
+
+  for (k = 0; k < 2; k++) {
+    for (n = 0; n < num_samples; n++) {
+      hyb[k + 8][n].re = scratch[k][n].re;
+      hyb[k + 8][n].im = scratch[k][n].im;
+    }
+  }
+
+  for (k = 0; k < num_bands - lf_qmf_bands; k++) {
+    memcpy(&hyb[k + 10][0].re, &handle->hf_buffer[k][hf_samples_shift].re,
+           2 * num_samples * sizeof(FLOAT32));
+  }
+}
+
 VOID ixheaacd_mps_qmf_hybrid_synthesis(
     ia_cmplx_flt_struct hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
     WORD32 num_bands, WORD32 num_samples,
@@ -289,9 +403,7 @@
     in_qmf[n][2].re = hyb[n][8].re + hyb[n][9].re;
     in_qmf[n][2].im = hyb[n][8].im + hyb[n][9].im;
 
-    for (k = 3; k < num_bands; k++) {
-      in_qmf[n][k].re = hyb[n][k - 3 + 10].re;
-      in_qmf[n][k].im = hyb[n][k - 3 + 10].im;
-    }
+    memcpy(&in_qmf[n][3].re, &hyb[n][10].re,
+           2 * (num_bands - 3) * sizeof(FLOAT32));
   }
 }
diff --git a/decoder/ixheaacd_mps_parse.c b/decoder/ixheaacd_mps_parse.c
index 81a8592..ca5cbcb 100644
--- a/decoder/ixheaacd_mps_parse.c
+++ b/decoder/ixheaacd_mps_parse.c
@@ -107,8 +107,8 @@
     1264972288, 1370386688, 1475800960, 1581215360};
 static const int ixheaacd_smoothing_time_table[] = {64, 128, 256, 512};
 
-static const int ixheaacd_inverse_smoothing_time_table_q30[] = {
-    16777216, 8388608, 4194304, 2097152};
+static const FLOAT32 ixheaacd_inverse_smoothing_time_table[] = {
+    1.0f / 64.0f, 1.0f / 128.0f, 1.0f / 256.0f, 1.0f / 512.0f};
 
 static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
   var = min(var, upper_bound);
@@ -878,7 +878,7 @@
     switch (frame->bs_smooth_mode[ps]) {
       case 0:
         self->smoothing_time[ps] = 256;
-        self->inv_smoothing_time[ps] = 4194304;
+        self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f);
 
         for (pb = 0; pb < self->bs_param_bands; pb++) {
           self->smoothing_data[ps][pb] = 0;
@@ -908,8 +908,7 @@
         self->smoothing_time[ps] =
             ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
         self->inv_smoothing_time[ps] =
-            ixheaacd_inverse_smoothing_time_table_q30[frame
-                                                          ->bs_smooth_time[ps]];
+            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
         for (pb = 0; pb < self->bs_param_bands; pb++) {
           self->smoothing_data[ps][pb] = 1;
         }
@@ -919,8 +918,7 @@
         self->smoothing_time[ps] =
             ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
         self->inv_smoothing_time[ps] =
-            ixheaacd_inverse_smoothing_time_table_q30[frame
-                                                          ->bs_smooth_time[ps]];
+            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
 
         ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]];
         data_bands = (self->bs_param_bands - 1) / ch_fac + 1;
@@ -994,10 +992,9 @@
 
 WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) {
   self->time_slots = self->frame_length;
-  self->frame_len = self->time_slots * self->qmf_band_count;
   self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res];
 
-  self->hyb_band_count = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
+  self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
 
   switch (self->bs_param_bands) {
     case 4:
diff --git a/decoder/ixheaacd_mps_poly_filt.c b/decoder/ixheaacd_mps_poly_filt.c
index 315f0c7..7118538 100644
--- a/decoder/ixheaacd_mps_poly_filt.c
+++ b/decoder/ixheaacd_mps_poly_filt.c
@@ -32,22 +32,10 @@
 #include "ixheaacd_basic_ops32.h"
 #include "ixheaacd_function_selector.h"
 
-extern const WORD32
-    ixheaacd_mps_polyphase_filter_coeff_fix[10 * MAX_NUM_QMF_BANDS_SAC / 2];
-extern const WORD32 ixheaacd_mps_pre_re[64];
-extern const WORD32 ixheaacd_mps_pre_im[64];
-extern const WORD32 ixheaacd_mps_post_re[128];
-extern const WORD32 ixheaacd_mps_post_im[128];
-
-static PLATFORM_INLINE WORD32 ixheaacd_mult32(WORD32 a, WORD32 b) {
-  WORD32 result;
-  WORD64 temp_result;
-
-  temp_result = (WORD64)a * (WORD64)b;
-  result = (WORD32)(temp_result >> 31);
-
-  return (result);
-}
+extern const FLOAT32
+    ixheaacd_mps_polyphase_filter_coeff[10 * MAX_NUM_QMF_BANDS_SAC / 2];
+extern const FLOAT32 ixheaacd_mps_post_twid[30];
+extern const FLOAT32 ixheaacd_mps_pre_twid[64];
 
 VOID ixheaacd_mps_synt_create(ia_mps_poly_phase_struct *kernel,
                               WORD32 resolution) {
@@ -55,65 +43,14 @@
 }
 
 VOID ixheaacd_mps_synt_init(ia_mps_poly_phase_synth_struct *self) {
-  memset(self->state, 0, sizeof(WORD32) * 64 * 20);
+  memset(self->state, 0, sizeof(FLOAT32) * POLY_PHASE_SYNTH_SIZE);
 }
 
-static VOID ixheaacd_float_to_int32(FLOAT32 *in, WORD32 *out, WORD32 q_factor,
-                                    WORD32 sample) {
-  WORD32 loop;
-  UWORD32 temp = (1 << q_factor);
-
-  for (loop = 0; loop < sample; loop++) out[loop] = (WORD32)(in[loop] * temp);
-}
-
-VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re,
-                                       const WORD32 *table_im,
-                                       WORD32 resolution) {
-  WORD32 tmp, k;
-  for (k = 0; k < 2 * resolution; k += 2) {
-    tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_in[k], table_re[k >> 1]),
-                             ixheaacd_mult32(ptr_in[k + 1], table_im[k >> 1]));
-    ptr_in[k + 1] = ixheaacd_add32_sat(
-        ixheaacd_mult32(ixheaacd_negate32_sat(ptr_in[k]), table_im[k >> 1]),
-        ixheaacd_mult32(ptr_in[k + 1], table_re[k >> 1]));
-
-    ptr_in[k] = tmp;
-  }
-}
-
-VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re,
-                                        const WORD32 *table_im,
-                                        WORD32 resolution) {
-  WORD32 tmp, k;
-  for (k = 0; k < 2 * resolution; k += 2) {
-    tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_in[k], table_re[k]),
-                             ixheaacd_mult32(ptr_in[k + 1], table_im[k]));
-
-    ptr_in[k + 1] = ixheaacd_add32_sat(
-        ixheaacd_mult32(ixheaacd_negate32_sat(ptr_in[k]), table_im[k]),
-        ixheaacd_mult32(ptr_in[k + 1], table_re[k]));
-
-    ptr_in[k] = tmp;
-  }
-}
-
-VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, WORD32 *fin_re,
-                                            WORD32 *fin_im,
-                                            const WORD32 *table_re,
-                                            const WORD32 *table_im,
-                                            WORD32 *state) {
-  WORD32 l;
-  for (l = 0; l < 2 * resolution; l++) {
-    state[2 * resolution - l - 1] =
-        ixheaacd_add32_sat(ixheaacd_mult32(fin_re[l], table_re[l]),
-                           ixheaacd_mult32(fin_im[l], table_im[l]));
-  }
-}
-
-VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, WORD32 *out,
-                                    WORD32 *state, const WORD32 *filter_coeff) {
+VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, FLOAT32 *out,
+                                    FLOAT32 *state,
+                                    const FLOAT32 *filter_coeff) {
   WORD32 l, k;
-  WORD32 *out1, *out2, *state1, *state2;
+  FLOAT32 *out1, *out2, *state1, *state2;
   out1 = out;
   out2 = out + resolution;
   state1 = state;
@@ -121,8 +58,8 @@
 
   for (k = 0; k < 5; k++) {
     for (l = 0; l < resolution; l++) {
-      *out1++ = (WORD32)(((WORD64)(*state1++) * (*filter_coeff++)) >> 31);
-      *out2++ = (WORD32)(((WORD64)(*state2++) * (*filter_coeff++)) >> 31);
+      *out1++ = (*state1++) * (*filter_coeff++);
+      *out2++ = (*state2++) * (*filter_coeff++);
     }
     out1 += resolution;
     out2 += resolution;
@@ -131,64 +68,163 @@
   }
 }
 
+VOID ixheaacd_mps_synth_pre_twidle(FLOAT32 *out_re, FLOAT32 *out_im,
+                                   FLOAT32 *c_in, WORD32 len) {
+  WORD32 i;
+  FLOAT32 *c_s = c_in;
+  FLOAT32 *p_re_s = out_re;
+  FLOAT32 *p_im_s = out_im;
+  FLOAT32 *c_e = c_in + (len << 1) - 1;
+  FLOAT32 *p_im_e = out_im + len - 1;
+  FLOAT32 *p_re_e = out_re + len - 1;
+  const FLOAT32 *prtw = ixheaacd_mps_pre_twid;
+
+  for (i = 0; i < len; i += 4) {
+    *p_re_s = ((*c_s++) * (*prtw));
+    p_re_s++;
+    *p_im_s = -((*c_s--) * (*prtw));
+    p_im_s++;
+    *p_im_s = ((*c_e--) * (*prtw));
+    p_im_s--;
+    *p_re_s = ((*c_e++) * (*prtw++));
+    p_re_s--;
+    *p_im_s += ((*c_e--) * (*prtw));
+    p_im_s++;
+    *p_re_s += ((*c_e--) * (*prtw));
+    p_re_s++;
+    *p_re_s -= ((*c_s++) * (*prtw));
+    p_re_s++;
+    *p_im_s += ((*c_s++) * (*prtw++));
+    p_im_s++;
+    *p_im_e = ((*c_e--) * (*prtw));
+    p_im_e--;
+    *p_re_e = -((*c_e++) * (*prtw));
+    p_re_e--;
+    *p_re_e = ((*c_s++) * (*prtw));
+    p_re_e++;
+    *p_im_e = ((*c_s--) * (*prtw++));
+    p_im_e++;
+    *p_re_e += ((*c_s++) * (*prtw));
+    p_re_e--;
+    *p_im_e += ((*c_s++) * (*prtw));
+    p_im_e--;
+    *p_im_e -= ((*c_e--) * (*prtw));
+    p_im_e--;
+    *p_re_e += ((*c_e--) * (*prtw++));
+    p_re_e--;
+  }
+}
+
+VOID ixheaacd_mps_synth_post_twidle(FLOAT32 *state, FLOAT32 *out_re,
+                                    FLOAT32 *out_im, WORD32 len) {
+  WORD32 i;
+  {
+    FLOAT32 x_0, x_1, x_2, x_3;
+    FLOAT32 *p_re_e, *p_im_e;
+    const FLOAT32 *potw = ixheaacd_mps_post_twid;
+    FLOAT32 *p_re_s = out_re;
+    FLOAT32 *p_im_s = out_im;
+
+    p_re_e = p_re_s + (len - 2);
+    p_im_e = p_im_s + (len - 2);
+    x_0 = *p_re_e;
+    x_1 = *(p_re_e + 1);
+    x_2 = *p_im_e;
+    x_3 = *(p_im_e + 1);
+
+    *(p_re_e + 1) = -*(p_re_s + 1);
+    *(p_im_e + 1) = -*p_im_s;
+    *p_im_s = *(p_im_s + 1);
+
+    for (i = 5; i < len; i += 4) {
+      FLOAT32 twdr = *potw++;
+      FLOAT32 twdi = *potw++;
+      FLOAT32 tmp;
+
+      *p_re_e = (x_0 * twdi);
+      *p_re_e += (x_1 * twdr);
+      p_re_e--;
+      p_re_s++;
+      *p_re_s = (x_0 * twdr);
+      *p_re_s -= (x_1 * twdi);
+      p_re_s++;
+      x_1 = *p_re_e--;
+      x_0 = *p_re_e++;
+      *p_re_e = (*p_re_s++ * twdi);
+      *p_re_e += -(*p_re_s * twdr);
+      p_re_e--;
+      tmp = (*p_re_s-- * twdi);
+      *p_re_s = tmp + (*p_re_s * twdr);
+
+      *p_im_e = -(x_2 * twdr);
+      *p_im_e += (x_3 * twdi);
+      p_im_e--;
+      p_im_s++;
+      *p_im_s = -(x_2 * twdi);
+      *p_im_s -= (x_3 * twdr);
+      p_im_s++;
+      x_3 = *p_im_e--;
+      x_2 = *p_im_e++;
+      *p_im_e = -(*p_im_s++ * twdr);
+      *p_im_e -= (*p_im_s * twdi);
+      p_im_e--;
+      tmp = (*p_im_s-- * twdr);
+      *p_im_s = tmp - (*p_im_s * twdi);
+    }
+
+    *p_re_e = 0.7071067f * (x_1 + x_0);
+    *p_im_e = 0.7071067f * (x_3 - x_2);
+    *(p_re_s + 1) = -0.7071067f * (x_1 - x_0);
+    *(p_im_s + 1) = -0.7071067f * (x_3 + x_2);
+  }
+
+  for (i = 0; i < len; i++) {
+    state[i] = out_im[i] - out_re[i];
+    state[len + i] = out_im[len - i - 1] + out_re[len - i - 1];
+    state[len - i - 1] = out_im[len - i - 1] - out_re[len - i - 1];
+    state[2 * len - i - 1] = out_im[i] + out_re[i];
+  }
+}
+
 VOID ixheaacd_mps_synt_calc(ia_mps_dec_state_struct *self) {
   WORD32 k, l, ts, ch;
-  WORD64 acc;
-  WORD32 ptr_in[128];
-  WORD32 fin_re[128];
-  WORD32 fin_im[128];
-  FLOAT32 temp;
-  WORD32 *state, *tmp_state, *out;
-  const WORD32 *filt_coeff;
-  WORD32 *tmp_buf = self->tmp_buf;
+  FLOAT32 *state, *tmp_state, *out;
+  const FLOAT32 *filt_coeff;
+  FLOAT32 *tmp_buf = self->tmp_buf;
+  FLOAT32 fin_re[64] = {0};
+  FLOAT32 fin_im[64] = {0};
 
   ia_mps_poly_phase_struct kernel = self->poly_phase_filt_kernel;
   WORD32 resolution = kernel.resolution;
+  WORD32 m_resolution = resolution >> 1;
   for (ch = 0; ch < self->out_ch_count; ch++) {
     tmp_state = (&self->qmf_filt_state[ch])->state;
     state = &tmp_buf[self->time_slots * 2 * resolution];
-    memcpy(state, tmp_state, sizeof(WORD32) * 20 * resolution);
+    memcpy(state, tmp_state, sizeof(FLOAT32) * 18 * resolution);
     out = &tmp_buf[74 * MAX_NUM_QMF_BANDS_SAC];
 
     for (ts = 0; ts < self->time_slots; ts++) {
-      ixheaacd_float_to_int32(&self->qmf_out_dir[ch][ts][0].re, ptr_in, 10,
-                              resolution * 2);
-
-      filt_coeff = ixheaacd_mps_polyphase_filter_coeff_fix;
+      filt_coeff = ixheaacd_mps_polyphase_filter_coeff;
 
       state -= (2 * resolution);
-      (*ixheaacd_mps_synt_pre_twiddle)(ptr_in, ixheaacd_mps_pre_re,
-                                       ixheaacd_mps_pre_im, resolution);
 
-      (*ixheaacd_mps_complex_fft_64)(ptr_in, fin_re, fin_im, resolution);
+      ixheaacd_mps_synth_pre_twidle(
+          fin_re, fin_im, &self->qmf_out_dir[ch][ts][0].re, resolution);
 
-      (*ixheaacd_mps_synt_post_twiddle)(ptr_in, ixheaacd_mps_post_re,
-                                        ixheaacd_mps_post_im, resolution);
+      ixheaacd_mps_synth_calc_fft(fin_re, fin_im, m_resolution);
 
-      (*ixheaacd_mps_complex_fft_64)(ptr_in, &fin_re[1], &fin_im[1],
-                                     resolution);
+      ixheaacd_mps_synth_post_twidle(state, fin_re, fin_im, resolution);
 
-      (*ixheaacd_mps_synt_post_fft_twiddle)(resolution, fin_re, fin_im,
-                                            ixheaacd_mps_post_re,
-                                            ixheaacd_mps_post_im, state);
       (*ixheaacd_mps_synt_out_calc)(resolution, out, state, filt_coeff);
 
       for (k = 0; k < resolution; k++) {
-        acc = 0;
-        for (l = 0; l < 10; l++) {
-          acc = acc + out[resolution * l + k];
+        FLOAT32 acc = out[k];
+        for (l = 1; l < 10; l++) {
+          acc += out[resolution * l + k];
         }
-        if (acc >= 2147483647)
-          temp = 1.0;
-        else if (acc <= -2147483647 - 1)
-          temp = -1.0f;
-        else
-          temp = (FLOAT32)((WORD32)acc) / ((FLOAT32)(1 << 10));
-
-        self->output_buffer[ch][self->qmf_band_count * ts + k] = (FLOAT32)temp;
+        self->output_buffer[ch][self->qmf_band_count * ts + k] = acc;
       }
     }
-
-    memcpy(tmp_state, state, sizeof(WORD32) * 20 * resolution);
+    memcpy(tmp_state, state, sizeof(FLOAT32) * 18 * resolution);
   }
 }
diff --git a/decoder/ixheaacd_mps_polyphase.h b/decoder/ixheaacd_mps_polyphase.h
index dcc6f10..79e2c8e 100644
--- a/decoder/ixheaacd_mps_polyphase.h
+++ b/decoder/ixheaacd_mps_polyphase.h
@@ -21,9 +21,10 @@
 #define IXHEAACD_MPS_POLYPHASE_H
 
 #define MAX_NUM_QMF_BANDS_SAC (128)
+#define POLY_PHASE_SYNTH_SIZE (1152)
 
 typedef struct ia_mps_poly_phase_synth_struct {
-  WORD32 state[1280];
+  FLOAT32 state[POLY_PHASE_SYNTH_SIZE];
 } ia_mps_poly_phase_synth_struct;
 
 typedef struct ia_mps_poly_phase_struct {
diff --git a/decoder/ixheaacd_mps_pre_mix.c b/decoder/ixheaacd_mps_pre_mix.c
index c490e78..3d7a5cf 100644
--- a/decoder/ixheaacd_mps_pre_mix.c
+++ b/decoder/ixheaacd_mps_pre_mix.c
@@ -47,22 +47,21 @@
 #define PI_Q28 (843314856)
 #define PI_Q27 (421657428)
 #define PI_BY_8_Q28 (105414352)
+#define P_PI 3.1415926535897932
+#define PI_IN_Q28 843314880
 
-extern const WORD32 ixheaacd_im_weight_Q28[16][8][31];
-extern const WORD32 ixheaacd_re_weight_Q28[16][8][31];
-extern const WORD32 ixheaacd_beta_Q28[16][8][31];
-extern const WORD32 ixheaacd_weight_Q28[16][8][31];
-extern const WORD32 ixheaacd_c_l_table_Q31[31];
-extern const WORD32 ixheaacd_sin_table_Q31[8][31];
-extern const WORD32 ixheaacd_cos_table_Q31[8][31];
 extern const WORD32 ixheaacd_atan_table_Q28[16][8][31];
 extern const WORD32 ixheaacd_ipd_de_quant_table_q28[16];
 
-#define P_PI 3.1415926535897932
-#define PI_IN_Q28 843314880
+extern const FLOAT32 ixheaacd_im_weight[16][8][31];
+extern const FLOAT32 ixheaacd_re_weight[16][8][31];
+extern const FLOAT32 ixheaacd_beta[16][8][31];
+extern const FLOAT32 ixheaacd_weight[16][8][31];
+extern const FLOAT32 ixheaacd_c_l_table[31];
+extern const FLOAT32 ixheaacd_sin_table[8][31];
+extern const FLOAT32 ixheaacd_cos_table[8][31];
 
-#define P_PI 3.1415926535897932
-#define PI_IN_Q28 843314880
+extern const WORD32 ixheaacd_mps_gain_set_indx[29];
 
 static WORD32 ixheaacd_mps_phase_wraping(WORD32 phase) {
   const WORD32 pi_2 = 2 * PI_IN_Q28;
@@ -116,17 +115,17 @@
 VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self) {
   WORD32 ps, pb;
   ia_mps_bs_frame *curr_bit_stream = &(self->bs_frame);
-  WORD32 h_imag[2 * MAX_PARAMETER_BANDS];
-  WORD32
-  h_real[6 * MAX_PARAMETER_BANDS];
+  FLOAT32 h_imag[2 * MAX_PARAMETER_BANDS];
+  FLOAT32 h_real[6 * MAX_PARAMETER_BANDS];
 
   ixheaacd_mps_buffer_pre_and_mix_matrix(self);
 
   for (ps = 0; ps < self->num_parameter_sets; ps++) {
-    WORD32 *h_im = &h_imag[0];
-    WORD32 *h_re = &h_real[0];
-    memset(h_real, 0, 6 * MAX_PARAMETER_BANDS * sizeof(WORD32));
-    memset(h_imag, 0, 2 * MAX_PARAMETER_BANDS * sizeof(WORD32));
+    FLOAT32 *h_im = &h_imag[0];
+    FLOAT32 *h_re = &h_real[0];
+
+    memset(h_real, 0, 6 * MAX_PARAMETER_BANDS * sizeof(FLOAT32));
+    memset(h_imag, 0, 2 * MAX_PARAMETER_BANDS * sizeof(FLOAT32));
 
     switch (self->config->bs_phase_coding) {
       case 0:
@@ -148,8 +147,8 @@
     }
 
     for (pb = 0; pb < self->bs_param_bands; pb++) {
-      self->m1_param_re[ps][pb][0][0] = 1073741824;
-      self->m1_param_re[ps][pb][1][0] = 1073741824;
+      self->m1_param_re[ps][pb][0][0] = 1.0f;
+      self->m1_param_re[ps][pb][1][0] = 1.0f;
 
       self->m1_param_im[ps][pb][0][0] = 0;
       self->m1_param_im[ps][pb][1][0] = 0;
@@ -177,21 +176,15 @@
     }
   }
   ixheaacd_mps_smoothing_opd(self);
-
-  ixheaacd_fix_to_float_int(&self->phase_l_fix[0][0], &self->phase_l[0][0],
-                            MAX_PARAMETER_SETS_MPS * MAX_PARAMETER_BANDS,
-                            268435456.0f);
-  ixheaacd_fix_to_float_int(&self->phase_r_fix[0][0], &self->phase_r[0][0],
-                            MAX_PARAMETER_SETS_MPS * MAX_PARAMETER_BANDS,
-                            268435456.0f);
 }
 
 static VOID ixheaacd_mps_par2umx_ps_core(WORD32 cld[MAX_PARAMETER_BANDS],
                                          WORD32 icc[MAX_PARAMETER_BANDS],
                                          WORD32 ott_band_count,
-                                         WORD32 *h_real) {
+                                         FLOAT32 *h_real) {
   WORD32 band;
-  WORD32 c_l_temp, c_r_temp, cld_idx, icc_idx, temp;
+  FLOAT32 c_l_temp, c_r_temp, temp;
+  WORD32 cld_idx, icc_idx;
 
   for (band = 0; band < ott_band_count; band++) {
     cld_idx = *cld++ + 15;
@@ -199,27 +192,27 @@
 
     icc_idx = icc_idx & 7;
 
-    c_l_temp = (ixheaacd_c_l_table_Q31[cld_idx]);
-    c_r_temp = (ixheaacd_c_l_table_Q31[30 - cld_idx]);
+    c_l_temp = (ixheaacd_c_l_table[cld_idx]);
+    c_r_temp = (ixheaacd_c_l_table[30 - cld_idx]);
+#define MULT(a, b) (a * b)
+    temp = ixheaacd_cos_table[icc_idx][cld_idx];
+    *h_real++ = MULT(temp, c_l_temp);
 
-    temp = ixheaacd_cos_table_Q31[icc_idx][cld_idx];
-    *h_real++ = ixheaacd_mult32(temp, c_l_temp) >> 2;
+    temp = ixheaacd_cos_table[icc_idx][30 - cld_idx];
+    *h_real++ = MULT(temp, c_r_temp);
 
-    temp = ixheaacd_cos_table_Q31[icc_idx][30 - cld_idx];
-    *h_real++ = ixheaacd_mult32(temp, c_r_temp) >> 2;
+    temp = ixheaacd_sin_table[icc_idx][cld_idx];
+    *h_real++ = MULT(temp, c_l_temp);
 
-    temp = ixheaacd_sin_table_Q31[icc_idx][cld_idx];
-    *h_real++ = ixheaacd_mult32(temp, c_l_temp) >> 2;
-
-    temp = -ixheaacd_sin_table_Q31[icc_idx][30 - cld_idx];
-    *h_real++ = ixheaacd_mult32(temp, c_r_temp) >> 2;
+    temp = -ixheaacd_sin_table[icc_idx][30 - cld_idx];
+    *h_real++ = MULT(temp, c_r_temp);
 
     h_real += 2;
   }
 }
 
 VOID ixheaacd_mps_par2umx_ps(ia_mps_dec_state_struct *self,
-                             ia_mps_bs_frame *curr_bit_stream, WORD32 *h_real,
+                             ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_real,
                              WORD32 param_set_idx) {
   ixheaacd_mps_par2umx_ps_core(curr_bit_stream->cld_idx[param_set_idx],
                                curr_bit_stream->icc_idx[param_set_idx],
@@ -246,7 +239,7 @@
 
 VOID ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct *self,
                                      ia_mps_bs_frame *curr_bit_stream,
-                                     WORD32 *h_real, WORD32 param_set_idx) {
+                                     FLOAT32 *h_real, WORD32 param_set_idx) {
   WORD32 opd[MAX_PARAMETER_BANDS];
   WORD32 ott_band_count = self->bs_param_bands;
   WORD32 num_bands_ipd = self->num_bands_ipd;
@@ -263,25 +256,27 @@
       WORD32 ipd_idx = curr_bit_stream->ipd_idx[param_set_idx][band] & 15;
       WORD32 ipd = ixheaacd_ipd_de_quant_table_q28[ipd_idx];
 
-      self->phase_l_fix[param_set_idx][band] =
-          ixheaacd_mps_phase_wraping(opd[band]);
-      self->phase_r_fix[param_set_idx][band] =
-          ixheaacd_mps_phase_wraping(opd[band] - ipd);
+#define Q28_FLOAT_VAL ((float)(1 << 28))
+#define ONE_BY_Q28_FLOAT_VAL (1.0f / Q28_FLOAT_VAL)
+      self->phase_l[param_set_idx][band] =
+          ixheaacd_mps_phase_wraping(opd[band]) * ONE_BY_Q28_FLOAT_VAL;
+      self->phase_r[param_set_idx][band] =
+          ixheaacd_mps_phase_wraping(opd[band] - ipd) * ONE_BY_Q28_FLOAT_VAL;
     }
   } else {
     num_bands_ipd = 0;
   }
 
   for (band = num_bands_ipd; band < ott_band_count; band++) {
-    self->phase_l_fix[param_set_idx][band] = 0;
-    self->phase_r_fix[param_set_idx][band] = 0;
+    self->phase_l[param_set_idx][band] = 0;
+    self->phase_r[param_set_idx][band] = 0;
   }
 }
 
 VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self,
-                               ia_mps_bs_frame *curr_bit_stream, WORD32 *h_imag,
-                               WORD32 *h_real, WORD32 param_set_idx,
-                               WORD32 res_bands) {
+                               ia_mps_bs_frame *curr_bit_stream,
+                               FLOAT32 *h_imag, FLOAT32 *h_real,
+                               WORD32 param_set_idx, WORD32 res_bands) {
   WORD32 band;
 
   for (band = 0; band < self->bs_param_bands; band++) {
@@ -291,7 +286,7 @@
 
     if ((band < self->num_bands_ipd) && (cld_idx == 15) && (icc_idx == 0) &&
         (ipd_idx == 8)) {
-      WORD32 gain = 111848107;
+      FLOAT32 gain = 0.416666667f;
       *h_imag++ = 0;
       *h_imag++ = 0;
 
@@ -309,34 +304,34 @@
         h_real += 4;
       }
     } else {
-      WORD32 weight_fix, re_weight_fix, im_weight_fix;
+      FLOAT32 weight, re_weight, im_weight;
 
-      weight_fix = ixheaacd_weight_Q28[ipd_idx][icc_idx][cld_idx];
-      re_weight_fix = ixheaacd_re_weight_Q28[ipd_idx][icc_idx][cld_idx];
-      im_weight_fix = ixheaacd_im_weight_Q28[ipd_idx][icc_idx][cld_idx];
+      weight = ixheaacd_weight[ipd_idx][icc_idx][cld_idx];
+      re_weight = ixheaacd_re_weight[ipd_idx][icc_idx][cld_idx];
+      im_weight = ixheaacd_im_weight[ipd_idx][icc_idx][cld_idx];
 
       if (band < self->num_bands_ipd) {
-        weight_fix = ixheaacd_weight_Q28[ipd_idx][icc_idx][cld_idx];
-        re_weight_fix = ixheaacd_re_weight_Q28[ipd_idx][icc_idx][cld_idx];
-        im_weight_fix = ixheaacd_im_weight_Q28[ipd_idx][icc_idx][cld_idx];
+        weight = ixheaacd_weight[ipd_idx][icc_idx][cld_idx];
+        re_weight = ixheaacd_re_weight[ipd_idx][icc_idx][cld_idx];
+        im_weight = ixheaacd_im_weight[ipd_idx][icc_idx][cld_idx];
       } else {
-        weight_fix = ixheaacd_weight_Q28[0][icc_idx][cld_idx];
-        re_weight_fix = ixheaacd_re_weight_Q28[0][icc_idx][cld_idx];
-        im_weight_fix = ixheaacd_im_weight_Q28[0][icc_idx][cld_idx];
+        weight = ixheaacd_weight[0][icc_idx][cld_idx];
+        re_weight = ixheaacd_re_weight[0][icc_idx][cld_idx];
+        im_weight = ixheaacd_im_weight[0][icc_idx][cld_idx];
       }
 
-      *h_real++ = weight_fix - re_weight_fix;
-      *h_imag++ = -im_weight_fix;
-      *h_real++ = weight_fix + re_weight_fix;
-      *h_imag++ = im_weight_fix;
+      *h_real++ = weight - re_weight;  // h_real[0] = weight - re_weight
+      *h_imag++ = -im_weight;
+      *h_real++ = weight + re_weight;
+      *h_imag++ = im_weight;
 
       if (band < res_bands) {
         h_real += 2;
 
-        *h_real++ = weight_fix;
-        *h_real++ = -weight_fix;
+        *h_real++ = weight;
+        *h_real++ = -weight;
       } else {
-        WORD32 beta = ixheaacd_beta_Q28[ipd_idx][icc_idx][cld_idx];
+        FLOAT32 beta = ixheaacd_beta[ipd_idx][icc_idx][cld_idx];
 
         *h_real++ = beta;
         *h_real++ = -beta;
@@ -347,122 +342,121 @@
 }
 
 WORD32 ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self) {
-  WORD32 ts, qs, row, col = 0;
+  WORD32 ts, qs, row;
   WORD32 err = 0;
-  err = ixheaacd_mps_upmix_interp(
-      self->m1_param_re, self->r_out_re_scratch_m1, self->m1_param_re_prev,
-      (self->dir_sig_count + self->decor_sig_count), 1, self);
-  if (err < 0) return err;
-  err = ixheaacd_mps_upmix_interp(
-      self->m1_param_im, self->r_out_im_scratch_m1, self->m1_param_im_prev,
-      (self->dir_sig_count + self->decor_sig_count), 1, self);
-  if (err < 0) return err;
+  if (self->pre_mix_req) {
+    err = ixheaacd_mps_upmix_interp_type1(
+        self->m1_param_re, self->r_out_re_in_m1, self->m1_param_re_prev,
+        (self->dir_sig_count + self->decor_sig_count), 1, self,
+        self->bs_high_rate_mode);
+    if (err < 0) return err;
 
-  ixheaacd_fix_to_float_int(
-      (WORD32 *)(self->r_out_re_scratch_m1), (FLOAT32 *)(self->r_out_re_in_m1),
-      MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-      1073741824);
-  ixheaacd_fix_to_float_int(
-      (WORD32 *)self->r_out_im_scratch_m1, (FLOAT32 *)self->r_out_im_in_m1,
-      MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-      1073741824);
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < 2; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
 
-  for (ts = 0; ts < self->time_slots; ts++) {
-    for (qs = 0; qs < 2; qs++) {
-      WORD32 sign = -1;
-      WORD32 indx = self->hyb_band_to_processing_band_table[qs];
-      for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
-           row++) {
-        FLOAT32 sum_real = 0.0f;
-        FLOAT32 sum_imag = 0.0f;
-
-        {
-          FLOAT32 real = self->hyb_in[0][ts][qs].re *
-                             self->r_out_re_in_m1[ts][indx][row][col] -
-                         self->hyb_in[0][ts][qs].im *
-                             self->r_out_im_in_m1[ts][indx][row][col] * sign;
-          FLOAT32 imag = self->hyb_in[0][ts][qs].re *
-                             self->r_out_im_in_m1[ts][indx][row][col] * sign +
-                         self->hyb_in[0][ts][qs].im *
-                             self->r_out_re_in_m1[ts][indx][row][col];
-          sum_real += real;
-          sum_imag += imag;
+        FLOAT32 real =
+            self->hyb_in[0][qs][ts].re * self->r_out_re_in_m1[ts][indx][0][0];
+        FLOAT32 imag =
+            self->hyb_in[0][qs][ts].im * self->r_out_re_in_m1[ts][indx][0][0];
+        for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
+             row++) {
+          self->v[row][ts][qs].re = real;
+          self->v[row][ts][qs].im = imag;
         }
-        self->v[row][ts][qs].re = sum_real;
-        self->v[row][ts][qs].im = sum_imag;
+      }
+      for (qs = 2; qs < self->hyb_band_count[0]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        FLOAT32 real =
+            self->hyb_in[0][qs][ts].re * self->r_out_re_in_m1[ts][indx][0][0];
+        FLOAT32 imag =
+            self->hyb_in[0][qs][ts].im * self->r_out_re_in_m1[ts][indx][0][0];
+        for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
+             row++) {
+          self->v[row][ts][qs].re = real;
+          self->v[row][ts][qs].im = imag;
+        }
       }
     }
-    for (qs = 2; qs < self->hyb_band_count; qs++) {
-      WORD32 sign = 1;
-      WORD32 indx = self->hyb_band_to_processing_band_table[qs];
-      for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
-           row++) {
-        FLOAT32 sum_real = 0.0f;
-        FLOAT32 sum_imag = 0.0f;
-
-        {
-          FLOAT32 real = self->hyb_in[0][ts][qs].re *
-                             self->r_out_re_in_m1[ts][indx][row][col] -
-                         self->hyb_in[0][ts][qs].im *
-                             self->r_out_im_in_m1[ts][indx][row][col] * sign;
-          FLOAT32 imag = self->hyb_in[0][ts][qs].re *
-                             self->r_out_im_in_m1[ts][indx][row][col] * sign +
-                         self->hyb_in[0][ts][qs].im *
-                             self->r_out_re_in_m1[ts][indx][row][col];
-          sum_real += real;
-          sum_imag += imag;
+  } else {
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < self->hyb_band_count[0]; qs++) {
+        FLOAT32 real = self->hyb_in[0][qs][ts].re;
+        FLOAT32 imag = self->hyb_in[0][qs][ts].im;
+        for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
+             row++) {
+          self->v[row][ts][qs].re = real;
+          self->v[row][ts][qs].im = imag;
         }
-        self->v[row][ts][qs].re = sum_real;
-        self->v[row][ts][qs].im = sum_imag;
       }
     }
   }
   return 0;
 }
 
-WORD32 ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self) {
+WORD32 ixheaacd_mps_apply_mix_matrix_type1(ia_mps_dec_state_struct *self) {
+  WORD32 ts, qs, row;
+  WORD32 err = 0;
+
+  err = ixheaacd_mps_upmix_interp_type2(
+      self->m2_decor_re, self->r_out_diff_re_in_m2, self->m2_decor_re_prev,
+      self->out_ch_count, self, 1);
+  if (err < 0) return err;
+
+  err = ixheaacd_mps_upmix_interp_type2(self->m2_resid_re, self->r_out_re_in_m2,
+                                        self->m2_resid_re_prev,
+                                        self->out_ch_count, self, 0);
+  if (err < 0) return err;
+
+  for (qs = 0; qs < self->hyb_band_count[0]; qs++) {
+    WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (row = 0; row < self->out_ch_count; row++) {
+        self->hyb_dir_out[row][ts][qs].re =
+            self->w_dir[0][ts][qs].re * self->r_out_re_in_m2[ts][indx][row][0];
+        self->hyb_dir_out[row][ts][qs].im =
+            self->w_dir[0][ts][qs].im * self->r_out_re_in_m2[ts][indx][row][0];
+        self->hyb_diff_out[row][ts][qs].re =
+            self->w_diff[1][ts][qs].re *
+            self->r_out_diff_re_in_m2[ts][indx][row][1];
+        self->hyb_diff_out[row][ts][qs].im =
+            self->w_diff[1][ts][qs].im *
+            self->r_out_diff_re_in_m2[ts][indx][row][1];
+      }
+    }
+  }
+  return 0;
+}
+
+WORD32 ixheaacd_mps_apply_mix_matrix_type2(ia_mps_dec_state_struct *self) {
   WORD32 ts, qs, row, col;
   WORD32 complex_m2 = ((self->config->bs_phase_coding != 0));
   WORD32 phase_interpolation = (self->config->bs_phase_coding == 1);
   WORD32 err = 0;
-  err = ixheaacd_mps_upmix_interp(
-      self->m2_decor_re, self->r_diff_out_re_fix_in_m2, self->m2_decor_re_prev,
-      self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self);
+  WORD32 num_col_iters = 0;
+
+  err = ixheaacd_mps_upmix_interp_type1(
+      self->m2_decor_re, self->r_out_diff_re_in_m2, self->m2_decor_re_prev,
+      self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self,
+      1);
   if (err < 0) return err;
-  err = ixheaacd_mps_upmix_interp(
-      self->m2_resid_re, self->r_out_re_fix_in_m2, self->m2_resid_re_prev,
-      self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self);
+  err = ixheaacd_mps_upmix_interp_type1(
+      self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev,
+      self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self,
+      1);
   if (err < 0) return err;
-  ixheaacd_fix_to_float_int(
-      (WORD32 *)self->r_out_re_fix_in_m2, (FLOAT32 *)self->r_out_re_in_m2,
-      MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-      268435456);
-  ixheaacd_fix_to_float_int(
-      (WORD32 *)self->r_diff_out_re_fix_in_m2,
-      (FLOAT32 *)self->r_out_diff_re_in_m2,
-      MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-      268435456);
 
   if (complex_m2 && !phase_interpolation) {
-    err = ixheaacd_mps_upmix_interp(
-        self->m2_decor_im, self->r_diff_out_im_fix_in_m2,
-        self->m2_decor_im_prev, self->out_ch_count,
-        (self->dir_sig_count + self->decor_sig_count), self);
+    err = ixheaacd_mps_upmix_interp_type1(
+        self->m2_decor_im, self->r_out_diff_im_in_m2, self->m2_decor_im_prev,
+        self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self,
+        1);
     if (err < 0) return err;
-    err = ixheaacd_mps_upmix_interp(
-        self->m2_resid_im, self->r_out_im_fix_in_m2, self->m2_resid_im_prev,
-        self->out_ch_count, (self->dir_sig_count + self->decor_sig_count),
-        self);
+    err = ixheaacd_mps_upmix_interp_type1(
+        self->m2_resid_im, self->r_out_im_in_m2, self->m2_resid_im_prev,
+        self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self,
+        1);
     if (err < 0) return err;
-    ixheaacd_fix_to_float_int(
-        (WORD32 *)self->r_diff_out_im_fix_in_m2,
-        (FLOAT32 *)self->r_out_diff_im_in_m2,
-        MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-        268435456);
-    ixheaacd_fix_to_float_int(
-        (WORD32 *)self->r_out_im_fix_in_m2, (FLOAT32 *)self->r_out_im_in_m2,
-        MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-        268435456);
   }
 
   if (phase_interpolation) {
@@ -473,103 +467,171 @@
     for (ts = 0; ts < self->time_slots; ts++) {
       WORD32 pb;
       for (pb = 0; pb < self->bs_param_bands; pb++) {
-        for (row = 0; row < self->out_ch_count; row++) {
-          for (col = 0; col < (self->dir_sig_count + self->decor_sig_count);
-               col++) {
-            self->r_out_im_in_m2[ts][pb][row][col] =
-                self->r_out_re_in_m2[ts][pb][row][col] *
-                self->r_out_ph_im_in_m2[ts][pb][row];
-            self->r_out_re_in_m2[ts][pb][row][col] =
-                self->r_out_re_in_m2[ts][pb][row][col] *
-                self->r_out_ph_re_in_m2[ts][pb][row];
+        self->r_out_im_in_m2[ts][pb][0][0] =
+            self->r_out_re_in_m2[ts][pb][0][0] *
+            self->r_out_ph_im_in_m2[ts][pb][0];
 
-            self->r_out_diff_im_in_m2[ts][pb][row][col] =
-                self->r_out_diff_re_in_m2[ts][pb][row][col] *
-                self->r_out_ph_im_in_m2[ts][pb][row];
-            self->r_out_diff_re_in_m2[ts][pb][row][col] =
-                self->r_out_diff_re_in_m2[ts][pb][row][col] *
-                self->r_out_ph_re_in_m2[ts][pb][row];
-          }
-        }
+        self->r_out_im_in_m2[ts][pb][0][1] =
+            self->r_out_re_in_m2[ts][pb][0][1] *
+            self->r_out_ph_im_in_m2[ts][pb][0];
+
+        self->r_out_im_in_m2[ts][pb][1][0] =
+            self->r_out_re_in_m2[ts][pb][1][0] *
+            self->r_out_ph_im_in_m2[ts][pb][1];
+
+        self->r_out_im_in_m2[ts][pb][1][1] =
+            self->r_out_re_in_m2[ts][pb][1][1] *
+            self->r_out_ph_im_in_m2[ts][pb][1];
+
+        self->r_out_re_in_m2[ts][pb][0][0] =
+            self->r_out_re_in_m2[ts][pb][0][0] *
+            self->r_out_ph_re_in_m2[ts][pb][0];
+
+        self->r_out_re_in_m2[ts][pb][0][1] =
+            self->r_out_re_in_m2[ts][pb][0][1] *
+            self->r_out_ph_re_in_m2[ts][pb][0];
+
+        self->r_out_re_in_m2[ts][pb][1][0] =
+            self->r_out_re_in_m2[ts][pb][1][0] *
+            self->r_out_ph_re_in_m2[ts][pb][1];
+
+        self->r_out_re_in_m2[ts][pb][1][1] =
+            self->r_out_re_in_m2[ts][pb][1][1] *
+            self->r_out_ph_re_in_m2[ts][pb][1];
+
+        self->r_out_diff_im_in_m2[ts][pb][0][0] = 0;
+        self->r_out_diff_im_in_m2[ts][pb][0][1] =
+            self->r_out_diff_re_in_m2[ts][pb][0][1] *
+            self->r_out_ph_im_in_m2[ts][pb][0];
+
+        self->r_out_diff_im_in_m2[ts][pb][1][0] = 0;
+        self->r_out_diff_im_in_m2[ts][pb][1][1] =
+            self->r_out_diff_re_in_m2[ts][pb][1][1] *
+            self->r_out_ph_im_in_m2[ts][pb][1];
+
+        self->r_out_diff_re_in_m2[ts][pb][0][0] = 0;
+        self->r_out_diff_re_in_m2[ts][pb][0][1] =
+            self->r_out_diff_re_in_m2[ts][pb][0][1] *
+            self->r_out_ph_re_in_m2[ts][pb][0];
+
+        self->r_out_diff_re_in_m2[ts][pb][1][0] = 0;
+        self->r_out_diff_re_in_m2[ts][pb][1][1] =
+            self->r_out_diff_re_in_m2[ts][pb][1][1] *
+            self->r_out_ph_re_in_m2[ts][pb][1];
       }
     }
   }
-
+  if (self->res_bands == 0) {
+    num_col_iters = self->dir_sig_count;
+  } else {
+    num_col_iters = (self->dir_sig_count + self->decor_sig_count);
+  }
   for (ts = 0; ts < self->time_slots; ts++) {
-    for (qs = 0; qs < self->hyb_band_count; qs++) {
+    for (qs = 0; qs < self->hyb_band_count_max; qs++) {
       WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+
       for (row = 0; row < self->out_ch_count; row++) {
         FLOAT32 sum_re_dir = 0;
-        FLOAT32 sum_re_diff = 0;
         FLOAT32 sum_im_dir = 0;
-        FLOAT32 sum_im_diff = 0;
-        for (col = 0; col < (self->dir_sig_count + self->decor_sig_count);
-             col++) {
+        for (col = 0; col < num_col_iters; col++) {
           sum_re_dir += self->w_dir[col][ts][qs].re *
                         self->r_out_re_in_m2[ts][indx][row][col];
           sum_im_dir += self->w_dir[col][ts][qs].im *
                         self->r_out_re_in_m2[ts][indx][row][col];
-          sum_re_diff += self->w_diff[col][ts][qs].re *
-                         self->r_out_diff_re_in_m2[ts][indx][row][col];
-          sum_im_diff += self->w_diff[col][ts][qs].im *
-                         self->r_out_diff_re_in_m2[ts][indx][row][col];
         }
         self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
         self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
-        self->hyb_diff_out[row][ts][qs].re = sum_re_diff;
-        self->hyb_diff_out[row][ts][qs].im = sum_im_diff;
+
+        self->hyb_diff_out[row][ts][qs].re =
+            self->w_diff[1][ts][qs].re *
+            self->r_out_diff_re_in_m2[ts][indx][row][1];
+        self->hyb_diff_out[row][ts][qs].im =
+            self->w_diff[1][ts][qs].im *
+            self->r_out_diff_re_in_m2[ts][indx][row][1];
       }
     }
   }
 
   if (complex_m2) {
-    for (ts = 0; ts < self->time_slots; ts++) {
-      for (qs = 0; qs < 2; qs++) {
-        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
-        for (row = 0; row < self->out_ch_count; row++) {
-          FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
-          FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
-          FLOAT32 sum_re_diff = self->hyb_diff_out[row][ts][qs].re;
-          FLOAT32 sum_im_diff = self->hyb_diff_out[row][ts][qs].im;
-          for (col = 0; col < (self->dir_sig_count + self->decor_sig_count);
-               col++) {
-            sum_re_dir += self->w_dir[col][ts][qs].im *
-                          self->r_out_im_in_m2[ts][indx][row][col];
-            sum_im_dir -= self->w_dir[col][ts][qs].re *
-                          self->r_out_im_in_m2[ts][indx][row][col];
-            sum_re_diff += self->w_diff[col][ts][qs].im *
-                           self->r_out_diff_im_in_m2[ts][indx][row][col];
-            sum_im_diff -= self->w_diff[col][ts][qs].re *
-                           self->r_out_diff_im_in_m2[ts][indx][row][col];
+    if (phase_interpolation) {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            for (col = 0; col < num_col_iters; col++) {
+              sum_re_dir += self->w_dir[col][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+              sum_im_dir -= self->w_dir[col][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+            self->hyb_diff_out[row][ts][qs].re +=
+                self->w_diff[1][ts][qs].im *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+            self->hyb_diff_out[row][ts][qs].im -=
+                self->w_diff[1][ts][qs].re *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
           }
-          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
-          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
-          self->hyb_diff_out[row][ts][qs].re = sum_re_diff;
-          self->hyb_diff_out[row][ts][qs].im = sum_im_diff;
+        }
+        for (qs = 2; qs < self->hyb_band_count[0]; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            for (col = 0; col < num_col_iters; col++) {
+              sum_re_dir -= self->w_dir[col][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+              sum_im_dir += self->w_dir[col][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+            self->hyb_diff_out[row][ts][qs].re -=
+                self->w_diff[1][ts][qs].im *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+            self->hyb_diff_out[row][ts][qs].im +=
+                self->w_diff[1][ts][qs].re *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+          }
         }
       }
-      for (qs = 2; qs < self->hyb_band_count; qs++) {
-        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
-        for (row = 0; row < self->out_ch_count; row++) {
-          FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
-          FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
-          FLOAT32 sum_re_diff = self->hyb_diff_out[row][ts][qs].re;
-          FLOAT32 sum_im_diff = self->hyb_diff_out[row][ts][qs].im;
-          for (col = 0; col < (self->dir_sig_count + self->decor_sig_count);
-               col++) {
-            sum_re_dir -= self->w_dir[col][ts][qs].im *
-                          self->r_out_im_in_m2[ts][indx][row][col];
-            sum_im_dir += self->w_dir[col][ts][qs].re *
-                          self->r_out_im_in_m2[ts][indx][row][col];
-            sum_re_diff -= self->w_diff[col][ts][qs].im *
-                           self->r_out_diff_im_in_m2[ts][indx][row][col];
-            sum_im_diff += self->w_diff[col][ts][qs].re *
-                           self->r_out_diff_im_in_m2[ts][indx][row][col];
+    } else {
+      int num_cols = (self->dir_sig_count + self->decor_sig_count) > 1
+                         ? 1
+                         : (self->dir_sig_count + self->decor_sig_count);
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir += self->w_dir[0][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir -= self->w_dir[0][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
           }
-          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
-          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
-          self->hyb_diff_out[row][ts][qs].re = sum_re_diff;
-          self->hyb_diff_out[row][ts][qs].im = sum_im_diff;
+        }
+        for (qs = 2; qs < self->hyb_band_count[0]; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir -= self->w_dir[0][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir += self->w_dir[0][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          }
         }
       }
     }
@@ -577,51 +639,414 @@
   return 0;
 }
 
-static PLATFORM_INLINE WORD32 ixheaacd_mult32_shl2(WORD32 a, WORD32 b) {
-  WORD32 result;
-  WORD64 temp_result;
+WORD32 ixheaacd_mps_apply_mix_matrix_type3(ia_mps_dec_state_struct *self) {
+  WORD32 ts, qs, row, col;
+  WORD32 complex_m2 = ((self->config->bs_phase_coding != 0));
+  WORD32 phase_interpolation = (self->config->bs_phase_coding == 1);
+  WORD32 err = 0;
+  WORD32 num_col_iters = 0;
 
-  temp_result = (WORD64)a * (WORD64)b;
-  result = (WORD32)(temp_result >> 30);
+  if (self->res_bands != 28) {
+    err = ixheaacd_mps_upmix_interp_type2(
+        self->m2_decor_re, self->r_out_diff_re_in_m2, self->m2_decor_re_prev,
+        self->out_ch_count, self, 1);
+    if (err < 0) return err;
+  }
+  if (self->res_bands == 0) {
+    num_col_iters = self->dir_sig_count;
+    err = ixheaacd_mps_upmix_interp_type2(
+        self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev,
+        self->out_ch_count, self, 0);
+    if (err < 0) return err;
+  } else {
+    num_col_iters = (self->dir_sig_count + self->decor_sig_count);
+    err = ixheaacd_mps_upmix_interp_type1(
+        self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev,
+        self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self,
+        1);
+    if (err < 0) return err;
+  }
 
-  return (result);
+  if (complex_m2 && !phase_interpolation) {
+    err = ixheaacd_mps_upmix_interp_type2(
+        self->m2_resid_im, self->r_out_im_in_m2, self->m2_resid_im_prev,
+        self->out_ch_count, self, 0);
+    if (err < 0) return err;
+  }
+
+  if (phase_interpolation) {
+    ixheaacd_mps_phase_interpolation(
+        self->phase_l, self->phase_r, self->phase_l_prev, self->phase_r_prev,
+        self->r_out_ph_re_in_m2, self->r_out_ph_im_in_m2, self);
+
+    if (self->res_bands == 0) {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        WORD32 pb;
+        for (pb = 0; pb < self->bs_param_bands; pb++) {
+          self->r_out_im_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+          self->r_out_diff_im_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_diff_im_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_diff_re_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_diff_re_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+        }
+      }
+    } else if (self->res_bands == 28) {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        WORD32 pb;
+        for (pb = 0; pb < self->bs_param_bands; pb++) {
+          self->r_out_im_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_im_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+        }
+      }
+    } else {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        WORD32 pb;
+        for (pb = 0; pb < self->bs_param_bands; pb++) {
+          self->r_out_im_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_im_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+          self->r_out_diff_im_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_diff_im_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_diff_re_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_diff_re_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+        }
+      }
+    }
+  }
+  if (self->res_bands == 0) {
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < self->hyb_band_count[0]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          self->hyb_dir_out[row][ts][qs].re =
+              self->w_dir[0][ts][qs].re *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_dir_out[row][ts][qs].im =
+              self->w_dir[0][ts][qs].im *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_diff_out[row][ts][qs].re =
+              self->w_diff[1][ts][qs].re *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+          self->hyb_diff_out[row][ts][qs].im =
+              self->w_diff[1][ts][qs].im *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+        }
+      }
+    }
+  } else if (self->res_bands == 28) {
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < self->hyb_band_count[1]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          FLOAT32 sum_re_dir = 0;
+          FLOAT32 sum_im_dir = 0;
+          for (col = 0; col < num_col_iters; col++) {
+            sum_re_dir += self->w_dir[col][ts][qs].re *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+            sum_im_dir += self->w_dir[col][ts][qs].im *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+          }
+          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+        }
+      }
+      for (; qs < self->hyb_band_count[0]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          self->hyb_dir_out[row][ts][qs].re =
+              self->w_dir[0][ts][qs].re *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_dir_out[row][ts][qs].im =
+              self->w_dir[0][ts][qs].im *
+              self->r_out_re_in_m2[ts][indx][row][0];
+        }
+      }
+    }
+  } else {
+    WORD32 dif_s = ixheaacd_mps_gain_set_indx[self->res_bands];
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < dif_s; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          FLOAT32 sum_re_dir = 0;
+          FLOAT32 sum_im_dir = 0;
+          for (col = 0; col < num_col_iters; col++) {
+            sum_re_dir += self->w_dir[col][ts][qs].re *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+            sum_im_dir += self->w_dir[col][ts][qs].im *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+          }
+          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+        }
+      }
+      for (; qs < self->hyb_band_count[1]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          FLOAT32 sum_re_dir = 0;
+          FLOAT32 sum_im_dir = 0;
+          for (col = 0; col < num_col_iters; col++) {
+            sum_re_dir += self->w_dir[col][ts][qs].re *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+            sum_im_dir += self->w_dir[col][ts][qs].im *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+          }
+          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          self->hyb_diff_out[row][ts][qs].re =
+              self->w_diff[1][ts][qs].re *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+          self->hyb_diff_out[row][ts][qs].im =
+              self->w_diff[1][ts][qs].im *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+        }
+      }
+      for (; qs < self->hyb_band_count[0]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          self->hyb_dir_out[row][ts][qs].re =
+              self->w_dir[0][ts][qs].re *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_dir_out[row][ts][qs].im =
+              self->w_dir[0][ts][qs].im *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_diff_out[row][ts][qs].re =
+              self->w_diff[1][ts][qs].re *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+          self->hyb_diff_out[row][ts][qs].im =
+              self->w_diff[1][ts][qs].im *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+        }
+      }
+    }
+  }
+
+  if (complex_m2) {
+    if (phase_interpolation) {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            for (col = 0; col < num_col_iters; col++) {
+              sum_re_dir += self->w_dir[col][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+              sum_im_dir -= self->w_dir[col][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+            self->hyb_diff_out[row][ts][qs].re +=
+                self->w_diff[1][ts][qs].im *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+            self->hyb_diff_out[row][ts][qs].im -=
+                self->w_diff[1][ts][qs].re *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+          }
+        }
+        for (qs = 2; qs < self->hyb_band_count_max; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            for (col = 0; col < num_col_iters; col++) {
+              sum_re_dir -= self->w_dir[col][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+              sum_im_dir += self->w_dir[col][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+            self->hyb_diff_out[row][ts][qs].re -=
+                self->w_diff[1][ts][qs].im *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+            self->hyb_diff_out[row][ts][qs].im +=
+                self->w_diff[1][ts][qs].re *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+          }
+        }
+      }
+    } else {
+      int num_cols = (self->dir_sig_count + self->decor_sig_count) > 1
+                         ? 1
+                         : (self->dir_sig_count + self->decor_sig_count);
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir += self->w_dir[0][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir -= self->w_dir[0][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          }
+        }
+        for (qs = 2; qs < self->hyb_band_count_max; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir -= self->w_dir[0][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir += self->w_dir[0][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          }
+        }
+      }
+    }
+  }
+  return 0;
 }
 
-WORD32 ixheaacd_mps_upmix_interp(
-    WORD32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                   [MAX_M_INPUT],
-    WORD32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                   [MAX_M_INPUT],
-    WORD32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
-    WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self) {
+WORD32 ixheaacd_mps_upmix_interp_type1(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                          [MAX_M_INPUT],
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self,
+    WORD32 bs_high_rate_mode) {
   WORD32 ts, ps, pb, row, col, i;
+  FLOAT32 ks, ms, ls;
+  FLOAT32 fl_step, fl_base;
+
+  if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) return -1;
 
   for (pb = 0; pb < self->bs_param_bands; pb++) {
     for (row = 0; row < num_rows; row++) {
       for (col = 0; col < num_cols; col++) {
-        ps = 0;
         ts = 0;
-        if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) return -1;
+        ps = 0;
+        ks = self->inv_param_slot_diff[ps];
+        ms = m_matrix[ps][pb][row][col];
+        ls = m_matrix_prev[pb][row][col];
+        fl_step = ks * (ms - ls);
+        fl_base = ls + fl_step;
+
         for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) {
-          WORD32 alpha = i * self->inv_param_slot_diff_Q30[ps];
-          WORD32 one_minus_alpha = 1073741824 - alpha;
-          r_matrix[ts][pb][row][col] =
-              ((ixheaacd_mult32_shl2(m_matrix_prev[pb][row][col],
-                                     one_minus_alpha) +
-                ixheaacd_mult32_shl2(alpha, m_matrix[ps][pb][row][col])));
+          r_matrix_float[ts][pb][row][col] = fl_base;
+          fl_base += fl_step;
           ts++;
         }
+        if (bs_high_rate_mode) {
+          for (ps = 1; ps < self->num_parameter_sets; ps++) {
+            if (MAX_TIME_SLOTS < (ts + self->param_slot_diff[ps])) return -1;
+            ks = self->inv_param_slot_diff[ps];
+            ms = m_matrix[ps][pb][row][col];
+            ls = m_matrix[ps - 1][pb][row][col];
+            fl_step = ks * (ms - ls);
+            fl_base = ls + fl_step;
 
-        for (ps = 1; ps < self->num_parameter_sets; ps++) {
-          if (MAX_TIME_SLOTS < (ts + self->param_slot_diff[ps])) return -1;
-          for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) {
-            WORD32 alpha = i * self->inv_param_slot_diff_Q30[ps];
-            WORD32 one_minus_alpha = 1073741824 - alpha;
-            r_matrix[ts][pb][row][col] =
-                ((ixheaacd_mult32_shl2(m_matrix[ps - 1][pb][row][col],
-                                       one_minus_alpha) +
-                  ixheaacd_mult32_shl2(alpha, m_matrix[ps][pb][row][col])));
-            ts++;
+            for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) {
+              r_matrix_float[ts][pb][row][col] = fl_base;
+              fl_base += fl_step;
+              ts++;
+            }
           }
         }
       }
@@ -630,13 +1055,60 @@
   return 0;
 }
 
+WORD32 ixheaacd_mps_upmix_interp_type2(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                          [MAX_M_INPUT],
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    WORD32 num_rows, ia_mps_dec_state_struct *self, WORD32 col) {
+  WORD32 ts, ps, pb, row, i;
+  FLOAT32 ks, ms, ls;
+  FLOAT32 fl_step, fl_base;
+
+  if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) return -1;
+
+  for (pb = 0; pb < self->bs_param_bands; pb++) {
+    for (row = 0; row < num_rows; row++) {
+      ts = 0;
+      ps = 0;
+      ks = self->inv_param_slot_diff[ps];
+      ms = m_matrix[ps][pb][row][col];
+      ls = m_matrix_prev[pb][row][col];
+      fl_step = ks * (ms - ls);
+      fl_base = ls + fl_step;
+
+      for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) {
+        r_matrix_float[ts][pb][row][col] = fl_base;
+        fl_base += fl_step;
+        ts++;
+      }
+      for (ps = 1; ps < self->num_parameter_sets; ps++) {
+        if (MAX_TIME_SLOTS < (ts + self->param_slot_diff[ps])) return -1;
+        ks = self->inv_param_slot_diff[ps];
+        ms = m_matrix[ps][pb][row][col];
+        ls = m_matrix[ps - 1][pb][row][col];
+        fl_step = ks * (ms - ls);
+        fl_base = ls + fl_step;
+
+        for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) {
+          r_matrix_float[ts][pb][row][col] = fl_base;
+          fl_base += fl_step;
+          ts++;
+        }
+      }
+    }
+  }
+  return 0;
+}
+
 static FLOAT32 ixheaacd_mps_angle_interpolation(FLOAT32 angle1, FLOAT32 angle2,
-                                                FLOAT32 alpha) {
+                                                FLOAT32 alpha, FLOAT32 *step) {
   while (angle2 - angle1 > (FLOAT32)P_PI)
     angle1 = angle1 + 2.0f * (FLOAT32)P_PI;
   while (angle1 - angle2 > (FLOAT32)P_PI)
     angle2 = angle2 + 2.0f * (FLOAT32)P_PI;
-
+  *step = angle2 - angle1;
   return (1 - alpha) * angle1 + alpha * angle2;
 }
 
@@ -647,37 +1119,46 @@
     FLOAT32 r_re[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2],
     FLOAT32 r_im[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2],
     ia_mps_dec_state_struct *self) {
-  WORD32 ts, ps, pb;
-  WORD32 i;
+  WORD32 i, ts, ps, pb;
+  FLOAT32 step_l, step_r, alpha, tl, tr;
   for (pb = 0; pb < self->bs_param_bands; pb++) {
     ps = 0;
     ts = 0;
+    alpha = (FLOAT32)self->inv_param_slot_diff[ps];
+    tl = ixheaacd_mps_angle_interpolation(pl_prev[pb], pl[ps][pb], alpha,
+                                          &step_l);
+    tr = ixheaacd_mps_angle_interpolation(pr_prev[pb], pr[ps][pb], alpha,
+                                          &step_r);
+    step_l *= alpha;
+    step_r *= alpha;
+
     for (i = 1; i <= self->param_slot_diff[ps]; i++) {
-      FLOAT32 alpha = (FLOAT32)i * self->inv_param_slot_diff[ps];
-      FLOAT32 t;
+      r_re[ts][pb][0] = (FLOAT32)cos(tl);
+      r_im[ts][pb][0] = (FLOAT32)sin(tl);
+      tl += step_l;
 
-      t = ixheaacd_mps_angle_interpolation(pl_prev[pb], pl[ps][pb], alpha);
-      r_re[ts][pb][0] = (FLOAT32)cos(t);
-      r_im[ts][pb][0] = (FLOAT32)sin(t);
-
-      t = ixheaacd_mps_angle_interpolation(pr_prev[pb], pr[ps][pb], alpha);
-      r_re[ts][pb][1] = (FLOAT32)cos(t);
-      r_im[ts][pb][1] = (FLOAT32)sin(t);
+      r_re[ts][pb][1] = (FLOAT32)cos(tr);
+      r_im[ts][pb][1] = (FLOAT32)sin(tr);
+      tr += step_r;
       ts++;
     }
 
     for (ps = 1; ps < self->num_parameter_sets; ps++) {
+      FLOAT32 alpha = self->inv_param_slot_diff[ps];
+      tl = ixheaacd_mps_angle_interpolation(pl[ps - 1][pb], pl[ps][pb], alpha,
+                                            &step_l);
+      tr = ixheaacd_mps_angle_interpolation(pr[ps - 1][pb], pr[ps][pb], alpha,
+                                            &step_r);
+      step_l *= alpha;
+      step_r *= alpha;
       for (i = 1; i <= self->param_slot_diff[ps]; i++) {
-        FLOAT32 alpha = (FLOAT32)i * self->inv_param_slot_diff[ps];
-        FLOAT32 t;
+        r_re[ts][pb][0] = (FLOAT32)cos(tl);
+        r_im[ts][pb][0] = (FLOAT32)sin(tl);
+        tl += step_l;
 
-        t = ixheaacd_mps_angle_interpolation(pl[ps - 1][pb], pl[ps][pb], alpha);
-        r_re[ts][pb][0] = (FLOAT32)cos(t);
-        r_im[ts][pb][0] = (FLOAT32)sin(t);
-
-        t = ixheaacd_mps_angle_interpolation(pr[ps - 1][pb], pr[ps][pb], alpha);
-        r_re[ts][pb][1] = (FLOAT32)cos(t);
-        r_im[ts][pb][1] = (FLOAT32)sin(t);
+        r_re[ts][pb][1] = (FLOAT32)cos(tr);
+        r_im[ts][pb][1] = (FLOAT32)sin(tr);
+        tr += step_r;
         ts++;
 
         if (ts > 71) {
diff --git a/decoder/ixheaacd_mps_process.h b/decoder/ixheaacd_mps_process.h
index 97b7090..40555fa 100644
--- a/decoder/ixheaacd_mps_process.h
+++ b/decoder/ixheaacd_mps_process.h
@@ -22,6 +22,7 @@
 
 VOID ixheaacd_mps_res_buf_copy(ia_mps_dec_state_struct* self);
 VOID ixheaacd_mps_qmf_hyb_analysis(ia_mps_dec_state_struct* self);
+VOID ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(ia_mps_dec_state_struct* self);
 VOID ixheaacd_mps_qmf_hyb_synthesis(ia_mps_dec_state_struct* self);
 VOID ixheaacd_mps_decor(ia_mps_dec_state_struct* self);
 VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct* self);
diff --git a/decoder/ixheaacd_mps_rom.c b/decoder/ixheaacd_mps_rom.c
index 6dd2ded..954fef0 100644
--- a/decoder/ixheaacd_mps_rom.c
+++ b/decoder/ixheaacd_mps_rom.c
@@ -828,2953 +828,4240 @@
      {-56, 35}, {-24, -67}, {-23, -55}, {-8, -72}, {-5, 36},  {-68, 37},
      {-6, 38},  {-7, -69},  {-70, -71}}};
 
-const WORD32 ixheaacd_im_weight_Q28[16][8][31] = {
+const FLOAT32 ixheaacd_im_weight[16][8][31] = {
     {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f}},
     {
-        {-3,        -574674,   -1017796,  -1796901,  -3154468,  -5481590,
-         -7575016,  -10370478, -14006830, -18549081, -23865573, -27607851,
-         -31193408, -34233661, -36296902, -37030589, -36296902, -34233661,
-         -31193411, -27607851, -23865573, -18549082, -14006829, -10370478,
-         -7575017,  -5481590,  -3154468,  -1796901,  -1017796,  -574674,
-         -3},
-        {-3,        -538644,   -954220,   -1685385,  -2960885,  -5151503,
-         -7126422,  -9769580,  -13217236, -17537304, -22610489, -26190951,
-         -29627877, -32546501, -34529291, -35234746, -34529291, -32546501,
-         -29627879, -26190951, -22610489, -17537304, -13217236, -9769579,
-         -7126423,  -5151503,  -2960885,  -1685385,  -954220,   -538644,
-         -3},
-        {-3,        -483799,   -857386,   -1515349,  -2665174,  -4645760,
-         -6437353,  -8843606,  -11995831, -15965514, -20652239, -23974316,
-         -27173122, -29896409, -31749795, -32409817, -31749798, -29896409,
-         -27173122, -23974316, -20652241, -15965512, -11995831, -8843606,
-         -6437353,  -4645760,  -2665174,  -1515349,  -857386,   -483799,
-         -3},
-        {-2,        -346044,   -613840,   -1086712,  -1916795,  -3357478,
-         -4672194,  -6454555,  -8816980,  -11833773, -15450674, -18047554,
-         -20571857, -22737959, -24220523, -24750059, -24220526, -22737954,
-         -20571860, -18047555, -15450674, -11833774, -8816980,  -6454555,
-         -4672195,  -3357477,  -1916795,  -1086712,  -613840,   -346044,
-         -2},
-        {-1,        -211963,   -376347,   -667357,   -1180477,  -2077857,
-         -2904213,  -4035616,  -5554462,  -7524805,  -9930552,  -11685604,
-         -13412726, -14910621, -15943947, -16314578, -15943948, -14910621,
-         -13412728, -11685605, -9930552,  -7524805,  -5554462,  -4035615,
-         -2904213,  -2077857,  -1180477,  -667357,   -376347,   -211963,
-         -1},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {2,        341283,   608313,   1086175,  1945172,  3500199,  4995375,
-         7149357,  10257166, 14719094, 21095209, 27678683, 35807499, 44718702,
-         52254129, 55306472, 52254135, 44718696, 35807506, 27678683, 21095208,
-         14719092, 10257166, 7149356,  4995375,  3500199,  1945172,  1086175,
-         608313,   341283,   2},
-        {3,         574839,    1026313,   1838046,   3309837,   6017789,
-         8678530,   12620302,  18566315,  29617673,  51387069,  78419391,
-         127027624, 219233261, 378389618, 496423988, 378389858, 219233221,
-         127027637, 78419391,  51387075,  29617673,  18566315,  12620301,
-         8678531,   6017788,   3309837,   1838046,   1026313,   574839,
-         3},
-    },
+
+        {-0.0000000112f, -0.0021408275f, -0.0037915856f, -0.0066939779f,
+         -0.0117513090f, -0.0204205140f, -0.0282191336f, -0.0386330411f,
+         -0.0521795079f, -0.0691007078f, -0.0889061838f, -0.1028472632f,
+         -0.1162045002f, -0.1275303215f, -0.1352165043f, -0.1379496902f,
+         -0.1352165043f, -0.1275303215f, -0.1162045151f, -0.1028472632f,
+         -0.0889061838f, -0.0691007152f, -0.0521795042f, -0.0386330411f,
+         -0.0282191373f, -0.0204205140f, -0.0117513090f, -0.0066939779f,
+         -0.0037915856f, -0.0021408275f, -0.0000000112f},
+        {-0.0000000112f, -0.0020066053f, -0.0035547465f, -0.0062785484f,
+         -0.0110301562f, -0.0191908441f, -0.0265479907f, -0.0363945216f,
+         -0.0492380410f, -0.0653315485f, -0.0842306316f, -0.0975688994f,
+         -0.1103724390f, -0.1212451607f, -0.1286316365f, -0.1312596500f,
+         -0.1286316365f, -0.1212451607f, -0.1103724539f, -0.0975688994f,
+         -0.0842306316f, -0.0653315485f, -0.0492380410f, -0.0363945179f,
+         -0.0265479945f, -0.0191908441f, -0.0110301562f, -0.0062785484f,
+         -0.0035547465f, -0.0020066053f, -0.0000000112f},
+        {-0.0000000112f, -0.0018022917f, -0.0031940117f, -0.0056451149f,
+         -0.0099285468f, -0.0173068047f, -0.0239810087f, -0.0329449996f,
+         -0.0446879528f, -0.0594761744f, -0.0769355893f, -0.0893112868f,
+         -0.1012277678f, -0.1113727987f, -0.1182772070f, -0.1207359731f,
+         -0.1182772145f, -0.1113727987f, -0.1012277678f, -0.0893112868f,
+         -0.0769355893f, -0.0594761670f, -0.0446879528f, -0.0329449996f,
+         -0.0239810087f, -0.0173068047f, -0.0099285468f, -0.0056451149f,
+         -0.0031940117f, -0.0018022917f, -0.0000000112f},
+        {-0.0000000075f, -0.0012891144f, -0.0022867322f, -0.0040483177f,
+         -0.0071406178f, -0.0125075802f, -0.0174052790f, -0.0240450911f,
+         -0.0328458101f, -0.0440842398f, -0.0575582460f, -0.0672323778f,
+         -0.0766361356f, -0.0847055018f, -0.0902284831f, -0.0922011584f,
+         -0.0902284905f, -0.0847054794f, -0.0766361505f, -0.0672323853f,
+         -0.0575582460f, -0.0440842435f, -0.0328458101f, -0.0240450911f,
+         -0.0174052827f, -0.0125075765f, -0.0071406178f, -0.0040483177f,
+         -0.0022867322f, -0.0012891144f, -0.0000000075f},
+        {-0.0000000037f, -0.0007896237f, -0.0014020018f, -0.0024860986f,
+         -0.0043976195f, -0.0077406205f, -0.0108190365f, -0.0150338411f,
+         -0.0206919834f, -0.0280320831f, -0.0369941890f, -0.0435322672f,
+         -0.0499662980f, -0.0555463918f, -0.0593958311f, -0.0607765391f,
+         -0.0593958348f, -0.0555463918f, -0.0499663055f, -0.0435322709f,
+         -0.0369941890f, -0.0280320831f, -0.0206919834f, -0.0150338374f,
+         -0.0108190365f, -0.0077406205f, -0.0043976195f, -0.0024860986f,
+         -0.0014020018f, -0.0007896237f, -0.0000000037f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000075f, 0.0012713782f, 0.0022661425f, 0.0040463172f,
+         0.0072463304f, 0.0130392574f, 0.0186092220f, 0.0266334303f,
+         0.0382109210f, 0.0548328981f, 0.0785857737f, 0.1031111330f,
+         0.1333933324f, 0.1665901542f, 0.1946617961f, 0.2060326636f,
+         0.1946618259f, 0.1665901244f, 0.1333933473f, 0.1031111330f,
+         0.0785857737f, 0.0548328906f, 0.0382109210f, 0.0266334265f,
+         0.0186092220f, 0.0130392574f, 0.0072463304f, 0.0040463172f,
+         0.0022661425f, 0.0012713782f, 0.0000000075f},
+        {0.0000000112f, 0.0021414421f, 0.0038233139f, 0.0068472549f,
+         0.0123301037f, 0.0224180110f, 0.0323300436f, 0.0470142886f,
+         0.0691649169f, 0.1103344262f, 0.1914317459f, 0.2921350002f,
+         0.4732147753f, 0.8167075515f, 1.4096112251f, 1.8493235111f,
+         1.4096120596f, 0.8167073727f, 0.4732148349f, 0.2921350002f,
+         0.1914317757f, 0.1103344262f, 0.0691649169f, 0.0470142849f,
+         0.0323300473f, 0.0224180073f, 0.0123301037f, 0.0068472549f,
+         0.0038233139f, 0.0021414421f, 0.0000000112f}},
     {
-        {-6,        -1063142,  -1884657,  -3332697,  -5866780,  -10242061,
-         -14210618, -19556015, -26583487, -35470365, -46010122, -53508848,
-         -60748872, -66926406, -71137302, -72638110, -71137307, -66926401,
-         -60748877, -53508853, -46010127, -35470363, -26583487, -19556013,
-         -14210619, -10242061, -5866781,  -3332697,  -1884657,  -1063142,
-         -6},
-        {-6,        -996411,   -1766700,  -3125152,  -5504594,  -9619093,
-         -13357671, -18402686, -25050704, -33480939, -43509452, -50662425,
-         -57581404, -63494074, -67528860, -68967732, -67528865, -63494073,
-         -57581409, -50662430, -43509452, -33480939, -25050704, -18402684,
-         -13357672, -9619093,  -5504594,  -3125152,  -1766700,  -996411,
-         -6},
-        {-5,        -894854,   -1587094,  -2808873,  -4951863,  -8666114,
-         -12050168, -16630008, -22687068, -30401449, -39622947, -46227133,
-         -52634601, -58124037, -61876858, -63216462, -61876863, -58124037,
-         -52634607, -46227138, -39622951, -30401449, -22687068, -16630007,
-         -12050168, -8666115,  -4951864,  -2808873,  -1587094,  -894854,
-         -5},
-        {-4,        -639871,   -1135692,  -2012557,  -3555941,  -6246900,
-         -8715879,  -12082768, -16579119, -22374143, -29395763, -34483541,
-         -39463815, -43763084, -46718677, -47776809, -46718677, -43763084,
-         -39463820, -34483541, -29395763, -22374143, -16579119, -12082768,
-         -8715880,  -6246900,  -3555941,  -2012557,  -1135692,  -639871,
-         -4},
-        {-2,        -391832,   -695950,   -1234845,  -2186633,  -3856009,
-         -5398614,  -7518849,  -10379694, -14115081, -18711418, -22088179,
-         -25429852, -28342454, -30359291, -31084156, -30359294, -28342454,
-         -25429854, -22088179, -18711418, -14115079, -10379693, -7518848,
-         -5398615,  -3856009,  -2186633,  -1234845,  -695950,   -391832,
-         -2},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {4,        630153,   1122569,  2002361,  3579289,  6418784,  9130132,
-         13002758, 18518363, 26281774, 36854214, 45475090, 56006939, 67371285,
-         76348185, 79832098, 76348185, 67371278, 56006945, 45475094, 36854219,
-         26281774, 18518363, 13002756, 9130133,  6418784,  3579289,  2002361,
-         1122569,  630153,   4},
-        {6,         1060871,   1892248,   3382951,   6072244,   10973302,
-         15727473,  22653420,  32821245,  47830061,  75342938,  103710864,
-         142829663, 191958022, 239742154, 261023300, 239742208, 191958009,
-         142829663, 103710864, 75342952,  47830061,  32821243,  22653418,
-         15727475,  10973302,  6072245,   3382952,   1892248,   1060871,
-         6},
-    },
+
+        {-0.0000000224f, -0.0039605126f, -0.0070208944f, -0.0124152638f,
+         -0.0218554586f, -0.0381546505f, -0.0529386774f, -0.0728518367f,
+         -0.0990312099f, -0.1321374029f, -0.1714010537f, -0.1993359923f,
+         -0.2263071835f, -0.2493202984f, -0.2650071084f, -0.2705980539f,
+         -0.2650071084f, -0.2493202686f, -0.2263071984f, -0.1993360072f,
+         -0.1714010835f, -0.1321374029f, -0.0990312099f, -0.0728518218f,
+         -0.0529386811f, -0.0381546505f, -0.0218554623f, -0.0124152638f,
+         -0.0070208944f, -0.0039605126f, -0.0000000224f},
+        {-0.0000000224f, -0.0037119202f, -0.0065814704f, -0.0116420984f,
+         -0.0205062106f, -0.0358339138f, -0.0497612022f, -0.0685553476f,
+         -0.0933211446f, -0.1247262210f, -0.1620853394f, -0.1887322366f,
+         -0.2145074457f, -0.2365338504f, -0.2515646219f, -0.2569248080f,
+         -0.2515646219f, -0.2365338504f, -0.2145074606f, -0.1887322664f,
+         -0.1620853394f, -0.1247262210f, -0.0933211446f, -0.0685553402f,
+         -0.0497612059f, -0.0358339138f, -0.0205062106f, -0.0116420984f,
+         -0.0065814704f, -0.0037119202f, -0.0000000224f},
+        {-0.0000000186f, -0.0033335909f, -0.0059123859f, -0.0104638673f,
+         -0.0184471272f, -0.0322837904f, -0.0448903739f, -0.0619516075f,
+         -0.0845159143f, -0.1132542193f, -0.1476069838f, -0.1722094864f,
+         -0.1960791647f, -0.2165289074f, -0.2305092514f, -0.2354996800f,
+         -0.2305092812f, -0.2165289074f, -0.1960791945f, -0.1722095013f,
+         -0.1476069987f, -0.1132542193f, -0.0845159143f, -0.0619516037f,
+         -0.0448903739f, -0.0322837941f, -0.0184471309f, -0.0104638673f,
+         -0.0059123859f, -0.0033335909f, -0.0000000186f},
+        {-0.0000000149f, -0.0023837052f, -0.0042307824f, -0.0074973591f,
+         -0.0132469125f, -0.0232715160f, -0.0324691795f, -0.0450118184f,
+         -0.0617620312f, -0.0833501816f, -0.1095077544f, -0.1284611970f,
+         -0.1470141709f, -0.1630301923f, -0.1740406305f, -0.1779824793f,
+         -0.1740406305f, -0.1630301923f, -0.1470141858f, -0.1284611970f,
+         -0.1095077544f, -0.0833501816f, -0.0617620312f, -0.0450118184f,
+         -0.0324691832f, -0.0232715160f, -0.0132469125f, -0.0074973591f,
+         -0.0042307824f, -0.0023837052f, -0.0000000149f},
+        {-0.0000000075f, -0.0014596879f, -0.0025926158f, -0.0046001561f,
+         -0.0081458427f, -0.0143647529f, -0.0201114044f, -0.0280098952f,
+         -0.0386673734f, -0.0525827743f, -0.0697054639f, -0.0822848827f,
+         -0.0947335809f, -0.1055838689f, -0.1130971760f, -0.1157975048f,
+         -0.1130971834f, -0.1055838689f, -0.0947335884f, -0.0822848827f,
+         -0.0697054639f, -0.0525827669f, -0.0386673696f, -0.0280098915f,
+         -0.0201114081f, -0.0143647529f, -0.0081458427f, -0.0046001561f,
+         -0.0025926158f, -0.0014596879f, -0.0000000075f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000149f, 0.0023475029f, 0.0041818954f, 0.0074593760f,
+         0.0133338906f, 0.0239118338f, 0.0340123922f, 0.0484390482f,
+         0.0689862818f, 0.0979072377f, 0.1372926533f, 0.1694079041f,
+         0.2086421102f, 0.2509776056f, 0.2844191492f, 0.2973977327f,
+         0.2844191492f, 0.2509775758f, 0.2086421251f, 0.1694079340f,
+         0.1372926682f, 0.0979072377f, 0.0689862818f, 0.0484390408f,
+         0.0340123959f, 0.0239118338f, 0.0133338906f, 0.0074593760f,
+         0.0041818954f, 0.0023475029f, 0.0000000149f},
+        {0.0000000224f, 0.0039520524f, 0.0070491731f, 0.0126024745f,
+         0.0226208717f, 0.0408787355f, 0.0585894026f, 0.0843905658f,
+         0.1222686619f, 0.1781808585f, 0.2806743085f, 0.3863530755f,
+         0.5320819616f, 0.7150993347f, 0.8931091428f, 0.9723875523f,
+         0.8931093216f, 0.7150993347f, 0.5320819616f, 0.3863530755f,
+         0.2806743681f, 0.1781808585f, 0.1222686619f, 0.0843905583f,
+         0.0585894100f, 0.0408787355f, 0.0226208754f, 0.0126024783f,
+         0.0070491731f, 0.0039520524f, 0.0000000224f}},
     {
-        {-8,        -1391582,  -2470337,   -4379084,   -7741644,   -13613250,
-         -19010161, -26384297, -36257343,  -49022548,  -64547243,  -75833181,
-         -86908862, -96491301, -103089782, -105454184, -103089782, -96491301,
-         -86908862, -75833172, -64547240,  -49022548,  -36257343,  -26384295,
-         -19010165, -13613251, -7741645,   -4379084,   -2470337,   -1391582,
-         -8},
-        {-7,        -1304089,  -2315260,  -4104938,  -7259321,  -12772177,
-         -17844573, -24783192, -34086929, -46138449, -60827308, -71526414,
-         -82042251, -91152504, -97432108, -99683455, -97432108, -91152495,
-         -82042260, -71526418, -60827312, -46138449, -34086931, -24783188,
-         -17844578, -12772178, -7259321,  -4104938,  -2315260,  -1304089,
-         -7},
-        {-7,        -1170970,  -2079253,  -3687531,  -6524359,  -11488788,
-         -16063810, -22333022, -30758491, -41703962, -55090554, -64871119,
-         -74507479, -82873672, -88649676, -90722278, -88649676, -82873672,
-         -74507487, -64871119, -55090554, -41703962, -30758489, -22333018,
-         -16063811, -11488789, -6524359,  -3687531,  -2079253,  -1170970,
-         -7},
-        {-5,        -836946,   -1486730,  -2638556,  -4674179,  -8248466,
-         -11555711, -16108121, -22262876, -30319528, -40263731, -47590055,
-         -54856837, -61203595, -65605308, -67188665, -65605308, -61203586,
-         -54856842, -47590059, -40263731, -30319526, -22262874, -16108120,
-         -11555711, -8248465,  -4674180,  -2638556,  -1486730,  -836946,
-         -5},
-        {-3,        -512296,   -910384,   -1616803,  -2867623,  -5071172,
-         -7118298,  -9948960,  -13799297, -18879453, -25211247, -29918728,
-         -34622928, -38759529, -41643508, -42683912, -41643508, -38759525,
-         -34622930, -29918732, -25211249, -18879451, -13799296, -9948958,
-         -7118299,  -5071172,  -2867624,  -1616803,  -910384,   -512296,
-         -3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {5,        822447,   1463889,  2607236,  4647839,  8293870,  11741041,
-         16605976, 23414447, 32754663, 45010872, 54604473, 64638836, 73862135,
-         80529788, 82985438, 80529795, 73862128, 64638850, 54604473, 45010872,
-         32754663, 23414449, 16605974, 11741042, 8293870,  4647839,  2607237,
-         1463889,  822447,   5},
-        {8,         1383579,   2464328,   4394383,   7850862,   14065144,
-         19987153,  28424960,  40399126,  57162281,  79807987,  98105864,
-         117845260, 140317143, 157927636, 164697609, 157927650, 140317143,
-         117845274, 98105858,  79807994,  57162273,  40399123,  28424958,
-         19987155,  14065143,  7850864,   4394383,   2464328,   1383579,
-         8},
-    },
+
+        {-0.0000000298f, -0.0051840469f, -0.0092027225f, -0.0163133591f,
+         -0.0288398713f, -0.0507133082f, -0.0708183646f, -0.0982891619f,
+         -0.1350691319f, -0.1826232225f, -0.2404572219f, -0.2825006247f,
+         -0.3237607479f, -0.3594581187f, -0.3840393722f, -0.3928474486f,
+         -0.3840393722f, -0.3594581187f, -0.3237607479f, -0.2825005651f,
+         -0.2404572070f, -0.1826232225f, -0.1350691319f, -0.0982891619f,
+         -0.0708183795f, -0.0507133119f, -0.0288398750f, -0.0163133591f,
+         -0.0092027225f, -0.0051840469f, -0.0000000298f},
+        {-0.0000000261f, -0.0048581101f, -0.0086250156f, -0.0152920857f,
+         -0.0270430781f, -0.0475800671f, -0.0664762110f, -0.0923245847f,
+         -0.1269837022f, -0.1718791127f, -0.2265993804f, -0.2664566636f,
+         -0.3056311905f, -0.3395695388f, -0.3629629016f, -0.3713498116f,
+         -0.3629629016f, -0.3395695090f, -0.3056312203f, -0.2664566636f,
+         -0.2265993953f, -0.1718791127f, -0.1269837171f, -0.0923245698f,
+         -0.0664762333f, -0.0475800708f, -0.0270430781f, -0.0152920857f,
+         -0.0086250156f, -0.0048581101f, -0.0000000261f},
+        {-0.0000000261f, -0.0043622032f, -0.0077458210f, -0.0137371235f,
+         -0.0243051313f, -0.0427990705f, -0.0598423555f, -0.0831969902f,
+         -0.1145843118f, -0.1553593576f, -0.2052282989f, -0.2416637540f,
+         -0.2775619924f, -0.3087284863f, -0.3302457929f, -0.3379668295f,
+         -0.3302457929f, -0.3087284863f, -0.2775620222f, -0.2416637540f,
+         -0.2052282989f, -0.1553593576f, -0.1145842969f, -0.0831969753f,
+         -0.0598423593f, -0.0427990742f, -0.0243051313f, -0.0137371235f,
+         -0.0077458210f, -0.0043622032f, -0.0000000261f},
+        {-0.0000000186f, -0.0031178668f, -0.0055385008f, -0.0098293871f,
+         -0.0174126737f, -0.0307279304f, -0.0430483781f, -0.0600074269f,
+         -0.0829356760f, -0.1129490435f, -0.1499940902f, -0.1772867739f,
+         -0.2043576390f, -0.2280011624f, -0.2443988174f, -0.2502972782f,
+         -0.2443988174f, -0.2280011177f, -0.2043576539f, -0.1772867888f,
+         -0.1499940902f, -0.1129490361f, -0.0829356685f, -0.0600074232f,
+         -0.0430483781f, -0.0307279266f, -0.0174126774f, -0.0098293871f,
+         -0.0055385008f, -0.0031178668f, -0.0000000186f},
+        {-0.0000000112f, -0.0019084513f, -0.0033914447f, -0.0060230605f,
+         -0.0106827281f, -0.0188915879f, -0.0265177265f, -0.0370627642f,
+         -0.0514063872f, -0.0703314394f, -0.0939192176f, -0.1114559472f,
+         -0.1289804578f, -0.1443904936f, -0.1551341563f, -0.1590099633f,
+         -0.1551341563f, -0.1443904787f, -0.1289804578f, -0.1114559621f,
+         -0.0939192176f, -0.0703314394f, -0.0514063835f, -0.0370627567f,
+         -0.0265177302f, -0.0188915879f, -0.0106827319f, -0.0060230605f,
+         -0.0033914447f, -0.0019084513f, -0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000186f, 0.0030638538f, 0.0054534115f, 0.0097127110f,
+         0.0173145495f, 0.0308970734f, 0.0437387861f, 0.0618620813f,
+         0.0872256160f, 0.1220206320f, 0.1676785648f, 0.2034175098f,
+         0.2407984287f, 0.2751578987f, 0.2999968529f, 0.3091448545f,
+         0.2999968529f, 0.2751578689f, 0.2407984734f, 0.2034175098f,
+         0.1676785648f, 0.1220206320f, 0.0872256160f, 0.0618620738f,
+         0.0437387899f, 0.0308970734f, 0.0173145495f, 0.0097127147f,
+         0.0054534115f, 0.0030638538f, 0.0000000186f},
+        {0.0000000298f, 0.0051542334f, 0.0091803372f, 0.0163703524f,
+         0.0292467400f, 0.0523967445f, 0.0744579434f, 0.1058912277f,
+         0.1504984796f, 0.2129460871f, 0.2973079085f, 0.3654728234f,
+         0.4390078187f, 0.5227220654f, 0.5883262753f, 0.6135464311f,
+         0.5883263350f, 0.5227220654f, 0.4390078485f, 0.3654727936f,
+         0.2973079383f, 0.2129460573f, 0.1504984647f, 0.1058912203f,
+         0.0744579583f, 0.0523967408f, 0.0292467475f, 0.0163703524f,
+         0.0091803372f, 0.0051542334f, 0.0000000298f}},
     {
-        {-8,         -1509476,   -2684086,   -4772023,   -8480193,   -15047650,
-         -21188892,  -29744494,  -41501680,  -57227068,  -77169768,  -92246064,
-         -107526888, -121143312, -130736632, -134217744, -130736624, -121143312,
-         -107526896, -92246064,  -77169768,  -57227064,  -41501676,  -29744492,
-         -21188894,  -15047650,  -8480194,   -4772023,   -2684086,   -1509476,
-         -8},
-        {-8,         -1414379,   -2514988,   -4471386,   -7945941,   -14099648,
-         -19853990,  -27870592,  -38887072,  -53621760,  -72308072,  -86434552,
-         -100752688, -113511272, -122500224, -125762016, -122500216, -113511280,
-         -100752696, -86434560,  -72308072,  -53621760,  -38887072,  -27870588,
-         -19853994,  -14099649,  -7945942,   -4471386,   -2514989,   -1414379,
-         -8},
-        {-7,        -1269741,   -2257800,   -4014131,   -7133369,   -12657783,
-         -17823674, -25020474,  -34910384,  -48138264,  -64913664,  -77595552,
-         -90449464, -101903328, -109973032, -112901280, -109973040, -101903328,
-         -90449472, -77595544,  -64913668,  -48138264,  -34910384,  -25020472,
-         -17823674, -12657783,  -7133369,   -4014131,   -2257800,   -1269741,
-         -7},
-        {-5,        -907074,   -1612921,  -2867604,  -5095918,  -9042434,
-         -12732830, -17874062, -24939188, -34388892, -46372856, -55432508,
-         -64615056, -72797440, -78562256, -80654120, -78562256, -72797432,
-         -64615064, -55432508, -46372860, -34388892, -24939190, -17874060,
-         -12732831, -9042434,  -5095918,  -2867604,  -1612921,  -907074,
-         -5},
-        {-3,        -554944,   -986777,   -1754386,  -3117658,  -5532118,
-         -7789884,  -10935266, -15257677, -21038960, -28370692, -33913340,
-         -39531184, -44537124, -48064012, -49343804, -48064012, -44537124,
-         -39531188, -33913344, -28370694, -21038958, -15257676, -10935264,
-         -7789885,  -5532117,  -3117658,  -1754387,  -986777,   -554944,
-         -3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {5,        889081,   1580927,  2810722,  4994834,  8863066,  12480257,
-         17519508, 24444488, 33706744, 45452992, 54332928, 63333332, 71353408,
-         77003864, 79054240, 77003872, 71353400, 63333336, 54332932, 45452992,
-         33706744, 24444488, 17519506, 12480258, 8863066,  4994834,  2810722,
-         1580927,  889081,   5},
-        {8,         1494381,   2657245,   4724303,   8395391,   14897174,
-         20977002,  29447048,  41086664,  56654796,  76398072,  91323608,
-         106451616, 119931880, 129429263, 132875552, 129429264, 119931878,
-         106451624, 91323608,  76398072,  56654796,  41086660,  29447048,
-         20977004,  14897174,  8395392,   4724304,   2657245,   1494381,
-         8},
-    },
+
+        {-0.0000000298f, -0.0056232363f, -0.0099989995f, -0.0177771710f,
+         -0.0315911807f, -0.0560568646f, -0.0789347738f, -0.1108068749f,
+         -0.1546058059f, -0.2131874412f, -0.2874797881f, -0.3436433673f,
+         -0.4005688727f, -0.4512940049f, -0.4870319068f, -0.5000000596f,
+         -0.4870318770f, -0.4512940049f, -0.4005689025f, -0.3436433673f,
+         -0.2874797881f, -0.2131874263f, -0.1546057910f, -0.1108068675f,
+         -0.0789347813f, -0.0560568646f, -0.0315911844f, -0.0177771710f,
+         -0.0099989995f, -0.0056232363f, -0.0000000298f},
+        {-0.0000000298f, -0.0052689724f, -0.0093690604f, -0.0166572109f,
+         -0.0296009369f, -0.0525252819f, -0.0739618763f, -0.1038260460f,
+         -0.1448656321f, -0.1997566223f, -0.2693685591f, -0.3219937980f,
+         -0.3753330112f, -0.4228624403f, -0.4563488960f, -0.4685000181f,
+         -0.4563488662f, -0.4228624701f, -0.3753330410f, -0.3219938278f,
+         -0.2693685591f, -0.1997566223f, -0.1448656321f, -0.1038260311f,
+         -0.0739618912f, -0.0525252856f, -0.0296009406f, -0.0166572109f,
+         -0.0093690641f, -0.0052689724f, -0.0000000298f},
+        {-0.0000000261f, -0.0047301538f, -0.0084109604f, -0.0149538033f,
+         -0.0265738703f, -0.0471539162f, -0.0663983598f, -0.0932085291f,
+         -0.1300513148f, -0.1793290079f, -0.2418222427f, -0.2890659571f,
+         -0.3369505107f, -0.3796194792f, -0.4096814692f, -0.4205900431f,
+         -0.4096814990f, -0.3796194792f, -0.3369505405f, -0.2890659273f,
+         -0.2418222576f, -0.1793290079f, -0.1300513148f, -0.0932085216f,
+         -0.0663983598f, -0.0471539162f, -0.0265738703f, -0.0149538033f,
+         -0.0084109604f, -0.0047301538f, -0.0000000261f},
+        {-0.0000000186f, -0.0033791140f, -0.0060085990f, -0.0106826574f,
+         -0.0189837739f, -0.0336856917f, -0.0474334881f, -0.0665860698f,
+         -0.0929057151f, -0.1281086057f, -0.1727523506f, -0.2065021843f,
+         -0.2407098413f, -0.2711915970f, -0.2926672101f, -0.3004600108f,
+         -0.2926672101f, -0.2711915672f, -0.2407098711f, -0.2065021843f,
+         -0.1727523655f, -0.1281086057f, -0.0929057226f, -0.0665860623f,
+         -0.0474334918f, -0.0336856917f, -0.0189837739f, -0.0106826574f,
+         -0.0060085990f, -0.0033791140f, -0.0000000186f},
+        {-0.0000000112f, -0.0020673275f, -0.0036760308f, -0.0065355971f,
+         -0.0116141811f, -0.0206087455f, -0.0290195793f, -0.0407370403f,
+         -0.0568392761f, -0.0783762336f, -0.1056890637f, -0.1263370365f,
+         -0.1472651362f, -0.1659137160f, -0.1790523976f, -0.1838199943f,
+         -0.1790523976f, -0.1659137160f, -0.1472651511f, -0.1263370514f,
+         -0.1056890711f, -0.0783762261f, -0.0568392724f, -0.0407370329f,
+         -0.0290195830f, -0.0206087418f, -0.0116141811f, -0.0065356009f,
+         -0.0036760308f, -0.0020673275f, -0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000186f, 0.0033120848f, 0.0058894120f, 0.0104707554f,
+         0.0186072066f, 0.0330174938f, 0.0464925803f, 0.0652652532f,
+         0.0910628140f, 0.1255674064f, 0.1693255901f, 0.2024059296f,
+         0.2359350473f, 0.2658121586f, 0.2868617475f, 0.2944999933f,
+         0.2868617773f, 0.2658121288f, 0.2359350622f, 0.2024059445f,
+         0.1693255901f, 0.1255674064f, 0.0910628140f, 0.0652652457f,
+         0.0464925840f, 0.0330174938f, 0.0186072066f, 0.0104707554f,
+         0.0058894120f, 0.0033120848f, 0.0000000186f},
+        {0.0000000298f, 0.0055670030f, 0.0098990090f, 0.0175994001f,
+         0.0312752686f, 0.0554962978f, 0.0781454220f, 0.1096988022f,
+         0.1530597508f, 0.2110555619f, 0.2846049964f, 0.3402069509f,
+         0.3965631723f, 0.4467810690f, 0.4821615815f, 0.4950000048f,
+         0.4821615815f, 0.4467810690f, 0.3965632021f, 0.3402069509f,
+         0.2846049964f, 0.2110555619f, 0.1530597359f, 0.1096988022f,
+         0.0781454295f, 0.0554962978f, 0.0312752724f, 0.0175994039f,
+         0.0098990090f, 0.0055670030f, 0.0000000298f}},
     {
-        {-8,         -1397585,   -2489316,   -4439078,   -7931147,   -14210401,
-         -20195533,  -28725381,  -40834574,  -57795944,  -80727760,  -99273505,
-         -119386757, -142482370, -160470890, -167392516, -160470890, -142482357,
-         -119386757, -99273512,  -80727756,  -57795944,  -40834574,  -28725377,
-         -20195535,  -14210400,  -7931148,   -4439078,   -2489316,   -1397585,
-         -8},
-        {-7,         -1309358,   -2331922,   -4157610,   -7425692,   -13296383,
-         -18885003,  -26837459,  -38101253,  -53825212,  -74978577,  -91990894,
-         -110257644, -129210650, -144934890, -150951436, -144934903, -129210650,
-         -110257650, -91990901,  -74978584,  -53825215,  -38101253,  -26837455,
-         -18885005,  -13296384,  -7425692,   -4157610,   -2331922,   -1309358,
-         -7},
-        {-7,        -1175217,   -2092682,   -3729980,   -6658434,   -11911179,
-         -16901999, -23987347,  -33988896,  -47881077,  -66434665,  -81236418,
-         -97003508, -111774388, -123343304, -128186650, -123343317, -111774382,
-         -97003515, -81236418,  -66434665,  -47881077,  -33988892,  -23987347,
-         -16902001, -11911179,  -6658434,   -3729980,   -2092681,   -1175217,
-         -7},
-        {-5,        -839113,   -1493583,  -2660218,  -4742594,  -8463942,
-         -11983129, -16951064, -23906436, -33453557, -45991133, -55813174,
-         -66094542, -75552455, -82394424, -84915283, -82394417, -75552441,
-         -66094540, -55813171, -45991139, -33453554, -23906434, -16951065,
-         -11983130, -8463941,  -4742595,  -2660218,  -1493583,  -839113,
-         -5},
-        {-3,        -513107,   -912949,   -1624911,  -2893228,  -5151802,
-         -7278196,  -10264146, -14413252, -20048070, -27340204, -32966174,
-         -38772409, -44037899, -47801354, -49178242, -47801358, -44037903,
-         -38772413, -32966178, -27340208, -20048068, -14413250, -10264145,
-         -7278196,  -5151802,  -2893229,  -1624911,  -912949,   -513107,
-         -3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {5,        820365,   1457305,  2586425,  4582113,  8086863,  11330426,
-         15796198, 21835646, 29744456, 39510836, 46709319, 53851835, 60092071,
-         64420974, 65978354, 64420974, 60092067, 53851844, 46709315, 39510836,
-         29744457, 21835644, 15796195, 11330427, 8086863,  4582113,  2586425,
-         1457305,  820365,   5},
-        {8,        1377696,  2445727,   4335584,   7665133,   13479892,
-         18825424, 26130668, 35913779,  48566398,  63959479,  75153138,
-         86140901, 95649257, 102197733, 104544436, 102197742, 95649257,
-         86140901, 75153138, 63959483,  48566398,  35913779,  26130668,
-         18825426, 13479892, 7665134,   4335585,   2445727,   1377696,
-         8},
-    },
+
+        {-0.0000000298f, -0.0052064098f, -0.0092734247f, -0.0165368542f,
+         -0.0295458250f, -0.0529378690f, -0.0752342194f, -0.1070103794f,
+         -0.1521206498f, -0.2153066695f, -0.3007343411f, -0.3698226213f,
+         -0.4447503388f, -0.5307881832f, -0.5978006721f, -0.6235857010f,
+         -0.5978006721f, -0.5307881236f, -0.4447503388f, -0.3698226511f,
+         -0.3007343411f, -0.2153066695f, -0.1521206498f, -0.1070103645f,
+         -0.0752342343f, -0.0529378653f, -0.0295458287f, -0.0165368542f,
+         -0.0092734247f, -0.0052064098f, -0.0000000298f},
+        {-0.0000000261f, -0.0048777387f, -0.0086870864f, -0.0154883042f,
+         -0.0276628584f, -0.0495328866f, -0.0703521222f, -0.0999773294f,
+         -0.1419382244f, -0.2005145401f, -0.2793169618f, -0.3426927924f,
+         -0.4107417464f, -0.4813471735f, -0.5399245620f, -0.5623379350f,
+         -0.5399245620f, -0.4813471735f, -0.4107417464f, -0.3426928222f,
+         -0.2793169916f, -0.2005145550f, -0.1419382244f, -0.0999773145f,
+         -0.0703521222f, -0.0495328903f, -0.0276628584f, -0.0154883042f,
+         -0.0086870864f, -0.0048777387f, -0.0000000261f},
+        {-0.0000000261f, -0.0043780245f, -0.0077958480f, -0.0138952583f,
+         -0.0248045996f, -0.0443725996f, -0.0629648566f, -0.0893598348f,
+         -0.1266185045f, -0.1783709079f, -0.2474884093f, -0.3026292324f,
+         -0.3613662124f, -0.4163920283f, -0.4594896138f, -0.4775324762f,
+         -0.4594896734f, -0.4163920283f, -0.3613662422f, -0.3026292324f,
+         -0.2474884093f, -0.1783709079f, -0.1266184896f, -0.0893598348f,
+         -0.0629648566f, -0.0443725996f, -0.0248045996f, -0.0138952583f,
+         -0.0077958442f, -0.0043780245f, -0.0000000261f},
+        {-0.0000000186f, -0.0031259395f, -0.0055640303f, -0.0099100843f,
+         -0.0176675394f, -0.0315306410f, -0.0446406342f, -0.0631476343f,
+         -0.0890584141f, -0.1246242076f, -0.1713303179f, -0.2079202831f,
+         -0.2462213635f, -0.2814548314f, -0.3069431484f, -0.3163340688f,
+         -0.3069431186f, -0.2814547718f, -0.2462213486f, -0.2079202682f,
+         -0.1713303477f, -0.1246242002f, -0.0890584067f, -0.0631476343f,
+         -0.0446406379f, -0.0315306373f, -0.0176675431f, -0.0099100843f,
+         -0.0055640303f, -0.0031259395f, -0.0000000186f},
+        {-0.0000000112f, -0.0019114725f, -0.0034010001f, -0.0060532652f,
+         -0.0107781142f, -0.0191919580f, -0.0271133929f, -0.0382369235f,
+         -0.0536935478f, -0.0746848807f, -0.1018501967f, -0.1228085682f,
+         -0.1444384754f, -0.1640539616f, -0.1780739129f, -0.1832032204f,
+         -0.1780739427f, -0.1640539765f, -0.1444384903f, -0.1228085831f,
+         -0.1018502116f, -0.0746848732f, -0.0536935404f, -0.0382369198f,
+         -0.0271133929f, -0.0191919580f, -0.0107781179f, -0.0060532652f,
+         -0.0034010001f, -0.0019114725f, -0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000186f, 0.0030560978f, 0.0054288842f, 0.0096351840f,
+         0.0170697011f, 0.0301259123f, 0.0422091261f, 0.0588454232f,
+         0.0813441202f, 0.1108067334f, 0.1471893340f, 0.1740057766f,
+         0.2006137222f, 0.2238604128f, 0.2399868369f, 0.2457885146f,
+         0.2399868369f, 0.2238603979f, 0.2006137520f, 0.1740057617f,
+         0.1471893340f, 0.1108067334f, 0.0813441128f, 0.0588454120f,
+         0.0422091298f, 0.0301259123f, 0.0170697011f, 0.0096351840f,
+         0.0054288842f, 0.0030560978f, 0.0000000186f},
+        {0.0000000298f, 0.0051323175f, 0.0091110431f, 0.0161513090f,
+         0.0285548456f, 0.0502165109f, 0.0701301694f, 0.0973443240f,
+         0.1337892562f, 0.1809239388f, 0.2382676303f, 0.2799672484f,
+         0.3208998740f, 0.3563212454f, 0.3807162344f, 0.3894583583f,
+         0.3807162642f, 0.3563212454f, 0.3208998740f, 0.2799672484f,
+         0.2382676452f, 0.1809239388f, 0.1337892562f, 0.0973443240f,
+         0.0701301768f, 0.0502165109f, 0.0285548493f, 0.0161513127f,
+         0.0091110431f, 0.0051323175f, 0.0000000298f}},
     {
-        {-6,         -1071630,   -1911499,   -3417563,   -6135014,   -11088915,
-         -15896315,  -22903493,  -33199122,  -48417346,  -76625352,  -105748897,
-         -146157663, -197317649, -247522927, -270025194, -247522954, -197317609,
-         -146157677, -105748904, -76625358,  -48417346,  -33199122,  -22903491,
-         -15896315,  -11088915,  -6135014,   -3417563,   -1911499,   -1071630,
-         -6},
-        {-6,         -1003864,   -1790265,   -3199659,   -5740059,   -10362247,
-         -14836237,  -21336047,  -30836947,  -44762533,  -68827345,  -93516451,
-         -126532850, -166393343, -203549915, -219611661, -203549928, -166393329,
-         -126532890, -93516458,  -68827352,  -44762536,  -30836951,  -21336046,
-         -14836239,  -10362246,  -5740059,   -3199659,   -1790265,   -1003864,
-         -6},
-        {-5,         -900861,    -1606086,   -2868917,   -5141593,   -9264643,
-         -13240198,  -18987808,  -27325830,  -39399654,  -58130792,  -77340471,
-         -101814498, -129653024, -154062530, -164186529, -154062570, -129653010,
-         -101814518, -77340471,  -58130799,  -39399654,  -27325828,  -18987806,
-         -13240198,  -9264643,   -5141593,   -2868917,   -1606086,   -900860,
-         -5},
-        {-4,        -642936,   -1145384,  -2043195,  -3652724,  -6551934,
-         -9321546,  -13279575, -18921457, -26872438, -37720430, -46584838,
-         -57725379, -69582952, -78984425, -82641451, -78984418, -69582945,
-         -57725385, -46584841, -37720434, -26872436, -18921457, -13279575,
-         -9321547,  -6551934,  -3652725,  -2043195,  -1145384,  -642936,
-         -4},
-        {-2,        -392979,   -699578,   -1246312,  -2222848,  -3970081,
-         -5624912,  -7965246,  -11250449, -15776819, -21752506, -26460379,
-         -31414830, -35997598, -39328571, -40559278, -39328574, -35997598,
-         -31414833, -26460381, -21752510, -15776818, -11250449, -7965245,
-         -5624912,  -3970080,  -2222848,  -1246312,  -699578,   -392979,
-         -2},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {4,        627208,   1113258,  1972927,  3486308,  6125748,  8548319,
-         11853214, 16269000, 21963762, 28868936, 33875540, 38778800, 43013413,
-         45925477, 46968213, 45925482, 43013409, 38778804, 33875542, 28868936,
-         21963760, 16269001, 11853213, 8548320,  6125748,  3486308,  1972927,
-         1113257,  627208,   4},
-        {6,        1052552,  1865940,  3299774,  5809354,  10143366, 14075580,
-         19373582, 26341294, 35156402, 45615999, 53060599, 60250435, 66386585,
-         70569986, 72061134, 70569991, 66386585, 60250429, 53060599, 45615999,
-         35156405, 26341292, 19373582, 14075583, 10143366, 5809355,  3299775,
-         1865941,  1052552,  6},
-    },
+
+        {-0.0000000224f, -0.0039921328f, -0.0071208887f, -0.0127314143f,
+         -0.0228547081f, -0.0413094275f, -0.0592183881f, -0.0853221565f,
+         -0.1236763671f, -0.1803686619f, -0.2854516804f, -0.3939453363f,
+         -0.5444797277f, -0.7350655198f, -0.9220947623f, -1.0059221983f,
+         -0.9220948815f, -0.7350654006f, -0.5444797873f, -0.3939453661f,
+         -0.2854517102f, -0.1803686619f, -0.1236763671f, -0.0853221565f,
+         -0.0592183881f, -0.0413094275f, -0.0228547081f, -0.0127314143f,
+         -0.0071208887f, -0.0039921328f, -0.0000000224f},
+        {-0.0000000224f, -0.0037396848f, -0.0066692568f, -0.0119196586f,
+         -0.0213833861f, -0.0386023782f, -0.0552692898f, -0.0794829726f,
+         -0.1148765832f, -0.1667534262f, -0.2564018369f, -0.3483759165f,
+         -0.4713715911f, -0.6198635101f, -0.7582825422f, -0.8181172013f,
+         -0.7582825422f, -0.6198634505f, -0.4713717401f, -0.3483759463f,
+         -0.2564018667f, -0.1667534411f, -0.1148765981f, -0.0794829652f,
+         -0.0552692972f, -0.0386023745f, -0.0213833861f, -0.0119196586f,
+         -0.0066692568f, -0.0037396848f, -0.0000000224f},
+        {-0.0000000186f, -0.0033559687f, -0.0059831366f, -0.0106875487f,
+         -0.0191539265f, -0.0345134847f, -0.0493235812f, -0.0707350969f,
+         -0.1017966494f, -0.1467751563f, -0.2165540755f, -0.2881157100f,
+         -0.3792885542f, -0.4829951525f, -0.5739276409f, -0.6116424799f,
+         -0.5739278197f, -0.4829950929f, -0.3792886436f, -0.2881157100f,
+         -0.2165541053f, -0.1467751563f, -0.1017966419f, -0.0707350895f,
+         -0.0493235812f, -0.0345134847f, -0.0191539265f, -0.0106875487f,
+         -0.0059831366f, -0.0033559650f, -0.0000000186f},
+        {-0.0000000149f, -0.0023951232f, -0.0042668879f, -0.0076114945f,
+         -0.0136074573f, -0.0244078562f, -0.0347254649f, -0.0494702719f,
+         -0.0704879165f, -0.1001076326f, -0.1405195594f, -0.1735420525f,
+         -0.2150437981f, -0.2592166960f, -0.2942399085f, -0.3078633845f,
+         -0.2942398787f, -0.2592166662f, -0.2150438130f, -0.1735420525f,
+         -0.1405195594f, -0.1001076251f, -0.0704879165f, -0.0494702719f,
+         -0.0347254686f, -0.0244078562f, -0.0136074610f, -0.0076114945f,
+         -0.0042668879f, -0.0023951232f, -0.0000000149f},
+        {-0.0000000075f, -0.0014639609f, -0.0026061311f, -0.0046428740f,
+         -0.0082807541f, -0.0147897042f, -0.0209544301f, -0.0296728536f,
+         -0.0419111885f, -0.0587732308f, -0.0810343996f, -0.0985725969f,
+         -0.1170293614f, -0.1341015100f, -0.1465103477f, -0.1510950923f,
+         -0.1465103626f, -0.1341015100f, -0.1170293689f, -0.0985725969f,
+         -0.0810344145f, -0.0587732270f, -0.0419111885f, -0.0296728499f,
+         -0.0209544301f, -0.0147897005f, -0.0082807541f, -0.0046428740f,
+         -0.0026061311f, -0.0014639609f, -0.0000000075f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000149f, 0.0023365319f, 0.0041472092f, 0.0073497258f,
+         0.0129875094f, 0.0228201896f, 0.0318449698f, 0.0441566631f,
+         0.0606067479f, 0.0818213895f, 0.1075451672f, 0.1261962205f,
+         0.1444622874f, 0.1602374464f, 0.1710857302f, 0.1749702245f,
+         0.1710857451f, 0.1602374315f, 0.1444623023f, 0.1261962354f,
+         0.1075451672f, 0.0818213820f, 0.0606067516f, 0.0441566594f,
+         0.0318449736f, 0.0228201896f, 0.0129875094f, 0.0073497258f,
+         0.0041472055f, 0.0023365319f, 0.0000000149f},
+        {0.0000000224f, 0.0039210618f, 0.0069511682f, 0.0122926161f,
+         0.0216415301f, 0.0377869830f, 0.0524356216f, 0.0721722171f,
+         0.0981289670f, 0.1309677958f, 0.1699328423f, 0.1976661384f,
+         0.2244503647f, 0.2473092973f, 0.2628936768f, 0.2684486508f,
+         0.2628937066f, 0.2473092973f, 0.2244503349f, 0.1976661384f,
+         0.1699328423f, 0.1309678108f, 0.0981289595f, 0.0721722171f,
+         0.0524356328f, 0.0377869830f, 0.0216415338f, 0.0122926198f,
+         0.0069511719f, 0.0039210618f, 0.0000000224f}},
     {
-        {-3,         -580676,    -1036778,   -1856927,   -3344306,   -6082086,
-         -8773675,   -12764181,  -18791317,  -30111286,  -52494265,  -80589391,
-         -131965584, -232564048, -416579297, -562298280, -416579510, -232563968,
-         -131965624, -80589405,  -52494275,  -30111283,  -18791315,  -12764179,
-         -8773676,   -6082086,   -3344306,   -1856927,   -1036778,   -580676,
-         -3},
-        {-3,         -543914,    -970885,    -1738082,   -3127514,   -5678284,
-         -8177066,   -11864206,  -17389757,  -27104441,  -45909909,  -68054278,
-         -104838298, -165555583, -249179407, -298573540, -249179487, -165555569,
-         -104838338, -68054292,  -45909909,  -27104439,  -17389757,  -11864205,
-         -8177067,   -5678284,   -3127513,   -1738082,   -970885,    -543913,
-         -3},
-        {-3,        -488046,    -870816,    -1557814,   -2799416,   -5069822,
-         -7282155,  -10523970,  -15327605,  -22959079,  -37422722,  -53115972,
-         -76430452, -108848624, -144319570, -161563289, -144319637, -108848611,
-         -76430472, -53115969,  -37422729,  -22959078,  -15327603,  -10523969,
-         -7282156,  -5069822,   -2799417,   -1557814,   -870816,    -488046,
-         -3},
-        {-2,        -348211,   -620694,   -1108379,  -1985253,  -3573386,
-         -5101324,  -7304187,  -10486237, -15063094, -21722298, -28584446,
-         -37112672, -46532696, -54556959, -57822712, -54556959, -46532689,
-         -37112682, -28584446, -21722299, -15063095, -10486238, -7304186,
-         -5101324,  -3573386,  -1985253,  -1108378,  -620694,   -348211,
-         -2},
-        {-1,        -212775,   -378912,   -675466,   -1206088,  -2158548,
-         -3064349,  -4351732,  -6171956,  -8706333,  -12102898, -14823042,
-         -17731555, -20482223, -22906153, -23829791, -22906156, -20482223,
-         -17731555, -14823041, -12102899, -8706332,  -6171955,  -4351731,
-         -3064349,  -2158548,  -1206088,  -675466,   -378913,   -212775,
-         -1},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {2,        339200,   601729,   1065360,  1879405,  3292792,  4583180,
-         6333406,  8654669,  11621118, 15180668, 17738214, 20225637, 22361080,
-         23823154, 24345462, 23823157, 22361078, 20225641, 17738213, 15180668,
-         11621118, 8654670,  6333406,  4583181,  3292792,  1879405,  1065360,
-         601729,   339200,   2},
-        {3,        568956,   1007710,  1779215,  3123785,  5429323,  7504044,
-         10275511, 13882195, 18389595, 23668008, 27385006, 30947362, 33968646,
-         36019344, 36748630, 36019347, 33968643, 30947364, 27385006, 23668008,
-         18389595, 13882195, 10275510, 7504045,  5429323,  3123785,  1779215,
-         1007710,  568956,   3},
-    },
+
+        {-0.0000000112f, -0.0021631867f, -0.0038622990f, -0.0069175921f,
+         -0.0124585107f, -0.0226575360f, -0.0326844864f, -0.0475502796f,
+         -0.0700031072f, -0.1121732816f, -0.1955563724f, -0.3002188802f,
+         -0.4916101098f, -0.8663685918f, -1.5518788099f, -2.0947244167f,
+         -1.5518796444f, -0.8663682938f, -0.4916102588f, -0.3002189398f,
+         -0.1955564171f, -0.1121732742f, -0.0700031072f, -0.0475502722f,
+         -0.0326844901f, -0.0226575360f, -0.0124585107f, -0.0069175921f,
+         -0.0038622990f, -0.0021631867f, -0.0000000112f},
+        {-0.0000000112f, -0.0020262375f, -0.0036168285f, -0.0064748600f,
+         -0.0116508976f, -0.0211532563f, -0.0304619446f, -0.0441976115f,
+         -0.0647818893f, -0.1009719074f, -0.1710277349f, -0.2535219491f,
+         -0.3905530870f, -0.6167426109f, -0.9282656312f, -1.1122730970f,
+         -0.9282659292f, -0.6167425513f, -0.3905532360f, -0.2535219789f,
+         -0.1710277349f, -0.1009719074f, -0.0647818893f, -0.0441976078f,
+         -0.0304619484f, -0.0211532563f, -0.0116508938f, -0.0064748600f,
+         -0.0036168285f, -0.0020262338f, -0.0000000112f},
+        {-0.0000000112f, -0.0018181130f, -0.0032440424f, -0.0058033094f,
+         -0.0104286373f, -0.0188865587f, -0.0271281414f, -0.0392048433f,
+         -0.0570997782f, -0.0855292380f, -0.1394104958f, -0.1978724152f,
+         -0.2847256064f, -0.4054927230f, -0.5376322865f, -0.6018701792f,
+         -0.5376325250f, -0.4054926634f, -0.2847256958f, -0.1978724003f,
+         -0.1394105256f, -0.0855292305f, -0.0570997708f, -0.0392048396f,
+         -0.0271281451f, -0.0188865587f, -0.0104286410f, -0.0058033094f,
+         -0.0032440424f, -0.0018181130f, -0.0000000112f},
+        {-0.0000000075f, -0.0012971871f, -0.0023122653f, -0.0041290335f,
+         -0.0073956437f, -0.0133119002f, -0.0190039128f, -0.0272102170f,
+         -0.0390642770f, -0.0561143979f, -0.0809218660f, -0.1064853594f,
+         -0.1382554770f, -0.1733478010f, -0.2032405138f, -0.2154063880f,
+         -0.2032405138f, -0.1733477712f, -0.1382555068f, -0.1064853594f,
+         -0.0809218735f, -0.0561144017f, -0.0390642807f, -0.0272102132f,
+         -0.0190039128f, -0.0133119002f, -0.0073956437f, -0.0041290298f,
+         -0.0023122653f, -0.0012971871f, -0.0000000075f},
+        {-0.0000000037f, -0.0007926486f, -0.0014115572f, -0.0025163069f,
+         -0.0044930279f, -0.0080412179f, -0.0114155896f, -0.0162114650f,
+         -0.0229923278f, -0.0324336179f, -0.0450868085f, -0.0552201346f,
+         -0.0660551935f, -0.0763022304f, -0.0853320658f, -0.0887728930f,
+         -0.0853320807f, -0.0763022304f, -0.0660551935f, -0.0552201308f,
+         -0.0450868122f, -0.0324336141f, -0.0229923241f, -0.0162114613f,
+         -0.0114155896f, -0.0080412179f, -0.0044930279f, -0.0025163069f,
+         -0.0014115609f, -0.0007926486f, -0.0000000037f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000075f, 0.0012636185f, 0.0022416152f, 0.0039687753f,
+         0.0070013292f, 0.0122666061f, 0.0170736760f, 0.0235937759f,
+         0.0322411545f, 0.0432920381f, 0.0565523952f, 0.0660799965f,
+         0.0753463656f, 0.0833015144f, 0.0887481645f, 0.0906939134f,
+         0.0887481719f, 0.0833015069f, 0.0753463805f, 0.0660799891f,
+         0.0565523952f, 0.0432920381f, 0.0322411582f, 0.0235937759f,
+         0.0170736797f, 0.0122666061f, 0.0070013292f, 0.0039687753f,
+         0.0022416152f, 0.0012636185f, 0.0000000075f},
+        {0.0000000112f, 0.0021195263f, 0.0037540123f, 0.0066280924f,
+         0.0116370060f, 0.0202258043f, 0.0279547423f, 0.0382792614f,
+         0.0517152064f, 0.0685065836f, 0.0881702006f, 0.1020170972f,
+         0.1152879074f, 0.1265430748f, 0.1341825128f, 0.1368993223f,
+         0.1341825277f, 0.1265430599f, 0.1152879149f, 0.1020170972f,
+         0.0881702006f, 0.0685065836f, 0.0517152064f, 0.0382792577f,
+         0.0279547460f, 0.0202258043f, 0.0116370060f, 0.0066280924f,
+         0.0037540123f, 0.0021195263f, 0.0000000112f}},
     {
-        {0,   0,  0,  0,  1,  1, 2, 3, 4, 7, 13, 21, 39, 91, 367, -858993460,
-         367, 91, 39, 21, 13, 7, 4, 3, 2, 1, 1,  0,  0,  0,  0},
-        {0,   0,  0,  0,  1,  1, 2, 3, 4, 7, 11, 18, 29, 54, 102, 145,
-         102, 54, 29, 18, 11, 7, 4, 3, 2, 1, 1,  0,  0,  0,  0},
-        {0,  0,  0,  0,  1, 1, 2, 2, 4, 5, 9, 13, 20, 31, 44, 52,
-         44, 31, 20, 13, 9, 5, 4, 2, 2, 1, 1, 0,  0,  0,  0},
-        {0,  0,  0, 0, 0, 1, 1, 2, 2, 3, 5, 7, 9, 12, 14, 15,
-         14, 12, 9, 7, 5, 3, 2, 2, 1, 1, 0, 0, 0, 0,  0},
-        {0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 3, 4, 5, 5, 6,
-         5, 5, 4, 3, 3, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0,  0,  0,  0,  0,  -1, -1, -1, -2, -3, -3, -4, -5, -5, -5, -5,
-         -5, -5, -5, -4, -3, -3, -2, -1, -1, -1, 0,  0,  0,  0,  0},
-        {0,  0,  0,  0,  -1, -1, -2, -2, -3, -4, -5, -6, -7, -8, -8, -8,
-         -8, -8, -7, -6, -5, -4, -3, -2, -2, -1, -1, 0,  0,  0,  0},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000037f, 0.0000000037f, 0.0000000075f, 0.0000000112f,
+         0.0000000149f, 0.0000000261f, 0.0000000484f, 0.0000000782f,
+         0.0000001453f, 0.0000003390f, 0.0000013672f, -3.2000000477f,
+         0.0000013672f, 0.0000003390f, 0.0000001453f, 0.0000000782f,
+         0.0000000484f, 0.0000000261f, 0.0000000149f, 0.0000000112f,
+         0.0000000075f, 0.0000000037f, 0.0000000037f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000037f, 0.0000000037f, 0.0000000075f, 0.0000000112f,
+         0.0000000149f, 0.0000000261f, 0.0000000410f, 0.0000000671f,
+         0.0000001080f, 0.0000002012f, 0.0000003800f, 0.0000005402f,
+         0.0000003800f, 0.0000002012f, 0.0000001080f, 0.0000000671f,
+         0.0000000410f, 0.0000000261f, 0.0000000149f, 0.0000000112f,
+         0.0000000075f, 0.0000000037f, 0.0000000037f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000037f, 0.0000000037f, 0.0000000075f, 0.0000000075f,
+         0.0000000149f, 0.0000000186f, 0.0000000335f, 0.0000000484f,
+         0.0000000745f, 0.0000001155f, 0.0000001639f, 0.0000001937f,
+         0.0000001639f, 0.0000001155f, 0.0000000745f, 0.0000000484f,
+         0.0000000335f, 0.0000000186f, 0.0000000149f, 0.0000000075f,
+         0.0000000075f, 0.0000000037f, 0.0000000037f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000037f, 0.0000000037f, 0.0000000075f,
+         0.0000000075f, 0.0000000112f, 0.0000000186f, 0.0000000261f,
+         0.0000000335f, 0.0000000447f, 0.0000000522f, 0.0000000559f,
+         0.0000000522f, 0.0000000447f, 0.0000000335f, 0.0000000261f,
+         0.0000000186f, 0.0000000112f, 0.0000000075f, 0.0000000075f,
+         0.0000000037f, 0.0000000037f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000037f, 0.0000000037f,
+         0.0000000037f, 0.0000000075f, 0.0000000112f, 0.0000000112f,
+         0.0000000149f, 0.0000000186f, 0.0000000186f, 0.0000000224f,
+         0.0000000186f, 0.0000000186f, 0.0000000149f, 0.0000000112f,
+         0.0000000112f, 0.0000000075f, 0.0000000037f, 0.0000000037f,
+         0.0000000037f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000000f,  0.0000000000f,  0.0000000000f,  0.0000000000f,
+         0.0000000000f,  -0.0000000037f, -0.0000000037f, -0.0000000037f,
+         -0.0000000075f, -0.0000000112f, -0.0000000112f, -0.0000000149f,
+         -0.0000000186f, -0.0000000186f, -0.0000000186f, -0.0000000186f,
+         -0.0000000186f, -0.0000000186f, -0.0000000186f, -0.0000000149f,
+         -0.0000000112f, -0.0000000112f, -0.0000000075f, -0.0000000037f,
+         -0.0000000037f, -0.0000000037f, 0.0000000000f,  0.0000000000f,
+         0.0000000000f,  0.0000000000f,  0.0000000000f},
+        {0.0000000000f,  0.0000000000f,  0.0000000000f,  0.0000000000f,
+         -0.0000000037f, -0.0000000037f, -0.0000000075f, -0.0000000075f,
+         -0.0000000112f, -0.0000000149f, -0.0000000186f, -0.0000000224f,
+         -0.0000000261f, -0.0000000298f, -0.0000000298f, -0.0000000298f,
+         -0.0000000298f, -0.0000000298f, -0.0000000261f, -0.0000000224f,
+         -0.0000000186f, -0.0000000149f, -0.0000000112f, -0.0000000075f,
+         -0.0000000075f, -0.0000000037f, -0.0000000037f, 0.0000000000f,
+         0.0000000000f,  0.0000000000f,  0.0000000000f}},
     {
-        {3,         580676,    1036777,   1856927,   3344305,   6082085,
-         8773674,   12764179,  18791313,  30111279,  52494259,  80589378,
-         131965557, 232564021, 416579217, 562298173, 416579430, 232563941,
-         131965610, 80589391,  52494265,  30111279,  18791313,  12764177,
-         8773674,   6082085,   3344306,   1856927,   1036778,   580676,
-         3},
-        {3,         543913,    970885,    1738082,   3127513,   5678283,
-         8177065,   11864205,  17389754,  27104436,  45909902,  68054265,
-         104838284, 165555556, 249179381, 298573513, 249179434, 165555543,
-         104838318, 68054278,  45909902,  27104436,  17389756,  11864203,
-         8177066,   5678283,   3127513,   1738082,   970885,    543913,
-         3},
-        {3,        488046,    870816,    1557814,   2799416,   5069821,
-         7282153,  10523969,  15327601,  22959076,  37422716,  53115965,
-         76430438, 108848611, 144319557, 161563263, 144319610, 108848597,
-         76430458, 53115962,  37422722,  22959074,  15327601,  10523968,
-         7282155,  5069821,   2799416,   1557814,   870816,    488046,
-         3},
-        {2,        348211,   620693,   1108378,  1985253,  3573386,  5101323,
-         7304185,  10486235, 15063092, 21722294, 28584443, 37112666, 46532689,
-         54556952, 57822705, 54556949, 46532682, 37112676, 28584443, 21722296,
-         15063092, 10486236, 7304185,  5101323,  3573385,  1985253,  1108378,
-         620693,   348211,   2},
-        {1,        212775,   378912,   675465,   1206088,  2158547,  3064349,
-         4351731,  6171955,  8706331,  12102897, 14823040, 17731552, 20482220,
-         22906149, 23829786, 22906153, 20482220, 17731554, 14823040, 12102898,
-         8706331,  6171954,  4351731,  3064349,  2158547,  1206088,  675466,
-         378912,   212775,   1},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-2,        -339200,   -601729,   -1065360,  -1879405,  -3292791,
-         -4583180,  -6333406,  -8654668,  -11621117, -15180664, -17738211,
-         -20225634, -22361078, -23823152, -24345457, -23823152, -22361075,
-         -20225636, -17738211, -15180665, -11621117, -8654668,  -6333405,
-         -4583180,  -3292791,  -1879405,  -1065360,  -601729,   -339200,
-         -2},
-        {-3,        -568956,   -1007709,  -1779214,  -3123784,  -5429322,
-         -7504043,  -10275508, -13882193, -18389592, -23668005, -27385003,
-         -30947359, -33968641, -36019338, -36748625, -36019341, -33968638,
-         -30947359, -27385003, -23668005, -18389591, -13882193, -10275507,
-         -7504044,  -5429322,  -3123785,  -1779214,  -1007709,  -568956,
-         -3},
-    },
+
+        {0.0000000112f, 0.0021631867f, 0.0038622953f, 0.0069175921f,
+         0.0124585070f, 0.0226575322f, 0.0326844826f, 0.0475502722f,
+         0.0700030923f, 0.1121732593f, 0.1955563575f, 0.3002188206f,
+         0.4916100204f, 0.8663684726f, 1.5518785715f, 2.0947239399f,
+         1.5518792868f, 0.8663681746f, 0.4916101992f, 0.3002188802f,
+         0.1955563724f, 0.1121732593f, 0.0700030923f, 0.0475502647f,
+         0.0326844826f, 0.0226575322f, 0.0124585107f, 0.0069175921f,
+         0.0038622990f, 0.0021631867f, 0.0000000112f},
+        {0.0000000112f, 0.0020262338f, 0.0036168285f, 0.0064748600f,
+         0.0116508938f, 0.0211532526f, 0.0304619409f, 0.0441976078f,
+         0.0647818819f, 0.1009718925f, 0.1710277200f, 0.2535218894f,
+         0.3905530572f, 0.6167424917f, 0.9282655120f, 1.1122729778f,
+         0.9282657504f, 0.6167424321f, 0.3905531764f, 0.2535219491f,
+         0.1710277200f, 0.1009718925f, 0.0647818893f, 0.0441976003f,
+         0.0304619446f, 0.0211532526f, 0.0116508938f, 0.0064748600f,
+         0.0036168285f, 0.0020262338f, 0.0000000112f},
+        {0.0000000112f, 0.0018181130f, 0.0032440424f, 0.0058033094f,
+         0.0104286373f, 0.0188865550f, 0.0271281339f, 0.0392048396f,
+         0.0570997633f, 0.0855292231f, 0.1394104809f, 0.1978723854f,
+         0.2847255766f, 0.4054926634f, 0.5376322269f, 0.6018700600f,
+         0.5376324654f, 0.4054926336f, 0.2847256362f, 0.1978723705f,
+         0.1394104958f, 0.0855292156f, 0.0570997633f, 0.0392048359f,
+         0.0271281414f, 0.0188865550f, 0.0104286373f, 0.0058033094f,
+         0.0032440424f, 0.0018181130f, 0.0000000112f},
+        {0.0000000075f, 0.0012971871f, 0.0023122616f, 0.0041290298f,
+         0.0073956437f, 0.0133119002f, 0.0190039091f, 0.0272102095f,
+         0.0390642695f, 0.0561143905f, 0.0809218511f, 0.1064853519f,
+         0.1382554471f, 0.1733477712f, 0.2032404840f, 0.2154063582f,
+         0.2032404691f, 0.1733477414f, 0.1382554919f, 0.1064853519f,
+         0.0809218585f, 0.0561143905f, 0.0390642732f, 0.0272102095f,
+         0.0190039091f, 0.0133118965f, 0.0073956437f, 0.0041290298f,
+         0.0023122616f, 0.0012971871f, 0.0000000075f},
+        {0.0000000037f, 0.0007926486f, 0.0014115572f, 0.0025163032f,
+         0.0044930279f, 0.0080412142f, 0.0114155896f, 0.0162114613f,
+         0.0229923241f, 0.0324336104f, 0.0450868048f, 0.0552201271f,
+         0.0660551786f, 0.0763022155f, 0.0853320509f, 0.0887728706f,
+         0.0853320658f, 0.0763022155f, 0.0660551861f, 0.0552201271f,
+         0.0450868085f, 0.0324336104f, 0.0229923204f, 0.0162114613f,
+         0.0114155896f, 0.0080412142f, 0.0044930279f, 0.0025163069f,
+         0.0014115572f, 0.0007926486f, 0.0000000037f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {-0.0000000075f, -0.0012636185f, -0.0022416152f, -0.0039687753f,
+         -0.0070013292f, -0.0122666024f, -0.0170736760f, -0.0235937759f,
+         -0.0322411507f, -0.0432920344f, -0.0565523803f, -0.0660799891f,
+         -0.0753463581f, -0.0833015069f, -0.0887481570f, -0.0906938910f,
+         -0.0887481570f, -0.0833014995f, -0.0753463656f, -0.0660799891f,
+         -0.0565523840f, -0.0432920344f, -0.0322411507f, -0.0235937722f,
+         -0.0170736760f, -0.0122666024f, -0.0070013292f, -0.0039687753f,
+         -0.0022416152f, -0.0012636185f, -0.0000000075f},
+        {-0.0000000112f, -0.0021195263f, -0.0037540086f, -0.0066280887f,
+         -0.0116370022f, -0.0202258006f, -0.0279547386f, -0.0382792503f,
+         -0.0517151989f, -0.0685065687f, -0.0881701857f, -0.1020170897f,
+         -0.1152879000f, -0.1265430450f, -0.1341824830f, -0.1368992925f,
+         -0.1341824979f, -0.1265430450f, -0.1152879000f, -0.1020170897f,
+         -0.0881701857f, -0.0685065687f, -0.0517151989f, -0.0382792465f,
+         -0.0279547423f, -0.0202258006f, -0.0116370060f, -0.0066280887f,
+         -0.0037540086f, -0.0021195263f, -0.0000000112f}},
     {
-        {6,         1071630,   1911498,   3417563,   6135013,   11088914,
-         15896313,  22903491,  33199122,  48417342,  76625352,  105748897,
-         146157663, 197317649, 247522954, 270025220, 247523007, 197317609,
-         146157677, 105748911, 76625358,  48417339,  33199122,  22903489,
-         15896315,  11088914,  6135014,   3417563,   1911498,   1071630,
-         6},
-        {6,         1003864,   1790265,   3199659,   5740058,   10362246,
-         14836235,  21336046,  30836947,  44762529,  68827352,  93516444,
-         126532850, 166393343, 203549915, 219611675, 203549942, 166393329,
-         126532890, 93516458,  68827345,  44762533,  30836947,  21336044,
-         14836238,  10362246,  5740058,   3199659,   1790265,   1003864,
-         6},
-        {5,         900860,    1606086,   2868917,   5141592,   9264643,
-         13240197,  18987806,  27325827,  39399651,  58130785,  77340471,
-         101814498, 129653024, 154062530, 164186529, 154062570, 129653010,
-         101814518, 77340465,  58130799,  39399651,  27325825,  18987804,
-         13240199,  9264643,   5141593,   2868916,   1606086,   900860,
-         5},
-        {4,        642936,   1145384,  2043195,  3652724,  6551933,  9321545,
-         13279574, 18921455, 26872435, 37720428, 46584834, 57725379, 69582952,
-         78984425, 82641458, 78984418, 69582945, 57725385, 46584838, 37720430,
-         26872435, 18921455, 13279574, 9321546,  6551933,  3652724,  2043195,
-         1145384,  642936,   4},
-        {2,        392979,   699578,   1246311,  2222848,  3970080,  5624911,
-         7965245,  11250448, 15776818, 21752506, 26460378, 31414826, 35997601,
-         39328568, 40559278, 39328574, 35997598, 31414830, 26460379, 21752508,
-         15776818, 11250448, 7965244,  5624912,  3970080,  2222848,  1246312,
-         699578,   392979,   2},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-4,        -627208,   -1113257,  -1972926,  -3486308,  -6125748,
-         -8548319,  -11853212, -16268999, -21963760, -28868934, -33875539,
-         -38778795, -43013409, -45925473, -46968213, -45925477, -43013404,
-         -38778795, -33875539, -28868932, -21963758, -16269000, -11853212,
-         -8548319,  -6125747,  -3486308,  -1972926,  -1113257,  -627208,
-         -4},
-        {-6,        -1052552,  -1865940,  -3299774,  -5809354,  -10143366,
-         -14075579, -19373580, -26341292, -35156400, -45615994, -53060594,
-         -60250430, -66386576, -70569981, -72061118, -70569981, -66386576,
-         -60250430, -53060594, -45615994, -35156400, -26341290, -19373580,
-         -14075582, -10143365, -5809354,  -3299775,  -1865940,  -1052552,
-         -6},
-    },
+
+        {0.0000000224f, 0.0039921328f, 0.0071208850f, 0.0127314143f,
+         0.0228547044f, 0.0413094237f, 0.0592183806f, 0.0853221565f,
+         0.1236763671f, 0.1803686619f, 0.2854516804f, 0.3939453363f,
+         0.5444797277f, 0.7350655198f, 0.9220948815f, 1.0059223175f,
+         0.9220950603f, 0.7350654006f, 0.5444797873f, 0.3939453959f,
+         0.2854517102f, 0.1803686470f, 0.1236763671f, 0.0853221416f,
+         0.0592183881f, 0.0413094237f, 0.0228547081f, 0.0127314143f,
+         0.0071208850f, 0.0039921328f, 0.0000000224f},
+        {0.0000000224f, 0.0037396848f, 0.0066692568f, 0.0119196586f,
+         0.0213833824f, 0.0386023745f, 0.0552692823f, 0.0794829652f,
+         0.1148765832f, 0.1667534113f, 0.2564018667f, 0.3483759165f,
+         0.4713715911f, 0.6198635101f, 0.7582825422f, 0.8181172609f,
+         0.7582826018f, 0.6198634505f, 0.4713717401f, 0.3483759463f,
+         0.2564018369f, 0.1667534262f, 0.1148765832f, 0.0794829577f,
+         0.0552692935f, 0.0386023745f, 0.0213833824f, 0.0119196586f,
+         0.0066692568f, 0.0037396848f, 0.0000000224f},
+        {0.0000000186f, 0.0033559650f, 0.0059831366f, 0.0106875487f,
+         0.0191539228f, 0.0345134847f, 0.0493235774f, 0.0707350895f,
+         0.1017966419f, 0.1467751414f, 0.2165540457f, 0.2881157100f,
+         0.3792885542f, 0.4829951525f, 0.5739276409f, 0.6116424799f,
+         0.5739278197f, 0.4829950929f, 0.3792886436f, 0.2881156802f,
+         0.2165541053f, 0.1467751414f, 0.1017966270f, 0.0707350820f,
+         0.0493235849f, 0.0345134847f, 0.0191539265f, 0.0106875449f,
+         0.0059831366f, 0.0033559650f, 0.0000000186f},
+        {0.0000000149f, 0.0023951232f, 0.0042668879f, 0.0076114945f,
+         0.0136074573f, 0.0244078524f, 0.0347254612f, 0.0494702682f,
+         0.0704879165f, 0.1001076251f, 0.1405195445f, 0.1735420227f,
+         0.2150437981f, 0.2592166960f, 0.2942399085f, 0.3078634143f,
+         0.2942398787f, 0.2592166662f, 0.2150438130f, 0.1735420525f,
+         0.1405195594f, 0.1001076251f, 0.0704879165f, 0.0494702682f,
+         0.0347254649f, 0.0244078524f, 0.0136074573f, 0.0076114945f,
+         0.0042668879f, 0.0023951232f, 0.0000000149f},
+        {0.0000000075f, 0.0014639609f, 0.0026061311f, 0.0046428703f,
+         0.0082807541f, 0.0147897005f, 0.0209544264f, 0.0296728499f,
+         0.0419111848f, 0.0587732270f, 0.0810343996f, 0.0985725895f,
+         0.1170293465f, 0.1341015100f, 0.1465103328f, 0.1510950923f,
+         0.1465103626f, 0.1341015100f, 0.1170293614f, 0.0985725969f,
+         0.0810344070f, 0.0587732270f, 0.0419111848f, 0.0296728462f,
+         0.0209544301f, 0.0147897005f, 0.0082807541f, 0.0046428740f,
+         0.0026061311f, 0.0014639609f, 0.0000000075f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {-0.0000000149f, -0.0023365319f, -0.0041472055f, -0.0073497221f,
+         -0.0129875094f, -0.0228201896f, -0.0318449698f, -0.0441566557f,
+         -0.0606067441f, -0.0818213820f, -0.1075451598f, -0.1261962205f,
+         -0.1444622725f, -0.1602374315f, -0.1710857153f, -0.1749702245f,
+         -0.1710857302f, -0.1602374166f, -0.1444622725f, -0.1261962205f,
+         -0.1075451523f, -0.0818213746f, -0.0606067479f, -0.0441566557f,
+         -0.0318449698f, -0.0228201859f, -0.0129875094f, -0.0073497221f,
+         -0.0041472055f, -0.0023365319f, -0.0000000149f},
+        {-0.0000000224f, -0.0039210618f, -0.0069511682f, -0.0122926161f,
+         -0.0216415301f, -0.0377869830f, -0.0524356179f, -0.0721722096f,
+         -0.0981289595f, -0.1309677958f, -0.1699328125f, -0.1976661086f,
+         -0.2244503498f, -0.2473092675f, -0.2628936768f, -0.2684485912f,
+         -0.2628936768f, -0.2473092675f, -0.2244503498f, -0.1976661086f,
+         -0.1699328125f, -0.1309677958f, -0.0981289521f, -0.0721722096f,
+         -0.0524356291f, -0.0377869792f, -0.0216415301f, -0.0122926198f,
+         -0.0069511682f, -0.0039210618f, -0.0000000224f}},
     {
-        {8,         1397585,   2489316,   4439077,   7931147,   14210400,
-         20195533,  28725381,  40834574,  57795937,  80727756,  99273505,
-         119386770, 142482397, 160470916, 167392556, 160470930, 142482397,
-         119386770, 99273512,  80727763,  57795937,  40834574,  28725377,
-         20195535,  14210399,  7931147,   4439077,   2489316,   1397584,
-         8},
-        {7,         1309358,   2331922,   4157610,   7425691,   13296383,
-         18885003,  26837457,  38101253,  53825212,  74978579,  91990888,
-         110257650, 129210677, 144934930, 150951463, 144934930, 129210664,
-         110257648, 91990895,  74978579,  53825212,  38101253,  26837453,
-         18885005,  13296383,  7425691,   4157609,   2331922,   1309358,
-         7},
-        {7,        1175217,   2092681,   3729980,   6658433,   11911178,
-         16901999, 23987347,  33988892,  47881081,  66434656,  81236414,
-         97003508, 111774386, 123343330, 128186677, 123343330, 111774379,
-         97003515, 81236414,  66434672,  47881077,  33988888,  23987345,
-         16901999, 11911179,  6658434,   3729980,   2092681,   1175217,
-         7},
-        {5,        839113,   1493583,  2660218,  4742594,  8463941,  11983129,
-         16951064, 23906434, 33453557, 45991133, 55813174, 66094533, 75552445,
-         82394424, 84915284, 82394424, 75552445, 66094548, 55813174, 45991133,
-         33453557, 23906436, 16951064, 11983129, 8463941,  4742594,  2660218,
-         1493583,  839113,   5},
-        {3,        513107,   912949,   1624911,  2893228,  5151802,  7278195,
-         10264146, 14413251, 20048070, 27340206, 32966174, 38772413, 44037903,
-         47801358, 49178236, 47801358, 44037903, 38772413, 32966174, 27340206,
-         20048066, 14413251, 10264145, 7278196,  5151802,  2893229,  1624911,
-         912949,   513107,   3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-5,        -820365,   -1457305,  -2586425,  -4582112,  -8086862,
-         -11330425, -15796197, -21835644, -29744455, -39510832, -46709311,
-         -53851837, -60092063, -64420965, -65978350, -64420972, -60092058,
-         -53851841, -46709311, -39510837, -29744455, -21835644, -15796194,
-         -11330427, -8086862,  -4582112,  -2586425,  -1457305,  -820365,
-         -5},
-        {-8,        -1377696,  -2445727,   -4335584,   -7665132,   -13479891,
-         -18825424, -26130668, -35913775,  -48566394,  -63959470,  -75153128,
-         -86140892, -95649238, -102197714, -104544419, -102197714, -95649247,
-         -86140892, -75153132, -63959470,  -48566394,  -35913771,  -26130665,
-         -18825426, -13479892, -7665133,   -4335584,   -2445727,   -1377696,
-         -8},
-    },
+
+        {0.0000000298f, 0.0052064098f, 0.0092734247f, 0.0165368505f,
+         0.0295458250f, 0.0529378653f, 0.0752342194f, 0.1070103794f,
+         0.1521206498f, 0.2153066397f, 0.3007343411f, 0.3698226213f,
+         0.4447503686f, 0.5307883024f, 0.5978007317f, 0.6235858798f,
+         0.5978007913f, 0.5307883024f, 0.4447503686f, 0.3698226511f,
+         0.3007343411f, 0.2153066397f, 0.1521206498f, 0.1070103645f,
+         0.0752342343f, 0.0529378615f, 0.0295458250f, 0.0165368505f,
+         0.0092734247f, 0.0052064061f, 0.0000000298f},
+        {0.0000000261f, 0.0048777387f, 0.0086870864f, 0.0154883042f,
+         0.0276628546f, 0.0495328866f, 0.0703521222f, 0.0999773145f,
+         0.1419382244f, 0.2005145401f, 0.2793169618f, 0.3426927626f,
+         0.4107417464f, 0.4813472927f, 0.5399246812f, 0.5623379946f,
+         0.5399246812f, 0.4813472331f, 0.4107417464f, 0.3426927924f,
+         0.2793169618f, 0.2005145401f, 0.1419382244f, 0.0999772996f,
+         0.0703521222f, 0.0495328866f, 0.0276628546f, 0.0154883005f,
+         0.0086870864f, 0.0048777387f, 0.0000000261f},
+        {0.0000000261f, 0.0043780245f, 0.0077958442f, 0.0138952583f,
+         0.0248045959f, 0.0443725958f, 0.0629648566f, 0.0893598348f,
+         0.1266184896f, 0.1783709228f, 0.2474883795f, 0.3026292324f,
+         0.3613662124f, 0.4163920283f, 0.4594897032f, 0.4775325954f,
+         0.4594897032f, 0.4163919985f, 0.3613662422f, 0.3026292324f,
+         0.2474884391f, 0.1783709079f, 0.1266184747f, 0.0893598199f,
+         0.0629648566f, 0.0443725996f, 0.0248045996f, 0.0138952583f,
+         0.0077958442f, 0.0043780245f, 0.0000000261f},
+        {0.0000000186f, 0.0031259395f, 0.0055640303f, 0.0099100843f,
+         0.0176675394f, 0.0315306373f, 0.0446406342f, 0.0631476343f,
+         0.0890584067f, 0.1246242076f, 0.1713303179f, 0.2079202831f,
+         0.2462213188f, 0.2814548016f, 0.3069431484f, 0.3163340688f,
+         0.3069431484f, 0.2814548016f, 0.2462213784f, 0.2079202831f,
+         0.1713303179f, 0.1246242076f, 0.0890584141f, 0.0631476343f,
+         0.0446406342f, 0.0315306373f, 0.0176675394f, 0.0099100843f,
+         0.0055640303f, 0.0031259395f, 0.0000000186f},
+        {0.0000000112f, 0.0019114725f, 0.0034010001f, 0.0060532652f,
+         0.0107781142f, 0.0191919580f, 0.0271133892f, 0.0382369235f,
+         0.0536935441f, 0.0746848807f, 0.1018502042f, 0.1228085682f,
+         0.1444384903f, 0.1640539765f, 0.1780739427f, 0.1832032055f,
+         0.1780739427f, 0.1640539765f, 0.1444384903f, 0.1228085682f,
+         0.1018502042f, 0.0746848658f, 0.0536935441f, 0.0382369198f,
+         0.0271133929f, 0.0191919580f, 0.0107781179f, 0.0060532652f,
+         0.0034010001f, 0.0019114725f, 0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {-0.0000000186f, -0.0030560978f, -0.0054288842f, -0.0096351840f,
+         -0.0170696974f, -0.0301259086f, -0.0422091223f, -0.0588454194f,
+         -0.0813441128f, -0.1108067334f, -0.1471893191f, -0.1740057468f,
+         -0.2006137222f, -0.2238603830f, -0.2399867922f, -0.2457885146f,
+         -0.2399868220f, -0.2238603532f, -0.2006137371f, -0.1740057468f,
+         -0.1471893340f, -0.1108067334f, -0.0813441128f, -0.0588454083f,
+         -0.0422091298f, -0.0301259086f, -0.0170696974f, -0.0096351840f,
+         -0.0054288842f, -0.0030560978f, -0.0000000186f},
+        {-0.0000000298f, -0.0051323175f, -0.0091110431f, -0.0161513090f,
+         -0.0285548419f, -0.0502165072f, -0.0701301694f, -0.0973443240f,
+         -0.1337892413f, -0.1809239089f, -0.2382676005f, -0.2799672186f,
+         -0.3208998442f, -0.3563211858f, -0.3807161450f, -0.3894582987f,
+         -0.3807161450f, -0.3563212156f, -0.3208998442f, -0.2799672484f,
+         -0.2382676005f, -0.1809239089f, -0.1337892264f, -0.0973443091f,
+         -0.0701301768f, -0.0502165109f, -0.0285548456f, -0.0161513090f,
+         -0.0091110431f, -0.0051323175f, -0.0000000298f}},
     {
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {8,         1414379,   2514989,   4471386,   7945941,   14099648,
-         19853990,  27870592,  38887072,  53621760,  72308072,  86434552,
-         100752688, 113511272, 122500216, 125762008, 122500216, 113511272,
-         100752696, 86434560,  72308072,  53621760,  38887072,  27870588,
-         19853994,  14099649,  7945942,   4471386,   2514989,   1414379,
-         8},
-        {7,        1269741,   2257800,   4014131,   7133370,   12657783,
-         17823674, 25020474,  34910384,  48138264,  64913664,  77595552,
-         90449464, 101903328, 109973032, 112901272, 109973040, 101903328,
-         90449472, 77595544,  64913668,  48138264,  34910384,  25020472,
-         17823674, 12657783,  7133370,   4014131,   2257800,   1269741,
-         7},
-        {5,        907074,   1612921,  2867604,  5095918,  9042434,  12732830,
-         17874062, 24939188, 34388892, 46372856, 55432508, 64615056, 72797440,
-         78562256, 80654120, 78562256, 72797432, 64615064, 55432508, 46372860,
-         34388892, 24939190, 17874060, 12732831, 9042434,  5095919,  2867604,
-         1612921,  907074,   5},
-        {3,        554944,   986777,   1754387,  3117658,  5532118,  7789884,
-         10935266, 15257677, 21038960, 28370692, 33913340, 39531184, 44537124,
-         48064012, 49343804, 48064012, 44537124, 39531188, 33913344, 28370694,
-         21038958, 15257676, 10935264, 7789885,  5532118,  3117659,  1754387,
-         986777,   554944,   3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-5,        -889081,   -1580927,  -2810721,  -4994834,  -8863066,
-         -12480257, -17519508, -24444488, -33706744, -45452992, -54332928,
-         -63333332, -71353408, -77003864, -79054240, -77003872, -71353400,
-         -63333336, -54332932, -45452992, -33706744, -24444488, -17519506,
-         -12480258, -8863066,  -4994834,  -2810722,  -1580927,  -889081,
-         -5},
-        {-8,         -1494381,   -2657245,   -4724303,   -8395391,   -14897174,
-         -20977002,  -29447048,  -41086664,  -56654796,  -76398072,  -91323608,
-         -106451616, -119931880, -129429256, -132875552, -129429264, -119931872,
-         -106451624, -91323608,  -76398072,  -56654796,  -41086660,  -29447048,
-         -20977004,  -14897174,  -8395392,   -4724303,   -2657245,   -1494381,
-         -8},
-    },
+
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000298f, 0.0052689724f, 0.0093690641f, 0.0166572109f,
+         0.0296009369f, 0.0525252819f, 0.0739618763f, 0.1038260460f,
+         0.1448656321f, 0.1997566223f, 0.2693685591f, 0.3219937980f,
+         0.3753330112f, 0.4228624403f, 0.4563488662f, 0.4684999883f,
+         0.4563488662f, 0.4228624403f, 0.3753330410f, 0.3219938278f,
+         0.2693685591f, 0.1997566223f, 0.1448656321f, 0.1038260311f,
+         0.0739618912f, 0.0525252856f, 0.0296009406f, 0.0166572109f,
+         0.0093690641f, 0.0052689724f, 0.0000000298f},
+        {0.0000000261f, 0.0047301538f, 0.0084109604f, 0.0149538033f,
+         0.0265738741f, 0.0471539162f, 0.0663983598f, 0.0932085291f,
+         0.1300513148f, 0.1793290079f, 0.2418222427f, 0.2890659571f,
+         0.3369505107f, 0.3796194792f, 0.4096814692f, 0.4205900133f,
+         0.4096814990f, 0.3796194792f, 0.3369505405f, 0.2890659273f,
+         0.2418222576f, 0.1793290079f, 0.1300513148f, 0.0932085216f,
+         0.0663983598f, 0.0471539162f, 0.0265738741f, 0.0149538033f,
+         0.0084109604f, 0.0047301538f, 0.0000000261f},
+        {0.0000000186f, 0.0033791140f, 0.0060085990f, 0.0106826574f,
+         0.0189837739f, 0.0336856917f, 0.0474334881f, 0.0665860698f,
+         0.0929057151f, 0.1281086057f, 0.1727523506f, 0.2065021843f,
+         0.2407098413f, 0.2711915970f, 0.2926672101f, 0.3004600108f,
+         0.2926672101f, 0.2711915672f, 0.2407098711f, 0.2065021843f,
+         0.1727523655f, 0.1281086057f, 0.0929057226f, 0.0665860623f,
+         0.0474334918f, 0.0336856917f, 0.0189837776f, 0.0106826574f,
+         0.0060085990f, 0.0033791140f, 0.0000000186f},
+        {0.0000000112f, 0.0020673275f, 0.0036760308f, 0.0065356009f,
+         0.0116141811f, 0.0206087455f, 0.0290195793f, 0.0407370403f,
+         0.0568392761f, 0.0783762336f, 0.1056890637f, 0.1263370365f,
+         0.1472651362f, 0.1659137160f, 0.1790523976f, 0.1838199943f,
+         0.1790523976f, 0.1659137160f, 0.1472651511f, 0.1263370514f,
+         0.1056890711f, 0.0783762261f, 0.0568392724f, 0.0407370329f,
+         0.0290195830f, 0.0206087455f, 0.0116141848f, 0.0065356009f,
+         0.0036760308f, 0.0020673275f, 0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {-0.0000000186f, -0.0033120848f, -0.0058894120f, -0.0104707517f,
+         -0.0186072066f, -0.0330174938f, -0.0464925803f, -0.0652652532f,
+         -0.0910628140f, -0.1255674064f, -0.1693255901f, -0.2024059296f,
+         -0.2359350473f, -0.2658121586f, -0.2868617475f, -0.2944999933f,
+         -0.2868617773f, -0.2658121288f, -0.2359350622f, -0.2024059445f,
+         -0.1693255901f, -0.1255674064f, -0.0910628140f, -0.0652652457f,
+         -0.0464925840f, -0.0330174938f, -0.0186072066f, -0.0104707554f,
+         -0.0058894120f, -0.0033120848f, -0.0000000186f},
+        {-0.0000000298f, -0.0055670030f, -0.0098990090f, -0.0175994001f,
+         -0.0312752686f, -0.0554962978f, -0.0781454220f, -0.1096988022f,
+         -0.1530597508f, -0.2110555619f, -0.2846049964f, -0.3402069509f,
+         -0.3965631723f, -0.4467810690f, -0.4821615517f, -0.4950000048f,
+         -0.4821615815f, -0.4467810392f, -0.3965632021f, -0.3402069509f,
+         -0.2846049964f, -0.2110555619f, -0.1530597359f, -0.1096988022f,
+         -0.0781454295f, -0.0554962978f, -0.0312752724f, -0.0175994001f,
+         -0.0098990090f, -0.0055670030f, -0.0000000298f}},
     {
-        {8,        1391582,  2470337,   4379084,   7741644,   13613249,
-         19010161, 26384295, 36257343,  49022539,  64547234,  75833163,
-         86908844, 96491282, 103089763, 105454176, 103089763, 96491282,
-         86908853, 75833163, 64547238,  49022539,  36257339,  26384293,
-         19010161, 13613249, 7741645,   4379084,   2470337,   1391582,
-         8},
-        {7,        1304089,  2315260,  4104938,  7259320,  12772176, 17844574,
-         24783190, 34086927, 46138445, 60827299, 71526405, 82042242, 91152486,
-         97432080, 99683437, 97432080, 91152486, 82042242, 71526405, 60827303,
-         46138450, 34086925, 24783185, 17844576, 12772176, 7259321,  4104938,
-         2315260,  1304089,  7},
-        {7,        1170970,  2079253,  3687531,  6524358,  11488787, 16063809,
-         22333018, 30758490, 41703962, 55090551, 64871110, 74507473, 82873663,
-         88649667, 90722260, 88649667, 82873663, 74507478, 64871105, 55090551,
-         41703958, 30758487, 22333016, 16063810, 11488788, 6524359,  3687531,
-         2079253,  1170970,  7},
-        {5,        836946,   1486730,  2638556,  4674179,  8248466,  11555710,
-         16108120, 22262872, 30319524, 40263723, 47590046, 54856833, 61203586,
-         65605295, 67188663, 65605295, 61203577, 54856842, 47590051, 40263727,
-         30319524, 22262872, 16108119, 11555711, 8248465,  4674180,  2638556,
-         1486730,  836946,   5},
-        {3,        512296,   910384,   1616803,  2867623,  5071172,  7118297,
-         9948958,  13799293, 18879451, 25211243, 29918726, 34622925, 38759520,
-         41643504, 42683904, 41643508, 38759520, 34622927, 29918726, 25211247,
-         18879449, 13799293, 9948957,  7118298,  5071172,  2867623,  1616803,
-         910384,   512296,   3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-5,        -822447,   -1463889,  -2607236,  -4647839,  -8293870,
-         -11741041, -16605976, -23414447, -32754663, -45010867, -54604470,
-         -64638843, -73862135, -80529791, -82985440, -80529802, -73862128,
-         -64638843, -54604470, -45010867, -32754663, -23414447, -16605974,
-         -11741041, -8293870,  -4647839,  -2607236,  -1463889,  -822447,
-         -5},
-        {-8,         -1383579,   -2464327,   -4394383,   -7850861,   -14065144,
-         -19987153,  -28424958,  -40399126,  -57162277,  -79807994,  -98105864,
-         -117845265, -140317170, -157927676, -164697636, -157927690, -140317157,
-         -117845279, -98105864,  -79807994,  -57162277,  -40399126,  -28424956,
-         -19987155,  -14065143,  -7850863,   -4394383,   -2464328,   -1383579,
-         -8},
-    },
+
+        {0.0000000298f, 0.0051840469f, 0.0092027225f, 0.0163133591f,
+         0.0288398713f, 0.0507133044f, 0.0708183646f, 0.0982891619f,
+         0.1350691319f, 0.1826231927f, 0.2404571772f, 0.2825005352f,
+         0.3237606883f, 0.3594580293f, 0.3840392828f, 0.3928474188f,
+         0.3840392828f, 0.3594580293f, 0.3237607181f, 0.2825005352f,
+         0.2404572070f, 0.1826231927f, 0.1350691170f, 0.0982891470f,
+         0.0708183646f, 0.0507133044f, 0.0288398750f, 0.0163133591f,
+         0.0092027225f, 0.0051840469f, 0.0000000298f},
+        {0.0000000261f, 0.0048581101f, 0.0086250156f, 0.0152920857f,
+         0.0270430744f, 0.0475800633f, 0.0664762184f, 0.0923245773f,
+         0.1269837022f, 0.1718790978f, 0.2265993506f, 0.2664566338f,
+         0.3056311607f, 0.3395694792f, 0.3629627824f, 0.3713497519f,
+         0.3629627824f, 0.3395694792f, 0.3056311607f, 0.2664566338f,
+         0.2265993655f, 0.1718791127f, 0.1269836873f, 0.0923245549f,
+         0.0664762259f, 0.0475800633f, 0.0270430781f, 0.0152920857f,
+         0.0086250156f, 0.0048581101f, 0.0000000261f},
+        {0.0000000261f, 0.0043622032f, 0.0077458210f, 0.0137371235f,
+         0.0243051276f, 0.0427990668f, 0.0598423518f, 0.0831969753f,
+         0.1145843044f, 0.1553593576f, 0.2052282989f, 0.2416637242f,
+         0.2775619626f, 0.3087284565f, 0.3302457333f, 0.3379667401f,
+         0.3302457333f, 0.3087284565f, 0.2775619924f, 0.2416636944f,
+         0.2052282989f, 0.1553593576f, 0.1145842969f, 0.0831969678f,
+         0.0598423555f, 0.0427990705f, 0.0243051313f, 0.0137371235f,
+         0.0077458210f, 0.0043622032f, 0.0000000261f},
+        {0.0000000186f, 0.0031178668f, 0.0055385008f, 0.0098293871f,
+         0.0174126737f, 0.0307279304f, 0.0430483744f, 0.0600074232f,
+         0.0829356611f, 0.1129490286f, 0.1499940604f, 0.1772867441f,
+         0.2043576241f, 0.2280011177f, 0.2443987727f, 0.2502972782f,
+         0.2443987727f, 0.2280010879f, 0.2043576539f, 0.1772867590f,
+         0.1499940753f, 0.1129490286f, 0.0829356611f, 0.0600074194f,
+         0.0430483781f, 0.0307279266f, 0.0174126774f, 0.0098293871f,
+         0.0055385008f, 0.0031178668f, 0.0000000186f},
+        {0.0000000112f, 0.0019084513f, 0.0033914447f, 0.0060230605f,
+         0.0106827281f, 0.0188915879f, 0.0265177228f, 0.0370627567f,
+         0.0514063723f, 0.0703314394f, 0.0939192027f, 0.1114559397f,
+         0.1289804429f, 0.1443904638f, 0.1551341414f, 0.1590099335f,
+         0.1551341563f, 0.1443904638f, 0.1289804578f, 0.1114559397f,
+         0.0939192176f, 0.0703314245f, 0.0514063723f, 0.0370627530f,
+         0.0265177265f, 0.0188915879f, 0.0106827281f, 0.0060230605f,
+         0.0033914447f, 0.0019084513f, 0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {-0.0000000186f, -0.0030638538f, -0.0054534115f, -0.0097127110f,
+         -0.0173145495f, -0.0308970734f, -0.0437387861f, -0.0618620813f,
+         -0.0872256160f, -0.1220206320f, -0.1676785499f, -0.2034175098f,
+         -0.2407984585f, -0.2751578987f, -0.2999968529f, -0.3091448545f,
+         -0.2999968827f, -0.2751578689f, -0.2407984585f, -0.2034175098f,
+         -0.1676785499f, -0.1220206320f, -0.0872256160f, -0.0618620738f,
+         -0.0437387861f, -0.0308970734f, -0.0173145495f, -0.0097127110f,
+         -0.0054534115f, -0.0030638538f, -0.0000000186f},
+        {-0.0000000298f, -0.0051542334f, -0.0091803335f, -0.0163703524f,
+         -0.0292467363f, -0.0523967445f, -0.0744579434f, -0.1058912203f,
+         -0.1504984796f, -0.2129460722f, -0.2973079383f, -0.3654728234f,
+         -0.4390078187f, -0.5227221847f, -0.5883264542f, -0.6135464907f,
+         -0.5883265138f, -0.5227221251f, -0.4390078783f, -0.3654728234f,
+         -0.2973079383f, -0.2129460722f, -0.1504984796f, -0.1058912128f,
+         -0.0744579583f, -0.0523967408f, -0.0292467438f, -0.0163703524f,
+         -0.0091803372f, -0.0051542334f, -0.0000000298f}},
     {
-        {6,        1063142,  1884657,  3332697,  5866781,  10242063, 14210621,
-         19556019, 26583493, 35470370, 46010131, 53508858, 60748887, 66926417,
-         71137316, 72638124, 71137318, 66926416, 60748892, 53508858, 46010131,
-         35470372, 26583491, 19556017, 14210622, 10242063, 5866782,  3332697,
-         1884657,  1063142,  6},
-        {6,        996412,   1766700,  3125152,  5504595,  9619094,  13357673,
-         18402690, 25050711, 33480946, 43509461, 50662435, 57581418, 63494088,
-         67528881, 68967747, 67528880, 63494088, 57581423, 50662440, 43509461,
-         33480946, 25050711, 18402688, 13357674, 9619095,  5504595,  3125152,
-         1766700,  996411,   6},
-        {5,        894855,   1587095,  2808874,  4951864,  8666115,  12050171,
-         16630010, 22687072, 30401455, 39622952, 46227143, 52634611, 58124051,
-         61876873, 63216472, 61876878, 58124046, 52634616, 46227147, 39622956,
-         30401453, 22687072, 16630009, 12050171, 8666116,  4951865,  2808874,
-         1587094,  894855,   5},
-        {4,        639871,   1135693,  2012557,  3555941,  6246901,  8715881,
-         12082770, 16579122, 22374147, 29395768, 34483545, 39463825, 43763098,
-         46718682, 47776819, 46718682, 43763093, 39463829, 34483548, 29395770,
-         22374147, 16579122, 12082770, 8715881,  6246901,  3555942,  2012557,
-         1135693,  639871,   4},
-        {2,        391832,   695950,   1234845,  2186633,  3856010,  5398615,
-         7518850,  10379695, 14115083, 18711422, 22088181, 25429856, 28342458,
-         30359295, 31084165, 30359297, 28342458, 25429858, 22088183, 18711424,
-         14115081, 10379695, 7518850,  5398616,  3856010,  2186634,  1234845,
-         695950,   391832,   2},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-4,        -630153,   -1122569,  -2002361,  -3579289,  -6418785,
-         -9130134,  -13002760, -18518365, -26281781, -36854217, -45475104,
-         -56006945, -67371285, -76348185, -79832098, -76348192, -67371278,
-         -56006952, -45475104, -36854222, -26281779, -18518367, -13002758,
-         -9130135,  -6418785,  -3579289,  -2002362,  -1122569,  -630153,
-         -4},
-        {-6,         -1060871,   -1892248,   -3382952,   -6072245,   -10973304,
-         -15727476,  -22653422,  -32821252,  -47830065,  -75342945,  -103710871,
-         -142829663, -191958009, -239742101, -261023247, -239742154, -191957982,
-         -142829663, -103710864, -75342952,  -47830065,  -32821248,  -22653422,
-         -15727478,  -10973304,  -6072246,   -3382952,   -1892248,   -1060871,
-         -6},
-    },
+
+        {0.0000000224f, 0.0039605126f, 0.0070208944f, 0.0124152638f,
+         0.0218554623f, 0.0381546579f, 0.0529386885f, 0.0728518516f,
+         0.0990312248f, 0.1321374178f, 0.1714010984f, 0.1993360221f,
+         0.2263072431f, 0.2493203282f, 0.2650071383f, 0.2705981135f,
+         0.2650071681f, 0.2493203282f, 0.2263072580f, 0.1993360221f,
+         0.1714010984f, 0.1321374327f, 0.0990312248f, 0.0728518367f,
+         0.0529386923f, 0.0381546579f, 0.0218554661f, 0.0124152638f,
+         0.0070208944f, 0.0039605126f, 0.0000000224f},
+        {0.0000000224f, 0.0037119240f, 0.0065814704f, 0.0116420984f,
+         0.0205062144f, 0.0358339176f, 0.0497612096f, 0.0685553625f,
+         0.0933211744f, 0.1247262433f, 0.1620853692f, 0.1887322813f,
+         0.2145074904f, 0.2365339100f, 0.2515646815f, 0.2569248676f,
+         0.2515646815f, 0.2365339100f, 0.2145075202f, 0.1887322962f,
+         0.1620853692f, 0.1247262433f, 0.0933211744f, 0.0685553551f,
+         0.0497612134f, 0.0358339213f, 0.0205062144f, 0.0116420984f,
+         0.0065814704f, 0.0037119202f, 0.0000000224f},
+        {0.0000000186f, 0.0033335947f, 0.0059123896f, 0.0104638711f,
+         0.0184471309f, 0.0322837941f, 0.0448903851f, 0.0619516149f,
+         0.0845159292f, 0.1132542491f, 0.1476069987f, 0.1722095311f,
+         0.1960792094f, 0.2165289670f, 0.2305093110f, 0.2354997098f,
+         0.2305093408f, 0.2165289521f, 0.1960792243f, 0.1722095460f,
+         0.1476070136f, 0.1132542342f, 0.0845159292f, 0.0619516112f,
+         0.0448903851f, 0.0322837979f, 0.0184471346f, 0.0104638711f,
+         0.0059123859f, 0.0033335947f, 0.0000000186f},
+        {0.0000000149f, 0.0023837052f, 0.0042307861f, 0.0074973591f,
+         0.0132469125f, 0.0232715197f, 0.0324691869f, 0.0450118259f,
+         0.0617620423f, 0.0833501965f, 0.1095077693f, 0.1284612119f,
+         0.1470142007f, 0.1630302370f, 0.1740406454f, 0.1779825240f,
+         0.1740406454f, 0.1630302221f, 0.1470142156f, 0.1284612268f,
+         0.1095077768f, 0.0833501965f, 0.0617620423f, 0.0450118259f,
+         0.0324691869f, 0.0232715197f, 0.0132469162f, 0.0074973591f,
+         0.0042307861f, 0.0023837052f, 0.0000000149f},
+        {0.0000000075f, 0.0014596879f, 0.0025926158f, 0.0046001561f,
+         0.0081458427f, 0.0143647566f, 0.0201114081f, 0.0280098990f,
+         0.0386673771f, 0.0525827818f, 0.0697054788f, 0.0822848827f,
+         0.0947335958f, 0.1055838838f, 0.1130971909f, 0.1157975346f,
+         0.1130971909f, 0.1055838838f, 0.0947336033f, 0.0822848976f,
+         0.0697054863f, 0.0525827743f, 0.0386673771f, 0.0280098990f,
+         0.0201114118f, 0.0143647566f, 0.0081458464f, 0.0046001561f,
+         0.0025926158f, 0.0014596879f, 0.0000000075f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {-0.0000000149f, -0.0023475029f, -0.0041818954f, -0.0074593760f,
+         -0.0133338906f, -0.0239118375f, -0.0340123996f, -0.0484390557f,
+         -0.0689862818f, -0.0979072601f, -0.1372926533f, -0.1694079638f,
+         -0.2086421251f, -0.2509776056f, -0.2844191492f, -0.2973977327f,
+         -0.2844191790f, -0.2509775758f, -0.2086421549f, -0.1694079638f,
+         -0.1372926831f, -0.0979072601f, -0.0689862967f, -0.0484390482f,
+         -0.0340124033f, -0.0239118375f, -0.0133338906f, -0.0074593797f,
+         -0.0041818954f, -0.0023475029f, -0.0000000149f},
+        {-0.0000000224f, -0.0039520524f, -0.0070491731f, -0.0126024783f,
+         -0.0226208754f, -0.0408787429f, -0.0585894138f, -0.0843905732f,
+         -0.1222686917f, -0.1781808734f, -0.2806743383f, -0.3863531053f,
+         -0.5320819616f, -0.7150993347f, -0.8931089044f, -0.9723873734f,
+         -0.8931091428f, -0.7150992155f, -0.5320819616f, -0.3863530755f,
+         -0.2806743681f, -0.1781808734f, -0.1222686768f, -0.0843905732f,
+         -0.0585894212f, -0.0408787429f, -0.0226208791f, -0.0126024783f,
+         -0.0070491731f, -0.0039520524f, -0.0000000224f}},
     {
-        {3,        574674,   1017796,  1796900,  3154467,  5481590,  7575015,
-         10370478, 14006828, 18549080, 23865568, 27607848, 31193405, 34233658,
-         36296899, 37030586, 36296899, 34233658, 31193408, 27607848, 23865571,
-         18549080, 14006828, 10370477, 7575016,  5481590,  3154468,  1796900,
-         1017796,  574674,   3},
-        {3,        538644,   954220,   1685385,  2960884,  5151503,  7126421,
-         9769579,  13217235, 17537303, 22610486, 26190946, 29627874, 32546498,
-         34529288, 35234744, 34529288, 32546498, 29627877, 26190948, 22610486,
-         17537303, 13217235, 9769578,  7126422,  5151503,  2960885,  1685385,
-         954220,   538644,   3},
-        {3,        483799,   857386,   1515349,  2665173,  4645760,  6437352,
-         8843606,  11995830, 15965511, 20652239, 23974315, 27173119, 29896409,
-         31749793, 32409812, 31749796, 29896409, 27173119, 23974315, 20652239,
-         15965511, 11995830, 8843605,  6437353,  4645760,  2665173,  1515349,
-         857386,   483799,   3},
-        {2,        346044,   613840,   1086712,  1916795,  3357477,  4672194,
-         6454554,  8816978,  11833772, 15450673, 18047553, 20571855, 22737956,
-         24220523, 24750056, 24220523, 22737954, 20571857, 18047553, 15450673,
-         11833773, 8816979,  6454554,  4672195,  3357477,  1916795,  1086712,
-         613840,   346044,   2},
-        {1,        211963,   376347,   667357,   1180477,  2077857,  2904213,
-         4035615,  5554462,  7524805,  9930550,  11685603, 13412725, 14910620,
-         15943945, 16314576, 15943947, 14910620, 13412727, 11685603, 9930550,
-         7524804,  5554462,  4035615,  2904213,  2077857,  1180477,  667357,
-         376347,   211963,   1},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-2,        -341283,   -608313,   -1086175,  -1945172,  -3500199,
-         -4995375,  -7149356,  -10257165, -14719092, -21095208, -27678681,
-         -35807499, -44718702, -52254129, -55306469, -52254132, -44718696,
-         -35807502, -27678681, -21095206, -14719093, -10257165, -7149355,
-         -4995375,  -3500199,  -1945172,  -1086175,  -608313,   -341283,
-         -2},
-        {-3,         -574839,    -1026313,   -1838045,   -3309836,   -6017788,
-         -8678530,   -12620301,  -18566315,  -29617669,  -51387072,  -78419391,
-         -127027637, -219233301, -378389804, -496424308, -378390018, -219233261,
-         -127027650, -78419391,  -51387075,  -29617669,  -18566313,  -12620300,
-         -8678531,   -6017788,   -3309837,   -1838046,   -1026313,   -574839,
-         -3},
-    },
+
+        {0.0000000112f, 0.0021408275f, 0.0037915856f, 0.0066939741f,
+         0.0117513053f, 0.0204205140f, 0.0282191299f, 0.0386330411f,
+         0.0521795005f, 0.0691007078f, 0.0889061689f, 0.1028472483f,
+         0.1162044853f, 0.1275303066f, 0.1352164894f, 0.1379496753f,
+         0.1352164894f, 0.1275303066f, 0.1162045002f, 0.1028472483f,
+         0.0889061838f, 0.0691007078f, 0.0521795005f, 0.0386330374f,
+         0.0282191336f, 0.0204205140f, 0.0117513090f, 0.0066939741f,
+         0.0037915856f, 0.0021408275f, 0.0000000112f},
+        {0.0000000112f, 0.0020066053f, 0.0035547465f, 0.0062785484f,
+         0.0110301524f, 0.0191908441f, 0.0265479870f, 0.0363945179f,
+         0.0492380373f, 0.0653315485f, 0.0842306241f, 0.0975688770f,
+         0.1103724316f, 0.1212451532f, 0.1286316216f, 0.1312596500f,
+         0.1286316216f, 0.1212451532f, 0.1103724390f, 0.0975688845f,
+         0.0842306241f, 0.0653315485f, 0.0492380373f, 0.0363945141f,
+         0.0265479907f, 0.0191908441f, 0.0110301562f, 0.0062785484f,
+         0.0035547465f, 0.0020066053f, 0.0000000112f},
+        {0.0000000112f, 0.0018022917f, 0.0031940117f, 0.0056451149f,
+         0.0099285431f, 0.0173068047f, 0.0239810050f, 0.0329449996f,
+         0.0446879491f, 0.0594761632f, 0.0769355893f, 0.0893112868f,
+         0.1012277603f, 0.1113727987f, 0.1182771921f, 0.1207359582f,
+         0.1182772070f, 0.1113727987f, 0.1012277603f, 0.0893112868f,
+         0.0769355893f, 0.0594761632f, 0.0446879491f, 0.0329449959f,
+         0.0239810087f, 0.0173068047f, 0.0099285431f, 0.0056451149f,
+         0.0031940117f, 0.0018022917f, 0.0000000112f},
+        {0.0000000075f, 0.0012891144f, 0.0022867322f, 0.0040483177f,
+         0.0071406178f, 0.0125075765f, 0.0174052790f, 0.0240450874f,
+         0.0328458026f, 0.0440842360f, 0.0575582422f, 0.0672323704f,
+         0.0766361356f, 0.0847054869f, 0.0902284831f, 0.0922011435f,
+         0.0902284831f, 0.0847054794f, 0.0766361356f, 0.0672323704f,
+         0.0575582422f, 0.0440842398f, 0.0328458063f, 0.0240450874f,
+         0.0174052827f, 0.0125075765f, 0.0071406178f, 0.0040483177f,
+         0.0022867322f, 0.0012891144f, 0.0000000075f},
+        {0.0000000037f, 0.0007896237f, 0.0014020018f, 0.0024860986f,
+         0.0043976195f, 0.0077406205f, 0.0108190365f, 0.0150338374f,
+         0.0206919834f, 0.0280320831f, 0.0369941816f, 0.0435322635f,
+         0.0499662943f, 0.0555463880f, 0.0593958236f, 0.0607765317f,
+         0.0593958311f, 0.0555463880f, 0.0499663018f, 0.0435322635f,
+         0.0369941816f, 0.0280320793f, 0.0206919834f, 0.0150338374f,
+         0.0108190365f, 0.0077406205f, 0.0043976195f, 0.0024860986f,
+         0.0014020018f, 0.0007896237f, 0.0000000037f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {-0.0000000075f, -0.0012713782f, -0.0022661425f, -0.0040463172f,
+         -0.0072463304f, -0.0130392574f, -0.0186092220f, -0.0266334265f,
+         -0.0382109173f, -0.0548328906f, -0.0785857737f, -0.1031111181f,
+         -0.1333933324f, -0.1665901542f, -0.1946617961f, -0.2060326487f,
+         -0.1946618110f, -0.1665901244f, -0.1333933473f, -0.1031111181f,
+         -0.0785857663f, -0.0548328944f, -0.0382109173f, -0.0266334228f,
+         -0.0186092220f, -0.0130392574f, -0.0072463304f, -0.0040463172f,
+         -0.0022661425f, -0.0012713782f, -0.0000000075f},
+        {-0.0000000112f, -0.0021414421f, -0.0038233139f, -0.0068472512f,
+         -0.0123300999f, -0.0224180073f, -0.0323300436f, -0.0470142849f,
+         -0.0691649169f, -0.1103344113f, -0.1914317608f, -0.2921350002f,
+         -0.4732148349f, -0.8167076707f, -1.4096118212f, -1.8493247032f,
+         -1.4096126556f, -0.8167075515f, -0.4732148647f, -0.2921350002f,
+         -0.1914317757f, -0.1103344113f, -0.0691649020f, -0.0470142812f,
+         -0.0323300473f, -0.0224180073f, -0.0123301037f, -0.0068472549f,
+         -0.0038233139f, -0.0021414421f, -0.0000000112f}}};
+
+const FLOAT32 ixheaacd_re_weight[16][8][31] = {
+
+    {
+
+        {0.5000000000f,  0.4971804619f,  0.4949752390f,  0.4910309315f,
+         0.4839466512f,  0.4711385369f,  0.4588382840f,  0.4411309958f,
+         0.4155683815f,  0.3786902130f,  0.3259756267f,  0.2796038389f,
+         0.2229698598f,  0.1560545117f,  0.0805236399f,  0.0000000000f,
+         -0.0805236399f, -0.1560545266f, -0.2229698896f, -0.2796038687f,
+         -0.3259756267f, -0.3786902130f, -0.4155683815f, -0.4411309958f,
+         -0.4588383138f, -0.4711385369f, -0.4839466512f, -0.4910309613f,
+         -0.4949752688f, -0.4971804321f, -0.5000000000f},
+        {0.5000000000f,  0.4973547161f,  0.4952812195f,  0.4915628731f,
+         0.4848551154f,  0.4726418555f,  0.4608217478f,  0.4436736703f,
+         0.4186950922f,  0.3823071420f,  0.3297900558f,  0.2832620144f,
+         0.2261611372f,  0.1584401429f,  0.0818051845f,  0.0000000000f,
+         -0.0818051845f, -0.1584401578f, -0.2261611372f, -0.2832620144f,
+         -0.3297900856f, -0.3823071420f, -0.4186950922f, -0.4436736703f,
+         -0.4608217478f, -0.4726418853f, -0.4848551452f, -0.4915628731f,
+         -0.4952812195f, -0.4973546565f, -0.5000000000f},
+        {0.5000000000f,  0.4976201355f,  0.4957476556f,  0.4923752248f,
+         0.4862467945f,  0.4749561548f,  0.4638883471f,  0.4476265609f,
+         0.4235888422f,  0.3880125880f,  0.3358573616f,  0.2891118824f,
+         0.2312888801f,  0.1622879505f,  0.0838772804f,  0.0000000000f,
+         -0.0838772804f, -0.1622879654f, -0.2312888950f, -0.2891118526f,
+         -0.3358573914f, -0.3880126476f, -0.4235888422f, -0.4476265907f,
+         -0.4638883471f, -0.4749561548f, -0.4862467945f, -0.4923752248f,
+         -0.4957476854f, -0.4976201057f, -0.5000000000f},
+        {0.5000000000f,  0.4982874393f,  0.4969230890f,  0.4944299161f,
+         0.4897895753f,  0.4809119105f,  0.4718552828f,  0.4580222666f,
+         0.4366562366f,  0.4035232663f,  0.3526770473f,  0.3055384457f,
+         0.2458558977f,  0.1733215600f,  0.0898552686f,  0.0000000000f,
+         -0.0898552686f, -0.1733215749f, -0.2458558679f, -0.3055384457f,
+         -0.3526770473f, -0.4035232663f, -0.4366561770f, -0.4580222666f,
+         -0.4718553126f, -0.4809119105f, -0.4897895753f, -0.4944299459f,
+         -0.4969231188f, -0.4982874393f, -0.5000000000f},
+        {0.5000000000f,  0.4989379942f,  0.4980724454f,  0.4964498281f,
+         0.4933045506f,  0.4869143069f,  0.4799970984f,  0.4688419700f,
+         0.4505754411f,  0.4205142260f,  0.3716892004f,  0.3245028853f,
+         0.2630047202f,  0.1865197271f,  0.0970816985f,  0.0000000000f,
+         -0.0970816985f, -0.1865197271f, -0.2630047202f, -0.3245028257f,
+         -0.3716892302f, -0.4205142260f, -0.4505754411f, -0.4688419998f,
+         -0.4799970984f, -0.4869143367f, -0.4933045506f, -0.4964498281f,
+         -0.4980724454f, -0.4989379644f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000596f,  0.5016326308f,  0.5028703809f,  0.5049995780f,
+         0.5085534453f,  0.5141122937f,  0.5184206367f,  0.5228864551f,
+         0.5257800817f,  0.5226357579f,  0.5154753923f,  0.5085130334f,
+         0.4721691608f,  0.3829773664f,  0.2211726457f,  0.0000000000f,
+         -0.2211726457f, -0.3829773664f, -0.4721692204f, -0.5085130334f,
+         -0.5154754519f, -0.5226357579f, -0.5257800817f, -0.5228864551f,
+         -0.5184206963f, -0.5141122937f, -0.5085535049f, -0.5049996376f,
+         -0.5028703809f, -0.5016326308f, -0.5000000596f},
+        {0.5000000596f,  0.5027751923f,  0.5049232244f,  0.5087171793f,
+         0.5153799057f,  0.5269514322f,  0.5375180840f,  0.5518481731f,
+         0.5710597038f,  0.6521918178f,  0.7913578749f,  0.9470402002f,
+         1.2054057121f,  1.6852766275f,  2.6426265240f,  0.0000000000f,
+         -2.6426310539f, -1.6852763891f, -1.2054058313f, -0.9470402002f,
+         -0.7913579345f, -0.6521918178f, -0.5710596442f, -0.5518481135f,
+         -0.5375181437f, -0.5269514322f, -0.5153799057f, -0.5087171793f,
+         -0.5049232244f, -0.5027751923f, -0.5000000596f}},
+    {
+
+        {0.5000000000f,  0.4973910451f,  0.4953450263f,  0.4916738272f,
+         0.4850449860f,  0.4729567766f,  0.4612380564f,  0.4442087412f,
+         0.4193551540f,  0.3830735385f,  0.3306015134f,  0.2840420902f,
+         0.2268431634f,  0.1589508802f,  0.0820798650f,  0.0000000000f,
+         -0.0820798576f, -0.1589508951f, -0.2268431783f, -0.2840420902f,
+         -0.3306015134f, -0.3830735683f, -0.4193551242f, -0.4442086816f,
+         -0.4612380862f, -0.4729567766f, -0.4850450158f, -0.4916738570f,
+         -0.4953449965f, -0.4973909855f, -0.5000000000f},
+        {0.5000000000f,  0.4975522459f,  0.4956282973f,  0.4921671450f,
+         0.4858898818f,  0.4743613005f,  0.4630986154f,  0.4466060102f,
+         0.4223214984f,  0.3865298629f,  0.3342745602f,  0.2875820398f,
+         0.2299449295f,  0.1612776965f,  0.0833326429f,  0.0000000000f,
+         -0.0833326355f, -0.1612777114f, -0.2299449295f, -0.2875820100f,
+         -0.3342745602f, -0.3865298331f, -0.4223214984f, -0.4466060400f,
+         -0.4630986452f, -0.4743613005f, -0.4858898818f, -0.4921671748f,
+         -0.4956283271f, -0.4975521863f, -0.5000000000f},
+        {0.5000000000f,  0.4977977276f,  0.4960601032f,  0.4929202795f,
+         0.4871834517f,  0.4765217602f,  0.4659720957f,  0.4503277540f,
+         0.4269563556f,  0.3919708133f,  0.3401035368f,  0.2932292819f,
+         0.2349164933f,  0.1650211811f,  0.0853530467f,  0.0000000000f,
+         -0.0853530392f, -0.1650211811f, -0.2349164784f, -0.2932292819f,
+         -0.3401035368f, -0.3919707835f, -0.4269563556f, -0.4503277540f,
+         -0.4659721255f, -0.4765217602f, -0.4871834517f, -0.4929203391f,
+         -0.4960601330f, -0.4977976680f, -0.5000000000f},
+        {0.5000000000f,  0.4984147847f,  0.4971478283f,  0.4948240519f,
+         0.4904728234f,  0.4820713699f,  0.4734190702f,  0.4600848258f,
+         0.4392839074f,  0.4066926241f,  0.3561752141f,  0.3089951873f,
+         0.2489543557f,  0.1756889224f,  0.0911452249f,  0.0000000000f,
+         -0.0911452249f, -0.1756889224f, -0.2489543557f, -0.3089951873f,
+         -0.3561752439f, -0.4066926539f, -0.4392838776f, -0.4600848556f,
+         -0.4734191597f, -0.4820713401f, -0.4904728830f, -0.4948240817f,
+         -0.4971478581f, -0.4984148145f, -0.5000000000f},
+        {0.5000000000f,  0.4990161359f,  0.4982108474f,  0.4966937900f,
+         0.4937312901f,  0.4876496494f,  0.4810023904f,  0.4701921344f,
+         0.4523362219f,  0.4227000475f,  0.3741825819f,  0.3270231485f,
+         0.2653121948f,  0.1883139759f,  0.0980708972f,  0.0000000000f,
+         -0.0980708972f, -0.1883139908f, -0.2653121948f, -0.3270231485f,
+         -0.3741825819f, -0.4227000475f, -0.4523362219f, -0.4701920748f,
+         -0.4810024500f, -0.4876496494f, -0.4937313497f, -0.4966937602f,
+         -0.4982108474f, -0.4990161359f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000596f,  0.5015053153f,  0.5026424527f,  0.5045889616f,
+         0.5078070164f,  0.5127342939f,  0.5164096355f,  0.5199240446f,
+         0.5213798285f,  0.5160900950f,  0.4961368442f,  0.4834818840f,
+         0.4421011508f,  0.3525197506f,  0.2006191462f,  0.0000000000f,
+         -0.2006191611f, -0.3525197506f, -0.4421012104f, -0.4834818840f,
+         -0.4961368442f, -0.5160900354f, -0.5213798285f, -0.5199240446f,
+         -0.5164096951f, -0.5127342939f, -0.5078070164f, -0.5045889020f,
+         -0.5026424527f, -0.5015053153f, -0.5000000596f},
+        {0.5000000596f,  0.5025598407f,  0.5045354366f,  0.5080122352f,
+         0.5140760541f,  0.5244651437f,  0.5337679982f,  0.5460379124f,
+         0.5614778399f,  0.6178392172f,  0.7190375924f,  0.8149638772f,
+         0.9330949783f,  1.0282076597f,  0.8643130064f,  0.0000000000f,
+         -0.8643135428f, -1.0282076597f, -0.9330950975f, -0.8149638772f,
+         -0.7190377116f, -0.6178392172f, -0.5614778399f, -0.5460379124f,
+         -0.5337680578f, -0.5244650841f, -0.5140760541f, -0.5080122352f,
+         -0.5045354962f, -0.5025598407f, -0.5000000596f}},
+    {
+
+        {0.5000000000f,  0.4979922175f,  0.4964025617f,  0.4935186803f,
+         0.4882142544f,  0.4782521725f,  0.4682838917f,  0.4533392787f,
+         0.4307335615f,  0.3964424431f,  0.3449379802f,  0.2979410589f,
+         0.2390869260f,  0.1681751311f,  0.0870600939f,  0.0000000000f,
+         -0.0870600939f, -0.1681751609f, -0.2390869260f, -0.2979410589f,
+         -0.3449379802f, -0.3964424133f, -0.4307335615f, -0.4533392191f,
+         -0.4682839215f, -0.4782522023f, -0.4882142544f, -0.4935186505f,
+         -0.4964025617f, -0.4979921579f, -0.5000000000f},
+        {0.5000000000f,  0.4981160462f,  0.4966207743f,  0.4939002991f,
+         0.4888732731f,  0.4793626070f,  0.4697723091f,  0.4552863240f,
+         0.4331887662f,  0.3993673325f,  0.3481221497f,  0.3010586798f,
+         0.2418578863f,  0.1702777445f,  0.0882006139f,  0.0000000000f,
+         -0.0882006139f, -0.1702777445f, -0.2418578863f, -0.3010587096f,
+         -0.3481221497f, -0.3993673027f, -0.4331887662f, -0.4552863240f,
+         -0.4697723091f, -0.4793626070f, -0.4888732731f, -0.4939003289f,
+         -0.4966207743f, -0.4981160164f, -0.5000000000f},
+        {0.5000000000f,  0.4983044863f,  0.4969531596f,  0.4944825768f,
+         0.4898807108f,  0.4810664356f,  0.4720634520f,  0.4582964182f,
+         0.4370048046f,  0.4039427042f,  0.3531388044f,  0.3059939146f,
+         0.2462634444f,  0.1736325473f,  0.0900245756f,  0.0000000000f,
+         -0.0900245681f, -0.1736325473f, -0.2462634742f, -0.3059939146f,
+         -0.3531388342f, -0.4039427042f, -0.4370048046f, -0.4582964182f,
+         -0.4720634818f, -0.4810664058f, -0.4898807704f, -0.4944825768f,
+         -0.4969531298f, -0.4983044863f, -0.5000000000f},
+        {0.5000000000f,  0.4987780154f,  0.4977895021f,  0.4959515929f,
+         0.4924345016f,  0.4854198098f,  0.4779591858f,  0.4661146402f,
+         0.4470350742f,  0.4161445498f,  0.3667378426f,  0.3195213675f,
+         0.2584639788f,  0.1830018759f,  0.0951471180f,  0.0000000000f,
+         -0.0951471031f, -0.1830018908f, -0.2584639490f, -0.3195213974f,
+         -0.3667378426f, -0.4161445200f, -0.4470350742f, -0.4661146402f,
+         -0.4779591858f, -0.4854198396f, -0.4924345613f, -0.4959515929f,
+         -0.4977895021f, -0.4987780452f, -0.5000000000f},
+        {0.5000000000f,  0.4992391467f,  0.4986056089f,  0.4973905385f,
+         0.4949527979f,  0.4897618592f,  0.4839001894f,  0.4741017818f,
+         0.4574657679f,  0.4291163385f,  0.3815677166f,  0.3345352709f,
+         0.2722316980f,  0.1937220246f,  0.1010626405f,  0.0000000000f,
+         -0.1010626331f, -0.1937220395f, -0.2722316980f, -0.3345352709f,
+         -0.3815677166f, -0.4291163385f, -0.4574657679f, -0.4741017818f,
+         -0.4839001894f, -0.4897618592f, -0.4949527979f, -0.4973905683f,
+         -0.4986056685f, -0.4992391169f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.5011434555f,  0.5019949079f,  0.5034251213f,
+         0.5056989789f,  0.5088702440f,  0.5108083487f,  0.5117562413f,
+         0.5094295144f,  0.4987166524f,  0.4690935910f,  0.4298956990f,
+         0.3742347956f,  0.2874245048f,  0.1586372554f,  0.0000000000f,
+         -0.1586372554f, -0.2874245346f, -0.3742347956f, -0.4298956990f,
+         -0.4690936506f, -0.4987166524f, -0.5094294548f, -0.5117561817f,
+         -0.5108084679f, -0.5088702440f, -0.5056990385f, -0.5034251213f,
+         -0.5019949675f, -0.5011434555f, -0.5000000000f},
+        {0.5000000596f,  0.5019482374f,  0.5034363270f,  0.5060207844f,
+         0.5104164481f,  0.5175731182f,  0.5235039592f,  0.5304464698f,
+         0.5371760726f,  0.5399831533f,  0.5705516934f,  0.5833024383f,
+         0.5678070188f,  0.4872314930f,  0.2963677347f,  0.0000000000f,
+         -0.2963677943f, -0.4872314930f, -0.5678070784f, -0.5833024383f,
+         -0.5705517530f, -0.5399830937f, -0.5371760130f, -0.5304464102f,
+         -0.5235040188f, -0.5175731182f, -0.5104165077f, -0.5060207844f,
+         -0.5034362674f, -0.5019482374f, -0.5000000596f}},
+    {
+
+        {0.5000000000f,  0.4988959730f,  0.4979980290f,  0.4963187873f,
+         0.4930755794f,  0.4865204096f,  0.4794592559f,  0.4681210220f,
+         0.4496374130f,  0.4193532467f,  0.3703693151f,  0.3231719732f,
+         0.2617889345f,  0.1855761409f,  0.0965621769f,  0.0000000000f,
+         -0.0965621769f, -0.1855761558f, -0.2617889643f, -0.3231719434f,
+         -0.3703693151f, -0.4193532169f, -0.4496374130f, -0.4681210220f,
+         -0.4794593155f, -0.4865204692f, -0.4930756390f, -0.4963187873f,
+         -0.4979980290f, -0.4988959432f, -0.5000000000f},
+        {0.5000000000f,  0.4989632964f,  0.4981172681f,  0.4965288043f,
+         0.4934426546f,  0.4871520996f,  0.4803220332f,  0.4692780674f,
+         0.4511435628f,  0.4212186337f,  0.3724914491f,  0.3253129125f,
+         0.2637456059f,  0.1870953441f,  0.0973988697f,  0.0000000000f,
+         -0.0973988622f, -0.1870953441f, -0.2637456357f, -0.3253129125f,
+         -0.3724914491f, -0.4212185740f, -0.4511435628f, -0.4692780375f,
+         -0.4803220928f, -0.4871521592f, -0.4934426844f, -0.4965288043f,
+         -0.4981172979f, -0.4989632666f, -0.5000000000f},
+        {0.5000000000f,  0.4990658462f,  0.4982986450f,  0.4968487024f,
+         0.4940025806f,  0.4881176353f,  0.4816432893f,  0.4710545242f,
+         0.4534637034f,  0.4241041243f,  0.3757902384f,  0.3286524117f,
+         0.2668075860f,  0.1894792169f,  0.0987142026f,  0.0000000000f,
+         -0.0987141877f, -0.1894792318f, -0.2668076158f, -0.3286524117f,
+         -0.3757902086f, -0.4241041243f, -0.4534636736f, -0.4710544348f,
+         -0.4816432893f, -0.4881176651f, -0.4940025806f, -0.4968487322f,
+         -0.4982987046f, -0.4990658164f, -0.5000000000f},
+        {0.5000000000f,  0.4993230999f,  0.4987545311f,  0.4976536036f,
+         0.4954148531f,  0.4905641079f,  0.4850046337f,  0.4755989015f,
+         0.4594423771f,  0.4316084087f,  0.3844630718f,  0.3375001550f,
+         0.2749801576f,  0.1958818436f,  0.1022618562f,  0.0000000000f,
+         -0.1022618562f, -0.1958818585f, -0.2749801576f, -0.3375001550f,
+         -0.3844630718f, -0.4316083491f, -0.4594423175f, -0.4755989015f,
+         -0.4850046337f, -0.4905640781f, -0.4954148829f, -0.4976535738f,
+         -0.4987545311f, -0.4993230700f, -0.5000000000f},
+        {0.5000000000f,  0.4995733500f,  0.4991982579f,  0.4984387755f,
+         0.4967978001f,  0.4929749966f,  0.4883366227f,  0.4801396132f,
+         0.4654795825f,  0.4392894208f,  0.3934856355f,  0.3468125761f,
+         0.2836796939f,  0.2027634680f,  0.1061001420f,  0.0000000000f,
+         -0.1061001420f, -0.2027634680f, -0.2836797237f, -0.3468125761f,
+         -0.3934856355f, -0.4392894208f, -0.4654795825f, -0.4801395833f,
+         -0.4883366823f, -0.4929749668f, -0.4967978299f, -0.4984387755f,
+         -0.4991982877f, -0.4995733202f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.5006032586f,  0.5010305047f,  0.5016981363f,
+         0.5025926232f,  0.5032470226f,  0.5027559996f,  0.5002208352f,
+         0.4929866195f,  0.4757096469f,  0.4384897351f,  0.3950820863f,
+         0.3305715621f,  0.2411795557f,  0.1280656606f,  0.0000000000f,
+         -0.1280656606f, -0.2411795706f, -0.3305716217f, -0.3950820863f,
+         -0.4384897351f, -0.4757096469f, -0.4929866195f, -0.5002207756f,
+         -0.5027559996f, -0.5032470226f, -0.5025926232f, -0.5016981959f,
+         -0.5010305047f, -0.5006032586f, -0.5000000000f},
+        {0.5000000000f,  0.5010370016f,  0.5018045902f,  0.5030835867f,
+         0.5050826669f,  0.5077480078f,  0.5091921091f,  0.5094215274f,
+         0.5060614347f,  0.4939221144f,  0.4625603855f,  0.4223127365f,
+         0.3585619032f,  0.2725897431f,  0.1494219303f,  0.0000000000f,
+         -0.1494219303f, -0.2725897431f, -0.3585619330f, -0.4223127365f,
+         -0.4625604451f, -0.4939220548f, -0.5060613751f, -0.5094215274f,
+         -0.5091921091f, -0.5077479482f, -0.5050827861f, -0.5030835867f,
+         -0.5018045902f, -0.5010369420f, -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368354f,  0.0000000000f,
+         -0.1131368279f, -0.2152527720f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368354f,  0.0000000000f,
+         -0.1131368279f, -0.2152527720f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368354f,  0.0000000000f,
+         -0.1131368279f, -0.2152527869f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.5010477901f,  0.5018239021f,  0.5031182766f,
+         0.5051452518f,  0.5078617930f,  0.5093557239f,  0.5096575022f,
+         0.5064008832f,  0.4944033921f,  0.4632124305f,  0.4230656624f,
+         0.3596195877f,  0.2740280628f,  0.1503099203f,  0.0000000000f,
+         -0.1503099054f, -0.2740280628f, -0.3596195877f, -0.4230656624f,
+         -0.4632123709f, -0.4944033921f, -0.5064008832f, -0.5096574426f,
+         -0.5093557239f, -0.5078617930f, -0.5051453114f, -0.5031182766f,
+         -0.5018239021f, -0.5010477304f, -0.5000000000f},
+        {0.5000000000f,  0.5009795427f,  0.5017020702f,  0.5028998852f,
+         0.5047514439f,  0.5071461797f,  0.5083272457f,  0.5081763268f,
+         0.5042734742f,  0.4913944900f,  0.4591502845f,  0.4183884561f,
+         0.3544511199f,  0.2652116716f,  0.1448854357f,  0.0000000000f,
+         -0.1448854357f, -0.2652117014f, -0.3544511199f, -0.4183884561f,
+         -0.4591503441f, -0.4913944900f, -0.5042734742f, -0.5081762671f,
+         -0.5083272457f, -0.5071461797f, -0.5047514439f, -0.5028998852f,
+         -0.5017020702f, -0.5009795427f, -0.5000000000f},
+        {0.5000000000f,  0.5008758903f,  0.5015168786f,  0.5025681257f,
+         0.5041542053f,  0.5060635209f,  0.5067747831f,  0.5059480071f,
+         0.5010886192f,  0.4869216383f,  0.4531719685f,  0.4115628898f,
+         0.3473646939f,  0.2555567026f,  0.1373466253f,  0.0000000000f,
+         -0.1373466253f, -0.2555567324f, -0.3473647237f, -0.4115628898f,
+         -0.4531719685f, -0.4869215786f, -0.5010885596f, -0.5059480071f,
+         -0.5067747831f, -0.5060635209f, -0.5041542053f, -0.5025681257f,
+         -0.5015168786f, -0.5008758307f, -0.5000000000f},
+        {0.5000000000f,  0.5006161928f,  0.5010534525f,  0.5017392039f,
+         0.5026661158f,  0.5033791661f,  0.5029437542f,  0.5004871488f,
+         0.4933607578f,  0.4762222767f,  0.4391518533f,  0.3958169818f,
+         0.3313112259f,  0.2418053150f,  0.1284317821f,  0.0000000000f,
+         -0.1284317672f, -0.2418053150f, -0.3313111961f, -0.3958169818f,
+         -0.4391519129f, -0.4762222767f, -0.4933606982f, -0.5004870892f,
+         -0.5029437542f, -0.5033791065f, -0.5026661158f, -0.5017392635f,
+         -0.5010534525f, -0.5006161332f, -0.5000000000f},
+        {0.5000000000f,  0.5003644228f,  0.5006047487f,  0.5009382963f,
+         0.5012336969f,  0.5008131266f,  0.4993060529f,  0.4953505993f,
+         0.4861895740f,  0.4664809406f,  0.4267134070f,  0.3821379840f,
+         0.3176780939f,  0.2303762883f,  0.1217892319f,  0.0000000000f,
+         -0.1217892170f, -0.2303763181f, -0.3176780939f, -0.3821379840f,
+         -0.4267134368f, -0.4664809406f, -0.4861895442f, -0.4953505993f,
+         -0.4993061125f, -0.5008131266f, -0.5012336969f, -0.5009382963f,
+         -0.5006047487f, -0.5003644228f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4993358850f,  0.4987771511f,  0.4976935983f,
+         0.4954852760f,  0.4906864166f,  0.4851732254f,  0.4758279026f,
+         0.4597451985f,  0.4319911301f,  0.3849090934f,  0.3379579186f,
+         0.2754054368f,  0.1962166280f,  0.1024479866f,  0.0000000000f,
+         -0.1024479717f, -0.1962166429f, -0.2754054368f, -0.3379579186f,
+         -0.3849091232f, -0.4319911599f, -0.4597451687f, -0.4758278131f,
+         -0.4851732850f, -0.4906864166f, -0.4954852760f, -0.4976935983f,
+         -0.4987771511f, -0.4993358552f, -0.5000000000f},
+        {0.5000000000f,  0.4989066720f,  0.4980169535f,  0.4963521063f,
+         0.4931337833f,  0.4866205156f,  0.4795958996f,  0.4683040977f,
+         0.4498755038f,  0.4196476638f,  0.3707037568f,  0.3235089481f,
+         0.2620966136f,  0.1858148128f,  0.0966935381f,  0.0000000000f,
+         -0.0966935307f, -0.1858148277f, -0.2620966136f, -0.3235089481f,
+         -0.3707037866f, -0.4196476638f, -0.4498754740f, -0.4683040380f,
+         -0.4795959294f, -0.4866205454f, -0.4931338131f, -0.4963521063f,
+         -0.4980169237f, -0.4989066422f, -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5019683242f,  0.5034724474f,  0.5060860515f,
+         0.5105357766f,  0.5177959800f,  0.5238327980f,  0.5309391022f,
+         0.5379270315f,  0.5411472321f,  0.5744604468f,  0.5888173580f,
+         0.5752269030f,  0.4958270490f,  0.3029264808f,  0.0000000000f,
+         -0.3029264808f, -0.4958269894f, -0.5752269030f, -0.5888173580f,
+         -0.5744604468f, -0.5411472321f, -0.5379270315f, -0.5309391022f,
+         -0.5238327980f, -0.5177959800f, -0.5105358362f, -0.5060860515f,
+         -0.5034723878f, -0.5019683242f, -0.5000000596f},
+        {0.5000000596f,  0.5018416047f,  0.5032451153f,  0.5056754351f,
+         0.5097854137f,  0.5163972378f,  0.5217715502f,  0.5278583169f,
+         0.5332472920f,  0.5339364409f,  0.5506924391f,  0.5557163954f,
+         0.5314731002f,  0.4462319613f,  0.2658600509f,  0.0000000000f,
+         -0.2658600509f, -0.4462319613f, -0.5314732194f, -0.5557163954f,
+         -0.5506924391f, -0.5339364409f, -0.5332472920f, -0.5278582573f,
+         -0.5217716098f, -0.5163972378f, -0.5097853541f, -0.5056754351f,
+         -0.5032451153f, -0.5018416047f, -0.5000000596f},
+        {0.5000000596f,  0.5016490817f,  0.5028999448f,  0.5050527453f,
+         0.5086503625f,  0.5142914653f,  0.5186827183f,  0.5232735872f,
+         0.5263579488f,  0.5235015154f,  0.5180896521f,  0.5119441748f,
+         0.4763633013f,  0.3873093724f,  0.2241453975f,  0.0000000000f,
+         -0.2241454273f, -0.3873093724f, -0.4763633311f, -0.5119441748f,
+         -0.5180897117f, -0.5235014558f, -0.5263578892f, -0.5232735872f,
+         -0.5186827183f, -0.5142914653f, -0.5086504221f, -0.5050527453f,
+         -0.5028999448f, -0.5016490817f, -0.5000000596f},
+        {0.5000000000f,  0.5011672974f,  0.5020375848f,  0.5035016537f,
+         0.5058373213f,  0.5091226101f,  0.5111725330f,  0.5122836232f,
+         0.5101932287f,  0.4998099208f,  0.4705953598f,  0.4316509366f,
+         0.3780660629f,  0.2909714878f,  0.1608594358f,  0.0000000000f,
+         -0.1608594209f, -0.2909714878f, -0.3780660927f, -0.4316509366f,
+         -0.4705953598f, -0.4998098612f, -0.5101932287f, -0.5122836232f,
+         -0.5111725926f, -0.5091226101f, -0.5058373213f, -0.5035016537f,
+         -0.5020375848f, -0.5011672974f, -0.5000000000f},
+        {0.5000000000f,  0.5007008314f,  0.5012044907f,  0.5020091534f,
+         0.5031501055f,  0.5042502880f,  0.5041841865f,  0.5022494197f,
+         0.4958427250f,  0.4796353579f,  0.4435822964f,  0.4007542133f,
+         0.3363020420f,  0.2460453212f,  0.1309203655f,  0.0000000000f,
+         -0.1309203506f, -0.2460453212f, -0.3363020718f, -0.4007542133f,
+         -0.4435823560f, -0.4796352983f, -0.4958426654f, -0.5022494197f,
+         -0.5041842461f, -0.5042502880f, -0.5031501651f, -0.5020092130f,
+         -0.5012044907f, -0.5007008314f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4988015890f,  0.4978311360f,  0.4960248172f,
+         0.4925622642f,  0.4856388867f,  0.4782574177f,  0.4665130377f,
+         0.4475508630f,  0.4167790711f,  0.3674541414f,  0.3202401102f,
+         0.2591174543f,  0.1835071146f,  0.0954245627f,  0.0000000000f,
+         -0.0954245627f, -0.1835071146f, -0.2591174543f, -0.3202401102f,
+         -0.3674541414f, -0.4167790413f, -0.4475508630f, -0.4665130079f,
+         -0.4782574475f, -0.4856388569f, -0.4925622940f, -0.4960248470f,
+         -0.4978311062f, -0.4988015294f, -0.5000000000f},
+        {0.5000000000f,  0.4980117977f,  0.4964371324f,  0.4935791790f,
+         0.4883186519f,  0.4784279168f,  0.4685191810f,  0.4536466599f,
+         0.4311205149f,  0.3969023824f,  0.3454375863f,  0.2984294593f,
+         0.2395204306f,  0.1685037017f,  0.0872381777f,  0.0000000000f,
+         -0.0872381777f, -0.1685037017f, -0.2395204306f, -0.2984294891f,
+         -0.3454375863f, -0.3969023824f, -0.4311204851f, -0.4536466599f,
+         -0.4685192108f, -0.4784279168f, -0.4883186519f, -0.4935792387f,
+         -0.4964371920f, -0.4980118275f, -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5025862455f,  0.5045830011f,  0.5080985427f,
+         0.5142353773f,  0.5247681141f,  0.5342236161f,  0.5467404723f,
+         0.5625994205f,  0.6218548417f,  0.7271847725f,  0.8291400671f,
+         0.9596735835f,  1.0798219442f,  0.9420299530f,  0.0000000000f,
+         -0.9420303106f, -1.0798217058f, -0.9596738815f, -0.8291401863f,
+         -0.7271848917f, -0.6218547821f, -0.5625994205f, -0.5467404127f,
+         -0.5342236161f, -0.5247680545f, -0.5142353773f, -0.5080985427f,
+         -0.5045830011f, -0.5025862455f, -0.5000000596f},
+        {0.5000000596f,  0.5024200678f,  0.5042841434f,  0.5075557828f,
+         0.5132341385f,  0.5228683949f,  0.5313730240f,  0.5423596501f,
+         0.5556432009f,  0.5973936319f,  0.6787342429f,  0.7472499609f,
+         0.8136605620f,  0.8203776479f,  0.6013670564f,  0.0000000000f,
+         -0.6013671160f, -0.8203776479f, -0.8136607409f, -0.7472500801f,
+         -0.6787342429f, -0.5973935723f, -0.5556432009f, -0.5423595905f,
+         -0.5313730240f, -0.5228683949f, -0.5132341385f, -0.5075558424f,
+         -0.5042841434f, -0.5024200678f, -0.5000000596f},
+        {0.5000000596f,  0.5021677613f,  0.5038304925f,  0.5067336559f,
+         0.5117224455f,  0.5200182796f,  0.5271236300f,  0.5358940363f,
+         0.5455409884f,  0.5636704564f,  0.6162818074f,  0.6496601105f,
+         0.6607547998f,  0.6008188725f,  0.3879746199f,  0.0000000000f,
+         -0.3879747093f, -0.6008188725f, -0.6607549191f, -0.6496600509f,
+         -0.6162818670f, -0.5636703968f, -0.5455409288f, -0.5358939767f,
+         -0.5271236897f, -0.5200182796f, -0.5117224455f, -0.5067337155f,
+         -0.5038304925f, -0.5021677017f, -0.5000000596f},
+        {0.5000000596f,  0.5015365481f,  0.5026984215f,  0.5046897531f,
+         0.5079899430f,  0.5130717754f,  0.5169013739f,  0.5206471086f,
+         0.5224504471f,  0.5176750422f,  0.5007511973f,  0.4893990755f,
+         0.4491262436f,  0.3595432043f,  0.2053054571f,  0.0000000000f,
+         -0.2053054571f, -0.3595432043f, -0.4491263032f, -0.4893990755f,
+         -0.5007511973f, -0.5176750422f, -0.5224504471f, -0.5206470490f,
+         -0.5169014335f, -0.5130717754f, -0.5079900026f, -0.5046896935f,
+         -0.5026984215f, -0.5015365481f, -0.5000000596f},
+        {0.5000000000f,  0.5009260774f,  0.5016064644f,  0.5027285814f,
+         0.5044430494f,  0.5065867305f,  0.5075244904f,  0.5070229173f,
+         0.5026227236f,  0.4890713692f,  0.4560364485f,  0.4148247242f,
+         0.3507413268f,  0.2586806417f,  0.1408952773f,  0.0000000000f,
+         -0.1408952773f, -0.2586806417f, -0.3507413268f, -0.4148246944f,
+         -0.4560364783f, -0.4890713692f, -0.5026226640f, -0.5070229173f,
+         -0.5075244904f, -0.5065867305f, -0.5044430494f, -0.5027285814f,
+         -0.5016064644f, -0.5009260178f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4984455407f,  0.4972019792f,  0.4949190915f,
+         0.4906377792f,  0.4823517799f,  0.4737979174f,  0.4605855942f,
+         0.4399236441f,  0.4074669182f,  0.3570330739f,  0.3098451197f,
+         0.2497179806f,  0.1762735248f,  0.0914641768f,  0.0000000000f,
+         -0.0914641768f, -0.1762735248f, -0.2497179955f, -0.3098450899f,
+         -0.3570331335f, -0.4074669182f, -0.4399236441f, -0.4605855346f,
+         -0.4737979472f, -0.4823517799f, -0.4906377792f, -0.4949190915f,
+         -0.4972020090f, -0.4984455109f, -0.5000000000f},
+        {0.5000000000f,  0.4974165857f,  0.4953899384f,  0.4917520583f,
+         0.4851788282f,  0.4731788635f,  0.4615318775f,  0.4445866942f,
+         0.4198218584f,  0.3836160004f,  0.3311764300f,  0.2845952809f,
+         0.2273271382f,  0.1593134999f,  0.0822749436f,  0.0000000000f,
+         -0.0822749436f, -0.1593135148f, -0.2273271531f, -0.2845952809f,
+         -0.3311764300f, -0.3836159706f, -0.4198218286f, -0.4445866644f,
+         -0.4615319073f, -0.4731788635f, -0.4851788580f, -0.4917520583f,
+         -0.4953899384f, -0.4974165857f, -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5028037429f,  0.5049747825f,  0.5088109374f,
+         0.5155536532f,  0.5272840858f,  0.5380216837f,  0.5526331663f,
+         0.5736158490f,  0.6570396423f,  0.8020626903f,  0.9678543210f,
+         1.2539665699f,  1.8414286375f,  3.6350917816f,  -3.2000000477f,
+         -3.6350977421f, -1.8414278030f, -1.2539669275f, -0.9678544402f,
+         -0.8020627499f, -0.6570395231f, -0.5736158490f, -0.5526331663f,
+         -0.5380217433f, -0.5272840261f, -0.5155536532f, -0.5088109374f,
+         -0.5049747825f, -0.5028037429f, -0.5000000596f},
+        {0.5000000596f,  0.5026236773f,  0.5046505332f,  0.5082210898f,
+         0.5144618750f,  0.5251991153f,  0.5348724723f,  0.5477427244f,
+         0.5642039180f,  0.6276481748f,  0.7390776277f,  0.8501415253f,
+         1.0001310110f,  1.1627105474f,  1.0799337626f,  0.0000000000f,
+         -1.0799342394f, -1.1627105474f, -1.0001313686f, -0.8501416445f,
+         -0.7390776873f, -0.6276481152f, -0.5642039180f, -0.5477426648f,
+         -0.5348724723f, -0.5251991153f, -0.5144618750f, -0.5082210898f,
+         -0.5046504736f, -0.5026236773f, -0.5000000596f},
+        {0.5000000596f,  0.5023502707f,  0.5041584373f,  0.5073279142f,
+         0.5128144622f,  0.5220750570f,  0.5301869512f,  0.5405472517f,
+         0.5527920127f,  0.5876652598f,  0.6602216363f,  0.7174301744f,
+         0.7646963000f,  0.7450429201f,  0.5219343901f,  0.0000000000f,
+         -0.5219346285f, -0.7450428605f, -0.7646964192f, -0.7174301744f,
+         -0.6602216959f, -0.5876652002f, -0.5527919531f, -0.5405471921f,
+         -0.5301870108f, -0.5220750570f, -0.5128144622f, -0.5073279142f,
+         -0.5041584969f, -0.5023502111f, -0.5000000596f},
+        {0.5000000596f,  0.5016664267f,  0.5029309988f,  0.5051088333f,
+         0.5087524056f,  0.5144805312f,  0.5189592838f,  0.5236825943f,
+         0.5269688368f,  0.5244184136f,  0.5208731890f,  0.5156101584f,
+         0.4808640778f,  0.3919814229f,  0.2273655832f,  0.0000000000f,
+         -0.2273655832f, -0.3919814229f, -0.4808641970f, -0.5156101584f,
+         -0.5208732486f, -0.5244183540f, -0.5269688368f, -0.5236825347f,
+         -0.5189592838f, -0.5144804716f, -0.5087524652f, -0.5051088929f,
+         -0.5029310584f, -0.5016664267f, -0.5000000596f},
+        {0.5000000000f,  0.5010051727f,  0.5017478466f,  0.5029819608f,
+         0.5048993826f,  0.5074149370f,  0.5087133050f,  0.5087317824f,
+         0.5050703287f,  0.4925194979f,  0.4606651962f,  0.4201289415f,
+         0.3562709987f,  0.2684594989f,  0.1468786299f,  0.0000000000f,
+         -0.1468786299f, -0.2684595585f, -0.3562710285f, -0.4201289117f,
+         -0.4606651962f, -0.4925194383f, -0.5050702691f, -0.5087317824f,
+         -0.5087133050f, -0.5074148774f, -0.5048993826f, -0.5029820204f,
+         -0.5017478466f, -0.5010051727f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4983206391f,  0.4969816804f,  0.4945325255f,
+         0.4899673164f,  0.4812132120f,  0.4722613096f,  0.4585570693f,
+         0.4373364151f,  0.4043420255f,  0.3535786867f,  0.3064280450f,
+         0.2466521561f,  0.1739292294f,  0.0901861414f,  0.0000000000f,
+         -0.0901861340f, -0.1739292443f, -0.2466521412f, -0.3064280450f,
+         -0.3535786867f, -0.4043420255f, -0.4373364449f, -0.4585570395f,
+         -0.4722613096f, -0.4812132120f, -0.4899673462f, -0.4945325553f,
+         -0.4969816506f, -0.4983206391f, -0.5000000000f},
+        {0.5000000000f,  0.4972080886f,  0.4950237870f,  0.4911153018f,
+         0.4840905368f,  0.4713762403f,  0.4591514468f,  0.4415317178f,
+         0.4160600305f,  0.3792575300f,  0.3265722692f,  0.2801750302f,
+         0.2234674245f,  0.1564260125f,  0.0807230473f,  0.0000000000f,
+         -0.0807230398f, -0.1564260125f, -0.2234674245f, -0.2801750600f,
+         -0.3265722394f, -0.3792575002f, -0.4160600007f, -0.4415317178f,
+         -0.4591514468f, -0.4713762403f, -0.4840905368f, -0.4911153018f,
+         -0.4950237870f, -0.4972080886f, -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5025862455f,  0.5045830011f,  0.5080985427f,
+         0.5142353773f,  0.5247681141f,  0.5342236161f,  0.5467404723f,
+         0.5625994205f,  0.6218548417f,  0.7271847725f,  0.8291400671f,
+         0.9596735835f,  1.0798219442f,  0.9420299530f,  0.0000000000f,
+         -0.9420303106f, -1.0798217058f, -0.9596738815f, -0.8291401863f,
+         -0.7271848917f, -0.6218547821f, -0.5625994205f, -0.5467404127f,
+         -0.5342236161f, -0.5247680545f, -0.5142353773f, -0.5080985427f,
+         -0.5045830011f, -0.5025862455f, -0.5000000596f},
+        {0.5000000596f,  0.5024200678f,  0.5042841434f,  0.5075557828f,
+         0.5132341385f,  0.5228683949f,  0.5313730240f,  0.5423596501f,
+         0.5556432009f,  0.5973936319f,  0.6787342429f,  0.7472499609f,
+         0.8136605620f,  0.8203776479f,  0.6013670564f,  0.0000000000f,
+         -0.6013671160f, -0.8203776479f, -0.8136607409f, -0.7472500801f,
+         -0.6787342429f, -0.5973935723f, -0.5556432009f, -0.5423595905f,
+         -0.5313730240f, -0.5228683949f, -0.5132341385f, -0.5075558424f,
+         -0.5042841434f, -0.5024200678f, -0.5000000596f},
+        {0.5000000596f,  0.5021677613f,  0.5038304925f,  0.5067336559f,
+         0.5117224455f,  0.5200182796f,  0.5271236300f,  0.5358940363f,
+         0.5455409884f,  0.5636704564f,  0.6162818074f,  0.6496601105f,
+         0.6607547998f,  0.6008188725f,  0.3879746199f,  0.0000000000f,
+         -0.3879747093f, -0.6008188725f, -0.6607549191f, -0.6496600509f,
+         -0.6162818670f, -0.5636703968f, -0.5455409288f, -0.5358939767f,
+         -0.5271236897f, -0.5200182796f, -0.5117224455f, -0.5067337155f,
+         -0.5038304925f, -0.5021677017f, -0.5000000596f},
+        {0.5000000596f,  0.5015365481f,  0.5026984215f,  0.5046897531f,
+         0.5079899430f,  0.5130717754f,  0.5169013739f,  0.5206471086f,
+         0.5224504471f,  0.5176750422f,  0.5007511973f,  0.4893990755f,
+         0.4491262436f,  0.3595432043f,  0.2053054571f,  0.0000000000f,
+         -0.2053054571f, -0.3595432043f, -0.4491263032f, -0.4893990755f,
+         -0.5007511973f, -0.5176750422f, -0.5224504471f, -0.5206470490f,
+         -0.5169014335f, -0.5130717754f, -0.5079900026f, -0.5046896935f,
+         -0.5026984215f, -0.5015365481f, -0.5000000596f},
+        {0.5000000000f,  0.5009260774f,  0.5016064644f,  0.5027285814f,
+         0.5044430494f,  0.5065867305f,  0.5075244904f,  0.5070229173f,
+         0.5026227236f,  0.4890713692f,  0.4560364485f,  0.4148247242f,
+         0.3507413268f,  0.2586806417f,  0.1408952773f,  0.0000000000f,
+         -0.1408952773f, -0.2586806417f, -0.3507413268f, -0.4148246944f,
+         -0.4560364783f, -0.4890713692f, -0.5026226640f, -0.5070229173f,
+         -0.5075244904f, -0.5065867305f, -0.5044430494f, -0.5027285814f,
+         -0.5016064644f, -0.5009260178f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4984455407f,  0.4972019792f,  0.4949190915f,
+         0.4906377792f,  0.4823517799f,  0.4737979174f,  0.4605855942f,
+         0.4399236441f,  0.4074669182f,  0.3570330739f,  0.3098451197f,
+         0.2497179806f,  0.1762735248f,  0.0914641768f,  0.0000000000f,
+         -0.0914641768f, -0.1762735248f, -0.2497179955f, -0.3098450899f,
+         -0.3570331335f, -0.4074669182f, -0.4399236441f, -0.4605855346f,
+         -0.4737979472f, -0.4823517799f, -0.4906377792f, -0.4949190915f,
+         -0.4972020090f, -0.4984455109f, -0.5000000000f},
+        {0.5000000000f,  0.4974165857f,  0.4953899384f,  0.4917520583f,
+         0.4851788282f,  0.4731788635f,  0.4615318775f,  0.4445866942f,
+         0.4198218584f,  0.3836160004f,  0.3311764300f,  0.2845952809f,
+         0.2273271382f,  0.1593134999f,  0.0822749436f,  0.0000000000f,
+         -0.0822749436f, -0.1593135148f, -0.2273271531f, -0.2845952809f,
+         -0.3311764300f, -0.3836159706f, -0.4198218286f, -0.4445866644f,
+         -0.4615319073f, -0.4731788635f, -0.4851788580f, -0.4917520583f,
+         -0.4953899384f, -0.4974165857f, -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5019683242f,  0.5034724474f,  0.5060860515f,
+         0.5105357766f,  0.5177959800f,  0.5238327980f,  0.5309391022f,
+         0.5379270911f,  0.5411472321f,  0.5744605064f,  0.5888174176f,
+         0.5752269030f,  0.4958270788f,  0.3029264808f,  0.0000000000f,
+         -0.3029265106f, -0.4958270490f, -0.5752269626f, -0.5888174772f,
+         -0.5744605064f, -0.5411472321f, -0.5379270911f, -0.5309391022f,
+         -0.5238327980f, -0.5177959800f, -0.5105358362f, -0.5060860515f,
+         -0.5034723878f, -0.5019683242f, -0.5000000596f},
+        {0.5000000596f,  0.5018416047f,  0.5032451153f,  0.5056754351f,
+         0.5097854137f,  0.5163972378f,  0.5217715502f,  0.5278583169f,
+         0.5332472920f,  0.5339364409f,  0.5506924391f,  0.5557163954f,
+         0.5314732194f,  0.4462319911f,  0.2658600807f,  0.0000000000f,
+         -0.2658601105f, -0.4462319911f, -0.5314732790f, -0.5557164550f,
+         -0.5506924391f, -0.5339364409f, -0.5332472920f, -0.5278582573f,
+         -0.5217716098f, -0.5163972378f, -0.5097853541f, -0.5056754351f,
+         -0.5032451153f, -0.5018416047f, -0.5000000596f},
+        {0.5000000596f,  0.5016490817f,  0.5028999448f,  0.5050527453f,
+         0.5086503625f,  0.5142914653f,  0.5186827183f,  0.5232735872f,
+         0.5263579488f,  0.5235015154f,  0.5180896521f,  0.5119442344f,
+         0.4763633311f,  0.3873094022f,  0.2241454273f,  0.0000000000f,
+         -0.2241454422f, -0.3873094022f, -0.4763633311f, -0.5119441748f,
+         -0.5180897117f, -0.5235014558f, -0.5263578892f, -0.5232735872f,
+         -0.5186827779f, -0.5142914653f, -0.5086504221f, -0.5050527453f,
+         -0.5028999448f, -0.5016490817f, -0.5000000596f},
+        {0.5000000000f,  0.5011672974f,  0.5020375848f,  0.5035016537f,
+         0.5058373213f,  0.5091226101f,  0.5111725330f,  0.5122836232f,
+         0.5101932287f,  0.4998099208f,  0.4705953300f,  0.4316509366f,
+         0.3780660927f,  0.2909715176f,  0.1608594507f,  0.0000000000f,
+         -0.1608594358f, -0.2909715474f, -0.3780661225f, -0.4316509366f,
+         -0.4705953598f, -0.4998098910f, -0.5101932287f, -0.5122836232f,
+         -0.5111725926f, -0.5091226101f, -0.5058373213f, -0.5035016537f,
+         -0.5020375848f, -0.5011672974f, -0.5000000000f},
+        {0.5000000000f,  0.5007008314f,  0.5012044907f,  0.5020091534f,
+         0.5031501055f,  0.5042502880f,  0.5041841865f,  0.5022494197f,
+         0.4958427250f,  0.4796353281f,  0.4435823262f,  0.4007542133f,
+         0.3363020718f,  0.2460453361f,  0.1309203655f,  0.0000000000f,
+         -0.1309203655f, -0.2460453361f, -0.3363020718f, -0.4007542133f,
+         -0.4435823560f, -0.4796353281f, -0.4958426654f, -0.5022494197f,
+         -0.5041842461f, -0.5042502880f, -0.5031501651f, -0.5020092130f,
+         -0.5012044907f, -0.5007008314f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4988015890f,  0.4978311360f,  0.4960248172f,
+         0.4925622642f,  0.4856388867f,  0.4782574177f,  0.4665130079f,
+         0.4475508630f,  0.4167790711f,  0.3674541414f,  0.3202401102f,
+         0.2591174543f,  0.1835071146f,  0.0954245627f,  0.0000000000f,
+         -0.0954245627f, -0.1835071146f, -0.2591174543f, -0.3202401102f,
+         -0.3674541116f, -0.4167790413f, -0.4475508630f, -0.4665130079f,
+         -0.4782574475f, -0.4856388569f, -0.4925622940f, -0.4960248470f,
+         -0.4978311062f, -0.4988015294f, -0.5000000000f},
+        {0.5000000000f,  0.4980117977f,  0.4964371324f,  0.4935791790f,
+         0.4883186519f,  0.4784279168f,  0.4685191810f,  0.4536466300f,
+         0.4311205149f,  0.3969023824f,  0.3454375863f,  0.2984294593f,
+         0.2395204306f,  0.1685037017f,  0.0872381777f,  0.0000000000f,
+         -0.0872381777f, -0.1685037017f, -0.2395204306f, -0.2984294593f,
+         -0.3454375863f, -0.3969023526f, -0.4311204851f, -0.4536466599f,
+         -0.4685192108f, -0.4784279168f, -0.4883186519f, -0.4935792387f,
+         -0.4964371920f, -0.4980118275f, -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.5010477901f,  0.5018239021f,  0.5031182766f,
+         0.5051453114f,  0.5078617930f,  0.5093557239f,  0.5096575022f,
+         0.5064009428f,  0.4944033921f,  0.4632124305f,  0.4230656624f,
+         0.3596196771f,  0.2740281522f,  0.1503099501f,  0.0000000000f,
+         -0.1503099501f, -0.2740281820f, -0.3596196771f, -0.4230656624f,
+         -0.4632124305f, -0.4944033921f, -0.5064008832f, -0.5096575022f,
+         -0.5093557835f, -0.5078617930f, -0.5051452518f, -0.5031182766f,
+         -0.5018239021f, -0.5010477304f, -0.5000000000f},
+        {0.5000000000f,  0.5009795427f,  0.5017020702f,  0.5028998852f,
+         0.5047514439f,  0.5071461797f,  0.5083272457f,  0.5081763268f,
+         0.5042734742f,  0.4913944900f,  0.4591503739f,  0.4183884263f,
+         0.3544511497f,  0.2652117610f,  0.1448854804f,  0.0000000000f,
+         -0.1448854804f, -0.2652117610f, -0.3544511199f, -0.4183884561f,
+         -0.4591503739f, -0.4913944900f, -0.5042735338f, -0.5081762671f,
+         -0.5083272457f, -0.5071461797f, -0.5047514439f, -0.5028998256f,
+         -0.5017020702f, -0.5009795427f, -0.5000000000f},
+        {0.5000000000f,  0.5008758903f,  0.5015168786f,  0.5025681257f,
+         0.5041542053f,  0.5060635209f,  0.5067747831f,  0.5059480071f,
+         0.5010885596f,  0.4869216979f,  0.4531719685f,  0.4115628898f,
+         0.3473647535f,  0.2555567026f,  0.1373466700f,  0.0000000000f,
+         -0.1373466551f, -0.2555567324f, -0.3473647535f, -0.4115628600f,
+         -0.4531720281f, -0.4869216383f, -0.5010885596f, -0.5059480071f,
+         -0.5067747831f, -0.5060635209f, -0.5041542649f, -0.5025681257f,
+         -0.5015168786f, -0.5008758307f, -0.5000000000f},
+        {0.5000000000f,  0.5006161928f,  0.5010533929f,  0.5017392039f,
+         0.5026661158f,  0.5033791661f,  0.5029437542f,  0.5004872084f,
+         0.4933607578f,  0.4762223363f,  0.4391518831f,  0.3958170116f,
+         0.3313111961f,  0.2418053001f,  0.1284317970f,  0.0000000000f,
+         -0.1284317821f, -0.2418053001f, -0.3313112259f, -0.3958170116f,
+         -0.4391518831f, -0.4762222767f, -0.4933607578f, -0.5004871488f,
+         -0.5029437542f, -0.5033791065f, -0.5026661158f, -0.5017392635f,
+         -0.5010534525f, -0.5006161332f, -0.5000000000f},
+        {0.5000000000f,  0.5003644228f,  0.5006047487f,  0.5009382963f,
+         0.5012336969f,  0.5008131266f,  0.4993060529f,  0.4953506589f,
+         0.4861895740f,  0.4664809704f,  0.4267134368f,  0.3821379840f,
+         0.3176781237f,  0.2303763181f,  0.1217892319f,  0.0000000000f,
+         -0.1217892319f, -0.2303763330f, -0.3176781535f, -0.3821379840f,
+         -0.4267134368f, -0.4664809406f, -0.4861895740f, -0.4953505993f,
+         -0.4993061125f, -0.5008131266f, -0.5012336969f, -0.5009382963f,
+         -0.5006047487f, -0.5003644228f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4993358850f,  0.4987771511f,  0.4976935983f,
+         0.4954852164f,  0.4906864166f,  0.4851732254f,  0.4758279026f,
+         0.4597451985f,  0.4319911599f,  0.3849090934f,  0.3379579186f,
+         0.2754054070f,  0.1962166131f,  0.1024479717f,  0.0000000000f,
+         -0.1024479717f, -0.1962166280f, -0.2754054070f, -0.3379579186f,
+         -0.3849091530f, -0.4319911599f, -0.4597451687f, -0.4758278131f,
+         -0.4851732850f, -0.4906864166f, -0.4954852462f, -0.4976935983f,
+         -0.4987771511f, -0.4993358850f, -0.5000000000f},
+        {0.5000000000f,  0.4989066720f,  0.4980169535f,  0.4963521063f,
+         0.4931337833f,  0.4866205156f,  0.4795958996f,  0.4683040977f,
+         0.4498754740f,  0.4196476638f,  0.3707037270f,  0.3235089183f,
+         0.2620966136f,  0.1858147979f,  0.0966935307f,  0.0000000000f,
+         -0.0966935158f, -0.1858148128f, -0.2620966136f, -0.3235089481f,
+         -0.3707037270f, -0.4196476340f, -0.4498754442f, -0.4683040380f,
+         -0.4795959294f, -0.4866205454f, -0.4931338131f, -0.4963521063f,
+         -0.4980169237f, -0.4989066422f, -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.4988959730f,  0.4979980290f,  0.4963187873f,
+         0.4930755794f,  0.4865204096f,  0.4794592559f,  0.4681210220f,
+         0.4496374130f,  0.4193531871f,  0.3703692853f,  0.3231719136f,
+         0.2617889047f,  0.1855761111f,  0.0965621620f,  0.0000000000f,
+         -0.0965621546f, -0.1855761409f, -0.2617889345f, -0.3231719136f,
+         -0.3703693151f, -0.4193531871f, -0.4496374130f, -0.4681210220f,
+         -0.4794592857f, -0.4865204096f, -0.4930756390f, -0.4963187873f,
+         -0.4979980290f, -0.4988959432f, -0.5000000000f},
+        {0.5000000000f,  0.4989632964f,  0.4981172681f,  0.4965288043f,
+         0.4934426546f,  0.4871520996f,  0.4803220332f,  0.4692780674f,
+         0.4511435628f,  0.4212186337f,  0.3724914193f,  0.3253129125f,
+         0.2637456059f,  0.1870953143f,  0.0973988548f,  0.0000000000f,
+         -0.0973988473f, -0.1870953292f, -0.2637456059f, -0.3253128827f,
+         -0.3724914193f, -0.4212186038f, -0.4511435330f, -0.4692780375f,
+         -0.4803220928f, -0.4871520996f, -0.4934426844f, -0.4965288043f,
+         -0.4981172979f, -0.4989632666f, -0.5000000000f},
+        {0.5000000000f,  0.4990658462f,  0.4982986450f,  0.4968487024f,
+         0.4940025806f,  0.4881176353f,  0.4816432595f,  0.4710544348f,
+         0.4534637332f,  0.4241041243f,  0.3757902384f,  0.3286523819f,
+         0.2668075860f,  0.1894792318f,  0.0987142026f,  0.0000000000f,
+         -0.0987141877f, -0.1894792318f, -0.2668075860f, -0.3286523819f,
+         -0.3757902384f, -0.4241040945f, -0.4534636736f, -0.4710544348f,
+         -0.4816432893f, -0.4881176651f, -0.4940026104f, -0.4968487322f,
+         -0.4982987046f, -0.4990658164f, -0.5000000000f},
+        {0.5000000000f,  0.4993230999f,  0.4987545311f,  0.4976536036f,
+         0.4954148531f,  0.4905641079f,  0.4850046337f,  0.4755989015f,
+         0.4594423175f,  0.4316083491f,  0.3844630420f,  0.3375000954f,
+         0.2749801576f,  0.1958818436f,  0.1022618562f,  0.0000000000f,
+         -0.1022618413f, -0.1958818436f, -0.2749801576f, -0.3375000954f,
+         -0.3844630718f, -0.4316083491f, -0.4594423175f, -0.4755989015f,
+         -0.4850046337f, -0.4905640781f, -0.4954148829f, -0.4976535738f,
+         -0.4987545311f, -0.4993230700f, -0.5000000000f},
+        {0.5000000000f,  0.4995733500f,  0.4991982579f,  0.4984387755f,
+         0.4967978001f,  0.4929749966f,  0.4883366227f,  0.4801396132f,
+         0.4654795229f,  0.4392894208f,  0.3934856057f,  0.3468125761f,
+         0.2836797237f,  0.2027634382f,  0.1061001420f,  0.0000000000f,
+         -0.1061001420f, -0.2027634382f, -0.2836797237f, -0.3468125463f,
+         -0.3934856355f, -0.4392894208f, -0.4654795229f, -0.4801395833f,
+         -0.4883366823f, -0.4929749668f, -0.4967978299f, -0.4984387755f,
+         -0.4991982877f, -0.4995733202f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.5006032586f,  0.5010305047f,  0.5016981363f,
+         0.5025926232f,  0.5032470226f,  0.5027559996f,  0.5002208352f,
+         0.4929866195f,  0.4757096469f,  0.4384897351f,  0.3950820863f,
+         0.3305716217f,  0.2411795706f,  0.1280656755f,  0.0000000000f,
+         -0.1280656755f, -0.2411796004f, -0.3305716217f, -0.3950820863f,
+         -0.4384897351f, -0.4757096469f, -0.4929866195f, -0.5002207756f,
+         -0.5027559996f, -0.5032470226f, -0.5025926828f, -0.5016981959f,
+         -0.5010305047f, -0.5006032586f, -0.5000000000f},
+        {0.5000000000f,  0.5010370016f,  0.5018045902f,  0.5030835867f,
+         0.5050826669f,  0.5077480078f,  0.5091921091f,  0.5094215274f,
+         0.5060614347f,  0.4939221144f,  0.4625604451f,  0.4223127663f,
+         0.3585619628f,  0.2725898027f,  0.1494219899f,  0.0000000000f,
+         -0.1494219750f, -0.2725898027f, -0.3585619926f, -0.4223127961f,
+         -0.4625605047f, -0.4939221144f, -0.5060614347f, -0.5094215274f,
+         -0.5091921091f, -0.5077480078f, -0.5050827861f, -0.5030835867f,
+         -0.5018045902f, -0.5010369420f, -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.4979922175f,  0.4964025617f,  0.4935186803f,
+         0.4882142544f,  0.4782521725f,  0.4682838917f,  0.4533392787f,
+         0.4307336509f,  0.3964424431f,  0.3449379802f,  0.2979410589f,
+         0.2390869260f,  0.1681751311f,  0.0870600939f,  0.0000000000f,
+         -0.0870600939f, -0.1681751460f, -0.2390869558f, -0.2979410589f,
+         -0.3449379802f, -0.3964424431f, -0.4307335615f, -0.4533392787f,
+         -0.4682839215f, -0.4782521725f, -0.4882142544f, -0.4935186505f,
+         -0.4964025617f, -0.4979921579f, -0.5000000000f},
+        {0.5000000000f,  0.4981160462f,  0.4966207743f,  0.4939002991f,
+         0.4888732731f,  0.4793626070f,  0.4697723091f,  0.4552863240f,
+         0.4331888258f,  0.3993673325f,  0.3481221795f,  0.3010587096f,
+         0.2418579161f,  0.1702777445f,  0.0882006139f,  0.0000000000f,
+         -0.0882006139f, -0.1702777743f, -0.2418579161f, -0.3010587096f,
+         -0.3481221795f, -0.3993673027f, -0.4331887960f, -0.4552863240f,
+         -0.4697723091f, -0.4793626070f, -0.4888732731f, -0.4939003289f,
+         -0.4966207743f, -0.4981160164f, -0.5000000000f},
+        {0.5000000000f,  0.4983044863f,  0.4969531596f,  0.4944825768f,
+         0.4898807108f,  0.4810664356f,  0.4720634520f,  0.4582964182f,
+         0.4370048046f,  0.4039427638f,  0.3531388044f,  0.3059939146f,
+         0.2462634593f,  0.1736325473f,  0.0900245756f,  0.0000000000f,
+         -0.0900245681f, -0.1736325473f, -0.2462634593f, -0.3059939146f,
+         -0.3531388342f, -0.4039427042f, -0.4370048046f, -0.4582964182f,
+         -0.4720634818f, -0.4810664356f, -0.4898807704f, -0.4944825768f,
+         -0.4969531298f, -0.4983044863f, -0.5000000000f},
+        {0.5000000000f,  0.4987780154f,  0.4977895021f,  0.4959515929f,
+         0.4924345016f,  0.4854198098f,  0.4779591858f,  0.4661146402f,
+         0.4470350742f,  0.4161445498f,  0.3667378426f,  0.3195213675f,
+         0.2584639788f,  0.1830018908f,  0.0951471180f,  0.0000000000f,
+         -0.0951471031f, -0.1830018908f, -0.2584639788f, -0.3195213974f,
+         -0.3667378724f, -0.4161445200f, -0.4470350742f, -0.4661146402f,
+         -0.4779591858f, -0.4854198396f, -0.4924345613f, -0.4959515929f,
+         -0.4977895319f, -0.4987780452f, -0.5000000000f},
+        {0.5000000000f,  0.4992391467f,  0.4986056089f,  0.4973905385f,
+         0.4949527979f,  0.4897618592f,  0.4839001894f,  0.4741017818f,
+         0.4574657679f,  0.4291163385f,  0.3815677166f,  0.3345352709f,
+         0.2722316682f,  0.1937220246f,  0.1010626405f,  0.0000000000f,
+         -0.1010626331f, -0.1937220395f, -0.2722316980f, -0.3345352709f,
+         -0.3815677166f, -0.4291163385f, -0.4574657679f, -0.4741017818f,
+         -0.4839001894f, -0.4897618592f, -0.4949527979f, -0.4973905683f,
+         -0.4986056685f, -0.4992391169f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000000f,  0.5011434555f,  0.5019949079f,  0.5034251213f,
+         0.5056989789f,  0.5088702440f,  0.5108084083f,  0.5117562413f,
+         0.5094295144f,  0.4987166524f,  0.4690935910f,  0.4298956990f,
+         0.3742347658f,  0.2874245048f,  0.1586372405f,  0.0000000000f,
+         -0.1586372405f, -0.2874245048f, -0.3742347956f, -0.4298956990f,
+         -0.4690936506f, -0.4987166524f, -0.5094294548f, -0.5117561817f,
+         -0.5108084679f, -0.5088702440f, -0.5056990385f, -0.5034251213f,
+         -0.5019949675f, -0.5011434555f, -0.5000000000f},
+        {0.5000000596f,  0.5019482374f,  0.5034363270f,  0.5060207844f,
+         0.5104164481f,  0.5175731182f,  0.5235039592f,  0.5304464102f,
+         0.5371760726f,  0.5399830937f,  0.5705516338f,  0.5833023787f,
+         0.5678069592f,  0.4872313440f,  0.2963676453f,  0.0000000000f,
+         -0.2963677049f, -0.4872313440f, -0.5678069592f, -0.5833023787f,
+         -0.5705516338f, -0.5399830341f, -0.5371760726f, -0.5304464102f,
+         -0.5235040188f, -0.5175731182f, -0.5104165077f, -0.5060207844f,
+         -0.5034362674f, -0.5019482374f, -0.5000000596f}},
+    {
+
+        {0.5000000000f,  0.4973910451f,  0.4953450263f,  0.4916738272f,
+         0.4850449860f,  0.4729567766f,  0.4612380564f,  0.4442087412f,
+         0.4193551242f,  0.3830735385f,  0.3306014538f,  0.2840420604f,
+         0.2268431634f,  0.1589508802f,  0.0820798650f,  0.0000000000f,
+         -0.0820798576f, -0.1589508951f, -0.2268431783f, -0.2840420604f,
+         -0.3306014538f, -0.3830735683f, -0.4193551242f, -0.4442086816f,
+         -0.4612380564f, -0.4729567766f, -0.4850450158f, -0.4916738570f,
+         -0.4953449965f, -0.4973909855f, -0.5000000000f},
+        {0.5000000000f,  0.4975522459f,  0.4956282973f,  0.4921671450f,
+         0.4858898818f,  0.4743613005f,  0.4630986154f,  0.4466060102f,
+         0.4223214984f,  0.3865298629f,  0.3342745304f,  0.2875820100f,
+         0.2299449295f,  0.1612776965f,  0.0833326429f,  0.0000000000f,
+         -0.0833326355f, -0.1612777114f, -0.2299449295f, -0.2875820100f,
+         -0.3342745602f, -0.3865298331f, -0.4223214984f, -0.4466060400f,
+         -0.4630986452f, -0.4743613005f, -0.4858898818f, -0.4921671748f,
+         -0.4956283271f, -0.4975521863f, -0.5000000000f},
+        {0.5000000000f,  0.4977977276f,  0.4960601032f,  0.4929202795f,
+         0.4871834517f,  0.4765217602f,  0.4659720957f,  0.4503277540f,
+         0.4269563556f,  0.3919707835f,  0.3401035368f,  0.2932292819f,
+         0.2349164933f,  0.1650211811f,  0.0853530467f,  0.0000000000f,
+         -0.0853530392f, -0.1650211811f, -0.2349164784f, -0.2932292819f,
+         -0.3401035368f, -0.3919707835f, -0.4269563556f, -0.4503277242f,
+         -0.4659721255f, -0.4765217602f, -0.4871834517f, -0.4929203391f,
+         -0.4960601330f, -0.4977976680f, -0.5000000000f},
+        {0.5000000000f,  0.4984147847f,  0.4971478283f,  0.4948240519f,
+         0.4904728234f,  0.4820713699f,  0.4734190702f,  0.4600848258f,
+         0.4392839074f,  0.4066926241f,  0.3561752141f,  0.3089951873f,
+         0.2489543557f,  0.1756889224f,  0.0911452249f,  0.0000000000f,
+         -0.0911452249f, -0.1756889224f, -0.2489543557f, -0.3089951873f,
+         -0.3561752439f, -0.4066926539f, -0.4392838776f, -0.4600848556f,
+         -0.4734191597f, -0.4820713401f, -0.4904728830f, -0.4948240817f,
+         -0.4971478581f, -0.4984148145f, -0.5000000000f},
+        {0.5000000000f,  0.4990161359f,  0.4982108474f,  0.4966937900f,
+         0.4937312901f,  0.4876496494f,  0.4810023904f,  0.4701921344f,
+         0.4523362219f,  0.4227000475f,  0.3741825819f,  0.3270231485f,
+         0.2653121948f,  0.1883139759f,  0.0980708972f,  0.0000000000f,
+         -0.0980708972f, -0.1883139908f, -0.2653121948f, -0.3270231187f,
+         -0.3741825819f, -0.4227000475f, -0.4523362219f, -0.4701920748f,
+         -0.4810024500f, -0.4876495600f, -0.4937313497f, -0.4966937602f,
+         -0.4982108474f, -0.4990161359f, -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,
+         0.4990009665f,  0.4968476892f,  0.4937299490f,  0.4875672758f,
+         0.4754966497f,  0.4522733092f,  0.4090909064f,  0.3631930947f,
+         0.2992399931f,  0.2152527571f,  0.1131368279f,  0.0000000000f,
+         -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f,
+         -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f,
+         -0.4999000132f, -0.4999683797f, -0.5000000000f},
+        {0.5000000596f,  0.5015053153f,  0.5026424527f,  0.5045889616f,
+         0.5078070164f,  0.5127342939f,  0.5164096355f,  0.5199240446f,
+         0.5213798285f,  0.5160900950f,  0.4961368442f,  0.4834818840f,
+         0.4421011508f,  0.3525198102f,  0.2006191760f,  0.0000000000f,
+         -0.2006191611f, -0.3525197804f, -0.4421012104f, -0.4834818840f,
+         -0.4961368442f, -0.5160900950f, -0.5213798285f, -0.5199240446f,
+         -0.5164096951f, -0.5127342939f, -0.5078070164f, -0.5045889616f,
+         -0.5026424527f, -0.5015053153f, -0.5000000596f},
+        {0.5000000596f,  0.5025598407f,  0.5045354962f,  0.5080122352f,
+         0.5140760541f,  0.5244651437f,  0.5337679982f,  0.5460379124f,
+         0.5614778399f,  0.6178392172f,  0.7190376520f,  0.8149639368f,
+         0.9330952168f,  1.0282080173f,  0.8643135428f,  0.0000000000f,
+         -0.8643140197f, -1.0282078981f, -0.9330952764f, -0.8149639368f,
+         -0.7190377116f, -0.6178392172f, -0.5614778399f, -0.5460379124f,
+         -0.5337680578f, -0.5244650841f, -0.5140760541f, -0.5080122352f,
+         -0.5045354962f, -0.5025598407f, -0.5000000596f}}
+
 };
 
-const WORD32 ixheaacd_re_weight_Q28[16][8][31] = {
+const FLOAT32 ixheaacd_beta[16][8][31] = {
     {
-        {134217728,  133460863,  132868901,  131810111,  129908442,  126470291,
-         123168465,  118415202,  111553289,  101653880,  87503416,   75055587,
-         59853017,   41890564,   21615401,   0,          -21615400,  -41890567,
-         -59853022,  -75055592,  -87503416,  -101653880, -111553289, -118415202,
-         -123168474, -126470291, -129908442, -131810119, -132868916, -133460855,
-         -134217736},
-        {134217728,  133507641,  132951036,  131952906,  130152305,  126873835,
-         123700894,  119097743,  112392608,  102624793,  88527346,   76037569,
-         60709668,   42530952,   21959413,   0,          -21959412,  -42530956,
-         -60709668,  -76037567,  -88527354,  -102624793, -112392608, -119097743,
-         -123700897, -126873843, -130152314, -131952906, -132951044, -133507625,
-         -134217736},
-        {134217728,  133578889,  133076245,  132170971,  130525880,  127495076,
-         124524084,  120158840,  113706267,  104156340,  90156022,   77607879,
-         62086135,   43563841,   22515636,   0,          -22515635,  -43563843,
-         -62086140,  -77607874,  -90156032,  -104156349, -113706267, -120158844,
-         -124524084, -127495076, -130525880, -132170971, -133076253, -133578881,
-         -134217736},
-        {134217728,  133758012,  133391773,  132722523,  131476888,  129093806,
-         126662688,  122949415,  117214012,  108319953,  94671025,   82017354,
-         65996439,   46525651,   24120340,   0,          -24120340,  -46525655,
-         -65996434,  -82017354,  -94671025,  -108319953, -117214003, -122949415,
-         -126662696, -129093806, -131476888, -132722531, -133391781, -133758012,
-         -134217736},
-        {134217728,  133932649,  133700308,  133264733,  132420429,  130705061,
-         128848242,  125853808,  120950424,  112880929,  99774559,   87108077,
-         70599795,   50068507,   26060170,   0,          -26060170,  -50068507,
-         -70599792,  -87108068,  -99774568,  -112880929, -120950424, -125853814,
-         -128848243, -130705069, -132420430, -133264733, -133700308, -133932641,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217744,  134655979,  134988239,  135559790,  136513776,  138005964,
-         139162482,  140361258,  141138020,  140293965,  138371877,  136502930,
-         126746944,  102804704,  59370579,   0,          -59370579,  -102804704,
-         -126746957, -136502930, -138371890, -140293970, -141138020, -140361258,
-         -139162497, -138005964, -136513792, -135559805, -134988239, -134655979,
-         -134217744},
-        {134217744,  134962683,  135539295,  136557732,  138346233,  141452453,
-         144288910,  148135620,  153292676,  175071409,  212428515,  254219167,
-         323573619,  452387989,  709374650,  0,          -709375876, -452387936,
-         -323573672, -254219167, -212428528, -175071409, -153292663, -148135606,
-         -144288924, -141452453, -138346233, -136557732, -135539295, -134962683,
-         -134217744},
-    },
-    {
-        {134217728,  133517388,  132968168,  131982689,  130203271,  126958371,
-         123812646,  119241372,  112569794,  102830521,  88745164,   76246965,
-         60892748,   42668052,   22033146,   0,          -22033144,  -42668057,
-         -60892753,  -76246965,  -88745164,  -102830531, -112569785, -119241363,
-         -123812654, -126958371, -130203280, -131982697, -132968160, -133517380,
-         -134217736},
-        {134217728,  133560667,  133044207,  132115111,  130430074,  127335394,
-         124312090,  119884885,  113366063,  103758318,  89731143,   77197214,
-         61725371,   43292653,   22369435,   0,          -22369434,  -43292655,
-         -61725371,  -77197209,  -89731143,  -103758309, -113366063, -119884894,
-         -124312098, -127335394, -130430074, -132115119, -133044215, -133560651,
-         -134217736},
-        {134217728,  133626556,  133160120,  132317284,  130777308,  127915335,
-         125083431,  120883935,  114610226,  105218864,  91295851,   78713132,
-         63059915,   44297538,   22911785,   0,          -22911782,  -44297538,
-         -63059910,  -78713137,  -91295851,  -105218855, -114610226, -120883935,
-         -125083440, -127915335, -130777308, -132317293, -133160128, -133626540,
-         -134217736},
-        {134217728,  133792202,  133452102,  132828323,  131660297,  129405046,
-         127082463,  123503081,  117919375,  109170723,  95610055,   82945267,
-         66828178,   47161136,   24466610,   0,          -24466610,  -47161136,
-         -66828178,  -82945267,  -95610064,  -109170725, -117919366, -123503090,
-         -127082486, -129405039, -131660312, -132828331, -133452110, -133792210,
-         -134217736},
-        {134217728,  133953625,  133737455,  133330222,  132534982,  130902453,
-         129118100,  126216242,  121423078,  113467678,  100443871,  87784612,
-         71219199,   50550149,   26325706,   0,          -26325706,  -50550154,
-         -71219202,  -87784612,  -100443871, -113467678, -121423078, -126216226,
-         -129118109, -130902453, -132534997, -133330214, -133737456, -133953625,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217744,  134621813,  134927051,  135449572,  136313400,  137636071,
-         138622650,  139566056,  139956832,  138536878,  133180717,  129783677,
-         118675624,  94628804,   53853292,   0,          -53853295,  -94628804,
-         -118675637, -129783677, -133180717, -138536864, -139956832, -139566056,
-         -138622666, -137636071, -136313400, -135449556, -134927051, -134621813,
-         -134217744},
-        {134217744,  134904883,  135435203,  136368502,  137996233,  140785045,
-         143282261,  146575942,  150720567,  165849956,  193015182,  218765195,
-         250475781,  276007380,  232012261,  0,          -232012394, -276007380,
-         -250475807, -218765195, -193015209, -165849956, -150720553, -146575942,
-         -143282270, -140785029, -137996233, -136368502, -135435219, -134904883,
-         -134217744},
-    },
-    {
-        {134217728,  133678764,  133252044,  132477911,  131054012,  128379841,
-         125703998,  121692333,  115624163,  106419205,  92593586,   79977946,
-         64179408,   45144170,   23370016,   0,          -23370016,  -45144175,
-         -64179408,  -79977946,  -92593586,  -106419196, -115624163, -121692324,
-         -125704006, -128379848, -131054020, -132477902, -133252052, -133678756,
-         -134217736},
-        {134217728,  133712005,  133310620,  132580354,  131230923,  128677921,
-         126103542,  122214988,  116283221,  107204353,  93448326,   80814826,
-         64923233,   45708586,   23676171,   0,          -23676171,  -45708586,
-         -64923233,  -80814831,  -93448326,  -107204344, -116283221, -122214988,
-         -126103542, -128677921, -131230923, -132580362, -133310620, -133711997,
-         -134217736},
-        {134217728,  133762594,  133399847,  132736656,  131501355,  129135285,
-         126718571,  123023009,  117307580,  108432548,  94794977,   82139614,
-         66105841,   46609132,   24165789,   0,          -24165786,  -46609132,
-         -66105847,  -82139614,  -94794987,  -108432548, -117307580, -123023009,
-         -126718574, -129135283, -131501371, -132736656, -133399839, -133762594,
-         -134217736},
-        {134217728,  133889704,  133624356,  133130995,  132186884,  130303885,
-         128301191,  125121697,  120000061,  111707953,  98445440,   85770865,
-         69380893,   49124191,   25540859,   0,          -25540857,  -49124196,
-         -69380888,  -85770874,  -98445440,  -111707944, -120000061, -125121697,
-         -128301191, -130303893, -132186900, -133130995, -133624356, -133889712,
-         -134217728},
-        {134217728,  134013488,  133843425,  133517257,  132862879,  131469447,
-         129895964,  127265729,  122800030,  115190043,  102426301,  89801131,
-         73076637,   52001860,   27128796,   0,          -27128794,  -52001864,
-         -73076641,  -89801131,  -102426301, -115190039, -122800030, -127265729,
-         -129895972, -131469447, -132862879, -133517265, -133843441, -134013480,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134524667,  134753225,  135137152,  135747532,  136598811,
-         137119080,  137373516,  136748951,  133873231,  125921352,  115399244,
-         100457884,  77154931,   42583862,   0,          -42583862,  -77154938,
-         -100457891, -115399244, -125921369, -133873231, -136748936, -137373501,
-         -137119096, -136598811, -135747548, -135137152, -134753241, -134524667,
-         -134217728},
-        {134217744,  134740697,  135140165,  135833916,  137013874,  138934982,
-         140527025,  142390637,  144197099,  144950624,  153156303,  156579063,
-         152419543,  130790210,  79555611,   0,          -79555625,  -130790210,
-         -152419556, -156579063, -153156316, -144950610, -144197089, -142390622,
-         -140527040, -138934982, -137013890, -135833916, -135140150, -134740697,
-         -134217744},
-    },
-    {
-        {134217728,  133921369,  133680325,  133229561,  132358967,  130599331,
-         128703866,  125660282,  120698624,  112569282,  99420258,   86750815,
-         70273432,   49815216,   25920711,   0,          -25920711,  -49815221,
-         -70273437,  -86750806,  -99420256,  -112569274, -120698624, -125660282,
-         -128703883, -130599348, -132358983, -133229561, -133680325, -133921361,
-         -134217728},
-        {134217728,  133939441,  133712333,  133285932,  132457505,  130768900,
-         128935466,  125970874,  121102931,  113070012,  99989913,   87325519,
-         70798672,   50223025,   26145310,   0,          -26145308,  -50223025,
-         -70798677,  -87325519,  -99989913,  -113070003, -121102931, -125970860,
-         -128935481, -130768908, -132457513, -133285932, -133712341, -133939433,
-         -134217728},
-        {134217728,  133966965,  133761027,  133371807,  132607806,  131028081,
-         129290134,  126447733,  121725737,  113844587,  100875426,  88221963,
-         71620613,   50862941,   26498391,   0,          -26498388,  -50862946,
-         -71620620,  -88221963,  -100875417, -113844587, -121725728, -126447716,
-         -129290134, -131028089, -132607807, -133371815, -133761036, -133966957,
-         -134217728},
-        {134217728,  134036022,  133883399,  133587872,  132986916,  131684800,
-         130192440,  127667609,  123330628,  115859003,  103203522,  90597004,
-         73814421,   52581631,   27450709,   0,          -27450709,  -52581635,
-         -73814421,  -90597004,  -103203522, -115858986, -123330612, -127667609,
-         -130192441, -131684792, -132986917, -133587864, -133883399, -134036014,
-         -134217728},
-        {134217728,  134103202,  134002513,  133798640,  133358145,  132331971,
-         131086862,  128886498,  124951227,  117920856,  105625498,  93096793,
-         76149690,   54428903,   28481041,   0,          -28481039,  -54428903,
-         -76149698,  -93096793,  -105625498, -117920856, -124951227, -128886489,
-         -131086879, -132331963, -133358153, -133798640, -134002521, -134103194,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134379666,  134494354,  134673574,  134913679,  135089351,
-         134957528,  134277005,  132335084,  127697337,  117706196,  106054041,
-         88737129,   64741142,   34377364,   0,          -34377364,  -64741149,
-         -88737144,  -106054041, -117706196, -127697337, -132335084, -134276990,
-         -134957528, -135089351, -134913679, -134673590, -134494354, -134379666,
-         -134217728},
-        {134217728,  134496089,  134702142,  135045469,  135582090,  136297572,
-         136685209,  136746798,  135844838,  132586209,  124167611,  113363711,
-         96250730,   73172752,   40110146,   0,          -40110146,  -73172752,
-         -96250737,  -113363711, -124167625, -132586192, -135844823, -136746798,
-         -136685224, -136297557, -135582122, -135045469, -134702142, -134496073,
-         -134217728},
-    },
-    {
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369938,   0,          -30369936,  -57781476,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369938,   0,          -30369936,  -57781476,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369938,   0,          -30369936,  -57781479,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-    },
-    {
-        {134217728,  134498993,  134707335,  135054789,  135598900,  136328115,
-         136729141,  136810142,  135935959,  132715402,  124342638,  113565820,
-         96534651,   73558852,   40348512,   0,          -40348509,  -73558852,
-         -96534651,  -113565820, -124342622, -132715402, -135935959, -136810127,
-         -136729141, -136328115, -135598916, -135054789, -134707335, -134498977,
-         -134217728},
-        {134217728,  134480680,  134674623,  134996162,  135493192,  136136017,
-         136453048,  136412541,  135364880,  131907703,  123252219,  112310293,
-         95147250,   71192218,   38892389,   0,          -38892389,  -71192225,
-         -95147244,  -112310293, -123252233, -131907703, -135364880, -136412525,
-         -136453064, -136136017, -135493192, -134996162, -134674623, -134480664,
-         -134217728},
-        {134217728,  134452852,  134624907,  134907111,  135332868,  135845392,
-         136036318,  135814387,  134509950,  130707034,  121647428,  110478072,
-         93245003,   68600479,   36868706,   0,          -36868706,  -68600486,
-         -93245010,  -110478072, -121647428, -130707019, -134509933, -135814387,
-         -136036318, -135845392, -135332868, -134907111, -134624907, -134452836,
-         -134217728},
-        {134217728,  134383129,  134500515,  134684594,  134933403,  135124815,
-         135007943,  134348491,  132435517,  127834944,  117883926,  106251314,
-         88935676,   64909118,   34475644,   0,          -34475641,  -64909118,
-         -88935672,  -106251314, -117883941, -127834944, -132435502, -134348484,
-         -135007943, -135124799, -134933403, -134684610, -134500515, -134383113,
-         -134217728},
-        {134217728,  134315558,  134380057,  134469604,  134548899,  134436000,
-         134031448,  132969665,  130510521,  125220021,  114545007,  102579384,
-         85276062,   61841165,   32692547,   0,          -32692543,  -61841172,
-         -85276062,  -102579384, -114545015, -125220021, -130510514, -132969665,
-         -134031463, -134436000, -134548899, -134469604, -134380057, -134315558,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134039455,  133889472,  133598612,  133005816,  131717634,
-         130237695,  127729079,  123411911,  115961736,  103323251,  90719885,
-         73928581,   52671501,   27500671,   0,          -27500669,  -52671505,
-         -73928581,  -90719885,  -103323259, -115961741, -123411903, -127729055,
-         -130237711, -131717634, -133005816, -133598612, -133889472, -134039447,
-         -134217728},
-        {134217728,  133924242,  133685411,  133238504,  132374593,  130626201,
-         128740547,  125709420,  120762534,  112648312,  99510030,   86841272,
-         70356024,   49879283,   25955974,   0,          -25955971,  -49879287,
-         -70356024,  -86841272,  -99510039,  -112648312, -120762526, -125709412,
-         -128740555, -130626209, -132374601, -133238504, -133685403, -133924234,
-         -134217728},
-    },
-    {
-        {134217744,  134746091,  135149853,  135851434,  137045902,  138994799,
-         140615296,  142522879,  144398695,  145263100,  154205556,  158059463,
-         154411290,  133097557,  81316205,   0,          -81316205,  -133097543,
-         -154411303, -158059463, -154205556, -145263100, -144398695, -142522879,
-         -140615296, -138994799, -137045918, -135851434, -135149837, -134746091,
-         -134217744},
-        {134217744,  134712087,  135088825,  135741208,  136844475,  138619336,
-         140061990,  141695888,  143142475,  143327466,  147825370,  149173983,
-         142666223,  119784477,  71366265,   0,          -71366265,  -119784477,
-         -142666263, -149173983, -147825383, -143327466, -143142475, -141695873,
-         -140062006, -138619320, -136844467, -135741224, -135088825, -134712087,
-         -134217744},
-        {134217744,  134660400,  134996180,  135574064,  136539790,  138054064,
-         139232828,  140465192,  141293136,  140526367,  139073637,  137423970,
-         127872797,  103967564,  60168572,   0,          -60168579,  -103967564,
-         -127872810, -137423970, -139073650, -140526353, -141293121, -140465192,
-         -139232828, -138054064, -136539805, -135574064, -134996180, -134660400,
-         -134217744},
-        {134217728,  134531071,  134764682,  135157698,  135784674,  136666568,
-         137216832,  137515087,  136953956,  134166704,  126324479,  115870417,
-         101486338,  78107065,   43180376,   0,          -43180372,  -78107065,
-         -101486344, -115870417, -126324479, -134166690, -136953956, -137515087,
-         -137216847, -136666568, -135784674, -135157698, -134764682, -134531071,
-         -134217728},
-        {134217728,  134405853,  134541061,  134757061,  135063333,  135358653,
-         135340907,  134821548,  133101766,  128751135,  119073216,  107576641,
-         90275394,   66047286,   35143667,   0,          -35143664,  -66047286,
-         -90275401,  -107576641, -119073231, -128751120, -133101751, -134821548,
-         -135340923, -135358653, -135063349, -134757077, -134541061, -134405853,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133896028,  133635530,  133150648,  132221176,  130362696,
-         128381245,  125228644,  120138520,  111878277,  98637718,   85963798,
-         69556315,   49259814,   25615335,   0,          -25615335,  -49259818,
-         -69556315,  -85963798,  -98637718,  -111878269, -120138520, -125228635,
-         -128381253, -130362689, -132221184, -133150656, -133635522, -133896020,
-         -134217728},
-        {134217728,  133684024,  133261330,  132494150,  131082043,  128427016,
-         125767162,  121774846,  115728035,  106542671,  92727700,   80109047,
-         64295775,   45232367,   23417819,   0,          -23417819,  -45232367,
-         -64295774,  -80109052,  -92727700,  -106542671, -115728027, -121774851,
-         -125767170, -128427016, -131082043, -132494166, -133261346, -133684032,
-         -134217736},
-    },
-    {
-        {134217744,  134911968,  135447966,  136391663,  138039000,  140866367,
-         143404554,  146764521,  151021632,  166927889,  195202182,  222570595,
-         257610421,  289862500,  252874234,  0,          -252874341, -289862420,
-         -257610501, -222570621, -195202209, -166927876, -151021632, -146764507,
-         -143404554, -140866352, -138039000, -136391663, -135447966, -134911968,
-         -134217744},
-        {134217744,  134867355,  135367738,  136245965,  137770239,  140356424,
-         142639355,  145588557,  149154344,  160361636,  182196342,  200588382,
-         218415341,  220218448,  161428236,  0,          -161428263, -220218448,
-         -218415395, -200588409, -182196329, -160361623, -149154344, -145588542,
-         -142639355, -140356409, -137770238, -136245981, -135367738, -134867355,
-         -134217744},
-        {134217744,  134799630,  135245963,  136025282,  137364449,  139591338,
-         141498666,  143852961,  146442545,  151309130,  165431889,  174391809,
-         177370022,  161281089,  104146144,  0,          -104146171, -161281089,
-         -177370049, -174391796, -165431903, -151309116, -146442531, -143852947,
-         -141498681, -139591338, -137364449, -136025297, -135245963, -134799614,
-         -134217744},
-        {134217744,  134630198,  134942075,  135476620,  136362516,  137726655,
-         138754657,  139760139,  140244217,  138962344,  134419383,  131372064,
-         120561410,  96514144,   55111265,   0,          -55111262,  -96514144,
-         -120561424, -131372064, -134419383, -138962344, -140244217, -139760124,
-         -138754673, -137726655, -136362532, -135476604, -134942075, -134630198,
-         -134217744},
-        {134217728,  134466320,  134648961,  134950176,  135410401,  135985835,
-         136237563,  136102933,  134921759,  131284100,  122416352,  111353663,
-         94151405,   69439052,   37821289,   0,          -37821289,  -69439058,
-         -94151405,  -111353655, -122416359, -131284100, -134921744, -136102933,
-         -136237563, -135985836, -135410401, -134950176, -134648961, -134466304,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133800456,  133466639,  132853833,  131704577,  129480322,
-         127184162,  123637500,  118091100,  109378569,  95840339,   83173415,
-         67033158,   47318062,   24552229,   0,          -24552227,  -47318062,
-         -67033165,  -83173405,  -95840348,  -109378569, -118091100, -123637492,
-         -127184170, -129480322, -131704577, -132853833, -133466647, -133800448,
-         -134217736},
-        {134217728,  133524250,  132980227,  132003691,  130239201,  127017985,
-         123891524,  119342831,  112695071,  102976138,  88899495,   76395462,
-         61022664,   42765392,   22085513,   0,          -22085512,  -42765395,
-         -61022669,  -76395462,  -88899495,  -102976129, -112695062, -119342822,
-         -123891527, -127017985, -130239210, -132003691, -132980227, -133524250,
-         -134217736},
-    },
-    {
-        {134217744,  134970359,  135553135,  136582894,  138392877,  141541743,
-         144424094,  148346340,  153978836,  176372729,  215302062,  259806420,
-         336609085,  494304735,  975787497,  -858993460, -975789097, -494304522,
-         -336609192, -259806447, -215302075, -176372702, -153978836, -148346340,
-         -144424109, -141541728, -138392877, -136582894, -135553135, -134970359,
-         -134217744},
-        {134217744,  134922022,  135466091,  136424566,  138099800,  140982070,
-         143578731,  147033572,  151452343,  168483023,  198394635,  228208128,
-         268470634,  312112739,  289892500,  0,          -289892633, -312112739,
-         -268470714, -228208155, -198394649, -168483009, -151452340, -147033558,
-         -143578731, -140982070, -138099815, -136424566, -135466075, -134922022,
-         -134217744},
-        {134217744,  134848627,  135333994,  136184803,  137657591,  140143456,
-         142320970,  145102040,  148388972,  157750196,  177226889,  192583689,
-         205271595,  199995929,  140105690,  0,          -140105757, -199995915,
-         -205271635, -192583689, -177226916, -157750183, -148388958, -145102025,
-         -142320985, -140143456, -137657591, -136184803, -135334009, -134848611,
-         -134217744},
-        {134217744,  134665058,  135004509,  135589124,  136567188,  138104822,
-         139307072,  140574980,  141457125,  140772491,  139820837,  138408050,
-         129080970,  105221711,  61032985,   0,          -61032985,  -105221711,
-         -129080997, -138408050, -139820850, -140772477, -141457125, -140574962,
-         -139307072, -138104806, -136567205, -135589140, -135004525, -134665058,
-         -134217744},
-        {134217728,  134487552,  134686918,  135018188,  135532903,  136208162,
-         136556685,  136561648,  135578778,  132209698,  123658874,  112777500,
-         95635765,   72064052,   39427432,   0,          -39427432,  -72064065,
-         -95635772,  -112777498, -123658874, -132209683, -135578762, -136561648,
-         -136556685, -136208146, -135532903, -135018204, -134686918, -134487552,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133766932,  133407501,  132750065,  131524599,  129174690,
-         126771678,  123092977,  117396601,  108539737,  94913060,   82256151,
-         66210183,   46688771,   24209158,   0,          -24209156,  -46688776,
-         -66210179,  -82256150,  -94913060,  -108539737, -117396605, -123092969,
-         -126771680, -129174690, -131524607, -132750073, -133407493, -133766932,
-         -134217736},
-        {134217728,  133468277,  132881938,  131832762,  129947063,  126534099,
-         123252524,  118522767,  111685262,  101806166,  87663578,   75208916,
-         59986579,   41990286,   21668928,   0,          -21668926,  -41990288,
-         -59986579,  -75208922,  -87663568,  -101806156, -111685259, -118522767,
-         -123252524, -126534093, -129947064, -131832762, -132881938, -133468277,
-         -134217736},
-    },
-    {
-        {134217744,  134911968,  135447966,  136391663,  138039000,  140866367,
-         143404554,  146764521,  151021632,  166927889,  195202182,  222570595,
-         257610421,  289862500,  252874234,  0,          -252874341, -289862420,
-         -257610501, -222570621, -195202209, -166927876, -151021632, -146764507,
-         -143404554, -140866352, -138039000, -136391663, -135447966, -134911968,
-         -134217744},
-        {134217744,  134867355,  135367738,  136245965,  137770239,  140356424,
-         142639355,  145588557,  149154344,  160361636,  182196342,  200588382,
-         218415341,  220218448,  161428236,  0,          -161428263, -220218448,
-         -218415395, -200588409, -182196329, -160361623, -149154344, -145588542,
-         -142639355, -140356409, -137770238, -136245981, -135367738, -134867355,
-         -134217744},
-        {134217744,  134799630,  135245963,  136025282,  137364449,  139591338,
-         141498666,  143852961,  146442545,  151309130,  165431889,  174391809,
-         177370022,  161281089,  104146144,  0,          -104146171, -161281089,
-         -177370049, -174391796, -165431903, -151309116, -146442531, -143852947,
-         -141498681, -139591338, -137364449, -136025297, -135245963, -134799614,
-         -134217744},
-        {134217744,  134630198,  134942075,  135476620,  136362516,  137726655,
-         138754657,  139760139,  140244217,  138962344,  134419383,  131372064,
-         120561410,  96514144,   55111265,   0,          -55111262,  -96514144,
-         -120561424, -131372064, -134419383, -138962344, -140244217, -139760124,
-         -138754673, -137726655, -136362532, -135476604, -134942075, -134630198,
-         -134217744},
-        {134217728,  134466320,  134648961,  134950176,  135410401,  135985835,
-         136237563,  136102933,  134921759,  131284100,  122416352,  111353663,
-         94151405,   69439052,   37821289,   0,          -37821289,  -69439058,
-         -94151405,  -111353655, -122416359, -131284100, -134921744, -136102933,
-         -136237563, -135985836, -135410401, -134950176, -134648961, -134466304,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133800456,  133466639,  132853833,  131704577,  129480322,
-         127184162,  123637500,  118091100,  109378569,  95840339,   83173415,
-         67033158,   47318062,   24552229,   0,          -24552227,  -47318062,
-         -67033165,  -83173405,  -95840348,  -109378569, -118091100, -123637492,
-         -127184170, -129480322, -131704577, -132853833, -133466647, -133800448,
-         -134217736},
-        {134217728,  133524250,  132980227,  132003691,  130239201,  127017985,
-         123891524,  119342831,  112695071,  102976138,  88899495,   76395462,
-         61022664,   42765392,   22085513,   0,          -22085512,  -42765395,
-         -61022669,  -76395462,  -88899495,  -102976129, -112695062, -119342822,
-         -123891527, -127017985, -130239210, -132003691, -132980227, -133524250,
-         -134217736},
-    },
-    {
-        {134217744,  134746091,  135149853,  135851434,  137045902,  138994799,
-         140615296,  142522879,  144398709,  145263103,  154205570,  158059476,
-         154411303,  133097570,  81316211,   0,          -81316218,  -133097557,
-         -154411316, -158059490, -154205570, -145263103, -144398709, -142522879,
-         -140615296, -138994799, -137045918, -135851434, -135149837, -134746091,
-         -134217744},
-        {134217744,  134712087,  135088825,  135741208,  136844475,  138619336,
-         140061990,  141695888,  143142475,  143327470,  147825383,  149173983,
-         142666250,  119784490,  71366272,   0,          -71366278,  -119784490,
-         -142666277, -149173996, -147825383, -143327466, -143142475, -141695873,
-         -140062006, -138619320, -136844467, -135741224, -135088825, -134712087,
-         -134217744},
-        {134217744,  134660400,  134996180,  135574064,  136539790,  138054064,
-         139232828,  140465192,  141293136,  140526367,  139073637,  137423983,
-         127872810,  103967578,  60168579,   0,          -60168585,  -103967578,
-         -127872810, -137423970, -139073650, -140526353, -141293121, -140465192,
-         -139232843, -138054064, -136539805, -135574064, -134996180, -134660400,
-         -134217744},
-        {134217728,  134531071,  134764682,  135157698,  135784674,  136666568,
-         137216832,  137515087,  136953956,  134166704,  126324470,  115870417,
-         101486344,  78107071,   43180379,   0,          -43180376,  -78107078,
-         -101486351, -115870417, -126324479, -134166695, -136953956, -137515087,
-         -137216847, -136666568, -135784674, -135157698, -134764682, -134531071,
-         -134217728},
-        {134217728,  134405853,  134541061,  134757061,  135063333,  135358653,
-         135340907,  134821548,  133101766,  128751127,  119073224,  107576641,
-         90275401,   66047293,   35143667,   0,          -35143667,  -66047293,
-         -90275401,  -107576641, -119073231, -128751127, -133101751, -134821548,
-         -135340923, -135358653, -135063349, -134757077, -134541061, -134405853,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133896028,  133635530,  133150648,  132221176,  130362696,
-         128381245,  125228635,  120138520,  111878281,  98637718,   85963798,
-         69556315,   49259814,   25615335,   0,          -25615335,  -49259818,
-         -69556310,  -85963798,  -98637709,  -111878269, -120138520, -125228635,
-         -128381253, -130362689, -132221184, -133150656, -133635522, -133896020,
-         -134217728},
-        {134217728,  133684024,  133261330,  132494150,  131082043,  128427016,
-         125767162,  121774843,  115728035,  106542671,  92727700,   80109047,
-         64295775,   45232366,   23417819,   0,          -23417819,  -45232366,
-         -64295775,  -80109047,  -92727700,  -106542662, -115728027, -121774851,
-         -125767170, -128427016, -131082043, -132494166, -133261346, -133684032,
-         -134217736},
-    },
-    {
-        {134217728,  134498993,  134707335,  135054789,  135598916,  136328115,
-         136729141,  136810142,  135935974,  132715400,  124342636,  113565825,
-         96534671,   73558872,   40348522,   0,          -40348522,  -73558878,
-         -96534671,  -113565825, -124342636, -132715400, -135935959, -136810142,
-         -136729157, -136328114, -135598899, -135054789, -134707335, -134498977,
-         -134217728},
-        {134217728,  134480680,  134674623,  134996162,  135493192,  136136017,
-         136453048,  136412541,  135364880,  131907703,  123252239,  112310291,
-         95147257,   71192238,   38892402,   0,          -38892399,  -71192238,
-         -95147250,  -112310298, -123252239, -131907703, -135364895, -136412525,
-         -136453064, -136136017, -135493192, -134996146, -134674623, -134480664,
-         -134217728},
-        {134217728,  134452852,  134624907,  134907111,  135332868,  135845392,
-         136036318,  135814387,  134509933,  130707049,  121647427,  110478071,
-         93245017,   68600483,   36868716,   0,          -36868712,  -68600489,
-         -93245017,  -110478064, -121647443, -130707034, -134509933, -135814387,
-         -136036318, -135845392, -135332883, -134907111, -134624907, -134452836,
-         -134217728},
-        {134217728,  134383129,  134500499,  134684594,  134933403,  135124815,
-         135007943,  134348507,  132435517,  127834959,  117883933,  106251321,
-         88935672,   64909116,   34475648,   0,          -34475644,  -64909116,
-         -88935679,  -106251321, -117883933, -127834944, -132435517, -134348491,
-         -135007943, -135124799, -134933403, -134684610, -134500515, -134383113,
-         -134217728},
-        {134217728,  134315558,  134380057,  134469604,  134548899,  134436000,
-         134031448,  132969681,  130510521,  125220028,  114545015,  102579384,
-         85276069,   61841172,   32692547,   0,          -32692547,  -61841176,
-         -85276077,  -102579384, -114545015, -125220021, -130510521, -132969665,
-         -134031463, -134436000, -134548899, -134469604, -134380057, -134315558,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134039455,  133889472,  133598612,  133005800,  131717634,
-         130237695,  127729079,  123411911,  115961741,  103323251,  90719885,
-         73928580,   52671496,   27500669,   0,          -27500669,  -52671501,
-         -73928580,  -90719885,  -103323262, -115961741, -123411903, -127729055,
-         -130237711, -131717634, -133005808, -133598612, -133889472, -134039455,
-         -134217728},
-        {134217728,  133924242,  133685411,  133238504,  132374593,  130626201,
-         128740547,  125709420,  120762531,  112648312,  99510021,   86841264,
-         70356022,   49879278,   25955971,   0,          -25955969,  -49879283,
-         -70356027,  -86841273,  -99510021,  -112648303, -120762517, -125709412,
-         -128740555, -130626208, -132374601, -133238504, -133685403, -133924234,
-         -134217728},
-    },
-    {
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-    },
-    {
-        {134217728,  133921369,  133680325,  133229561,  132358967,  130599331,
-         128703866,  125660282,  120698624,  112569265,  99420249,   86750797,
-         70273427,   49815207,   25920708,   0,          -25920706,  -49815216,
-         -70273432,  -86750797,  -99420258,  -112569265, -120698624, -125660282,
-         -128703874, -130599331, -132358983, -133229561, -133680325, -133921361,
-         -134217728},
-        {134217728,  133939441,  133712333,  133285932,  132457505,  130768900,
-         128935465,  125970874,  121102931,  113070012,  99989904,   87325519,
-         70798668,   50223016,   26145306,   0,          -26145303,  -50223020,
-         -70798668,  -87325510,  -99989904,  -113070007, -121102923, -125970860,
-         -128935481, -130768900, -132457513, -133285939, -133712341, -133939433,
-         -134217728},
-        {134217728,  133966965,  133761027,  133371807,  132607806,  131028081,
-         129290132,  126447716,  121725742,  113844587,  100875428,  88221954,
-         71620616,   50862942,   26498391,   0,          -26498387,  -50862942,
-         -71620616,  -88221954,  -100875420, -113844579, -121725728, -126447716,
-         -129290134, -131028089, -132607814, -133371815, -133761036, -133966957,
-         -134217728},
-        {134217728,  134036022,  133883399,  133587872,  132986916,  131684800,
-         130192440,  127667609,  123330612,  115858986,  103203513,  90596996,
-         73814421,   52581631,   27450707,   0,          -27450704,  -52581631,
-         -73814421,  -90596996,  -103203522, -115858986, -123330612, -127667609,
-         -130192441, -131684792, -132986917, -133587864, -133883399, -134036014,
-         -134217728},
-        {134217728,  134103202,  134002513,  133798640,  133358145,  132331971,
-         131086862,  128886498,  124951211,  117920856,  105625489,  93096793,
-         76149699,   54428898,   28481041,   0,          -28481039,  -54428898,
-         -76149699,  -93096785,  -105625498, -117920856, -124951211, -128886489,
-         -131086879, -132331963, -133358153, -133798640, -134002521, -134103194,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134379666,  134494354,  134673574,  134913679,  135089351,
-         134957528,  134277005,  132335084,  127697337,  117706188,  106054041,
-         88737144,   64741149,   34377366,   0,          -34377367,  -64741156,
-         -88737144,  -106054041, -117706196, -127697337, -132335084, -134276990,
-         -134957528, -135089351, -134913695, -134673590, -134494354, -134379666,
-         -134217728},
-        {134217728,  134496089,  134702142,  135045469,  135582090,  136297572,
-         136685224,  136746798,  135844838,  132586207,  124167625,  113363717,
-         96250743,   73172765,   40110159,   0,          -40110156,  -73172772,
-         -96250750,  -113363724, -124167639, -132586207, -135844838, -136746798,
-         -136685224, -136297572, -135582122, -135045469, -134702142, -134496073,
-         -134217728},
-    },
-    {
-        {134217728,  133678764,  133252044,  132477911,  131054012,  128379841,
-         125703998,  121692333,  115624181,  106419205,  92593586,   79977943,
-         64179408,   45144170,   23370016,   0,          -23370016,  -45144171,
-         -64179414,  -79977946,  -92593586,  -106419205, -115624163, -121692333,
-         -125704006, -128379841, -131054020, -132477902, -133252052, -133678756,
-         -134217736},
-        {134217728,  133712005,  133310620,  132580354,  131230923,  128677921,
-         126103542,  122214988,  116283239,  107204353,  93448335,   80814831,
-         64923238,   45708586,   23676173,   0,          -23676171,  -45708591,
-         -64923238,  -80814831,  -93448335,  -107204344, -116283230, -122214988,
-         -126103542, -128677921, -131230923, -132580362, -133310620, -133711997,
-         -134217736},
-        {134217728,  133762594,  133399847,  132736656,  131501355,  129135285,
-         126718565,  123023009,  117307580,  108432557,  94794977,   82139615,
-         66105845,   46609132,   24165789,   0,          -24165786,  -46609132,
-         -66105845,  -82139614,  -94794987,  -108432548, -117307580, -123023009,
-         -126718574, -129135285, -131501371, -132736656, -133399839, -133762594,
-         -134217736},
-        {134217728,  133889704,  133624356,  133130995,  132186884,  130303885,
-         128301191,  125121697,  120000061,  111707953,  98445440,   85770865,
-         69380893,   49124196,   25540859,   0,          -25540856,  -49124196,
-         -69380893,  -85770874,  -98445449,  -111707944, -120000061, -125121697,
-         -128301191, -130303893, -132186900, -133130995, -133624357, -133889712,
-         -134217728},
-        {134217728,  134013488,  133843425,  133517257,  132862879,  131469448,
-         129895964,  127265729,  122800030,  115190043,  102426301,  89801131,
-         73076634,   52001860,   27128796,   0,          -27128794,  -52001864,
-         -73076638,  -89801131,  -102426301, -115190039, -122800030, -127265729,
-         -129895972, -131469447, -132862879, -133517265, -133843441, -134013480,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134524667,  134753225,  135137152,  135747532,  136598811,
-         137119081,  137373516,  136748951,  133873234,  125921352,  115399246,
-         100457878,  77154925,   42583859,   0,          -42583859,  -77154925,
-         -100457884, -115399246, -125921369, -133873234, -136748936, -137373501,
-         -137119096, -136598811, -135747548, -135137152, -134753241, -134524667,
-         -134217728},
-        {134217744,  134740697,  135140165,  135833916,  137013874,  138934982,
-         140527025,  142390622,  144197099,  144950610,  153156290,  156579036,
-         152419516,  130790170,  79555585,   0,          -79555598,  -130790170,
-         -152419516, -156579036, -153156290, -144950597, -144197099, -142390622,
-         -140527040, -138934982, -137013891, -135833916, -135140150, -134740697,
-         -134217744},
-    },
-    {
-        {134217728,  133517388,  132968168,  131982689,  130203271,  126958371,
-         123812646,  119241372,  112569785,  102830521,  88745154,   76246960,
-         60892748,   42668052,   22033146,   0,          -22033144,  -42668058,
-         -60892753,  -76246960,  -88745154,  -102830531, -112569785, -119241363,
-         -123812646, -126958371, -130203280, -131982697, -132968160, -133517380,
-         -134217736},
-        {134217728,  133560667,  133044207,  132115111,  130430074,  127335394,
-         124312090,  119884885,  113366063,  103758318,  89731133,   77197209,
-         61725371,   43292651,   22369435,   0,          -22369434,  -43292655,
-         -61725371,  -77197209,  -89731143,  -103758309, -113366066, -119884894,
-         -124312098, -127335394, -130430074, -132115119, -133044215, -133560651,
-         -134217736},
-        {134217728,  133626556,  133160120,  132317284,  130777308,  127915335,
-         125083431,  120883935,  114610226,  105218855,  91295851,   78713135,
-         63059915,   44297538,   22911785,   0,          -22911782,  -44297538,
-         -63059910,  -78713135,  -91295851,  -105218855, -114610226, -120883926,
-         -125083440, -127915335, -130777308, -132317293, -133160128, -133626540,
-         -134217736},
-        {134217728,  133792202,  133452102,  132828323,  131660297,  129405046,
-         127082463,  123503081,  117919375,  109170723,  95610055,   82945267,
-         66828178,   47161136,   24466610,   0,          -24466610,  -47161136,
-         -66828178,  -82945267,  -95610064,  -109170725, -117919366, -123503090,
-         -127082486, -129405039, -131660312, -132828331, -133452110, -133792210,
-         -134217736},
-        {134217728,  133953625,  133737455,  133330222,  132534982,  130902453,
-         129118100,  126216242,  121423078,  113467678,  100443871,  87784612,
-         71219202,   50550149,   26325706,   0,          -26325706,  -50550154,
-         -71219202,  -87784603,  -100443871, -113467678, -121423078, -126216226,
-         -129118109, -130902436, -132534997, -133330214, -133737456, -133953625,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217744,  134621813,  134927051,  135449572,  136313400,  137636071,
-         138622650,  139566056,  139956832,  138536878,  133180717,  129783677,
-         118675624,  94628818,   53853299,   0,          -53853295,  -94628811,
-         -118675637, -129783677, -133180717, -138536882, -139956832, -139566056,
-         -138622666, -137636071, -136313400, -135449572, -134927051, -134621813,
-         -134217744},
-        {134217744,  134904883,  135435219,  136368502,  137996233,  140785045,
-         143282261,  146575942,  150720567,  165849956,  193015195,  218765208,
-         250475834,  276007487,  232012394,  0,          -232012528, -276007460,
-         -250475861, -218765208, -193015222, -165849956, -150720553, -146575942,
-         -143282275, -140785029, -137996233, -136368502, -135435219, -134904883,
-         -134217744},
-    },
-};
 
-const WORD32 ixheaacd_beta_Q28[16][8][31] = {
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019540936f, 0.0034606718f, 0.0061091632f,
+         0.0107228868f, 0.0186282881f, 0.0257363543f, 0.0352233760f,
+         0.0475566611f, 0.0629518107f, 0.0809580833f, 0.0936254412f,
+         0.1057573855f, 0.1160409376f, 0.1230182052f, 0.1254990250f,
+         0.1230182126f, 0.1160409376f, 0.1057573855f, 0.0936254412f,
+         0.0809580907f, 0.0629518107f, 0.0475566611f, 0.0352233723f,
+         0.0257363543f, 0.0186282881f, 0.0107228868f, 0.0061091632f,
+         0.0034606718f, 0.0019540936f, 0.0000000112f},
+        {0.0000000186f, 0.0030265115f, 0.0053620972f, 0.0094724931f,
+         0.0166464634f, 0.0289774239f, 0.0401044935f, 0.0550108925f,
+         0.0744772330f, 0.0989024863f, 0.1276271343f, 0.1479234397f,
+         0.1674221754f, 0.1839915216f, 0.1952533126f, 0.1992611140f,
+         0.1952533126f, 0.1839915067f, 0.1674221903f, 0.1479234397f,
+         0.1276271492f, 0.0989024863f, 0.0744772330f, 0.0550108925f,
+         0.0401044972f, 0.0289774239f, 0.0166464634f, 0.0094724931f,
+         0.0053620972f, 0.0030265115f, 0.0000000186f},
+        {0.0000000261f, 0.0044795908f, 0.0079446994f, 0.0140600502f,
+         0.0247849934f, 0.0433696434f, 0.0602979437f, 0.0832019523f,
+         0.1134835035f, 0.1520351619f, 0.1980977207f, 0.2310739607f,
+         0.2630588710f, 0.2904545665f, 0.3091802299f, 0.3158638775f,
+         0.3091802299f, 0.2904545665f, 0.2630588710f, 0.2310739756f,
+         0.1980977207f, 0.1520351619f, 0.1134835035f, 0.0832019523f,
+         0.0602979474f, 0.0433696434f, 0.0247849971f, 0.0140600502f,
+         0.0079446994f, 0.0044795908f, 0.0000000261f},
+        {0.0000000298f, 0.0052186511f, 0.0092647560f, 0.0164252073f,
+         0.0290434174f, 0.0510888547f, 0.0713650510f, 0.0990892947f,
+         0.1362429261f, 0.1843356937f, 0.2429044843f, 0.2855334580f,
+         0.3274079263f, 0.3636668324f, 0.3886501491f, 0.3976052999f,
+         0.3886501789f, 0.3636668026f, 0.3274079263f, 0.2855334580f,
+         0.2429044992f, 0.1843357086f, 0.1362429261f, 0.0990892947f,
+         0.0713650584f, 0.0510888584f, 0.0290434174f, 0.0164252073f,
+         0.0092647560f, 0.0052186511f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045594499f, 0.0081285350f, 0.0145191513f,
+         0.0260186046f, 0.0468755513f, 0.0669798329f, 0.0960334241f,
+         0.1381545961f, 0.1990868747f, 0.2927374542f, 0.3888260126f,
+         0.5107848644f, 0.6488836408f, 0.7694273591f, 0.8192751408f,
+         0.7694274187f, 0.6488835216f, 0.5107849240f, 0.3888260126f,
+         0.2927374840f, 0.1990868896f, 0.1381545961f, 0.0960334167f,
+         0.0669798404f, 0.0468755476f, 0.0260186046f, 0.0145191513f,
+         0.0081285350f, 0.0045594499f, 0.0000000261f},
+        {0.0000000037f, 0.0007977076f, 0.0014247037f, 0.0025531128f,
+         0.0046027601f, 0.0083869211f, 0.0121226721f, 0.0176920481f,
+         0.0261930563f, 0.0433672927f, 0.0784488842f, 0.1264052540f,
+         0.2276235074f, 0.4984348118f, 1.6047799587f, 5.8778095245f,
+         1.6047828197f, 0.4984346628f, 0.2276235521f, 0.1264052540f,
+         0.0784488916f, 0.0433672965f, 0.0261930563f, 0.0176920481f,
+         0.0121226721f, 0.0083869211f, 0.0046027601f, 0.0025531128f,
+         0.0014247037f, 0.0007977076f, 0.0000000037f}},
     {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        524548,   928967,   1639916,  2878403,  5000493,  6908550,
-         9455203,  12765894, 16898498, 21732020, 25132388, 28389032, 31149502,
-         33022448, 33688388, 33022450, 31149502, 28389032, 25132388, 21732022,
-         16898498, 12765894, 9455202,  6908550,  5000493,  2878403,  1639916,
-         928967,   524548,   3},
-        {5,        812423,   1439377,  2542753,  4468501,  7778568,  10765468,
-         14766874, 19992330, 26548934, 34259648, 39707896, 44942048, 49389848,
-         52412912, 53488748, 52412912, 49389844, 44942052, 39707896, 34259652,
-         26548934, 19992330, 14766874, 10765469, 7778568,  4468501,  2542753,
-         1439377,  812423,   5},
-        {7,        1202481,  2132639,  3774216,  6653171,  11641950, 16186106,
-         22334354, 30462996, 40811628, 53176452, 62028444, 70614328, 77968304,
-         82994936, 84789064, 82994936, 77968304, 70614328, 62028448, 53176452,
-         40811628, 30462996, 22334354, 16186107, 11641950, 6653172,  3774216,
-         2132639,  1202481,  7},
-        {8,        1400871,  2486989,   4409108,   7796283,   13714060,
-         19156910, 26599080, 36572432,  49482236,  65204176,  76647304,
-         87887896, 97621072, 104327480, 106731360, 104327488, 97621064,
-         87887896, 76647304, 65204180,  49482240,  36572432,  26599080,
-         19156912, 13714061, 7796283,   4409108,   2486989,   1400871,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1223918,   2181987,   3897455,   6984316,   12583060,
-         17979762,  25778776,  37085592,  53441976,  78581112,  104374688,
-         137112768, 174183376, 206541584, 219922496, 206541600, 174183344,
-         137112784, 104374688, 78581120,  53441980,  37085592,  25778774,
-         17979764,  12583059,  6984316,   3897455,   2181987,   1223918,
-         7},
-        {1,        214133,    382441,    685346,     1235544,   2251347,
-         3254155,  4749173,   7031145,   11641319,   21058462,  33931652,
-         61102220, 133797576, 430779840, 1577812480, 430780608, 133797536,
-         61102232, 33931652,  21058464,  11641320,   7031145,   4749173,
-         3254155,  2251347,   1235544,   685346,     382441,    214133,
-         1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        524756,   929618,   1641931,  2884546,  5018684,  6942684,
-         9517694,  12876462, 17085148, 22027532, 25515680, 28863994, 31707368,
-         33639036, 34326304, 33639036, 31707366, 28863996, 25515680, 22027532,
-         17085148, 12876462, 9517694,  6942685,  5018684,  2884546,  1641932,
-         929618,   524756,   3},
-        {5,        812713,   1440285,  2545568,  4477108,  7804208,  10813826,
-         14855985, 20151268, 26819764, 34692788, 40273396, 45646932, 50221664,
-         53335084, 54443828, 53335084, 50221660, 45646932, 40273396, 34692788,
-         26819762, 20151268, 14855984, 10813826, 7804208,  4477108,  2545568,
-         1440285,  812713,   5},
-        {7,        1202789,  2133603,  3777225,  6662453,  11670018, 16239749,
-         22434930, 30646316, 41132172, 53703904, 62730216, 71504264, 79033256,
-         84186408, 86026976, 84186408, 79033248, 71504272, 62730216, 53703904,
-         41132176, 30646314, 22434930, 16239752, 11670018, 6662454,  3777225,
-         2133603,  1202789,  7},
-        {8,        1401091,  2487681,   4411274,   7803027,   13734770,
-         19197032, 26675680, 36715348,  49739444,  65641580,  77242592,
-         88658976, 98560160, 105390504, 107840400, 105390512, 98560152,
-         88658992, 77242592, 65641576,  49739444,  36715348,  26675674,
-         19197034, 13734770, 7803028,   4411274,   2487680,   1401091,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1223607,   2180998,   3894286,   6974063,   12549334,
-         17910016,  25632730,  36775224,  52772652,  75633064,  99236928,
-         128381344, 160330848, 187347760, 198291376, 187347792, 160330816,
-         128381360, 99236928,  75633072,  52772648,  36775220,  25632728,
-         17910018,  12549334,  6974064,   3894286,   2180998,   1223607,
-         7},
-        {1,        214041,   382148,    684396,    1232418,   2240724,
-         3231452,  4699171,  6913169,   11028142,  19133978,  29199466,
-         47298748, 81631520, 140893408, 184843504, 140893488, 81631504,
-         47298752, 29199468, 19133982,  11028142,  6913169,   4699170,
-         3231452,  2240724,  1232418,   684397,    382148,    214041,
-         1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        525351,   931480,   1647714,  2902257,  5071597,  7042735,
-         9702682,  13207802, 17652582, 22940042, 26711396, 30359376, 33476790,
-         35604100, 36362732, 35604100, 33476786, 30359378, 26711396, 22940042,
-         17652582, 13207802, 9702681,  7042735,  5071597,  2902257,  1647714,
-         931480,   525351,   3},
-        {5,        813540,   1442877,  2553636,  4501896,  7878638,  10955188,
-         15118865, 20625528, 27638916, 36022472, 42026548, 47851776, 52842400,
-         56254208, 57472080, 56254208, 52842396, 47851784, 42026548, 36022476,
-         27638918, 20625528, 15118864, 10955189, 7878638,  4501896,  2553636,
-         1442877,  813540,   5},
-        {7,        1203665,  2136357,  3785832,  6689100,  11751078, 16395488,
-         22728960, 31187070, 42088120, 55296528, 64867172, 74235600, 82322976,
-         87882752, 89873216, 87882752, 82322968, 74235600, 64867176, 55296532,
-         42088120, 31187070, 22728958, 16395489, 11751078, 6689101,  3785832,
-         2136357,  1203665,  7},
-        {8,        1401717,   2489652,   4417463,   7822332,   13794262,
-         19312684, 26897488,  37131704,  50494456,  66937128,  79016952,
-         90971256, 101390632, 108605536, 111198632, 108605544, 101390624,
-         90971264, 79016952,  66937124,  50494456,  37131704,  26897486,
-         19312686, 13794262,  7822333,   4417463,   2489652,   1401717,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1222724,   2178188,   3885304,   6945113,   12454759,
-         17715754,  25230046,  35932316,  50996136,  71510480,  88238104,
-         108673696, 130724624, 148143056, 154903104, 148143056, 130724616,
-         108673712, 88238104,  71510496,  50996136,  35932312,  25230042,
-         17715758,  12454758,  6945114,   3885304,   2178189,   1222724,
-         7},
-        {1,        213781,   381315,   681714,   1223645,  2211279,  3169313,
-         4564991,  6613954,  9638447,  15182689, 20899234, 28782236, 38682308,
-         48311500, 52599960, 48311512, 38682304, 28782238, 20899234, 15182691,
-         9638447,  6613954,  4564991,  3169313,  2211279,  1223645,  681714,
-         381315,   213781,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        526244,   934286,   1656482,  2929383,  5154009,  7200895,
-         10000863, 13755239, 18618438, 24545894, 28863348, 33106848, 36783144,
-         39317176, 40225672, 39317176, 36783140, 33106852, 28863350, 24545894,
-         18618438, 13755239, 10000861, 7200896,  5154009,  2929384,  1656483,
-         934287,   526244,   3},
-        {5,        814783,   1446784,  2565855,  4539774,  7994119,  11177507,
-         15539745, 21402348, 29018418, 38333064, 45138568, 51843732, 57665092,
-         61684144, 63126300, 61684144, 57665092, 51843740, 45138568, 38333064,
-         29018418, 21402346, 15539743, 11177508, 7994120,  4539775,  2565855,
-         1446784,  814783,   5},
-        {7,        1204981,  2140499,  3798824,  6729584,  11875611, 16637170,
-         23191438, 32052658, 43652108, 57969132, 68517104, 78979352, 88117000,
-         94454304, 96733920, 94454304, 88116992, 78979352, 68517104, 57969132,
-         43652104, 32052654, 23191436, 16637170, 11875611, 6729584,  3798824,
-         2140499,  1204981,  7},
-        {8,        1402655,   2492611,   4426772,   7851491,   13884761,
-         19489746, 27240036,  37782176,  51691532,  69027848,  81916832,
-         94796824, 106122752, 114019032, 116867632, 114019032, 106122744,
-         94796832, 81916840,  69027848,  51691532,  37782172,  27240034,
-         19489748, 13884760,  7851492,   4426772,   2492611,   1402655,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1221406,   2174004,   3871976,   6902451,   12317130,
-         17436482, 24661340,  34772520,  48643564,  66845116,  81092456,
-         95994376, 109691784, 119593840, 123240696, 119593848, 109691776,
-         95994392, 81092456,  66845116,  48643564,  34772520,  24661336,
-         17436482, 12317130,  6902452,   3871976,   2174004,   1221406,
-         7},
-        {1,        213393,   380079,   677757,   1210858,  2169302,  3082668,
-         4384052,  6230857,  8816279,  12308982, 15131108, 18175564, 21641460,
-         24357568, 25401718, 24357570, 21641458, 18175566, 15131109, 12308983,
-         8816278,  6230857,  4384051,  3082668,  2169302,  1210858,  677757,
-         380079,   213393,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        527304,   937630,   1667008,  2962381,  5256587,  7401904,
-         10390627, 14497757, 19991098, 26957670, 32224264, 37562304, 42318920,
-         45670152, 46886204, 45670152, 42318924, 37562308, 32224264, 26957670,
-         19991098, 14497757, 10390626, 7401904,  5256587,  2962381,  1667008,
-         937630,   527304,   3},
-        {5,        816257,   1451433,  2580496,  4585709,  8137095,  11458003,
-         16084489, 22442248, 30945832, 41729952, 49882536, 58145720, 65508872,
-         70696504, 72578936, 70696512, 65508868, 58145724, 49882536, 41729952,
-         30945832, 22442248, 16084488, 11458004, 8137095,  4585709,  2580496,
-         1451434,  816257,   5},
-        {7,        1206538,  2145415,   3814322,   6778296,   12027725,
-         16936476, 23775046, 33172672,  45742120,  61682500,  73733120,
-         85947224, 96830952, 104498976, 107281456, 104498984, 96830952,
-         85947232, 73733128, 61682504,  45742116,  33172670,  23775044,
-         16936476, 12027724, 6778297,   3814322,   2145415,   1206538,
-         7},
-        {8,        1403765,   2496115,   4437830,   7886310,   13993836,
-         19704996, 27661434,  38595240,  53219352,  71765424,  85785904,
-         99996584, 112659424, 121580896, 124818216, 121580904, 112659416,
-         99996592, 85785904,  71765432,  53219352,  38595240,  27661430,
-         19704998, 13993836,  7886311,   4437830,   2496115,   1403764,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1219857,  2169099,   3856430,   6853125,   12160503,
-         17123444, 24037508, 33538878,  46247084,  62363436,  74547088,
-         86896032, 97899912, 105652584, 108465784, 105652592, 97899904,
-         86896032, 74547096, 62363440,  46247084,  33538876,  24037506,
-         17123446, 12160503, 6853125,   3856430,   2169099,   1219857,
-         7},
-        {1,        212938,   378637,   673176,   1196278,  2122731,  2989060,
-         4195976,  5854530,  8072868,  10886130, 13012902, 15168527, 17089358,
-         18442662, 18933732, 18442662, 17089358, 15168528, 13012903, 10886130,
-         8072867,  5854530,  4195975,  2989060,  2122731,  1196278,  673176,
-         378637,   212938,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        528371,   941010,   1677737,  2996520,  5365544,  7620743,
-         10829829, 15375154, 21720308, 30256412, 37121464, 44492716, 52140904,
-         58486168, 60914048, 58486172, 52140900, 44492720, 37121464, 30256412,
-         21720308, 15375154, 10829827, 7620744,  5365544,  2996520,  1677737,
-         941010,   528371,   3},
-        {5,        817738,   1456128,  2595392,  4633066,  8288027,  11760734,
-         16690856, 23650124, 33316570, 46226512, 56525852, 67496896, 77774760,
-         85824632, 89194720, 85824640, 77774752, 67496904, 56525856, 46226512,
-         33316570, 23650120, 16690854, 11760735, 8288027,  4633066,  2595392,
-         1456128,  817738,   5},
-        {7,        1208101,   2150365,   3830012,   6828082,   12185838,
-         17252538, 24405052,  34418948,  48164280,  66215072,  80356216,
-         95158664, 108775560, 118626184, 122255560, 118626184, 108775544,
-         95158664, 80356216,  66215080,  48164276,  34418944,  24405050,
-         17252540, 12185838,  6828083,   3830012,   2150365,   1208101,
-         7},
-        {8,         1404877,   2499634,   4448971,   7921597,   14105523,
-         19927540,  28103010,  39463168,  54891176,  74856880,  90260672,
-         106158016, 120574816, 130879072, 134648960, 130879072, 120574816,
-         106158024, 90260672,  74856888,  54891176,  39463164,  28103008,
-         19927542,  14105523,  7921598,   4448971,   2499634,   1404876,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1218314,  2164227,  3841070,  6804841,  12009704, 16826680,
-         23458746, 32427858, 44173136, 58677072, 69367448, 79974728, 89242016,
-         95670824, 97983664, 95670824, 89242016, 79974736, 69367448, 58677072,
-         44173140, 32427856, 23458742, 16826682, 12009704, 6804841,  3841070,
-         2164227,  1218314,  7},
-        {1,        212485,   377211,   668688,   1182212,  2079037,  2903492,
-         4030197,  5539070,  7490515,  9864627,  11591052, 13285722, 14752220,
-         15762207, 16124145, 15762208, 14752220, 13285722, 11591053, 9864628,
-         7490515,  5539070,  4030197,  2903492,  2079037,  1182212,  668688,
-         377210,   212485,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        529280,   943904,    1686997,   3026404,   5463419,
-         7822298,  11249275, 16258557,  23600720,  36288716,  49305868,
-         66713524, 87729680, 107320208, 115788648, 107320216, 87729672,
-         66713540, 49305872, 36288720,  23600720,  16258558,  11249274,
-         7822299,  5463419,  3026404,   1686997,   943904,    529280,
-         3},
-        {5,        819001,    1460144,   2608223,   4674384,   8422779,
-         12037082, 17262416,  24842774,  35819472,  52848540,  70312664,
-         92562776, 117871664, 140063104, 149267152, 140063136, 117871648,
-         92562792, 70312664,  52848544,  35819468,  24842772,  17262414,
-         12037082, 8422779,   4674385,   2608223,   1460144,   819001,
-         5},
-        {7,         1209431,   2154588,   3843465,   6871159,   12324878,
-         17534810,  24980280,  35593252,  50549888,  70956104,  87630984,
-         108587520, 130892864, 148578016, 155457280, 148578016, 130892848,
-         108587528, 87630992,  70956112,  50549884,  35593252,  24980278,
-         17534812,  12324878,  6871160,   3843465,   2154588,   1209431,
-         7},
-        {8,         1405821,   2502628,   4458482,   7951885,   14202332,
-         20122228,  28494402,  40246696,  56439064,  77816136,  94657800,
-         112381552, 128775696, 140691712, 145094384, 140691728, 128775688,
-         112381568, 94657808,  77816144,  56439060,  40246696,  28494400,
-         20122230,  14202331,  7951885,   4458482,   2502629,   1405821,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1217010,  2160122,  3828190,  6764697,  11886164, 16586827,
-         22999516, 31567738, 42617632, 56016164, 65730784, 75244880, 83461560,
-         89112016, 91135304, 89112024, 83461552, 75244888, 65730788, 56016164,
-         42617628, 31567738, 22999514, 16586829, 11886164, 6764698,  3828190,
-         2160122,  1217010,  7},
-        {1,        212104,   376014,   664952,   1170669,  2044035,  2836433,
-         3904056,  5308151,  7084523,  9192281,  10692476, 12141331, 13377854,
-         14220870, 14521357, 14220870, 13377854, 12141331, 10692476, 9192281,
-         7084523,  5308151,  3904056,  2836433,  2044035,  1170669,  664952,
-         376014,   212104,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,         529890,    945853,    1693270,   3046878,   5531883,
-         7966241,   11558316,  16941404,  26405616,  44726228,  66299660,
-         102135296, 161287136, 242754912, 290875520, 242754976, 161287104,
-         102135328, 66299668,  44726228,  26405616,  16941404,  11558314,
-         7966241,   5531883,   3046878,   1693270,   945853,    529890,
-         3},
-        {5,         819848,    1462845,   2616904,   4702616,   8516569,
-         12232970,  17678754,  25748164,  38567944,  62864780,  89227176,
-         128392144, 182850000, 242436080, 271403040, 242436160, 182849968,
-         128392176, 89227168,  62864788,  38567940,  25748164,  17678752,
-         12232972,  8516569,   4702617,   2616904,   1462845,   819848,
-         5},
-        {7,         1210322,   2157425,   3852534,   6900401,   12420479,
-         17731328,  25388104,  36448364,  52356736,  75502992,  99354648,
-         128997304, 161739680, 189630656, 200981856, 189630656, 161739664,
-         128997328, 99354648,  75503000,  52356740,  36448368,  25388100,
-         17731330,  12420478,  6900402,   3852534,   2157425,   1210322,
-         7},
-        {8,         1406453,   2504636,   4464871,   7972318,   14268137,
-         20255542,  28765222,  40797016,  57549412,  80000928,  97981248,
-         117206704, 135388800, 151411120, 157516432, 151411136, 135388784,
-         117206704, 97981248,  80000928,  57549412,  40797012,  28765220,
-         20255542,  14268138,  7972319,   4464871,   2504636,   1406453,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1216142,  2157392,  3819657,  6738267,  11805711, 16432165,
-         22707286, 31029754, 41665420, 54427540, 63597164, 72515376, 80171616,
-         85413624, 87286256, 85413624, 80171608, 72515384, 63597164, 54427544,
-         41665420, 31029756, 22707284, 16432167, 11805712, 6738268,  3819657,
-         2157392,  1216142,  7},
-        {1,        211851,   375221,   662491,   1163142,  2021609,  2794131,
-         3826087,  5169036,  6847367,  8812784,  10196808, 11523252, 12648227,
-         13411804, 13683354, 13411805, 12648226, 11523253, 10196809, 8812784,
-         6847366,  5169036,  3826086,  2794132,  2021609,  1163142,  662491,
-         375221,   211851,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -858993460,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,         530105,    946540,    1695490,   3054166,   5556542,
-         8018704,   11673036,  17202416,  27742908,  48702648,  75428704,
-         125542128, 228590144, 435938784, 620187584, 435939008, 228590112,
-         125542176, 75428712,  48702652,  27742906,  17202416,  11673035,
-         8018704,   5556542,   3054167,   1695490,   946540,    530105,
-         3},
-        {5,         820146,    1463798,   2619972,   4712652,   8550255,
-         12304061,  17832260,  26090394,  40209740,  67346928,  98535008,
-         148589136, 226742368, 326144352, 380823904, 326144512, 226742336,
-         148589184, 98535016,  67346936,  40209736,  26090392,  17832256,
-         12304062,  8550254,   4712652,   2619972,   1463798,   820145,
-         5},
-        {7,         1210636,   2158423,   3855734,   6910758,   12454582,
-         17801918,  25536124,  36763592,  53038744,  78536976,  104675848,
-         138113008, 176331952, 210006528, 224018288, 210006544, 176331920,
-         138113024, 104675856, 78536984,  53038744,  36763592,  25536118,
-         17801920,  12454581,  6910759,   3855734,   2158423,   1210636,
-         7},
-        {8,         1406676,   2505341,   4467122,   7979530,   14291465,
-         20302986,  28862170,  40995684,  57955156,  80812936,  99234096,
-         119054544, 140506896, 157841056, 164487296, 157841072, 140506896,
-         119054552, 99234096,  80812936,  57955148,  40995680,  28862168,
-         20302988,  14291464,  7979531,   4467122,   2505342,   1406676,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1215837,  2156436,  3816673,  6729059,  11777845, 16378872,
-         22607278, 30847268, 41345884, 53900940, 62895796, 71625096, 79105408,
-         84220136, 86046016, 84220136, 79105408, 71625096, 62895796, 53900940,
-         41345884, 30847270, 22607276, 16378873, 11777844, 6729060,  3816673,
-         2156436,  1215837,  7},
-        {1,        211762,   374943,   661633,   1160533,  2013907,  2779720,
-         3799796,  5122719,  6769570,  8690265,  10038436, 11327602, 12418982,
-         13158826, 13421767, 13158826, 12418981, 11327602, 10038436, 8690264,
-         6769570,  5122719,  3799796,  2779720,  2013907,  1160533,  661633,
-         374943,   211762,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,         529890,    945853,    1693270,   3046878,   5531883,
-         7966241,   11558316,  16941404,  26405616,  44726228,  66299660,
-         102135296, 161287136, 242754912, 290875520, 242754976, 161287104,
-         102135328, 66299668,  44726228,  26405616,  16941404,  11558314,
-         7966241,   5531883,   3046878,   1693270,   945853,    529890,
-         3},
-        {5,         819848,    1462845,   2616904,   4702616,   8516569,
-         12232970,  17678754,  25748164,  38567944,  62864780,  89227176,
-         128392144, 182850000, 242436080, 271403040, 242436160, 182849968,
-         128392176, 89227168,  62864788,  38567940,  25748164,  17678752,
-         12232972,  8516569,   4702617,   2616904,   1462845,   819848,
-         5},
-        {7,         1210322,   2157425,   3852534,   6900401,   12420479,
-         17731328,  25388104,  36448364,  52356736,  75502992,  99354648,
-         128997304, 161739680, 189630656, 200981856, 189630656, 161739664,
-         128997328, 99354648,  75503000,  52356740,  36448368,  25388100,
-         17731330,  12420478,  6900402,   3852534,   2157425,   1210322,
-         7},
-        {8,         1406453,   2504636,   4464871,   7972318,   14268137,
-         20255542,  28765222,  40797016,  57549412,  80000928,  97981248,
-         117206704, 135388800, 151411120, 157516432, 151411136, 135388784,
-         117206704, 97981248,  80000928,  57549412,  40797012,  28765220,
-         20255542,  14268138,  7972319,   4464871,   2504636,   1406453,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1216142,  2157392,  3819657,  6738267,  11805711, 16432165,
-         22707286, 31029754, 41665420, 54427540, 63597164, 72515376, 80171616,
-         85413624, 87286256, 85413624, 80171608, 72515384, 63597164, 54427544,
-         41665420, 31029756, 22707284, 16432167, 11805712, 6738268,  3819657,
-         2157392,  1216142,  7},
-        {1,        211851,   375221,   662491,   1163142,  2021609,  2794131,
-         3826087,  5169036,  6847367,  8812784,  10196808, 11523252, 12648227,
-         13411804, 13683354, 13411805, 12648226, 11523253, 10196809, 8812784,
-         6847366,  5169036,  3826086,  2794132,  2021609,  1163142,  662491,
-         375221,   211851,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        529280,   943904,    1686997,   3026404,   5463419,
-         7822298,  11249275, 16258558,  23600720,  36288720,  49305868,
-         66713532, 87729688, 107320216, 115788672, 107320232, 87729680,
-         66713548, 49305876, 36288720,  23600720,  16258558,  11249274,
-         7822299,  5463419,  3026404,   1686997,   943904,    529280,
-         3},
-        {5,        819001,    1460144,   2608223,   4674384,   8422779,
-         12037082, 17262416,  24842774,  35819472,  52848540,  70312672,
-         92562784, 117871672, 140063120, 149267168, 140063152, 117871656,
-         92562800, 70312664,  52848548,  35819468,  24842772,  17262414,
-         12037084, 8422779,   4674385,   2608223,   1460144,   819001,
-         5},
-        {7,         1209431,   2154588,   3843465,   6871159,   12324878,
-         17534810,  24980280,  35593252,  50549888,  70956104,  87630984,
-         108587528, 130892872, 148578032, 155457296, 148578032, 130892856,
-         108587536, 87630992,  70956112,  50549884,  35593252,  24980278,
-         17534812,  12324878,  6871160,   3843465,   2154588,   1209431,
-         7},
-        {8,         1405821,   2502628,   4458482,   7951885,   14202332,
-         20122228,  28494402,  40246696,  56439064,  77816144,  94657800,
-         112381560, 128775712, 140691712, 145094384, 140691728, 128775696,
-         112381568, 94657808,  77816144,  56439064,  40246696,  28494400,
-         20122230,  14202331,  7951885,   4458482,   2502629,   1405821,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1217010,  2160122,  3828190,  6764697,  11886164, 16586827,
-         22999514, 31567738, 42617632, 56016164, 65730788, 75244880, 83461560,
-         89112016, 91135304, 89112024, 83461552, 75244880, 65730788, 56016160,
-         42617628, 31567738, 22999514, 16586829, 11886164, 6764698,  3828190,
-         2160122,  1217010,  7},
-        {1,        212104,   376014,   664952,   1170669,  2044035,  2836433,
-         3904056,  5308151,  7084523,  9192281,  10692476, 12141331, 13377854,
-         14220870, 14521356, 14220870, 13377854, 12141332, 10692476, 9192281,
-         7084522,  5308151,  3904056,  2836433,  2044035,  1170669,  664952,
-         376014,   212104,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        528371,   941010,   1677737,  2996520,  5365544,  7620743,
-         10829829, 15375155, 21720310, 30256414, 37121464, 44492724, 52140916,
-         58486184, 60914064, 58486188, 52140912, 44492720, 37121464, 30256414,
-         21720308, 15375156, 10829827, 7620744,  5365544,  2996520,  1677737,
-         941010,   528371,   3},
-        {5,        817738,   1456128,  2595392,  4633066,  8288027,  11760734,
-         16690856, 23650122, 33316574, 46226512, 56525852, 67496904, 77774760,
-         85824656, 89194744, 85824656, 77774760, 67496904, 56525852, 46226516,
-         33316574, 23650120, 16690854, 11760735, 8288027,  4633067,  2595392,
-         1456128,  817738,   5},
-        {7,        1208101,   2150365,   3830012,   6828082,   12185838,
-         17252538, 24405054,  34418948,  48164280,  66215076,  80356216,
-         95158664, 108775560, 118626192, 122255568, 118626200, 108775552,
-         95158672, 80356216,  66215080,  48164280,  34418948,  24405052,
-         17252540, 12185838,  6828083,   3830012,   2150365,   1208101,
-         7},
-        {8,         1404877,   2499634,   4448971,   7921597,   14105523,
-         19927540,  28103012,  39463168,  54891176,  74856888,  90260672,
-         106158024, 120574824, 130879080, 134648944, 130879088, 120574824,
-         106158032, 90260672,  74856888,  54891176,  39463168,  28103008,
-         19927542,  14105523,  7921598,   4448971,   2499634,   1404876,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1218314,  2164227,  3841070,  6804840,  12009704, 16826680,
-         23458746, 32427858, 44173136, 58677072, 69367448, 79974728, 89242016,
-         95670816, 97983664, 95670824, 89242008, 79974736, 69367448, 58677076,
-         44173140, 32427856, 23458742, 16826682, 12009704, 6804841,  3841070,
-         2164227,  1218314,  7},
-        {1,        212485,   377211,   668688,   1182212,  2079037,  2903492,
-         4030197,  5539070,  7490515,  9864626,  11591052, 13285722, 14752218,
-         15762206, 16124144, 15762206, 14752218, 13285723, 11591053, 9864626,
-         7490515,  5539070,  4030197,  2903492,  2079037,  1182212,  668688,
-         377210,   212485,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        527304,   937630,   1667008,  2962381,  5256587,  7401904,
-         10390627, 14497757, 19991098, 26957670, 32224264, 37562304, 42318920,
-         45670148, 46886200, 45670152, 42318920, 37562308, 32224264, 26957670,
-         19991098, 14497757, 10390626, 7401904,  5256587,  2962381,  1667008,
-         937630,   527304,   3},
-        {5,        816257,   1451433,  2580496,  4585709,  8137095,  11458003,
-         16084489, 22442248, 30945832, 41729952, 49882536, 58145720, 65508872,
-         70696504, 72578928, 70696512, 65508868, 58145724, 49882536, 41729952,
-         30945832, 22442248, 16084488, 11458004, 8137095,  4585709,  2580496,
-         1451434,  816257,   5},
-        {7,        1206538,  2145415,   3814322,   6778296,   12027725,
-         16936476, 23775046, 33172672,  45742120,  61682500,  73733120,
-         85947224, 96830952, 104498976, 107281456, 104498984, 96830952,
-         85947232, 73733128, 61682504,  45742116,  33172670,  23775044,
-         16936476, 12027724, 6778297,   3814322,   2145415,   1206538,
-         7},
-        {8,        1403765,   2496115,   4437830,   7886310,   13993836,
-         19704996, 27661434,  38595240,  53219352,  71765424,  85785904,
-         99996584, 112659424, 121580896, 124818216, 121580904, 112659416,
-         99996592, 85785904,  71765432,  53219352,  38595240,  27661430,
-         19704998, 13993836,  7886311,   4437830,   2496115,   1403764,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1219857,  2169099,   3856430,   6853125,   12160503,
-         17123444, 24037508, 33538878,  46247084,  62363436,  74547088,
-         86896032, 97899912, 105652584, 108465784, 105652592, 97899904,
-         86896032, 74547096, 62363440,  46247084,  33538876,  24037506,
-         17123446, 12160503, 6853125,   3856430,   2169099,   1219857,
-         7},
-        {1,        212938,   378637,   673176,   1196278,  2122731,  2989060,
-         4195976,  5854530,  8072868,  10886130, 13012902, 15168527, 17089358,
-         18442662, 18933732, 18442662, 17089358, 15168528, 13012903, 10886130,
-         8072867,  5854530,  4195975,  2989060,  2122731,  1196278,  673176,
-         378637,   212938,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        526244,   934286,   1656482,  2929383,  5154009,  7200895,
-         10000863, 13755239, 18618438, 24545892, 28863346, 33106846, 36783140,
-         39317168, 40225668, 39317172, 36783136, 33106846, 28863346, 24545892,
-         18618438, 13755238, 10000861, 7200896,  5154009,  2929384,  1656483,
-         934287,   526244,   3},
-        {5,        814783,   1446784,  2565855,  4539774,  7994119,  11177507,
-         15539743, 21402348, 29018418, 38333064, 45138564, 51843736, 57665092,
-         61684144, 63126296, 61684144, 57665088, 51843736, 45138564, 38333064,
-         29018416, 21402346, 15539743, 11177508, 7994120,  4539775,  2565855,
-         1446784,  814783,   5},
-        {7,        1204981,  2140499,  3798824,  6729584,  11875611, 16637170,
-         23191438, 32052656, 43652104, 57969124, 68517096, 78979352, 88116992,
-         94454288, 96733928, 94454296, 88116984, 78979352, 68517096, 57969132,
-         43652104, 32052654, 23191436, 16637170, 11875611, 6729584,  3798824,
-         2140499,  1204981,  7},
-        {8,        1402655,   2492611,   4426772,   7851491,   13884761,
-         19489746, 27240036,  37782168,  51691532,  69027848,  81916832,
-         94796824, 106122744, 114019024, 116867616, 114019032, 106122736,
-         94796832, 81916832,  69027848,  51691532,  37782168,  27240034,
-         19489748, 13884760,  7851492,   4426772,   2492611,   1402655,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1221406,   2174004,   3871976,   6902451,   12317130,
-         17436482, 24661340,  34772524,  48643564,  66845112,  81092456,
-         95994392, 109691792, 119593848, 123240712, 119593864, 109691784,
-         95994392, 81092456,  66845116,  48643564,  34772520,  24661336,
-         17436482, 12317130,  6902452,   3871976,   2174004,   1221406,
-         7},
-        {1,        213393,   380079,   677757,   1210858,  2169302,  3082668,
-         4384052,  6230858,  8816279,  12308984, 15131109, 18175568, 21641464,
-         24357576, 25401724, 24357578, 21641462, 18175570, 15131110, 12308985,
-         8816279,  6230857,  4384051,  3082668,  2169302,  1210858,  677757,
-         380079,   213393,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        525351,   931480,   1647714,  2902257,  5071597,  7042735,
-         9702682,  13207803, 17652582, 22940042, 26711398, 30359378, 33476790,
-         35604104, 36362736, 35604104, 33476788, 30359380, 26711396, 22940042,
-         17652582, 13207803, 9702681,  7042735,  5071597,  2902257,  1647714,
-         931480,   525351,   3},
-        {5,        813540,   1442877,  2553636,  4501896,  7878638,  10955188,
-         15118865, 20625528, 27638920, 36022472, 42026544, 47851780, 52842400,
-         56254208, 57472080, 56254208, 52842396, 47851784, 42026548, 36022476,
-         27638918, 20625528, 15118864, 10955189, 7878638,  4501896,  2553636,
-         1442877,  813540,   5},
-        {7,        1203665,  2136357,  3785832,  6689100,  11751078, 16395488,
-         22728960, 31187070, 42088120, 55296528, 64867172, 74235600, 82322976,
-         87882752, 89873216, 87882752, 82322968, 74235600, 64867176, 55296532,
-         42088120, 31187070, 22728958, 16395489, 11751078, 6689101,  3785832,
-         2136357,  1203665,  7},
-        {8,        1401717,   2489652,   4417463,   7822332,   13794261,
-         19312684, 26897488,  37131704,  50494456,  66937128,  79016952,
-         90971256, 101390632, 108605536, 111198640, 108605544, 101390624,
-         90971264, 79016952,  66937132,  50494456,  37131704,  26897486,
-         19312686, 13794262,  7822333,   4417463,   2489652,   1401717,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1222724,   2178188,   3885304,   6945113,   12454759,
-         17715756,  25230046,  35932312,  50996136,  71510480,  88238112,
-         108673688, 130724608, 148143040, 154903072, 148143056, 130724600,
-         108673704, 88238112,  71510496,  50996136,  35932312,  25230042,
-         17715758,  12454758,  6945114,   3885304,   2178189,   1222724,
-         7},
-        {1,        213781,   381315,   681714,   1223645,  2211279,  3169313,
-         4564991,  6613954,  9638446,  15182688, 20899232, 28782230, 38682300,
-         48311484, 52599940, 48311496, 38682296, 28782232, 20899232, 15182688,
-         9638446,  6613954,  4564991,  3169313,  2211279,  1223645,  681714,
-         381315,   213781,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        524756,   929618,   1641931,  2884546,  5018684,  6942684,
-         9517694,  12876462, 17085148, 22027530, 25515680, 28863994, 31707368,
-         33639036, 34326304, 33639036, 31707366, 28863994, 25515680, 22027532,
-         17085148, 12876462, 9517694,  6942685,  5018684,  2884546,  1641932,
-         929618,   524756,   3},
-        {5,        812713,   1440285,  2545568,  4477108,  7804208,  10813826,
-         14855985, 20151268, 26819762, 34692788, 40273396, 45646932, 50221664,
-         53335084, 54443824, 53335084, 50221660, 45646932, 40273400, 34692788,
-         26819762, 20151268, 14855983, 10813826, 7804208,  4477108,  2545568,
-         1440285,  812713,   5},
-        {7,        1202789,  2133603,  3777225,  6662453,  11670018, 16239749,
-         22434930, 30646316, 41132172, 53703904, 62730216, 71504264, 79033256,
-         84186408, 86026976, 84186408, 79033248, 71504272, 62730216, 53703904,
-         41132176, 30646314, 22434930, 16239752, 11670018, 6662454,  3777225,
-         2133603,  1202789,  7},
-        {8,        1401091,  2487681,   4411274,   7803027,   13734770,
-         19197032, 26675680, 36715348,  49739444,  65641580,  77242592,
-         88658984, 98560160, 105390504, 107840400, 105390512, 98560152,
-         88658992, 77242584, 65641576,  49739444,  36715348,  26675674,
-         19197034, 13734769, 7803028,   4411274,   2487680,   1401091,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1223607,   2180998,   3894286,   6974063,   12549334,
-         17910016,  25632730,  36775224,  52772652,  75633064,  99236928,
-         128381352, 160330848, 187347776, 198291392, 187347792, 160330832,
-         128381360, 99236928,  75633072,  52772652,  36775220,  25632728,
-         17910018,  12549334,  6974064,   3894286,   2180998,   1223607,
-         7},
-        {1,        214041,   382148,    684396,    1232418,   2240724,
-         3231452,  4699171,  6913169,   11028142,  19133980,  29199468,
-         47298756, 81631544, 140893488, 184843632, 140893568, 81631528,
-         47298760, 29199470, 19133982,  11028142,  6913169,   4699170,
-         3231452,  2240724,  1232418,   684397,    382148,    214041,
-         1},
-    },
-};
 
-const WORD32 ixheaacd_weight_Q28[16][8][31] = {
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019548684f, 0.0034630969f, 0.0061166696f,
+         0.0107457712f, 0.0186960548f, 0.0258635134f, 0.0354561731f,
+         0.0479685590f, 0.0636471361f, 0.0820589513f, 0.0950533152f,
+         0.1075267568f, 0.1181191504f, 0.1253151745f, 0.1278754473f,
+         0.1253151745f, 0.1181191429f, 0.1075267643f, 0.0950533152f,
+         0.0820589513f, 0.0636471361f, 0.0479685590f, 0.0354561731f,
+         0.0258635171f, 0.0186960548f, 0.0107457712f, 0.0061166734f,
+         0.0034630969f, 0.0019548684f, 0.0000000112f},
+        {0.0000000186f, 0.0030275919f, 0.0053654797f, 0.0094829798f,
+         0.0166785270f, 0.0290729403f, 0.0402846411f, 0.0553428568f,
+         0.0750693232f, 0.0999114066f, 0.1292407066f, 0.1500300914f,
+         0.1700480729f, 0.1870902777f, 0.1986886710f, 0.2028190643f,
+         0.1986886710f, 0.1870902628f, 0.1700480729f, 0.1500300914f,
+         0.1292407066f, 0.0999113992f, 0.0750693232f, 0.0553428531f,
+         0.0402846411f, 0.0290729403f, 0.0166785270f, 0.0094829798f,
+         0.0053654797f, 0.0030275919f, 0.0000000186f},
+        {0.0000000261f, 0.0044807382f, 0.0079482906f, 0.0140712596f,
+         0.0248195715f, 0.0434742048f, 0.0604977794f, 0.0835766271f,
+         0.1141664237f, 0.1532292813f, 0.2000626326f, 0.2336882651f,
+         0.2663741410f, 0.2944218218f, 0.3136188090f, 0.3204754591f,
+         0.3136188090f, 0.2944217920f, 0.2663741708f, 0.2336882651f,
+         0.2000626326f, 0.1532292962f, 0.1141664162f, 0.0835766271f,
+         0.0604977906f, 0.0434742048f, 0.0248195753f, 0.0140712596f,
+         0.0079482906f, 0.0044807382f, 0.0000000261f},
+        {0.0000000298f, 0.0052194707f, 0.0092673339f, 0.0164332762f,
+         0.0290685408f, 0.0511660054f, 0.0715145171f, 0.0993746519f,
+         0.1367753297f, 0.1852938682f, 0.2445339411f, 0.2877510786f,
+         0.3302804232f, 0.3671652079f, 0.3926102221f, 0.4017367959f,
+         0.3926102519f, 0.3671651781f, 0.3302804828f, 0.2877510786f,
+         0.2445339262f, 0.1852938682f, 0.1367753297f, 0.0993746296f,
+         0.0715145245f, 0.0511660054f, 0.0290685445f, 0.0164332762f,
+         0.0092673302f, 0.0052194707f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045582913f, 0.0081248507f, 0.0145073459f,
+         0.0259804092f, 0.0467499122f, 0.0667200089f, 0.0954893604f,
+         0.1369983852f, 0.1965934485f, 0.2817551196f, 0.3696863651f,
+         0.4782577753f, 0.5972789526f, 0.6979247928f, 0.7386929393f,
+         0.6979249120f, 0.5972788334f, 0.4782578349f, 0.3696863651f,
+         0.2817551494f, 0.1965934336f, 0.1369983703f, 0.0954893529f,
+         0.0667200163f, 0.0467499122f, 0.0259804130f, 0.0145073459f,
+         0.0081248507f, 0.0045582913f, 0.0000000261f},
+        {0.0000000037f, 0.0007973649f, 0.0014236122f, 0.0025495738f,
+         0.0045911148f, 0.0083473474f, 0.0120380968f, 0.0175057761f,
+         0.0257535614f, 0.0410830304f, 0.0712796226f, 0.1087764874f,
+         0.1762015671f, 0.3041011095f, 0.5248688459f, 0.6885957122f,
+         0.5248691440f, 0.3041010499f, 0.1762015820f, 0.1087764949f,
+         0.0712796375f, 0.0410830304f, 0.0257535614f, 0.0175057724f,
+         0.0120380968f, 0.0083473474f, 0.0045911148f, 0.0025495775f,
+         0.0014236122f, 0.0007973649f, 0.0000000037f}},
     {
-        {134217744, 134970352, 135553120, 136582896, 138392880, 141541712,
-         144424112, 148346336, 153572976, 160297488, 168439744, 174342928,
-         180128864, 185132320, 188577760, 189812528, 188577760, 185132320,
-         180128880, 174342928, 168439744, 160297488, 153572976, 148346336,
-         144424112, 141541712, 138392880, 136582896, 135553136, 134970352,
-         134217744},
-        {134217728, 134923056, 135469392, 136435104, 138133568, 141091536,
-         143802496, 147496192, 152426160, 158780944, 166491504, 172091408,
-         177587152, 182344784, 185623536, 186799072, 185623552, 182344800,
-         177587152, 172091392, 166491520, 158780944, 152426160, 147496192,
-         143802480, 141091536, 138133568, 136435104, 135469392, 134923056,
-         134217744},
-        {134217728, 134851104, 135341920, 136210016, 137738240, 140404048,
-         142851840, 146193664, 150665168, 156446176, 163483824, 168609296,
-         173650000, 178021440, 181037920, 182120160, 181037920, 178021424,
-         173650000, 168609296, 163483824, 156446176, 150665168, 146193680,
-         142851840, 140404048, 137738240, 136210000, 135341920, 134851104,
-         134217744},
-        {134217728, 134670496, 135021776, 135643952, 136741952, 138665264,
-         140439920, 142875520, 146156352, 150432704, 155687056, 159544432,
-         163361216, 166688640, 168993616, 169822288, 168993632, 166688656,
-         163361216, 159544432, 155687056, 150432704, 146156352, 142875520,
-         140439920, 138665264, 136741952, 135643952, 135021776, 134670496,
-         134217744},
-        {134217728, 134494912, 134710224, 135092080, 135767616, 136955856,
-         138057744, 139578304, 141641264, 144354416, 147723552, 150220400,
-         152709488, 154893744, 156414336, 156962448, 156414336, 154893744,
-         152709472, 150220400, 147723552, 144354416, 141641264, 139578320,
-         138057728, 136955856, 135767600, 135092080, 134710224, 134494912,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133772440, 133424920, 132804936, 131696632, 129710520,
-         127825384, 125151792, 121381688, 116147984, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 116148000, 121381688, 125151792,
-         127825384, 129710520, 131696632, 132804936, 133424920, 133772456,
-         134217728},
-        {134217728, 133468448, 132882456, 131834416, 129952248, 126550128,
-         123283864, 118583656, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 118583656,
-         123283864, 126550128, 129952248, 131834416, 132882456, 133468448,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019570850f, 0.0034700334f, 0.0061382130f,
+         0.0108117498f, 0.0188931711f, 0.0262362324f, 0.0361453071f,
+         0.0492028967f, 0.0657609925f, 0.0854583159f, 0.0995077044f,
+         0.1130974889f, 0.1247107610f, 0.1326356083f, 0.1354617327f,
+         0.1326356083f, 0.1247107461f, 0.1130974963f, 0.0995077044f,
+         0.0854583159f, 0.0657609925f, 0.0492028967f, 0.0361453034f,
+         0.0262362324f, 0.0188931711f, 0.0108117498f, 0.0061382130f,
+         0.0034700334f, 0.0019570850f, 0.0000000112f},
+        {0.0000000186f, 0.0030306727f, 0.0053751357f, 0.0095130354f,
+         0.0167708695f, 0.0293502137f, 0.0408112556f, 0.0563221611f,
+         0.0768360794f, 0.1029629856f, 0.1341941655f, 0.1565610915f,
+         0.1782617569f, 0.1968532801f, 0.2095632553f, 0.2141001821f,
+         0.2095632553f, 0.1968532652f, 0.1782617867f, 0.1565610915f,
+         0.1341941804f, 0.1029629931f, 0.0768360794f, 0.0563221574f,
+         0.0408112593f, 0.0293502137f, 0.0167708695f, 0.0095130354f,
+         0.0053751357f, 0.0030306727f, 0.0000000186f},
+        {0.0000000261f, 0.0044840015f, 0.0079585500f, 0.0141033232f,
+         0.0249188393f, 0.0437761769f, 0.0610779524f, 0.0846719742f,
+         0.1161808893f, 0.1567904651f, 0.2059956193f, 0.2416490465f,
+         0.2765491605f, 0.3066769838f, 0.3273887634f, 0.3348038197f,
+         0.3273887634f, 0.3066769540f, 0.2765491605f, 0.2416490614f,
+         0.2059956342f, 0.1567904651f, 0.1161808893f, 0.0846719667f,
+         0.0610779561f, 0.0437761769f, 0.0249188431f, 0.0141033232f,
+         0.0079585500f, 0.0044840015f, 0.0000000261f},
+        {0.0000000298f, 0.0052218027f, 0.0092746764f, 0.0164563321f,
+         0.0291404575f, 0.0513876304f, 0.0719453543f, 0.1002009511f,
+         0.1383263767f, 0.1881065071f, 0.2493602335f, 0.2943610847f,
+         0.3388943374f, 0.3777095377f, 0.4045871496f, 0.4142471850f,
+         0.4045871794f, 0.3777095079f, 0.3388943672f, 0.2943610847f,
+         0.2493602186f, 0.1881065071f, 0.1383263767f, 0.1002009436f,
+         0.0719453618f, 0.0513876304f, 0.0291404612f, 0.0164563321f,
+         0.0092746764f, 0.0052218027f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045550019f, 0.0081143826f, 0.0144738853f,
+         0.0258725621f, 0.0463975929f, 0.0659963265f, 0.0939892456f,
+         0.1338583082f, 0.1899754107f, 0.2663972974f, 0.3287125528f,
+         0.4048410654f, 0.4869871736f, 0.5518758893f, 0.5770590305f,
+         0.5518758893f, 0.4869871438f, 0.4048411250f, 0.3287125528f,
+         0.2663973570f, 0.1899754107f, 0.1338582933f, 0.0939892307f,
+         0.0659963414f, 0.0463975891f, 0.0258725658f, 0.0144738853f,
+         0.0081143863f, 0.0045550019f, 0.0000000261f},
+        {0.0000000037f, 0.0007963963f, 0.0014205091f, 0.0025395826f,
+         0.0045584328f, 0.0082376562f, 0.0118066110f, 0.0170059167f,
+         0.0246388987f, 0.0359060131f, 0.0565599240f, 0.0778557137f,
+         0.1072221845f, 0.1441028267f, 0.1799743623f, 0.1959501207f,
+         0.1799744070f, 0.1441028118f, 0.1072221920f, 0.0778557137f,
+         0.0565599315f, 0.0359060131f, 0.0246388987f, 0.0170059167f,
+         0.0118066110f, 0.0082376562f, 0.0045584328f, 0.0025395826f,
+         0.0014205091f, 0.0007963963f, 0.0000000037f}},
     {
-        {134217728, 134913216, 135451936, 136404304, 138079504, 140997600,
-         143672688, 147318512, 152186224, 158463280, 166082896, 171618768,
-         177053216, 181758880, 185002352, 186165328, 185002352, 181758880,
-         177053216, 171618768, 166082896, 158463296, 152186224, 147318512,
-         143672688, 140997600, 138079504, 136404304, 135451936, 134913216,
-         134217744},
-        {134217728, 134869504, 135374512, 136267584, 137839408, 140580112,
-         143095472, 146527744, 151117280, 157046336, 164257936, 169506256,
-         174664912, 179136560, 182221168, 183327616, 182221168, 179136560,
-         174664912, 169506256, 164257936, 157046336, 151117280, 146527744,
-         143095472, 140580112, 137839408, 136267584, 135374512, 134869504,
-         134217744},
-        {134217728, 134802992, 135256672, 136059376, 137473424, 139942768,
-         142213056, 145316768, 149476832, 154866368, 161442736, 166241760,
-         170968496, 175072880, 177907744, 178925312, 177907744, 175072880,
-         170968496, 166241760, 161442736, 154866368, 149476832, 145316768,
-         142213056, 139942768, 137473424, 136059376, 135256672, 134802992,
-         134217744},
-        {134217728, 134636080, 134960736, 135535920, 136551440, 138331744,
-         139976000, 142235024, 145282080, 149260352, 154157968, 157759584,
-         161328032, 164442560, 166601920, 167378576, 166601920, 164442544,
-         161328032, 157759584, 154157968, 149260368, 145282080, 142235024,
-         139976016, 138331728, 136551456, 135535920, 134960736, 134636096,
-         134217744},
-        {134217728, 134473824, 134672800, 135025728, 135650240, 136749360,
-         137769200, 139177520, 141089920, 143607984, 146739200, 149062688,
-         151381312, 153417872, 154836624, 155348256, 154836640, 153417872,
-         151381328, 149062688, 146739200, 143607984, 141089920, 139177520,
-         137769200, 136749360, 135650256, 135025712, 134672784, 134473824,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133806400, 133485440, 132913000, 131890240, 130059096,
-         128323168, 125864856, 122406120, 117621128, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 117621128, 122406120, 125864856,
-         128323168, 130059096, 131890240, 132913000, 133485440, 133806400,
-         134217728},
-        {134217728, 133525632, 132984568, 132017344, 130281848, 127150040,
-         124150024, 119845456, 113664464, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113664464, 119845456,
-         124150032, 127150040, 130281848, 132017344, 132984568, 133525632,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019604117f, 0.0034804866f, 0.0061708763f,
+         0.0109128021f, 0.0192001797f, 0.0268254243f, 0.0372561179f,
+         0.0512422584f, 0.0693590865f, 0.0914405808f, 0.1075243503f,
+         0.1233326197f, 0.1370278895f, 0.1464678943f, 0.1498523057f,
+         0.1464678943f, 0.1370278746f, 0.1233326346f, 0.1075243577f,
+         0.0914405808f, 0.0693590865f, 0.0512422584f, 0.0372561105f,
+         0.0268254280f, 0.0192001797f, 0.0109128058f, 0.0061708800f,
+         0.0034804903f, 0.0019604117f, 0.0000000112f},
+        {0.0000000186f, 0.0030353032f, 0.0053896904f, 0.0095585547f,
+         0.0169119760f, 0.0297804140f, 0.0416394584f, 0.0578900613f,
+         0.0797299594f, 0.1081020311f, 0.1428017914f, 0.1681542695f,
+         0.1931329519f, 0.2148192078f, 0.2297913432f, 0.2351637930f,
+         0.2297913432f, 0.2148192078f, 0.1931329817f, 0.1681542695f,
+         0.1428017914f, 0.1081020311f, 0.0797299519f, 0.0578900538f,
+         0.0416394621f, 0.0297804177f, 0.0169119798f, 0.0095585547f,
+         0.0053896904f, 0.0030353032f, 0.0000000186f},
+        {0.0000000261f, 0.0044889040f, 0.0079739802f, 0.0141517222f,
+         0.0250696540f, 0.0442400984f, 0.0619782880f, 0.0863948390f,
+         0.1194054559f, 0.1626167744f, 0.2159518450f, 0.2552461028f,
+         0.2942210138f, 0.3282614052f, 0.3518697023f, 0.3603619337f,
+         0.3518697023f, 0.3282613754f, 0.2942210138f, 0.2552461028f,
+         0.2159518450f, 0.1626167595f, 0.1194054410f, 0.0863948315f,
+         0.0619782880f, 0.0442400984f, 0.0250696540f, 0.0141517222f,
+         0.0079739802f, 0.0044889040f, 0.0000000261f},
+        {0.0000000298f, 0.0052252971f, 0.0092856996f, 0.0164910108f,
+         0.0292490833f, 0.0517247654f, 0.0726049617f, 0.1014770418f,
+         0.1407495737f, 0.1925659627f, 0.2571487725f, 0.3051639795f,
+         0.3531456888f, 0.3953380585f, 0.4247539937f, 0.4353658557f,
+         0.4247539937f, 0.3953380287f, 0.3531457186f, 0.3051640093f,
+         0.2571487725f, 0.1925659627f, 0.1407495588f, 0.1014770344f,
+         0.0726049691f, 0.0517247617f, 0.0292490870f, 0.0164910108f,
+         0.0092856996f, 0.0052252971f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045500919f, 0.0080987960f, 0.0144242346f,
+         0.0257136337f, 0.0458848849f, 0.0649559572f, 0.0918706506f,
+         0.1295377314f, 0.1812113971f, 0.2490174621f, 0.3020929396f,
+         0.3576069176f, 0.4086337388f, 0.4455217719f, 0.4591073692f,
+         0.4455218017f, 0.4086337090f, 0.3576069772f, 0.3020929396f,
+         0.2490174621f, 0.1812113971f, 0.1295377314f, 0.0918706357f,
+         0.0649559572f, 0.0458848849f, 0.0257136375f, 0.0144242346f,
+         0.0080987960f, 0.0045500919f, 0.0000000261f},
+        {0.0000000037f, 0.0007949509f, 0.0014159046f, 0.0025248416f,
+         0.0045107976f, 0.0080812797f, 0.0114838332f, 0.0163318664f,
+         0.0232117511f, 0.0328431986f, 0.0458545312f, 0.0563677698f,
+         0.0677092522f, 0.0806207210f, 0.0907390118f, 0.0946287736f,
+         0.0907390192f, 0.0806207135f, 0.0677092597f, 0.0563677736f,
+         0.0458545350f, 0.0328431949f, 0.0232117511f, 0.0163318627f,
+         0.0114838332f, 0.0080812797f, 0.0045107976f, 0.0025248416f,
+         0.0014159046f, 0.0007949509f, 0.0000000037f}},
     {
-        {134217728, 134750352, 135163360, 135894416, 137183168, 139436416,
-         141510976, 144351440, 148166016, 153119584, 159180064, 163612736,
-         167986224, 171789568, 174419392, 175363920, 174419392, 171789568,
-         167986224, 163612736, 159180064, 153119584, 148166016, 144351440,
-         141510976, 139436432, 137183168, 135894416, 135163360, 134750352,
-         134217744},
-        {134217728, 134716864, 135103984, 135789392, 136998240, 139113424,
-         141062640, 143734096, 147326256, 151998160, 157724080, 161918432,
-         166061616, 169668304, 172163984, 173060688, 172163984, 169668288,
-         166061616, 161918432, 157724080, 151998160, 147326256, 143734096,
-         141062640, 139113424, 136998240, 135789392, 135103984, 134716864,
-         134217744},
-        {134217728, 134665904, 135013632, 135629504, 136716496, 138620704,
-         140377984, 142790048, 146039760, 150276480, 155483472, 159306944,
-         163090832, 166390096, 168675808, 169497600, 168675808, 166390096,
-         163090848, 159306944, 155483488, 150276480, 146039760, 142790048,
-         140377968, 138620720, 136716496, 135629504, 135013616, 134665904,
-         134217744},
-        {134217728, 134538048, 134786784, 135227776, 136007472, 137377520,
-         138646400, 140395008, 142763040, 145870208, 149717968, 152562416,
-         155392320, 157871248, 159594640, 160215424, 159594640, 157871248,
-         155392320, 152562416, 149717968, 145870208, 142763040, 140395008,
-         138646400, 137377520, 136007472, 135227776, 134786784, 134538048,
-         134217728},
-        {134217728, 134413792, 134566144, 134836576, 135315504, 136159584,
-         136944176, 138029792, 139507872, 141460704, 143899120, 145715424,
-         147533584, 149135008, 150253024, 150656672, 150253040, 149135008,
-         147533584, 145715424, 143899120, 141460688, 139507872, 138029792,
-         136944176, 136159584, 135315504, 134836576, 134566160, 134413792,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133903024, 133657608, 133220288, 132440008, 131046696,
-         129730264, 127873712, 125277552, 121718592, 117049664, 113392512,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 113392512, 117049680, 121718592, 125277552, 127873712,
-         129730280, 131046696, 132440024, 133220288, 133657624, 133903024,
-         134217728},
-        {134217728, 133688336, 133274944, 132536912, 131215936, 128843168,
-         126584160, 123368104, 118806640, 112416656, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 112416656, 118806632, 123368104,
-         126584160, 128843168, 131215936, 132536912, 133274944, 133688336,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019643605f, 0.0034929439f, 0.0062100887f,
+         0.0110357292f, 0.0195823126f, 0.0275742412f, 0.0387081020f,
+         0.0540083535f, 0.0744726434f, 0.1004251465f, 0.1200447381f,
+         0.1399304867f, 0.1576502621f, 0.1701345742f, 0.1746647209f,
+         0.1701345742f, 0.1576502770f, 0.1399305016f, 0.1200447381f,
+         0.1004251465f, 0.0744726434f, 0.0540083535f, 0.0387080982f,
+         0.0275742412f, 0.0195823126f, 0.0110357292f, 0.0062100887f,
+         0.0034929439f, 0.0019643605f, 0.0000000112f},
+        {0.0000000186f, 0.0030407943f, 0.0054070093f, 0.0096130967f,
+         0.0170830972f, 0.0303130411f, 0.0426843874f, 0.0599193908f,
+         0.0836038888f, 0.1152822077f, 0.1554561853f, 0.1858269274f,
+         0.2166096866f, 0.2440395653f, 0.2633650005f, 0.2703776062f,
+         0.2633650303f, 0.2440395504f, 0.2166097015f, 0.1858269274f,
+         0.1554561853f, 0.1152822077f, 0.0836038888f, 0.0599193871f,
+         0.0426843911f, 0.0303130411f, 0.0170830972f, 0.0096130967f,
+         0.0054070130f, 0.0030407943f, 0.0000000186f},
+        {0.0000000261f, 0.0044947043f, 0.0079922937f, 0.0142094567f,
+         0.0252511203f, 0.0448067673f, 0.0630932897f, 0.0885689482f,
+         0.1235778332f, 0.1704026759f, 0.2297852188f, 0.2746772766f,
+         0.3201783597f, 0.3607234061f, 0.3892890215f, 0.3996545672f,
+         0.3892890513f, 0.3607234061f, 0.3201783895f, 0.2746773064f,
+         0.2297852337f, 0.1704026610f, 0.1235778257f, 0.0885689408f,
+         0.0630932897f, 0.0448067635f, 0.0252511241f, 0.0142094567f,
+         0.0079922937f, 0.0044947043f, 0.0000000261f},
+        {0.0000000298f, 0.0052294321f, 0.0092987530f, 0.0165322050f,
+         0.0293787941f, 0.0521311015f, 0.0734068304f, 0.1030468717f,
+         0.1437784731f, 0.1982575357f, 0.2673470378f, 0.3195773959f,
+         0.3725163043f, 0.4196890593f, 0.4529241323f, 0.4649840891f,
+         0.4529241621f, 0.4196890295f, 0.3725163341f, 0.3195773959f,
+         0.2673470676f, 0.1982575357f, 0.1437784731f, 0.1030468568f,
+         0.0734068379f, 0.0521311015f, 0.0293787979f, 0.0165322050f,
+         0.0092987530f, 0.0052294284f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045443214f, 0.0080805235f, 0.0143663213f,
+         0.0255298801f, 0.0453014039f, 0.0637897998f, 0.0895466954f,
+         0.1249420568f, 0.1722838134f, 0.2323219031f, 0.2777095437f,
+         0.3237129450f, 0.3647055924f, 0.3935865462f, 0.4040665329f,
+         0.3935865760f, 0.3647055626f, 0.3237129450f, 0.2777095735f,
+         0.2323219180f, 0.1722838134f, 0.1249420494f, 0.0895466879f,
+         0.0637898073f, 0.0453014039f, 0.0255298801f, 0.0143663213f,
+         0.0080805235f, 0.0045443214f, 0.0000000261f},
+        {0.0000000037f, 0.0007932559f, 0.0014105327f, 0.0025077760f,
+         0.0044564828f, 0.0079077892f, 0.0111351162f, 0.0156312287f,
+         0.0218098238f, 0.0300737768f, 0.0405539945f, 0.0484768376f,
+         0.0565071665f, 0.0636628196f, 0.0687042698f, 0.0705336481f,
+         0.0687042698f, 0.0636628196f, 0.0565071702f, 0.0484768413f,
+         0.0405539945f, 0.0300737731f, 0.0218098238f, 0.0156312250f,
+         0.0111351162f, 0.0079077892f, 0.0044564828f, 0.0025077760f,
+         0.0014105327f, 0.0007932559f, 0.0000000037f}},
     {
-        {134217728, 134506240, 134730320, 135127728, 135830656, 137066736,
-         138212592, 139793296, 141936768, 144754096, 148250000, 150839072,
-         153418688, 155681312, 157255888, 157823344, 157255888, 155681312,
-         153418688, 150839072, 148249984, 144754096, 141936768, 139793296,
-         138212592, 137066736, 135830656, 135127728, 134730320, 134506240,
-         134217728},
-        {134217728, 134488080, 134698096, 135070576, 135729600, 136888992,
-         137964320, 139448608, 141462896, 144113040, 147405392, 149846352,
-         152280496, 154417184, 155904992, 156441360, 155904992, 154417184,
-         152280496, 149846352, 147405392, 144113040, 141462896, 139448592,
-         137964336, 136888992, 135729600, 135070576, 134698096, 134488080,
-         134217728},
-        {134217728, 134460464, 134649040, 134983616, 135575776, 136618224,
-         137585872, 138922720, 140739104, 143132528, 146111440, 148323744,
-         150532864, 152474416, 153827600, 154315696, 153827600, 152474432,
-         150532880, 148323744, 146111440, 143132528, 140739104, 138922720,
-         137585872, 136618224, 135575760, 134983616, 134649040, 134460464,
-         134217728},
-        {134217728, 134391168, 134526000, 134765312, 135189280, 135936912,
-         136632336, 137595280, 138907696, 140643920, 142815424, 144435360,
-         146058944, 147490640, 148491024, 148852368, 148491024, 147490640,
-         146058944, 144435360, 142815424, 140643920, 138907696, 137595280,
-         136632320, 135936912, 135189264, 134765312, 134526000, 134391168,
-         134217728},
-        {134217728, 134323872, 134406416, 134552992, 134812944, 135272112,
-         135700080, 136294032, 137106080, 138184736, 139540672, 140557056,
-         141579776, 142484928, 143119200, 143348672, 143119200, 142484928,
-         141579776, 140557056, 139540672, 138184736, 137106080, 136294032,
-         135700080, 135272112, 134812944, 134552992, 134406416, 134323872,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134047496, 133914896, 133678832, 133258584, 132511008,
-         131808096, 130822576, 129456008, 127605336, 125219016, 123384368,
-         121496560, 119789320, 118571736, 118126816, 118571736, 119789320,
-         121496560, 123384368, 125219016, 127605336, 129456008, 130822576,
-         131808096, 132511008, 133258584, 133678848, 133914896, 134047496,
-         134217728},
-        {134217728, 133931488, 133708328, 133310696, 132601600, 131336352,
-         130142072, 128459768, 126111336, 122900144, 118702864, 115428560,
-         112012208, 111848104, 111848104, 111848104, 111848104, 111848104,
-         112012208, 115428560, 118702864, 122900128, 126111336, 128459768,
-         130142072, 131336352, 132601616, 133310696, 133708328, 133931488,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019683354f, 0.0035055354f, 0.0062500574f,
+         0.0111629069f, 0.0199882090f, 0.0283894800f, 0.0403442569f,
+         0.0572769120f, 0.0809144527f, 0.1127139181f, 0.1382882297f,
+         0.1657482833f, 0.1942400038f, 0.2178779542f, 0.2269225121f,
+         0.2178779691f, 0.1942399889f, 0.1657482982f, 0.1382882297f,
+         0.1127139181f, 0.0809144527f, 0.0572769120f, 0.0403442495f,
+         0.0283894837f, 0.0199882090f, 0.0111629069f, 0.0062500574f,
+         0.0035055354f, 0.0019683354f, 0.0000000112f},
+        {0.0000000186f, 0.0030463114f, 0.0054244995f, 0.0096685886f,
+         0.0172595158f, 0.0308753066f, 0.0438121483f, 0.0621782839f,
+         0.0881035775f, 0.1241138950f, 0.1722071767f, 0.2105752081f,
+         0.2514455318f, 0.2897335589f, 0.3197216690f, 0.3322762251f,
+         0.3197216988f, 0.2897335291f, 0.2514455616f, 0.2105752230f,
+         0.1722071767f, 0.1241138950f, 0.0881035626f, 0.0621782765f,
+         0.0438121520f, 0.0308753066f, 0.0172595158f, 0.0096685886f,
+         0.0054244995f, 0.0030463114f, 0.0000000186f},
+        {0.0000000261f, 0.0045005269f, 0.0080107339f, 0.0142679065f,
+         0.0254365876f, 0.0453957841f, 0.0642707124f, 0.0909159034f,
+         0.1282205731f, 0.1794259250f, 0.2466703653f, 0.2993502319f,
+         0.3544936478f, 0.4052205384f, 0.4419169724f, 0.4554374516f,
+         0.4419169724f, 0.4052204788f, 0.3544936478f, 0.2993502319f,
+         0.2466703951f, 0.1794259101f, 0.1282205582f, 0.0909158960f,
+         0.0642707199f, 0.0453957841f, 0.0254365914f, 0.0142679065f,
+         0.0080107339f, 0.0045005269f, 0.0000000261f},
+        {0.0000000298f, 0.0052335747f, 0.0093118623f, 0.0165737085f,
+         0.0295102485f, 0.0525471680f, 0.0742358714f, 0.1046918705f,
+         0.1470117569f, 0.2044855654f, 0.2788636088f, 0.3362472057f,
+         0.3954694271f, 0.4491761923f, 0.4875625372f, 0.5016064644f,
+         0.4875625372f, 0.4491761923f, 0.3954694569f, 0.3362472057f,
+         0.2788636386f, 0.2044855654f, 0.1470117420f, 0.1046918631f,
+         0.0742358789f, 0.0525471680f, 0.0295102522f, 0.0165737085f,
+         0.0093118623f, 0.0052335709f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045385733f, 0.0080623738f, 0.0143091008f,
+         0.0253500082f, 0.0447396338f, 0.0626842678f, 0.0873906389f,
+         0.1208031848f, 0.1645577550f, 0.2185891271f, 0.2584138811f,
+         0.2979290783f, 0.3324524164f, 0.3564015925f, 0.3650175929f,
+         0.3564015925f, 0.3324524164f, 0.2979291081f, 0.2584138811f,
+         0.2185891271f, 0.1645577699f, 0.1208031774f, 0.0873906240f,
+         0.0626842752f, 0.0447396338f, 0.0253500082f, 0.0143091008f,
+         0.0080623738f, 0.0045385733f, 0.0000000261f},
+        {0.0000000037f, 0.0007915683f, 0.0014052205f, 0.0024910569f,
+         0.0044040829f, 0.0077450164f, 0.0108163506f, 0.0150136538f,
+         0.0206346437f, 0.0279043429f, 0.0367485993f, 0.0431800336f,
+         0.0494931713f, 0.0549563020f, 0.0587187968f, 0.0600671209f,
+         0.0587188005f, 0.0549563020f, 0.0494931713f, 0.0431800373f,
+         0.0367486030f, 0.0279043429f, 0.0206346437f, 0.0150136538f,
+         0.0108163506f, 0.0077450164f, 0.0044040829f, 0.0024910569f,
+         0.0014052168f, 0.0007915683f, 0.0000000037f}},
     {
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217744, 134217728, 134217728, 134217744,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019717216f, 0.0035163164f, 0.0062845536f,
+         0.0112742335f, 0.0203528218f, 0.0291403309f, 0.0419068150f,
+         0.0605678447f, 0.0879195333f, 0.1351860017f, 0.1836786717f,
+         0.2485272437f, 0.3268185258f, 0.3997989297f, 0.4313463271f,
+         0.3997989595f, 0.3268184960f, 0.2485273033f, 0.1836786866f,
+         0.1351860166f, 0.0879195333f, 0.0605678484f, 0.0419068113f,
+         0.0291403346f, 0.0203528218f, 0.0112742335f, 0.0062845536f,
+         0.0035163164f, 0.0019717216f, 0.0000000112f},
+        {0.0000000186f, 0.0030510165f, 0.0054394603f, 0.0097163878f,
+         0.0174134374f, 0.0313772969f, 0.0448416248f, 0.0643075109f,
+         0.0925465450f, 0.1334379315f, 0.1968761533f, 0.2619350851f,
+         0.3448232114f, 0.4391061664f, 0.5217757225f, 0.5560634732f,
+         0.5217758417f, 0.4391061068f, 0.3448232710f, 0.2619350851f,
+         0.1968761683f, 0.1334379166f, 0.0925465375f, 0.0643075034f,
+         0.0448416248f, 0.0313772969f, 0.0174134411f, 0.0097163878f,
+         0.0054394603f, 0.0030510165f, 0.0000000186f},
+        {0.0000000261f, 0.0045054816f, 0.0080264658f, 0.0143180229f,
+         0.0255970620f, 0.0459137484f, 0.0653222576f, 0.0930587947f,
+         0.1325951964f, 0.1883130074f, 0.2643320858f, 0.3264508545f,
+         0.4045200348f, 0.4876139164f, 0.5534962416f, 0.5791234970f,
+         0.5534962416f, 0.4876138568f, 0.4045200646f, 0.3264508843f,
+         0.2643321157f, 0.1883129925f, 0.1325951964f, 0.0930587873f,
+         0.0653222650f, 0.0459137484f, 0.0255970657f, 0.0143180229f,
+         0.0080264658f, 0.0045054816f, 0.0000000261f},
+        {0.0000000298f, 0.0052370913f, 0.0093230158f, 0.0166091397f,
+         0.0296230800f, 0.0529078096f, 0.0749611408f, 0.1061499193f,
+         0.1499306262f, 0.2102518976f, 0.2898876965f, 0.3526277840f,
+         0.4186539054f, 0.4797268510f, 0.5241174698f, 0.5405187011f,
+         0.5241175294f, 0.4797268212f, 0.4186539650f, 0.3526278138f,
+         0.2898877263f, 0.2102518827f, 0.1499306262f, 0.1061499119f,
+         0.0749611482f, 0.0529078059f, 0.0296230800f, 0.0166091397f,
+         0.0093230195f, 0.0052370913f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045337155f, 0.0080470815f, 0.0142611191f,
+         0.0252004601f, 0.0442794114f, 0.0617907457f, 0.0856798738f,
+         0.1175989881f, 0.1587630510f, 0.2086764723f, 0.2448662519f,
+         0.2803090215f, 0.3109185398f, 0.3319681287f, 0.3395054638f,
+         0.3319681585f, 0.3109185100f, 0.2803090513f, 0.2448662668f,
+         0.2086764723f, 0.1587630361f, 0.1175989881f, 0.0856798664f,
+         0.0617907532f, 0.0442794114f, 0.0252004638f, 0.0142611191f,
+         0.0080470815f, 0.0045337155f, 0.0000000261f},
+        {0.0000000037f, 0.0007901490f, 0.0014007613f, 0.0024771392f,
+         0.0043610819f, 0.0076146238f, 0.0105665363f, 0.0145437419f,
+         0.0197744034f, 0.0263919048f, 0.0342439152f, 0.0398325771f,
+         0.0452299826f, 0.0498363897f, 0.0529768690f, 0.0540962704f,
+         0.0529768690f, 0.0498363897f, 0.0452299826f, 0.0398325771f,
+         0.0342439152f, 0.0263919048f, 0.0197744034f, 0.0145437419f,
+         0.0105665363f, 0.0076146238f, 0.0043610819f, 0.0024771392f,
+         0.0014007613f, 0.0007901490f, 0.0000000037f}},
     {
-        {134217728, 133928592, 133703168, 133301512, 132585192, 131306928,
-         130100248, 128400288, 126026792, 122780504, 118535808, 115223152,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 115223152, 118535792, 122780504, 126026792, 128400288,
-         130100248, 131306928, 132585192, 133301512, 133703168, 133928592,
-         134217728},
-        {134217728, 133946816, 133735640, 133359432, 132688632, 131492208,
-         130363488, 128774544, 126558464, 123532296, 119584472, 116511248,
-         113311296, 111848104, 111848104, 111848104, 111848104, 111848104,
-         113311288, 116511248, 119584472, 123532296, 126558464, 128774544,
-         130363488, 131492208, 132688632, 133359432, 133735640, 133946816,
-         134217728},
-        {134217728, 133974552, 133785016, 133447456, 132845800, 131773512,
-         130762848, 129341696, 127362872, 124667064, 121162064, 118443520,
-         115622880, 113050208, 111848104, 111848104, 111848104, 113050208,
-         115622880, 118443520, 121162064, 124667064, 127362856, 129341696,
-         130762848, 131773512, 132845800, 133447456, 133785016, 133974552,
-         134217728},
-        {134217728, 134044048, 133908760, 133667912, 133239096, 132476240,
-         131758880, 130752952, 129357832, 127467976, 125030208, 123155288,
-         121225344, 119479336, 118233720, 117778472, 118233720, 119479336,
-         121225328, 123155288, 125030224, 127467976, 129357832, 130752960,
-         131758880, 132476240, 133239096, 133667912, 133908760, 134044048,
-         134217728},
-        {134217728, 134111512, 134028776, 133881624, 133619856, 133154992,
-         132718832, 132108784, 131265840, 130129840, 128674776, 127563760,
-         126427688, 125406704, 124682360, 124418480, 124682360, 125406704,
-         126427688, 127563760, 128674776, 130129840, 131265840, 132108784,
-         132718832, 133154992, 133619856, 133881608, 134028776, 134111512,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134387728, 134519888, 134754464, 135170064, 135903024,
-         136584848, 137529104, 138816208, 140519296, 142649904, 144239712,
-         145833392, 147238976, 148221248, 148576080, 148221248, 147238976,
-         145833392, 144239712, 142649904, 140519312, 138816208, 137529088,
-         136584848, 135903024, 135170064, 134754464, 134519888, 134387728,
-         134217728},
-        {134217728, 134503360, 134725216, 135118656, 135814608, 137038528,
-         138173216, 139738624, 141861648, 144652528, 148116256, 150681920,
-         153238576, 155481344, 157042224, 157604800, 157042224, 155481344,
-         153238576, 150681920, 148116256, 144652528, 141861648, 139738624,
-         138173216, 137038528, 135814608, 135118656, 134725200, 134503360,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019739941f, 0.0035235770f, 0.0063079223f,
+         0.0113505051f, 0.0206078701f, 0.0296765603f, 0.0430580825f,
+         0.0631116480f, 0.0983685851f, 0.1666181833f, 0.2469854802f,
+         0.3804836273f, 0.6008414030f, 0.9043325186f, 1.0835957527f,
+         0.9043327570f, 0.6008412838f, 0.3804837465f, 0.2469855100f,
+         0.1666181833f, 0.0983685851f, 0.0631116480f, 0.0430580750f,
+         0.0296765603f, 0.0206078701f, 0.0113505051f, 0.0063079223f,
+         0.0035235770f, 0.0019739941f, 0.0000000112f},
+        {0.0000000186f, 0.0030541718f, 0.0054495223f, 0.0097487271f,
+         0.0175186098f, 0.0317266919f, 0.0455713645f, 0.0658584908f,
+         0.0959193856f, 0.1436767876f, 0.2341895550f, 0.3323971331f,
+         0.4782980084f, 0.6811693311f, 0.9031447768f, 1.0110551119f,
+         0.9031450748f, 0.6811692119f, 0.4782981277f, 0.3323971033f,
+         0.2341895849f, 0.1436767727f, 0.0959193856f, 0.0658584833f,
+         0.0455713719f, 0.0317266919f, 0.0175186135f, 0.0097487271f,
+         0.0054495223f, 0.0030541718f, 0.0000000186f},
+        {0.0000000261f, 0.0045088008f, 0.0080370344f, 0.0143518075f,
+         0.0257059969f, 0.0462698899f, 0.0660543442f, 0.0945780575f,
+         0.1357807368f, 0.1950440407f, 0.2812705636f, 0.3701249063f,
+         0.4805524051f, 0.6025272608f, 0.7064292431f, 0.7487157583f,
+         0.7064292431f, 0.6025272012f, 0.4805524945f, 0.3701249063f,
+         0.2812705934f, 0.1950440556f, 0.1357807517f, 0.0945780426f,
+         0.0660543516f, 0.0462698862f, 0.0257060006f, 0.0143518075f,
+         0.0080370344f, 0.0045088008f, 0.0000000261f},
+        {0.0000000298f, 0.0052394457f, 0.0093304962f, 0.0166329406f,
+         0.0296991989f, 0.0531529523f, 0.0754577741f, 0.1071588024f,
+         0.1519807279f, 0.2143882662f, 0.2980266809f, 0.3650085926f,
+         0.4366289973f, 0.5043625832f, 0.5640503764f, 0.5867944360f,
+         0.5640504360f, 0.5043625236f, 0.4366289973f, 0.3650085926f,
+         0.2980266809f, 0.2143882662f, 0.1519807130f, 0.1071587950f,
+         0.0754577741f, 0.0531529561f, 0.0296992026f, 0.0166329406f,
+         0.0093304962f, 0.0052394457f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045304820f, 0.0080369115f, 0.0142293312f,
+         0.0251020007f, 0.0439797007f, 0.0612145849f, 0.0845912322f,
+         0.1155948415f, 0.1552157849f, 0.2027583867f, 0.2369178981f,
+         0.2701408267f, 0.2986625433f, 0.3181905448f, 0.3251666427f,
+         0.3181905448f, 0.2986625135f, 0.2701408565f, 0.2369178981f,
+         0.2027584016f, 0.1552157849f, 0.1155948490f, 0.0845912248f,
+         0.0612145923f, 0.0439797044f, 0.0251020044f, 0.0142293312f,
+         0.0080369115f, 0.0045304820f, 0.0000000261f},
+        {0.0000000037f, 0.0007892065f, 0.0013978072f, 0.0024679713f,
+         0.0043330416f, 0.0075310804f, 0.0104089491f, 0.0142532848f,
+         0.0192561597f, 0.0255084299f, 0.0328301787f, 0.0379860699f,
+         0.0429274589f, 0.0471183173f, 0.0499628633f, 0.0509744659f,
+         0.0499628671f, 0.0471183136f, 0.0429274626f, 0.0379860736f,
+         0.0328301787f, 0.0255084261f, 0.0192561597f, 0.0142532811f,
+         0.0104089528f, 0.0075310804f, 0.0043330416f, 0.0024679713f,
+         0.0013978072f, 0.0007892065f, 0.0000000037f}},
     {
-        {134217728, 133682984, 133265384, 132519816, 131185264, 128787744,
-         126504696, 123253640, 118640752, 112174832, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 112174832, 118640752, 123253640,
-         126504696, 128787744, 131185264, 132519816, 133265384, 133682984,
-         134217728},
-        {134217728, 133716728, 133325584, 132627440, 131378384, 129136568,
-         127004448, 123973008, 119681960, 113689744, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 113689744, 119681960, 123973008,
-         127004448, 129136568, 131378376, 132627440, 133325584, 133716744,
-         134217728},
-        {134217728, 133768056, 133417096, 132790928, 131671560, 129665320,
-         127760792, 125059176, 121248440, 115955928, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 115955928, 121248440, 125059176,
-         127760792, 129665320, 131671560, 132790928, 133417096, 133768056,
-         134217728},
-        {134217728, 133896640, 133646248, 133200016, 132403792, 130981736,
-         129637848, 127742080, 125090024, 121452368, 116676152, 112931424,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 112931424, 116676152, 121452368, 125090024, 127742080,
-         129637848, 130981736, 132403792, 133200016, 133646248, 133896640,
-         134217728},
-        {134217728, 134021376, 133868400, 133596016, 133110896, 132247376,
-         131434736, 130294184, 128710328, 126560936, 123781432, 121638024,
-         119426296, 117420384, 115986304, 115461520, 115986304, 117420384,
-         119426296, 121638024, 123781432, 126560936, 128710328, 130294184,
-         131434736, 132247360, 133110896, 133596016, 133868400, 134021376,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134531696, 134775520, 135207824, 135972192, 137315552,
-         138559920, 140275120, 142598512, 145648128, 149426144, 152220016,
-         155000416, 157436608, 159130592, 159740864, 159130592, 157436608,
-         155000416, 152220016, 149426144, 145648128, 142598512, 140275120,
-         138559920, 137315536, 135972192, 135207824, 134775504, 134531696,
-         134217728},
-        {134217728, 134745024, 135153936, 135877760, 137153824, 139385200,
-         141439904, 144253616, 148033040, 152942128, 158949856, 163344976,
-         167682224, 171454608, 174063344, 175000352, 174063344, 171454608,
-         167682208, 163344976, 158949856, 152942128, 148033040, 144253632,
-         141439904, 139385200, 137153824, 135877760, 135153936, 134745040,
-         134217744},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, -3.2000000477f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019747950f, 0.0035261363f, 0.0063161924f,
+         0.0113776550f, 0.0206997320f, 0.0298720002f, 0.0434854478f,
+         0.0640839934f, 0.1033503860f, 0.1814315021f, 0.2809938192f,
+         0.4676808715f, 0.8515646458f, 1.6239985228f, 2.3103787899f,
+         1.6239993572f, 0.8515645266f, 0.4676810503f, 0.2809938490f,
+         0.1814315170f, 0.1033503786f, 0.0640839934f, 0.0434854440f,
+         0.0298720002f, 0.0206997320f, 0.0113776587f, 0.0063161924f,
+         0.0035261363f, 0.0019747950f, 0.0000000112f},
+        {0.0000000186f, 0.0030552819f, 0.0054530725f, 0.0097601563f,
+         0.0175559968f, 0.0318521820f, 0.0458361991f, 0.0664303452f,
+         0.0971942917f, 0.1497929543f, 0.2508868575f, 0.3670715094f,
+         0.5535376668f, 0.8446811438f, 1.2149823904f, 1.4186795950f,
+         1.2149829865f, 0.8446810246f, 0.5535378456f, 0.3670715392f,
+         0.2508868873f, 0.1497929394f, 0.0971942842f, 0.0664303303f,
+         0.0458362028f, 0.0318521783f, 0.0175559968f, 0.0097601563f,
+         0.0054530725f, 0.0030552782f, 0.0000000186f},
+        {0.0000000261f, 0.0045099705f, 0.0080407523f, 0.0143637285f,
+         0.0257445797f, 0.0463969335f, 0.0663173124f, 0.0951294750f,
+         0.1369550526f, 0.1975847185f, 0.2925730348f, 0.3899479210f,
+         0.5145110488f, 0.6568877101f, 0.7823352814f, 0.8345331550f,
+         0.7823353410f, 0.6568875909f, 0.5145111084f, 0.3899479508f,
+         0.2925730646f, 0.1975847185f, 0.1369550526f, 0.0951294526f,
+         0.0663173199f, 0.0463969298f, 0.0257445835f, 0.0143637285f,
+         0.0080407523f, 0.0045099705f, 0.0000000261f},
+        {0.0000000298f, 0.0052402765f, 0.0093331225f, 0.0166413262f,
+         0.0297260657f, 0.0532398559f, 0.0756345168f, 0.1075199619f,
+         0.1527208239f, 0.2158997804f, 0.3010516465f, 0.3696758151f,
+         0.4435127378f, 0.5234289765f, 0.5880037546f, 0.6127629280f,
+         0.5880038142f, 0.5234289765f, 0.4435127676f, 0.3696758151f,
+         0.3010516465f, 0.2158997506f, 0.1527208090f, 0.1075199544f,
+         0.0756345242f, 0.0532398522f, 0.0297260694f, 0.0166413262f,
+         0.0093331262f, 0.0052402765f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045293458f, 0.0080333501f, 0.0142182149f,
+         0.0250676982f, 0.0438758917f, 0.0610160530f, 0.0842186734f,
+         0.1149150282f, 0.1540254205f, 0.2007966489f, 0.2343050987f,
+         0.2668242753f, 0.2946906090f, 0.3137444556f, 0.3205463886f,
+         0.3137444556f, 0.2946906090f, 0.2668242753f, 0.2343050987f,
+         0.2007966489f, 0.1540254205f, 0.1149150357f, 0.0842186660f,
+         0.0610160567f, 0.0438758880f, 0.0250677019f, 0.0142182149f,
+         0.0080333501f, 0.0045293458f, 0.0000000261f},
+        {0.0000000037f, 0.0007888749f, 0.0013967715f, 0.0024647750f,
+         0.0043233223f, 0.0075023882f, 0.0103552639f, 0.0141553432f,
+         0.0190836154f, 0.0252186134f, 0.0323737599f, 0.0373960882f,
+         0.0421986058f, 0.0462643132f, 0.0490204468f, 0.0499999784f,
+         0.0490204468f, 0.0462643094f, 0.0421986058f, 0.0373960882f,
+         0.0323737562f, 0.0252186134f, 0.0190836154f, 0.0141553432f,
+         0.0103552639f, 0.0075023882f, 0.0043233223f, 0.0024647750f,
+         0.0013967715f, 0.0007888749f, 0.0000000037f}},
     {
-        {134217728, 133518624, 132972056, 131994936, 130241488, 127076656,
-         124044168, 119691480, 113437856, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113437856, 119691480,
-         124044168, 127076656, 130241488, 131994936, 132972056, 133518624,
-         134217728},
-        {134217728, 133562760, 133050888, 132136072, 130495576, 127538336,
-         124709592, 120658264, 114858008, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 114858008, 120658264,
-         124709592, 127538336, 130495560, 132136072, 133050888, 133562760,
-         134217728},
-        {134217728, 133629896, 133170680, 132350456, 130881064, 128237360,
-         125714928, 122114032, 116984936, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 116984936, 122114032,
-         125714928, 128237360, 130881064, 132350456, 133170680, 133629896,
-         134217728},
-        {134217728, 133798056, 133470584, 132886472, 131842704, 129973568,
-         128201072, 125690088, 122155288, 117261000, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 117261000, 122155288, 125690088,
-         128201072, 129973568, 131842704, 132886456, 133470584, 133798056,
-         134217728},
-        {134217728, 133961128, 133761128, 133404840, 132769744, 131637408,
-         130569696, 129067480, 126974144, 124119080, 120401016, 117512176,
-         114509792, 111848104, 111848104, 111848104, 111848104, 111848104,
-         114509792, 117512160, 120401008, 124119080, 126974144, 129067480,
-         130569696, 131637424, 132769744, 133404840, 133761128, 133961128,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134627808, 134946048, 135509888, 136505536, 138251328,
-         139864096, 142080384, 145070800, 148976736, 153787568, 157326848,
-         160834672, 163897216, 166020960, 166784896, 166020960, 163897200,
-         160834688, 157326848, 153787568, 148976736, 145070800, 142080384,
-         139864096, 138251328, 136505536, 135509888, 134946048, 134627808,
-         134217744},
-        {134217728, 134906272, 135439648, 136382608, 138041424, 140931408,
-         143581232, 147193280, 152017056, 158239216, 165794560, 171285200,
-         176676288, 181345168, 184563696, 185717792, 184563696, 181345168,
-         176676272, 171285200, 165794560, 158239216, 152017056, 147193280,
-         143581216, 140931408, 138041424, 136382608, 135439648, 134906272,
-         134217744},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019739941f, 0.0035235770f, 0.0063079223f,
+         0.0113505051f, 0.0206078701f, 0.0296765603f, 0.0430580825f,
+         0.0631116480f, 0.0983685851f, 0.1666181833f, 0.2469854802f,
+         0.3804836273f, 0.6008414030f, 0.9043325186f, 1.0835957527f,
+         0.9043327570f, 0.6008412838f, 0.3804837465f, 0.2469855100f,
+         0.1666181833f, 0.0983685851f, 0.0631116480f, 0.0430580750f,
+         0.0296765603f, 0.0206078701f, 0.0113505051f, 0.0063079223f,
+         0.0035235770f, 0.0019739941f, 0.0000000112f},
+        {0.0000000186f, 0.0030541718f, 0.0054495223f, 0.0097487271f,
+         0.0175186098f, 0.0317266919f, 0.0455713645f, 0.0658584908f,
+         0.0959193856f, 0.1436767876f, 0.2341895550f, 0.3323971331f,
+         0.4782980084f, 0.6811693311f, 0.9031447768f, 1.0110551119f,
+         0.9031450748f, 0.6811692119f, 0.4782981277f, 0.3323971033f,
+         0.2341895849f, 0.1436767727f, 0.0959193856f, 0.0658584833f,
+         0.0455713719f, 0.0317266919f, 0.0175186135f, 0.0097487271f,
+         0.0054495223f, 0.0030541718f, 0.0000000186f},
+        {0.0000000261f, 0.0045088008f, 0.0080370344f, 0.0143518075f,
+         0.0257059969f, 0.0462698899f, 0.0660543442f, 0.0945780575f,
+         0.1357807368f, 0.1950440407f, 0.2812705636f, 0.3701249063f,
+         0.4805524051f, 0.6025272608f, 0.7064292431f, 0.7487157583f,
+         0.7064292431f, 0.6025272012f, 0.4805524945f, 0.3701249063f,
+         0.2812705934f, 0.1950440556f, 0.1357807517f, 0.0945780426f,
+         0.0660543516f, 0.0462698862f, 0.0257060006f, 0.0143518075f,
+         0.0080370344f, 0.0045088008f, 0.0000000261f},
+        {0.0000000298f, 0.0052394457f, 0.0093304962f, 0.0166329406f,
+         0.0296991989f, 0.0531529523f, 0.0754577741f, 0.1071588024f,
+         0.1519807279f, 0.2143882662f, 0.2980266809f, 0.3650085926f,
+         0.4366289973f, 0.5043625832f, 0.5640503764f, 0.5867944360f,
+         0.5640504360f, 0.5043625236f, 0.4366289973f, 0.3650085926f,
+         0.2980266809f, 0.2143882662f, 0.1519807130f, 0.1071587950f,
+         0.0754577741f, 0.0531529561f, 0.0296992026f, 0.0166329406f,
+         0.0093304962f, 0.0052394457f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045304820f, 0.0080369115f, 0.0142293312f,
+         0.0251020007f, 0.0439797007f, 0.0612145849f, 0.0845912322f,
+         0.1155948415f, 0.1552157849f, 0.2027583867f, 0.2369178981f,
+         0.2701408267f, 0.2986625433f, 0.3181905448f, 0.3251666427f,
+         0.3181905448f, 0.2986625135f, 0.2701408565f, 0.2369178981f,
+         0.2027584016f, 0.1552157849f, 0.1155948490f, 0.0845912248f,
+         0.0612145923f, 0.0439797044f, 0.0251020044f, 0.0142293312f,
+         0.0080369115f, 0.0045304820f, 0.0000000261f},
+        {0.0000000037f, 0.0007892065f, 0.0013978072f, 0.0024679713f,
+         0.0043330416f, 0.0075310804f, 0.0104089491f, 0.0142532848f,
+         0.0192561597f, 0.0255084299f, 0.0328301787f, 0.0379860699f,
+         0.0429274589f, 0.0471183173f, 0.0499628633f, 0.0509744659f,
+         0.0499628671f, 0.0471183136f, 0.0429274626f, 0.0379860736f,
+         0.0328301787f, 0.0255084261f, 0.0192561597f, 0.0142532811f,
+         0.0104089528f, 0.0075310804f, 0.0043330416f, 0.0024679713f,
+         0.0013978072f, 0.0007892065f, 0.0000000037f}},
     {
-        {134217728, 133460856, 132868912, 131810120, 129908448, 126470312,
-         123168472, 118415200, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 0,         111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 118415200,
-         123168472, 126470312, 129908448, 131810120, 132868912, 133460856,
-         134217728},
-        {134217728, 133508664, 132954296, 131963096, 130184144, 126972336,
-         123893664, 119472480, 113115264, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113115272, 119472480,
-         123893664, 126972336, 130184144, 131963096, 132954280, 133508664,
-         134217728},
-        {134217728, 133581352, 133084040, 132195432, 130602352, 127732136,
-         124988584, 121062824, 115450448, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 115450448, 121062824,
-         124988584, 127732136, 130602352, 132195432, 133084040, 133581352,
-         134217728},
-        {134217728, 133763416, 133408824, 132776176, 131645104, 129617688,
-         127692704, 124961536, 121107872, 115753192, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 115753192, 121107872, 124961520,
-         127692704, 129617688, 131645120, 132776176, 133408840, 133763416,
-         134217728},
-        {134217728, 133939968, 133723424, 133337648, 132649736, 131422568,
-         130264576, 128633952, 126358808, 123250144, 119191232, 116028568,
-         112732488, 111848104, 111848104, 111848104, 111848104, 111848104,
-         112732488, 116028552, 119191232, 123250144, 126358808, 128633952,
-         130264576, 131422568, 132649736, 133337648, 133723424, 133939968,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134661536, 135005888, 135615808, 136692320, 138578416,
-         140319184, 142708880, 145929024, 150128080, 155290032, 159081232,
-         162833824, 166106272, 168373648, 169188880, 168373648, 166106272,
-         162833824, 159081248, 155290032, 150128080, 145929040, 142708880,
-         140319168, 138578416, 136692320, 135615808, 135005872, 134661536,
-         134217744},
-        {134217744, 134962848, 135539840, 136559456, 138351760, 141470368,
-         144325616, 148211728, 153391520, 160057728, 168132016, 173987488,
-         179727840, 184692672, 188111936, 189337408, 188111936, 184692672,
-         179727824, 173987488, 168132016, 160057728, 153391504, 148211728,
-         144325616, 141470352, 138351744, 136559456, 135539840, 134962848,
-         134217744},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019717216f, 0.0035163164f, 0.0062845536f,
+         0.0112742335f, 0.0203528218f, 0.0291403309f, 0.0419068150f,
+         0.0605678484f, 0.0879195333f, 0.1351860166f, 0.1836786717f,
+         0.2485272735f, 0.3268185556f, 0.3997989595f, 0.4313464165f,
+         0.3997990191f, 0.3268185258f, 0.2485273331f, 0.1836787015f,
+         0.1351860166f, 0.0879195333f, 0.0605678484f, 0.0419068113f,
+         0.0291403346f, 0.0203528218f, 0.0112742335f, 0.0062845536f,
+         0.0035163164f, 0.0019717216f, 0.0000000112f},
+        {0.0000000186f, 0.0030510165f, 0.0054394603f, 0.0097163878f,
+         0.0174134374f, 0.0313772969f, 0.0448416248f, 0.0643075109f,
+         0.0925465450f, 0.1334379315f, 0.1968761533f, 0.2619351149f,
+         0.3448232412f, 0.4391061962f, 0.5217757821f, 0.5560635328f,
+         0.5217759013f, 0.4391061366f, 0.3448233008f, 0.2619350851f,
+         0.1968761832f, 0.1334379166f, 0.0925465375f, 0.0643075034f,
+         0.0448416322f, 0.0313772969f, 0.0174134411f, 0.0097163878f,
+         0.0054394603f, 0.0030510165f, 0.0000000186f},
+        {0.0000000261f, 0.0045054816f, 0.0080264658f, 0.0143180229f,
+         0.0255970620f, 0.0459137484f, 0.0653222576f, 0.0930587947f,
+         0.1325951964f, 0.1883130074f, 0.2643320858f, 0.3264508545f,
+         0.4045200646f, 0.4876139462f, 0.5534963012f, 0.5791235566f,
+         0.5534963012f, 0.4876138866f, 0.4045200944f, 0.3264508843f,
+         0.2643321157f, 0.1883129925f, 0.1325951964f, 0.0930587873f,
+         0.0653222650f, 0.0459137484f, 0.0255970657f, 0.0143180229f,
+         0.0080264658f, 0.0045054816f, 0.0000000261f},
+        {0.0000000298f, 0.0052370913f, 0.0093230158f, 0.0166091397f,
+         0.0296230800f, 0.0529078096f, 0.0749611408f, 0.1061499193f,
+         0.1499306262f, 0.2102518976f, 0.2898877263f, 0.3526277840f,
+         0.4186539352f, 0.4797269106f, 0.5241174698f, 0.5405187011f,
+         0.5241175294f, 0.4797268510f, 0.4186539650f, 0.3526278138f,
+         0.2898877263f, 0.2102518976f, 0.1499306262f, 0.1061499119f,
+         0.0749611482f, 0.0529078059f, 0.0296230800f, 0.0166091397f,
+         0.0093230195f, 0.0052370913f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045337155f, 0.0080470815f, 0.0142611191f,
+         0.0252004601f, 0.0442794114f, 0.0617907457f, 0.0856798664f,
+         0.1175989881f, 0.1587630510f, 0.2086764723f, 0.2448662668f,
+         0.2803090215f, 0.3109185398f, 0.3319681287f, 0.3395054638f,
+         0.3319681585f, 0.3109185100f, 0.2803090215f, 0.2448662668f,
+         0.2086764574f, 0.1587630361f, 0.1175989881f, 0.0856798664f,
+         0.0617907532f, 0.0442794114f, 0.0252004638f, 0.0142611191f,
+         0.0080470815f, 0.0045337155f, 0.0000000261f},
+        {0.0000000037f, 0.0007901490f, 0.0014007613f, 0.0024771392f,
+         0.0043610819f, 0.0076146238f, 0.0105665363f, 0.0145437419f,
+         0.0197744034f, 0.0263919048f, 0.0342439152f, 0.0398325771f,
+         0.0452299826f, 0.0498363897f, 0.0529768690f, 0.0540962666f,
+         0.0529768690f, 0.0498363897f, 0.0452299863f, 0.0398325771f,
+         0.0342439152f, 0.0263919011f, 0.0197744034f, 0.0145437419f,
+         0.0105665363f, 0.0076146238f, 0.0043610819f, 0.0024771392f,
+         0.0014007613f, 0.0007901490f, 0.0000000037f}},
     {
-        {134217728, 133518624, 132972056, 131994936, 130241488, 127076656,
-         124044168, 119691480, 113437856, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113437856, 119691480,
-         124044168, 127076656, 130241488, 131994936, 132972056, 133518624,
-         134217728},
-        {134217728, 133562760, 133050888, 132136072, 130495576, 127538336,
-         124709592, 120658264, 114858008, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 114858008, 120658264,
-         124709592, 127538336, 130495560, 132136072, 133050888, 133562760,
-         134217728},
-        {134217728, 133629896, 133170680, 132350456, 130881064, 128237360,
-         125714928, 122114032, 116984936, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 116984936, 122114032,
-         125714928, 128237360, 130881064, 132350456, 133170680, 133629896,
-         134217728},
-        {134217728, 133798056, 133470584, 132886472, 131842704, 129973568,
-         128201072, 125690088, 122155288, 117261000, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 117261000, 122155288, 125690088,
-         128201072, 129973568, 131842704, 132886456, 133470584, 133798056,
-         134217728},
-        {134217728, 133961128, 133761128, 133404840, 132769744, 131637408,
-         130569696, 129067480, 126974144, 124119080, 120401016, 117512176,
-         114509792, 111848104, 111848104, 111848104, 111848104, 111848104,
-         114509792, 117512160, 120401008, 124119080, 126974144, 129067480,
-         130569696, 131637424, 132769744, 133404840, 133761128, 133961128,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134627808, 134946048, 135509888, 136505536, 138251328,
-         139864096, 142080384, 145070800, 148976736, 153787568, 157326848,
-         160834672, 163897216, 166020960, 166784896, 166020960, 163897200,
-         160834688, 157326848, 153787568, 148976736, 145070800, 142080384,
-         139864096, 138251328, 136505536, 135509888, 134946048, 134627808,
-         134217744},
-        {134217728, 134906272, 135439648, 136382608, 138041424, 140931408,
-         143581232, 147193280, 152017056, 158239216, 165794560, 171285200,
-         176676288, 181345168, 184563696, 185717792, 184563696, 181345168,
-         176676272, 171285200, 165794560, 158239216, 152017056, 147193280,
-         143581216, 140931408, 138041424, 136382608, 135439648, 134906272,
-         134217744},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019683354f, 0.0035055354f, 0.0062500574f,
+         0.0111629069f, 0.0199882090f, 0.0283894800f, 0.0403442569f,
+         0.0572769158f, 0.0809144601f, 0.1127139255f, 0.1382882297f,
+         0.1657483131f, 0.1942400485f, 0.2178780138f, 0.2269225717f,
+         0.2178780288f, 0.1942400336f, 0.1657482982f, 0.1382882297f,
+         0.1127139255f, 0.0809144527f, 0.0572769195f, 0.0403442495f,
+         0.0283894837f, 0.0199882090f, 0.0111629069f, 0.0062500574f,
+         0.0035055354f, 0.0019683354f, 0.0000000112f},
+        {0.0000000186f, 0.0030463114f, 0.0054244995f, 0.0096685886f,
+         0.0172595158f, 0.0308753066f, 0.0438121483f, 0.0621782839f,
+         0.0881035700f, 0.1241139099f, 0.1722071767f, 0.2105752081f,
+         0.2514455616f, 0.2897335589f, 0.3197217584f, 0.3322763145f,
+         0.3197217584f, 0.2897335589f, 0.2514455616f, 0.2105752081f,
+         0.1722071916f, 0.1241139099f, 0.0881035626f, 0.0621782765f,
+         0.0438121520f, 0.0308753066f, 0.0172595195f, 0.0096685886f,
+         0.0054244995f, 0.0030463114f, 0.0000000186f},
+        {0.0000000261f, 0.0045005269f, 0.0080107339f, 0.0142679065f,
+         0.0254365876f, 0.0453957841f, 0.0642707124f, 0.0909159109f,
+         0.1282205731f, 0.1794259250f, 0.2466703802f, 0.2993502319f,
+         0.3544936478f, 0.4052205384f, 0.4419170022f, 0.4554374814f,
+         0.4419170320f, 0.4052205086f, 0.3544936776f, 0.2993502319f,
+         0.2466703951f, 0.1794259250f, 0.1282205731f, 0.0909159034f,
+         0.0642707199f, 0.0453957841f, 0.0254365914f, 0.0142679065f,
+         0.0080107339f, 0.0045005269f, 0.0000000261f},
+        {0.0000000298f, 0.0052335747f, 0.0093118623f, 0.0165737085f,
+         0.0295102485f, 0.0525471680f, 0.0742358714f, 0.1046918780f,
+         0.1470117569f, 0.2044855654f, 0.2788636386f, 0.3362472057f,
+         0.3954694569f, 0.4491762221f, 0.4875625670f, 0.5016064048f,
+         0.4875625968f, 0.4491762221f, 0.3954694867f, 0.3362472057f,
+         0.2788636386f, 0.2044855654f, 0.1470117569f, 0.1046918631f,
+         0.0742358789f, 0.0525471680f, 0.0295102522f, 0.0165737085f,
+         0.0093118623f, 0.0052335709f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045385733f, 0.0080623738f, 0.0143091008f,
+         0.0253500044f, 0.0447396338f, 0.0626842678f, 0.0873906389f,
+         0.1208031848f, 0.1645577550f, 0.2185891271f, 0.2584138811f,
+         0.2979290783f, 0.3324524164f, 0.3564015627f, 0.3650175929f,
+         0.3564015925f, 0.3324523866f, 0.2979291081f, 0.2584138811f,
+         0.2185891420f, 0.1645577699f, 0.1208031774f, 0.0873906240f,
+         0.0626842752f, 0.0447396338f, 0.0253500082f, 0.0143091008f,
+         0.0080623738f, 0.0045385733f, 0.0000000261f},
+        {0.0000000037f, 0.0007915683f, 0.0014052205f, 0.0024910569f,
+         0.0044040829f, 0.0077450164f, 0.0108163506f, 0.0150136538f,
+         0.0206346437f, 0.0279043429f, 0.0367485955f, 0.0431800336f,
+         0.0494931713f, 0.0549562946f, 0.0587187931f, 0.0600671172f,
+         0.0587187931f, 0.0549562946f, 0.0494931750f, 0.0431800373f,
+         0.0367485955f, 0.0279043429f, 0.0206346437f, 0.0150136538f,
+         0.0108163506f, 0.0077450164f, 0.0044040829f, 0.0024910569f,
+         0.0014052168f, 0.0007915683f, 0.0000000037f}},
     {
-        {134217728, 133682984, 133265384, 132519816, 131185264, 128787744,
-         126504696, 123253640, 118640752, 112174824, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 112174824, 118640752, 123253640,
-         126504696, 128787744, 131185264, 132519816, 133265384, 133682984,
-         134217728},
-        {134217728, 133716728, 133325584, 132627440, 131378384, 129136568,
-         127004448, 123973008, 119681960, 113689736, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 113689744, 119681960, 123973008,
-         127004448, 129136568, 131378376, 132627440, 133325584, 133716744,
-         134217728},
-        {134217728, 133768056, 133417096, 132790928, 131671560, 129665320,
-         127760792, 125059176, 121248440, 115955928, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 115955928, 121248440, 125059176,
-         127760792, 129665320, 131671560, 132790928, 133417096, 133768056,
-         134217728},
-        {134217728, 133896640, 133646248, 133200016, 132403792, 130981736,
-         129637848, 127742080, 125090024, 121452368, 116676144, 112931424,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 112931424, 116676152, 121452360, 125090024, 127742080,
-         129637848, 130981736, 132403792, 133200016, 133646248, 133896640,
-         134217728},
-        {134217728, 134021376, 133868400, 133596016, 133110896, 132247376,
-         131434736, 130294184, 128710328, 126560928, 123781432, 121638024,
-         119426296, 117420384, 115986304, 115461520, 115986304, 117420384,
-         119426296, 121638024, 123781432, 126560928, 128710328, 130294184,
-         131434736, 132247360, 133110896, 133596016, 133868400, 134021376,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134531696, 134775520, 135207824, 135972192, 137315552,
-         138559920, 140275120, 142598512, 145648144, 149426144, 152220032,
-         155000416, 157436608, 159130592, 159740864, 159130592, 157436608,
-         155000416, 152220032, 149426144, 145648128, 142598512, 140275120,
-         138559920, 137315536, 135972192, 135207824, 134775504, 134531696,
-         134217728},
-        {134217728, 134745024, 135153936, 135877760, 137153824, 139385200,
-         141439904, 144253632, 148033040, 152942128, 158949856, 163344976,
-         167682224, 171454624, 174063344, 175000352, 174063344, 171454624,
-         167682224, 163344976, 158949856, 152942128, 148033040, 144253632,
-         141439904, 139385200, 137153824, 135877760, 135153936, 134745040,
-         134217744},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019643605f, 0.0034929439f, 0.0062100887f,
+         0.0110357292f, 0.0195823126f, 0.0275742412f, 0.0387081020f,
+         0.0540083535f, 0.0744726434f, 0.1004251465f, 0.1200447381f,
+         0.1399304867f, 0.1576502621f, 0.1701345593f, 0.1746647060f,
+         0.1701345742f, 0.1576502621f, 0.1399305016f, 0.1200447381f,
+         0.1004251465f, 0.0744726434f, 0.0540083535f, 0.0387080982f,
+         0.0275742412f, 0.0195823126f, 0.0110357292f, 0.0062100887f,
+         0.0034929439f, 0.0019643605f, 0.0000000112f},
+        {0.0000000186f, 0.0030407943f, 0.0054070093f, 0.0096130967f,
+         0.0170830972f, 0.0303130411f, 0.0426843874f, 0.0599193908f,
+         0.0836038888f, 0.1152822077f, 0.1554561853f, 0.1858269274f,
+         0.2166096866f, 0.2440395653f, 0.2633650005f, 0.2703775764f,
+         0.2633650303f, 0.2440395504f, 0.2166097015f, 0.1858269274f,
+         0.1554561853f, 0.1152822077f, 0.0836038888f, 0.0599193871f,
+         0.0426843911f, 0.0303130411f, 0.0170830972f, 0.0096130967f,
+         0.0054070130f, 0.0030407943f, 0.0000000186f},
+        {0.0000000261f, 0.0044947043f, 0.0079922937f, 0.0142094567f,
+         0.0252511203f, 0.0448067673f, 0.0630932897f, 0.0885689482f,
+         0.1235778332f, 0.1704026759f, 0.2297852188f, 0.2746772766f,
+         0.3201783597f, 0.3607234061f, 0.3892890215f, 0.3996545672f,
+         0.3892890513f, 0.3607234061f, 0.3201783895f, 0.2746773064f,
+         0.2297852337f, 0.1704026610f, 0.1235778257f, 0.0885689408f,
+         0.0630932897f, 0.0448067635f, 0.0252511241f, 0.0142094567f,
+         0.0079922937f, 0.0044947043f, 0.0000000261f},
+        {0.0000000298f, 0.0052294321f, 0.0092987530f, 0.0165322050f,
+         0.0293787941f, 0.0521311015f, 0.0734068304f, 0.1030468717f,
+         0.1437784731f, 0.1982575357f, 0.2673470378f, 0.3195773959f,
+         0.3725163043f, 0.4196890593f, 0.4529241323f, 0.4649840891f,
+         0.4529241621f, 0.4196890295f, 0.3725163341f, 0.3195773959f,
+         0.2673470676f, 0.1982575357f, 0.1437784731f, 0.1030468568f,
+         0.0734068379f, 0.0521311015f, 0.0293787979f, 0.0165322050f,
+         0.0092987530f, 0.0052294284f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045443214f, 0.0080805235f, 0.0143663213f,
+         0.0255298801f, 0.0453014039f, 0.0637897998f, 0.0895466954f,
+         0.1249420568f, 0.1722838134f, 0.2323219031f, 0.2777095437f,
+         0.3237129450f, 0.3647055924f, 0.3935865462f, 0.4040665329f,
+         0.3935865760f, 0.3647055626f, 0.3237129450f, 0.2777095735f,
+         0.2323219180f, 0.1722838134f, 0.1249420494f, 0.0895466879f,
+         0.0637898073f, 0.0453014039f, 0.0255298801f, 0.0143663213f,
+         0.0080805235f, 0.0045443214f, 0.0000000261f},
+        {0.0000000037f, 0.0007932559f, 0.0014105327f, 0.0025077760f,
+         0.0044564828f, 0.0079077892f, 0.0111351162f, 0.0156312287f,
+         0.0218098238f, 0.0300737768f, 0.0405539945f, 0.0484768376f,
+         0.0565071665f, 0.0636628196f, 0.0687042698f, 0.0705336481f,
+         0.0687042698f, 0.0636628196f, 0.0565071702f, 0.0484768413f,
+         0.0405539945f, 0.0300737731f, 0.0218098238f, 0.0156312250f,
+         0.0111351162f, 0.0079077892f, 0.0044564828f, 0.0025077760f,
+         0.0014105327f, 0.0007932559f, 0.0000000037f}},
     {
-        {134217728, 133928592, 133703168, 133301512, 132585192, 131306928,
-         130100248, 128400288, 126026792, 122780488, 118535792, 115223136,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 115223136, 118535792, 122780488, 126026792, 128400288,
-         130100248, 131306912, 132585176, 133301512, 133703168, 133928592,
-         134217728},
-        {134217728, 133946816, 133735640, 133359432, 132688632, 131492208,
-         130363488, 128774544, 126558464, 123532296, 119584464, 116511232,
-         113311288, 111848104, 111848104, 111848104, 111848104, 111848104,
-         113311272, 116511232, 119584464, 123532296, 126558464, 128774544,
-         130363488, 131492208, 132688632, 133359416, 133735640, 133946816,
-         134217728},
-        {134217728, 133974552, 133785016, 133447456, 132845800, 131773512,
-         130762848, 129341696, 127362856, 124667064, 121162048, 118443504,
-         115622880, 113050192, 111848104, 111848104, 111848104, 113050192,
-         115622872, 118443504, 121162064, 124667064, 127362856, 129341696,
-         130762848, 131773512, 132845800, 133447456, 133785016, 133974552,
-         134217728},
-        {134217728, 134044048, 133908744, 133667912, 133239096, 132476240,
-         131758880, 130752952, 129357832, 127467976, 125030208, 123155288,
-         121225328, 119479320, 118233720, 117778464, 118233720, 119479320,
-         121225328, 123155288, 125030208, 127467976, 129357832, 130752952,
-         131758880, 132476240, 133239096, 133667912, 133908760, 134044048,
-         134217728},
-        {134217728, 134111512, 134028776, 133881624, 133619856, 133154992,
-         132718832, 132108784, 131265840, 130129840, 128674776, 127563760,
-         126427688, 125406704, 124682360, 124418464, 124682360, 125406704,
-         126427688, 127563760, 128674776, 130129840, 131265840, 132108784,
-         132718832, 133154992, 133619856, 133881608, 134028776, 134111512,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134387728, 134519888, 134754464, 135170064, 135903024,
-         136584848, 137529104, 138816208, 140519312, 142649904, 144239712,
-         145833408, 147238976, 148221248, 148576080, 148221264, 147238976,
-         145833408, 144239712, 142649920, 140519312, 138816208, 137529088,
-         136584848, 135903024, 135170064, 134754464, 134519888, 134387744,
-         134217728},
-        {134217728, 134503360, 134725216, 135118656, 135814608, 137038528,
-         138173216, 139738624, 141861664, 144652528, 148116256, 150681936,
-         153238592, 155481344, 157042224, 157604816, 157042224, 155481344,
-         153238592, 150681936, 148116256, 144652528, 141861648, 139738624,
-         138173216, 137038544, 135814624, 135118656, 134725200, 134503360,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019604117f, 0.0034804866f, 0.0061708763f,
+         0.0109128021f, 0.0192001797f, 0.0268254243f, 0.0372561179f,
+         0.0512422584f, 0.0693590865f, 0.0914405733f, 0.1075243428f,
+         0.1233326122f, 0.1370278746f, 0.1464678645f, 0.1498522907f,
+         0.1464678794f, 0.1370278597f, 0.1233326122f, 0.1075243428f,
+         0.0914405733f, 0.0693590865f, 0.0512422547f, 0.0372561105f,
+         0.0268254280f, 0.0192001797f, 0.0109128058f, 0.0061708800f,
+         0.0034804903f, 0.0019604117f, 0.0000000112f},
+        {0.0000000186f, 0.0030353032f, 0.0053896904f, 0.0095585547f,
+         0.0169119760f, 0.0297804140f, 0.0416394584f, 0.0578900538f,
+         0.0797299594f, 0.1081020311f, 0.1428017914f, 0.1681542546f,
+         0.1931329668f, 0.2148192078f, 0.2297913432f, 0.2351637781f,
+         0.2297913432f, 0.2148191929f, 0.1931329668f, 0.1681542546f,
+         0.1428017914f, 0.1081020236f, 0.0797299519f, 0.0578900538f,
+         0.0416394621f, 0.0297804177f, 0.0169119798f, 0.0095585547f,
+         0.0053896904f, 0.0030353032f, 0.0000000186f},
+        {0.0000000261f, 0.0044889040f, 0.0079739802f, 0.0141517222f,
+         0.0250696540f, 0.0442400984f, 0.0619782880f, 0.0863948390f,
+         0.1194054484f, 0.1626167595f, 0.2159518152f, 0.2552460730f,
+         0.2942210138f, 0.3282613754f, 0.3518696427f, 0.3603619635f,
+         0.3518696725f, 0.3282613456f, 0.2942210138f, 0.2552460730f,
+         0.2159518450f, 0.1626167595f, 0.1194054410f, 0.0863948315f,
+         0.0619782880f, 0.0442400984f, 0.0250696540f, 0.0141517222f,
+         0.0079739802f, 0.0044889040f, 0.0000000261f},
+        {0.0000000298f, 0.0052252971f, 0.0092856996f, 0.0164910108f,
+         0.0292490833f, 0.0517247654f, 0.0726049617f, 0.1014770418f,
+         0.1407495439f, 0.1925659627f, 0.2571487725f, 0.3051639795f,
+         0.3531456888f, 0.3953380287f, 0.4247539639f, 0.4353657961f,
+         0.4247539937f, 0.3953379989f, 0.3531457186f, 0.3051639795f,
+         0.2571487725f, 0.1925659627f, 0.1407495439f, 0.1014770344f,
+         0.0726049691f, 0.0517247617f, 0.0292490870f, 0.0164910108f,
+         0.0092856996f, 0.0052252971f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045500919f, 0.0080987960f, 0.0144242346f,
+         0.0257136337f, 0.0458848849f, 0.0649559572f, 0.0918706506f,
+         0.1295377463f, 0.1812113971f, 0.2490174472f, 0.3020929396f,
+         0.3576069772f, 0.4086337686f, 0.4455218017f, 0.4591074288f,
+         0.4455218613f, 0.4086337388f, 0.3576069772f, 0.3020929396f,
+         0.2490174621f, 0.1812113971f, 0.1295377314f, 0.0918706357f,
+         0.0649559572f, 0.0458848849f, 0.0257136375f, 0.0144242346f,
+         0.0080987960f, 0.0045500919f, 0.0000000261f},
+        {0.0000000037f, 0.0007949509f, 0.0014159046f, 0.0025248416f,
+         0.0045107976f, 0.0080812797f, 0.0114838332f, 0.0163318664f,
+         0.0232117549f, 0.0328431986f, 0.0458545387f, 0.0563677736f,
+         0.0677092671f, 0.0806207359f, 0.0907390416f, 0.0946287960f,
+         0.0907390490f, 0.0806207284f, 0.0677092746f, 0.0563677773f,
+         0.0458545424f, 0.0328431986f, 0.0232117511f, 0.0163318627f,
+         0.0114838332f, 0.0080812797f, 0.0045107976f, 0.0025248416f,
+         0.0014159046f, 0.0007949509f, 0.0000000037f}},
     {
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019570850f, 0.0034700334f, 0.0061382130f,
+         0.0108117498f, 0.0188931711f, 0.0262362324f, 0.0361453071f,
+         0.0492029004f, 0.0657609925f, 0.0854583159f, 0.0995077118f,
+         0.1130974963f, 0.1247107610f, 0.1326356232f, 0.1354617476f,
+         0.1326356232f, 0.1247107536f, 0.1130975038f, 0.0995077044f,
+         0.0854583159f, 0.0657609925f, 0.0492029004f, 0.0361453034f,
+         0.0262362324f, 0.0188931711f, 0.0108117498f, 0.0061382130f,
+         0.0034700334f, 0.0019570850f, 0.0000000112f},
+        {0.0000000186f, 0.0030306727f, 0.0053751357f, 0.0095130354f,
+         0.0167708695f, 0.0293502137f, 0.0408112556f, 0.0563221611f,
+         0.0768360794f, 0.1029630005f, 0.1341941655f, 0.1565610766f,
+         0.1782617718f, 0.1968532801f, 0.2095632553f, 0.2141001821f,
+         0.2095632553f, 0.1968532652f, 0.1782617867f, 0.1565610915f,
+         0.1341941804f, 0.1029629931f, 0.0768360794f, 0.0563221574f,
+         0.0408112593f, 0.0293502137f, 0.0167708695f, 0.0095130354f,
+         0.0053751357f, 0.0030306727f, 0.0000000186f},
+        {0.0000000261f, 0.0044840015f, 0.0079585500f, 0.0141033232f,
+         0.0249188393f, 0.0437761769f, 0.0610779524f, 0.0846719742f,
+         0.1161808893f, 0.1567904651f, 0.2059956193f, 0.2416490465f,
+         0.2765491605f, 0.3066769838f, 0.3273887634f, 0.3348038197f,
+         0.3273887634f, 0.3066769540f, 0.2765491605f, 0.2416490614f,
+         0.2059956342f, 0.1567904651f, 0.1161808893f, 0.0846719667f,
+         0.0610779561f, 0.0437761769f, 0.0249188431f, 0.0141033232f,
+         0.0079585500f, 0.0044840015f, 0.0000000261f},
+        {0.0000000298f, 0.0052218027f, 0.0092746764f, 0.0164563321f,
+         0.0291404575f, 0.0513876267f, 0.0719453543f, 0.1002009511f,
+         0.1383263767f, 0.1881065071f, 0.2493602335f, 0.2943610847f,
+         0.3388943374f, 0.3777095377f, 0.4045871496f, 0.4142472148f,
+         0.4045871794f, 0.3777095079f, 0.3388943672f, 0.2943610847f,
+         0.2493602484f, 0.1881065071f, 0.1383263767f, 0.1002009436f,
+         0.0719453618f, 0.0513876304f, 0.0291404612f, 0.0164563321f,
+         0.0092746764f, 0.0052218027f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045550019f, 0.0081143826f, 0.0144738853f,
+         0.0258725621f, 0.0463975929f, 0.0659963340f, 0.0939892456f,
+         0.1338582933f, 0.1899754107f, 0.2663972974f, 0.3287125826f,
+         0.4048410356f, 0.4869871140f, 0.5518758297f, 0.5770589113f,
+         0.5518758893f, 0.4869870842f, 0.4048410952f, 0.3287125826f,
+         0.2663973570f, 0.1899754107f, 0.1338582933f, 0.0939892307f,
+         0.0659963414f, 0.0463975891f, 0.0258725658f, 0.0144738853f,
+         0.0081143863f, 0.0045550019f, 0.0000000261f},
+        {0.0000000037f, 0.0007963963f, 0.0014205091f, 0.0025395826f,
+         0.0045584328f, 0.0082376562f, 0.0118066110f, 0.0170059167f,
+         0.0246388987f, 0.0359060094f, 0.0565599203f, 0.0778557062f,
+         0.1072221622f, 0.1441027969f, 0.1799743026f, 0.1959500462f,
+         0.1799743474f, 0.1441027820f, 0.1072221696f, 0.0778557062f,
+         0.0565599203f, 0.0359060094f, 0.0246388987f, 0.0170059167f,
+         0.0118066110f, 0.0082376562f, 0.0045584328f, 0.0025395826f,
+         0.0014205091f, 0.0007963963f, 0.0000000037f}},
     {
-        {134217728, 134506240, 134730320, 135127728, 135830656, 137066736,
-         138212592, 139793296, 141936768, 144754096, 148250000, 150839072,
-         153418688, 155681312, 157255888, 157823360, 157255888, 155681312,
-         153418688, 150839072, 148250000, 144754096, 141936768, 139793296,
-         138212592, 137066736, 135830656, 135127728, 134730320, 134506240,
-         134217728},
-        {134217728, 134488080, 134698096, 135070576, 135729600, 136888992,
-         137964336, 139448608, 141462896, 144113040, 147405392, 149846352,
-         152280496, 154417184, 155904992, 156441360, 155904992, 154417184,
-         152280496, 149846352, 147405392, 144113056, 141462896, 139448592,
-         137964336, 136888992, 135729600, 135070592, 134698096, 134488080,
-         134217728},
-        {134217728, 134460464, 134649040, 134983616, 135575776, 136618224,
-         137585888, 138922720, 140739120, 143132528, 146111456, 148323744,
-         150532880, 152474432, 153827616, 154315712, 153827616, 152474432,
-         150532880, 148323744, 146111456, 143132528, 140739104, 138922720,
-         137585872, 136618224, 135575776, 134983616, 134649040, 134460464,
-         134217728},
-        {134217728, 134391168, 134526000, 134765312, 135189280, 135936912,
-         136632336, 137595280, 138907696, 140643920, 142815424, 144435360,
-         146058944, 147490640, 148491024, 148852384, 148491024, 147490640,
-         146058944, 144435360, 142815424, 140643920, 138907696, 137595280,
-         136632320, 135936912, 135189264, 134765312, 134526000, 134391168,
-         134217728},
-        {134217728, 134323872, 134406416, 134552992, 134812944, 135272112,
-         135700080, 136294032, 137106080, 138184736, 139540672, 140557056,
-         141579792, 142484928, 143119200, 143348672, 143119200, 142484928,
-         141579792, 140557056, 139540672, 138184736, 137106080, 136294032,
-         135700080, 135272112, 134812944, 134552992, 134406416, 134323872,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134047496, 133914896, 133678832, 133258584, 132511008,
-         131808096, 130822576, 129456008, 127605336, 125219000, 123384360,
-         121496560, 119789320, 118571720, 118126808, 118571736, 119789320,
-         121496560, 123384360, 125219000, 127605336, 129456008, 130822576,
-         131808096, 132511008, 133258584, 133678848, 133914896, 134047496,
-         134217728},
-        {134217728, 133931488, 133708328, 133310696, 132601600, 131336352,
-         130142072, 128459768, 126111336, 122900128, 118702864, 115428552,
-         112012200, 111848104, 111848104, 111848104, 111848104, 111848104,
-         112012200, 115428552, 118702864, 122900128, 126111336, 128459768,
-         130142072, 131336352, 132601616, 133310696, 133708328, 133931488,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f},
+        {0.0000000112f, 0.0019548684f, 0.0034630969f, 0.0061166696f,
+         0.0107457712f, 0.0186960548f, 0.0258635134f, 0.0354561731f,
+         0.0479685590f, 0.0636471361f, 0.0820589438f, 0.0950533152f,
+         0.1075267568f, 0.1181191504f, 0.1253151745f, 0.1278754473f,
+         0.1253151745f, 0.1181191429f, 0.1075267568f, 0.0950533152f,
+         0.0820589513f, 0.0636471361f, 0.0479685590f, 0.0354561731f,
+         0.0258635171f, 0.0186960548f, 0.0107457712f, 0.0061166734f,
+         0.0034630969f, 0.0019548684f, 0.0000000112f},
+        {0.0000000186f, 0.0030275919f, 0.0053654797f, 0.0094829798f,
+         0.0166785270f, 0.0290729403f, 0.0402846411f, 0.0553428568f,
+         0.0750693232f, 0.0999113992f, 0.1292407066f, 0.1500300914f,
+         0.1700480729f, 0.1870902777f, 0.1986886710f, 0.2028190494f,
+         0.1986886710f, 0.1870902628f, 0.1700480729f, 0.1500301063f,
+         0.1292407066f, 0.0999113992f, 0.0750693232f, 0.0553428493f,
+         0.0402846411f, 0.0290729403f, 0.0166785270f, 0.0094829798f,
+         0.0053654797f, 0.0030275919f, 0.0000000186f},
+        {0.0000000261f, 0.0044807382f, 0.0079482906f, 0.0140712596f,
+         0.0248195715f, 0.0434742048f, 0.0604977794f, 0.0835766271f,
+         0.1141664237f, 0.1532292813f, 0.2000626326f, 0.2336882651f,
+         0.2663741410f, 0.2944218218f, 0.3136188090f, 0.3204754591f,
+         0.3136188090f, 0.2944217920f, 0.2663741708f, 0.2336882651f,
+         0.2000626326f, 0.1532292962f, 0.1141664162f, 0.0835766271f,
+         0.0604977906f, 0.0434742048f, 0.0248195753f, 0.0140712596f,
+         0.0079482906f, 0.0044807382f, 0.0000000261f},
+        {0.0000000298f, 0.0052194707f, 0.0092673339f, 0.0164332762f,
+         0.0290685408f, 0.0511660054f, 0.0715145171f, 0.0993746519f,
+         0.1367753297f, 0.1852938682f, 0.2445339411f, 0.2877510786f,
+         0.3302804530f, 0.3671652079f, 0.3926102221f, 0.4017367959f,
+         0.3926102519f, 0.3671651781f, 0.3302804828f, 0.2877510488f,
+         0.2445339262f, 0.1852938682f, 0.1367753297f, 0.0993746296f,
+         0.0715145245f, 0.0511660017f, 0.0290685445f, 0.0164332762f,
+         0.0092673302f, 0.0052194707f, 0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f,
+         0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f,
+         0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f,
+         0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f,
+         0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f,
+         0.0099989995f, 0.0056232363f, 0.0000000298f},
+        {0.0000000261f, 0.0045582913f, 0.0081248507f, 0.0145073459f,
+         0.0259804092f, 0.0467499122f, 0.0667200089f, 0.0954893604f,
+         0.1369983852f, 0.1965934485f, 0.2817551196f, 0.3696863651f,
+         0.4782578051f, 0.5972789526f, 0.6979248524f, 0.7386929989f,
+         0.6979249120f, 0.5972788930f, 0.4782578349f, 0.3696863651f,
+         0.2817551494f, 0.1965934485f, 0.1369983703f, 0.0954893529f,
+         0.0667200163f, 0.0467499122f, 0.0259804130f, 0.0145073459f,
+         0.0081248507f, 0.0045582913f, 0.0000000261f},
+        {0.0000000037f, 0.0007973649f, 0.0014236122f, 0.0025495738f,
+         0.0045911148f, 0.0083473474f, 0.0120380968f, 0.0175057761f,
+         0.0257535614f, 0.0410830304f, 0.0712796301f, 0.1087764949f,
+         0.1762015969f, 0.3041011989f, 0.5248691440f, 0.6885961890f,
+         0.5248694420f, 0.3041011393f, 0.1762016118f, 0.1087765023f,
+         0.0712796375f, 0.0410830304f, 0.0257535614f, 0.0175057724f,
+         0.0120380968f, 0.0083473474f, 0.0045911148f, 0.0025495775f,
+         0.0014236122f, 0.0007973649f, 0.0000000037f}}};
+
+const FLOAT32 ixheaacd_weight[16][8][31] = {
     {
-        {134217728, 134750352, 135163360, 135894416, 137183168, 139436416,
-         141510976, 144351440, 148166016, 153119584, 159180064, 163612720,
-         167986224, 171789568, 174419376, 175363904, 174419392, 171789552,
-         167986224, 163612736, 159180064, 153119584, 148166016, 144351440,
-         141510976, 139436416, 137183168, 135894416, 135163360, 134750352,
-         134217744},
-        {134217728, 134716864, 135103984, 135789392, 136998240, 139113424,
-         141062640, 143734096, 147326256, 151998160, 157724080, 161918432,
-         166061616, 169668288, 172163984, 173060688, 172163968, 169668288,
-         166061616, 161918432, 157724080, 151998160, 147326256, 143734096,
-         141062640, 139113424, 136998240, 135789392, 135103984, 134716864,
-         134217744},
-        {134217728, 134665904, 135013632, 135629504, 136716496, 138620704,
-         140377968, 142790048, 146039760, 150276480, 155483472, 159306928,
-         163090832, 166390080, 168675792, 169497600, 168675792, 166390080,
-         163090832, 159306944, 155483488, 150276480, 146039760, 142790048,
-         140377968, 138620704, 136716496, 135629504, 135013616, 134665904,
-         134217744},
-        {134217728, 134538048, 134786784, 135227776, 136007472, 137377520,
-         138646400, 140395008, 142763040, 145870208, 149717968, 152562416,
-         155392320, 157871248, 159594640, 160215424, 159594624, 157871248,
-         155392320, 152562416, 149717968, 145870208, 142763040, 140395008,
-         138646400, 137377520, 136007472, 135227776, 134786768, 134538048,
-         134217728},
-        {134217728, 134413792, 134566144, 134836576, 135315504, 136159568,
-         136944176, 138029792, 139507872, 141460704, 143899120, 145715424,
-         147533568, 149135008, 150253024, 150656672, 150253024, 149135008,
-         147533568, 145715424, 143899120, 141460688, 139507872, 138029792,
-         136944176, 136159584, 135315504, 134836576, 134566160, 134413792,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133903024, 133657608, 133220288, 132440008, 131046696,
-         129730280, 127873712, 125277552, 121718608, 117049664, 113392528,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 113392528, 117049680, 121718608, 125277552, 127873712,
-         129730280, 131046696, 132440024, 133220288, 133657624, 133903024,
-         134217728},
-        {134217728, 133688336, 133274944, 132536912, 131215936, 128843168,
-         126584160, 123368104, 118806640, 112416656, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 112416656, 118806640, 123368104,
-         126584160, 128843168, 131215952, 132536912, 133274944, 133688336,
-         134217728},
-    },
+
+        {0.5000000596f, 0.5028037429f, 0.5049747229f, 0.5088109374f,
+         0.5155536532f, 0.5272839665f, 0.5380217433f, 0.5526331663f,
+         0.5721039176f, 0.5971546769f, 0.6274869442f, 0.6494780183f,
+         0.6710323095f, 0.6896716356f, 0.7025068998f, 0.7071067691f,
+         0.7025068998f, 0.6896716356f, 0.6710323691f, 0.6494780183f,
+         0.6274869442f, 0.5971546769f, 0.5721039176f, 0.5526331663f,
+         0.5380217433f, 0.5272839665f, 0.5155536532f, 0.5088109374f,
+         0.5049747825f, 0.5028037429f, 0.5000000596f},
+        {0.5000000000f, 0.5026275516f, 0.5046628118f, 0.5082603693f,
+         0.5145876408f, 0.5256069303f, 0.5357060432f, 0.5494661331f,
+         0.5678316951f, 0.5915051103f, 0.6202291846f, 0.6410904527f,
+         0.6615636945f, 0.6792872548f, 0.6915015578f, 0.6958807707f,
+         0.6915016174f, 0.6792873144f, 0.6615636945f, 0.6410903931f,
+         0.6202292442f, 0.5915051103f, 0.5678316951f, 0.5494661331f,
+         0.5357059836f, 0.5256069303f, 0.5145876408f, 0.5082603693f,
+         0.5046628118f, 0.5026275516f, 0.5000000596f},
+        {0.5000000000f, 0.5023595095f, 0.5041879416f, 0.5074218512f,
+         0.5131149292f, 0.5230458379f, 0.5321645737f, 0.5446138382f,
+         0.5612714887f, 0.5828074217f, 0.6090247035f, 0.6281185746f,
+         0.6468966603f, 0.6631815434f, 0.6744188070f, 0.6784504652f,
+         0.6744188070f, 0.6631814837f, 0.6468966603f, 0.6281185746f,
+         0.6090247035f, 0.5828074217f, 0.5612714887f, 0.5446138978f,
+         0.5321645737f, 0.5230458379f, 0.5131149292f, 0.5074217916f,
+         0.5041879416f, 0.5023595095f, 0.5000000596f},
+        {0.5000000000f, 0.5016866922f, 0.5029953122f, 0.5053130984f,
+         0.5094034672f, 0.5165683627f, 0.5231794715f, 0.5322527885f,
+         0.5444748402f, 0.5604054928f, 0.5799794793f, 0.5943493247f,
+         0.6085679531f, 0.6209635735f, 0.6295502782f, 0.6326373219f,
+         0.6295503378f, 0.6209636331f, 0.6085679531f, 0.5943493247f,
+         0.5799794793f, 0.5604054928f, 0.5444748402f, 0.5322527885f,
+         0.5231794715f, 0.5165683627f, 0.5094034672f, 0.5053130984f,
+         0.5029953122f, 0.5016866922f, 0.5000000596f},
+        {0.5000000000f, 0.5010325909f, 0.5018346906f, 0.5032572150f,
+         0.5057737827f, 0.5102003217f, 0.5143051744f, 0.5199697018f,
+         0.5276548266f, 0.5377621055f, 0.5503131151f, 0.5596145988f,
+         0.5688871741f, 0.5770241618f, 0.5826888084f, 0.5847306848f,
+         0.5826888084f, 0.5770241618f, 0.5688871145f, 0.5596145988f,
+         0.5503131151f, 0.5377621055f, 0.5276548266f, 0.5199697614f,
+         0.5143051147f, 0.5102003217f, 0.5057737231f, 0.5032572150f,
+         0.5018346906f, 0.5010325909f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.4983411729f, 0.4970465600f, 0.4947369397f,
+         0.4906081855f, 0.4832093418f, 0.4761866629f, 0.4662267566f,
+         0.4521820247f, 0.4326849580f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4326850176f, 0.4521820247f, 0.4662267566f,
+         0.4761866629f, 0.4832093418f, 0.4906081855f, 0.4947369397f,
+         0.4970465600f, 0.4983412325f, 0.5000000000f},
+        {0.5000000000f, 0.4972087145f, 0.4950257242f, 0.4911214709f,
+         0.4841098487f, 0.4714359641f, 0.4592681825f, 0.4417585433f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4417585433f,
+         0.4592681825f, 0.4714359641f, 0.4841098487f, 0.4911214709f,
+         0.4950257242f, 0.4972087145f, 0.5000000000f}},
     {
-        {134217728, 134913216, 135451936, 136404304, 138079504, 140997600,
-         143672688, 147318512, 152186224, 158463280, 166082896, 171618768,
-         177053216, 181758880, 185002352, 186165344, 185002352, 181758896,
-         177053216, 171618768, 166082896, 158463296, 152186224, 147318512,
-         143672688, 140997600, 138079504, 136404304, 135451936, 134913216,
-         134217744},
-        {134217728, 134869504, 135374512, 136267584, 137839408, 140580112,
-         143095472, 146527744, 151117280, 157046336, 164257936, 169506256,
-         174664912, 179136576, 182221168, 183327616, 182221168, 179136560,
-         174664928, 169506256, 164257936, 157046336, 151117296, 146527744,
-         143095472, 140580112, 137839408, 136267584, 135374512, 134869504,
-         134217744},
-        {134217728, 134802992, 135256672, 136059376, 137473424, 139942768,
-         142213056, 145316768, 149476832, 154866368, 161442736, 166241776,
-         170968496, 175072880, 177907744, 178925312, 177907760, 175072880,
-         170968496, 166241776, 161442736, 154866368, 149476832, 145316768,
-         142213056, 139942768, 137473424, 136059376, 135256672, 134802992,
-         134217744},
-        {134217728, 134636080, 134960736, 135535920, 136551440, 138331744,
-         139976000, 142235024, 145282080, 149260352, 154157968, 157759584,
-         161328032, 164442560, 166601920, 167378576, 166601920, 164442544,
-         161328032, 157759584, 154157968, 149260368, 145282080, 142235024,
-         139976016, 138331728, 136551456, 135535920, 134960736, 134636096,
-         134217744},
-        {134217728, 134473824, 134672800, 135025728, 135650240, 136749360,
-         137769200, 139177520, 141089920, 143607984, 146739200, 149062688,
-         151381328, 153417872, 154836624, 155348256, 154836640, 153417872,
-         151381328, 149062688, 146739200, 143607984, 141089920, 139177520,
-         137769200, 136749360, 135650256, 135025712, 134672784, 134473824,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133806400, 133485440, 132913000, 131890240, 130059096,
-         128323168, 125864856, 122406120, 117621128, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 117621120, 122406120, 125864856,
-         128323168, 130059096, 131890240, 132913000, 133485440, 133806400,
-         134217728},
-        {134217728, 133525632, 132984568, 132017344, 130281848, 127150040,
-         124150024, 119845456, 113664464, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113664464, 119845456,
-         124150024, 127150040, 130281848, 132017344, 132984568, 133525632,
-         134217728},
-    },
-};
+
+        {0.5000000000f, 0.5025908947f, 0.5045977831f, 0.5081456304f,
+         0.5143862367f, 0.5252569914f, 0.5352224708f, 0.5488042235f,
+         0.5669378638f, 0.5903217196f, 0.6187070012f, 0.6393297315f,
+         0.6595746279f, 0.6771045923f, 0.6891874671f, 0.6935198903f,
+         0.6891874671f, 0.6771045923f, 0.6595746279f, 0.6393297315f,
+         0.6187070012f, 0.5903217793f, 0.5669378638f, 0.5488042235f,
+         0.5352224708f, 0.5252569914f, 0.5143862367f, 0.5081456304f,
+         0.5045977831f, 0.5025908947f, 0.5000000596f},
+        {0.5000000000f, 0.5024280548f, 0.5043093562f, 0.5076363087f,
+         0.5134918094f, 0.5237017274f, 0.5330721736f, 0.5458583832f,
+         0.5629557371f, 0.5850431919f, 0.6119084954f, 0.6314600110f,
+         0.6506775022f, 0.6673356891f, 0.6788267493f, 0.6829485893f,
+         0.6788267493f, 0.6673356891f, 0.6506775022f, 0.6314600110f,
+         0.6119084954f, 0.5850431919f, 0.5629557371f, 0.5458583832f,
+         0.5330721736f, 0.5237017274f, 0.5134918094f, 0.5076363087f,
+         0.5043093562f, 0.5024280548f, 0.5000000596f},
+        {0.5000000000f, 0.5021802783f, 0.5038703680f, 0.5068606734f,
+         0.5121284127f, 0.5213274360f, 0.5297849178f, 0.5413471460f,
+         0.5568445921f, 0.5769221783f, 0.6014210582f, 0.6192988157f,
+         0.6369072795f, 0.6521973014f, 0.6627579927f, 0.6665487289f,
+         0.6627579927f, 0.6521973014f, 0.6369072795f, 0.6192988157f,
+         0.6014210582f, 0.5769221783f, 0.5568445921f, 0.5413471460f,
+         0.5297849178f, 0.5213274360f, 0.5121284127f, 0.5068606734f,
+         0.5038703680f, 0.5021802783f, 0.5000000596f},
+        {0.5000000000f, 0.5015584826f, 0.5027679205f, 0.5049106479f,
+         0.5086937547f, 0.5153259039f, 0.5214512348f, 0.5298667550f,
+         0.5412179232f, 0.5560381413f, 0.5742831826f, 0.5877002478f,
+         0.6009937525f, 0.6125962734f, 0.6206405163f, 0.6235337853f,
+         0.6206405163f, 0.6125962138f, 0.6009937525f, 0.5877002478f,
+         0.5742831826f, 0.5560382009f, 0.5412179232f, 0.5298667550f,
+         0.5214512944f, 0.5153258443f, 0.5086938143f, 0.5049106479f,
+         0.5027679205f, 0.5015585423f, 0.5000000596f},
+        {0.5000000000f, 0.5009540319f, 0.5016952753f, 0.5030100346f,
+         0.5053365231f, 0.5094310641f, 0.5132302642f, 0.5184766650f,
+         0.5256009102f, 0.5349814296f, 0.5466461182f, 0.5553017855f,
+         0.5639393330f, 0.5715261102f, 0.5768113732f, 0.5787173510f,
+         0.5768114328f, 0.5715261102f, 0.5639393926f, 0.5553017855f,
+         0.5466461182f, 0.5349814296f, 0.5256009102f, 0.5184766650f,
+         0.5132302642f, 0.5094310641f, 0.5053365827f, 0.5030099750f,
+         0.5016952157f, 0.5009540319f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.4984676838f, 0.4972720146f, 0.4951395094f,
+         0.4913294315f, 0.4845078886f, 0.4780410528f, 0.4688831270f,
+         0.4559983313f, 0.4381728470f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4381728470f, 0.4559983313f, 0.4688831270f,
+         0.4780410528f, 0.4845078886f, 0.4913294315f, 0.4951395094f,
+         0.4972720146f, 0.4984676838f, 0.5000000000f},
+        {0.5000000000f, 0.4974217415f, 0.4954061210f, 0.4918029308f,
+         0.4853377044f, 0.4736708105f, 0.4624948800f, 0.4464591146f,
+         0.4234331250f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4234331250f, 0.4464591146f,
+         0.4624949098f, 0.4736708105f, 0.4853377044f, 0.4918029308f,
+         0.4954061210f, 0.4974217415f, 0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5019841790f, 0.5035227537f, 0.5062461495f,
+         0.5110471249f, 0.5194411278f, 0.5271694660f, 0.5377510190f,
+         0.5519614220f, 0.5704149008f, 0.5929919481f, 0.6095049381f,
+         0.6257974505f, 0.6399660110f, 0.6497628689f, 0.6532815099f,
+         0.6497628689f, 0.6399660110f, 0.6257974505f, 0.6095049381f,
+         0.5929919481f, 0.5704149008f, 0.5519614220f, 0.5377510190f,
+         0.5271694660f, 0.5194411874f, 0.5110471249f, 0.5062461495f,
+         0.5035227537f, 0.5019841790f, 0.5000000596f},
+        {0.5000000000f, 0.5018594265f, 0.5033015609f, 0.5058549047f,
+         0.5103582144f, 0.5182378888f, 0.5254992843f, 0.5354512334f,
+         0.5488330722f, 0.5662372708f, 0.5875679851f, 0.6031931639f,
+         0.6186277270f, 0.6320636868f, 0.6413608193f, 0.6447013021f,
+         0.6413608193f, 0.6320636272f, 0.6186277270f, 0.6031931639f,
+         0.5875679851f, 0.5662372708f, 0.5488330722f, 0.5354512334f,
+         0.5254992843f, 0.5182378888f, 0.5103582144f, 0.5058549047f,
+         0.5033015609f, 0.5018594265f, 0.5000000596f},
+        {0.5000000000f, 0.5016695857f, 0.5029649734f, 0.5052592754f,
+         0.5093086362f, 0.5164023638f, 0.5229487419f, 0.5319343805f,
+         0.5440405011f, 0.5598235130f, 0.5792210698f, 0.5934646130f,
+         0.6075606942f, 0.6198514104f, 0.6283663511f, 0.6314277649f,
+         0.6283663511f, 0.6198514104f, 0.6075607538f, 0.5934646130f,
+         0.5792211294f, 0.5598235130f, 0.5440405011f, 0.5319343805f,
+         0.5229486823f, 0.5164024234f, 0.5093086362f, 0.5052592754f,
+         0.5029649138f, 0.5016695857f, 0.5000000596f},
+        {0.5000000000f, 0.5011932850f, 0.5021198988f, 0.5037627220f,
+         0.5066673160f, 0.5117711425f, 0.5164980888f, 0.5230121613f,
+         0.5318337679f, 0.5434088707f, 0.5577428937f, 0.5683392882f,
+         0.5788815022f, 0.5881162286f, 0.5945363641f, 0.5968489647f,
+         0.5945363641f, 0.5881162286f, 0.5788815022f, 0.5683392882f,
+         0.5577428937f, 0.5434088707f, 0.5318337679f, 0.5230121613f,
+         0.5164980888f, 0.5117711425f, 0.5066673160f, 0.5037627220f,
+         0.5021198988f, 0.5011932850f, 0.5000000000f},
+        {0.5000000000f, 0.5007303953f, 0.5012979507f, 0.5023053885f,
+         0.5040895343f, 0.5072339773f, 0.5101568103f, 0.5142010450f,
+         0.5197073221f, 0.5269821882f, 0.5360659957f, 0.5428322554f,
+         0.5496054292f, 0.5555711985f, 0.5597361326f, 0.5612398386f,
+         0.5597361922f, 0.5555711985f, 0.5496054292f, 0.5428322554f,
+         0.5360659957f, 0.5269821286f, 0.5197073221f, 0.5142010450f,
+         0.5101568103f, 0.5072339773f, 0.5040895343f, 0.5023053885f,
+         0.5012980103f, 0.5007303953f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.4988276362f, 0.4979133904f, 0.4962842464f,
+         0.4933774769f, 0.4881869853f, 0.4832828939f, 0.4763666987f,
+         0.4666952491f, 0.4534370899f, 0.4360439777f, 0.4224200249f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4224200249f,
+         0.4360440373f, 0.4534370899f, 0.4666952491f, 0.4763666987f,
+         0.4832829535f, 0.4881869853f, 0.4933775365f, 0.4962842464f,
+         0.4979134500f, 0.4988276362f, 0.5000000000f},
+        {0.5000000000f, 0.4980278611f, 0.4964878559f, 0.4937384725f,
+         0.4888174534f, 0.4799782038f, 0.4715627432f, 0.4595820010f,
+         0.4425892234f, 0.4187846780f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4187846780f, 0.4425891936f, 0.4595820010f,
+         0.4715627432f, 0.4799782038f, 0.4888174534f, 0.4937384725f,
+         0.4964878559f, 0.4980278611f, 0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5010747910f, 0.5019095540f, 0.5033900142f,
+         0.5060086250f, 0.5106133819f, 0.5148820281f, 0.5207706094f,
+         0.5287556648f, 0.5392510295f, 0.5522742867f, 0.5619193316f,
+         0.5715291500f, 0.5799580812f, 0.5858238339f, 0.5879377723f,
+         0.5858238339f, 0.5799580812f, 0.5715291500f, 0.5619193316f,
+         0.5522742271f, 0.5392510295f, 0.5287556648f, 0.5207706094f,
+         0.5148820281f, 0.5106133819f, 0.5060086250f, 0.5033900142f,
+         0.5019095540f, 0.5010747910f, 0.5000000000f},
+        {0.5000000000f, 0.5010071397f, 0.5017895103f, 0.5031771064f,
+         0.5056321621f, 0.5099512339f, 0.5139571428f, 0.5194865465f,
+         0.5269903541f, 0.5368629098f, 0.5491278768f, 0.5582211614f,
+         0.5672890544f, 0.5752488375f, 0.5807913542f, 0.5827894807f,
+         0.5807913542f, 0.5752488375f, 0.5672890544f, 0.5582211614f,
+         0.5491278768f, 0.5368629098f, 0.5269903541f, 0.5194864869f,
+         0.5139572024f, 0.5099512339f, 0.5056321621f, 0.5031771064f,
+         0.5017895103f, 0.5010071397f, 0.5000000000f},
+        {0.5000000000f, 0.5009042621f, 0.5016067624f, 0.5028531551f,
+         0.5050591230f, 0.5089425445f, 0.5125473142f, 0.5175274611f,
+         0.5242940187f, 0.5332102180f, 0.5443075299f, 0.5525490046f,
+         0.5607786179f, 0.5680114627f, 0.5730524659f, 0.5748707652f,
+         0.5730524659f, 0.5680115223f, 0.5607786775f, 0.5525490046f,
+         0.5443075299f, 0.5332102180f, 0.5242940187f, 0.5175274611f,
+         0.5125473142f, 0.5089425445f, 0.5050590634f, 0.5028531551f,
+         0.5016067624f, 0.5009042621f, 0.5000000000f},
+        {0.5000000000f, 0.5006461143f, 0.5011484027f, 0.5020399094f,
+         0.5036193132f, 0.5064044595f, 0.5089951158f, 0.5125823617f,
+         0.5174714923f, 0.5239394307f, 0.5320289135f, 0.5380636454f,
+         0.5441119671f, 0.5494454503f, 0.5531721711f, 0.5545182824f,
+         0.5531721711f, 0.5494454503f, 0.5441119671f, 0.5380636454f,
+         0.5320289135f, 0.5239394307f, 0.5174714923f, 0.5125823617f,
+         0.5089950562f, 0.5064044595f, 0.5036192536f, 0.5020399094f,
+         0.5011484027f, 0.5006461143f, 0.5000000000f},
+        {0.5000000000f, 0.5003954172f, 0.5007029176f, 0.5012489557f,
+         0.5022173524f, 0.5039278865f, 0.5055221915f, 0.5077348351f,
+         0.5107599497f, 0.5147782564f, 0.5198295116f, 0.5236158371f,
+         0.5274257660f, 0.5307977200f, 0.5331605673f, 0.5340154171f,
+         0.5331605673f, 0.5307977200f, 0.5274257660f, 0.5236158371f,
+         0.5198295116f, 0.5147782564f, 0.5107599497f, 0.5077348351f,
+         0.5055221915f, 0.5039278865f, 0.5022173524f, 0.5012489557f,
+         0.5007029176f, 0.5003954172f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.4993658364f, 0.4988718629f, 0.4979924560f,
+         0.4964269102f, 0.4936419725f, 0.4910234213f, 0.4873520732f,
+         0.4822612107f, 0.4753669202f, 0.4664771855f, 0.4596425891f,
+         0.4526099563f, 0.4462499917f, 0.4417141378f, 0.4400566816f,
+         0.4417141378f, 0.4462499917f, 0.4526099563f, 0.4596425891f,
+         0.4664771855f, 0.4753669202f, 0.4822612107f, 0.4873520732f,
+         0.4910234213f, 0.4936419725f, 0.4964269102f, 0.4979925156f,
+         0.4988718629f, 0.4993658364f, 0.5000000000f},
+        {0.5000000000f, 0.4989336729f, 0.4981023371f, 0.4966210425f,
+         0.4939794540f, 0.4892660379f, 0.4848169982f, 0.4785499275f,
+         0.4698013365f, 0.4578387141f, 0.4422026277f, 0.4300048947f,
+         0.4172779918f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4172779918f, 0.4300048947f,
+         0.4422026277f, 0.4578386545f, 0.4698013365f, 0.4785499275f,
+         0.4848169982f, 0.4892660379f, 0.4939795136f, 0.4966210425f,
+         0.4981023371f, 0.4989336729f, 0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000596f, 0.5000000000f,
+         0.5000000000f, 0.5000000596f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.4989228845f, 0.4980831146f, 0.4965868294f,
+         0.4939183295f, 0.4891564250f, 0.4846611917f, 0.4783283472f,
+         0.4694863856f, 0.4573930204f, 0.4415802956f, 0.4292396903f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4292396903f,
+         0.4415802360f, 0.4573930204f, 0.4694863856f, 0.4783283472f,
+         0.4846611917f, 0.4891564250f, 0.4939183295f, 0.4965868294f,
+         0.4980831146f, 0.4989228845f, 0.5000000000f},
+        {0.5000000000f, 0.4989907742f, 0.4982040823f, 0.4968025982f,
+         0.4943036735f, 0.4898466468f, 0.4856418371f, 0.4797225595f,
+         0.4714670181f, 0.4601936638f, 0.4454868734f, 0.4340382218f,
+         0.4221174717f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4221174419f, 0.4340382218f,
+         0.4454868734f, 0.4601936638f, 0.4714670181f, 0.4797225595f,
+         0.4856418371f, 0.4898466468f, 0.4943036735f, 0.4968025982f,
+         0.4982040823f, 0.4989907742f, 0.5000000000f},
+        {0.5000000000f, 0.4990940988f, 0.4983880222f, 0.4971305132f,
+         0.4948891699f, 0.4908945858f, 0.4871295691f, 0.4818353653f,
+         0.4744636714f, 0.4644210041f, 0.4513638616f, 0.4412364960f,
+         0.4307287931f, 0.4211448431f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4211448431f, 0.4307287931f, 0.4412364960f,
+         0.4513638616f, 0.4644210041f, 0.4744636118f, 0.4818353653f,
+         0.4871295691f, 0.4908945858f, 0.4948891699f, 0.4971305132f,
+         0.4983880222f, 0.4990940988f, 0.5000000000f},
+        {0.5000000000f, 0.4993529916f, 0.4988490045f, 0.4979517758f,
+         0.4963543117f, 0.4935124516f, 0.4908400774f, 0.4870927036f,
+         0.4818954766f, 0.4748552144f, 0.4657738209f, 0.4587891996f,
+         0.4515995979f, 0.4450952113f, 0.4404549301f, 0.4387589991f,
+         0.4404549301f, 0.4450952113f, 0.4515995383f, 0.4587891996f,
+         0.4657738805f, 0.4748552144f, 0.4818954766f, 0.4870927334f,
+         0.4908400774f, 0.4935124516f, 0.4963543117f, 0.4979517758f,
+         0.4988490045f, 0.4993529916f, 0.5000000000f},
+        {0.5000000000f, 0.4996043146f, 0.4992960989f, 0.4987479150f,
+         0.4977727532f, 0.4960409999f, 0.4944161773f, 0.4921435714f,
+         0.4890033603f, 0.4847714305f, 0.4793508947f, 0.4752120376f,
+         0.4709798396f, 0.4671763778f, 0.4644779861f, 0.4634949565f,
+         0.4644779861f, 0.4671763778f, 0.4709798396f, 0.4752120376f,
+         0.4793508947f, 0.4847714305f, 0.4890033603f, 0.4921435714f,
+         0.4944161773f, 0.4960409999f, 0.4977727532f, 0.4987478554f,
+         0.4992960989f, 0.4996043146f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5006332994f, 0.5011256337f, 0.5019994974f,
+         0.5035477281f, 0.5062782168f, 0.5088182092f, 0.5123358369f,
+         0.5171306729f, 0.5234751701f, 0.5314123034f, 0.5373347998f,
+         0.5432717204f, 0.5485079288f, 0.5521671772f, 0.5534890294f,
+         0.5521671772f, 0.5485079288f, 0.5432717204f, 0.5373347998f,
+         0.5314123034f, 0.5234752297f, 0.5171306729f, 0.5123357773f,
+         0.5088182092f, 0.5062782168f, 0.5035477281f, 0.5019994974f,
+         0.5011256337f, 0.5006332994f, 0.5000000000f},
+        {0.5000000000f, 0.5010640621f, 0.5018905401f, 0.5033562183f,
+         0.5059488416f, 0.5105082989f, 0.5147353411f, 0.5205669403f,
+         0.5284758210f, 0.5388726592f, 0.5517760515f, 0.5613338947f,
+         0.5708581805f, 0.5792131424f, 0.5850278735f, 0.5871236324f,
+         0.5850278735f, 0.5792131424f, 0.5708581805f, 0.5613338947f,
+         0.5517760515f, 0.5388726592f, 0.5284758210f, 0.5205669403f,
+         0.5147353411f, 0.5105082989f, 0.5059488416f, 0.5033562183f,
+         0.5018904805f, 0.5010640621f, 0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.4980079234f, 0.4964522421f, 0.4936747849f,
+         0.4887031913f, 0.4797717333f, 0.4712667167f, 0.4591555893f,
+         0.4419712424f, 0.4178838134f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4178838134f, 0.4419712424f, 0.4591555893f,
+         0.4712667167f, 0.4797717333f, 0.4887031913f, 0.4936747849f,
+         0.4964522421f, 0.4980079234f, 0.5000000000f},
+        {0.5000000000f, 0.4981336296f, 0.4966765046f, 0.4940757155f,
+         0.4894226193f, 0.4810712039f, 0.4731284380f, 0.4618354440f,
+         0.4458500445f, 0.4235273004f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4235273004f, 0.4458500445f, 0.4618354440f,
+         0.4731284380f, 0.4810712039f, 0.4894225895f, 0.4940757155f,
+         0.4966765046f, 0.4981336892f, 0.5000000000f},
+        {0.5000000000f, 0.4983248413f, 0.4970174134f, 0.4946847558f,
+         0.4905147851f, 0.4830409586f, 0.4759460390f, 0.4658817351f,
+         0.4516856372f, 0.4319694936f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4319694936f, 0.4516856372f, 0.4658817351f,
+         0.4759460390f, 0.4830409586f, 0.4905147851f, 0.4946847558f,
+         0.4970174134f, 0.4983248413f, 0.5000000000f},
+        {0.5000000000f, 0.4988038540f, 0.4978710711f, 0.4962087274f,
+         0.4932425618f, 0.4879449904f, 0.4829386175f, 0.4758763313f,
+         0.4659966528f, 0.4524453282f, 0.4346525371f, 0.4207023382f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4207023382f,
+         0.4346525371f, 0.4524453282f, 0.4659966528f, 0.4758763313f,
+         0.4829386175f, 0.4879449904f, 0.4932425618f, 0.4962087274f,
+         0.4978710711f, 0.4988038540f, 0.5000000000f},
+        {0.5000000000f, 0.4992685318f, 0.4986986518f, 0.4976839423f,
+         0.4958767295f, 0.4926598668f, 0.4896325469f, 0.4853836596f,
+         0.4794833362f, 0.4714762270f, 0.4611217678f, 0.4531369507f,
+         0.4448976219f, 0.4374250174f, 0.4320826530f, 0.4301276803f,
+         0.4320826530f, 0.4374250174f, 0.4448976219f, 0.4531369507f,
+         0.4611217678f, 0.4714762270f, 0.4794833362f, 0.4853836596f,
+         0.4896325469f, 0.4926598072f, 0.4958767295f, 0.4976839423f,
+         0.4986986518f, 0.4992685318f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5011696219f, 0.5020779371f, 0.5036883950f,
+         0.5065358877f, 0.5115402937f, 0.5161759257f, 0.5225655437f,
+         0.5312208533f, 0.5425815582f, 0.5566557646f, 0.5670637488f,
+         0.5774215460f, 0.5864970684f, 0.5928076506f, 0.5950810909f,
+         0.5928076506f, 0.5864970684f, 0.5774215460f, 0.5670637488f,
+         0.5566557646f, 0.5425815582f, 0.5312208533f, 0.5225655437f,
+         0.5161759257f, 0.5115402341f, 0.5065358877f, 0.5036883950f,
+         0.5020778775f, 0.5011696219f, 0.5000000000f},
+        {0.5000000000f, 0.5019643307f, 0.5034876466f, 0.5061841011f,
+         0.5109378099f, 0.5192503333f, 0.5269047022f, 0.5373865962f,
+         0.5514660478f, 0.5697538257f, 0.5921343565f, 0.6085074544f,
+         0.6246649623f, 0.6387181878f, 0.6484364867f, 0.6519271135f,
+         0.6484364867f, 0.6387181878f, 0.6246649027f, 0.6085074544f,
+         0.5921343565f, 0.5697538257f, 0.5514660478f, 0.5373866558f,
+         0.5269047022f, 0.5192503333f, 0.5109378099f, 0.5061841011f,
+         0.5034876466f, 0.5019643903f, 0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4973956347f, 0.4953595102f, 0.4917194545f,
+         0.4851873517f, 0.4733974338f, 0.4621005356f, 0.4458855093f,
+         0.4225889444f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4225889444f, 0.4458855093f,
+         0.4621005356f, 0.4733974338f, 0.4851873517f, 0.4917194545f,
+         0.4953595102f, 0.4973956347f, 0.5000000000f},
+        {0.5000000000f, 0.4975600541f, 0.4956531823f, 0.4922452271f,
+         0.4861339033f, 0.4751173258f, 0.4645794332f, 0.4494870603f,
+         0.4278794229f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4278794229f, 0.4494870603f,
+         0.4645794332f, 0.4751173258f, 0.4861338437f, 0.4922452271f,
+         0.4956531823f, 0.4975600541f, 0.5000000000f},
+        {0.5000000000f, 0.4978101552f, 0.4960994422f, 0.4930438697f,
+         0.4875699580f, 0.4777213931f, 0.4683246017f, 0.4549102187f,
+         0.4358028471f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4358028471f, 0.4549102187f,
+         0.4683246017f, 0.4777213931f, 0.4875699580f, 0.4930438697f,
+         0.4960994422f, 0.4978101552f, 0.5000000000f},
+        {0.5000000000f, 0.4984366000f, 0.4972166717f, 0.4950406849f,
+         0.4911523461f, 0.4841892719f, 0.4775862098f, 0.4682320654f,
+         0.4550639093f, 0.4368312657f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4368312657f, 0.4550639093f, 0.4682320654f,
+         0.4775862098f, 0.4841892719f, 0.4911523461f, 0.4950406253f,
+         0.4972166717f, 0.4984366000f, 0.5000000000f},
+        {0.5000000000f, 0.4990440905f, 0.4982990324f, 0.4969717562f,
+         0.4946058393f, 0.4903875589f, 0.4864100218f, 0.4808138311f,
+         0.4730155468f, 0.4623796046f, 0.4485287368f, 0.4377669692f,
+         0.4265822172f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4265822172f, 0.4377669096f,
+         0.4485287070f, 0.4623796046f, 0.4730155468f, 0.4808138311f,
+         0.4864100218f, 0.4903876185f, 0.4946058393f, 0.4969717562f,
+         0.4982990324f, 0.4990440905f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5015276670f, 0.5027132034f, 0.5048136711f,
+         0.5085227489f, 0.5150263309f, 0.5210343599f, 0.5292906761f,
+         0.5404308438f, 0.5549815893f, 0.5729033351f, 0.5860881805f,
+         0.5991558433f, 0.6105647087f, 0.6184762716f, 0.6213221550f,
+         0.6184762716f, 0.6105646491f, 0.5991559029f, 0.5860881805f,
+         0.5729033351f, 0.5549815893f, 0.5404308438f, 0.5292906761f,
+         0.5210343599f, 0.5150263309f, 0.5085227489f, 0.5048136711f,
+         0.5027132034f, 0.5015276670f, 0.5000000596f},
+        {0.5000000000f, 0.5025650263f, 0.5045520067f, 0.5080648065f,
+         0.5142443776f, 0.5250104070f, 0.5348817706f, 0.5483376980f,
+         0.5663076639f, 0.5894870162f, 0.6176328659f, 0.6380870938f,
+         0.6581704617f, 0.6755633950f, 0.6875533462f, 0.6918526888f,
+         0.6875533462f, 0.6755633950f, 0.6581704021f, 0.6380870938f,
+         0.6176328659f, 0.5894870162f, 0.5663076639f, 0.5483376980f,
+         0.5348817110f, 0.5250104070f, 0.5142443776f, 0.5080648065f,
+         0.5045520067f, 0.5025650263f, 0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4971804321f, 0.4949752688f, 0.4910309613f,
+         0.4839466810f, 0.4711386263f, 0.4588383138f, 0.4411309958f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.0000000000f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4411309958f,
+         0.4588383138f, 0.4711386263f, 0.4839466810f, 0.4910309613f,
+         0.4949752688f, 0.4971804321f, 0.5000000000f},
+        {0.5000000000f, 0.4973585308f, 0.4952933490f, 0.4916008413f,
+         0.4849737287f, 0.4730088115f, 0.4615398645f, 0.4450696707f,
+         0.4213871956f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4213872254f, 0.4450696707f,
+         0.4615398645f, 0.4730088115f, 0.4849737287f, 0.4916008413f,
+         0.4952932894f, 0.4973585308f, 0.5000000000f},
+        {0.5000000000f, 0.4976293147f, 0.4957766831f, 0.4924663603f,
+         0.4865316749f, 0.4758392870f, 0.4656187594f, 0.4509941638f,
+         0.4300864339f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4300864339f, 0.4509941638f,
+         0.4656187594f, 0.4758392870f, 0.4865316749f, 0.4924663603f,
+         0.4957766831f, 0.4976293147f, 0.5000000000f},
+        {0.5000000000f, 0.4983075559f, 0.4969865978f, 0.4946298003f,
+         0.4904162288f, 0.4828635156f, 0.4756923914f, 0.4655179977f,
+         0.4511619806f, 0.4312142432f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4312142432f, 0.4511619806f, 0.4655179381f,
+         0.4756923914f, 0.4828635156f, 0.4904162884f, 0.4946298003f,
+         0.4969866574f, 0.4983075559f, 0.5000000000f},
+        {0.5000000000f, 0.4989652634f, 0.4981585741f, 0.4967214465f,
+         0.4941587746f, 0.4895872176f, 0.4852733612f, 0.4791988134f,
+         0.4707232416f, 0.4591425657f, 0.4440219402f, 0.4322400987f,
+         0.4199612439f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4199612439f, 0.4322400391f,
+         0.4440219402f, 0.4591425657f, 0.4707232416f, 0.4791988134f,
+         0.4852733612f, 0.4895872176f, 0.4941587746f, 0.4967214465f,
+         0.4981585741f, 0.4989652634f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5016533136f, 0.5029361248f, 0.5052082539f,
+         0.5092185736f, 0.5162448287f, 0.5227296948f, 0.5316320062f,
+         0.5436279774f, 0.5592706800f, 0.5785004497f, 0.5926237702f,
+         0.6066032648f, 0.6187940836f, 0.6272407174f, 0.6302776933f,
+         0.6272407174f, 0.6187940836f, 0.6066032648f, 0.5926238298f,
+         0.5785004497f, 0.5592706800f, 0.5436280370f, 0.5316320062f,
+         0.5227296352f, 0.5162448287f, 0.5092185736f, 0.5052082539f,
+         0.5029360652f, 0.5016533136f, 0.5000000596f},
+        {0.5000000596f, 0.5027757883f, 0.5049252510f, 0.5087236166f,
+         0.5154004693f, 0.5270181894f, 0.5376548171f, 0.5521317124f,
+         0.5714279413f, 0.5962615013f, 0.6263405681f, 0.6481539011f,
+         0.6695383787f, 0.6880338192f, 0.7007715702f, 0.7053368092f,
+         0.7007715702f, 0.6880338192f, 0.6695383191f, 0.6481539011f,
+         0.6263405681f, 0.5962615013f, 0.5714278817f, 0.5521317124f,
+         0.5376548171f, 0.5270181298f, 0.5154004097f, 0.5087236166f,
+         0.5049252510f, 0.5027757883f, 0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4973956347f, 0.4953595102f, 0.4917194545f,
+         0.4851873517f, 0.4733974338f, 0.4621005356f, 0.4458855093f,
+         0.4225889444f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4225889444f, 0.4458855093f,
+         0.4621005356f, 0.4733974338f, 0.4851873517f, 0.4917194545f,
+         0.4953595102f, 0.4973956347f, 0.5000000000f},
+        {0.5000000000f, 0.4975600541f, 0.4956531823f, 0.4922452271f,
+         0.4861339033f, 0.4751173258f, 0.4645794332f, 0.4494870603f,
+         0.4278794229f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4278794229f, 0.4494870603f,
+         0.4645794332f, 0.4751173258f, 0.4861338437f, 0.4922452271f,
+         0.4956531823f, 0.4975600541f, 0.5000000000f},
+        {0.5000000000f, 0.4978101552f, 0.4960994422f, 0.4930438697f,
+         0.4875699580f, 0.4777213931f, 0.4683246017f, 0.4549102187f,
+         0.4358028471f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4358028471f, 0.4549102187f,
+         0.4683246017f, 0.4777213931f, 0.4875699580f, 0.4930438697f,
+         0.4960994422f, 0.4978101552f, 0.5000000000f},
+        {0.5000000000f, 0.4984366000f, 0.4972166717f, 0.4950406849f,
+         0.4911523461f, 0.4841892719f, 0.4775862098f, 0.4682320654f,
+         0.4550639093f, 0.4368312657f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4368312657f, 0.4550639093f, 0.4682320654f,
+         0.4775862098f, 0.4841892719f, 0.4911523461f, 0.4950406253f,
+         0.4972166717f, 0.4984366000f, 0.5000000000f},
+        {0.5000000000f, 0.4990440905f, 0.4982990324f, 0.4969717562f,
+         0.4946058393f, 0.4903875589f, 0.4864100218f, 0.4808138311f,
+         0.4730155468f, 0.4623796046f, 0.4485287368f, 0.4377669692f,
+         0.4265822172f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4265822172f, 0.4377669096f,
+         0.4485287070f, 0.4623796046f, 0.4730155468f, 0.4808138311f,
+         0.4864100218f, 0.4903876185f, 0.4946058393f, 0.4969717562f,
+         0.4982990324f, 0.4990440905f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5015276670f, 0.5027132034f, 0.5048136711f,
+         0.5085227489f, 0.5150263309f, 0.5210343599f, 0.5292906761f,
+         0.5404308438f, 0.5549815893f, 0.5729033351f, 0.5860881805f,
+         0.5991558433f, 0.6105647087f, 0.6184762716f, 0.6213221550f,
+         0.6184762716f, 0.6105646491f, 0.5991559029f, 0.5860881805f,
+         0.5729033351f, 0.5549815893f, 0.5404308438f, 0.5292906761f,
+         0.5210343599f, 0.5150263309f, 0.5085227489f, 0.5048136711f,
+         0.5027132034f, 0.5015276670f, 0.5000000596f},
+        {0.5000000000f, 0.5025650263f, 0.5045520067f, 0.5080648065f,
+         0.5142443776f, 0.5250104070f, 0.5348817706f, 0.5483376980f,
+         0.5663076639f, 0.5894870162f, 0.6176328659f, 0.6380870938f,
+         0.6581704617f, 0.6755633950f, 0.6875533462f, 0.6918526888f,
+         0.6875533462f, 0.6755633950f, 0.6581704021f, 0.6380870938f,
+         0.6176328659f, 0.5894870162f, 0.5663076639f, 0.5483376980f,
+         0.5348817110f, 0.5250104070f, 0.5142443776f, 0.5080648065f,
+         0.5045520067f, 0.5025650263f, 0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4980079234f, 0.4964522421f, 0.4936747849f,
+         0.4887031913f, 0.4797717333f, 0.4712667167f, 0.4591555893f,
+         0.4419712424f, 0.4178837836f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4178837836f, 0.4419712424f, 0.4591555893f,
+         0.4712667167f, 0.4797717333f, 0.4887031913f, 0.4936747849f,
+         0.4964522421f, 0.4980079234f, 0.5000000000f},
+        {0.5000000000f, 0.4981336296f, 0.4966765046f, 0.4940757155f,
+         0.4894226193f, 0.4810712039f, 0.4731284380f, 0.4618354440f,
+         0.4458500445f, 0.4235272706f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4235273004f, 0.4458500445f, 0.4618354440f,
+         0.4731284380f, 0.4810712039f, 0.4894225895f, 0.4940757155f,
+         0.4966765046f, 0.4981336892f, 0.5000000000f},
+        {0.5000000000f, 0.4983248413f, 0.4970174134f, 0.4946847558f,
+         0.4905147851f, 0.4830409586f, 0.4759460390f, 0.4658817351f,
+         0.4516856372f, 0.4319694936f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4319694936f, 0.4516856372f, 0.4658817351f,
+         0.4759460390f, 0.4830409586f, 0.4905147851f, 0.4946847558f,
+         0.4970174134f, 0.4983248413f, 0.5000000000f},
+        {0.5000000000f, 0.4988038540f, 0.4978710711f, 0.4962087274f,
+         0.4932425618f, 0.4879449904f, 0.4829386175f, 0.4758763313f,
+         0.4659966528f, 0.4524453282f, 0.4346525073f, 0.4207023382f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4207023382f,
+         0.4346525371f, 0.4524452984f, 0.4659966528f, 0.4758763313f,
+         0.4829386175f, 0.4879449904f, 0.4932425618f, 0.4962087274f,
+         0.4978710711f, 0.4988038540f, 0.5000000000f},
+        {0.5000000000f, 0.4992685318f, 0.4986986518f, 0.4976839423f,
+         0.4958767295f, 0.4926598668f, 0.4896325469f, 0.4853836596f,
+         0.4794833362f, 0.4714761972f, 0.4611217678f, 0.4531369507f,
+         0.4448976219f, 0.4374250174f, 0.4320826530f, 0.4301276803f,
+         0.4320826530f, 0.4374250174f, 0.4448976219f, 0.4531369507f,
+         0.4611217678f, 0.4714761972f, 0.4794833362f, 0.4853836596f,
+         0.4896325469f, 0.4926598072f, 0.4958767295f, 0.4976839423f,
+         0.4986986518f, 0.4992685318f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5011696219f, 0.5020779371f, 0.5036883950f,
+         0.5065358877f, 0.5115402937f, 0.5161759257f, 0.5225655437f,
+         0.5312208533f, 0.5425816178f, 0.5566557646f, 0.5670638084f,
+         0.5774215460f, 0.5864970684f, 0.5928076506f, 0.5950810909f,
+         0.5928076506f, 0.5864970684f, 0.5774215460f, 0.5670638084f,
+         0.5566557646f, 0.5425815582f, 0.5312208533f, 0.5225655437f,
+         0.5161759257f, 0.5115402341f, 0.5065358877f, 0.5036883950f,
+         0.5020778775f, 0.5011696219f, 0.5000000000f},
+        {0.5000000000f, 0.5019643307f, 0.5034876466f, 0.5061841011f,
+         0.5109378099f, 0.5192503333f, 0.5269047022f, 0.5373866558f,
+         0.5514660478f, 0.5697538257f, 0.5921343565f, 0.6085074544f,
+         0.6246649623f, 0.6387182474f, 0.6484364867f, 0.6519271135f,
+         0.6484364867f, 0.6387182474f, 0.6246649623f, 0.6085074544f,
+         0.5921343565f, 0.5697538257f, 0.5514660478f, 0.5373866558f,
+         0.5269047022f, 0.5192503333f, 0.5109378099f, 0.5061841011f,
+         0.5034876466f, 0.5019643903f, 0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4989228845f, 0.4980831146f, 0.4965868294f,
+         0.4939183295f, 0.4891564250f, 0.4846611917f, 0.4783283472f,
+         0.4694863856f, 0.4573929608f, 0.4415802360f, 0.4292396307f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4292396307f,
+         0.4415802360f, 0.4573929608f, 0.4694863856f, 0.4783283472f,
+         0.4846611917f, 0.4891563654f, 0.4939182699f, 0.4965868294f,
+         0.4980831146f, 0.4989228845f, 0.5000000000f},
+        {0.5000000000f, 0.4989907742f, 0.4982040823f, 0.4968025982f,
+         0.4943036735f, 0.4898466468f, 0.4856418371f, 0.4797225595f,
+         0.4714670181f, 0.4601936638f, 0.4454868436f, 0.4340381622f,
+         0.4221174419f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4221173823f, 0.4340381622f,
+         0.4454868436f, 0.4601936638f, 0.4714670181f, 0.4797225595f,
+         0.4856418371f, 0.4898466468f, 0.4943036735f, 0.4968025386f,
+         0.4982040823f, 0.4989907742f, 0.5000000000f},
+        {0.5000000000f, 0.4990940988f, 0.4983880222f, 0.4971305132f,
+         0.4948891699f, 0.4908945858f, 0.4871295691f, 0.4818353653f,
+         0.4744636118f, 0.4644210041f, 0.4513638020f, 0.4412364364f,
+         0.4307287931f, 0.4211447835f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4211447835f, 0.4307287633f, 0.4412364364f,
+         0.4513638616f, 0.4644210041f, 0.4744636118f, 0.4818353653f,
+         0.4871295691f, 0.4908945858f, 0.4948891699f, 0.4971305132f,
+         0.4983880222f, 0.4990940988f, 0.5000000000f},
+        {0.5000000000f, 0.4993529916f, 0.4988489449f, 0.4979517758f,
+         0.4963543117f, 0.4935124516f, 0.4908400774f, 0.4870927036f,
+         0.4818954766f, 0.4748552144f, 0.4657738209f, 0.4587891996f,
+         0.4515995383f, 0.4450951517f, 0.4404549301f, 0.4387589693f,
+         0.4404549301f, 0.4450951517f, 0.4515995383f, 0.4587891996f,
+         0.4657738209f, 0.4748552144f, 0.4818954766f, 0.4870927036f,
+         0.4908400774f, 0.4935124516f, 0.4963543117f, 0.4979517758f,
+         0.4988490045f, 0.4993529916f, 0.5000000000f},
+        {0.5000000000f, 0.4996043146f, 0.4992960989f, 0.4987479150f,
+         0.4977727532f, 0.4960409999f, 0.4944161773f, 0.4921435714f,
+         0.4890033603f, 0.4847714305f, 0.4793508947f, 0.4752120376f,
+         0.4709798396f, 0.4671763778f, 0.4644779861f, 0.4634948969f,
+         0.4644779861f, 0.4671763778f, 0.4709798396f, 0.4752120376f,
+         0.4793508947f, 0.4847714305f, 0.4890033603f, 0.4921435714f,
+         0.4944161773f, 0.4960409999f, 0.4977727532f, 0.4987478554f,
+         0.4992960989f, 0.4996043146f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5006332994f, 0.5011256337f, 0.5019994974f,
+         0.5035477281f, 0.5062782168f, 0.5088182092f, 0.5123358369f,
+         0.5171306729f, 0.5234752297f, 0.5314123034f, 0.5373347998f,
+         0.5432717800f, 0.5485079288f, 0.5521671772f, 0.5534890294f,
+         0.5521672368f, 0.5485079288f, 0.5432717800f, 0.5373347998f,
+         0.5314123631f, 0.5234752297f, 0.5171306729f, 0.5123357773f,
+         0.5088182092f, 0.5062782168f, 0.5035477281f, 0.5019994974f,
+         0.5011256337f, 0.5006333590f, 0.5000000000f},
+        {0.5000000000f, 0.5010640621f, 0.5018905401f, 0.5033562183f,
+         0.5059488416f, 0.5105082989f, 0.5147353411f, 0.5205669403f,
+         0.5284758806f, 0.5388726592f, 0.5517760515f, 0.5613339543f,
+         0.5708582401f, 0.5792131424f, 0.5850278735f, 0.5871236920f,
+         0.5850278735f, 0.5792131424f, 0.5708582401f, 0.5613339543f,
+         0.5517760515f, 0.5388726592f, 0.5284758210f, 0.5205669403f,
+         0.5147353411f, 0.5105083585f, 0.5059489012f, 0.5033562183f,
+         0.5018904805f, 0.5010640621f, 0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5010747910f, 0.5019095540f, 0.5033900142f,
+         0.5060086250f, 0.5106133819f, 0.5148820281f, 0.5207706094f,
+         0.5287556648f, 0.5392510295f, 0.5522742867f, 0.5619193316f,
+         0.5715291500f, 0.5799580812f, 0.5858238339f, 0.5879378319f,
+         0.5858238339f, 0.5799580812f, 0.5715291500f, 0.5619193316f,
+         0.5522742867f, 0.5392510295f, 0.5287556648f, 0.5207706094f,
+         0.5148820281f, 0.5106133819f, 0.5060086250f, 0.5033900142f,
+         0.5019095540f, 0.5010747910f, 0.5000000000f},
+        {0.5000000000f, 0.5010071397f, 0.5017895103f, 0.5031771064f,
+         0.5056321621f, 0.5099512339f, 0.5139572024f, 0.5194865465f,
+         0.5269903541f, 0.5368629098f, 0.5491278768f, 0.5582211614f,
+         0.5672890544f, 0.5752488375f, 0.5807913542f, 0.5827894807f,
+         0.5807913542f, 0.5752488375f, 0.5672890544f, 0.5582211614f,
+         0.5491278768f, 0.5368629694f, 0.5269903541f, 0.5194864869f,
+         0.5139572024f, 0.5099512339f, 0.5056321621f, 0.5031771660f,
+         0.5017895103f, 0.5010071397f, 0.5000000000f},
+        {0.5000000000f, 0.5009042621f, 0.5016067624f, 0.5028531551f,
+         0.5050591230f, 0.5089425445f, 0.5125473738f, 0.5175274611f,
+         0.5242940784f, 0.5332102180f, 0.5443075895f, 0.5525490046f,
+         0.5607786775f, 0.5680115223f, 0.5730525255f, 0.5748708248f,
+         0.5730525255f, 0.5680115223f, 0.5607786775f, 0.5525490046f,
+         0.5443075895f, 0.5332102180f, 0.5242940187f, 0.5175274611f,
+         0.5125473142f, 0.5089425445f, 0.5050591230f, 0.5028531551f,
+         0.5016067624f, 0.5009042621f, 0.5000000000f},
+        {0.5000000000f, 0.5006461143f, 0.5011484027f, 0.5020399094f,
+         0.5036193132f, 0.5064044595f, 0.5089951158f, 0.5125823617f,
+         0.5174714923f, 0.5239394307f, 0.5320289135f, 0.5380636454f,
+         0.5441119671f, 0.5494454503f, 0.5531721711f, 0.5545183420f,
+         0.5531721711f, 0.5494454503f, 0.5441119671f, 0.5380636454f,
+         0.5320289135f, 0.5239394307f, 0.5174714923f, 0.5125823617f,
+         0.5089950562f, 0.5064044595f, 0.5036192536f, 0.5020399094f,
+         0.5011484027f, 0.5006461143f, 0.5000000000f},
+        {0.5000000000f, 0.5003954172f, 0.5007029176f, 0.5012489557f,
+         0.5022173524f, 0.5039278865f, 0.5055221915f, 0.5077348351f,
+         0.5107599497f, 0.5147782564f, 0.5198295116f, 0.5236158371f,
+         0.5274258256f, 0.5307977200f, 0.5331605673f, 0.5340154171f,
+         0.5331605673f, 0.5307977200f, 0.5274258256f, 0.5236158371f,
+         0.5198295116f, 0.5147782564f, 0.5107599497f, 0.5077348351f,
+         0.5055221915f, 0.5039278865f, 0.5022173524f, 0.5012489557f,
+         0.5007029176f, 0.5003954172f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.4993658364f, 0.4988718629f, 0.4979924560f,
+         0.4964269102f, 0.4936419725f, 0.4910234213f, 0.4873520732f,
+         0.4822612107f, 0.4753669202f, 0.4664771259f, 0.4596425593f,
+         0.4526099563f, 0.4462499917f, 0.4417140782f, 0.4400566518f,
+         0.4417141378f, 0.4462499917f, 0.4526099563f, 0.4596425593f,
+         0.4664771259f, 0.4753669202f, 0.4822612107f, 0.4873520732f,
+         0.4910234213f, 0.4936419725f, 0.4964269102f, 0.4979925156f,
+         0.4988718629f, 0.4993658364f, 0.5000000000f},
+        {0.5000000000f, 0.4989336729f, 0.4981023371f, 0.4966210425f,
+         0.4939794540f, 0.4892660379f, 0.4848169982f, 0.4785499275f,
+         0.4698013365f, 0.4578386545f, 0.4422026277f, 0.4300048649f,
+         0.4172779620f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4172779620f, 0.4300048649f,
+         0.4422026277f, 0.4578386545f, 0.4698013365f, 0.4785499275f,
+         0.4848169982f, 0.4892660379f, 0.4939795136f, 0.4966210425f,
+         0.4981023371f, 0.4989336729f, 0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5019841790f, 0.5035227537f, 0.5062461495f,
+         0.5110471249f, 0.5194411278f, 0.5271694660f, 0.5377510190f,
+         0.5519614220f, 0.5704149008f, 0.5929919481f, 0.6095048785f,
+         0.6257974505f, 0.6399660110f, 0.6497628093f, 0.6532814503f,
+         0.6497628689f, 0.6399659514f, 0.6257974505f, 0.6095049381f,
+         0.5929919481f, 0.5704149008f, 0.5519614220f, 0.5377510190f,
+         0.5271694660f, 0.5194411278f, 0.5110471249f, 0.5062461495f,
+         0.5035227537f, 0.5019841790f, 0.5000000596f},
+        {0.5000000000f, 0.5018594265f, 0.5033015609f, 0.5058549047f,
+         0.5103582144f, 0.5182378888f, 0.5254992843f, 0.5354512334f,
+         0.5488330722f, 0.5662372708f, 0.5875679851f, 0.6031931639f,
+         0.6186277270f, 0.6320636272f, 0.6413608193f, 0.6447013021f,
+         0.6413607597f, 0.6320636272f, 0.6186277270f, 0.6031931639f,
+         0.5875679851f, 0.5662372708f, 0.5488330722f, 0.5354512334f,
+         0.5254992843f, 0.5182378888f, 0.5103582144f, 0.5058549047f,
+         0.5033015609f, 0.5018594265f, 0.5000000596f},
+        {0.5000000000f, 0.5016695857f, 0.5029649734f, 0.5052592754f,
+         0.5093086362f, 0.5164023638f, 0.5229486823f, 0.5319343805f,
+         0.5440405011f, 0.5598235130f, 0.5792210698f, 0.5934645534f,
+         0.6075606942f, 0.6198513508f, 0.6283662915f, 0.6314277649f,
+         0.6283662915f, 0.6198513508f, 0.6075606942f, 0.5934646130f,
+         0.5792211294f, 0.5598235130f, 0.5440405011f, 0.5319343805f,
+         0.5229486823f, 0.5164023638f, 0.5093086362f, 0.5052592754f,
+         0.5029649138f, 0.5016695857f, 0.5000000596f},
+        {0.5000000000f, 0.5011932850f, 0.5021198988f, 0.5037627220f,
+         0.5066673160f, 0.5117711425f, 0.5164980888f, 0.5230121613f,
+         0.5318337679f, 0.5434088707f, 0.5577428937f, 0.5683392882f,
+         0.5788815022f, 0.5881162286f, 0.5945363641f, 0.5968489647f,
+         0.5945363045f, 0.5881162286f, 0.5788815022f, 0.5683392882f,
+         0.5577428937f, 0.5434088707f, 0.5318337679f, 0.5230121613f,
+         0.5164980888f, 0.5117711425f, 0.5066673160f, 0.5037627220f,
+         0.5021198392f, 0.5011932850f, 0.5000000000f},
+        {0.5000000000f, 0.5007303953f, 0.5012979507f, 0.5023053885f,
+         0.5040895343f, 0.5072339177f, 0.5101568103f, 0.5142010450f,
+         0.5197073221f, 0.5269821882f, 0.5360659957f, 0.5428322554f,
+         0.5496053696f, 0.5555711985f, 0.5597361326f, 0.5612398386f,
+         0.5597361326f, 0.5555711985f, 0.5496053696f, 0.5428322554f,
+         0.5360659957f, 0.5269821286f, 0.5197073221f, 0.5142010450f,
+         0.5101568103f, 0.5072339773f, 0.5040895343f, 0.5023053885f,
+         0.5012980103f, 0.5007303953f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.4988276362f, 0.4979133904f, 0.4962842464f,
+         0.4933774769f, 0.4881869853f, 0.4832829535f, 0.4763666987f,
+         0.4666952491f, 0.4534371495f, 0.4360439777f, 0.4224200845f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4224200845f,
+         0.4360440373f, 0.4534371495f, 0.4666952491f, 0.4763666987f,
+         0.4832829535f, 0.4881869853f, 0.4933775365f, 0.4962842464f,
+         0.4979134500f, 0.4988276362f, 0.5000000000f},
+        {0.5000000000f, 0.4980278611f, 0.4964878559f, 0.4937384725f,
+         0.4888174534f, 0.4799782038f, 0.4715627432f, 0.4595820010f,
+         0.4425892234f, 0.4187846780f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4187846780f, 0.4425892234f, 0.4595820010f,
+         0.4715627432f, 0.4799782038f, 0.4888175130f, 0.4937384725f,
+         0.4964878559f, 0.4980278611f, 0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5025908947f, 0.5045977831f, 0.5081456304f,
+         0.5143862367f, 0.5252569914f, 0.5352224708f, 0.5488042235f,
+         0.5669378638f, 0.5903217196f, 0.6187070012f, 0.6393297315f,
+         0.6595746279f, 0.6771045923f, 0.6891874671f, 0.6935199499f,
+         0.6891874671f, 0.6771046519f, 0.6595746279f, 0.6393297315f,
+         0.6187070012f, 0.5903217793f, 0.5669378638f, 0.5488042235f,
+         0.5352224708f, 0.5252569914f, 0.5143862367f, 0.5081456304f,
+         0.5045977831f, 0.5025908947f, 0.5000000596f},
+        {0.5000000000f, 0.5024280548f, 0.5043093562f, 0.5076363087f,
+         0.5134918094f, 0.5237017274f, 0.5330721736f, 0.5458583832f,
+         0.5629557371f, 0.5850431919f, 0.6119084954f, 0.6314600110f,
+         0.6506775022f, 0.6673357487f, 0.6788267493f, 0.6829485893f,
+         0.6788267493f, 0.6673356891f, 0.6506775618f, 0.6314600110f,
+         0.6119084954f, 0.5850431919f, 0.5629557967f, 0.5458583832f,
+         0.5330721736f, 0.5237017274f, 0.5134918094f, 0.5076363087f,
+         0.5043093562f, 0.5024280548f, 0.5000000596f},
+        {0.5000000000f, 0.5021802783f, 0.5038703680f, 0.5068606734f,
+         0.5121284127f, 0.5213274360f, 0.5297849178f, 0.5413471460f,
+         0.5568445921f, 0.5769221783f, 0.6014210582f, 0.6192988753f,
+         0.6369072795f, 0.6521973014f, 0.6627579927f, 0.6665487289f,
+         0.6627580523f, 0.6521973014f, 0.6369072795f, 0.6192988753f,
+         0.6014210582f, 0.5769221783f, 0.5568445921f, 0.5413471460f,
+         0.5297849178f, 0.5213274360f, 0.5121284127f, 0.5068606734f,
+         0.5038703680f, 0.5021802783f, 0.5000000596f},
+        {0.5000000000f, 0.5015584826f, 0.5027679205f, 0.5049106479f,
+         0.5086937547f, 0.5153259039f, 0.5214512348f, 0.5298667550f,
+         0.5412179232f, 0.5560381413f, 0.5742831826f, 0.5877002478f,
+         0.6009937525f, 0.6125962734f, 0.6206405163f, 0.6235337853f,
+         0.6206405163f, 0.6125962138f, 0.6009937525f, 0.5877002478f,
+         0.5742831826f, 0.5560382009f, 0.5412179232f, 0.5298667550f,
+         0.5214512944f, 0.5153258443f, 0.5086938143f, 0.5049106479f,
+         0.5027679205f, 0.5015585423f, 0.5000000596f},
+        {0.5000000000f, 0.5009540319f, 0.5016952753f, 0.5030100346f,
+         0.5053365231f, 0.5094310641f, 0.5132302642f, 0.5184766650f,
+         0.5256009102f, 0.5349814296f, 0.5466461182f, 0.5553017855f,
+         0.5639393926f, 0.5715261102f, 0.5768113732f, 0.5787173510f,
+         0.5768114328f, 0.5715261102f, 0.5639393926f, 0.5553017855f,
+         0.5466461182f, 0.5349814296f, 0.5256009102f, 0.5184766650f,
+         0.5132302642f, 0.5094310641f, 0.5053365827f, 0.5030099750f,
+         0.5016952157f, 0.5009540319f, 0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f},
+        {0.5000000000f, 0.4984676838f, 0.4972720146f, 0.4951395094f,
+         0.4913294315f, 0.4845078886f, 0.4780410528f, 0.4688831270f,
+         0.4559983313f, 0.4381728470f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4381728172f, 0.4559983313f, 0.4688831270f,
+         0.4780410528f, 0.4845078886f, 0.4913294315f, 0.4951395094f,
+         0.4972720146f, 0.4984676838f, 0.5000000000f},
+        {0.5000000000f, 0.4974217415f, 0.4954061210f, 0.4918029308f,
+         0.4853377044f, 0.4736708105f, 0.4624948800f, 0.4464591146f,
+         0.4234331250f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4234331250f, 0.4464591146f,
+         0.4624948800f, 0.4736708105f, 0.4853377044f, 0.4918029308f,
+         0.4954061210f, 0.4974217415f, 0.5000000000f}}};
 
 const WORD32 ixheaacd_atan_table_Q28[16][8][31] = {
     {
@@ -4546,384 +5833,307 @@
          -3},
     }};
 
-const WORD32 ixheaacd_c_l_table_Q31[31] = {
-    68,         12075997,   21473763,   38182223,   67875466,   120571390,
-    170045077,  239449100,  336157459,  469148859,  647490682,  794298694,
-    962206904,  1145934076, 1335698887, 1518500250, 1681545272, 1816183116,
-    1919855175, 1995188112, 2047545319, 2095610977, 2121010179, 2134092347,
-    2140740687, 2144096210, 2146410711, 2147144182, 2147376282, 2147449694,
-    2147483647};
+const FLOAT32 ixheaacd_c_l_table[31] = {
+    0.0000000317f, 0.0056233243f, 0.0099995006f, 0.0177799836f, 0.0316069759f,
+    0.0561454296f, 0.0791834071f, 0.1115021780f, 0.1565355211f, 0.2184644639f,
+    0.3015113473f, 0.3698741496f, 0.4480625093f, 0.5336171389f, 0.6219832897f,
+    0.7071067691f, 0.7830305099f, 0.8457261920f, 0.8940022588f, 0.9290818572f,
+    0.9534626007f, 0.9758449197f, 0.9876723289f, 0.9937641621f, 0.9968600869f,
+    0.9984226227f, 0.9995003939f, 0.9998419285f, 0.9999499917f, 0.9999842048f,
+    1.0000000000f};
 
-const WORD32 ixheaacd_sin_table_Q31[8][31] = {
-    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-    {750179061, 746245580, 743210706, 737870331, 728548620, 712505595,
-     697979429, 678386783, 652421439, 618809885, 576615606, 543587743,
-     506876195, 466993926, 424737371, 381140538, 337380886, 294653248,
-     254039878, 216406178, 182341865, 138534277, 103401830, 76116249,
-     55442477,  40067134,  23038730,  13121396,  7432107,   4196447,
-     24},
-    {1161262961, 1155790434, 1151559607, 1144096867, 1131016382, 1108345689,
-     1087649071, 1059486043, 1021740286, 972201548,  909011376,  858841310,
-     802424715,  740453756,  674139243,  605156167,  535487835,  467194735,
-     402165023,  341910884,  287454637,  217648816,  161934922,  118876289,
-     86395037,   62326858,   35765878,   20345239,   11515596,   6499487,
-     37},
-    {1716503346, 1710705303, 1706196326, 1698186767, 1683975371, 1658827737,
-     1635302807, 1602433676, 1556860619, 1494490287, 1410930784, 1341611885,
-     1260794215, 1168902519, 1067487796, 959278806,  847935697,  737527629,
-     631893965,  534105311,  446175490,  334574700,  246745780,  179796016,
-     129896719,  93282739,   53251977,   30198506,   17061963,   9620003,
-     54},
-    {1997091453, 1992944085, 1989690856, 1983852214, 1973306896, 1954076825,
-     1935447004, 1908416859, 1869093029, 1812001456, 1730062329, 1657802892,
-     1569207783, 1463537141, 1341868672, 1207527592, 1065884173, 923429508,
-     786466908,  659983219,  547093745,  405656596,  296231282,  214127893,
-     153738020,  109885815,  62401443,   35278435,   19896909,   11207148,
-     63},
-    {2147483647, 2147449694, 2147376282, 2147144182, 2146410711, 2144096210,
-     2140740687, 2134092347, 2121010179, 2095610977, 2047545319, 1995188112,
-     1919855175, 1816183116, 1681545272, 1518500250, 1335698887, 1145934076,
-     962206904,  794298694,  647490682,  469148859,  336157459,  239449100,
-     170045077,  120571390,  67875466,   38182223,   21473763,   12075997,
-     68},
-    {1735452507, 1741201627, 1745677174, 1753637197, 1767790913, 1792923770,
-     1816518097, 1849561983, 1895318984, 1957003931, 2034703322, 2089967744,
-     2134916861, 2144595142, 2081353083, 1914153740, 1653277521, 1353148056,
-     1069993076, 832031145,  643429686,  438118607,  300387816,  207524268,
-     144291161,  100823513,  55902457,   31184569,   17456772,   9791496,
-     55},
-    {302939858, 304635714, 305968630,  308367663,  312727041, 320788003,
-     328771547, 340741324, 359192238,  388879484,  440075553, 497870534,
-     595446097, 785304289, 1255861595, 2142108211, 997566324, 495493509,
-     298429982, 198205829, 139164109,  87059272,   56928133,  38231805,
-     26115252,  18039235,  9889297,    5483639,    3059686,   1713093,
-     10}};
+const FLOAT32 ixheaacd_sin_table[8][31] = {
+    {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f},
+    {0.3493293524f, 0.3474976718f, 0.3460844457f, 0.3435976505f, 0.3392568827f,
+     0.3317862749f, 0.3250220120f, 0.3158984482f, 0.3038074076f, 0.2881557941f,
+     0.2685075700f, 0.2531277537f, 0.2360326201f, 0.2174609900f, 0.1977837533f,
+     0.1774823964f, 0.1571052223f, 0.1372086108f, 0.1182965338f, 0.1007719785f,
+     0.0849095508f, 0.0645100474f, 0.0481502302f, 0.0354443900f, 0.0258174147f,
+     0.0186577141f, 0.0107282447f, 0.0061101262f, 0.0034608445f, 0.0019541229f,
+     0.0000000112f},
+    {0.5407552123f, 0.5382068753f, 0.5362367034f, 0.5327616334f, 0.5266705155f,
+     0.5161136985f, 0.5064760447f, 0.4933616221f, 0.4757848978f, 0.4527166188f,
+     0.4232914150f, 0.3999291360f, 0.3736581206f, 0.3448006511f, 0.3139205575f,
+     0.2817977965f, 0.2493559569f, 0.2175544947f, 0.1872726828f, 0.1592146605f,
+     0.1338564903f, 0.1013506278f, 0.0754068270f, 0.0553560853f, 0.0402308255f,
+     0.0290232040f, 0.0166547857f, 0.0094739906f, 0.0053623673f, 0.0030265595f,
+     0.0000000172f},
+    {0.7993091345f, 0.7966092229f, 0.7945095897f, 0.7907798290f, 0.7841621637f,
+     0.7724518776f, 0.7614971995f, 0.7461913228f, 0.7249697447f, 0.6959262490f,
+     0.6570158601f, 0.6247367263f, 0.5871030688f, 0.5443126559f, 0.4970877469f,
+     0.4466989934f, 0.3948508203f, 0.3434380591f, 0.2942485511f, 0.2487121671f,
+     0.2077666521f, 0.1557984799f, 0.1148999557f, 0.0837240443f, 0.0604878739f,
+     0.0434381589f, 0.0247973837f, 0.0140622752f, 0.0079450961f, 0.0044796630f,
+     0.0000000251f},
+    {0.9299681783f, 0.9280369282f, 0.9265220165f, 0.9238031507f, 0.9188926220f,
+     0.9099379182f, 0.9012627602f, 0.8886758685f, 0.8703642488f, 0.8437789083f,
+     0.8056230545f, 0.7719746232f, 0.7307193279f, 0.6815125942f, 0.6248562932f,
+     0.5622988343f, 0.4963409901f, 0.4300053716f, 0.3662271798f, 0.3073286414f,
+     0.2547603846f, 0.1888985783f, 0.1379434466f, 0.0997110680f, 0.0715898424f,
+     0.0511695705f, 0.0290579367f, 0.0164278019f, 0.0092652198f, 0.0052187350f,
+     0.0000000293f},
+    {1.0000000000f, 0.9999842048f, 0.9999499917f, 0.9998419285f, 0.9995003939f,
+     0.9984226227f, 0.9968600869f, 0.9937641621f, 0.9876723289f, 0.9758449197f,
+     0.9534626007f, 0.9290818572f, 0.8940022588f, 0.8457261920f, 0.7830305099f,
+     0.7071067691f, 0.6219832897f, 0.5336171389f, 0.4480625093f, 0.3698741496f,
+     0.3015113473f, 0.2184644639f, 0.1565355211f, 0.1115021780f, 0.0791834071f,
+     0.0561454296f, 0.0316069759f, 0.0177799836f, 0.0099995006f, 0.0056233243f,
+     0.0000000317f},
+    {0.8081330657f, 0.8108102083f, 0.8128942847f, 0.8166009784f, 0.8231918216f,
+     0.8348951936f, 0.8458821774f, 0.8612694144f, 0.8825767040f, 0.9113009572f,
+     0.9474825859f, 0.9732170701f, 0.9941481352f, 0.9986549616f, 0.9692055583f,
+     0.8913472891f, 0.7698673606f, 0.6301086545f, 0.4982543588f, 0.3874447048f,
+     0.2996203005f, 0.2040148675f, 0.1398789734f, 0.0966360196f, 0.0671908110f,
+     0.0469496064f, 0.0260316096f, 0.0145214461f, 0.0081289429f, 0.0045595206f,
+     0.0000000256f},
+    {0.1410673708f, 0.1418570578f, 0.1424777508f, 0.1435948759f, 0.1456248760f,
+     0.1493785530f, 0.1530961841f, 0.1586700380f, 0.1672619134f, 0.1810861230f,
+     0.2049261481f, 0.2318390310f, 0.2772761881f, 0.3656858206f, 0.5848061442f,
+     0.9974968433f, 0.4645280242f, 0.2307321429f, 0.1389672905f, 0.0922967792f,
+     0.0648033395f, 0.0405401327f, 0.0265092272f, 0.0178030711f, 0.0121608619f,
+     0.0084001739f, 0.0046050628f, 0.0025535184f, 0.0014247773f, 0.0007977211f,
+     0.0000000047f}};
 
-const WORD32 ixheaacd_cos_table_Q31[8][31] = {
-    {2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647},
-    {2012192186, 2013654279, 2014776381, 2016738305, 2020124483, 2025838542,
-     2030889149, 2037517458, 2045979541, 2056394987, 2068622842, 2077546241,
-     2086806781, 2096092243, 2105061563, 2113390146, 2120815918, 2127173120,
-     2132404689, 2136551985, 2139728362, 2143010563, 2144992793, 2146134277,
-     2146767838, 2147109835, 2147360062, 2147443561, 2147470787, 2147479548,
-     2147483647},
-    {1806420315, 1809926653, 1812621442, 1817341018, 1825510329, 1839362893,
-     1851676407, 1867933442, 1888844304, 1914813351, 1945606419, 1968267671,
-     1991933883, 2015791223, 2038926752, 2060454327, 2079648720, 2096047494,
-     2109490297, 2120090320, 2128157854, 2136425756, 2141369445, 2144190861,
-     2145745072, 2146578995, 2147185791, 2147387271, 2147452772, 2147473812,
-     2147483647},
-    {1290465917, 1298142282, 1304062927, 1314476217, 1332633846, 1363809575,
-     1391930582, 1429647625, 1479145371, 1542136441, 1618938029, 1676831408,
-     1738414210, 1801486309, 1863372164, 1921319908, 1972990388, 2016863658,
-     2052412248, 2080004215, 2100622158, 2121260425, 2133261010, 2139943787,
-     2143551460, 2145456676, 2146823292, 2147271308, 2147415867, 2147462101,
-     2147483647},
-    {789500947,  799912428,  807970493,  822202171,  847198862,  890656938,
-     930446620,  984698487,  1057439013, 1152534920, 1272230465, 1365055160,
-     1466039887, 1571542254, 1676625923, 1775827450, 1864289931, 1938804777,
-     1998288223, 2043552830, 2076625737, 2108821648, 2126953936, 2136781520,
-     2141973538, 2144670400, 2146576828, 2147193855, 2147391471, 2147454404,
-     2147483647},
-    {68,         12075997,   21473763,   38182223,   67875466,   120571390,
-     170045077,  239449100,  336157459,  469148859,  647490682,  794298694,
-     962206904,  1145934076, 1335698887, 1518500250, 1681545272, 1816183116,
-     1919855175, 1995188112, 2047545319, 2095610977, 2121010179, 2134092347,
-     2140740687, 2144096210, 2146410711, 2147144182, 2147376282, 2147449694,
-     2147483647},
-    {-1264867824, -1256941889, -1250718683, -1239533218, -1219262608,
-     -1181994236, -1145402996, -1091240803, -1009679140, -884206781,
-     -686781195,  -493680916,  -231982790,  111344931,   528824509,
-     973499603,   1370532546,  1667536014,  1861934703,  1979750033,
-     2048825092,  2102317318,  2126370894,  2137432969,  2142630645,
-     2145115530,  2146755909,  2147257214,  2147412694,  2147461326,
-     2147483647},
-    {-2126008810, -2125766474, -2125575032, -2125228318, -2124591212,
-     -2123389054, -2122167592, -2120278606, -2117230964, -2111979821,
-     -2101908544, -2088973660, -2063281359, -1998745405, -1741980962,
-     151850025,   1901722232,  2089538753,  2126646554,  2138317205,
-     2142969755,  2145718225,  2146728955,  2147143299,  2147324850,
-     2147407880,  2147460877,  2147476647,  2147481468,  2147482965,
-     2147483647}};
+const FLOAT32 ixheaacd_cos_table[8][31] = {
+    {1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f},
+    {0.9369999766f, 0.9376808405f, 0.9382033348f, 0.9391169548f, 0.9406937957f,
+     0.9433546066f, 0.9457064271f, 0.9487929940f, 0.9527334571f, 0.9575835466f,
+     0.9632775784f, 0.9674328566f, 0.9717451334f, 0.9760690331f, 0.9802456498f,
+     0.9841240048f, 0.9875818491f, 0.9905421734f, 0.9929783344f, 0.9949095249f,
+     0.9963886738f, 0.9979170561f, 0.9988400936f, 0.9993716478f, 0.9996666908f,
+     0.9998259544f, 0.9999424219f, 0.9999813437f, 0.9999940395f, 0.9999980927f,
+     1.0000000000f},
+    {0.8411800265f, 0.8428127766f, 0.8440676332f, 0.8462653756f, 0.8500694633f,
+     0.8565201163f, 0.8622540236f, 0.8698242903f, 0.8795616627f, 0.8916544318f,
+     0.9059935808f, 0.9165460467f, 0.9275664687f, 0.9386759400f, 0.9494492412f,
+     0.9594737887f, 0.9684119225f, 0.9760481715f, 0.9823079705f, 0.9872440100f,
+     0.9910007119f, 0.9948507547f, 0.9971528649f, 0.9984666705f, 0.9991903901f,
+     0.9995787144f, 0.9998613000f, 0.9999551177f, 0.9999856353f, 0.9999954104f,
+     1.0000000000f},
+    {0.6009200215f, 0.6044946313f, 0.6072516441f, 0.6121006608f, 0.6205559969f,
+     0.6350733042f, 0.6481682062f, 0.6657315493f, 0.6887807250f, 0.7181132436f,
+     0.7538767457f, 0.7808354497f, 0.8095121980f, 0.8388824463f, 0.8677002788f,
+     0.8946843147f, 0.9187452197f, 0.9391753078f, 0.9557289481f, 0.9685774446f,
+     0.9781784415f, 0.9877888560f, 0.9933770895f, 0.9964889884f, 0.9981689453f,
+     0.9990561008f, 0.9996924996f, 0.9999011159f, 0.9999684095f, 0.9999899864f,
+     1.0000000000f},
+    {0.3676400185f, 0.3724882603f, 0.3762405813f, 0.3828677237f, 0.3945077062f,
+     0.4147444665f, 0.4332729578f, 0.4585359693f, 0.4924084246f, 0.5366908908f,
+     0.5924285054f, 0.6356533170f, 0.6826780438f, 0.7318063974f, 0.7807397842f,
+     0.8269340992f, 0.8681276441f, 0.9028263092f, 0.9305254817f, 0.9516034126f,
+     0.9670042396f, 0.9819965959f, 0.9904401302f, 0.9950164557f, 0.9974341393f,
+     0.9986900091f, 0.9995777011f, 0.9998650551f, 0.9999570847f, 0.9999864101f,
+     1.0000000000f},
+    {0.0000000317f, 0.0056233243f, 0.0099995006f, 0.0177799836f, 0.0316069759f,
+     0.0561454296f, 0.0791834071f, 0.1115021780f, 0.1565355211f, 0.2184644639f,
+     0.3015113473f, 0.3698741496f, 0.4480625093f, 0.5336171389f, 0.6219832897f,
+     0.7071067691f, 0.7830305099f, 0.8457261920f, 0.8940022588f, 0.9290818572f,
+     0.9534626007f, 0.9758449197f, 0.9876723289f, 0.9937641621f, 0.9968600869f,
+     0.9984226227f, 0.9995003939f, 0.9998419285f, 0.9999499917f, 0.9999842048f,
+     1.0000000000f},
+    {-0.5889999866f, -0.5853092074f, -0.5824112892f, -0.5772026181f,
+     -0.5677633882f, -0.5504089594f, -0.5333698392f, -0.5081486106f,
+     -0.4701685011f, -0.4117408693f, -0.3198074102f, -0.2298880965f,
+     -0.1080254018f, 0.0518490225f,  0.2462531030f,  0.4533210695f,
+     0.6382039785f,  0.7765069604f,  0.8670309186f,  0.9218929410f,
+     0.9540585279f,  0.9789677858f,  0.9901686311f,  0.9953197837f,
+     0.9977401495f,  0.9988972545f,  0.9996611476f,  0.9998945594f,
+     0.9999669790f,  0.9999896288f,  1.0000000000f},
+    {-0.9900000095f, -0.9898871779f, -0.9897980094f, -0.9896365404f,
+     -0.9893398881f, -0.9887800813f, -0.9882112741f, -0.9873316884f,
+     -0.9859125018f, -0.9834672213f, -0.9787774086f, -0.9727541804f,
+     -0.9607902765f, -0.9307383299f, -0.8111730814f, 0.0707106814f,
+     0.8855584264f,  0.9730173349f,  0.9902969599f,  0.9957315326f,
+     0.9978980422f,  0.9991779327f,  0.9996485710f,  0.9998415112f,
+     0.9999260306f,  0.9999647141f,  0.9999893904f,  0.9999967217f,
+     0.9999989867f,  0.9999997020f,  1.0000000000f}};
 
-const WORD32
-    ixheaacd_mps_polyphase_filter_coeff_fix[10 * MAX_NUM_QMF_BANDS_SAC / 2] = {
-        0x00000000, 0x0055dba0, 0xffede50e, 0x005b5370, 0xffed978a, 0x006090c3,
-        0xffefc9b9, 0x0065fde5, 0xfff0065d, 0x006b47fa, 0xffeff6cb, 0x0070c8a4,
-        0xffef7b8b, 0x0075fdec, 0xffeedfa4, 0x007b3874, 0xffee1650, 0x00807993,
-        0xffed651e, 0x0085c217, 0xffecc31c, 0x008a7dd6, 0xffebe77b, 0x008f4bfc,
-        0xffeb50b3, 0x009424c5, 0xffea9193, 0x0098b855, 0xffe9ca76, 0x009d10bf,
-        0xffe940f4, 0x00a1039c, 0xffe88ba8, 0x00a520bb, 0xffe83a08, 0x00a8739d,
-        0xffe79e16, 0x00abe79d, 0xffe7746f, 0x00af374c, 0xffe6d466, 0x00b1978d,
-        0xffe6afee, 0x00b3d15b, 0xffe65416, 0x00b5c866, 0xffe681c6, 0x00b74c36,
-        0xffe66dd0, 0x00b8394b, 0xffe66fac, 0x00b8fe0d, 0xffe69424, 0x00b8c6b0,
-        0xffe6fed4, 0x00b85f70, 0xffe75361, 0x00b73aaf, 0xffe80415, 0x00b58c8c,
-        0xffe85b4b, 0x00b36acd, 0xffe954d1, 0x00b06b68, 0xffea353b, 0x00acbd2e,
-        0xffeb3849, 0x00a85e93, 0xffec8409, 0x00a3508f, 0xffedc419, 0x009da525,
-        0xffef2395, 0x0096dcc1, 0xfff0e7f0, 0x008f87aa, 0xfff294c4, 0x00872c62,
-        0xfff48701, 0x007e0392, 0xfff681d7, 0x007400b7, 0xfff91fca, 0x006928a0,
-        0xfffb42b1, 0x005d36de, 0xfffdfa25, 0x00504f40, 0x00007134, 0x00426f36,
-        0x00039608, 0x0033b926, 0x0006b1ce, 0x0023b989, 0x0009aa3e, 0x00131c75,
-        0x000d31b4, 0x0000e790, 0x0010bc63, 0xffee183b, 0x001471f7, 0xffda17f2,
-        0x0018703e, 0xffc4e365, 0x001c3549, 0xffaea5d6, 0x002064f7, 0xff975c02,
-        0x0024dd50, 0xff7ee3f2, 0x00293718, 0xff6542d1, 0x002d8e42, 0xff4aabc9,
-        0x00329ab6, 0xff2ef726, 0x003745f9, 0xff120d71, 0x003c1fa3, 0xfef3f6ac,
-        0x004103f4, 0xfed4bec3, 0x00465347, 0xfeb48d0d, 0x004b6c45, 0xfe933dc1,
-        0x0050b176, 0xfe70b8d1, 0x01b2e41c, 0x09015651, 0x01d78bfb, 0x08d3e41b,
-        0x01fd3ba0, 0x08a24899, 0x02244a24, 0x086b1eeb, 0x024bf7a1, 0x082f552e,
-        0x0274ba42, 0x07ee507b, 0x029e35b4, 0x07a8127c, 0x02c89900, 0x075ca90c,
-        0x02f3e48d, 0x070bbf58, 0x03201115, 0x06b559c3, 0x034d01f0, 0x06593911,
-        0x037ad437, 0x05f7fb90, 0x03a966bb, 0x0590a67d, 0x03d8afe6, 0x05237f9c,
-        0x04083fec, 0x04b0adcb, 0x043889c5, 0x0437fb0a, 0x04694101, 0x03b8f8db,
-        0x049aa82e, 0x03343533, 0x04cc2fce, 0x02a99097, 0x04fe20bd, 0x02186a91,
-        0x05303f87, 0x01816e05, 0x05626209, 0x00e42fa2, 0x05950122, 0x0040c496,
-        0x05c76fec, 0xff96db90, 0x05f9c050, 0xfee723c7, 0x062bf5eb, 0xfe310658,
-        0x065dd569, 0xfd7475d8, 0x068f8b44, 0xfcb1d740, 0x06c0f0c0, 0xfbe8f5be,
-        0x06f1825c, 0xfb19b7be, 0x0721bf21, 0xfa44a06a, 0x075112a1, 0xf96916f5,
-        0x077fedb2, 0xf887507c, 0x07ad8c26, 0xf79fa13b, 0x07da2b7f, 0xf6b1f3c3,
-        0x08061671, 0xf5be0fa9, 0x08303897, 0xf4c473c6, 0x08594887, 0xf3c4e887,
-        0x0880ffdc, 0xf2bf6ea5, 0x08a75da4, 0xf1b461ab, 0x08cb4e22, 0xf0a395a0,
-        0x08edfeaa, 0xef8d4d7c, 0x090ec1fc, 0xee71b2ff, 0x092d796f, 0xed50a31e,
-        0x0949eaac, 0xec2a3f60, 0x0963ed46, 0xeafee7f2, 0x097c1ee8, 0xe9cea84b,
-        0x099140a6, 0xe89971b7, 0x09a3e163, 0xe75f8bb8, 0x09b3d77f, 0xe620c476,
-        0x09c0e59e, 0xe4de0cb0, 0x09cab9f1, 0xe396a45e, 0x09d19ca8, 0xe24b8f67,
-        0x09d52709, 0xe0fc421f, 0x09d5560a, 0xdfa93ab5, 0x09d1fa22, 0xde529087,
-        0x09caeb0e, 0xdcf898fb, 0x09c018ce, 0xdb9b5b13, 0x09b18a1c, 0xda3b176b,
-        0x099ec3db, 0xd8d7f220, 0x09881dc5, 0xd7722f05, 0x096d0e21, 0xd60a46e6,
-        0x094d7ec2, 0xd49fd55f, 0x09299ead, 0xd3337b3e, 0x2e3a7532, 0x6d474e1d,
-        0x2faa221c, 0x6d41d963, 0x311af3a4, 0x6d32730f, 0x328cc6f0, 0x6d18520d,
-        0x33ff670e, 0x6cf4073e, 0x3572ec70, 0x6cc59baa, 0x36e69691, 0x6c8c4c7a,
-        0x385a49c3, 0x6c492216, 0x39ce0477, 0x6bfbdd97, 0x3b415115, 0x6ba4629e,
-        0x3cb41218, 0x6b42a863, 0x3e25b17e, 0x6ad73e8d, 0x3f962fb8, 0x6a619c5e,
-        0x41058bc5, 0x69e29784, 0x4272a385, 0x6959709d, 0x43de620a, 0x68c7269b,
-        0x4547daea, 0x682b39a3, 0x46aea856, 0x6785c24d, 0x4812f848, 0x66d76725,
-        0x4973fef1, 0x661fd6b7, 0x4ad237a2, 0x655f63f1, 0x4c2ca3df, 0x64964062,
-        0x4d83976c, 0x63c45243, 0x4ed62be2, 0x62ea6473, 0x5024d70e, 0x6207f21f,
-        0x516eefb9, 0x611d58a2, 0x52b449dd, 0x602b0c7f, 0x53f495a9, 0x5f30ff5f,
-        0x552f8ff6, 0x5e2f6366, 0x56654bdd, 0x5d26be9b, 0x579505f5, 0x5c16d0ae,
-        0x58befacd, 0x5b001db7, 0x59e2f69e, 0x59e2f69e, 0x5b001db7, 0x58befacd,
-        0x5c16d0ae, 0x579505f5, 0x5d26be9b, 0x56654bdd, 0x5e2f6366, 0x552f8ff6,
-        0x5f30ff5f, 0x53f495a9, 0x602b0c7f, 0x52b449dd, 0x611d58a2, 0x516eefb9,
-        0x6207f21f, 0x5024d70e, 0x62ea6473, 0x4ed62be2, 0x63c45243, 0x4d83976c,
-        0x64964062, 0x4c2ca3df, 0x655f63f1, 0x4ad237a2, 0x661fd6b7, 0x4973fef1,
-        0x66d76725, 0x4812f848, 0x6785c24d, 0x46aea856, 0x682b39a3, 0x4547daea,
-        0x68c7269b, 0x43de620a, 0x6959709d, 0x4272a385, 0x69e29784, 0x41058bc5,
-        0x6a619c5e, 0x3f962fb8, 0x6ad73e8d, 0x3e25b17e, 0x6b42a863, 0x3cb41218,
-        0x6ba4629e, 0x3b415115, 0x6bfbdd97, 0x39ce0477, 0x6c492216, 0x385a49c3,
-        0x6c8c4c7a, 0x36e69691, 0x6cc59baa, 0x3572ec70, 0x6cf4073e, 0x33ff670e,
-        0x6d18520d, 0x328cc6f0, 0x6d32730f, 0x311af3a4, 0x6d41d963, 0x2faa221c,
-        0xd1c58ace, 0x09015651, 0xd3337b3e, 0x09299ead, 0xd49fd55f, 0x094d7ec2,
-        0xd60a46e6, 0x096d0e21, 0xd7722f05, 0x09881dc5, 0xd8d7f220, 0x099ec3db,
-        0xda3b176b, 0x09b18a1c, 0xdb9b5b13, 0x09c018ce, 0xdcf898fb, 0x09caeb0e,
-        0xde529087, 0x09d1fa22, 0xdfa93ab5, 0x09d5560a, 0xe0fc421f, 0x09d52709,
-        0xe24b8f67, 0x09d19ca8, 0xe396a45e, 0x09cab9f1, 0xe4de0cb0, 0x09c0e59e,
-        0xe620c476, 0x09b3d77f, 0xe75f8bb8, 0x09a3e163, 0xe89971b7, 0x099140a6,
-        0xe9cea84b, 0x097c1ee8, 0xeafee7f2, 0x0963ed46, 0xec2a3f60, 0x0949eaac,
-        0xed50a31e, 0x092d796f, 0xee71b2ff, 0x090ec1fc, 0xef8d4d7c, 0x08edfeaa,
-        0xf0a395a0, 0x08cb4e22, 0xf1b461ab, 0x08a75da4, 0xf2bf6ea5, 0x0880ffdc,
-        0xf3c4e887, 0x08594887, 0xf4c473c6, 0x08303897, 0xf5be0fa9, 0x08061671,
-        0xf6b1f3c3, 0x07da2b7f, 0xf79fa13b, 0x07ad8c26, 0xf887507c, 0x077fedb2,
-        0xf96916f5, 0x075112a1, 0xfa44a06a, 0x0721bf21, 0xfb19b7be, 0x06f1825c,
-        0xfbe8f5be, 0x06c0f0c0, 0xfcb1d740, 0x068f8b44, 0xfd7475d8, 0x065dd569,
-        0xfe310658, 0x062bf5eb, 0xfee723c7, 0x05f9c050, 0xff96db90, 0x05c76fec,
-        0x0040c496, 0x05950122, 0x00e42fa2, 0x05626209, 0x01816e05, 0x05303f87,
-        0x02186a91, 0x04fe20bd, 0x02a99097, 0x04cc2fce, 0x03343533, 0x049aa82e,
-        0x03b8f8db, 0x04694101, 0x0437fb0a, 0x043889c5, 0x04b0adcb, 0x04083fec,
-        0x05237f9c, 0x03d8afe6, 0x0590a67d, 0x03a966bb, 0x05f7fb90, 0x037ad437,
-        0x06593911, 0x034d01f0, 0x06b559c3, 0x03201115, 0x070bbf58, 0x02f3e48d,
-        0x075ca90c, 0x02c89900, 0x07a8127c, 0x029e35b4, 0x07ee507b, 0x0274ba42,
-        0x082f552e, 0x024bf7a1, 0x086b1eeb, 0x02244a24, 0x08a24899, 0x01fd3ba0,
-        0x08d3e41b, 0x01d78bfb, 0xfe4d1be4, 0x0055dba0, 0xfe70b8d1, 0x0050b176,
-        0xfe933dc1, 0x004b6c45, 0xfeb48d0d, 0x00465347, 0xfed4bec3, 0x004103f4,
-        0xfef3f6ac, 0x003c1fa3, 0xff120d71, 0x003745f9, 0xff2ef726, 0x00329ab6,
-        0xff4aabc9, 0x002d8e42, 0xff6542d1, 0x00293718, 0xff7ee3f2, 0x0024dd50,
-        0xff975c02, 0x002064f7, 0xffaea5d6, 0x001c3549, 0xffc4e365, 0x0018703e,
-        0xffda17f2, 0x001471f7, 0xffee183b, 0x0010bc63, 0x0000e790, 0x000d31b4,
-        0x00131c75, 0x0009aa3e, 0x0023b989, 0x0006b1ce, 0x0033b926, 0x00039608,
-        0x00426f36, 0x00007134, 0x00504f40, 0xfffdfa25, 0x005d36de, 0xfffb42b1,
-        0x006928a0, 0xfff91fca, 0x007400b7, 0xfff681d7, 0x007e0392, 0xfff48701,
-        0x00872c62, 0xfff294c4, 0x008f87aa, 0xfff0e7f0, 0x0096dcc1, 0xffef2395,
-        0x009da525, 0xffedc419, 0x00a3508f, 0xffec8409, 0x00a85e93, 0xffeb3849,
-        0x00acbd2e, 0xffea353b, 0x00b06b68, 0xffe954d1, 0x00b36acd, 0xffe85b4b,
-        0x00b58c8c, 0xffe80415, 0x00b73aaf, 0xffe75361, 0x00b85f70, 0xffe6fed4,
-        0x00b8c6b0, 0xffe69424, 0x00b8fe0d, 0xffe66fac, 0x00b8394b, 0xffe66dd0,
-        0x00b74c36, 0xffe681c6, 0x00b5c866, 0xffe65416, 0x00b3d15b, 0xffe6afee,
-        0x00b1978d, 0xffe6d466, 0x00af374c, 0xffe7746f, 0x00abe79d, 0xffe79e16,
-        0x00a8739d, 0xffe83a08, 0x00a520bb, 0xffe88ba8, 0x00a1039c, 0xffe940f4,
-        0x009d10bf, 0xffe9ca76, 0x0098b855, 0xffea9193, 0x009424c5, 0xffeb50b3,
-        0x008f4bfc, 0xffebe77b, 0x008a7dd6, 0xffecc31c, 0x0085c217, 0xffed651e,
-        0x00807993, 0xffee1650, 0x007b3874, 0xffeedfa4, 0x0075fdec, 0xffef7b8b,
-        0x0070c8a4, 0xffeff6cb, 0x006b47fa, 0xfff0065d, 0x0065fde5, 0xffefc9b9,
-        0x006090c3, 0xffed978a, 0x005b5370, 0xffede50e};
+const FLOAT32
+    ixheaacd_mps_polyphase_filter_coeff[10 * MAX_NUM_QMF_BANDS_SAC / 2] = {
+        0.000000f,  0.002620f,  -0.000553f, 0.002787f,  -0.000562f, 0.002947f,
+        -0.000495f, 0.003113f,  -0.000488f, 0.003274f,  -0.000489f, 0.003442f,
+        -0.000504f, 0.003601f,  -0.000523f, 0.003760f,  -0.000547f, 0.003921f,
+        -0.000568f, 0.004082f,  -0.000587f, 0.004226f,  -0.000613f, 0.004373f,
+        -0.000631f, 0.004521f,  -0.000654f, 0.004661f,  -0.000678f, 0.004793f,
+        -0.000694f, 0.004914f,  -0.000716f, 0.005039f,  -0.000726f, 0.005141f,
+        -0.000744f, 0.005246f,  -0.000749f, 0.005347f,  -0.000768f, 0.005420f,
+        -0.000772f, 0.005488f,  -0.000783f, 0.005548f,  -0.000778f, 0.005594f,
+        -0.000780f, 0.005622f,  -0.000780f, 0.005646f,  -0.000776f, 0.005639f,
+        -0.000763f, 0.005627f,  -0.000753f, 0.005592f,  -0.000732f, 0.005540f,
+        -0.000722f, 0.005475f,  -0.000692f, 0.005384f,  -0.000665f, 0.005272f,
+        -0.000634f, 0.005138f,  -0.000595f, 0.004984f,  -0.000556f, 0.004811f,
+        -0.000515f, 0.004604f,  -0.000461f, 0.004380f,  -0.000410f, 0.004125f,
+        -0.000350f, 0.003846f,  -0.000290f, 0.003540f,  -0.000210f, 0.003209f,
+        -0.000145f, 0.002845f,  -0.000062f, 0.002451f,  0.000013f,  0.002027f,
+        0.000109f,  0.001578f,  0.000204f,  0.001090f,  0.000295f,  0.000583f,
+        0.000403f,  0.000028f,  0.000511f,  -0.000546f, 0.000624f,  -0.001157f,
+        0.000746f,  -0.001804f, 0.000861f,  -0.002483f, 0.000989f,  -0.003193f,
+        0.001125f,  -0.003940f, 0.001258f,  -0.004722f, 0.001390f,  -0.005534f,
+        0.001544f,  -0.006379f, 0.001687f,  -0.007262f, 0.001835f,  -0.008180f,
+        0.001984f,  -0.009133f, 0.002146f,  -0.010115f, 0.002302f,  -0.011132f,
+        0.002463f,  -0.012185f, 0.013272f,  0.070353f,  0.014390f,  0.068966f,
+        0.015541f,  0.067453f,  0.016732f,  0.065769f,  0.017943f,  0.063944f,
+        0.019187f,  0.061960f,  0.020453f,  0.059817f,  0.021747f,  0.057515f,
+        0.023068f,  0.055046f,  0.024416f,  0.052409f,  0.025788f,  0.049598f,
+        0.027186f,  0.046630f,  0.028607f,  0.043477f,  0.030050f,  0.040146f,
+        0.031502f,  0.036642f,  0.032975f,  0.032958f,  0.034462f,  0.029082f,
+        0.035970f,  0.025031f,  0.037481f,  0.020800f,  0.039005f,  0.016370f,
+        0.040535f,  0.011762f,  0.042065f,  0.006964f,  0.043610f,  0.001977f,
+        0.045149f,  -0.003209f, 0.046684f,  -0.008571f, 0.048217f,  -0.014129f,
+        0.049739f,  -0.019883f, 0.051256f,  -0.025823f, 0.052763f,  -0.031953f,
+        0.054245f,  -0.038278f, 0.055717f,  -0.044781f, 0.057162f,  -0.051480f,
+        0.058592f,  -0.058371f, 0.059984f,  -0.065441f, 0.061346f,  -0.072694f,
+        0.062686f,  -0.080137f, 0.063972f,  -0.087755f, 0.065225f,  -0.095553f,
+        0.066437f,  -0.103533f, 0.067608f,  -0.111683f, 0.068704f,  -0.120008f,
+        0.069763f,  -0.128500f, 0.070763f,  -0.137155f, 0.071700f,  -0.145977f,
+        0.072568f,  -0.154961f, 0.073362f,  -0.164096f, 0.074100f,  -0.173381f,
+        0.074745f,  -0.182817f, 0.075314f,  -0.192397f, 0.075801f,  -0.202125f,
+        0.076199f,  -0.211974f, 0.076499f,  -0.221965f, 0.076709f,  -0.232069f,
+        0.076817f,  -0.242302f, 0.076823f,  -0.252648f, 0.076720f,  -0.263105f,
+        0.076505f,  -0.273663f, 0.076175f,  -0.284321f, 0.075731f,  -0.295072f,
+        0.075158f,  -0.305910f, 0.074466f,  -0.316828f, 0.073641f,  -0.327811f,
+        0.072677f,  -0.338872f, 0.071583f,  -0.349991f, 0.361159f,  0.853739f,
+        0.372380f,  0.853572f,  0.383635f,  0.853102f,  0.394921f,  0.852305f,
+        0.406232f,  0.851197f,  0.417570f,  0.849780f,  0.428912f,  0.848032f,
+        0.440255f,  0.845982f,  0.451600f,  0.843624f,  0.462931f,  0.840954f,
+        0.474245f,  0.837972f,  0.485525f,  0.834694f,  0.496771f,  0.831104f,
+        0.507982f,  0.827228f,  0.519123f,  0.823042f,  0.530224f,  0.818578f,
+        0.541255f,  0.813819f,  0.552205f,  0.808770f,  0.563079f,  0.803449f,
+        0.573852f,  0.797847f,  0.584540f,  0.791974f,  0.595112f,  0.785835f,
+        0.605578f,  0.779429f,  0.615911f,  0.772778f,  0.626124f,  0.765867f,
+        0.636198f,  0.758708f,  0.646127f,  0.751314f,  0.655902f,  0.743683f,
+        0.665514f,  0.735821f,  0.674966f,  0.727745f,  0.684235f,  0.719446f,
+        0.693328f,  0.710941f,  0.702239f,  0.702239f,  0.710941f,  0.693328f,
+        0.719446f,  0.684235f,  0.727745f,  0.674966f,  0.735821f,  0.665514f,
+        0.743683f,  0.655902f,  0.751314f,  0.646127f,  0.758708f,  0.636198f,
+        0.765867f,  0.626124f,  0.772778f,  0.615911f,  0.779429f,  0.605578f,
+        0.785835f,  0.595112f,  0.791974f,  0.584540f,  0.797847f,  0.573852f,
+        0.803449f,  0.563079f,  0.808770f,  0.552205f,  0.813819f,  0.541255f,
+        0.818578f,  0.530224f,  0.823042f,  0.519123f,  0.827228f,  0.507982f,
+        0.831104f,  0.496771f,  0.834694f,  0.485525f,  0.837972f,  0.474245f,
+        0.840954f,  0.462931f,  0.843624f,  0.451600f,  0.845982f,  0.440255f,
+        0.848032f,  0.428912f,  0.849780f,  0.417570f,  0.851197f,  0.406232f,
+        0.852305f,  0.394921f,  0.853102f,  0.383635f,  0.853572f,  0.372380f,
+        -0.361159f, 0.070353f,  -0.349991f, 0.071583f,  -0.338872f, 0.072677f,
+        -0.327811f, 0.073641f,  -0.316828f, 0.074466f,  -0.305910f, 0.075158f,
+        -0.295072f, 0.075731f,  -0.284321f, 0.076175f,  -0.273663f, 0.076505f,
+        -0.263105f, 0.076720f,  -0.252648f, 0.076823f,  -0.242302f, 0.076817f,
+        -0.232069f, 0.076709f,  -0.221965f, 0.076499f,  -0.211974f, 0.076199f,
+        -0.202125f, 0.075801f,  -0.192397f, 0.075314f,  -0.182817f, 0.074745f,
+        -0.173381f, 0.074100f,  -0.164096f, 0.073362f,  -0.154961f, 0.072568f,
+        -0.145977f, 0.071700f,  -0.137155f, 0.070763f,  -0.128500f, 0.069763f,
+        -0.120008f, 0.068704f,  -0.111683f, 0.067608f,  -0.103533f, 0.066437f,
+        -0.095553f, 0.065225f,  -0.087755f, 0.063972f,  -0.080137f, 0.062686f,
+        -0.072694f, 0.061346f,  -0.065441f, 0.059984f,  -0.058371f, 0.058592f,
+        -0.051480f, 0.057162f,  -0.044781f, 0.055717f,  -0.038278f, 0.054245f,
+        -0.031953f, 0.052763f,  -0.025823f, 0.051256f,  -0.019883f, 0.049739f,
+        -0.014129f, 0.048217f,  -0.008571f, 0.046684f,  -0.003209f, 0.045149f,
+        0.001977f,  0.043610f,  0.006964f,  0.042065f,  0.011762f,  0.040535f,
+        0.016370f,  0.039005f,  0.020800f,  0.037481f,  0.025031f,  0.035970f,
+        0.029082f,  0.034462f,  0.032958f,  0.032975f,  0.036642f,  0.031502f,
+        0.040146f,  0.030050f,  0.043477f,  0.028607f,  0.046630f,  0.027186f,
+        0.049598f,  0.025788f,  0.052409f,  0.024416f,  0.055046f,  0.023068f,
+        0.057515f,  0.021747f,  0.059817f,  0.020453f,  0.061960f,  0.019187f,
+        0.063944f,  0.017943f,  0.065769f,  0.016732f,  0.067453f,  0.015541f,
+        0.068966f,  0.014390f,  -0.013272f, 0.002620f,  -0.012185f, 0.002463f,
+        -0.011132f, 0.002302f,  -0.010115f, 0.002146f,  -0.009133f, 0.001984f,
+        -0.008180f, 0.001835f,  -0.007262f, 0.001687f,  -0.006379f, 0.001544f,
+        -0.005534f, 0.001390f,  -0.004722f, 0.001258f,  -0.003940f, 0.001125f,
+        -0.003193f, 0.000989f,  -0.002483f, 0.000861f,  -0.001804f, 0.000746f,
+        -0.001157f, 0.000624f,  -0.000546f, 0.000511f,  0.000028f,  0.000403f,
+        0.000583f,  0.000295f,  0.001090f,  0.000204f,  0.001578f,  0.000109f,
+        0.002027f,  0.000013f,  0.002451f,  -0.000062f, 0.002845f,  -0.000145f,
+        0.003209f,  -0.000210f, 0.003540f,  -0.000290f, 0.003846f,  -0.000350f,
+        0.004125f,  -0.000410f, 0.004380f,  -0.000461f, 0.004604f,  -0.000515f,
+        0.004811f,  -0.000556f, 0.004984f,  -0.000595f, 0.005138f,  -0.000634f,
+        0.005272f,  -0.000665f, 0.005384f,  -0.000692f, 0.005475f,  -0.000722f,
+        0.005540f,  -0.000732f, 0.005592f,  -0.000753f, 0.005627f,  -0.000763f,
+        0.005639f,  -0.000776f, 0.005646f,  -0.000780f, 0.005622f,  -0.000780f,
+        0.005594f,  -0.000778f, 0.005548f,  -0.000783f, 0.005488f,  -0.000772f,
+        0.005420f,  -0.000768f, 0.005347f,  -0.000749f, 0.005246f,  -0.000744f,
+        0.005141f,  -0.000726f, 0.005039f,  -0.000716f, 0.004914f,  -0.000694f,
+        0.004793f,  -0.000678f, 0.004661f,  -0.000654f, 0.004521f,  -0.000631f,
+        0.004373f,  -0.000613f, 0.004226f,  -0.000587f, 0.004082f,  -0.000568f,
+        0.003921f,  -0.000547f, 0.003760f,  -0.000523f, 0.003601f,  -0.000504f,
+        0.003442f,  -0.000489f, 0.003274f,  -0.000488f, 0.003113f,  -0.000495f,
+        0.002947f,  -0.000562f, 0.002787f,  -0.000553f};
 
-const WORD32 ixheaacd_mps_pre_re[64] = {
-    0x01fff621, 0x01ffa72e, 0x01ff0956, 0x01fe1caf, 0x01fce15f, 0x01fb5797,
-    0x01f97f92, 0x01f7599a, 0x01f4e603, 0x01f2252f, 0x01ef178a, 0x01ebbd8c,
-    0x01e817ba, 0x01e426a4, 0x01dfeae6, 0x01db6526, 0x01d69617, 0x01d17e77,
-    0x01cc1f0f, 0x01c678b3, 0x01c08c42, 0x01ba5aa6, 0x01b3e4d3, 0x01ad2bc9,
-    0x01a63091, 0x019ef43e, 0x019777ee, 0x018fbcc9, 0x0187c400, 0x017f8ecd,
-    0x01771e75, 0x016e7444, 0x01659191, 0x015c77bb, 0x01532828, 0x0149a449,
-    0x013fed94, 0x0136058a, 0x012bedb1, 0x0121a798, 0x011734d5, 0x010c9704,
-    0x0101cfc7, 0x00f6e0c9, 0x00ebcbb9, 0x00e0924d, 0x00d53640, 0x00c9b952,
-    0x00be1d48, 0x00b263ed, 0x00a68f10, 0x009aa084, 0x008e9a20, 0x00827dbf,
-    0x00764d3e, 0x006a0a7f, 0x005db766, 0x005155d9, 0x0044e7c1, 0x00386f0a,
-    0x002bed9e, 0x001f656d, 0x0012d864, 0x00064873};
+const FLOAT32 ixheaacd_mps_post_twid[30] = {
+    0.998795f, 0.049068f, 0.995185f, 0.098017f, 0.989177f, 0.146730f,
+    0.980785f, 0.195090f, 0.970031f, 0.242980f, 0.956940f, 0.290285f,
+    0.941544f, 0.336890f, 0.923880f, 0.382683f, 0.903989f, 0.427555f,
+    0.881921f, 0.471397f, 0.857729f, 0.514103f, 0.831470f, 0.555570f,
+    0.803208f, 0.595699f, 0.773010f, 0.634393f, 0.740951f, 0.671559f};
 
-const WORD32 ixheaacd_mps_pre_im[64] = {
-    0x00064874, 0x0012d865, 0x001f656e, 0x002beda0, 0x00386f0b, 0x0044e7c3,
-    0x005155da, 0x005db767, 0x006a0a80, 0x00764d3f, 0x00827dc0, 0x008e9a22,
-    0x009aa086, 0x00a68f12, 0x00b263ef, 0x00be1d49, 0x00c9b953, 0x00d53641,
-    0x00e0924f, 0x00ebcbbb, 0x00f6e0cb, 0x0101cfc8, 0x010c9705, 0x011734d6,
-    0x0121a79a, 0x012bedb2, 0x0136058b, 0x013fed95, 0x0149a44a, 0x01532829,
-    0x015c77bc, 0x01659192, 0x016e7445, 0x01771e76, 0x017f8ece, 0x0187c401,
-    0x018fbcca, 0x019777ef, 0x019ef43f, 0x01a63092, 0x01ad2bca, 0x01b3e4d4,
-    0x01ba5aa6, 0x01c08c42, 0x01c678b3, 0x01cc1f0f, 0x01d17e77, 0x01d69617,
-    0x01db6526, 0x01dfeae6, 0x01e426a5, 0x01e817bb, 0x01ebbd8c, 0x01ef178a,
-    0x01f2252f, 0x01f4e603, 0x01f7599a, 0x01f97f92, 0x01fb5797, 0x01fce15f,
-    0x01fe1caf, 0x01ff0956, 0x01ffa72f, 0x01fff621};
+const FLOAT32 ixheaacd_mps_pre_twid[64] = {
+    0.015624f, 0.000192f, 0.015614f, 0.000575f, 0.015596f, 0.000958f, 0.015567f,
+    0.001341f, 0.015530f, 0.001722f, 0.015483f, 0.002103f, 0.015427f, 0.002482f,
+    0.015361f, 0.002860f, 0.015286f, 0.003236f, 0.015202f, 0.003610f, 0.015109f,
+    0.003982f, 0.015007f, 0.004352f, 0.014895f, 0.004719f, 0.014775f, 0.005083f,
+    0.014646f, 0.005444f, 0.014508f, 0.005802f, 0.014361f, 0.006156f, 0.014206f,
+    0.006507f, 0.014042f, 0.006853f, 0.013869f, 0.007196f, 0.013689f, 0.007534f,
+    0.013500f, 0.007868f, 0.013302f, 0.008197f, 0.013097f, 0.008521f, 0.012884f,
+    0.008840f, 0.012663f, 0.009153f, 0.012435f, 0.009461f, 0.012199f, 0.009763f,
+    0.011956f, 0.010060f, 0.011705f, 0.010350f, 0.011448f, 0.010634f, 0.011183f,
+    0.010912f};
 
-const WORD32 ixheaacd_mps_post_re[128] = {
-    0x7fffffff, 0x7ff62182, 0x7fd8878d, 0x7fa736b3, 0x7f62368e, 0x7f0991c2,
-    0x7e9d55fa, 0x7e1d93e8, 0x7d8a5f3d, 0x7ce3ceae, 0x7c29fbea, 0x7b5d0399,
-    0x7a7d0555, 0x798a23ab, 0x7884840c, 0x776c4ed3, 0x7641af33, 0x7504d33b,
-    0x73b5ebc5, 0x72552c78, 0x70e2cbb8, 0x6f5f02a2, 0x6dca0d03, 0x6c24294e,
-    0x6a6d9890, 0x68a69e6b, 0x66cf8109, 0x64e8890d, 0x62f20192, 0x60ec3814,
-    0x5ed77c6c, 0x5cb420c0, 0x5a827978, 0x5842dd31, 0x55f5a4ad, 0x539b2ac8,
-    0x5133cc6b, 0x4ebfe879, 0x4c3fdfc6, 0x49b41504, 0x471cecb5, 0x447acd1d,
-    0x41ce1e2f, 0x3f174981, 0x3c56ba37, 0x398cdcf7, 0x36ba1fd6, 0x33def248,
-    0x30fbc50c, 0x2e110a1e, 0x2b1f34a6, 0x2826b8e1, 0x25280c14, 0x2223a47a,
-    0x1f19f92e, 0x1c0b821b, 0x18f8b7eb, 0x15e213f2, 0x12c8101a, 0x0fab26d5,
-    0x0c8bd306, 0x096a8ff0, 0x0647d921, 0x03242a62, 0xffffffa3, 0xfcdbd4e2,
-    0xf9b82624, 0xf6956f55, 0xf3742c3f, 0xf054d871, 0xed37ef2c, 0xea1deb55,
-    0xe707475d, 0xe3f47d2e, 0xe0e6061c, 0xdddc5ad1, 0xdad7f338, 0xd7d9466d,
-    0xd4e0caa9, 0xd1eef532, 0xcf043a47, 0xcc210d0d, 0xc945df80, 0xc6732261,
-    0xc3a94524, 0xc0e8b5dc, 0xbe31e130, 0xbb853244, 0xb8e312ae, 0xb64bea62,
-    0xb3c01fa3, 0xb14016f3, 0xaecc3304, 0xac64d4aa, 0xaa0a5ac8, 0xa7bd2247,
-    0xa57d8603, 0xa34bdebf, 0xa1288316, 0x9f13c772, 0x9d0dfdf7, 0x9b17767f,
-    0x99307e88, 0x97596128, 0x95926708, 0x93dbd64e, 0x9235f29c, 0x90a0fd01,
-    0x8f1d33f0, 0x8daad334, 0x8c4a13eb, 0x8afb2c79, 0x89be5085, 0x8893b0ea,
-    0x877b7bb4, 0x8675dc1a, 0x8582fa74, 0x84a2fc35, 0x83d603e8, 0x831c3129,
-    0x8275a09e, 0x81e26bf8, 0x8162a9ea, 0x80f66e27, 0x809dc95f, 0x8058c93f,
-    0x8027786a, 0x8009de7a};
+const FLOAT32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER] = {
+    0.007461f, 0.022704f, 0.045469f, 0.072661f, 0.098851f, 0.117937f, 0.125000f,
+    0.117937f, 0.098851f, 0.072661f, 0.045469f, 0.022704f, 0.007462f};
 
-const WORD32 ixheaacd_mps_post_im[128] = {
-    0x00000000, 0x03242ac0, 0x0647d97f, 0x096a904d, 0x0c8bd363, 0x0fab2732,
-    0x12c81077, 0x15e2144e, 0x18f8b847, 0x1c0b8277, 0x1f19f989, 0x2223a4d4,
-    0x25280c6e, 0x2826b93a, 0x2b1f34fe, 0x2e110a76, 0x30fbc563, 0x33def29e,
-    0x36ba202b, 0x398cdd4b, 0x3c56ba89, 0x3f1749d2, 0x41ce1e80, 0x447acd6c,
-    0x471ced03, 0x49b41551, 0x4c3fe012, 0x4ebfe8c3, 0x5133ccb3, 0x539b2b0f,
-    0x55f5a4f2, 0x5842dd75, 0x5a8279bb, 0x5cb42101, 0x5ed77cab, 0x60ec3851,
-    0x62f201cd, 0x64e88947, 0x66cf8141, 0x68a69ea2, 0x6a6d98c4, 0x6c242980,
-    0x6dca0d34, 0x6f5f02d0, 0x70e2cbe4, 0x72552ca2, 0x73b5ebed, 0x7504d361,
-    0x7641af57, 0x776c4ef5, 0x7884842c, 0x798a23c8, 0x7a7d0571, 0x7b5d03b2,
-    0x7c29fc01, 0x7ce3cec3, 0x7d8a5f4f, 0x7e1d93f8, 0x7e9d5608, 0x7f0991ce,
-    0x7f623697, 0x7fa736ba, 0x7fd88792, 0x7ff62184, 0x7fffffff, 0x7ff6217f,
-    0x7fd88789, 0x7fa736ac, 0x7f623685, 0x7f0991b7, 0x7e9d55ed, 0x7e1d93d7,
-    0x7d8a5f2b, 0x7ce3ce9a, 0x7c29fbd3, 0x7b5d0380, 0x7a7d053a, 0x798a238d,
-    0x788483ed, 0x776c4eb1, 0x7641af0f, 0x7504d315, 0x73b5eb9d, 0x72552c4e,
-    0x70e2cb8b, 0x6f5f0274, 0x6dca0cd3, 0x6c24291c, 0x6a6d985c, 0x68a69e35,
-    0x66cf80d1, 0x64e888d4, 0x62f20156, 0x60ec37d6, 0x5ed77c2d, 0x5cb4207f,
-    0x5a827936, 0x5842dced, 0x55f5a467, 0x539b2a81, 0x5133cc22, 0x4ebfe82f,
-    0x4c3fdf7b, 0x49b414b7, 0x471cec67, 0x447accce, 0x41ce1ddf, 0x3f17492f,
-    0x3c56b9e4, 0x398cdca3, 0x36ba1f81, 0x33def1f2, 0x30fbc4b5, 0x2e1109c7,
-    0x2b1f344d, 0x2826b888, 0x25280bba, 0x2223a420, 0x1f19f8d3, 0x1c0b81c0,
-    0x18f8b78f, 0x15e21395, 0x12c80fbd, 0x0fab2678, 0x0c8bd2a9, 0x096a8f92,
-    0x0647d8c3, 0x03242a04};
+const FLOAT32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER] = {
+    0.000000f, 0.018995f, 0.000000f, -0.072931f, 0.000000f,
+    0.305966f, 0.500000f, 0.305966f, 0.000000f,  -0.072931f,
+    0.000000f, 0.018995f, 0.000000f};
 
-const WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER] = {
-    8011005,   24378459,  48821601, 78019304, 106140545, 126634002, 134217728,
-    126634002, 106140545, 78019304, 48821601, 24378459,  8011805};
+const FLOAT32 ixheaacd_sine[8][8] = {
+    {0.000000f, -0.382683f, -0.707107f, -0.923880f, -1.000000f, -0.923880f,
+     -0.707107f, -0.382683f},
+    {0.000000f, -0.923880f, -0.707107f, 0.382684f, 1.000000f, 0.382683f,
+     -0.707107f, -0.923880f},
+    {0.000000f, -0.923880f, 0.707107f, 0.382683f, -1.000000f, 0.382684f,
+     0.707107f, -0.923880f},
+    {0.000000f, -0.382683f, 0.707107f, -0.923879f, 1.000000f, -0.923880f,
+     0.707107f, -0.382683f},
+    {0.000000f, 0.382684f, -0.707107f, 0.923880f, -1.000000f, 0.923879f,
+     -0.707106f, 0.382684f},
+    {0.000000f, 0.923880f, -0.707107f, -0.382684f, 1.000000f, -0.382683f,
+     -0.707107f, 0.923880f},
+    {0.000000f, 0.923880f, 0.707107f, -0.382683f, -1.000000f, -0.382684f,
+     0.707106f, 0.923880f},
+    {0.000000f, 0.382683f, 0.707107f, 0.923879f, 1.000000f, 0.923880f,
+     0.707107f, 0.382683f}};
 
-const WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER] = {
-    0,         20395592, 0,         -78309485, 0,        328528819, 536870911,
-    328528819, 0,        -78309485, 0,         20395592, 0};
+const FLOAT32 ixheaacd_cosine[8][8] = {
+    {1.000000f, 0.923880f, 0.707107f, 0.382683f, -46.000000f, -0.382683f,
+     -0.707107f, -0.923880f},
+    {1.000000f, 0.382683f, -0.707107f, -0.923880f, 140.000000f, 0.923880f,
+     0.707107f, -0.382683f},
+    {1.000000f, -0.382683f, -0.707107f, 0.923880f, -234.000000f, -0.923879f,
+     0.707107f, 0.382683f},
+    {1.000000f, -0.923880f, 0.707107f, -0.382684f, 328.000000f, 0.382683f,
+     -0.707106f, 0.923880f},
+    {1.000000f, -0.923880f, 0.707107f, -0.382683f, -422.000000f, 0.382684f,
+     -0.707107f, 0.923880f},
+    {1.000000f, -0.382683f, -0.707107f, 0.923879f, 516.000000f, -0.923880f,
+     0.707106f, 0.382683f},
+    {1.000000f, 0.382684f, -0.707107f, -0.923880f, -610.000000f, 0.923879f,
+     0.707107f, -0.382684f},
+    {1.000000f, 0.923880f, 0.707107f, 0.382684f, 704.000000f, -0.382683f,
+     -0.707106f, -0.923880f}};
 
-const WORD32 ixheaacd_cosine[8][13] = {
-    {
-        -759250175, -410903263, -46, 410903167, 759250111, 992008063,
-        1073741823, 992008063, 759250111, 410903167, -46, -410903263,
-        -759250175,
-    },
-    {
-        759249983, 992008191, 140, -992008063, -759250175, 410903167,
-        1073741823, 410903167, -759250175, -992008063, 140, 992008191,
-        759249983,
-    },
-    {
-        759250367, -992007999, -234, 992008191, -759250047, -410903263,
-        1073741823, -410903263, -759250047, 992008191, -234, -992007999,
-        759250367,
-    },
-    {
-        -759249791, 410902815, 328, -410903423, 759250239, -992008127,
-        1073741823, -992008127, 759250239, -410903423, 328, 410902815,
-        -759249791,
-    },
-    {
-        -759250559, 410903679, -422, -410902911, 759249983, -992008063,
-        1073741823, -992008063, 759249983, -410902911, -422, 410903679,
-        -759250559,
-    },
-    {
-        759249599, -992008319, 516, 992007935, -759250303, -410903071,
-        1073741823, -410903071, -759250303, 992007935, 516, -992008319,
-        759249599,
-    },
-    {
-        759250751, 992007807, -610, -992008255, -759249919, 410903359,
-        1073741823, 410903359, -759249919, -992008255, -610, 992007807,
-        759250751,
-    },
-    {-759249407, -410902399, 704, 410903679, 759250367, 992008191, 1073741823,
-     992008191, 759250367, 410903679, 704, -410902399, -759249407}};
-
-const WORD32 ixheaacd_sine[8][13] = {
-    {
-        759250047, 992008063, 1073741823, 992008127, 759250111, 410903231, 0,
-        -410903231, -759250111, -992008127, -1073741823, -992008063, -759250047,
-    },
-    {
-        759250303, -410903039, -1073741823, -410903295, 759250047, 992008127, 0,
-        -992008127, -759250047, 410903295, 1073741823, 410903039, -759250303,
-    },
-    {
-        -759249855, -410903487, 1073741823, -410903039, -759250175, 992008063,
-        0, -992008063, 759250175, 410903039, -1073741823, 410903487, 759249855,
-    },
-    {
-        -759250495, 992008255, -1073741823, 992007999, -759249983, 410903135, 0,
-        -410903135, 759249983, -992007999, 1073741823, -992008255, 759250495,
-    },
-    {
-        759249663, -992007871, 1073741823, -992008191, 759250303, -410903295, 0,
-        410903295, -759250303, 992008191, -1073741823, 992007871, -759249663,
-    },
-    {
-        759250687, 410902623, -1073741823, 410903551, 759249919, -992008127, 0,
-        992008127, -759249919, -410903551, 1073741823, -410902623, -759250687,
-    },
-    {
-        -759249471, 410903903, 1073741823, 410902783, -759250367, -992008063, 0,
-        992008063, 759250367, -410902783, -1073741823, -410903903, 759249471,
-    },
-    {-759250879, -992008447, -1073741823, -992007871, -759249855, -410903039, 0,
-     410903039, 759249855, 992007871, 1073741823, 992008447, 759250879}};
-
-const WORD32 ixheaacd_cosine2[2][13] = {
-    {
-        1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823,
-        1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823,
-        1073741823,
-    },
-    {
-        1073741823, -1073741823, 1073741823, -1073741823, 1073741823,
-        -1073741823, 1073741823, -1073741823, 1073741823, -1073741823,
-        1073741823, -1073741823, 1073741823,
-    },
-};
+const WORD32 ixheaacd_mps_gain_set_indx[29] = {
+    1,  0,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16,
+    17, 18, 19, 21, 23, 25, 27, 30, 33, 37, 42, 48, 55, 70};
diff --git a/decoder/ixheaacd_mps_smoothing.c b/decoder/ixheaacd_mps_smoothing.c
index f4917a4..38cdc3c 100644
--- a/decoder/ixheaacd_mps_smoothing.c
+++ b/decoder/ixheaacd_mps_smoothing.c
@@ -32,18 +32,20 @@
 VOID ixheaacd_mps_pre_matrix_mix_matrix_smoothing(
     ia_mps_dec_state_struct *self) {
   int smooth_band;
-  int delta, one_minus_delta;
-
+  FLOAT32 delta, one_minus_delta;
+#ifndef MULT
+#define MULT(a, b) (a * b)
+#endif
   int ps = 0, pb, row, col;
   int res_bands = 0;
   int *p_smoothing_data;
-
+  self->pre_mix_req = 0;
   if (self->residual_coding) res_bands = self->max_res_bands;
 
   p_smoothing_data = &self->smoothing_data[ps][res_bands];
 
   delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps];
-  one_minus_delta = 1073741824 - delta;
+  one_minus_delta = 1.0f - delta;
 
   for (pb = res_bands; pb < self->bs_param_bands; pb++) {
     smooth_band = *p_smoothing_data++;
@@ -51,43 +53,32 @@
       for (row = 0; row < MAX_M_OUTPUT; row++) {
         for (col = 0; col < MAX_M_INPUT; col++) {
           self->m1_param_re[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m1_param_re[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m1_param_re_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m1_param_re[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m1_param_re_prev[pb][row][col]));
           self->m1_param_im[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m1_param_im[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m1_param_im_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m1_param_im[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m1_param_im_prev[pb][row][col]));
           self->m2_decor_re[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m2_decor_re[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m2_decor_re_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m2_decor_re[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m2_decor_re_prev[pb][row][col]));
           self->m2_decor_im[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m2_decor_im[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m2_decor_im_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m2_decor_im[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m2_decor_im_prev[pb][row][col]));
           self->m2_resid_re[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m2_resid_re[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m2_resid_re_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m2_resid_re[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m2_resid_re_prev[pb][row][col]));
           self->m2_resid_im[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m2_resid_im[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m2_resid_im_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m2_resid_im[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m2_resid_im_prev[pb][row][col]));
         }
       }
+      self->pre_mix_req++;
     }
   }
 
   for (ps = 1; ps < self->num_parameter_sets; ps++) {
     delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps];
-    one_minus_delta = 1073741824 - delta;
+    one_minus_delta = 1.0f - delta;
 
     p_smoothing_data = &self->smoothing_data[ps][res_bands];
 
@@ -97,37 +88,32 @@
         for (row = 0; row < MAX_M_OUTPUT; row++) {
           for (col = 0; col < MAX_M_INPUT; col++) {
             self->m1_param_re[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m1_param_re[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m1_param_re[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m1_param_re[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m1_param_re[ps - 1][pb][row][col]));
             self->m1_param_im[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m1_param_im[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m1_param_im[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m1_param_im[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m1_param_im[ps - 1][pb][row][col]));
             self->m2_resid_re[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m2_resid_re[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m2_resid_re[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m2_resid_re[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m2_resid_re[ps - 1][pb][row][col]));
             self->m2_decor_re[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m2_decor_re[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m2_decor_re[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m2_decor_re[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m2_decor_re[ps - 1][pb][row][col]));
             self->m2_decor_im[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m2_decor_im[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m2_decor_im[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m2_decor_im[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m2_decor_im[ps - 1][pb][row][col]));
             self->m2_resid_im[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m2_resid_im[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m2_resid_im[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m2_resid_im[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m2_resid_im[ps - 1][pb][row][col]));
           }
         }
+        self->pre_mix_req++;
       }
     }
   }
@@ -145,10 +131,15 @@
 
   if (self->opd_smoothing_mode == 0) {
     for (pb = 0; pb < self->bs_param_bands; pb++) {
+#define Q28_VALUE (1 << 28)
       self->opd_smooth.smooth_l_phase[pb] =
-          self->phase_l_fix[self->num_parameter_sets - 1][pb] >> 1;
+          ((WORD32)(self->phase_l[self->num_parameter_sets - 1][pb] *
+                    Q28_VALUE)) >>
+          1;
       self->opd_smooth.smooth_r_phase[pb] =
-          self->phase_r_fix[self->num_parameter_sets - 1][pb] >> 1;
+          ((WORD32)(self->phase_r[self->num_parameter_sets - 1][pb] *
+                    Q28_VALUE)) >>
+          1;
     }
     return;
   }
@@ -162,9 +153,10 @@
 
     for (pb = 0; pb < self->bs_param_bands; pb++) {
       int ltemp, rtemp, tmp;
-
-      ltemp = self->phase_l_fix[ps][pb] >> 1;
-      rtemp = self->phase_r_fix[ps][pb] >> 1;
+#define Q28_FLOAT_VAL ((float)(1 << 28))
+#define ONE_BY_Q28_FLOAT_VAL (1.0 / Q28_FLOAT_VAL)
+      ltemp = ((WORD32)(self->phase_l[ps][pb] * Q28_FLOAT_VAL)) >> 1;
+      rtemp = ((WORD32)(self->phase_r[ps][pb] * Q28_FLOAT_VAL)) >> 1;
 
       while (ltemp > self->opd_smooth.smooth_l_phase[pb] + PI_IN_Q27)
         ltemp -= 2 * PI_IN_Q27;
@@ -204,9 +196,14 @@
         self->opd_smooth.smooth_r_phase[pb] -= 2 * PI_IN_Q27;
       while (self->opd_smooth.smooth_r_phase[pb] < 0)
         self->opd_smooth.smooth_r_phase[pb] += 2 * PI_IN_Q27;
-
-      self->phase_l_fix[ps][pb] = self->opd_smooth.smooth_l_phase[pb] << 1;
-      self->phase_r_fix[ps][pb] = self->opd_smooth.smooth_r_phase[pb] << 1;
+#define Q28_FLOAT_VAL ((float)(1 << 28))
+#ifndef ONE_BY_Q28_FLOAT_VAL
+#define ONE_BY_Q28_FLOAT_VAL (1.0f / Q28_FLOAT_VAL)
+#endif
+      self->phase_l[ps][pb] =
+          (self->opd_smooth.smooth_l_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL;
+      self->phase_r[ps][pb] =
+          (self->opd_smooth.smooth_r_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL;
     }
   }
 }
diff --git a/decoder/ixheaacd_mps_temp_process.c b/decoder/ixheaacd_mps_temp_process.c
index 736996c..71c11b8 100644
--- a/decoder/ixheaacd_mps_temp_process.c
+++ b/decoder/ixheaacd_mps_temp_process.c
@@ -80,6 +80,8 @@
     9.801e-005f, 0.00012321f, 0.00015625f, 0.00019881f, 0.00024964f,
     0.00032041f, 0.00041209f, 0.00053824f, 0.00070756f, 0.00094249f};
 
+extern const WORD32 ixheaacd_mps_gain_set_indx[29];
+
 static VOID ixheaacd_mps_temp_process_scale_calc(ia_mps_dec_state_struct* self,
                                                  WORD32 ts, FLOAT32* scale) {
   FLOAT32 dir_energy;
@@ -182,7 +184,7 @@
       no_scaling = !self->temp_shape_enable_ch_stp[ch];
 
     if (no_scaling == 1) {
-      for (n = 0; n < self->hyb_band_count; n++) {
+      for (n = 0; n < self->hyb_band_count_max; n++) {
         self->hyb_dir_out[ch][ts][n].re += self->hyb_diff_out[ch][ts][n].re;
         self->hyb_dir_out[ch][ts][n].im += self->hyb_diff_out[ch][ts][n].im;
       }
@@ -202,7 +204,7 @@
         self->hyb_dir_out[ch][ts][n].im +=
             (self->hyb_diff_out[ch][ts][n].im * temp);
       }
-      for (; n < self->hyb_band_count; n++) {
+      for (; n < self->hyb_band_count_max; n++) {
         temp = (FLOAT32)(scale[ch]);
         self->hyb_dir_out[ch][ts][n].re +=
             (self->hyb_diff_out[ch][ts][n].re * temp);
@@ -216,20 +218,46 @@
 WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct* self) {
   WORD32 ch, ts, hyb;
   WORD32 err = 0;
+  ia_sbr_frame_info_data_struct* ptr_frame_data =
+      (ia_sbr_frame_info_data_struct*)self->p_sbr_frame[0];
+  if (self->res_bands != 28) {
+    if (self->config->bs_temp_shape_config == 1) {
+      WORD32 dif_s = ((self->res_bands == 0)
+                          ? 0
+                          : ixheaacd_mps_gain_set_indx[self->res_bands]);
+      for (ch = 0; ch < self->out_ch_count; ch++) {
+        for (ts = 0; ts < self->time_slots; ts++) {
+          for (hyb = dif_s; hyb < HYBRID_BAND_BORDER; hyb++) {
+            self->hyb_dir_out[ch][ts][hyb].re +=
+                self->hyb_diff_out[ch][ts][hyb].re;
+            self->hyb_dir_out[ch][ts][hyb].im +=
+                self->hyb_diff_out[ch][ts][hyb].im;
+            self->hyb_diff_out[ch][ts][hyb].re = 0;
+            self->hyb_diff_out[ch][ts][hyb].im = 0;
+          }
+        }
+      }
 
-  for (ch = 0; ch < self->out_ch_count; ch++) {
-    for (ts = 0; ts < self->time_slots; ts++) {
-      for (hyb = 0; hyb < HYBRID_BAND_BORDER; hyb++) {
-        self->hyb_dir_out[ch][ts][hyb].re += self->hyb_diff_out[ch][ts][hyb].re;
-        self->hyb_dir_out[ch][ts][hyb].im += self->hyb_diff_out[ch][ts][hyb].im;
-        self->hyb_diff_out[ch][ts][hyb].re = 0;
-        self->hyb_diff_out[ch][ts][hyb].im = 0;
+      for (ts = 0; ts < self->time_slots; ts++)
+        ixheaacd_mps_subbandtp(self, ts);
+
+    } else {
+      WORD32 dif_s = ((self->res_bands == 0)
+                          ? 0
+                          : ixheaacd_mps_gain_set_indx[self->res_bands]);
+      for (ch = 0; ch < self->out_ch_count; ch++) {
+        for (ts = 0; ts < self->time_slots; ts++) {
+          for (hyb = dif_s; hyb < self->hyb_band_count_max; hyb++) {
+            self->hyb_dir_out[ch][ts][hyb].re +=
+                self->hyb_diff_out[ch][ts][hyb].re;
+            self->hyb_dir_out[ch][ts][hyb].im +=
+                self->hyb_diff_out[ch][ts][hyb].im;
+          }
+        }
       }
     }
   }
 
-  for (ts = 0; ts < self->time_slots; ts++) ixheaacd_mps_subbandtp(self, ts);
-
   ixheaacd_mps_qmf_hyb_synthesis(self);
 
   for (ch = 0; ch < self->out_ch_count; ch++) {
@@ -239,6 +267,13 @@
     if (err) return err;
   }
 
+  if (ptr_frame_data->mps_sbr_flag) {
+    self->synth_count =
+        ptr_frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_end;
+  } else {
+    self->synth_count = self->band_count[0];
+  }
+
   ixheaacd_mps_synt_calc(self);
   return err;
 }
\ No newline at end of file
diff --git a/decoder/ixheaacd_mps_temp_reshape.c b/decoder/ixheaacd_mps_temp_reshape.c
index fd8e62c..69216a8 100644
--- a/decoder/ixheaacd_mps_temp_reshape.c
+++ b/decoder/ixheaacd_mps_temp_reshape.c
@@ -67,7 +67,7 @@
     case DIR_DIFF_IN:
       ch_offset = 0;
       for (ii = 0; ii < self->time_slots; ii++) {
-        for (jj = 0; jj < self->hyb_band_count; jj++) {
+        for (jj = 0; jj < self->hyb_band_count_max; jj++) {
           slot_energy[ii]
                      [ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] +=
               ((self->hyb_dir_out[ch][ii][jj].re +
@@ -83,14 +83,26 @@
       break;
     case DOWNMIX_IN:
       ch_offset = self->out_ch_count;
-      for (ii = 0; ii < self->time_slots; ii++) {
-        for (jj = 0; jj < self->hyb_band_count; jj++) {
-          slot_energy[ii]
-                     [ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] +=
-              self->hyb_in[ch][ii][jj].re * self->hyb_in[ch][ii][jj].re +
-              self->hyb_in[ch][ii][jj].im * self->hyb_in[ch][ii][jj].im;
+      if ((self->pre_mix_req | self->bs_tsd_enable)) {
+        for (ii = 0; ii < self->time_slots; ii++) {
+          for (jj = 0; jj < self->hyb_band_count_max; jj++) {
+            slot_energy
+                [ii][ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] +=
+                self->hyb_in[ch][jj][ii].re * self->hyb_in[ch][jj][ii].re +
+                self->hyb_in[ch][jj][ii].im * self->hyb_in[ch][jj][ii].im;
+          }
+        }
+      } else {
+        for (ii = 0; ii < self->time_slots; ii++) {
+          for (jj = 0; jj < self->hyb_band_count_max; jj++) {
+            slot_energy
+                [ii][ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] +=
+                self->w_dir[ch][ii][jj].re * self->w_dir[ch][ii][jj].re +
+                self->w_dir[ch][ii][jj].im * self->w_dir[ch][ii][jj].im;
+          }
         }
       }
+
       break;
     default:
       ch_offset = 0;
@@ -168,7 +180,7 @@
         amp_direct = 0;
         amp_diff = 0;
 
-        for (jj = band_start; jj < self->hyb_band_count; jj++) {
+        for (jj = band_start; jj < self->hyb_band_count_max; jj++) {
           amp_direct += self->hyb_dir_out[ch][time_slot][jj].re *
                             self->hyb_dir_out[ch][time_slot][jj].re +
                         self->hyb_dir_out[ch][time_slot][jj].im *
@@ -184,7 +196,7 @@
 
         ratio = min(max((gain + amp_ratio * (gain - 1)), 1 / LAMDA), LAMDA);
 
-        for (jj = band_start; jj < self->hyb_band_count; jj++) {
+        for (jj = band_start; jj < self->hyb_band_count_max; jj++) {
           self->hyb_dir_out[ch][time_slot][jj].re *= ratio;
           self->hyb_dir_out[ch][time_slot][jj].im *= ratio;
         }
diff --git a/decoder/ixheaacd_multichannel.c b/decoder/ixheaacd_multichannel.c
index d914ad2..998c194 100644
--- a/decoder/ixheaacd_multichannel.c
+++ b/decoder/ixheaacd_multichannel.c
@@ -255,35 +255,37 @@
   return error_status;
 }
 
-void ixheaacd_dec_couple_channel(WORD16 *p_time_data, WORD16 *out_samp_cc,
+void ixheaacd_dec_couple_channel(WORD32 *p_time_data, WORD32 *out_samp_cc,
                                  WORD16 frame_size, WORD total_channels,
-                                 WORD32 gain_cc)
+                                 WORD16 gain_cc)
 
 {
   WORD i;
-  WORD16 out_cc;
-  WORD16 *ptr_out_samp = &out_samp_cc[0];
+  WORD32 out_cc;
+  WORD32 *ptr_out_samp = &out_samp_cc[0];
   for (i = frame_size - 1; i >= 0; i--) {
-    out_cc = ixheaacd_round16(ixheaacd_shl32_sat(
-        ixheaacd_mult32x16in32(gain_cc, *ptr_out_samp++), 3));
-    *p_time_data = ixheaacd_add16_sat(out_cc, *p_time_data);
+    out_cc = (ixheaacd_shl32_sat(
+        ixheaacd_mult32x16in32(*ptr_out_samp++, gain_cc), 3));
+    *p_time_data = ixheaacd_add32_sat(out_cc, *p_time_data);
     p_time_data += total_channels;
   }
 }
 
 void ixheaacd_dec_ind_coupling(
-    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD16 *coup_ch_output,
-    WORD16 frame_size, WORD total_channels, WORD16 *ptr_time_data)
+    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 *coup_ch_output,
+    WORD16 frame_size, WORD total_channels, VOID *ptr_time_data_tmp)
 
 {
   WORD c, j, k;
   WORD l;
   WORD coupling_channel;
 
-  WORD16 *out_samp_cc;
+  WORD32 *out_samp_cc;
 
   ia_enhaacplus_dec_ind_cc *ind_channel_info;
 
+  WORD32 *ptr_time_data = (WORD32 *)ptr_time_data_tmp;
+
   {
     coupling_channel = p_obj_exhaacplus_dec->aac_config.ui_coupling_channel;
 
@@ -308,18 +310,18 @@
       k = p_obj_exhaacplus_dec->aac_config.slot_element[l];
 
       if (ind_channel_info->cc_target_is_cpe[c] == 0) {
-        WORD16 *p_time_data = &ptr_time_data[k];
+        WORD32 *p_time_data = &ptr_time_data[k];
 
-        WORD32 gain_cc = ind_channel_info->cc_gain[j];
+        WORD16 gain_cc = ixheaacd_round16(ind_channel_info->cc_gain[j]);
 
         ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size,
                                     total_channels, gain_cc);
       }
       if (ind_channel_info->cc_target_is_cpe[c] == 1) {
         if (ind_channel_info->cc_l[c] == 1) {
-          WORD16 *p_time_data = &ptr_time_data[k];
+          WORD32 *p_time_data = &ptr_time_data[k];
 
-          WORD32 gain_cc = ind_channel_info->cc_gain[j];
+          WORD16 gain_cc = ixheaacd_round16(ind_channel_info->cc_gain[j]);
 
           ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size,
                                       total_channels, gain_cc);
@@ -328,8 +330,8 @@
         k = p_obj_exhaacplus_dec->aac_config.slot_element[l];
 
         if (ind_channel_info->cc_r[c] == 1) {
-          WORD16 *p_time_data = &ptr_time_data[k + 1];
-          WORD32 gain_cc = ind_channel_info->cc_gain[j + 1];
+          WORD32 *p_time_data = &ptr_time_data[k + 1];
+          WORD16 gain_cc = ixheaacd_round16(ind_channel_info->cc_gain[j + 1]);
 
           ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size,
                                       total_channels, gain_cc);
diff --git a/decoder/ixheaacd_multichannel.h b/decoder/ixheaacd_multichannel.h
index 9156f44..f641421 100644
--- a/decoder/ixheaacd_multichannel.h
+++ b/decoder/ixheaacd_multichannel.h
@@ -29,11 +29,11 @@
     ia_eld_specific_config_struct eld_specific_config, WORD32 ele_type);
 
 void ixheaacd_dec_ind_coupling(
-    ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD16 *coup_ch_output,
-    WORD16 frame_size, WORD total_channels, WORD16 *ptr_time_data);
+    ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD32 *coup_ch_output,
+    WORD16 frame_size, WORD total_channels, VOID *ptr_time_data);
 
 void ixheaacd_dec_downmix_to_stereo(
     ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD16 frame_size,
     WORD total_elements, WORD16 *ptr_time_data, WORD total_channels);
 
-#endif /* IA_EAACP_DEC_MUTLCHANNEL_H */
\ No newline at end of file
+#endif /* IA_EAACP_DEC_MUTLCHANNEL_H */
diff --git a/decoder/ixheaacd_peak_limiter.c b/decoder/ixheaacd_peak_limiter.c
new file mode 100644
index 0000000..9c99e94
--- /dev/null
+++ b/decoder/ixheaacd_peak_limiter.c
@@ -0,0 +1,206 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <stdlib.h>
+#include <math.h>
+#include <ixheaacd_type_def.h>
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_peak_limiter_struct_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#define MIN(x, y) ((x) > (y) ? (y) : (x))
+
+/**
+*  ixheaacd_peak_limiter_init
+*
+*  \brief Peak Limiter initialization
+*
+*  \param [in/out] peak_limiter Pointer to peak_limiter struct
+*  \param [in] num_channels Number of ouptut channels
+*  \param [in] sample_rate Sampling rate value
+*  \param [in] buffer Peak limiter buffer of size PEAK_LIM_BUFFER_SIZE
+*
+*  \return WORD32
+*
+*/
+WORD32 ixheaacd_peak_limiter_init(ia_peak_limiter_struct *peak_limiter,
+                                  UWORD32 num_channels, UWORD32 sample_rate,
+                                  FLOAT32 *buffer, UWORD32 *delay_in_samples) {
+  UWORD32 attack;
+
+  attack = (UWORD32)(DEFAULT_ATTACK_TIME_MS * sample_rate / 1000);
+  *delay_in_samples = attack;
+
+  if (attack < 1) return 0;
+
+  peak_limiter->max_buf = buffer;
+  peak_limiter->max_idx = 0;
+  peak_limiter->cir_buf_pnt = 0;
+  peak_limiter->delayed_input = buffer + attack + 1;
+
+  peak_limiter->delayed_input_index = 0;
+  peak_limiter->attack_time = DEFAULT_ATTACK_TIME_MS;
+  peak_limiter->release_time = DEFAULT_RELEASE_TIME_MS;
+  peak_limiter->attack_time_samples = attack;
+  peak_limiter->attack_constant = (FLOAT32)pow(0.1, 1.0 / (attack + 1));
+  peak_limiter->release_constant = (FLOAT32)pow(
+      0.1, 1.0 / (DEFAULT_RELEASE_TIME_MS * sample_rate / 1000 + 1));
+  peak_limiter->num_channels = num_channels;
+  peak_limiter->sample_rate = sample_rate;
+  peak_limiter->min_gain = 1.0f;
+  peak_limiter->limiter_on = 1;
+  peak_limiter->pre_smoothed_gain = 1.0f;
+  peak_limiter->gain_modified = 1.0f;
+
+  return 0;
+}
+
+/**
+*  ixheaacd_peak_limiter_process
+*
+*  \brief Peak Limiter process
+*
+*  \param [in/out] peak_limiter
+*  \param [in] samples
+*  \param [in] frame_len
+*
+*  \return WORD32
+*
+*/
+VOID ixheaacd_peak_limiter_process(ia_peak_limiter_struct *peak_limiter,
+                                   VOID *samples_t, UWORD32 frame_len,
+                                   UWORD8 *qshift_adj) {
+  UWORD32 i, j;
+  FLOAT32 tmp, gain;
+  FLOAT32 min_gain = 1.0f;
+  FLOAT32 maximum;
+  UWORD32 num_channels = peak_limiter->num_channels;
+  UWORD32 attack_time_samples = peak_limiter->attack_time_samples;
+  FLOAT32 attack_constant = peak_limiter->attack_constant;
+  FLOAT32 release_constant = peak_limiter->release_constant;
+  FLOAT32 *max_buf = peak_limiter->max_buf;
+  FLOAT32 gain_modified = peak_limiter->gain_modified;
+  FLOAT32 *delayed_input = peak_limiter->delayed_input;
+  UWORD32 delayed_input_index = peak_limiter->delayed_input_index;
+  FLOAT64 pre_smoothed_gain = peak_limiter->pre_smoothed_gain;
+  WORD32 limit_threshold = 2147483647;
+
+  WORD32 *samples = (WORD32 *)samples_t;
+
+  if (peak_limiter->limiter_on || (FLOAT32)pre_smoothed_gain) {
+    for (i = 0; i < frame_len; i++) {
+      tmp = 0.0f;
+      for (j = 0; j < num_channels; j++) {
+        FLOAT32 gain_t = (FLOAT32)(1 << *(qshift_adj + j));
+        tmp = MAX(tmp, fabs((samples[i * num_channels + j] * gain_t)));
+      }
+      max_buf[peak_limiter->cir_buf_pnt] = tmp;
+
+      if (peak_limiter->max_idx == peak_limiter->cir_buf_pnt) {
+        peak_limiter->max_idx = 0;
+        for (j = 1; j < (attack_time_samples); j++) {
+          if (max_buf[j] > max_buf[peak_limiter->max_idx])
+            peak_limiter->max_idx = j;
+        }
+      } else if (tmp >= max_buf[peak_limiter->max_idx]) {
+        peak_limiter->max_idx = peak_limiter->cir_buf_pnt;
+      }
+      peak_limiter->cir_buf_pnt++;
+
+      if (peak_limiter->cir_buf_pnt == (WORD32)(attack_time_samples))
+        peak_limiter->cir_buf_pnt = 0;
+      maximum = max_buf[peak_limiter->max_idx];
+
+      if (maximum > limit_threshold) {
+        gain = limit_threshold / maximum;
+      } else {
+        gain = 1;
+      }
+
+      if (gain < pre_smoothed_gain) {
+        gain_modified =
+            MIN(gain_modified,
+                (gain - 0.1f * (FLOAT32)pre_smoothed_gain) * 1.11111111f);
+
+      } else {
+        gain_modified = gain;
+      }
+
+      if (gain_modified < pre_smoothed_gain) {
+        pre_smoothed_gain =
+            attack_constant * (pre_smoothed_gain - gain_modified) +
+            gain_modified;
+        pre_smoothed_gain = MAX(pre_smoothed_gain, gain);
+      } else {
+        pre_smoothed_gain =
+            release_constant * (pre_smoothed_gain - gain_modified) +
+            gain_modified;
+      }
+
+      gain = (FLOAT32)pre_smoothed_gain;
+
+      for (j = 0; j < num_channels; j++) {
+        WORD64 tmp_fix;
+        tmp = delayed_input[delayed_input_index * num_channels + j];
+        FLOAT32 gain_t = (FLOAT32)(1 << *(qshift_adj + j));
+        delayed_input[delayed_input_index * num_channels + j] =
+            samples[i * num_channels + j] * gain_t;
+
+        tmp *= gain;
+
+        tmp_fix = tmp;
+
+        if (tmp_fix > limit_threshold)
+          tmp_fix = limit_threshold;
+        else if (tmp_fix < -limit_threshold)
+          tmp_fix = -limit_threshold;
+
+        samples[i * num_channels + j] = tmp_fix;
+      }
+
+      delayed_input_index++;
+      if (delayed_input_index >= attack_time_samples) delayed_input_index = 0;
+
+      if (gain < min_gain) min_gain = gain;
+    }
+  } else {
+    for (i = 0; i < frame_len; i++) {
+      for (j = 0; j < num_channels; j++) {
+        tmp = delayed_input[delayed_input_index * num_channels + j];
+        FLOAT32 gain_t = (FLOAT32)(1 << *(qshift_adj + j));
+        delayed_input[delayed_input_index * num_channels + j] =
+            samples[i * num_channels + j] * gain_t;
+        samples[i * num_channels + j] = tmp;
+      }
+
+      delayed_input_index++;
+      if (delayed_input_index >= attack_time_samples) delayed_input_index = 0;
+    }
+  }
+
+  peak_limiter->gain_modified = gain_modified;
+  peak_limiter->delayed_input_index = delayed_input_index;
+  peak_limiter->pre_smoothed_gain = pre_smoothed_gain;
+  peak_limiter->min_gain = min_gain;
+
+  return;
+}
diff --git a/decoder/ixheaacd_peak_limiter_struct_def.h b/decoder/ixheaacd_peak_limiter_struct_def.h
new file mode 100644
index 0000000..1241418
--- /dev/null
+++ b/decoder/ixheaacd_peak_limiter_struct_def.h
@@ -0,0 +1,52 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_PEAK_LIMITER_STRUCT_DEF_H
+#define IXHEAACD_PEAK_LIMITER_STRUCT_DEF_H
+
+#define MAX_CHANNEL 6
+/*(PEAK_LIM_SIZE = ATTACK_TIME * MAX_SAMPLING_RATE / 1000) + 1*/
+#define PEAK_LIM_SIZE 481
+#define PEAK_LIM_BUFFER_SIZE PEAK_LIM_SIZE *(MAX_CHANNEL + 1)
+
+#define DEFAULT_ATTACK_TIME_MS (5.0f)
+#define DEFAULT_RELEASE_TIME_MS (50.0f)
+
+typedef struct ia_peak_limiter_struct {
+  FLOAT32 attack_time;
+  FLOAT32 release_time;
+  FLOAT32 attack_constant;
+  FLOAT32 release_constant;
+  FLOAT32 limit_threshold;
+  UWORD32 num_channels;
+  UWORD32 sample_rate;
+  UWORD32 attack_time_samples;
+  UWORD32 limiter_on;
+  FLOAT32 gain_modified;
+  FLOAT64 pre_smoothed_gain;
+  FLOAT32 *delayed_input;
+  UWORD32 delayed_input_index;
+  FLOAT32 *max_buf;
+  FLOAT32 min_gain;
+  FLOAT32 buffer[PEAK_LIM_BUFFER_SIZE];
+  WORD32 max_idx;
+  WORD32 cir_buf_pnt;
+} ia_peak_limiter_struct;
+
+#endif /* IXHEAACD_PEAK_LIMITER_STRUCT_DEF_H */
diff --git a/decoder/ixheaacd_process.c b/decoder/ixheaacd_process.c
index f1c7202..672f4c6 100644
--- a/decoder/ixheaacd_process.c
+++ b/decoder/ixheaacd_process.c
@@ -94,7 +94,9 @@
 VOID ixheaacd_allocate_sbr_scr(ia_sbr_scr_struct *sbr_scratch_struct,
                                VOID *base_scratch_ptr, VOID *output_ptr,
                                WORD total_elements, WORD ch_fac,
-                               WORD32 object_type);
+                               WORD32 object_type, WORD32 total_channels,
+                               WORD8 *p_qshift_arr, UWORD8 slot_element,
+                               WORD32 channel);
 
 IA_ERRORCODE ixheaacd_applysbr(
     ia_handle_sbr_dec_inst_struct self,
@@ -117,7 +119,7 @@
   ia_sbr_scr_struct sbr_scratch_struct;
   ixheaacd_allocate_sbr_scr(&sbr_scratch_struct,
                             usac_data->sbr_scratch_mem_base, NULL, 2, 1,
-                            audio_object_type);
+                            audio_object_type, 0, NULL, 0, 0);
 
   self->usac_independency_flag = usac_data->usac_independency_flg;
 
@@ -381,6 +383,13 @@
               pstr_usac_data->usac_independency_flg, it_bit_buff);
           if (err) return err;
 
+          p_state_aac_dec->mps_dec_handle.band_count[0] =
+              pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[0]
+                  ->str_sbr_dec.band_count;
+          p_state_aac_dec->mps_dec_handle.band_count[1] =
+              pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[1]
+                  ->str_sbr_dec.band_count;
+
           for (ch = 0; ch < nr_core_coder_channels; ch++) {
             ptr_inp[2 * ch] =
                 pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[ch]
diff --git a/decoder/ixheaacd_rom.c b/decoder/ixheaacd_rom.c
index 0e10e6a..d09c6cd 100644
--- a/decoder/ixheaacd_rom.c
+++ b/decoder/ixheaacd_rom.c
@@ -453,6 +453,11 @@
     0x8009de7e, 0x03242abe, 0x80058d2f, 0x025b26d7, 0x800277a6, 0x01921d1f,
     0x80009dea, 0x00c90f87, 0x80000000, 0x00000000};
 
+const FLOAT32 ixheaacd_twiddle_table_fft_flt[16] = {
+    1.000000f, -0.000000f, 0.980785f, -0.195090f, 0.923880f, -0.382683f,
+    0.831470f, -0.555570f, 0.707107f, -0.707107f, 0.555570f, -0.831470f,
+    0.382683f, -0.923880f, 0.195090f, -0.980785f};
+
 const WORD32 ixheaacd_twiddle_table_3pr[1155] = {
     0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7ffb9d14, 0x7fee74a1,
     0x7fffffff, 0x7fee74a1, 0x7fb9d757, 0x7fffffff, 0x7fd8878c, 0x7f62368e,
@@ -4291,5 +4296,4 @@
     2437.3232f, 2691.4072f, 3030.3025f, 3524.1379f, 3771.7576f, 4083.2375f,
     4601.1567f, 4963.4697f, 5434.8530f, 5942.8315f};
 
-const WORD8 ixheaacd_mps_dig_rev[16] = {0, 8,  16, 24, 2, 10, 18, 26,
-                                        4, 12, 20, 28, 6, 14, 22, 30};
\ No newline at end of file
+const WORD8 ixheaacd_mps_dig_rev[8] = {0, 4, 8, 12, 2, 6, 10, 14};
diff --git a/decoder/ixheaacd_sbr_dec.c b/decoder/ixheaacd_sbr_dec.c
index 671f4d6..2287c6c 100644
--- a/decoder/ixheaacd_sbr_dec.c
+++ b/decoder/ixheaacd_sbr_dec.c
@@ -285,10 +285,6 @@
       ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] =
           ((FLOAT32)ploc_qmf_buf_imag[z] * gain);
     }
-    for (z = core_syn_ch_index; z < num_columns; z++) {
-      ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] = (FLOAT32)0.0f;
-      ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] = (FLOAT32)0.0f;
-    }
   }
 
   pstr_qmf_anal_bank->filter_pos_32 = ptr_win_coeffs_1;
@@ -735,7 +731,6 @@
             ptr_sbr_dec->p_hbe_txposer->max_stretch);
       }
     }
-    ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
 
     if (!mps_sbr_flag && apply_processing) {
       WORD32 err_code = 0;
@@ -752,6 +747,7 @@
       ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac;
 
       if (sbr_mode == PVC_SBR) {
+        ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
         err_code = ixheaacd_pvc_process(
             ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start,
             ptr_frame_data->str_pvc_frame_info.border_vec[0],
@@ -788,6 +784,12 @@
       }
     }
 
+    if (!mps_sbr_flag) {
+      ptr_sbr_dec->band_count =
+          ptr_header_data->pstr_freq_band_data->sub_band_end;
+    } else
+      ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
+
     ixheaacd_esbr_synthesis_filt_block(
         ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
         pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr,
@@ -1135,6 +1137,8 @@
     memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32));
   }
 
+  ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
+
   ixheaacd_esbr_synthesis_filt_block(
       ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
       pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, ptr_sbr_tables,
@@ -1168,6 +1172,8 @@
 
   if (!mps_sbr_flag) {
     return 0;
+  } else {
+    ptr_frame_data->cov_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
   }
 
   no_bins = ptr_header_data->output_framesize / 64;
diff --git a/decoder/ixheaacd_sbr_dec.h b/decoder/ixheaacd_sbr_dec.h
index 0461d39..8bafa92 100644
--- a/decoder/ixheaacd_sbr_dec.h
+++ b/decoder/ixheaacd_sbr_dec.h
@@ -67,6 +67,7 @@
   ia_sbr_scale_fact_struct str_sbr_scale_fact;
 
   WORD32 max_samp_val;
+  WORD32 band_count;
   ia_esbr_hbe_txposer_struct *p_hbe_txposer;
 
   FLOAT32 core_sample_buf[2624];
diff --git a/decoder/ixheaacd_sbrdec_initfuncs.c b/decoder/ixheaacd_sbrdec_initfuncs.c
index f779c84..2793fe5 100644
--- a/decoder/ixheaacd_sbrdec_initfuncs.c
+++ b/decoder/ixheaacd_sbrdec_initfuncs.c
@@ -543,6 +543,7 @@
         audio_object_type);
 
     ptr_header_data[i]->status = 1;
+    ptr_sbr_dec[i]->band_count = 64;
 
     if (err) {
       return NULL;
diff --git a/decoder/ixheaacd_sbrdec_lpfuncs.c b/decoder/ixheaacd_sbrdec_lpfuncs.c
index 5e535dc..600305f 100644
--- a/decoder/ixheaacd_sbrdec_lpfuncs.c
+++ b/decoder/ixheaacd_sbrdec_lpfuncs.c
@@ -981,7 +981,7 @@
   WORD32 pre_proc_flag = ptr_header_data->pre_proc_flag;
   WORD32 is_usf_4 = ptr_header_data->is_usf_4;
   WORD32 fs = ptr_header_data->out_sampling_freq;
-
+  WORD32 cov_count;
   WORD32 lsb = f_master_tbl[0];
   WORD32 usb = f_master_tbl[num_mf_bands];
   WORD32 xover_offset = sub_band_start - f_master_tbl[0];
@@ -1023,9 +1023,16 @@
   }
 
   if (sbr_patching_mode || !hbe_flag) {
-    FLOAT32 alpha_real[64][2], alpha_imag[64][2];
+    FLOAT32 alpha_real[64][2] = {{0}}, alpha_imag[64][2] = {{0}};
+    if (ptr_frame_data->mps_sbr_flag) {
+      cov_count = (f_master_tbl[0] < ptr_frame_data->cov_count)
+                      ? f_master_tbl[0]
+                      : ptr_frame_data->cov_count;
+    } else {
+      cov_count = f_master_tbl[0];
+    }
 
-    for (k = 1; k < f_master_tbl[0]; k++) {
+    for (k = 1; k < cov_count; k++) {
       ixheaacd_esbr_calc_co_variance(&str_auto_corr, &ptr_src_buf_real[0],
                                      &ptr_src_buf_imag[0], k, co_var_len);
       if (str_auto_corr.det == 0.0f) {
diff --git a/decoder/ixheaacd_struct_def.h b/decoder/ixheaacd_struct_def.h
index d348d99..f7fe3fe 100644
--- a/decoder/ixheaacd_struct_def.h
+++ b/decoder/ixheaacd_struct_def.h
@@ -21,6 +21,8 @@
 #define IXHEAACD_STRUCT_DEF_H
 
 #include <setjmp.h>
+#include <stdbool.h>
+#include "ixheaacd_peak_limiter_struct_def.h"
 
 #define MAX_OUTPUT_CHANNELS (8)
 #define MAX_NUM_OTT (1)
@@ -46,6 +48,10 @@
 #define MAX_TIME_SLOTS (72)
 #define MAX_NO_TIME_SLOTS_DELAY (14)
 
+#define MAX_PREROLL_FRAME_OFFSET 4
+// max of escapedValue(4, 4, 8) i.e. 2^4 -1 + 2^4 -1 + 2^8 -1;
+#define MAX_PREROLL_SIZE 285
+
 typedef struct {
   WORD8 element_instance_tag;
   WORD32 object_type;
@@ -137,6 +143,9 @@
   WORD32 ui_flush_cmd;
 
   ia_drc_config drc_config_struct;
+  WORD32 output_level;
+  WORD32 i_loud_ref_level;
+  UWORD8 dup_stereo_flag;
 
 } ia_aac_dec_config_struct;
 
@@ -180,7 +189,7 @@
   WORD32 last_frame_ok;
   WORD32 i_bytes_consumed;
 
-  WORD16 *coup_ch_output;
+  WORD32 *coup_ch_output;
   ia_enhaacplus_dec_ind_cc ind_cc_info;
 
   WORD8 protection_absent;
@@ -237,6 +246,17 @@
   WORD32 decode_create_done;
   WORD32 fatal_err_present;
   WORD8 *pers_mem_ptr;
+  bool preroll_config_present;
+  UWORD8 preroll_config_prev[MAX_PREROLL_SIZE];
+
+  UWORD8 qshift_cnt;
+  WORD8 qshift_adj[16];
+  UWORD32 delay_in_samples;
+  UWORD8 peak_lim_init;
+  ia_peak_limiter_struct peak_limiter;
+  UWORD8 sbr_present;
+  UWORD8 slot_pos;
+
 } ia_aac_dec_state_struct;
 
 typedef struct ia_exhaacplus_dec_api_struct {
@@ -256,14 +276,14 @@
 
 WORD32 ixheaacd_aacdec_decodeframe(
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
-    ia_aac_dec_scratch_struct *aac_scratch_ptrs, WORD16 *time_data,
+    ia_aac_dec_scratch_struct *aac_scratch_ptrs, VOID *time_data,
     FLAG frame_status, WORD *type, WORD *ch_idx, WORD init_flag, WORD channel,
     WORD *element_index_order, WORD skip_full_decode, WORD ch_fac,
     WORD slot_element, WORD max_channels, WORD32 total_channels,
     WORD32 frame_length, WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec,
     WORD32 object_type, WORD32 ch_config,
     ia_eld_specific_config_struct eld_specific_config, WORD16 adtsheader,
-    ia_drc_dec_struct *drc_dummy);
+    ia_drc_dec_struct *drc_dummy, UWORD8 *slot_pos);
 
 WORD ixheaacd_get_channel_mask(
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec);
diff --git a/decoder/x86/ixheaacd_function_selector_x86.c b/decoder/x86/ixheaacd_function_selector_x86.c
index f9c71fa..431d3c9 100644
--- a/decoder/x86/ixheaacd_function_selector_x86.c
+++ b/decoder/x86/ixheaacd_function_selector_x86.c
@@ -74,7 +74,7 @@
  WORD16) = &ixheaacd_covariance_matrix_calc_2_dec;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_dec;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -159,13 +159,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_dec;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_dec;
 
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_dec;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -173,11 +173,11 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_dec;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_dec;
 
 VOID(*ixheaacd_overlap_out_copy)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
  const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_dec;
 
 VOID(*ixheaacd_pretwiddle_compute)
@@ -193,18 +193,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec;
@@ -213,14 +201,9 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec;
-
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
@@ -246,4 +229,4 @@
 VOID(*ixheaacd_scale_factor_process)
 (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width,
  WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type,
- WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
\ No newline at end of file
+ WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
diff --git a/decoder/x86_64/ixheaacd_function_selector_x86_64.c b/decoder/x86_64/ixheaacd_function_selector_x86_64.c
index f9c71fa..431d3c9 100644
--- a/decoder/x86_64/ixheaacd_function_selector_x86_64.c
+++ b/decoder/x86_64/ixheaacd_function_selector_x86_64.c
@@ -74,7 +74,7 @@
  WORD16) = &ixheaacd_covariance_matrix_calc_2_dec;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_dec;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -159,13 +159,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_dec;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_dec;
 
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_dec;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -173,11 +173,11 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_dec;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_dec;
 
 VOID(*ixheaacd_overlap_out_copy)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
  const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_dec;
 
 VOID(*ixheaacd_pretwiddle_compute)
@@ -193,18 +193,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec;
@@ -213,14 +201,9 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec;
-
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
@@ -246,4 +229,4 @@
 VOID(*ixheaacd_scale_factor_process)
 (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width,
  WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type,
- WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
\ No newline at end of file
+ WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
diff --git a/docs/Api_flowchart.png b/docs/Api_flowchart.png
new file mode 100644
index 0000000..4fb8418
--- /dev/null
+++ b/docs/Api_flowchart.png
Binary files differ